Skip to content

feat(app): open GitHub items on GitHub or in a new channel - #109

Merged
iamnbutler merged 3 commits into
mainfrom
hazy-anchor/github-row-actions
Oct 5, 2026
Merged

iamnbutler merged 3 commits into
mainfrom
hazy-anchor/github-row-actions

Conversation

@iamnbutler

@iamnbutler iamnbutler commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

Closes #107 (sub-issue of #28).

The Issues and PRs lists no longer open items in an inline detail pane.

  • Clicking an item's title opens it on GitHub.
  • Each row has two actions on the right: Open in a channel and Open on GitHub. They appear on hover (notouch:, opacity only) and on keyboard focus (group-focus-within), and they're always visible on devices without hover. Phone widths show icons with accessible names, and each action is described by the item title (aria-describedby).
  • Open in a channel reuses App.create(text), the normal channel creation and first-message flow, in the selected project. It sends one ask. If that fails, the text stays as a draft and a toast appears. It's only offered for local projects, because only the owning host can create channels. It's disabled while disconnected or while a create is pending. The message is:
    • Issue: Let's work on {title} ({url}). Read the item and its discussion and inspect the project. Make the needed changes, validate them, and open or update a pull request.
    • PR: the last sentence becomes Continue this pull request on its existing branch: make the needed changes, validate them, and push them to it instead of opening a new pull request.
    • Following review, the message leaves out "follow its instructions", so text written by anyone on GitHub isn't promoted to instructions.
  • Removed: the inline detail and files views, GithubLinks capture of github.com links, saved per-project targets and the related onTarget props. Old state is cleaned up: the stale ace:github-targets:* localStorage key is removed at load, and the GitHub IndexedDB cache moves to version 2, whose upgrade deletes saved github-detail/github-files queries so background refresh stops fetching them. The host's github-detail/github-files ops and their protocol types are kept as shared GitHub infrastructure; no client uses them now.
  • The title link is not a separate Tab stop when macOS keyboard navigation is off, which avoids a duplicate stop per row. "Open on GitHub" goes to the same URL.
  • Desktop: native validation showed that target=_blank/window.open links did nothing in the desktop app, because Electrobun's new-window-open had no handler. The desktop now opens http(s) links outside the app origin in the default browser, including Electrobun's Cmd-click anchors. "Open on GitHub" has tabIndex={0}, because WebKit otherwise skips links on Tab.
  • Search, state filters, refresh, Load more and the project picker are unchanged.

Validation

Static checks: bun types and bun run ci pass on dde96ad, and GitHub CI passes. Independent read-only review (github-row-review) of fd5e837, 97e3974 and dde96ad found no blocking issues. It also checked the new-window-open event shape, single registration and protocol filtering against Electrobun 1.18.1 source.

Actually tested in a running app. An isolated source-built Ace-dev was built from dde96ad. Its web assets were built from the same commit, and it was served by a disposable host with its own ACE_HOME, settings and keychain service. Canary and the installed helper weren't touched. The only project was a fresh clone of the public fixture iamnbutler/tasks-fixture. Agents' gh had no auth, and the clone's push URL was disabled. All input went through Ace's native desktop tools.

  • Clicking the row title for fix(host): resolve tools using the imported shell PATH #4 opened Add a --reverse command · Issue githubnext/ace2#4 · iamnbutler/tasks-fixture in the default browser (Chrome). The Ace window stayed on Issues. On the earlier build without the desktop handler, the same click opened nothing, which is why the handler was added.
  • "Open on GitHub" on chore: track features not yet ported from old Ace #1 opened issue chore: track features not yet ported from old Ace #1 in Chrome, and Ace stayed on Issues.
  • Cmd+Enter on the focused fix(host): resolve tools using the imported shell PATH #4 title link opened fix(host): resolve tools using the imported shell PATH #4 in Chrome. No mouse Cmd-click was sent, because the native tools have no modifier clicks.
  • A GitHub link in a channel transcript (…/issues/5) opened [Meta] Dogfood Ace end to end #5 in Chrome, and Ace stayed in the channel.
  • "Open in a channel" on [Meta] Dogfood Ace end to end #5 disabled every row's channel action while pending. It created exactly one channel, in the selected project /private/tmp/ace-rows/project, and the app switched to it. The first message was Let's work on Add JSDoc comments to all exported functions (https://github.com/iamnbutler/tasks-fixture/issues/5). Read the item and its discussion and inspect the project. Make the needed changes, validate them, and open or update a pull request. The agent started a real Anthropic run, named the channel and replied. I stopped the run after that first reply. Nothing was pushed.
  • Keyboard: tabbing from the search button focused the first row's "Open in a channel", and both actions appeared with a focus ring once the window was active. Before the tabIndex fix, Tab skipped "Open on GitHub", WebKit's default for links. The fix is present in the built bundle, but Tab onto "Open on GitHub" wasn't re-run on dde96ad.

Checked by static review only:

  • Hover reveal: notouch:opacity-0 with group-hover/row:opacity-100. Ace's native tools can't move the pointer, because background clicks are Accessibility presses, and the synthetic drag I tried didn't produce a visible hover state.
  • Always-visible actions on touch devices, and icon-only actions at phone widths.
  • PR wording: no fixture PR channel was created, to keep it to one run. The PR branch of prompt() was reviewed.
  • Remote projects showing only "Open on GitHub", Load more, the no-model draft fallback, and the localStorage/IndexedDB upgrade cleanup. None of these was exercised.
  • aria-describedby exposure to VoiceOver wasn't checked with a screen reader.

Not run: a second host, or a large fixture for Load more.

Built in Ace

Code, issue and PR work ran in Ace channels on Ace Canary. Codex supervised through Canary's UI. Workarounds:

  • The lane tool branches from the project checkout's old HEAD, so I reset the lane to origin/main (Start lanes from origin's default branch and measure their diff against it #96).
  • The UI was validated in an isolated source-built Ace-dev and a disposable host prepared by the dev-ui-validation channel, avoiding the installed-helper collision (Dev app: reload action and reporting an open launch that exits early #97).
  • Review came from a separate Ace channel (github-row-review). One handoff to it was queued behind a long-running polling tool call and stopped during recovery, so it had to be re-sent (Wake waiting agents on channel handoffs instead of blocking in shell polling loops #108).
  • Native desktop tools: hover can't be produced, because background clicks are Accessibility presses that don't move the pointer (#68). The test window stopped repainting while Canary covered it, so I moved it clear with desktop_move. desktop_inspect refused Chrome's window with inconsistent response evidence: window-context window title (recorded on Explain native inspection failure when the desktop or target window becomes unavailable desktop-tools#1), so Ace couldn't close the four tasks-fixture tabs it had opened.
  • Apart from the cleanup exception below, no non-native workaround was used: no Apple Events, global input helpers or browser automation. One pixels inspect of Chrome, used to look for an opened tab, captured an unrelated personal window. Later checks used only window titles from the native inventory.
  • Cleanup exception: after desktop_inspect refused the Chrome window, Nate used Codex computer use through Chrome's native UI only to close those four fixture test tabs, and confirmed none remain. No CLI, AppleScript or source changes were made outside Ace.

Cleanup

The dev-ui-validation channel stopped the disposable Ace-dev, host and channel worker, deleted the copied keychain item, and removed the /tmp/ace-rows worktree, fixture clone, channel data and build output. It also removed the test origin's WebKit data. It confirmed that nothing reached GitHub: there's no new branch on the fixture remote, issue #5 has no new comments, and the fixture still has only PR githubnext/ace2#8. Canary and the installed Ace-dev helper weren't touched. The fixture browser tabs were closed as described above.

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.

Open GitHub items on GitHub or in a new channel from the Issues and PRs lists

1 participant