Commit Graph
34 Commits
Author SHA1 Message Date
ed6c8755fe Prefer upstream remotes for GitHub issue tasks (#1076)
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-04-28 17:01:03 -07:00
6233b8e8a4 feat: Add GitHub PR review workflow to tasks (#1172)
* Render GitHub markdown safely

Co-authored-by: Orca <help@stably.ai>

* Support PR line comment ranges in diffs

Co-authored-by: Orca <help@stably.ai>

* Add GitHub item dialog review workflow

Co-authored-by: Orca <help@stably.ai>

* Make attribution tests environment-safe

Co-authored-by: Orca <help@stably.ai>

* Wire GitHubItemDialog for row clicks and bound file cache

Row clicks in the Tasks GitHub list now open the new GitHubItemDialog
instead of the legacy GitHubItemDrawer, making the PR review workflow
reachable from the main entry point. The unused drawer and its state
are removed.

Also bounds prFileContentCache at 64 entries with LRU eviction so the
module-level map can no longer grow without limit across many PR
openings in a session.

Co-authored-by: Orca <help@stably.ai>

* Convert GitHubItemDialog to a right-side drawer

Replaces the centered Dialog modal with a Sheet drawer (side=right,
max-w 960/1100/1280 across breakpoints) so the review surface slides
in from the side instead of popping over the task list.

Co-authored-by: Orca <help@stably.ai>

* Address review feedback on GitHub work-item details

- Restore full pagination in listAssignableUsers (REST /assignees --paginate)
  so repos with >100 assignees no longer silently drop users from the picker.
- Drop redundant REST /users/<login> fan-out in getMentionParticipants; the
  aliased GraphQL query already returns login/name/avatarUrl.
- Parallelize mention-participant lookup with checks/participants fetch.
- Avoid mutating caller-provided objects in mergeGitHubUsers.
- Type addIssueComment / addPRReviewComment(Reply) preload wrappers as
  Promise<GitHubCommentResult> instead of Promise<unknown>.
- Use typeof startLine === 'number' to harden the review-comment guard.

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: Orca <help@stably.ai>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-04-28 00:11:39 -07:00
fe6eecba0c feat(sidebar): improve PR checks and comments (#1134)
* feat(sidebar): improve PR checks and comments

Co-authored-by: Orca <help@stably.ai>

* fix(sidebar): classify bot comments via GitHub user.type instead of login heuristic

Third-party review bots like qodo-ai-reviewer, coderabbitai, and sonarcloud
don't follow the [bot] suffix or "bot"/"automation" substring convention, so
the regex-based detector misclassified them as human. Plumb REST
`user.type === 'Bot'` and GraphQL `author.__typename === 'Bot'` through to the
renderer as an authoritative isBot flag; fall back to the login heuristic only
when the data source can't report it.

Co-authored-by: Orca <help@stably.ai>

* fix(sidebar): allowlist AI review services that sign in as User accounts

qodo-ai-reviewer, coderabbitai, codium-ai and similar third-party review
services register as regular GitHub user accounts, so REST `user.type` is
"User" and their logins contain no "bot"/"automation" tokens. The previous
fix relied on the GitHub-reported type, which fails for these. Add an
explicit substring allowlist of known automation services so they still
land in the Bots tab.

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: Orca <help@stably.ai>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-04-26 13:28:09 -07:00
Jinwoo HongandOrca 7720ed136c feat(tasks): server-side scope filtering, pagination, and draft bug fix (#1135)
Co-authored-by: Orca <help@stably.ai>
2026-04-26 12:30:22 -07:00
Jinjing aa10811780 fix: address review findings (#1078)
- fix: address review findings
- wip
- wip
2026-04-24 21:58:21 -07:00
Jinwoo Hong faed904aae feat(issues): make issues page writable with inline editing (#1017) 2026-04-24 10:41:21 -07:00
Jinjing 0bbf2d7a8f feat: cross-repo issues view in new workspace page (#942)
* feat: cross-repo issues view with multi-repo selection

- Add multi-repo selection via RepoMultiCombobox with persisted defaultRepoSelection setting (null = sticky-all)
- Stamp repoId on GitHubWorkItem at the renderer fetch boundary; merge items from all selected repos with per-repo failure tracking
- Extract task-query helpers (tokenize/strip/parseTaskQuery) to src/shared and add unit tests
- Refactor NewWorkspacePage row to <div role=button> to allow nested interactive elements without invalid-HTML hydration errors
- fix(repo-combobox): toggle all-repos selection on repeat click

* fix(tasks): route Use CTA to item's own repo in cross-repo view

handleUseWorkItem previously referenced a removed 'repoId' state; use item.repoId so launching from a merged cross-repo list targets the correct repo.

* test(e2e): add tasks page smoke test
2026-04-22 10:58:18 -07:00
Jinjing 818a355098 feat(tasks): add New GitHub issue dialog to tasks page (#841)
Adds a + button on the tasks page that opens a dialog to create a new
GitHub issue in the selected repository. Wires createIssue through the
main/preload IPC using gh api, and refreshes the tasks list after
creation so the new issue shows up immediately.

Also clears a stray Radix pointer-events lock on GitHubItemDrawer mount
so Close/open-in-GitHub buttons remain clickable after the New Issue
dialog closes.
2026-04-19 12:52:24 -07:00
Jinwoo Hong 58b43e0d17 fix(github): Needs My Review tab returns no results (#815) 2026-04-18 21:12:45 -07:00
Neil 7df0d9686c feat: GitHub PR/issue drawer on new-workspace page (#744) 2026-04-16 21:14:24 -07:00
Neil d2a53c8fcc New workspace create page (#710)
* New workspace page with agent catalog, composer modal, and terminal integration

* fix lint

* better blank state

* fix: resolve typecheck errors in new-workspace flow

- widen activateAndRevealWorktree's issueCommand to accept direct
  command shape used by NewWorkspacePage, not just the main-process
  runner-script variant
- use a ref object in pty-connection tests to dodge TS narrowing the
  captured callback to never across the mock closure boundary

* fix: bound worktree name auto-suffix loop to prevent OOM in tests

The auto-suffix loop in createLocalWorktree had no termination cap.
When tests (or a misconfigured env) mocked getBranchConflictKind /
getPRForBranch to always return a collision, the loop ran forever and
the vitest worker crashed with "Ineffective mark-compacts near heap
limit".

Cap the search at 100 suffixes, and if all fail, fall back to the
original specific error messages (branch already exists / PR already
owns the name) instead of a generic failure.

Update the two tests that asserted the old throw-on-first-conflict
behavior to verify the new auto-suffix path end-to-end.
2026-04-16 15:41:40 -07:00
Neil e5890f8e3f Fix stale test mocks after runner migration (#516) 2026-04-11 22:47:30 -07:00
Neil ca041b66fe Add richer in-app feedback dialog (#468)
* Add richer feedback dialog

* Keep anonymous submission client-side only

* Use lowercase feedback API host

* Fallback feedback submission when api host is unavailable
2026-04-11 00:52:53 -07:00
Jinwoo HongandClaude Opus 4.6 f6ec69c969 feat: add WSL support for repos on WSL filesystems (#375)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 21:02:36 -04:00
Jinwoo Hong beb62ff580 feat: add PR comments to checks panel (#376) 2026-04-07 17:58:40 -07:00
NeilandClaude Opus 4.6 37ae8ce525 feat: add Star on GitHub button to landing page (#360)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 22:45:00 -07:00
Jinjing 8e77aca170 fix: fetch PR checks by head sha (#312) 2026-04-05 11:54:53 -07:00
Jinjing 3e51000bc5 fix: bypass gh CLI HTTP cache on manual PR checks refresh (#308)
The `gh api --cache 60s` flag caused stale check-run data even when
the user explicitly clicked refresh. Thread a `noCache` flag through
IPC so manual refreshes skip the gh CLI cache while polling still
benefits from it.
2026-04-05 11:26:32 -07:00
Jinjing f2eb119c62 feat: display CI conflict details and improve merge-conflict UX (#234)
- Add PRConflictSummary type and derive conflict metadata (base ref,
  commits behind, conflicting files) via local git merge-tree
- Fix parseUnmergedEntry to use space-separated parsing (porcelain v2
  unmerged entries are not tab-separated)
- Enhance rebase detection by checking rebase-merge/ and rebase-apply/
  directories in addition to REBASE_HEAD
- Show conflicting files list and commits-behind count in ChecksPanel
- Disable merge button with tooltip when PR has conflicts
- Add operation banners (merge/rebase/cherry-pick) in SourceControl
  and WorktreeCard
- Reorder section list so unstaged changes appear above staged
- Extract conflict-summary, issues, and gh-utils into separate modules
- Add 10s timeout to git fetch in conflict summary derivation
- Fix test fixtures to match real porcelain v2 format
2026-03-31 01:27:39 -07:00
Jinjing e2bb60339f feat: surface merge conflict warning in checks panel (#206) 2026-03-29 16:27:18 -07:00
Jinjing dbab855611 fix: guard against empty branch names in PR check status lookups (#182)
During a rebase with detached HEAD, the branch name can be empty or
resolve to empty after stripping refs/heads/. This caused gh to return
arbitrary PRs and created invalid cache keys like "path::".

Guard all branch-to-cache-key paths: getPRForBranch bails before
acquiring the semaphore, renderer components skip cache lookups,
and syncPRChecksStatus validates the normalized branch.
2026-03-28 16:10:56 -07:00
Jinjing e8f2dcb57d fix: use gh pr list --head for reliable PR discovery (#162)
gh pr view only matches the current checkout, which fails for worktrees
on different branches. Switch to gh pr list --repo --head to query by
branch name directly, with a fallback to gh pr view for non-GitHub
remotes. Also fix the ChecksPanel refresh button to use the proper
handleRefresh flow and force-refresh the PR cache.
2026-03-28 00:30:47 -07:00
Jinjing 18bc9013d9 fix: remove --delete-branch from mergePR to prevent worktree error (#143) 2026-03-27 12:57:22 -07:00
Jinjing a728982a1d fix: Add --yes flag to gh pr merge command (#142)
* fix: squash and merge issue

- fix: squash and merge issue

* fix: use GH_PROMPT_DISABLED instead of invalid --yes flag
2026-03-27 12:49:17 -07:00
Jinjing 97ef6d5e20 feat: add merge PR functionality across stack (#135)
- feat: add merge PR functionality across stack
2026-03-26 23:45:36 -07:00
JinjingandClaude Opus 4.6 b891b07189 feat: reduce GitHub API usage with gh api --cache for conditional requests (#132)
- Use gh api --cache for issues, issue lists, and PR checks endpoints so 304 Not Modified responses don't count against the rate limit
- Pass branch to getPRChecks to enable the check-runs REST endpoint with caching
- Extract mapping functions into separate mappers.ts to keep client.ts within 300-line limit
- Extract mapIssueInfo() helper to deduplicate issue mapping logic
- Remove dead re-exports from client.ts
- Fix reference instability in ChecksPanel poll dependency array

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 17:15:49 -07:00
JinjingandClaude Opus 4.6 69978c93f5 test: expand test coverage and extract worktree logic into testable module (#108)
Add comprehensive tests for worktree parsing, GitHub check status derivation,
hooks YAML parsing, persistence store, layout serialization, store cascades,
and terminal helpers. Extract pure functions from worktrees.ts into
worktree-logic.ts for better testability.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 22:34:20 -07:00
JinjingandClaude Opus 4.6 4c0eee235b fix: extract path-security helpers, add tests, and improve type safety (#102)
* fix: extract path-security helpers and refactor IPC modules

- Extracted path-security helpers from filesystem.ts into filesystem-auth.ts to fix max-lines lint error (402 -> 293 lines)
- Extracted duplicated ENOENT detection into isENOENT() helper to eliminate code duplication
- Fixed missing curly braces on single-line if-return in isDescendantOrEqual (lint violation)
- Replaced any with unknown in test files to satisfy lint rules
- All tests passing (29/29)
- Lint clean (0 errors, 0 warnings)

* fix: bundle preload deps for sandbox mode and fix editor test types

The sandbox: true change in createMainWindow broke the app because
electron-vite was externalizing @electron-toolkit/preload, producing
a require() call that fails in sandboxed preload scripts. Exclude it
from externalization so it gets bundled inline.

Also fix type errors in editor.test.ts from the partial store setup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 09:59:19 -07:00
Jinjing ddc8a78744 Display PR checks and title updates (#101)
- Add PR checks panel to right sidebar
- Stream checks from GitHub API
- Update PR title real-time with loading state
- Add error logging and dependency fixes
- Fix linting issues (curly braces, exhaustive deps)
2026-03-25 09:29:39 -07:00
Jinjing 9c5a1f48bb Add PR checks workflow and Vitest coverage (#97) 2026-03-24 20:53:38 -07:00
JinjingandClaude Opus 4.6 598f7c17fa feat: display CI build status on worktree cards (#80)
Show CI check status icons (success/failure/pending) next to the branch
name on worktree cards. Return 'neutral' instead of 'pending' when no
CI checks exist to avoid showing a misleading spinner. Fix lint errors
in client.ts (curly braces, array-type).

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 23:36:57 -07:00
Neil 93996ddb09 some fixes 2026-03-17 11:10:39 -07:00
Neil c89ba34ec8 code review 2026-03-17 09:53:26 -07:00
Neil 7f29249d48 Major features 2026-03-17 01:40:24 -07:00