Merge branch 'main' into feat/apply-changes-assign-milestone

This commit is contained in:
2026-07-09 19:23:43 +00:00
20 changed files with 3473 additions and 42 deletions

View File

@@ -38,6 +38,11 @@ test.describe('live onboarding', () => {
const win = await app.firstWindow()
await win.waitForLoadState('domcontentloaded')
// Any uncaught render error in a real-data view builder must fail the test —
// this is the "it actually works on real data" guarantee.
const pageErrors: string[] = []
win.on('pageerror', (e) => pageErrors.push(e.message))
// the connection gate, not the app
await expect(win.getByText(/Connect your Gitea/)).toBeVisible({ timeout: 15000 })
await win.getByPlaceholder('your-org').fill('christian')
@@ -45,11 +50,35 @@ test.describe('live onboarding', () => {
await win.getByPlaceholder(/gitea PAT/).fill(token!)
await win.getByRole('button', { name: 'Connect' }).click()
// it validated + saved + reconciled into the real board — real issue titles prove it
const rail = win.getByRole('navigation', { name: 'Primary' })
const realTitle = /Model router|SQLite cache bootstrap|Purity\/rebuild/
// Board (real reconciled columns) — real issue titles prove the sync landed.
await rail.getByRole('button', { name: 'The pot' }).click()
await expect(win.getByText(/Model router|SQLite cache bootstrap|Purity\/rebuild/).first()).toBeVisible({ timeout: 30000 })
await expect(win.getByText(realTitle).first()).toBeVisible({ timeout: 30000 })
// Gantt tab — scheduler-derived bars over the real open backlog.
await win.getByRole('tab', { name: 'Gantt' }).click()
await expect(win.getByText(realTitle).first()).toBeVisible()
// Dependencies tab — real dep graph. Just needs to render without throwing.
await win.getByRole('tab', { name: 'Dependencies' }).click()
await win.waitForTimeout(300)
// Issue drill-in — the machine-derived sidecar (lifecycle/forecast/deps) on a real issue.
await win.getByRole('tab', { name: 'Board' }).click()
await win.getByText(realTitle).first().click()
await expect(win.getByText('Machine-derived')).toBeVisible()
await win.getByRole('button', { name: 'Back' }).click()
// Standup + Inbox — scheduler plan / nag / inbox feed over real data.
await rail.getByRole('button', { name: 'Standup' }).click()
await expect(win.getByRole('heading', { name: 'Morning standup' })).toBeVisible()
await rail.getByRole('button', { name: 'Inbox' }).click()
await expect(win.getByRole('heading', { name: 'Inbox' })).toBeVisible()
await win.screenshot({ path: join(here, '.artifacts', 'screens', 'live-onboarding.png'), fullPage: true, animations: 'disabled' })
expect(pageErrors, `uncaught render errors: ${pageErrors.join(' · ')}`).toEqual([])
await app.close()
})