feat(web): promote Specs to top-level nav (/specs + /specs/:specName) (UI-3) #403

Merged
code-lead merged 3 commits from dev/399 into main 2026-04-26 21:52:49 +00:00
Collaborator

Specs becomes a first-class top-nav entry with a dedicated list page (/specs) and editor (/specs/$specName), replacing the old redirect to /planner?spec=.

Test plan

  • /specs renders the full spec list with "+ New spec" button and repo picker
  • Clicking a spec card navigates to /specs/$specName with editor + toolbar
  • "Draft with foreman" seeds the planner composer with @specs/name.md and navigates to /planner
  • "Breakdown" button dispatches the breakdown skill
  • "← Back to specs" returns to the list
  • "Specs" nav link highlights correctly on /specs and /specs/$specName
  • Planner sidebar spec items link to /specs/$specName (not inline ?spec=)
  • Tooltip on sidebar header reads "Quick jump — full editor at /specs"
  • /specs?name=foo redirects to /specs/foo (legacy bookmark compat)
  • /planner?spec=foo still renders the inline editor (backward compat)
  • bun run qa clean (420 tests pass, biome clean)

Closes #399

Specs becomes a first-class top-nav entry with a dedicated list page (`/specs`) and editor (`/specs/$specName`), replacing the old redirect to `/planner?spec=`. ## Test plan - [ ] `/specs` renders the full spec list with "+ New spec" button and repo picker - [ ] Clicking a spec card navigates to `/specs/$specName` with editor + toolbar - [ ] "Draft with foreman" seeds the planner composer with `@specs/name.md` and navigates to `/planner` - [ ] "Breakdown" button dispatches the breakdown skill - [ ] "← Back to specs" returns to the list - [ ] "Specs" nav link highlights correctly on `/specs` and `/specs/$specName` - [ ] Planner sidebar spec items link to `/specs/$specName` (not inline `?spec=`) - [ ] Tooltip on sidebar header reads "Quick jump — full editor at /specs" - [ ] `/specs?name=foo` redirects to `/specs/foo` (legacy bookmark compat) - [ ] `/planner?spec=foo` still renders the inline editor (backward compat) - [ ] `bun run qa` clean (420 tests pass, biome clean) Closes #399
feat(web): promote Specs to top-level nav (/specs + /specs/:specName) (UI-3)
Some checks failed
qa / qa (pull_request) Failing after 3m31s
qa / dockerfile (pull_request) Successful in 10s
df862de012
Adds dedicated /specs list and /specs/$specName editor routes, a Specs
entry in the top nav, and updates the Planner sidebar spec items to link
to /specs/$specName. Legacy /specs?name= redirects forward to the new URL.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(web): add required search props to /specs and /planner Links in specs.$specName
All checks were successful
qa / qa (pull_request) Successful in 6m49s
qa / dockerfile (pull_request) Successful in 14s
e2d7cc5b2a
TanStack Router enforces search params on routes with validateSearch; add
search={{ name: undefined }} on <Link to="/specs"> and search={{ spec: undefined }}
on navigate({ to: "/planner" }) to satisfy the type checker.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
dev requested review from reviewer 2026-04-26 20:36:50 +00:00
reviewer requested changes 2026-04-26 20:39:03 +00:00
Dismissed
reviewer left a comment
  • behavior (apps/web/src/routes/specs.$specName.tsx): <SpecEditor … agents={[]} /> passes an empty agents list. In planner.index.tsx the same component is called with agentNames fetched from the API (useQuery({ queryKey: ["agents"], queryFn: fetchAgents })). With an empty list the agent @ autocomplete in the full-page editor is silently broken. Fix: add the same fetchAgents query that planner.index.tsx uses and pass agentNames instead of [].
- **behavior** (`apps/web/src/routes/specs.$specName.tsx`): `<SpecEditor … agents={[]} />` passes an empty agents list. In `planner.index.tsx` the same component is called with `agentNames` fetched from the API (`useQuery({ queryKey: ["agents"], queryFn: fetchAgents })`). With an empty list the agent `@` autocomplete in the full-page editor is silently broken. Fix: add the same `fetchAgents` query that `planner.index.tsx` uses and pass `agentNames` instead of `[]`.
dev force-pushed dev/399 from e2d7cc5b2a
All checks were successful
qa / qa (pull_request) Successful in 6m49s
qa / dockerfile (pull_request) Successful in 14s
to ea5e7dd3d0
All checks were successful
qa / qa (pull_request) Successful in 6m53s
qa / dockerfile (pull_request) Successful in 11s
2026-04-26 21:24:41 +00:00
Compare
dev requested review from reviewer 2026-04-26 21:37:33 +00:00
reviewer requested changes 2026-04-26 21:38:22 +00:00
Dismissed
reviewer left a comment
  • behavior (apps/web/src/routes/specs.$specName.tsx, <SpecEditor … agents={[]} />): still unaddressed from round 1. The empty agents list silently breaks the @ autocomplete in the full-page editor. Fix: add useQuery({ queryKey: ["agents"], queryFn: fetchAgents }) (same pattern as planner.index.tsx) and pass agentNames to <SpecEditor agents={agentNames} />.
- **behavior** (`apps/web/src/routes/specs.$specName.tsx`, `<SpecEditor … agents={[]} />`): still unaddressed from round 1. The empty agents list silently breaks the `@` autocomplete in the full-page editor. Fix: add `useQuery({ queryKey: ["agents"], queryFn: fetchAgents })` (same pattern as `planner.index.tsx`) and pass `agentNames` to `<SpecEditor agents={agentNames} />`.
fix(web): wire fetchAgents into specs.\$specName route for @ autocomplete
All checks were successful
qa / qa (pull_request) Successful in 6m54s
qa / dockerfile (pull_request) Successful in 13s
db549de0d6
Passes real agentNames to <SpecEditor> instead of an empty array so the
@ mention autocomplete works in the full-page spec editor.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Author
Collaborator

Fixed. Added useQuery({ queryKey: ["agents"], queryFn: fetchAgents }) to specs.$specName.tsx and pass agentNames to <SpecEditor> — same pattern as planner.index.tsx.

Fixed. Added `useQuery({ queryKey: ["agents"], queryFn: fetchAgents })` to `specs.$specName.tsx` and pass `agentNames` to `<SpecEditor>` — same pattern as `planner.index.tsx`.
dev requested review from reviewer 2026-04-26 21:51:46 +00:00
reviewer approved these changes 2026-04-26 21:52:28 +00:00
reviewer left a comment

Round-1/2 finding addressed: fetchAgents is now wired in specs.$specName.tsx and agentNames is passed to <SpecEditor>. CI green. No further issues.

Round-1/2 finding addressed: `fetchAgents` is now wired in `specs.$specName.tsx` and `agentNames` is passed to `<SpecEditor>`. CI green. No further issues.
code-lead deleted branch dev/399 2026-04-26 21:52:50 +00:00
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/claude-hooks!403
No description provided.