You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Closes#60
## Summary
- New `KpiStrip` at the top of `/` — four ops tiles (Servers running,
Spend today, Forecast MTD, Active alerts) each with a top color accent
rule and a 7-bar sparkline driven by `/api/status` +
`/api/costs/estimate` + `/api/costs/actual`.
- `GameCard` redesigned: gradient top-accent rule keyed to state,
Outfit-bold game name above DM Mono hostname (with copy button), status
badge with icon + pulsing/animated dot covering all 5 states (RUNNING /
STARTING / STOPPED / NOT_DEPLOYED / ERROR), 2×2 stats grid (Last run /
Players / $/hr / Task short-id), Start-or-Stop gradient primary +
Files/Logs secondary actions.
- `DashboardPage` adds a client-side search input (filters by game name
or hostname) and switches to a responsive 3 → 2 → 1 column grid.
- e2e specs from #76 realigned with the new design — STOPPED/RUNNING
badges, single-CTA pattern (`Start.toHaveCount(0)` while running) — plus
new specs covering search filter, empty-state on no matches, and KPI
tile rendering.
- `CLAUDE.md` documents the `issue-flow` plugin as the canonical issue →
PR driver, complementing the existing `/pr` command.
## Verification — acceptance criteria mapped to landing
| AC | Where it lives |
|---|---|
| KPI strip renders 4 tiles with live data + sparkline |
`app/packages/web/src/components/KpiStrip.tsx` |
| GameCard uses shadcn Card / Button / Badge from #58 | `GameCard.tsx`
(Card root, Button variants `start`/`stop`/`secondary`/`ghost`, state
Badge) |
| Status badge shows icon + text on all 5 states | `STATE_LABELS` +
`StateIcon` in `GameCard.tsx` |
| Search filter narrows grid in real time | `DashboardPage.tsx`
`useMemo` filter on game name + hostname |
| Start, Stop, Files, Logs reachable from new card | `GameCard.tsx`
action row; Logs links to `/logs` (the route placeholder lands fully in
#63) |
| `npm run app:test` passes; existing tests updated, not deleted | 258
tests pass; no prior GameCard tests existed |
## Implementation notes
- The redesigned card swaps the primary CTA based on state instead of
disabling the inactive one — cleaner UX, but it required updating the
e2e spec from `Start.toBeDisabled()` to `Start.toHaveCount(0)` for
running games.
- KPI sparkline data is currently a single shared `/api/costs/actual`
series across all four tiles (cost itself for the cost tiles; same
series as a coarse activity proxy for Servers running; flat zeros for
Active alerts when count is 0). Per-tile historical series would need
new endpoints.
- Forecast MTD uses average-daily-spend × calendar-days-in-month —
simple extrapolation, no Cost Explorer Forecast API.
- The `Logs` per-card button is `<Link to="/logs">` (asChild). The
`/logs` page is a placeholder until #63 lands — the link exists so the
action is "reachable" per the AC.
## Test plan
- [ ] Local: `npm run app:dev`, browse to `/`, verify the four KPI tiles
render with live values and a 7-bar sparkline beneath each.
- [ ] Type a partial game name or hostname into the search input — grid
narrows in real time; clear it — grid restores.
- [ ] Start a stopped game from a card — primary CTA swaps to Stop after
the 3s refresh; click Files — modal opens; click Logs — navigates to
`/logs`.
- [ ] CI: `npm run app:test` (vitest, 258 tests) and `npm run
app:test:e2e` (Playwright via `.github/workflows/e2e.yml`) both green.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01TiPfpb2vvkRMMXqc9oX5d2)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CLAUDE.md
+16Lines changed: 16 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -187,6 +187,22 @@ Use `.worktrees/<branch-name>` for feature work (the directory is gitignored). C
187
187
git worktree add .worktrees/<branch> -b <branch>
188
188
```
189
189
190
+
## Claude Code Plugins
191
+
192
+
This repo expects the **`issue-flow`** plugin (from `CoderCoco/claude-plugin-marketplace`) to drive the issue → PR loop. Two skills, used in order:
193
+
194
+
-**`work-on`** — start work on a GitHub issue. Creates the `claude/issue-<N>-<slug>` branch, scaffolds a worktree, and pulls the issue checklist into the session as the source of truth for what "done" means.
195
+
-**`open-pr`** — finish the loop. Verifies the issue checklist is actually complete, picks up the repo's PR conventions (the rules in the next section), opens the PR with the right `Closes #N` keyword, and moves the project card to "In Review".
If the plugin isn't loaded in the current environment, fetch the skill body from the marketplace repo and follow it manually — don't fall back to ad-hoc PR creation, because the skills enforce checklist-completeness and the closing keyword that this repo's `/pr` command takes for granted.
205
+
190
206
## PR Conventions
191
207
192
208
-**Always use `/pr` to create pull requests.** The `.claude/commands/pr.md` skill validates the title format before calling the API. Never call `mcp__github__create_pull_request` directly without running this check first.
0 commit comments