Skip to content

[DO NOT MERGE] UI prototype: org-level project view (playground only) - #8433

Draft
TheodoreSpeaks wants to merge 63 commits into
stagingfrom
feat/org-project-view
Draft

TheodoreSpeaks wants to merge 63 commits into
stagingfrom
feat/org-project-view

Conversation

@TheodoreSpeaks

Copy link
Copy Markdown
Collaborator

Not a real PR. This is a clickable UI prototype for design discussion. It is not meant to merge. It runs entirely on mock data behind the existing playground gate (NEXT_PUBLIC_ENABLE_PLAYGROUND=true), and nothing here calls a real API.

Stacked on #8305 (dashboards) because the prototype reuses the real dashboard renderer.

What to look at

Run NEXT_PUBLIC_ENABLE_PLAYGROUND=true bunx next dev in apps/sim and open /playground/org.

  • Org view: the sidebar is New chat, Search, Connectors, then Projects (each expands to its chats) and Recent chats. New chat is a Codex-style home with a project picker.
  • Project main view (/p/support): Dashboard, Changelog, and Issues as chips, plus Open full view.
  • Full view (/p/support/build/workflows): Supabase-style. The sidebar becomes the project's sections with a back button at the top left, and Settings swaps it again to the prod settings list.
  • Changelog: next release (ready changes, agents running now, one Release button), then past releases with before/after charts.
  • Sim issues (/p/infra/issue/INF-412, /p/support/issue/SUP-153): a brief with root cause, how often it's been seen in production, the proposed fix, and a collapsed investigation. Each issue links to one or more Linear/Jira tickets and to the chats that worked on it.
  • Chat opens in a side panel next to the project.

Code outside the prototype folder

Almost everything lives in apps/sim/app/playground/org/. Two small, default-off hooks in real code let the dashboard renderer run on mock rows:

  • hooks/queries/table-analytics.ts: an optional TableAnalyticsSourceContext that replaces the analytics endpoint. It's unused unless provided.
  • components/dashboards/dashboard-preview.tsx: an optional title slot, used for the dashboard switcher.

If any of this graduates, it would be rebuilt properly, not merged from here.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6

TheodoreSpeaks and others added 25 commits September 25, 2026 11:57
Dashboards are now ordinary workspace files, handled like Sim pages, instead
of a separate resource. Creating or uploading `<Name>.dashboard` drops the
suffix and stamps `text/x-sim-dashboard`; the type is sticky across content
writes. The file viewer renders it live behind the `dashboards` flag, and the
public share viewer shows a workspace-only notice.

- Remove the dashboard resource: sidebar page, API routes, hooks, contracts,
  application layer, Mothership dashboards/dashboard_folders tools, resource
  tags, and the per-turn dashboardsEnabled payload.
- Revert the file discovery column (0385) and drop the dashboard folder
  resource enum (0384); dashboards never shipped, so no backfill.
- Chat panel decides previewability and tab/picker icons from the file type,
  not the name, so extensionless dashboards render and get the chart icon.
- Renderer: authored left label columns are kept intact, horizontal bar
  frames grow with row count, and hovered rows get a label-and-bar highlight.
- Simplify the create-dashboard skill around one validated example.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
Resolves conflicts in the feature-flag and skill use-case tests (moved onto
staging's central mocks) and the tab strip widths. Adapts the branch's
dashboard and analytics tests to staging's test-pattern audit, scopes the
table operation delegation invariant to operations that admit delegated
principals, and hides the rollout-gated create-dashboard built-in from the
organization composer when the dashboards flag is off.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
- Size horizontal bar `.chart` previews by category count like dashboard panels.
- Keep the ECharts label column for percentage bar widths, resolve percentage
  grid insets for the row highlight, and keep the time axis on the queried range.
- Show small readout values with significant digits instead of rounding to 0.
- Pass the dashboard's timezone-adjusted today to the range calendar.
- Decide the Chat panel's Markdown mode from the file record.
- Replace mock-call assertions in the EChartsView tests with DOM behavior.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
… resizes

Unstacked bar series sit side by side in a category row, so grouped charts keep
the ECharts label column and their rows fit every bar slot. The row highlight
redraws the active row after each render, so a resize moves it with the plot.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
…verride

Chart tooltip defaults now apply to every entry of an authored `tooltip`
array instead of replacing it with one object. Restore the v2 chat payload
to staging: the hard-coded `mode: 'agent'` came from the removed dashboard
resource work and would overwrite a resumed chat's saved mode.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
Grouped horizontal bar rows now size their gap from the series `barGap` the way
ECharts does (pixels, a percentage of bar width, default 20%, overlap for
negative gaps) instead of a fixed 4px.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
…resh through the UI

Pie tooltips encoded by dimension index now use the custom formatter, resolving
the measure through the encode indexes ECharts passes it. The dashboard preview
test drops the mocked controls and callback-driven cases and clicks the real
Refresh button to check which analytics queries are invalidated; the range and
timezone math stays covered by the time tests.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
Multi-axis bar charts now read the tooltip unit from the axis each series is
plotted on, so a secondary axis no longer inherits the first axis's format.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
Removes assertions on mocked collaborators and rendered text from the
dashboard, chart and analytics tests per the repository testing rules, keeping
the observable checks (status codes, thrown errors, DOM roles, computed
summaries, emitted zoom ranges). Deletes the animated-number test, which had
no behavior left to assert.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
…pragmas

The shared Vitest config already resets mocks and stubbed globals before each
test and defaults to the node environment.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
…Pages

Drop the create-dashboard built-in skill and its rollout gating in the skill
lists. Mothership now learns the dashboard format from a sim-dashboards
reference in its own research-and-deliverables skill, the pattern Sim Pages
use; Sim workspace built-ins stay Agent-block documents. The dashboards flag
still gates the viewer and table analytics.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
The v2 file create, replace and edit responses now carry `diagnostics` for a
dashboard file: its parse errors, or an empty list. Writes are never blocked,
like the page lint; table columns and queries are still checked when panels
render. Parse errors are reported as `path: message` lines, and a block with
no recognized kind names the allowed kinds and unknown keys instead of Zod's
union dump.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
…create revision

- One diagnostics entry per parse error instead of a newline-joined string.
- A panel choosing aggregate or columns drops the other mode's inherited
  dashboard fields, so shared defaults serve table and aggregate panels.
- The v2 create response returns the revision it produced, like the replace and
  edit responses.
- The analytics route test uses the shared createMockRequest helper.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
…ap diagnostics size

A panel switching away from the dashboard's query mode no longer inherits its
sort or limit, which name aggregate aliases or top-N groups in one mode and
rows in the other. Write diagnostics check the 128 KB source limit before
decoding the payload.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S6aTRnkiu7PxYZPNPXYEMV
Mock-data prototype at /playground/org (gated by NEXT_PUBLIC_ENABLE_PLAYGROUND):
projects with their chats in the sidebar, a Codex-style new-chat home with a
project picker, per-project changelog (next release, running agents, shipped
releases with charts), Sim issues with investigation briefs linked to
Linear/Jira tickets, a floating chat bar, and prod settings sections.

Adds an optional TableAnalyticsSourceContext so the dashboard renderer can run
on mock rows, and a title slot on DashboardPreview for a dashboard switcher.
Both default to existing behavior.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
…side chat

The project main view shows Dashboard, Changelog, and Issues; "Open full view"
switches the sidebar to the project's sections, and Settings swaps it again to
the settings list. Chats open in a left side panel.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
@vercel

vercel Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
docs Skipped Skipped Oct 1, 2026 10:18pm UTC

Request Review

TheodoreSpeaks and others added 15 commits September 30, 2026 14:43
…a tab

Dashboard and issue headers carry the chip; a row in a project resource
list opens the same way. The chat lands with the resource as the active
tab and attached to the first message (?open=kind:workspace:id).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
… icon beside the name

The org sidebar folds to its rail while the chat is docked so the page keeps
its width; what you were looking at is attached. Dashboard and issue use the
icon, a row in a resource list docks with that row attached. The dock expands
to the chat page with the thing as a tab.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
…ge as its first tab

A round button at the bottom left of every project page creates a chat in
Recent chats and opens it with what you were looking at as the active tab:
the dashboard, an issue, a kind's list, or the project browser. The docked
pseudo chat is gone; the first message names the chat.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
…ject header

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
The sidebar is New chat, Search, Connectors, and Recent chats. Every page is a
chat beside the workspace pane: a pinned project tab (pick the project in its
heading) with Dashboard, Changelog, Issues, and Resources inside it, then the
resource tabs. Project pages, their routes, and the chat trigger are gone;
links to a project thing are ?open= refs the chat surface turns into tabs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
…ck opens it in the pane

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
…e workspace tab

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
…e pane divider resizes

Uses the real useMothershipResize for the divider, so drag, keyboard, and
the collapse toggle behave as the home panel's do.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
… is a centered column

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
…ect it

With no project selected the workspace tab shows the org's projects.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
…deselects

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
…esources

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
TheodoreSpeaks and others added 13 commits October 1, 2026 14:16
…nd create actions

Resources shows the kinds inside the workspace tab; a kind shows the real
list with its New/Upload/Connect action under a Resources / Kind breadcrumb
back to the directory; a row opens as its own resource tab.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv
…the strip

Like a browser profile: tile, name, chevron; the menu lists the org and
its projects, and picking one shows it in the workspace tab. The
workspace header drops its own picker and keeps a Settings chip.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv
The project switcher is a plain tab-like chip with a separate chevron, not a
black pill. The workspace tab drops its title block: just the section row
with a settings gear at the end. The Resources directory is a real resource
list (header, search across the project, Name/Items rows) like every kind page.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv
…on the directory

The switcher is an outlined chip (tile, name, chevron) that opens the
workspace tab; the project picker lives on the tab's title. The Resources
directory keeps search and the kind list without a second Resources bar.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv
…, not a resource

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv
An icon-only tile at the head of the strip, sized to the band; clicking it
opens the project menu, and picking one shows it in the workspace tab. The
title inside the tab is plain text again.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv
…ge when selected

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv
Per the project-profile prototype: an outlined pill after a divider at the
end of the strip. Its left half (tile + name) shows the workspace tab and
holds the pressed fill while it is showing; the chevron half opens a
Switch project menu with the org and each project.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv
…like the file view

Copy Link, Download, Share, Delete move out of the tab strip into a
Resource.Header under the tabs, with Kind / Name breadcrumbs and a name menu.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv
…ssed project control

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LcvZQzHFcm7Egc7rPEEHv

This branch was previously deployed

1 inactive deployment
Preview — 00383a16 Deployed Oct 1, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant