Skip to content

T-233: TS IPC wrappers (terminals.ts) + useTerminalsStore (Zustand, optimistic open/close) #128

@mpiton

Description

@mpiton

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

  • src/shared/ipc/terminals.ts exports invokeTerminalsOpen, invokeTerminalsWrite, invokeTerminalsResize, invokeTerminalsClose, invokeTerminalsList, all typed via generated DTOs
  • useTerminalsStore covers open / close / focus / hydrate with optimistic updates + rollback on IPC error
  • Subscribe to terminal:chunk and terminal:exited via listen() on store init; cleanup unlisten on teardown
  • Unit tests with vitest:
    • it("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")
  • No prop drilling > 2 levels (CLAUDE.md rule)
  • pnpm exec oxlint . --max-warnings=0 green; pnpm exec tsc -b green

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority:P0Priority P0 — must land in sprintscope: frontendReact / Tauri webview / xterm / CodeMirrorsprint:2026-05-14Sprint 2026-05-14 (Sprint 3) — terminals & PTY foundationtrack:CTrack C — frontend (React, Tailwind, Zustand, i18n)type:featureFeature work (new capability)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions