c120f34a4a824a914b8b73ad55edc2e6af91d72b
Every remaining fixture-only surface now renders reconciled gitea data,
with the fixture kept only as the no-config demo fallback.
- lib/views/project-data.ts: ProjectData — the uniform input (reconciled
backlog + deps + timelines + calibration + workers + today) that AppShell
assembles once and every view builder consumes.
- lib/views/{issue-detail,gantt-view,deps-graph,standup-view,inbox-view}.ts:
pure builders, ProjectData → the fixture-shaped object each screen already
renders. Real signals only; honest degradation where a signal isn't derivable
(buffered p80 vs per-issue Monte Carlo; flat "idle in review"; no fabricated
inbox mentions/outages).
- Screens take an optional `data?` and fall back to the fixture; AppShell wires
the real view whenever the backlog is reconciled. Issue "blocks" chips and the
rail inbox badge now resolve from real data too.
- Dev-only rail surfaces (First run / States / Primitives) gated on
import.meta.env.DEV || demo — shown in dev + e2e, hidden in a packaged app.
Rail host label reflects the connected instance.
- Extended the live onboarding e2e to click Board → Gantt → Deps → Issue
sidecar → Standup → Inbox on real gitea data with a pageerror guard; 14
fixture e2e stay green, typecheck + prod build clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CommiTea
AI project manager built on Gitea. A deterministic scheduler does the math
(Monte Carlo forecasts over your own estimate-vs-actual history); the agent —
Reginald — captures work via interview, negotiates priorities, and explains the
consequences. Gitea holds human-authored intent; a pm-state repo holds
machine-derived state. The LLM never does math.
Structure
apps/desktop— Electron app (electron-vite, React, Tailwind)packages/core— pure TypeScript: label schema, scheduler, gitea client (no Electron imports)docs/PLAN.md— product plan (goals, phases, not-doing list)docs/design/— design handoff: tokens, component contracts, interactive prototype (docs/design/ui_kits/app/index.htmlvia a static server), brand voice rules indesign_system_readme.md
Development
yarn # install
yarn dev # electron app, logs tee to apps/desktop/desktop.log
yarn test # unit tests (vitest)
yarn typecheck
End-to-end (Electron + Playwright)
yarn workspace @commitea/desktop e2e # build, then drive the built app
yarn workspace @commitea/desktop e2e:only # reuse existing out/ build (tight loop)
yarn workspace @commitea/desktop e2e:report # open the last HTML report
Tests launch the built app (out/main/index.js) through Playwright's
_electron API — no browser project, no chromium download. Fixtures and page
objects live in apps/desktop/e2e/; screenshots land in
e2e/.artifacts/screens/ for visual review. Page objects use user-facing
locators (getByRole/getByText), never CSS/DOM structure.
Conventions
- Yarn 4 workspaces; ESM everywhere;
.jsextensions on relative imports @commitea/corestays pure — unit-testable without Electron or network- Design tokens are the source of truth (
apps/desktop/src/renderer/src/design/, mirrored fromdocs/design/); Tailwind maps onto the CSS custom properties, never redefines them - Reginald's voice rules live in
docs/design/design_system_readme.md— no emoji, no point-date forecasts, wit in sentences never in buttons
Description
Languages
TypeScript
97.8%
CSS
1.7%
JavaScript
0.4%