feat(app): open GitHub items on GitHub or in a new channel #109
- IA
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 #4 opened `Add a --reverse command · Issue #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 #1 opened issue #1 in Chrome, and Ace stayed on Issues. - Cmd+Enter on the focused #4 title link opened #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 #5 in Chrome, and Ace stayed in the channel. - "Open in a channel" on #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` (#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 (#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 (#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 #64), 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 #8. Canary and the installed Ace-dev helper weren't touched. The fixture browser tabs were closed as described above.
iamnbutlerreferenced this in Open GitHub items on GitHub or in a new channel from the Issues and PRs lists #107last month on GitHub
iamnbutlerready-for-reviewlast month on GitHub
iamnbutlermerged c30845d475balast month on GitHub
iamnbutlerreferenced this in chore(desktop): release canary 0.0.12 #110last month on GitHub
iamnbutlerreferenced this in Explain native inspection failure when the desktop or target window becomes unavailable #64last month on GitHub
iamnbutlerreferenced this in Inspect Chrome windows with Accessibility when the page title changes #113last month on GitHub
iamnbutlerreferenced this in Start work from issues, PRs, and existing branches #28last month on GitHub