feat(client): port projects, applications, chat as placeholders (#184) #206

Merged
james merged 1 commit from 184-projects-applications-chat into main 2026-06-21 13:54:04 +00:00
Owner

Scope

Slice 3 of #184 — the last of the "(app) routes that have no backend yet" surface. Projects, Applications, and Chat all point at unbuilt epics (#4, #2, #47 respectively); same situation slice 2 hit with Network. The honest port is a placeholder that mirrors the PWA's existing Placeholder shape (title + blurb + a "tracked in" line). When each backend epic lands the corresponding screen swaps to the real implementation; the route file is the only thing that changes.

What changed

  • apps/client/lib/Placeholder.tsx — new shared component. Takes title / blurb / coming-soon copy / ticket as props and renders the same DS-tokenised card the slice 2 Network port used inline. The shared placeholder.trackedIn i18n key stays the source of the "Tracked in {ticket}." line.
  • apps/client/app/(app)/projects.tsx, applications.tsx, chat.tsx — three placeholder ports using the shared component, one per epic.
  • apps/client/app/(app)/network.tsx — refactored to use the same Placeholder so all four placeholder surfaces share one implementation. No behaviour change.
  • apps/client/lib/stub-screen.tsx — deleted. The temporary stub from #183 was only used by the three new ports, all of which now have real placeholder content.
  • packages/i18n/messages/en.json — adds projects.comingSoon.{title,body}, applications.comingSoon.{title,body}, chat.comingSoon.{title,body} keys mirroring the existing network.comingSoon.* entries.

DS tokens via useTheme(); strings via react-i18next; no hardcoded colours or copy.

Out of scope

  • The Projects, Applications, Chat backends — these are their own epics (#4, #2, #47). This PR doesn't introduce or shape those APIs.
  • Decommissioning the Next.js UI — that's #185. With slice 3 in, the universal client now mirrors every PWA route; #185 becomes unblocked.

Test plan

  • pnpm -F @carol/client typecheck
  • pnpm -F @carol/client lint
  • pnpm -F @carol/client test
  • pnpm -F @carol/client export:web
  • pnpm -F @carol/api typecheck
  • pnpm -F @carol/api lint

Closes part of #184.

## Scope Slice 3 of #184 — the last of the "(app) routes that have no backend yet" surface. Projects, Applications, and Chat all point at unbuilt epics (#4, #2, #47 respectively); same situation slice 2 hit with Network. The honest port is a placeholder that mirrors the PWA's existing `Placeholder` shape (title + blurb + a "tracked in" line). When each backend epic lands the corresponding screen swaps to the real implementation; the route file is the only thing that changes. ## What changed - **`apps/client/lib/Placeholder.tsx`** — new shared component. Takes title / blurb / coming-soon copy / ticket as props and renders the same DS-tokenised card the slice 2 Network port used inline. The shared `placeholder.trackedIn` i18n key stays the source of the "Tracked in {ticket}." line. - **`apps/client/app/(app)/projects.tsx`**, **`applications.tsx`**, **`chat.tsx`** — three placeholder ports using the shared component, one per epic. - **`apps/client/app/(app)/network.tsx`** — refactored to use the same `Placeholder` so all four placeholder surfaces share one implementation. No behaviour change. - **`apps/client/lib/stub-screen.tsx`** — deleted. The temporary stub from #183 was only used by the three new ports, all of which now have real placeholder content. - **`packages/i18n/messages/en.json`** — adds `projects.comingSoon.{title,body}`, `applications.comingSoon.{title,body}`, `chat.comingSoon.{title,body}` keys mirroring the existing `network.comingSoon.*` entries. DS tokens via `useTheme()`; strings via `react-i18next`; no hardcoded colours or copy. ## Out of scope - The Projects, Applications, Chat backends — these are their own epics (#4, #2, #47). This PR doesn't introduce or shape those APIs. - Decommissioning the Next.js UI — that's #185. With slice 3 in, the universal client now mirrors every PWA route; #185 becomes unblocked. ## Test plan - [x] `pnpm -F @carol/client typecheck` - [x] `pnpm -F @carol/client lint` - [x] `pnpm -F @carol/client test` - [x] `pnpm -F @carol/client export:web` - [x] `pnpm -F @carol/api typecheck` - [x] `pnpm -F @carol/api lint` Closes part of #184.
feat(client): port projects, applications, chat as placeholders (#184)
Some checks failed
Commits / Conventional Commits (pull_request) Successful in 8s
PR / OSV-Scanner (pull_request) Successful in 2m16s
PR / OpenAPI (pull_request) Successful in 2m42s
PR / Static analysis (pull_request) Successful in 2m42s
PR / Client (web export smoke) (pull_request) Successful in 2m48s
PR / pnpm audit (pull_request) Successful in 3m2s
PR / Lint (pull_request) Successful in 3m22s
PR / Package age policy (soft) (pull_request) Successful in 40s
PR / Typecheck (pull_request) Successful in 3m49s
Secrets / gitleaks (pull_request) Successful in 1m9s
PR / Test (postgres) (pull_request) Successful in 3m59s
PR / Build (pull_request) Successful in 4m16s
PR / Test (sqlite) (pull_request) Successful in 4m16s
PR / Coverage (soft) (pull_request) Successful in 1m47s
PR / Trivy (image) (pull_request) Failing after 2m6s
73da311b2a
Slice 3 of #184. Projects (epic #4), Applications (epic #2), and
Chat (epic #47) have no backend yet — same situation slice 2 hit with
Network. The honest port is a placeholder that mirrors the PWA's
existing `Placeholder` shape (title + blurb + a "tracked in" line).
When each backend epic lands, the corresponding screen swaps to the
real implementation; the route file is the only thing that changes.

Extracts the shared layout into `lib/Placeholder.tsx` so all four
placeholder screens (Network, Projects, Applications, Chat) share one
implementation. Network refactors to use it. The temporary
`lib/stub-screen.tsx` from #183 was only used by the three new ports;
deleted.

Adds `comingSoon.{title,body}` keys for projects, applications, chat
in `packages/i18n/messages/en.json` — same shape as the existing
`network.comingSoon.*` entries. The shared `placeholder.trackedIn` key
stays put.

📊 Test coverage

Patch coverage: no testable lines changed.

Overall (app/, lib/, db/, excluding UI per ADR-0019):

Metric Value Soft target
Lines 70.4% ≥ 50%
Branches 61.2% ⚠️ ≥ 75%
Functions 68.0% informational

Soft thresholds per ADR-0019. Coverage is informational and does not block merge.

<!-- coverage-comment --> ## 📊 Test coverage **Patch coverage:** no testable lines changed. **Overall** (`app/`, `lib/`, `db/`, excluding UI per ADR-0019): | Metric | Value | Soft target | |---|---|---| | Lines | 70.4% ✅ | ≥ 50% | | Branches | 61.2% ⚠️ | ≥ 75% | | Functions | 68.0% | informational | Soft thresholds per [ADR-0019](docs/adr/0019-coverage-soft-targets.md). Coverage is informational and does not block merge.

Trivy (container image)

Threshold: high  ·  Total findings: 121  ·  At/above threshold: 1

critical high medium low
0 1 50 70
severity id package installed / range fix
high CVE-2026-12151 undici 6.25.0 6.27.0, 7.28.0, 8.5.0
<!-- scanner-comment: trivy --> ### Trivy (container image) **Threshold:** `high` &nbsp;·&nbsp; **Total findings:** 121 &nbsp;·&nbsp; **At/above threshold:** 1 | critical | high | medium | low | |---:|---:|---:|---:| | 0 | 1 | 50 | 70 | | severity | id | package | installed / range | fix | |---|---|---|---|---| | high | [CVE-2026-12151](https://avd.aquasec.com/nvd/cve-2026-12151) | undici | 6.25.0 | `6.27.0, 7.28.0, 8.5.0` |
james merged commit efb63f748c into main 2026-06-21 13:54:04 +00:00
james deleted branch 184-projects-applications-chat 2026-06-21 13:54:04 +00:00
Sign in to join this conversation.
No description provided.