Skip to content

chore: sync with upstream#1

Closed
SilkePilon wants to merge 54 commits into
mainfrom
upstream-sync
Closed

chore: sync with upstream#1
SilkePilon wants to merge 54 commits into
mainfrom
upstream-sync

Conversation

@SilkePilon
Copy link
Copy Markdown
Owner

@SilkePilon SilkePilon commented Mar 31, 2026

Latest Upstream Release: Superset Desktop desktop-v1.4.6

Tag: desktop-v1.4.6
Published: 2026-03-31T05:05:08Z


Release Notes

What's Changed

Full Changelog: superset-sh/superset@desktop-v1.4.5...desktop-v1.4.6


54 new commits from upstream.

This PR is automatically created and updated daily to keep the fork in sync with superset-sh/superset.


Summary by cubic

Sync with upstream Superset Desktop v1.4.6 and align CI to .bun-version. This brings MCP OAuth/auth fixes, a PSK‑secured local host-service, terminal stability/perf improvements, Amp agent support, resource usage sorting, server‑side PR search, and other quality-of-life updates.

  • New Features

    • Added Amp Code CLI wrapper; unified desktop agent setup and managed binaries.
    • Secured local host-service with PSK auth and CORS allow‑list; desktop returns { port, secret } and the renderer includes the secret on HTTP/WSS.
    • Resource usage popover supports sorting by memory, CPU, name, or sidebar order.
    • New Workspace modal uses server‑side GitHub PR search (URL detection supported) for faster, complete results.
    • Desktop chat works in SKIP_ENV_VALIDATION mode with local-only bootstrap.
    • System theme lets users choose specific light/dark themes in “System” mode.
    • Electron CDP is only enabled in development when DESKTOP_AUTOMATION_PORT is set.
    • Added NEXT_PUBLIC_MARKETING_URL; CI/builds read Bun from .bun-version (1.3.11).
  • Bug Fixes

    • Terminal stability: forward DA1 responses during init, batch PTY output (~60fps), respect socket backpressure, and exit on PTY spawn failure to avoid zombie sessions.
    • Git/PRs: prevent [gone] from being stored as a branch, reject invalid branch names, honor linked PR push targets, and avoid matching historical PRs when heads differ.
    • MCP OAuth/auth: correct auth precedence (session → API key → OAuth), case‑insensitive Bearer parsing, protected‑resource metadata endpoints, and fail‑closed on invalid verified tokens.
    • Workspaces: consistently delete tracked worktrees from disk with safer external detection and clear ‘deleting’ status on errors.
    • UI/UX polish: focus chat input on pane focus and restore native text‑editing shortcuts; change “Close workspace” to ⌘⇧⌫ (Ctrl+Shift+Backspace on Win/Linux); improve notifications event mapping; harden image data URL handling; Codex hooks restored and enabled in wrappers.

Written for commit 2885f51. Summary will update on new commits.

Kitenite and others added 30 commits March 25, 2026 16:50
…me (superset-sh#2885)

* fix(desktop): prevent [gone] from being stored as workspace branch name

The porcelain status parser incorrectly extracted "[gone]" as the branch
name when git reported "No commits yet on BRANCH...origin/BRANCH [gone]".
The old code split by space and took the last element; the fix strips the
prefix and applies the same tracking-info regex used for normal branches.

Also adds syncBranch validation to reject obviously invalid names and a
one-time startup repair that reads the real branch from the worktree HEAD
file for any existing corrupted records.

* fix(desktop): remove startup branch repair

* Refactor porcelain use gh

* test(desktop): cover porcelain v2 branch handling

* fix(desktop): handle missing HEAD during branch sync

* fix(desktop): narrow unborn HEAD recovery

* lint
)

* Fix MCP auth ordering and OAuth discovery

* Handle case-insensitive bearer auth and forwarded header lists

* Sanitize auth error logs and normalize API URLs

* Fail closed on invalid verified OAuth tokens
…invalidation (superset-sh#2900)

Ensures cached proxy responses are keyed per auth token, preventing
stale data when switching orgs or users.
…superset-sh#2901)

The proxy handles ~200 req/min — performance-4x (8GB) is vastly
over-provisioned. Saves ~$120/mo.
Better-auth defaults to 10 requests per 24 hours per API key. MCP
clients burn 3 requests on init alone, causing keys to stop working
after ~7 tool calls. Disables the rate limiter entirely.
…focus on pane nav (superset-sh#2676)

* fix(desktop): skip pane-nav shortcuts when input/textarea is focused

Cmd+Shift+Left/Right should allow text selection in chat prompts, not
hijack focus to the adjacent pane.

* fix(desktop): stop modifier+arrow propagation in chat textarea

Fix pane-nav hotkey hijacking at the source — the prompt input now calls
stopPropagation for Cmd/Ctrl+Arrow keys so they perform native text
selection rather than switching panes.

* fix(desktop): focus chat textarea when pane receives focus via keyboard nav

* fix(desktop): place cursor at end of input when chat pane receives focus

* refactor(desktop): extract useFocusPromptOnPane shared hook
…t-sh#2903)

* feat(desktop): cmd-click file paths opens in external editor

Cmd/ctrl-click on files in the file tree, search results, and changes
view now opens in the configured external editor. Double-click no
longer opens externally, freeing it for future pinning behavior.

* keep existing double-click open-in-editor behavior

* remove stale workspaceRun tests with drifted mocks
…et-sh#2557)

* feat(desktop): configurable light/dark themes for system mode

When "System" theme is selected, users can now choose which specific
theme to use for light and dark modes via dropdowns on the System card,
instead of always resolving to the built-in light/dark themes.

* fix(desktop): validate stale system theme IDs and ensure terminal color fallbacks

resolveThemeId now validates that persisted system theme IDs reference existing
themes, falling back to built-in light/dark when stale. initializeTheme
normalizes stale IDs on hydration so system mode is never silently dropped.
SystemThemeCard uses getTerminalColors() for guaranteed terminal colors instead
of accessing the optional .terminal property directly.

* fix(desktop): validate themeId in setSystemThemePreference before persisting

Reject invalid or recursive "system" IDs to prevent inconsistent persisted
state from non-UI callers.

* refactor(desktop): extract fallback theme IDs into shared constants

Replace repeated "light"/"dark" literals with DEFAULT_LIGHT_THEME_ID and
DEFAULT_DARK_THEME_ID to reduce drift risk during future refactors.
…-sh#2908)

* fix(desktop): restore workspace deletion from disk

Fixes bug introduced in PR superset-sh#2573 where workspace deletion only removed
database records but left worktree files on disk.

**Root cause:**
- `listExternalWorktrees()` was misnamed and returned ALL git worktrees
- Delete logic used this for safety checks, finding the worktree being
  deleted in the "external" list
- This caused disk deletion to be skipped incorrectly

**Changes:**
1. Renamed `listExternalWorktrees` → `listAllGitWorktrees` (accurate name)
2. Created proper `listExternalWorktrees(mainRepoPath, projectId)`:
   - Queries database for tracked worktrees
   - Returns only git worktrees NOT in database
   - Provides true "external worktrees" list
3. Removed `createdBySuperset` flag gating from deletion logic:
   - Users can now delete imported external worktrees
   - Safety check via `listExternalWorktrees` prevents deleting
     worktrees that haven't been imported
4. Updated all call sites to pass `projectId` parameter
5. Extracted `normalizePath` helper to git.ts for reuse
6. Simplified git-status.ts to use new implementation

**Testing:**
- All typechecks pass
- Existing tests updated (external-worktree-import.test.ts)
- Logic verified: tracked worktrees deleted, external preserved

* fix(desktop): add error handling to prevent stuck 'deleting' status

Wraps worktree deletion logic in try-catch to ensure workspace deleting
status is properly cleared if listExternalWorktrees() or other operations
fail.

**Problem:**
- If listExternalWorktrees() throws (git error, DB error, etc.), the
  workspace remains stuck in 'deleting' status
- User cannot retry deletion or interact with workspace
- Requires manual DB cleanup or app restart to recover

**Solution:**
- Wrap deletion section in outer try-catch
- Catch any errors from listExternalWorktrees and related operations
- Always call clearWorkspaceDeletingStatus() on error
- Return proper error response instead of crashing

**Changes:**
- workspace delete procedure: added error boundary around disk deletion
- deleteWorktree procedure: added error boundary for consistency

**Impact:**
- Prevents workspace from getting stuck in deleting state
- Provides clear error messages to user
- Allows user to retry deletion after fixing issues
…t-sh#2892)

The `run` field in `.superset/config.json` was undocumented. This adds
a section explaining how run scripts work (on-demand via Run button,
restartable, dedicated pane) and how they differ from setup/teardown.
Also adds the missing `SUPERSET_WORKSPACE_PATH` environment variable.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
superset-sh#2927)

* Clean enougH

* fix: biome lint/format fixes

* chore: remove unnecessary comments, clean up ws auth middleware

* fix: biome format fix

* fix: fix flaky external worktree test, remove broken workspaceRun test

* Clean enougH
…uperset-sh#2929)

* fix(desktop): improve external worktree detection in deletion safety check

Enhance the safety mechanism that prevents deletion of external worktrees
by cross-referencing git worktrees with database-tracked worktrees.

Previously, the check relied solely on listExternalWorktrees(), which could
miss cases where a worktree was incorrectly marked as createdBySuperset.

Now the logic:
- Gets all git worktrees from the repository
- Queries all tracked worktrees from the database for the project
- Normalizes paths for accurate comparison (handles symlinks)
- Determines if a worktree is external by checking if it exists in git
  but is NOT tracked in the database

This prevents accidental deletion of external worktrees that may have been
incorrectly flagged, providing an additional layer of safety.

Applied to both workspace.delete and workspace.deleteWorktree procedures.

* fix(desktop): delete external worktrees from disk when removed from Superset

Update deletion logic to remove all worktrees from disk when deleted through
Superset, regardless of whether they were created by Superset or imported as
external worktrees.

Previously:
- Superset-created worktrees (createdBySuperset=true) → deleted from disk
- External worktrees (createdBySuperset=false) → only removed from database

Now:
- All worktrees tracked in Superset → deleted from disk when removed
- Safety check still prevents deletion of untracked worktrees

This provides consistent UX: once a worktree is managed in Superset (even if
originally created externally), deleting it removes it completely.

The safety mechanism still protects against edge cases where a worktree exists
in git but is not properly tracked in the database.

Updated both workspace.delete and workspace.deleteWorktree procedures.
…s blocking new terminals (superset-sh#2963)

* fix(desktop): exit subprocess on PTY spawn failure to prevent zombie sessions (superset-sh#2960)

When pty.spawn() fails (e.g. posix_spawnp failed), the subprocess sent
an error frame but stayed alive. This left session.isAlive returning
true for a broken session with no PTY, causing TerminalHost to store
and attach to it — blocking new terminal creation.

Two fixes:
- pty-subprocess.ts: exit with code 1 after spawn failure so the daemon
  correctly detects the session as dead
- terminal-host.ts: also check session.pid after ready timeout to catch
  edge cases where subprocess is alive but PTY never spawned

* Deslop

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Kiet Ho <hoakiet98@gmail.com>
…#2966)

* Marketplace

* fix(desktop,docs): wire marketplace links through env

* fix: address marketplace PR review comments
* desktop: make chat work in skip env mode

* lint
…ion (superset-sh#2907)

* feat(desktop): add CLOSE_WORKSPACE hotkey and context menu delete option (superset-sh#2742, superset-sh#2741)

Add ⌘+Backspace hotkey to close/delete the active workspace via
DeleteWorkspaceDialog, and expose a "Close Worktree"/"Close Workspace"
option in the sidebar context menu for all workspace types using the
existing deleteDialogCoordinator pattern.

Closes superset-sh#2742
Closes superset-sh#2741

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: freeze delete target and add cross-platform conflict tests

Address CodeRabbit review feedback:
- Freeze workspace data at hotkey press time to prevent stale target
  if the active workspace changes before dialog confirmation
- Extend conflict test to also check linux platform defaults

* Naming

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Kiet Ho <hoakiet98@gmail.com>
)

* fix(cost): remove device heartbeat polling to reduce Vercel costs

Replace 30s heartbeat polling with a single device registration on app
startup. This eliminates ~2,880 requests/device/day to Vercel while
keeping MCP command routing and ownership checks intact.

- Remove heartbeat interval from desktop and mobile, register once on mount
- Rename `device.heartbeat` to `device.registerDevice` (single-fire)
- Remove `device.listOnlineDevices` (unused)
- Remove online-check gate from MCP `executeOnDevice` (timeout handles offline)
- Remove Devices settings page and sidebar entry
- Remove `devicePresence` Electric collection (no longer needed client-side)
- Simplify `list_devices` MCP tool (no online/offline status)
- Remove online indicator from DevicePicker UI

* chore: remove v2DevicePresence Electric collection

No consumers remain after removing the presence join from
useWorkspaceHostOptions. Presence will be reimplemented via WSS.

* fix: scope device registration guard to org and userId

- Replace boolean registeredRef with org-scoped ref so switching orgs
  triggers re-registration on both desktop and mobile
- Scope executeOnDevice ownership query to ctx.userId to prevent
  returning another user's device row

* fix: keep deprecated heartbeat endpoint for shipped clients

Existing desktop/mobile clients still call device.heartbeat on a 30s
interval. Keep it around as a deprecated alias so they don't error out
until users update.
…ce modal (superset-sh#2980)

* Buttons

* Fix build

* hotkey

* Single CMD enter

* Lint
* fix(desktop): honor linked PR push targets

* fix(test): remove tests that poison module cache via mock.module

Bun's mock.module() leaks across test files (oven-sh/bun#12823) and
mock.restore() does not undo module mocks. Tests that call mock.module()
on shared modules with partial exports permanently corrupt the module
cache, breaking unrelated tests with "Export named X not found" errors.

Removed tests:
- merge-pull-request.test.ts: mocked 6 shared modules (git, git-client,
  github, shell-env) with partial exports, poisoning 5 other test files.
- editorCoordinator.test.ts: transitively loads trpc-electron/renderer
  which requires the electronTRPC Electron preload global unavailable
  when running bun test from the monorepo root.
- task.test.ts: mocked 9 shared modules (@superset/db/client,
  drizzle-orm, etc.) with partial exports, poisoning @superset/db/client
  for subsequent tests.

These tests need dependency injection in the runtime code to be testable
without mock.module(). They can be re-added once the functions accept
deps as parameters.

Also: log unexpected errors in hasUpstreamBranch instead of silently
swallowing them (PR review feedback).

* fix(ci): unblock test and typecheck

* fix(ci): harden merge-ref regressions

* fix(desktop): pin @pierre/diffs and support 1.1.7 hunks

* chore: drop unrelated CI-only changes from PR

* fix(ui): pin streamdown deps and narrow types

* fix(desktop): align mastra runtime versions

* fix(ci): patch mastracode metadata for desktop

* fix(ci): preserve runtime deps for desktop build

* fix(desktop): patch runtime metadata after copy
* chore(mastra): switch to upstream packages

* fix(desktop): address mastra CI regressions

* Upgrade mastra
…uperset-sh#2989)

* fix(desktop): clean up review sidebar UI and remove redundant states

- Replace inline AlertDialogs with reusable DiscardConfirmDialog component
- Simplify ReviewPanel loading skeleton to match app-wide pattern
- Flatten comment layout: show active comments directly, Resolved as own section
- Remove redundant review label that duplicated badge text
- Remove redundant PR state text already conveyed by icon color
- Remove duplicate comment count between parent and child sections
- Align collapsible trigger styles (padding, hover, chevron sizes) with CategorySection
- PR header: compact layout with hover-to-reveal external link
- Add section dividers between PR header, checks, and comments
- Push comment age to far right, absolutely position hover actions
- Clean up unused imports

* Update apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/ChangesView/components/ReviewPanel/ReviewPanel.tsx

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Kitenite and others added 24 commits March 29, 2026 12:09
…uperset-sh#2997)

* feat(desktop): add visual indicator when settings search is active

Add a compact search results banner and normalize search query handling
for a consistent, clean search experience in settings.

* fix(desktop): add aria-label to search banner clear button
* Enable Enter on destructive alert dialogs

* Use AlertDialogAction for enter focus
…uperset-sh#2909)

* fix(desktop): implement server-side PR search in new workspace modal

Replace client-side PR search with server-side GitHub search to fix
performance and completeness issues in the new workspace modal.

Previously:
- Fetched all PRs upfront (slow 5-10s initial load)
- Limited to 30 PRs total (hardcoded backend limit)
- Client-side Fuse.js search only searched fetched PRs
- Pasting PR URLs didn't work

Now:
- Fast initial load: shows 30 recent PRs for browsing (~1-2s)
- Unlimited search: server-side GitHub search via gh CLI
- Searches ALL PRs in the repo (no limits)
- Debounced search (300ms) for better UX
- URL detection: extracts PR number from pasted GitHub URLs

Changes:
- Add searchPullRequests tRPC endpoint using gh pr list --search
- Update PRLinkCommand to use conditional queries
- Add URL parsing to extract PR numbers from GitHub URLs
- Show result count and appropriate loading states

Fixes the regression from v1.1.7 where PR search could access all PRs
via synced database. This approach works without requiring ElectricSQL
sync and provides better performance.

* fix(desktop): use immediate trim for PR search UI decisions

Fix stale UI behavior caused by debouncing the trimmed query value.

Previously:
- trimmedQuery was derived from debouncedQuery.trim()
- This caused 300ms delay before UI decisions (show browse/search mode)
- Pressing Enter had stale behavior due to delayed trim

Now:
- trimmedQuery = searchQuery.trim() (immediate, for UI decisions)
- debouncedTrimmed = debouncedQuery.trim() (debounced, for RPC calls)
- URL detection and search RPC use debounced value
- UI state (enabled flags, display logic) use immediate trim
- No more stale behavior on Enter or mode switching

* fix(desktop): eliminate 300ms empty results gap in PR search

Previously, search mode toggled immediately on trimmedQuery while data
fetching was debounced on debouncedTrimmed, causing a 300ms window
where the UI showed "No pull requests found" even though results were
still loading.

Changes:
- Add isPendingDebounce state detection (trimmedQuery !== debouncedTrimmed)
- Use debouncedTrimmed consistently for all mode decisions and UI display
- Include isPendingDebounce in isLoading calculation
- Keep trimmedQuery only for pending state detection

This ensures the mode doesn't switch until debounced data is ready,
eliminating the empty results gap and providing consistent UI behavior.

* refactor(desktop): extract shared PR parsing logic

Extract parsePullRequests() helper to eliminate duplication between
listPullRequests and searchPullRequests endpoints. Both now use the
same filter/map logic for consistent PR shape and state mapping.

Benefits:
- Single source of truth for PR parsing
- Future changes only need updating in one place
- Consistent behavior across browse and search modes
- Reduced code by 18 lines

Resolves cubic.dev P3 refactoring suggestion

* fix(desktop): address PR search review feedback

---------

Co-authored-by: Kiet Ho <hoakiet98@gmail.com>
…#2999)

Add an "Open in Editor" context menu item to worktrees in both the
sidebar and the all-workspaces list view. Uses the existing
openFileInEditor tRPC mutation which resolves the user's configured
default editor (project-level, then global fallback).
* fix workspace search regressions

* fix workspace-fs test matcher typing

* fix compact path search collisions

* address review follow-up

* canonicalize search index paths
…superset-sh#3001)

Replace setImmediate with 16ms setTimeout for PTY output flushing to
coalesce rapid TUI redraws into coherent frames (~60fps), preventing
renderer flooding that caused bun dev to crash.
* fix(desktop): skip writes to backpressured terminal sockets and rate-limit warnings

Combines the fixes from superset-sh#2969 and superset-sh#2962 into a single changeset:

1. Skip writes to backpressured sockets (superset-sh#2969): When a client socket
   signals backpressure (write returns false), subsequent broadcastEvent
   calls skip that socket entirely instead of growing Node's internal
   write buffer without bound. The terminal emulator still processes all
   data so snapshot state stays consistent — the next TUI repaint after
   drain naturally resyncs the display.

2. Rate-limit backpressure warnings (superset-sh#2962): Replace unbounded
   console.warn on every backpressure event with a rate-limited
   warnBackpressure() method. Only one warning is emitted per 5-second
   window; subsequent occurrences are counted and reported in the next
   warning (e.g. '247 similar warnings suppressed'). Under sustained
   high-output commands, a single pane could previously generate 400k+
   identical warnings flooding the daemon log.

Tests cover: writes skipped during backpressure, writes resume after
drain, warning rate-limiting within the 5s window, and suppressed
count reporting after the window elapses.

Closes superset-sh#2969
Closes superset-sh#2962

Co-Authored-By: Mastra Code (anthropic/claude-opus-4-6) <noreply@mastra.ai>

* fix(desktop): preserve terminal lifecycle events under backpressure

* fix(desktop): preserve terminal output under backpressure

* test(desktop): trim terminal host session coverage

* fix(desktop): remove terminal backpressure warning

---------

Co-authored-by: Mastra Code (anthropic/claude-opus-4-6) <noreply@mastra.ai>
* fix: restore codex loading state hooks

* fix: enable codex hooks for running state

* fix: migrate stale codex preset commands

* fix: enable codex hooks in wrapper launches

* chore: drop codex loading state detours
…set-sh#3009)

* fix(desktop): match dropdown trigger color to run button state

The combo dropdown chevron on the WorkspaceRunButton stayed a static
color while the main button changed between idle, running (emerald),
and unconfigured (muted) states. Apply the same conditional color
classes to the dropdown trigger so both halves look consistent.

* Lint
* feat(web): add mobile-first agents experience with prompt input and session views

Build two new screens for the mobile web experience at app.superset.sh:

- Main Screen (/): Prompt input card with model/repo/branch selectors,
  file attachments, and a searchable session list grouped by recency
- Chat Session Screen (/[sessionId]): Chat/Diff tab toggle, message
  display using existing AI element components, follow-up input

Key implementation details:
- ResponsiveDropdown component: renders DropdownMenu on desktop, Drawer
  on mobile (<768px) for all selection controls
- Reuses PromptInput compound components from packages/ui
- Pixel-art Superset wordmark SVG from desktop app
- Mobile-first with safe-area padding, 44px touch targets, viewport-fit
- UI-only with mock data — backend wiring comes later
- Renames (dashboard) route group to (dashboard-legacy)

* Address issues

* Update mobile

* fix agents review feedback

* guard agents header actions

---------

Co-authored-by: Kiet Ho <hoakiet98@gmail.com>
* Fix

* Test fix

* Lint

* Fix terminal emulator surrogate pair chunking

* Fix lint in surrogate pair regression test

* Handle socket disconnect backpressure cleanup
…l init (superset-sh#3030)

Fish shell sends a DA1 escape sequence (ESC[c) at startup to detect
terminal capabilities. The headless emulator (xterm.js) correctly
generates a response, but it was being dropped during the "pending"
shell-ready state. This caused fish to wait 10 seconds before timing
out and disabling optional features like cursor shape and reflow.

The fix removes the shellReadyState gate from the headless emulator's
onData callback. Unlike renderer-generated responses (which go through
session.write() and are correctly dropped to avoid appearing as typed
text), headless emulator responses are written directly to the PTY and
consumed by the shell as protocol data.

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Add a sort dropdown to the resource usage screen with four options:
Memory (default, descending), CPU (descending), Name (alphabetical),
and Sidebar order (matching the left sidebar's visual ordering).
Sorting applies to both project groups and workspaces within each group.
* fix(desktop): change close workspace shortcut to ⌘+Shift+Backspace

Prevents accidental workspace deletion by requiring Shift modifier.

* fix(desktop): keep Win/Linux close workspace shortcut as Ctrl+Shift+Backspace

Pin explicit defaults so the auto-derivation doesn't escalate to
Ctrl+Shift+Alt+Backspace — the extra modifier is only needed on macOS.

* style: format hotkeys test with biome
…rset-sh#3043)

axios@1.14.1 pulls in a malicious package (plain-crypto-js@4.2.1)
via a compromised maintainer account. Our transitive deps use caret
ranges (^1.13.5, ^1.7.7) that would resolve to 1.14.1 on a fresh
install. Adding a root override to lock axios at 1.14.0 until the
upstream incident is resolved.
…uperset-sh#2994)

* Add Amp Code CLI support

* Refactor agent registry and add custom agent CRUD groundwork

* Use official Amp press kit logos

* Use Amp square mark icon

* Fix lint warning in agent settings test

* Stop tracking repo Amp workspace settings

* Lint

* Use stdin for interactive Amp prompts

* Trim repo-only Amp cleanup changes

* Refactor agent prompt transport rendering

* Unify builtin and custom agent models

* Fix custom agent regressions and MCP precedence
)

* fix(desktop): harden Codex native hook cleanup

* fix(desktop): restore codex fallback hook path

* Fix Codex lifecycle hook states

* Cover Codex hook merge preservation
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 issues found across 346 files

Note: This PR contains a large number of files. cubic only reviews up to 75 files per PR, so some files may not have been reviewed.

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".github/workflows/triage-issue.yml">

<violation number="1" location=".github/workflows/triage-issue.yml:35">
P2: The workflow references .bun-version, but the file doesn't exist in the repo. setup-bun will fail to resolve the version. Either add the file or keep an explicit bun-version value.</violation>
</file>

<file name="apps/desktop/src/lib/trpc/routers/workspaces/procedures/delete.ts">

<violation number="1" location="apps/desktop/src/lib/trpc/routers/workspaces/procedures/delete.ts:289">
P1: `deleteWorktree` now removes any tracked worktree from disk, including external worktrees marked `createdBySuperset: false`. That changes prior safety behavior and can delete user-managed worktrees.</violation>
</file>

<file name="apps/desktop/src/lib/trpc/routers/workspaces/utils/git.ts">

<violation number="1" location="apps/desktop/src/lib/trpc/routers/workspaces/utils/git.ts:353">
P1: Regex for unmerged (`u`) entries has one extra `\S+` field, so it will never match actual `git status --porcelain=v2` output. The v2 unmerged format is `u <xy> <sub> <m1> <m2> <m3> <h1> <h2> <h3> <path>` (8 fields before path), but the regex expects 9 fields before the path capture. Merge conflicts will be silently ignored.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

const isActuallyExternal =
existsInGit && !trackedPaths.has(worktreePathNorm);

if (isActuallyExternal) {
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot Mar 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: deleteWorktree now removes any tracked worktree from disk, including external worktrees marked createdBySuperset: false. That changes prior safety behavior and can delete user-managed worktrees.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At apps/desktop/src/lib/trpc/routers/workspaces/procedures/delete.ts, line 289:

<comment>`deleteWorktree` now removes any tracked worktree from disk, including external worktrees marked `createdBySuperset: false`. That changes prior safety behavior and can delete user-managed worktrees.</comment>

<file context>
@@ -267,43 +265,46 @@ export const createDeleteProcedures = () => {
+						const isActuallyExternal =
+							existsInGit && !trackedPaths.has(worktreePathNorm);
+
+						if (isActuallyExternal) {
+							console.warn(
+								`[workspace/delete] Worktree at ${worktree.path} exists in git but not tracked in database - preserving as safety measure`,
</file context>
Suggested change
if (isActuallyExternal) {
if (!worktree.createdBySuperset) {
console.log(
`[worktree/delete] Skipping disk deletion for external worktree at ${worktree.path}`,
);
} else if (isActuallyExternal) {
Fix with Cubic

Comment on lines +353 to +355
const match = entry.match(
/^u (\S{2}) \S+ \S+ \S+ \S+ \S+ \S+ \S+ \S+ (.+)$/,
);
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot Mar 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Regex for unmerged (u) entries has one extra \S+ field, so it will never match actual git status --porcelain=v2 output. The v2 unmerged format is u <xy> <sub> <m1> <m2> <m3> <h1> <h2> <h3> <path> (8 fields before path), but the regex expects 9 fields before the path capture. Merge conflicts will be silently ignored.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At apps/desktop/src/lib/trpc/routers/workspaces/utils/git.ts, line 353:

<comment>Regex for unmerged (`u`) entries has one extra `\S+` field, so it will never match actual `git status --porcelain=v2` output. The v2 unmerged format is `u <xy> <sub> <m1> <m2> <m3> <h1> <h2> <h3> <path>` (8 fields before path), but the regex expects 9 fields before the path capture. Merge conflicts will be silently ignored.</comment>

<file context>
@@ -203,84 +271,100 @@ function parsePortelainStatus(stdout: string): StatusResult {
-			else if (workingStatus === "D") deletedSet.add(path);
-			else if (workingStatus === "U") conflictedSet.add(path);
+		if (entry.startsWith("u ")) {
+			const match = entry.match(
+				/^u (\S{2}) \S+ \S+ \S+ \S+ \S+ \S+ \S+ \S+ (.+)$/,
+			);
</file context>
Suggested change
const match = entry.match(
/^u (\S{2}) \S+ \S+ \S+ \S+ \S+ \S+ \S+ \S+ (.+)$/,
);
const match = entry.match(
/^u (\S{2}) \S+ \S+ \S+ \S+ \S+ \S+ \S+ (.+)$/,
);
Fix with Cubic

uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.6
bun-version-file: .bun-version
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot Mar 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The workflow references .bun-version, but the file doesn't exist in the repo. setup-bun will fail to resolve the version. Either add the file or keep an explicit bun-version value.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/triage-issue.yml, line 35:

<comment>The workflow references .bun-version, but the file doesn't exist in the repo. setup-bun will fail to resolve the version. Either add the file or keep an explicit bun-version value.</comment>

<file context>
@@ -32,7 +32,7 @@ jobs:
         uses: oven-sh/setup-bun@v2
         with:
-          bun-version: 1.3.6
+          bun-version-file: .bun-version
 
       - name: Cache dependencies
</file context>
Fix with Cubic

@SilkePilon SilkePilon closed this Mar 31, 2026
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.

8 participants