71 lines · 4.1 KB · Markdown
RawDownload

CLAUDE.md

Project Snapshot

T3 Code is a minimal web GUI for using code agents like Codex and Claude Code (coming soon).

This repository is a VERY EARLY WIP. Proposing sweeping changes that improve long-term maintainability is encouraged.

Core Priorities

  1. Performance first.
  2. Reliability first.
  3. Keep behavior predictable under load and during failures (session restarts, reconnects, partial streams).

If a tradeoff is required, choose correctness and robustness over short-term convenience.

Package Roles

  • apps/server: Node.js WebSocket server. Wraps Codex app-server (JSON-RPC over stdio), serves the React web app, and manages provider sessions.
  • apps/web: React/Vite UI. Owns session UX, conversation/event rendering, and client-side state. Connects to the server via WebSocket.
  • packages/contracts: Shared Zod schemas and TypeScript contracts for provider events, WebSocket protocol, and model/session types.

Codex App Server (Important)

T3 Code is currently Codex-first. The server starts codex app-server (JSON-RPC over stdio) per provider session, then streams structured events to the browser through WebSocket push messages.

How we use it in this codebase:

  • Session startup/resume and turn lifecycle are brokered in apps/server/src/codexAppServerManager.ts.
  • Provider dispatch and thread event logging are coordinated in apps/server/src/providerManager.ts.
  • WebSocket server routes NativeApi methods in apps/server/src/wsServer.ts.
  • Web app consumes orchestration domain events via WebSocket push on channel orchestration.domainEvent (provider runtime activity is projected into orchestration events server-side).

Docs:

Reference Repos

Use these as implementation references when designing protocol handling, UX flows, and operational safeguards.

Cursor Cloud specific instructions

Prerequisites

  • Bun >= 1.3.9 (package manager; see packageManager in root package.json).
  • Node.js >= 24.13.1 (required for node:sqlite; see engines in root package.json).
  • Codex CLI on PATH is needed for full E2E agent sessions but is NOT required for dev server startup, lint, typecheck, or tests.

Key commands

All commands are documented in the root README.md. Quick reference:

  • bun install — install dependencies.
  • bun run lint — runs oxlint (not ESLint).
  • bun run typecheck — Turbo-orchestrated tsc --noEmit across all packages.
  • bun run test — Turbo-orchestrated Vitest across all packages.
  • bun run dev — starts contracts watch-build + server (port 3773) + Vite web (port 5733) via Turbo. Pass T3CODE_NO_BROWSER=1 to suppress auto-opening a browser.
  • bun run build — production build of all packages.

Gotchas

  • The server uses node:sqlite (experimental in Node 24). You will see ExperimentalWarning: SQLite is an experimental feature in test/server output — this is expected.
  • Dev state is isolated to ~/.t3/dev by default (set via T3CODE_STATE_DIR).
  • bun run dev spawns turbo under the hood via scripts/dev-runner.mjs; the runner resolves dev ports (server 3773, web 5733) and environment variables automatically.
  • packages/contracts must be built before apps/server or apps/web can start. Turbo handles this dependency, but if running individual packages manually, build contracts first: bun run build:contracts.
  • Lint uses oxlint (config: .oxlintrc.json), not ESLint. Formatting uses oxfmt (config: .oxfmtrc.json).
  • Desktop dev mode (bun run dev:desktop): The desktop Electron app requires apps/server/dist/index.mjs to exist (it spawns the server backend itself). Run bun run build:desktop first to build both server and desktop bundles, then bun run dev:desktop. The tsdown --watch (dev:bundle) may clean dist-electron/ and not immediately rebuild; if wait-on hangs, manually run bun run build in apps/desktop/ to unblock.