Files dropped onto the new-workspace composer (modal or full page) are
appended as attachment chips; folders are inserted inline at the textarea
caret with shell-style quoting so users can reference working directories
from the OS file browser without leaving the prompt.
Change the default setupScriptLaunchMode from 'split-vertical' to
'new-tab' so setup output runs in a background Setup tab by default
instead of crowding the primary terminal pane. Users can still opt
back into split-vertical or split-horizontal in Terminal settings.
- Move browser-related settings out of the in-browser gear dialog and
out of General into a dedicated Browser pane in Settings, and route
the browser gear button to open it.
- fix: prevent Escape-cancelled rename from committing via trailing blur
Users can now double-click a filename in editor tabs or the file explorer to rename it inline. Both flows share a common renameFileOnDisk() function that handles:
- Quiescing in-flight autosaves before rename to prevent recreating old paths
- Remapping all open editor tabs to the renamed file/directory
- Undo/redo support via the file explorer undo stack
The shared Escape-cancel logic prevents a race condition where blur could fire and commit the rename after user cancelled with Escape.
The right sidebar drag was hard-capped at 500px, so long file names
(e.g. construction drawing sheets, multi-part document names) always
truncated with no way to reveal them.
The cap is now window-relative — users can drag the sidebar up to
(window width − 320px reserve) so the left sidebar and editor can
still breathe. Persistence clamp split so the right sidebar keeps a
loose 4000px safety net for corrupted values, while the left sidebar
stays at 500px.
The badge's inner dot and count spans inherited the titlebar's
-webkit-app-region: drag, which overrode the button's cursor: pointer.
Disable pointer events on the children so hover/click hit-test the
button itself (which opts out of the drag region).
* fix: auto-focus rich markdown editor on mount
Match MonacoEditor's behavior so opening a new markdown file (Cmd+Shift+N)
or switching to a rich-markdown tab lands the cursor in the editor. Guards
against focus theft from modals/dialogs and passes `scrollIntoView: false`
so the focus call doesn't race with useEditorScrollRestore's RAF retry loop.
* fix: use 'start' position to avoid AllSelection on empty editor
Passing null to commands.focus() keeps the editor's current selection,
which for a fresh empty document is an AllSelection — rendered as a
visible 0-width highlight inside the placeholder instead of a normal
caret. 'start' resolves to a proper TextSelection at doc start.
Also update review-and-submit skill to push before gh pr create.
Remove `scroll-smooth` from the virtualized sidebar viewport so palette
reveals land immediately instead of animating the full cross-list
distance at the browser's default smooth-scroll speed.
Single-card stepping (Cmd+Shift+↑/↓) no longer glides either — the
brevity of the movement makes instant feel snappier, and it avoids
the state-machine risk of toggling `scroll-behavior` inline when
tanstack virtual can also issue follow-up scroll corrections after
dynamic item measurement.
* feat: add Ghostty-style macOS Option key mode setting
Disable xterm's macOptionIsMeta by default so non-US keyboard layouts
can compose characters (e.g. @ on German, € on French). Add a
user-facing "Option as Alt" setting with four modes — Both, Left,
Right, Off — mirroring Ghostty's macos-option-as-alt. Core readline
shortcuts (Option+B/F/D) are automatically compensated when Option is
in compose mode. The setting applies live to existing terminal panes.
* fix: track Option key location from modifier keydown, not character key
KeyboardEvent.location on a character key (e.g. Period) reports that
key's own position (always 0), not which modifier is held. Left/right
Option mode was broken because we read location from the character
event. Fix by recording the Option key's location from its own
keydown/keyup events and passing it as a separate parameter.
* perf: speed up NewWorkspacePage first paint
- SWR cache + inflight dedup for gh work-items in store
- Prefetch on openNewWorkspacePage, sidebar Plus hover, Landing hover
- Seed list synchronously from cache to kill the double-fetch on mount
- Module-scoped detectAgents promise cache (one IPC per session)
- Consolidate useComposerState store subs via useShallow
- Hoist Intl.RelativeTimeFormat to module scope (was per row)
- LightRays: count 6->3, blur 44->20, drop mix-blend-screen,
willChange compositor hint, prefers-reduced-motion bailout
* perf: drop redundant runIssueAutomation state + effect
Derived-state-via-effect anti-pattern: runIssueAutomation was just a
mirror of canOfferIssueAutomation toggled through a useEffect, so
shouldRunIssueAutomation was effectively canOfferIssueAutomation one
render late. Compute during render instead.
* fix: prefetch under the exact cache key the page will read
Sidebar and Landing were calling prefetchWorkItems with no query, warming
the cache at '::'' which NewWorkspacePage never reads. Pass the user's
default-preset query so hover-prefetch actually hits the key the page
looks up on mount.
* feat: nicer composer prompt scrollbar and inline '>' prefix
Style the workspace composer prompt with a sleek scrollbar, and render the
'>' prefix as an inline-feeling overlay that scrolls with the text. Scrolling
is hoisted onto an outer wrapper so the '>' and typed text share a single
native scroll container — no cross-layer paint delay, no wobble.
* docs: fix stale comment describing abandoned translateY approach
Adds a Terminal settings control for where the repo setup script runs
on workspace create: vertical split (default, preserves prior behavior),
horizontal split, or a separate "Setup" tab that does not steal focus
from the primary terminal.