# 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.html` via a static server), brand voice rules in `design_system_readme.md` ## Development ```sh 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) ```sh 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; `.js` extensions on relative imports - `@commitea/core` stays pure — unit-testable without Electron or network - Design tokens are the source of truth (`apps/desktop/src/renderer/src/design/`, mirrored from `docs/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