Skip to content

feat(desktop): separate tasks and pull requests - #1

Closed
Roshvan wants to merge 25 commits into
mainfrom
tasks_and_prs
Closed

Roshvan wants to merge 25 commits into
mainfrom
tasks_and_prs

Conversation

@Roshvan

@Roshvan Roshvan commented Jul 26, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • split the combined work-items screen into persistent Tasks and Pull requests tabs
  • give each surface a focused toolbar, filters, and search while keeping GitHub issues as a contextual Tasks source
  • preserve the last Tasks source when switching through Pull requests and keep navigation available when Linear is disconnected
  • move open/all state controls into the relevant toolbar and keep the layout usable at compact widths

Validation

  • bun run lint
  • bun run --cwd apps/desktop typecheck
  • bun test TasksView.test.ts getSelectedTasks.test.ts — 10 passed
  • bun run --cwd apps/desktop compile:app
  • full desktop test suite — 2,251 passed; 3 unrelated environment-sensitive shell tests failed because /etc/profile resolves the machine's installed Claude wrapper and prepends /usr/local/sbin to the cached shell PATH
  • GitHub CI — all 9 checks passed, including the full Linux test suite, desktop build, typecheck, lint, and CLI builds
  • exact-instance Electron CDP verification on this worktree at http://localhost:3085, route #/tasks, CDP port 9307
    • used real pointer input for Tasks → GitHub issues → Pull requests → Tasks
    • confirmed returning to Tasks restores the GitHub issues source
    • captured and visually inspected both final surfaces at 1728 × 1029
    • checked responsive toolbar behavior at 1200 × 800 and 900 × 800

Screenshots

Tasks

Tasks tab

Pull requests

Pull requests tab

saddlepaddle and others added 25 commits July 23, 2026 18:55
…ParadevAI#5908)

* feat(desktop): restore Workspaces tab with host-scoped workspace list

Bring back the sidebar Workspaces entry (removes the SHOW_WORKSPACES_TAB
flag) and rework /v2-workspaces to read from a single explicitly-targeted
host instead of the all-hosts fan-out:

- New useSelectedHostWorkspaces: one workspace.list against the selected
  host, live-patched by its workspace:changed events, IndexedDB snapshot
  for offline, no Electric v2Workspaces fallback.
- Device filter defaults to "This device"; the all-devices merged view is
  removed. Host picker is populated instantly from the v2Hosts and
  v2UsersHosts collections (no per-host counts - counting is a fan-out).
- Host-served rows no longer require v2Hosts/v2UsersHosts rows to render;
  the cloud-host-table gate applies only to cloud-fallback rows.
- PR enrichment runs only for the host-scoped page, not for unscoped
  callers (command palette, dev sidebar seeding).
- Empty state is gated on the selected host's settlement so an unanswered
  host reads as loading, not empty.

Claude-Session: https://claude.ai/code/session_01ULuSGAMv3cqtqBMjaYzDqd

* refactor(desktop): fold single-host reads into useHostWorkspacesSource

Delete useSelectedHostWorkspaces - it duplicated the source hook's target
derivation, snapshots, query config, and event patching. The source hook
now takes an optional scopedHostId (undefined = fan-out, machine id =
single host with no cloud fallback, null = scoped but unresolved, runs
nothing). Also drop the now-dead device-filter stage (scoped rows are
already single-host) and the duplicated empty-state wrapper.

Claude-Session: https://claude.ai/code/session_01ULuSGAMv3cqtqBMjaYzDqd

* refactor(desktop): drop dead outputs and clarify the row-source split

pinned/others/V2WorkspaceProjectGroup had no consumers - delete them.
Collapse the scoped-vs-fanout selection into one destructure with a
comment explaining why both hooks always run, and document that a null
scopedHostId runs nothing.

Claude-Session: https://claude.ai/code/session_01ULuSGAMv3cqtqBMjaYzDqd
…n local-first migration (ParadevAI#5909)

* fix(host-service): restore workspace_created/deleted telemetry lost in local-first migration

PR ParadevAI#5731 retired workspace cloud sync, which was the only path that fired
the cloud-side workspace_created/workspace_deleted captures for v2
workspaces. Typed creation events fell from ~5.0k/day to ~2.0k/day
tracking 1.16 adoption, with no replacement emission.

Emit both events from the local workspace store's insert/delete choke
points via the authenticated analytics.captureEvent relay (the CLI
pattern) — property parity with the retired cloud capture plus
host_service_version and source=host_service.

Claude-Session: https://claude.ai/code/session_01JGkCApsJ22Ujd2hadHEftJ

* fix(host-service): guard workspace telemetry against partial api clients

Hand-rolled test stubs shape ctx.api with only the routes they mock, so
the analytics property access threw synchronously and failed the
workspace operation. Telemetry is best-effort; swallow the throw.

Claude-Session: https://claude.ai/code/session_01JGkCApsJ22Ujd2hadHEftJ
…MCP discovery, agent auth metadata (ParadevAI#5910)

* feat(marketing,api,docs): agent-readiness surfaces — markdown twins, MCP discovery, agent auth metadata, OpenAPI spec

Addresses orank agent-readiness gaps for superset.sh:

Marketing (superset.sh):
- llms.txt: when-to-use guidance + developer-resource index; shared builder in lib/llms.ts
- Markdown surfaces: /index.md, /llms.md, /agents.md, /auth.md (WorkOS auth.md convention), .md twins for blog/compare pages, Accept: text/markdown negotiation + ?mode=agent via new proxy.ts
- robots.txt: explicit AI-crawler tiers (allow AI search/user agents, block CCBot/Bytespider) + Content-Signal
- .well-known: A2A agent-card.json, MCP discovery + server card, RFC 9727 api-catalog
- JSON-LD: Organization contactPoint/address/sameAs, WebPage speakable, Service schema
- Contact page: direct channels prose; Link headers (RFC 8288) on homepage

API (api.superset.sh):
- /openapi.json: OpenAPI 3.1 spec for the protocol-stable surface (MCP transport, OAuth, discovery)
- AS metadata: agent_auth block (skill/register_uri/revocation_uri); PRM resource_documentation
- /.well-known/mcp + server-card.json with live tool introspection via in-memory MCP client
- JSON errors: 401 + WWW-Authenticate at /api root, JSON 404 catch-all for unmatched /api/* paths

Docs (docs.superset.sh):
- /llms.txt page index (llms-full.txt and per-page /llms.mdx already existed)

Claude-Session: https://claude.ai/code/session_01GbjRvApZBmhsSkfHzihp6x

* docs(plans): record shipped agent-readiness work with growth/debt ranking

Claude-Session: https://claude.ai/code/session_01GbjRvApZBmhsSkfHzihp6x

* revert(api): drop hand-authored /openapi.json — MCP server card is the real catalog

An OpenAPI spec for a JSON-RPC-over-one-endpoint API reduces to a single
generic operation no function-calling framework can use. Point service-desc
links, error hints, llms.txt, and agents.md at the live MCP server card
instead. Rationale recorded in plans/done/20260722-agent-readiness.md.

Claude-Session: https://claude.ai/code/session_01GbjRvApZBmhsSkfHzihp6x
…ntity types, reinstated OpenAPI spec (ParadevAI#5912)

* Revert "revert(api): drop hand-authored /openapi.json — MCP server card is the real catalog"

This reverts commit d9a66fa.

* feat(docs,api,marketing): round 2 agent-readiness — docs MCP server, /mcp alias, agent_auth identity types

- docs.superset.sh/mcp now speaks MCP (docs_search + docs_read over the
  fumadocs source); the docs page moves to /mcp-server with a 308 for
  browser GETs. Fixes the 'docs MCP unhealthy' multi-surface finding
  with a real learn-surface server.
- api.superset.sh/mcp aliases the v2 MCP endpoint; superset.sh/mcp
  redirects to it (307 preserves POST for MCP clients).
- agent_auth gains identity_types_supported: [anonymous] + per-type
  block — accurately describes anonymous DCR claimed via browser consent.
- /api/llms.txt scoped index (+robots carve-out); .md twins and Accept
  negotiation extended to changelog; applicationSubCategory added.
- Reinstated /openapi.json (previous commit): the rescan hangs ~16 pts
  on it (scoped-permissions/schema/function-calling read the spec).

Claude-Session: https://claude.ai/code/session_01GbjRvApZBmhsSkfHzihp6x
…ew workspaces (ParadevAI#5913)

* fix(host-service): refresh non-default base branches before forking new workspaces

`resolveNewBranchStartPoint` only upgraded local→remote-tracking + fetched
when the base branch was the default. For any other base — sticky
localStorage default, explicit picker choice, or an AI-suggested branch —
the local ref was used as-is with no fetch, so a shared branch that
hadn't been touched in weeks silently forked new workspaces from a stale
tip. Concrete case: base `mirror-flier`, local ref 44 days behind
`origin/mirror-flier`, ~1700 commits behind current work.

Apply the upgrade + fetch to any base branch with a configured upstream.
Default-branch behavior is unchanged.

* fix(host-service): type the git mock so start-point tests pass typecheck

The `as never` cast on the mock broke tsc at every `git.fetch`
assertion; cast to GitClient plus the typed fetch mock instead.
Also apply Biome formatting.

Claude-Session: https://claude.ai/code/session_018E1H8zdS3VsBzJxSMoXtw3

---------

Co-authored-by: Satya Patel <satyapatel111@gmail.com>
… brand icon, add missing apple-touch-icons (ParadevAI#5916)

* fix(marketing,web,admin,api,docs): replace bordered favicon with brand icon, add missing apple-touch-icons

The favicon.ico shipped by all five apps was pre-rebrand art with a grey
border stroke baked into every frame; third-party favicon services
(icon.horse, Google s2) serve it verbatim, so external sites showed the
bordered icon. apple-touch-icon.png was declared by marketing and docs
but the file never existed (404), which is why scrapers fell back to the
bordered .ico in the first place.

All assets regenerated from the desktop app icon
(apps/desktop/src/resources/build/icons/icon.png): favicon.ico
(16/32/48/256) in all five apps, apple-touch-icon.png (180x180) for
marketing and docs, and favicon-192.png rebuilt to match.

Claude-Session: https://claude.ai/code/session_018ksmZMq7douyrpBTNjP4DP

* fix(marketing,web,admin,api,docs): use flat brand tile for favicons

The desktop-icon-derived favicons from the previous commit carry a baked
shadow/rim that smears at small sizes on non-matching backgrounds.
Rerendered everything flat from the brand SVG
(packages/ui/src/assets/icons/preset-icons/superset.svg) at exact target
sizes: rounded #151110 square, glyph, no shadow or border.

Claude-Session: https://claude.ai/code/session_018ksmZMq7douyrpBTNjP4DP
…vAI#5902)

- Desktop nav now requires lg (1024px) instead of md (768px); the header
  content needs ~1,100px so the 768-1024 band always smushed.
- Star counter only renders at xl (1280px+) so the 1024-1280 band fits
  without crushing the CTA.
- Download CTA never wraps or shrinks (whitespace-nowrap + shrink-0) and
  stays visible inline next to the hamburger from sm up.
- Hero headline capped at max-w-6xl so ultrawide viewports get two
  balanced lines instead of a full-width strip.
- Shortened the capability-mac subheadline (154 -> 118 chars).

Claude-Session: https://claude.ai/code/session_013HwZR8BoCF3QBis8b3x7pm
* feat(desktop): create blank projects from Superset

* refactor(desktop): pass onError through to createEmpty directly

The wrapper re-implemented the fallback toast that useCreateV1Project's
runCreate already provides.

Claude-Session: https://claude.ai/code/session_01539kWVLWyz9MUrFvEWybZx

---------

Co-authored-by: Satya Patel <satyapatel111@gmail.com>
…aradevAI#5917)

Real quality gaps surfaced by grading the docs MCP server, applied to
both servers:

- mcp-v2: server instructions in the initialize response; behavioral
  annotations on all 27 tools (readOnlyHint on lists/gets,
  destructiveHint on deletes, idempotentHint on updates/pause/resume) —
  agents can now refuse destructive calls without user confirmation.
- docs MCP: instructions + readOnlyHint on both tools.
- server card includes tool annotations.
- /.well-known/mcp.json alias on marketing + api for manifest probes.
- openapi.json: typed response schemas for the four discovery
  operations; documented URL versioning + deprecation practice (v1 MCP
  stays served during migration, changes announced in changelog).

Claude-Session: https://claude.ai/code/session_01GbjRvApZBmhsSkfHzihp6x
…ParadevAI#5918)

npm currently shows @superset_sh/sdk with no homepage or repository —
the fields agents (and directory scanners) use to verify the package is
the official Superset SDK. Takes effect on the next publish.

Claude-Session: https://claude.ai/code/session_01GbjRvApZBmhsSkfHzihp6x
…norepo copy (ParadevAI#5919)

* feat(marketing): source agent skills from superset-sh/skills, drop monorepo copy

The official skills now live in the public superset-sh/skills repo
(registered on skills.sh via npx skills add superset-sh/skills; the old
private skills repo moved to sales-skills). The /.well-known/agent-skills
routes fetch SKILL.md files from that repo with 1h ISR instead of reading
a checked-in copy, and now serve both skills (superset CLI + superset-mcp).
llms.txt links the repo.

Claude-Session: https://claude.ai/code/session_01GbjRvApZBmhsSkfHzihp6x

* fix(plugins): vendor the superset skill into the Claude Code plugin

The plugin symlinked ../../skills/superset, which the skills-repo
migration removed. superset-sh/skills is canonical; the plugin carries a
copy because plugin distribution needs the file on disk.

Claude-Session: https://claude.ai/code/session_01GbjRvApZBmhsSkfHzihp6x

* docs: point agents at the official skills repo from agent-integration

Claude-Session: https://claude.ai/code/session_01GbjRvApZBmhsSkfHzihp6x
…ParadevAI#5920)

Resolves all 48 open Dependabot alerts:
- next 16.2.6 -> 16.2.11 (SSRF in Server Actions/rewrites, cache
  confusion, middleware bypass, DoS) in web, marketing, docs, api, admin
- postcss 8.5.10 -> 8.5.12 (arbitrary file read via sourceMappingURL)
  in docs
- @hono/node-server 2.0.5 -> 2.0.10 (WebSocket handshake memory-leak
  DoS) in desktop, relay, host-service

next/@next/* are excluded from bunfig minimumReleaseAge until 2026-07-24
since the security release is 2 days old.

Claude-Session: https://claude.ai/code/session_01THb8nTeNPhJq6UWu1gUC4U
…e dropped forever (ParadevAI#5927)

PR ParadevAI#5774 reintroduced marker-gating of initialCommand (regressing ParadevAI#4963)
and removed the timeout fallback, so any shell whose OSC 133;A marker
never reaches the scanner (exec'd shells, ZDOTDIR overrides) left preset
and agent launches queued behind a promise that never resolves — an empty
terminal with no command run.

Keep ParadevAI#5774's first-prompt wait (real fix for direnv/devenv startup hooks
consuming PTY input) but bound it at 15s, matching the v1 stack: on
expiry the readiness promise resolves as timed_out and the queued command
writes anyway. Also restore the flush of partially-matched marker bytes
the scanner withholds, and clear the timer on every pending-state exit.

Claude-Session: https://claude.ai/code/session_01KEmzD2DhH34tRA6GUuRgri
ParadevAI#5256)

* feat(terminals): send/read/close follow-ups to running terminal agents

Adds a public API to message an already-running terminal agent (claude/codex)
instead of re-spawning a session per message via agents.create — which spiked
terminal-session counts and started a fresh CLI each time rather than
continuing the conversation.

Host (host-service):
- ModeTracker.isBracketedPasteActive() + snapshot() off the existing
  per-session headless xterm; scrollback 1 -> 1000 so snapshot serves
  line-mode history.
- writeFramedInputToSession (bracketed-paste framing + Enter) and
  snapshotSession. Both adopt daemon-owned sessions on an in-memory miss
  (same adoptOnly path pane auto-adoption uses), so background agents stay
  reachable across host-service restarts.
- terminal.send mutation + terminal.snapshot query.

Public surfaces — the terminals resource gains list/send/read/close alongside
create, following the explicit-host-targeting convention (ParadevAI#5885):
- MCP v2: terminals_list/_send/_read/_close with tool annotations
- SDK: client.terminals.list/send/read/close
- CLI: superset terminals list/send/read/close (--host defaults to this
  machine)

close reuses the existing terminal.killSession; list reuses
terminal.listSessions (daemon+DB truth, ParadevAI#5823). No pty-daemon or protocol
changes — this is the surgical subset of the capability ParadevAI#5784 attempted
before its revert (ParadevAI#5837).

Recommended flow: agents.create once to start, then terminals.send for
follow-ups (0 new sessions) and terminals.read to observe the reply.

Claude-Session: https://claude.ai/code/session_01C4cXgxgH3A7k3qHSLEyFNJ

* test(host-service): e2e coverage for terminal send/snapshot; deterministic adoption replay wait

Real-daemon node-test suite (same harness as terminal.adoption.node-test)
covering the headless follow-up surface: send delivers text + Enter,
submit: false stages without executing, snapshot serves normal and
alt-screen buffers plus maxLines, bracketed-paste framing verified
byte-for-byte via `cat > f`, restart-adoption for both verbs, and the
not-found / exited / cross-workspace error paths. 10 consecutive runs green.

Replaces the fixed 300ms post-adoption sleep with a wait for the replayed
ring-buffer bytes to quiesce (they accumulate in session.buffer because no
renderer is attached right after adoption), capped at 500ms. Typical
adoption now settles in ~50ms instead of a blind 300ms, and slow replays
no longer race the tracker rebuild. eventBus is optional on the new
functions, matching createTerminalSessionInternal.

Claude-Session: https://claude.ai/code/session_01C4cXgxgH3A7k3qHSLEyFNJ

* test(host-service): exercise terminal.send/snapshot through the tRPC wire layer

Same real-daemon harness, now also through appRouter.createCaller — the
layer the public MCP/SDK/CLI verbs actually hit. Verifies the zod schemas,
the submit-defaults-to-true behavior, and the error mapping: NOT_FOUND for
missing terminals, FORBIDDEN for cross-workspace targeting, BAD_REQUEST for
empty text, UNAUTHORIZED for unauthenticated callers.

The suite now runs with the tsx loader (the router tree uses extensionless
imports that --experimental-strip-types cannot resolve).

Claude-Session: https://claude.ai/code/session_01C4cXgxgH3A7k3qHSLEyFNJ
…aradevAI#5907)

* feat(desktop): new-workspace screen experiment with sample prompts

Test arm of PostHog experiment 387127 (flag new-workspace-screen): a
page-based create surface for new users — Superset mark, "What should we
build next?", three sample prompts, and a decluttered composer — replacing
the dense modal. Control arm is untouched.

- /new-workspace route; store opens redirect there in the test arm, and
  the empty dashboard renders the screen pinned as its zero state
- eligibility gated in code by NEW_WORKSPACE_SCREEN_EXPERIMENT_START;
  variant evaluated only after flags load, only on surface reach, so
  exposure matches the experiment population; new-workspace-screen-override
  flag forces the UI for the team with zero experiment exposure
- Enter submits (Shift+Enter newline), empty submit blocked, page-wide
  drag-drop with overlay, Codex-style attachment cards (image lightbox,
  reveal-in-Finder, saveToDownloads), linked issue/PR parity with the modal

Claude-Session: https://claude.ai/code/session_01SfU6AHAcHwrjwXwUFUDth5

* feat(desktop): make sample prompts substantive with docs-linked instructions

Short labels in the UI, real instructions inserted on click: the setup
prompt walks the agent through .superset/config.json (setup/teardown/run
scripts, per-workspace ports) with links to docs.superset.sh.

Claude-Session: https://claude.ai/code/session_01SfU6AHAcHwrjwXwUFUDth5

* fix(desktop): address ultrareview findings on the new-workspace screen

- ref-guard preSelectedProjectId so the project picker isn't snapped
  back to the URL param on every change (mirrors the control modal)
- gate the pinned empty state on the default device filter so
  filtered-to-empty device views keep the normal empty state
- poison ambiguous same-name entries in the attachment path map so
  reveal-in-Finder never opens the wrong file

Claude-Session: https://claude.ai/code/session_01SfU6AHAcHwrjwXwUFUDth5
…ig reseeds (ParadevAI#5943)

* fix(automations): store portable agent slug so runs survive host config reseeds

Automations stored the host_agent_configs instance UUID as `agent`. Those
ids are regenerated on every seed/reset (or host.db rebuild), so a pinned
automation breaks with "No host agent config matching '<uuid>'" — the
workspace is still created but agents.run 404s.

Store the preset slug (e.g. "claude") when it unambiguously names one config
on the host, keeping the instance UUID only for duplicate presets, custom
agents, and the superset chat entry. Read stored values id-first-then-preset
across the picker, list cell, and create dialog.

Also clarify the failure for users: friendlier host message, a plain-language
run-error tooltip, Run-now toasts, and a proactive inline warning on the
Agent row when the pinned agent no longer resolves on its host.

* fix(automations): address review — resolve id/preset before iconId, non-disabled tooltip trigger
…#5944)

* feat(desktop): restyle sidebar with a cleaner, denser look

Soft foreground-wash fill tokens (--fill-hover/--fill-selected), inset
rounded rows, muted icons, uppercase Projects micro-label, keycap
shortcut hints, and a collapsed rail that continues the pane tab bar on
the v2 workspace route (TopBar stays hidden on cmd+B).

Claude-Session: https://claude.ai/code/session_01VTufk27JQRoonNcZFiCUvx

* feat(desktop): drop bottom border from pane tab bar and rail strip

Claude-Session: https://claude.ai/code/session_01VTufk27JQRoonNcZFiCUvx

* feat(desktop): match pane tab bar background to sidebar chrome

Claude-Session: https://claude.ai/code/session_01VTufk27JQRoonNcZFiCUvx

* feat(desktop): polish sidebar add-repo button and misc chrome details

VscNewFolder/VscFolderOpened hover swap on add-repository buttons,
longer tooltip delay, smaller icon, Projects label at full muted color,
collapsed New Workspace square keeps its fill.

Claude-Session: https://claude.ai/code/session_01VTufk27JQRoonNcZFiCUvx

* feat(desktop): vsc icons in add-repo dropdown, lighter nav icons

Reorder add-repo menu (open-from-folder first, GitHub icon on clone),
and shrink/thin the main nav icons to lighten their optical weight.

Claude-Session: https://claude.ai/code/session_01VTufk27JQRoonNcZFiCUvx

* fix(panes): keep add-tab button width in measured overflow track
…tooltip style (ParadevAI#5952)

* feat(web): add /design component showcase page for @superset/ui

Living reference of every packages/ui export — shadcn primitives,
ai-elements, atoms, and Superset originals — with copyable import
paths, grouped into ten sections with scrollspy navigation.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* feat(web): reference shared app components on /design, expand tooltip and button demos

Adds a Shared app components registry (desktop renderer + pane system,
with import-site counts), a dedicated Tooltip card including the
HotkeyTooltip shortcut-chip style, and in-product button patterns
mirroring OpenInButton and PickerTrigger.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* feat(ui): make the bordered chip style the TooltipContent default

The preset-bar / HotkeyTooltip chip (bg-background, border, rounded-sm,
muted text, no arrow, sideOffset 4) was copy-pasted at 7 sites and
showArrow={false} at ~55 — it is the de-facto product tooltip. Bake it
into @superset/ui/tooltip as the default and strip the now-redundant
showArrow/sideOffset/className overrides across desktop, panes, and the
/design showcase. Arrow remains available via showArrow; apps/mobile has
its own tooltip and is untouched.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* fix(desktop,ui): keys-only nav/sidebar tooltips and visible Kbd inside tooltips

Kbd had a tooltip-context override (text-background) built for the old
inverted tooltip; on the new bg-background chip it rendered invisible.
Drop the override so Kbd keeps its default muted styling in tooltips.
Make HotkeyLabel's label optional and show only the shortcut keys on
the back/forward buttons and the three sidebar toggles. The /design
hotkey-chip demo now renders real Kbd keys inside a tooltip.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* fix(desktop): slow nav and sidebar-toggle tooltips to the standard 1s delay

Matches the delayDuration={1000} convention used by HotkeyTooltip, the
presets bars, and pane-header tooltips.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* fix(desktop): show only the shortcut in the OpenInButton tooltip

Renders HotkeyLabel keycaps when shortcuts are enabled; falls back to
the "Open in <app>" text only when showShortcuts is off or the hotkey
is unassigned.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* fix(ui): border the opt-in tooltip arrow to match the chip outline

The arrow was a plain bg-background diamond that looked detached from
the bordered tooltip; border-r/border-b on the rotated square lands on
the outward edges for every side.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* feat(web): restrict /design to company email accounts

Adds an internalRoutes list to the web proxy: signed-in users whose
email doesn't end in COMPANY.EMAIL_DOMAIN are redirected home, matching
the gate apps/admin already uses. Covered by proxy-routes tests.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* fix(desktop): keys-only tooltip on the top-bar open-in button (v1 and v2)

Shows just the OPEN_IN_APP shortcut keycaps (e.g. ⌘O for Open in
Finder) instead of the label and worktree path; keeps the
select-an-editor hint when no app is chosen.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* fix(desktop): open-in tooltips show label + shortcut with 1s delay, no worktree path

Restores the "Open in <app>" text next to the keycaps on all three
open-in buttons, keeps the v2 tooltip's worktree-path line removed, and
applies the standard delayDuration={1000}.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* feat(web): split /design into primitives and Superset-components pages

/design keeps the stock shadcn primitives; new /design/superset page
hosts everything custom — Superset originals, expanded live ai-elements
demos (conversation/messages, reasoning, suggestions, chain of thought,
task, plan, code block, sources, inline citation, context, checkpoint,
artifact), and the shared app-component registry. Shared header with
page tabs; the superset page inherits the /design internal-route gate.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* fix(web,desktop): address code-review feedback on the design pages

- HotkeyLabel gains fallbackLabel so keys-only tooltips fall back to
  text instead of an empty chip when a hotkey is unbound
- aria-current="page" on the active design tab
- SharedComponentList extracted to its own component folder
- ComponentCard copyable={false} for glob/source-path registry cards

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* fix(desktop): keys-only tooltip on the v1 right-sidebar close button

Matches the v2 TOGGLE_SIDEBAR toggles switched to fallbackLabel earlier
in this branch.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* feat(desktop): mount settings gear in the v1 sidebar footer

Wires the previously-orphaned SettingsButton next to the add-repository
button in WorkspaceSidebarFooter (both collapsed and expanded states),
updated to footer icon conventions and the keys-only tooltip pattern.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* fix(desktop): let the v1 add-repository button shrink so the settings gear isn't clipped

Button's base shrink-0 + w-full made the trigger consume the full
footer row and push the gear past the sidebar's overflow-hidden edge.
min-w-0 flex-1 shrink lets it flex; label truncates when narrow.
Verified via CDP in the running dev app.

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV

* style(desktop): format WorkspaceSidebarFooter

Claude-Session: https://claude.ai/code/session_01VedKcjooUzNUGeDPTmdanV
…adevAI#5956)

* feat(desktop): filter and sort projects in the dashboard sidebar

Adds a persisted sort mode (manual / date created / last updated) and an
ephemeral inline filter to the dashboard sidebar's PROJECTS header. The
"updated" mode sorts by most recent workspace activity; filtering matches
project, workspace, and section names and auto-expands matches without
writing persisted collapse state. Drag-to-reorder is disabled while a
non-manual sort or filter is active, and the manual tabOrder is preserved.

Claude-Session: https://claude.ai/code/session_01MycxWhiezTmQAbvPR4tcYW

* fix(desktop): use list-filter icon for sort menu and magnifier for filter

Claude-Session: https://claude.ai/code/session_01MycxWhiezTmQAbvPR4tcYW

* fix(desktop): stop sort/add-repo menu clicks from toggling projects collapse

The dropdown content portals to body, but React synthetic events bubble up
the component tree to the header row's collapse toggle.

Claude-Session: https://claude.ai/code/session_01MycxWhiezTmQAbvPR4tcYW

* fix(desktop): make sidebar filter clear button keyboard-operable

Claude-Session: https://claude.ai/code/session_01MycxWhiezTmQAbvPR4tcYW

* fix(desktop): guard inner sidebar DnD and object identity during filtering

Disables per-project workspace/section drag while a filter is active — a
drop committed from the pruned child list would rewrite tabOrder against
incomplete data and corrupt hidden siblings' order. Also makes the filter
helper reuse input objects when nothing changes so memoized rows stay
referentially stable across keystrokes.

Claude-Session: https://claude.ai/code/session_01MycxWhiezTmQAbvPR4tcYW

* feat(desktop): restyle sidebar sort menu with section label and checkmarks

Claude-Session: https://claude.ai/code/session_01MycxWhiezTmQAbvPR4tcYW

* style(desktop): dim and shrink the sidebar sort menu section label

Claude-Session: https://claude.ai/code/session_01MycxWhiezTmQAbvPR4tcYW

* style(desktop): move Manual sort first and soften automation failed red

Failed run dots/labels now use the semantic destructive token, which the
dark ember theme defines as a muted brick red instead of tailwind red-500.

Claude-Session: https://claude.ai/code/session_01MycxWhiezTmQAbvPR4tcYW
@github-actions

github-actions Bot commented Jul 26, 2026 •

Copy link
Copy Markdown

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ⚠️ Neon database branch

Thank you for your contribution! 🎉

@Roshvan

Roshvan commented Jul 26, 2026

Copy link
Copy Markdown
Owner Author

Superseded by the correctly targeted upstream draft PR: ParadevAI#5975

@Roshvan Roshvan closed this Jul 26, 2026

This branch had an error being deployed

1 failed deployment
preview — ca704884 Deployed Jul 26, 2026 by Roshvan via Deploy Database (Neon) #1
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.

5 participants