feat: unify Specs and Planner into one page #557
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Depends on
#558 feat: responsive + a11y sweep across the remaining web routes
charles/claude-hooks
Reference
charles/claude-hooks#557
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
As an operator, I want a single workspace that handles both spec authoring and planner sessions so that I stop context-switching between two routes that already share most of their data.
Today the foreman surface is split:
/specsis document-first — list of.mdfiles, full-page markdown editor, breakdown preview, "Create issues" button. UsesForemanFileEntry[]+ React Query./planneris session-first — three-column layout with sessions sidebar, transcript, composer. UsesusePlannerStore(Zustand) + SSE streaming. Has an inline?spec=<name>mode that already opens a spec in the middle column.These are two views of the same workflow (spec → breakdown → issues, optionally guided by a chat session). The unification follows the agents-page model: single route, accordion-style sections for each surface, drawers for transient detail, autosave instead of explicit Save buttons.
Acceptance criteria
Information architecture
/workspace). Final name decided during implementation.?session=<id>and/or?spec=<name>. Bookmarkable. Deep-linkable from issue comments.Sessions
sm:(mobile pattern matches the agents page).?session=<id>replaces any prior?spec.Specs
?spec=<name>replaces any prior?session.Cross-mode
<Drawer>primitive from PR #555 —role="dialog"+ focus trap + focus return baked in.Components — reuse first
<Button>for every clickable. No raw<button>for new code paths.<Drawer>for any slide-out overlay.<ChipInput>if any tag/label input is needed.apps/web/src/components/with the same a11y baseline as<Drawer>.Responsive + a11y (parity with the agents page)
<label>(oraria-label) and link errors viaaria-describedby+aria-invalid.role="status" aria-live="polite"region.prefers-reduced-motion(already handled globally inindex.css).Migration
/specsand/plannerredirect to the new route preserving query params (?spec=/?session=).docs/foreman.mdupdated to describe the unified surface;docs/breakdown.mdfollow-up if needed.Out of scope
/foreman/specs/*,/foreman/chat,/foreman/sessions/*stay as-is.?spec=mode that already exists in the planner — it gets superseded by the new IA but the URL contract stays.References
feat/agents-history-drawer), commitda25428for the<Drawer>primitive.apps/web/src/routes/specs.index.tsx(230 LOC),apps/web/src/routes/specs.$specName.tsx(~5.8K LOC),apps/web/src/routes/planner.index.tsx(636 LOC), feature folderscomponents/spec-editor/(5 files, ~2.2K LOC) andcomponents/planner/(5 files, ~2.2K LOC).POST /foreman/chat,GET /foreman/sessions/:id,GET /foreman/stream/:task_id,POST /foreman/specs/:name,POST /foreman/breakdown-preview,POST /foreman/create-issues.Dispatch coordination
Blocked by #558's foundation commit. Wait until #558's first commit (Tabs primitive at
apps/web/src/components/tabs.tsx+apps/web/CLAUDE.mdconventions update) lands onmain. Then rebase off main and proceed.Routing: boss (new IA — merging document-first + session-first mental models, drawer-pattern carry-over, autosave wiring).
Why the wait: the unification needs a tabs/section-switcher UI and the
<Tabs>primitive is being designed in #558. If both tickets land tabs independently, two implementations diverge and one has to be rewritten. Pulling from #558 keeps the design system coherent.Soft-parallel with #556 (stats removal — different feature folders entirely).
Conflict points to watch:
apps/web/src/components/app-shell.tsx— collapse theSpecs+Plannernav entries into oneWorkspaceentry. #556 will also drop/statsfrom the same file; rebase to pick up that change.apps/web/CLAUDE.md— #558 lands its conventions section first; append your specs/planner notes after rebase.apps/web/src/components/tabs.tsx— IMPORTED, not authored. If you reach for it before #558 commits, fall back to base-ui-components/tabs or hand-roll inline (with a TODO to swap in once #558 lands).Implementation note: the existing
?spec=<name>URL parameter inplanner.index.tsxis the precedent for cross-mode deep-links. Preserve that contract, then add?session=<id>per the AC.🤖 Auto-assigned to boss (heuristic: area:dashboard + body 5840 bytes (> 2 KB) — boss (heavy)). Reply
/unassignto reroute.