Productionize: real data everywhere (Phase B) + shareable unsigned macOS .dmg (Phase C) #52
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/kill-fixtures"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Productionizes CommiTea for team sharing: all screens on real data (Phase B) and a shareable unsigned macOS .dmg (Phase C).
Phase B — real data for the last fixture screens
Every remaining fixture-only surface now renders reconciled gitea data; the fixture stays only as the no-config demo fallback.
lib/views/project-data.ts—ProjectData, the uniform input (backlog + deps + timelines + calibration + workers + today), assembled once in AppShell.issue-detail,gantt-view,deps-graph,standup-view,inbox-view):ProjectData →the fixture-shaped object each screen already renders. Real signals only, honest degradation where a signal isn't derivable (bufferedp80vs per-issue Monte Carlo; flat "idle in review"; no fabricated inbox mentions/outages).data?and fall back to the fixture; AppShell wires the real view once the backlog is reconciled. Issue "blocks" chips + rail inbox badge resolve from real data too.import.meta.env.DEV || demo— hidden in a real packaged app. Rail host label reflects the connected instance.Phase C — package as an unsigned macOS .dmg
electron-builder.yml: appIdio.stephenmann.commitea, productName CommiTea, logo icon, macOS dmg for arm64 + x64. Ships onlyout/**(electron-vite already bundles renderer/preload/main with core + react inlined);npmRebuildoff;electronVersionpinned (workspace hoisting defeats auto-detect).mac.identity: null, hardenedRuntime off (ad-hoc signed so arm64 runs; not notarized — teammates right-click → Open once).yarn pack/yarn dist;README.mddocuments build + the Gatekeeper install step.Verification
pageerrorguard → zero uncaught render errors.yarn distproducedCommiTea-0.1.0-arm64.dmg(98M) +CommiTea-0.1.0.dmg(x64, 102M), each mounting drag-to-Applications.Base / stacking
Based on
mainso merging lands on main (avoids the stacked-merge trap). Carries the Phase A commit (#51) until that merges; merge #51 first and this reduces to Phase B+C, or merge this and #51 closes as included.Deferred (follow-up)
Real issue comments in the sidecar (not reconciled yet); standup "overnight drift" needs a prior-snapshot diff to be genuinely historical; notarization/Windows are out of scope per the distribution decision.
🤖 Generated with Claude Code
The foundation for a shareable team build. Replaces the .env.local-only dev config with a real, per-teammate connection flow. main: - config-store.ts: token encrypted at rest via Electron safeStorage (OS keychain), config JSON in userData. Token lives only in main; renderer gets everything but. - resolveConfig: saved config > .env.local (dev) > null; ignored under COMMITEA_E2E. pm-state repo defaults to `${repo}-pm-state`. resetClients() re-reads on change so saving config takes effect without a restart. gitea:status gains `demo` (e2e). - IPC: config:get (no token), config:test (authed read validates token+repo), config:set (encrypt+save+reset), config:clear. Model bridge reads config.modelUrl and probes reachability — chat is "configured" only if a model actually answers; localhost default is dev-only (app.isPackaged gate). renderer: - ConnectScreen: real onboarding form (URL/owner/repo/PAT/optional model) → test → save. AppShell gates on it: demo → shell (fixtures/e2e); configured → shell (real); else → connect. Settings Connection card is real (repo/url/model/sidecar) with Reconfigure + Disconnect. Chat cleanly disables with a "no model" state instead of the scripted canned reply. Verified: main + desktop typecheck clean, 14 fixture e2e green (demo mode unchanged), live onboarding e2e: fresh app → connect form → validated PAT → real board (24 done / 10 open). COMMITEA_NO_ENV_LOCAL + COMMITEA_USERDATA are test hooks for the onboarding path. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>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>Phase B: real data for the last fixture screensto Productionize: real data everywhere (Phase B) + shareable unsigned macOS .dmg (Phase C)