Teams-first UX: the whole shell, rebuilt (PageHeader, Files v3, Integrations, sidebar, search) - #1280
Merged
Merged
Conversation
New app/src/components/agent-settings/: a master-detail settings page per agent (Context: job description, learnings; Permissions: people with an Everyone-on-your-team/Only-specific-people choice, allowed apps, allowed AI models, skills). Settings > Permissions drills into it; the Context/Admin agent tabs consume the same shared rail, nav model, and section switch (agent-admin-nav/-sidebar/-screen deleted). Self-lockout and roster-materialization writes are confirm-gated; share analytics fire on an actual access-widening diff. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The sidebar becomes Your teams: named groups render as team blocks (section rows: Mission Control, Team Settings; agents beneath), and the ungrouped section becomes the virtual default team named after the workspace — no stored-layout migration. Clicking an agent opens its team's Mission Control with the agent filter pre-set. New team view (viewMode "team"): team-scoped mission board + archive sharing the ONE cross-agent sweep (scopePaths over the full roster), and Team Settings drilling into the agent settings page. Board keyboard/⌘N registration is active-view-gated so kept-alive boards can't steal handlers. ui/layout gains section rows + defaultGroup (props-only, inventory v55). KB: knowledge-base/teams-ui.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every team gains Routines and Files: Routines is one aggregated list across the team's agents (owner chips, drafts included, owner-routed writes, cache-shared fan-out over the existing per-agent query keys — no new sweep), Files is the honest per-agent tree behind the same agent dropdown idiom. Partial failures render a named, retryable agent-reads strip with a Report-bug affordance, shared by the per-agent Files tab (AgentFilesSurface: two surfaces, one wiring). ui/routines gains ownerChip props (inventory v56). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deletes the 7-tab agent shell (Activity/Context/Skills/Integrations/ Routines/Files/Admin) and migrates every door: sidebar, mentions, notifications, palette, shortcuts, tour, create/import reveal, and turn-summary deep links land on team Mission Control / Routines / Files or the Team Settings drill-in. Agent managers keep configure access via per-team section gating; plain members deliberately see usage surfaces only. Rescued en route: notifications bell, share-via- team door, routines timezone, warming rows, just-created-mission handoff. components/tabs/ renamed to components/agent/; dead agent- mode machinery, locked-catalog chain, write-only conversations cache, ten orphaned hooks and ~25 dead symbols removed. Tour rewritten (15 typed steps). Visual baselines re-recorded (darwin+linux). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One seam, two backends: useTeams() reads server teams when the gateway advertises agentTeams (nine C13 client methods across engine-client, the web adapter, and app hooks), else the local sidebar-layout groups, byte-identical. Sidebar splits joined teams from an Other-teams join block (Linear semantics: joining pins, it does not gate — unjoined public teams are viewable); Team Settings gains the team name field and a Members card (owner flags, danger- toned remove, default team read-only). Server owns membership and team order (optimistic sortOrder reorder); the local layout survives as a per-user ordering overlay that never destroys stored groups and rolls back exactly on refused moves. Expected C13 refusals surface as informational toasts in en/es/pt. Fake host grows the C13 routes gate-order-faithful; inventory v57. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full staleness audit against current code, then: 4 historical docs deleted (windows-vm.md keeps the salvage), teams/agent-manifest/ integrations/production-infra split into 13 single-topic docs, ~150 cited false claims fixed (certificate noun un-inverted, mobile/ is alive, approval interaction retired, GCIP not Supabase, Linear-510 type ramp, tour/store/portable truths), Felipe→Julian sweep, index + dispatch regenerated to route all 37 docs. New KB rules: bullets of what's built, Julian-approved changes only, delete stale lines first. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The client body of the teams UX: teams-model/useTeams seams, five-arm header click, home-lozenge grammar, single-row highlight, board scoping with roster-first card names, team context/routines/settings surfaces, inbox view, and the shell wiring that replaced the per-agent tab world. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two new semantic tokens (light: 6% ink track + white active pill; dark: 6% white + elevated gray) wired source JSON -> dist -> @theme. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rSearch One 48px header grammar for every page: lozenge track + white active pill, generic tabs/switcher, width-mode tools portal with stacked fallback, the shared grow-on-focus search wrapper; the old title block renamed PageHero. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(Integrations | Custom integrations) lozenges with the rail's own mark, search + category riding the header on both tabs, borderless flat Installed, quiet 14/13px section titles, container-aware capped grid centered at its natural width. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
No navigation inside Files: agent accordion rows (lazy read on first expand, single-agent auto-expand), folders unfold in place, list-only, tools in the team header with per-agent New targeting, cross-agent drags walled off. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One row primitive, three band instances, Ionicons Sharp glyph set, 1px rhythm through blocks, inset pill fills, 13px/510 type, empty blocks show only their add row. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Integrations field is the truth: busy spinner and adaptive placeholder folded in, searchbox role as the cross-surface selector contract; board, Store, Files, AI hub all converge; Store pills rescale to match. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Playwright spec files rewritten to the new grammar (not yet reconciled-by-run), fake-host agent-teams routes, showcase specimens, parity manifests, and the review fix-wave residue. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Board is team-scoped only, inbox replaces the bell, sidebar anatomy and files story updated; four persisted ui-store keys, not five. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…42631-oagel/houston # Conflicts: # CLAUDE.md # app/src/components/agent/routine-model-selector.tsx # app/src/components/agent/routine-runs-dialog.tsx # app/src/components/agent/routine-screen-header.tsx # app/src/components/agent/routine-screen-sections.tsx # app/src/components/agent/routine-screen.tsx # app/src/components/agent/routines-tab-model.ts # app/src/components/agent/routines-tab-pane.tsx # app/src/components/board/agent-board-items.ts # app/src/components/board/use-agent-board-data.ts # app/src/components/tabs/archived-tab.tsx # app/src/components/tabs/routines-tab.tsx # app/src/components/turn-file-summary.tsx # design/inventory/CHANGELOG.md # knowledge-base/agent-manifest.md # knowledge-base/auth.md # knowledge-base/integrations.md # knowledge-base/production-infra.md # packages/design-tokens/tokens/semantic/color.dark.json # packages/design-tokens/tokens/semantic/color.light.json # packages/web/e2e/chat-markdown-preview.spec.ts # packages/web/e2e/visual/__screenshots__/chat-markdown.visual.spec.ts/chat-markdown-dark-darwin.png # packages/web/e2e/visual/__screenshots__/chat-markdown.visual.spec.ts/chat-markdown-dark-linux.png # packages/web/e2e/visual/__screenshots__/chat-markdown.visual.spec.ts/chat-markdown-light-darwin.png # packages/web/e2e/visual/__screenshots__/chat-markdown.visual.spec.ts/chat-markdown-light-linux.png # ui/core/src/globals.css
- sidebar-layout writes now compose in the same tick: the optimistic cache write moved out of the async onMutate, whose microtask delay let back-to-back ops (create team -> stamp identity) both read the pre-write cache and silently persist an empty layout, destroying the new team - the agent row menu fences React portal-event bubbling so a click on a portaled item can no longer drill into the agent underneath, unmounting the menu and the move-confirm dialog it just opened - creating a team lands you in it (the Linear grammar), both backends - the Files New menu no longer restores focus to its trigger on close: the restoration blurred the freshly-mounted inline folder input, whose blur-cancel killed the creation before it was ever visible - Files list rows regained their row/columnheader semantics (a11y) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Desktop viewport (1440x900) makes the full lozenge grammar the tested surface with dedicated narrow-viewport switcher coverage; helpers became self-sufficient (return to a team from any top-level view, or-chains first()-guarded against legitimate multi-surface states); specs rewritten to the shipped grammar (accordion rail, empty-board agent picker, split panel titles, membership-scoped visibility worlds); identity forced OFF for the functional server so ambient Firebase config can never flip the suite into a login wall. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…+ linux Force re-record (--update-snapshots=all) after the teams-first overhaul: PageHeader family + Safari lozenge track, Files v3 accordions, Integrations header adoption, search unification. Absorbs the deferred row-primitive drift; bless-log updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
On a slow CI box the width observer can flip the strip from tabs to the compact switcher between the helper's isVisible check and its click; the tab unmounts and the click spins to timeout. The section just moved — fall through to the switcher path instead of dying. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Teams-first UX: the whole shell, rebuilt
This branch replaces the per-agent tab world with a teams-first shell and componentizes the page chrome that came out of it. Built and design-reviewed live with Julian over multi-day iteration; adversarially reviewed (one Codex + one Claude reviewer), fix-looped, and fully verified before this PR.
What's in here (commit narrative, top-down)
useTeams()seam over two backends, five-arm team-header click grammar, team-as-home lozenge, single-row highlight rule, team-scoped board with roster-first card names, team context/routines/settings surfaces, the Inbox view.tab-track/tab-activesemantic pair for the Safari header (light: 6% ink track + white pill; dark: 6% white + elevated gray).PageHeaderfamily: one 48px header grammar (Safari lozenge track, generic tabs + compact switcher, width-mode tools portal with stacked fallback, shared grow-on-focusHeaderSearch); the old title block renamedPageHero.(Integrations | Custom integrations)lozenges with the rail's own mark, search + category in the header on both tabs, borderless flat Installed, quiet 14/13px section titles, container-aware two-cell catalog plane centered at its natural width.CatalogSearchFieldeverywhere (busy spinner + adaptive placeholder folded in; board, Store, Files, AI hub converge;role="searchbox"as the cross-surface selector contract).Review + verification
notifications-bell,mission-scope-picker, dormant unread pipeline, orphaned locale keys); two file-size violations split; search-unification holdouts converged.KB note
knowledge-base/carries the truth-fix batch for the new world (board is team-scoped only, sidebar anatomy, files story, four persisted ui-store keys). Flagging per the KB-approval rule: these lines describe what this PR builds.No Linear issue — Julian-directed live design iteration in-session (related, not resolved by this PR: PRODUCT-1021).
Sibling PR: gethouston/cloud#233 (C13 wave 2 — the gateway side of team identity/context this client consumes).
🤖 Generated with Claude Code