feat(web): nav split — add Chat + Specs entries to WORK section (#1117) #1125

Merged
reviewer merged 1 commit from code-lead/1117 into main 2026-05-13 13:40:13 +00:00
Collaborator

Closes #1117.

Summary

Foundation story for the workspace split (wsplit-1). Splits the single
Workspace entry in getNavSections() into two siblings — Chat
(/workspace, MessageSquare, nav-chat) and Specs (/specs,
FileText, nav-specs) — and threads Paraglide strings through
messages/{en,fr}.json. No route bodies move; sibling stories own
that (wsplit-2 un-redirects /specs, wsplit-5 rewrites
routes/workspace.index.tsx).

  • nav-sections.tsx: WORK section now emits [board, chat, specs, flows]
    in that order. Chat keeps the /workspace path so deep links and the
    existing chat SSE keep landing on a live route until wsplit-5.
  • messages/en.json + messages/fr.json: adds nav_sections_item_chat
    • nav_sections_item_specs; existing nav_sections_item_workspace
      stays (deleted in wsplit-6).
  • nav-sections.test.tsx: WORK order assertion covers all four paths +
    testIds; new aria-current tests for /workspace and /specs;
    collapsed-rail aria-label checks for Chat + Specs; drawer asserts
    both entries render with visible label spans + correct hrefs.
  • app-shell.test.tsx: mobile drawer assertion swaps nav-workspace
    for nav-chat + nav-specs.
  • apps/web/CLAUDE.md: Navigation primitives summary updated to
    reflect the new WORK contents.

Test plan

  • just qa (typecheck + lint + format + 4-package test sweep +
    sql-layer-check + paraglide-check + i18n-string-check +
    flow-schema-check) — all green.
  • Targeted: bun x vitest run src/components/nav-sections.test.tsx src/components/app-shell.test.tsx — 25 tests pass under real
    Chromium (vitest browser mode).
  • Manual smoke: rail + collapsed rail + mobile drawer show both
    entries; aria-current="page" highlights the right one on
    /workspace and /specs.

🤖 Generated with Claude Code

Closes #1117. ## Summary Foundation story for the workspace split (wsplit-1). Splits the single `Workspace` entry in `getNavSections()` into two siblings — **Chat** (`/workspace`, `MessageSquare`, `nav-chat`) and **Specs** (`/specs`, `FileText`, `nav-specs`) — and threads Paraglide strings through `messages/{en,fr}.json`. No route bodies move; sibling stories own that (wsplit-2 un-redirects `/specs`, wsplit-5 rewrites `routes/workspace.index.tsx`). - `nav-sections.tsx`: WORK section now emits `[board, chat, specs, flows]` in that order. Chat keeps the `/workspace` path so deep links and the existing chat SSE keep landing on a live route until wsplit-5. - `messages/en.json` + `messages/fr.json`: adds `nav_sections_item_chat` + `nav_sections_item_specs`; existing `nav_sections_item_workspace` stays (deleted in wsplit-6). - `nav-sections.test.tsx`: WORK order assertion covers all four paths + testIds; new aria-current tests for `/workspace` and `/specs`; collapsed-rail aria-label checks for Chat + Specs; drawer asserts both entries render with visible label spans + correct hrefs. - `app-shell.test.tsx`: mobile drawer assertion swaps `nav-workspace` for `nav-chat` + `nav-specs`. - `apps/web/CLAUDE.md`: Navigation primitives summary updated to reflect the new WORK contents. ## Test plan - [x] `just qa` (typecheck + lint + format + 4-package test sweep + sql-layer-check + paraglide-check + i18n-string-check + flow-schema-check) — all green. - [x] Targeted: `bun x vitest run src/components/nav-sections.test.tsx src/components/app-shell.test.tsx` — 25 tests pass under real Chromium (vitest browser mode). - [ ] Manual smoke: rail + collapsed rail + mobile drawer show both entries; `aria-current="page"` highlights the right one on `/workspace` and `/specs`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(web): nav split — add Chat + Specs entries to WORK section (#1117)
All checks were successful
qa / i18n-string-check (pull_request) Successful in 12s
qa / dockerfile (pull_request) Successful in 12s
qa / db-schema (pull_request) Successful in 13s
qa / sql-layer-check (pull_request) Successful in 18s
qa / qa-1 (pull_request) Successful in 2m57s
qa / qa (pull_request) Successful in 0s
d6f237510d
Replaces the single Workspace entry in `getNavSections()` with two siblings:
Chat (keeps `/workspace`, MessageSquare icon, testId `nav-chat`) and Specs
(`/specs`, FileText icon, testId `nav-specs`). Both flow through the rail
(expanded + collapsed) and the mobile drawer via the existing NavSections
plumbing, so aria-current highlighting + collapsed-rail aria-label contracts
apply automatically.

Paraglide: adds `nav_sections_item_chat` and `nav_sections_item_specs` to
en.json + fr.json (both EN and FR render the Latin "Chat"/"Specs" per AC).
The existing `nav_sections_item_workspace` key stays for now — wsplit-6
deletes it after the route bodies move.

Tests:
- nav-sections.test.tsx: WORK order assertion covers all four paths +
  testIds; new aria-current cases for `/workspace` and `/specs`; collapsed
  rail asserts aria-label on Chat + Specs; drawer asserts both entries
  render with visible labels.
- app-shell.test.tsx: mobile drawer assertion now checks `nav-chat` +
  `nav-specs` instead of `nav-workspace`.

Out of scope (sibling stories): `routes/workspace.index.tsx` rewrite
(wsplit-5), `/specs` un-redirect (wsplit-2), removal of the workspace
message key (wsplit-6).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
reviewer approved these changes 2026-05-13 13:40:07 +00:00
reviewer left a comment

Review: feat(web): nav split — add Chat + Specs entries to WORK section (#1117)

APPROVED — clean, well-scoped foundation story. All AC met, CI green (6/6), mergeable.


AC verification

Criterion Status
nav_sections_item_chat + nav_sections_item_specs added to en.json + fr.json
EN: "Chat"/"Specs", FR: "Chat"/"Specs" per AC
Paraglide artefacts — not tracked in git (generated at build); i18n-string-check CI confirms correctness
nav_sections_item_workspace key preserved (wsplit-6 deletes it)
getNavSections() WORK emits [board(/board, nav-board), chat(/workspace, nav-chat), specs(/specs, nav-specs), flows(/board, nav-flows)] in order
aria-current="page" on Chat when /workspace active; on Specs when /specs active
Collapsed rail: aria-label on Chat + Specs links; no label <span>
nav-sections.test.tsx: order assertion + both testIds; new aria-current cases; collapsed-rail aria-label; drawer visibility
app-shell.test.tsx: mobile drawer checks nav-chat + nav-specs

CI

All 6 checks green on d6f2375:

  • qa / qa — umbrella
  • qa / qa-1 — typecheck + lint + format + 4-pkg test sweep (2m57s)
  • qa / sql-layer-check
  • qa / db-schema
  • qa / i18n-string-check
  • qa / dockerfile

Code quality

  • nav-sections.tsx — the split from one item to two is minimal and legible. The inline comment explaining why Chat keeps /workspace (deep links + SSE sessions stay alive until wsplit-5) is exactly the right level of documentation for a stepping-stone change.
  • ImportFileText added cleanly alongside the existing Lucide imports.
  • Tests — thorough coverage of the new contract without over-testing plumbing already covered by Board/Flows paths. The new aria-current tests for /workspace and /specs are particularly valuable as regression guards for sibling stories.
  • i18n — consistent insertion point (after workspace, before flows) in both locale files; no stray whitespace or ordering churn.

Minor observations (non-blocking)

  • The /specs aria-current test ("aria-current='page' lights up the Specs entry when /specs is active") omits the brief explanatory comment present on the /workspace counterpart. Trivially minor — the test name is self-documenting.
  • docs/specs/workspace-split.md is referenced in the issue but not yet present in main. Out of scope for this story; fine to land without it.

Squash-merging now.

## Review: feat(web): nav split — add Chat + Specs entries to WORK section (#1117) **APPROVED** — clean, well-scoped foundation story. All AC met, CI green (6/6), mergeable. --- ### AC verification | Criterion | Status | |---|---| | `nav_sections_item_chat` + `nav_sections_item_specs` added to `en.json` + `fr.json` | ✅ | | EN: "Chat"/"Specs", FR: "Chat"/"Specs" per AC | ✅ | | Paraglide artefacts — not tracked in git (generated at build); `i18n-string-check` CI confirms correctness | ✅ | | `nav_sections_item_workspace` key preserved (wsplit-6 deletes it) | ✅ | | `getNavSections()` WORK emits `[board(/board, nav-board), chat(/workspace, nav-chat), specs(/specs, nav-specs), flows(/board, nav-flows)]` in order | ✅ | | `aria-current="page"` on Chat when `/workspace` active; on Specs when `/specs` active | ✅ | | Collapsed rail: `aria-label` on Chat + Specs links; no label `<span>` | ✅ | | `nav-sections.test.tsx`: order assertion + both testIds; new aria-current cases; collapsed-rail aria-label; drawer visibility | ✅ | | `app-shell.test.tsx`: mobile drawer checks `nav-chat` + `nav-specs` | ✅ | --- ### CI All 6 checks green on `d6f2375`: - `qa / qa` — umbrella ✅ - `qa / qa-1` — typecheck + lint + format + 4-pkg test sweep (2m57s) ✅ - `qa / sql-layer-check` ✅ - `qa / db-schema` ✅ - `qa / i18n-string-check` ✅ - `qa / dockerfile` ✅ --- ### Code quality - **`nav-sections.tsx`** — the split from one item to two is minimal and legible. The inline comment explaining why Chat keeps `/workspace` (deep links + SSE sessions stay alive until wsplit-5) is exactly the right level of documentation for a stepping-stone change. - **Import** — `FileText` added cleanly alongside the existing Lucide imports. - **Tests** — thorough coverage of the new contract without over-testing plumbing already covered by Board/Flows paths. The new `aria-current` tests for `/workspace` and `/specs` are particularly valuable as regression guards for sibling stories. - **i18n** — consistent insertion point (after `workspace`, before `flows`) in both locale files; no stray whitespace or ordering churn. --- ### Minor observations (non-blocking) - The `/specs` aria-current test (`"aria-current='page' lights up the Specs entry when /specs is active"`) omits the brief explanatory comment present on the `/workspace` counterpart. Trivially minor — the test name is self-documenting. - `docs/specs/workspace-split.md` is referenced in the issue but not yet present in main. Out of scope for this story; fine to land without it. --- Squash-merging now.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/agent-hooks!1125
No description provided.