Skip to content

Native macOS IDE with Corveil branding and GitHub integration#1

Merged
dhilgaertner merged 6 commits intomainfrom
feature/cmux-study
Apr 2, 2026
Merged

Native macOS IDE with Corveil branding and GitHub integration#1
dhilgaertner merged 6 commits intomainfrom
feature/cmux-study

Conversation

@dhilgaertner
Copy link
Copy Markdown
Contributor

@dhilgaertner dhilgaertner commented Apr 1, 2026

Summary

  • Native Swift/SwiftUI macOS app replacing CMUX for AI development session management
  • Ghostty-embedded terminal surfaces with lazy readiness detection and auto-launch of claude --continue
  • Ticket Board tab with GitHub Projects pipeline status (Backlog → Ready → In Progress → In Review → Done)
  • Corveil brand identity: gold accents, dark theme, brandmark, design tokens from corveil.com
  • PR status enrichment showing pipeline checks, review status, and merge readiness
  • Session lifecycle: auto-complete on merged PRs, safe delete for main branch checkouts
  • ride CLI for session orchestration over Unix socket IPC

Test plan

  • Build with swift build — no errors
  • Launch app, verify Corveil branding (gold sidebar, brandmark, dark theme)
  • Verify Ticket Board shows pipeline status counts from GitHub Projects
  • Create a workspace via /ride-workspace in Manager tab
  • Click new session tab — verify terminal loads, Claude auto-launches after shell ready
  • Verify PR badges show pipeline/review status on session cards and detail header
  • Close/reopen app — verify sessions restore and terminals re-initialize on focus
  • Delete a main-branch session — verify dialog says "Remove Session" and doesn't delete the branch
  • Merge a PR externally — verify session auto-completes within 60 seconds

🤖 Generated with Claude Code

dhilgaertner and others added 6 commits March 31, 2026 15:06
…, and GitHub integration

Native Swift/SwiftUI app replacing CMUX for AI development session management:
- Ticket Board tab with GitHub Projects status pipeline (Backlog → Ready → In Progress → In Review)
- GraphQL-based project status fetching with fuzzy status mapping
- Session/worktree/terminal management via ride CLI over Unix socket IPC
- Ghostty-based terminal surfaces with off-screen pre-warming for reliable initialization
- Auto-completion of sessions when linked PRs are merged or issues are closed
- PR detection on session branches with --repo flag for reliable lookups
- Safe deletion that protects main branch checkouts from worktree cleanup
- Context-aware delete confirmation dialogs
- App icon support via SwiftPM bundled resources
- ride-workspace skill with auto-assign and project status updates

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

Branding:
- Corveil design tokens (CorveilTheme.swift) from corveil.com CSS
- Gold accents, dark backgrounds, branded sidebar and detail headers
- Corveil brandmark in sidebar, window title "Corveil AI IDE"
- Consistent gold title styling across all right-pane headers

Sidebar redesign:
- Removed section headers, replaced with bold inline dividers
- Manager row styled as centered gold button
- Session cards show repo/branch, issue badge, PR badge with status, Claude state
- Ticket row with SF Symbol icons (tray, flag, bolt, eye, checkmark) and done-24h count
- Consolidated delete confirmation into shared DeleteSessionAlert modifier

Terminal readiness system:
- TerminalReadiness state machine: uninitialized → surfaceCreated → shellReady → claudeLaunched
- Lazy Claude launch on first tab focus instead of eager launch at startup
- Loading overlay while terminal initializes
- Status dot reflects terminal lifecycle (gray → yellow → blue → green)
- Readiness tracking for both hydrated and newly created sessions

PR status enrichment:
- PRStatus model tracking pipeline checks, review status, merge readiness
- IssueTracker fetches PR status via gh pr view --json
- PRBadge component with color-coded pipeline/review icons
- PRStatusDetail in session header showing "1 failing", "Needs review", etc.

Bug fixes:
- Fixed resolveRepoSlug regex not stripping .git suffix from SSH URLs
- Fixed provider never being set (auto-detect from ticket URL, backfill on hydrate)
- Fixed get-session RPC not returning all fields
- Fixed JSONStore silently wiping data on decode failure (now logs + backs up)
- Fixed wireTerminalReadiness called after window render (moved before window creation)
- Renamed "Complete" to "Mark as Completed"
- Safe delete for main branch checkouts
- Polling interval reduced from 5 min to 60 sec

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Orphan detection:
- On startup, scan all repos for worktrees not tracked in the store
- Auto-recover orphans as sessions with ticket metadata from GitHub
- Detect PRs on orphan branches (using --state all for merged PRs)
- Persist recovered sessions to the store immediately

Merged PR display:
- Added .merged case to PRStatus.MergeStatus
- Purple badge with checkmark for merged PRs instead of pipeline/review icons
- "Merged" text label in detail header
- hasBlockers returns false for merged PRs

Bug fixes:
- fetchPRStatuses now checks all sessions (not just active) so completed sessions show PR status
- Issue link label now shows "Issue #N" format in recovered sessions

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

Covers prerequisites (Swift 6, Zig, gh CLI), build steps (Ghostty framework,
swift build, app bundle), first-run setup wizard, workspace configuration,
architecture overview with package descriptions, ride CLI reference,
feature documentation (ticket board, PR status, auto-complete, orphan recovery),
and debugging tips.

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

IssueTracker:
- Moved shell command execution to Task.detached so process.waitUntilExit()
  runs on a background thread instead of blocking the main actor
- Eliminates beach ball during the 60-second GitHub polling cycle

GhosttySurfaceView:
- Added viewDidChangeBackingProperties() to handle display scale factor
  changes when moving between monitors with different DPI
- Added resize(withOldSuperviewSize:) to recalculate surface dimensions
  on window resize
- Fixes terminal appearing zoomed in after moving to a different display

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds app-specific Ghostty config override that sets
scroll-to-bottom = keystroke, no-output so the terminal viewport
stays in place when scrolled up while Claude Code is producing output.
Users can still scroll to bottom by pressing any key.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@dhilgaertner dhilgaertner merged commit 6756e8a into main Apr 2, 2026
@dhilgaertner dhilgaertner deleted the feature/cmux-study branch April 2, 2026 15:40
dhilgaertner added a commit that referenced this pull request Apr 8, 2026
Wrap Int interpolations with String() to prevent locale-aware formatting
that adds commas to numbers >= 1,000 (e.g., #1,486 → #1486).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dhilgaertner added a commit that referenced this pull request Apr 8, 2026
## Summary
- Fixes ticket and PR numbers displaying with locale-aware comma
separators (e.g., `#1,486` instead of `#1486`)
- Wraps `Int` string interpolations with `String()` across 4 UI files to
bypass Swift's locale formatting

Closes #124

## Test plan
- [x] Verify ticket numbers >= 1,000 display without commas in session
list
- [x] Verify ticket numbers display correctly in session detail view
- [x] Verify issue numbers display correctly on the ticket board
- [x] Verify PR numbers display correctly on the ticket board and review
board

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dhilgaertner added a commit that referenced this pull request May 4, 2026
…xes (#238)

Closes #235

## Summary

- Adds `docs/automation.md` as the canonical guide to Settings →
Automation and the full auto-flow lifecycle.
- Updates `docs/architecture.md` with the dual Ghostty/tmux backend
(#229), the new `TerminalRouter` dispatch, the Settings tab split
(#228), and the Review Board surface (#188, #205, #207, #210, #212,
#220, #226, #231).
- Adds `crow rename-terminal` (#206) to `docs/cli-reference.md`.
- Adds troubleshooting rows for tmux backend missing, Ghostty surface
retry (#218), GitLab nested groups (#233), `GITLAB_HOST` silent skip
(#215), auto-respond not firing, and the silent no-op `hook-event`
behavior (#234).
- Adds `CROW_TMUX_BACKEND` and `CROW_HOOK_DEBUG` to the
`docs/configuration.md` env-var table.
- Backfills `CHANGELOG.md` `[Unreleased]` with every PR from #137
through #234, grouped by theme.
- Updates `README.md` features list and docs index for the new
automation suite, review board, terminal renaming, and tmux opt-in.
- Appends an "Implementation Status (2026-05)" footer to
`docs/terminal-runtime-research.md` noting #229 shipped the headless-PTY
backend recommended in the original research.

The audit checklist called out as deliverable #1 in the issue is posted
as a [comment on
#235](#235 (comment)).

## Test plan

- [ ] `git diff --stat main` shows only the listed `docs/`,
`CHANGELOG.md`, and `README.md` files
- [ ] Render each modified doc on GitHub and confirm anchors /
cross-links resolve
- [ ] Confirm `crow --help` matches the command list in
`docs/cli-reference.md` (only `rename-terminal` was missing pre-PR)
- [ ] Walk every PR number in the CHANGELOG against `git log
--since=2026-04-15 main --oneline` and confirm each one resolves
- [ ] Re-export `docs/crow-screenshot.jpeg` against the current
Settings/Review-Board UI — **deferred to a follow-up**, called out in
the audit comment

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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