setSearchParams from React Router triggers router state updates that cause
the Issues component tree to re-render on each debounced URL update. Switch
to window.history.replaceState which updates the URL silently without
triggering React Router re-renders.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Radix Dialog wraps content in react-remove-scroll, which blocks wheel
events on portaled Popover content (rendered outside the Dialog DOM
tree). Add a disablePortal option to PopoverContent and use it for all
InlineEntitySelector instances inside NewIssueDialog so the Popover
stays in the Dialog's DOM tree and scrolling works.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add renderTriggerValue/renderOption to the comment thread's assignee
selector so it shows agent icons, matching the new issue dialog. Fix
the InlineEntitySelector flash on click by only auto-opening on
keyboard focus (not pointer-triggered focus).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Debounces search input (300ms) and syncs it to a ?q= URL parameter so
searches persist across navigation and can be shared via URL.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace scrollbar-none with a scrollbar-auto-hide utility that keeps the
scrollbar thumb transparent by default and reveals it on container hover.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Failed runs, alerts, and stale work items can now be dismissed via an
X button that appears on hover. Dismissed items are stored in
localStorage and filtered from the inbox view and item count.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows a floating arrow button in the bottom-right corner when the user
is more than 300px from the bottom of the issues list. Hides
automatically when near the bottom. Smooth-scrolls on click.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a ProjectStatusPicker component that renders the status badge as a
clickable button opening a popover with all project statuses. Falls back
to the read-only StatusBadge when no onUpdate handler is provided.
Works in both desktop side panel and mobile sheet layout.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On mobile, the sidebar panel toggle was hidden (md:flex only). Add a
mobile-visible SlidersHorizontal button that opens a bottom Sheet drawer
with ProjectProperties, matching the existing pattern from IssueDetail.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When searching via the command palette on mobile, the left sidebar
now automatically closes so search results are visible.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Force popover to always open downward (side="bottom") to prevent it from
flipping upward and going off-screen on mobile. Skip auto-focusing the
search input on touch devices so the virtual keyboard doesn't open and
reshape the viewport. Add touch-manipulation on option buttons to remove
tap delays and improve scroll gesture recognition.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The X close button in the command palette dialog used the generic dialog
positioning (absolute top-4 right-4), which was visually offset from the
search input on mobile. Replace with a custom close button that matches
the input wrapper height (h-12) and uses flex centering for proper
vertical alignment.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allow the "For [Assignee] in [Project]" row to wrap on mobile instead of
requiring horizontal scroll that pushes selectors off-screen. On desktop
(sm+), the row stays inline with min-w-max. Added overscroll-x-contain
for better touch scroll containment.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On small screens, the assignee Identity badge takes up valuable space
in the command palette search results, truncating issue titles. Hide
it below the `sm` breakpoint so more of the title is visible.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Radix Dialog's modal DismissableLayer calls preventDefault() on pointerdown
events originating outside the Dialog DOM tree. Popover portals render at the
body level (outside the Dialog), so touch events on popover content were
treated as 'outside' — killing scroll gesture recognition on mobile.
Fix: add onPointerDownOutside to NewIssueDialog's DialogContent that detects
events from Radix popper wrappers and calls event.preventDefault() on the
Radix event (not the native event), which skips the Dialog's native
preventDefault and restores touch scrolling.
Also cleans up previous CSS-only workarounds (-webkit-overflow-scrolling,
touch-pan-y on individual buttons) that couldn't override JS preventDefault.
Adds service worker with network-first navigation (SPA fallback) and
cache-first static assets. Enhances web manifest with start_url, scope,
id, description, orientation, and maskable icon entry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add OpenResponses gateway enablement instructions to the end of the
agent snippet in CompanySettings. Refactor buildAgentSnippet to use
a template literal for easier future editing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Support two-phase canary release flow:
- --canary: publishes packages under @canary npm tag, skips git commit/tag
- --promote <version>: moves canary packages to @latest, then commits and tags
Both flags work with --dry-run. Existing behavior unchanged when neither flag is passed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New Steps 3-5 in the release skill:
- Step 3: Publish canary to npm with --tag canary (latest untouched)
- Step 4: Smoke test canary in Docker (uses existing smoke infrastructure)
- Step 5: Promote canary to latest after verification
Also updates idempotency table for new intermediate states (canary
published but not promoted) and adds release flow summary.
Script changes still needed: --canary flag for release.sh, --promote
command for dist-tag promotion.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the properties pane was closed on a project page, there was no way
to reopen it. Add the same SlidersHorizontal toggle button used on issue
detail pages.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The append method created a new WriteStream for every log chunk and resolved
the promise on the end callback (data flushed) rather than the close event
(fd released). Over many agent runs the leaked fds corrupted the fd table,
causing child_process.spawn to fail with EBADF.
Replace with fs.appendFile which properly opens, writes, and closes the fd
before resolving.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
pino-http checks res.err before falling back to its generic
"failed with status code 500" error. Set res.err to the real error
in the error handler so logs include the actual message and stack trace.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Invite link is now automatically copied to clipboard when created
- "Copied" badge appears next to the share link header for 2s
- Standalone "Copy link" button replaced with a small copy icon next to the link
- Icon toggles to a green checkmark while "copied" feedback is shown
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- release-changelog: Step 0 checks for existing changelog file before
generating. Asks reviewer to keep/regenerate/update. Never overwrites
silently. Clarifies this skill never triggers version bumps.
- release: Step 0 idempotency table covering all steps. Tag check before
npm publish prevents double-release. Task search before creation prevents
duplicate follow-up tasks. Supports iterating on changelogs pre-publish.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>