Current main ships a working single-user local loop: the Go daemon and the
Electron/React frontend both drive a live daemon over HTTP/SSE/WebSocket. The
core GitHub flow works end-to-end: add project → spawn session/orchestrator →
attach terminal → observe PR → merge.
This file tracks progress. For what the product is and how to run it, see the
top-level README.md; for the backend mental model see
architecture.md.
The local gate is the backend Go build and race-enabled test suite:
cd backend && go build ./... && go test -race ./...npm run lint (from the repo root) runs go test ./... plus golangci-lint.
Frontend checks live under frontend/ (npm run typecheck, npm run build).
See AGENTS.md for the regen workflow when touching the API
surface (npm run sqlc, npm run api).
- Loopback-only HTTP daemon (chi router, CORS, per-request timeout,
/healthz//readyz//shutdown). - SQLite store with goose migrations and sqlc-generated queries; DB
trigger-based change-data-capture into
change_log. - CDC poller + broadcaster feeding in-process subscribers and the SSE stream
at
GET /api/v1/events(withLast-Event-IDreplay). - Full session lifecycle over HTTP: list, get, spawn, kill, restore, rename, rollback, cleanup, send, activity, PR claim/list. Orchestrator routes (list/spawn/get) are wired too.
- Project CRUD plus per-project config (
PUT /projects/{id}/config). - PR action engine wired into the API:
POST /prs/{id}/mergeand/prs/{id}/resolve-comments. - Review routes registered:
GET /reviews,POST /reviews/execute,POST /reviews/{id}/send. - SCM observer (
internal/observe/scm) wired into the daemon: GitHub provider, lazy/non-blocking auth, per-PR polling with ETag guards and semantic diffing, feeding PR facts into lifecycle, which sends agent nudges for CI failures, review feedback, and merge conflicts (#75, #108, #109). - Terminal mux over WebSocket (
/mux): per-clientzellij attachPTY. - Lifecycle reducer plus reaper (
internal/observe/reaper). - Agent adapter platform under
internal/adapters/agent/(23 adapters) with a registry andao hooksactivity dispatch. - OpenAPI spec generated from Go DTOs; frontend TS types generated from it and drift-checked in CI.
- Electron + React 19 + TanStack Router/Query + Tailwind + shadcn primitives.
- Real daemon wiring via the generated
openapi-fetchtyped client (src/api/schema.ts); mock data only inVITE_NO_ELECTRONweb-preview mode. - Electron main handles daemon discovery, launch, and status reporting.
- Shell: sidebar (projects + sessions, add/remove project), sessions board, session view + inspector, project settings, pull-requests page, spawn-orchestrator flow.
- Terminal pane (xterm) over the mux WebSocket, with a live SSE events connection and port-rebind on daemon restart.
- Tracker lane: GitHub tracker adapter exists, but there is no daemon observer loop or agent-lifecycle→issue mirroring yet, so the tracker does nothing at runtime (#112).
- Notifications: design/in-flight only; no shipped backend notifier or UI center.
- Live PR/tracker fact surfacing: the observer writes facts, but exposing
the full
pr_*/tracker_*CDC events to live consumers (#110) and inao session get(#111) is still open. - CLI parity for PR/review actions: merge, resolve-comments, and review are
HTTP-only (frontend-driven); there are no
ao pr/ao reviewcommands.
Tracking milestone:
rewrite.