The app now displays its own live backlog instead of fixtures. First end of the sync loop — the tap-root (#1) grows list reads and a read path through the Electron main process. - @commitea/core: client gains `listIssues` (paginated, PRs excluded) and `listMilestones`; a `lifecycle-v0` mapper (closed→done, labelled/milestoned→triage, bare→diagnosis — steeping/review await event inference in P1-5). +10 unit tests. - main: gitea bridge over IPC (token stays in main, never the renderer); config from env / .env.local; gated off under COMMITEA_E2E so the committed e2e stays on fixtures. Preload exposes the typed bridge. - renderer: useBacklog() reconciles once on mount; issuesToBoardColumns shapes real issues into The pot. Board takes optional real columns + a loading state, falling back to demo fixtures when unconfigured. Verified: 14 e2e green (fixture mode) + a gated live spec that launches against the real repo — the board renders the actual 25 open + 9 closed issues (screenshot). SQLite mirror + reconcile-on-a-timer + lifecycle event inference are the next slices (#2/#3/#5). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
18 lines
616 B
TypeScript
18 lines
616 B
TypeScript
import { contextBridge, ipcRenderer } from 'electron'
|
|
|
|
const api = {
|
|
platform: process.platform,
|
|
gitea: {
|
|
/** Whether the main process has a gitea token + target repo configured. */
|
|
status: () => ipcRenderer.invoke('gitea:status'),
|
|
/** Full read of the managed repo — every issue + milestone. */
|
|
reconcile: () => ipcRenderer.invoke('gitea:reconcile'),
|
|
/** One issue by index, normalized (or null if unconfigured). */
|
|
getIssue: (index: number) => ipcRenderer.invoke('gitea:getIssue', index),
|
|
},
|
|
}
|
|
|
|
export type CommiteaApi = typeof api
|
|
|
|
contextBridge.exposeInMainWorld('commitea', api)
|