A PR merged in the GitHub UI was invisible to the platform — prState only flipped to `merged` when the platform merged it (ghMergePr on ship) or a runner reported it, so the job details page kept showing the PR as open. This adds a simple, pull-based reconcile (no inbound webhook / public ingress needed). - coordinator.reconcileJobPrState(jobId, productId, fetcher?): finds the latest run carrying a prUrl and, when `gh pr view --json state` reports MERGED, flips the run's prState to `merged` and appends a `pr_merged` event (data.via: 'reconcile'). The GitHub lookup is injectable for tests; pure `mapGhPrState` maps MERGED/OPEN/other. Best-effort: any gh failure is a no-op. - POST /fleet/jobs/:id/pr/reconcile route; echoes the outcome to the tracker Item when a merge is detected. - tracker-web: reconcilePrState() client + a "Refresh PR status" button on the job details PR section (shown until the PR is merged) that reconciles then refreshes the view. Tests: +5 (mapGhPrState, reconcile merged/open/no_pr/not_found, route wiring); full suite 1861 green; lint + tsc clean (service + tracker-web). Deployed: rebuilt the docker platform-service; POST .../pr/reconcile returns 401 (wired), not 404. Generated with [Devin](https://cli.devin.ai/docs) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> |
||
|---|---|---|
| .. | ||
| docs | ||
| e2e | ||
| launchd | ||
| public | ||
| src | ||
| .bundlesizerc.json | ||
| .env.example | ||
| .env.local.example | ||
| .gitignore | ||
| .nvmrc | ||
| .prettierignore | ||
| Dockerfile | ||
| eslint.config.mjs | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| playwright.config.ts | ||
| postcss.config.mjs | ||
| README.md | ||
| tsconfig.json | ||
| vercel.json | ||
| vitest.config.ts | ||
| vitest.setup.ts | ||
Tracker Dashboard
Web dashboard for the Tracker Service — manage feature requests, bugs, and tasks. Built with Next.js + Tailwind CSS + React.
Port
3003 (configurable in package.json scripts)
Pages
| Route | Description |
|---|---|
/login |
Login via platform-service credentials |
/dashboard |
Overview with stats by type, status, priority |
/dashboard/items |
Items list with filtering, search, create, delete |
/dashboard/board |
Kanban board with drag-free status transitions |
/dashboard/items/[id] |
Item detail with edit, status/priority change, comments, votes |
API Proxy Routes
| Route | Proxies to |
|---|---|
/api/auth/login |
platform-service POST /api/auth/login |
/api/auth/me |
platform-service GET /api/auth/me |
/api/tracker/* |
tracker-service /api/* |
Setup
cp .env.local.example .env.local # fill in values
npm install
npm run dev # starts on port 3003
Environment Variables
See .env.local.example for required variables:
PLATFORM_API_URL— Platform service URL (defaulthttp://localhost:4003)JWT_SECRET— Shared JWT secretPRODUCT_ID— Product scope (e.g.,lysnrai,chronomind,nomgap)