Skip to content

Register Aside with agents and choose the external browser - #333

Merged
arzafran merged 3 commits into
mainfrom
feat/aside-browser-integration
Sep 3, 2026
Merged

Register Aside with agents and choose the external browser#333
arzafran merged 3 commits into
mainfrom
feat/aside-browser-integration

Conversation

@arzafran

@arzafran arzafran commented Sep 3, 2026

Copy link
Copy Markdown
Member

What this does

Makes Aside, a Chromium-based agent browser, a first-class partner for agents running in Programa. programa aside install-mcp registers Aside's MCP server with Claude Code and Codex in one step (and --with-devtools adds a DevTools Protocol bridge to Aside's live port 9223), so agents can hand logged-in web work to the browser that has the user's sessions. A new Settings > Browser picker sends links that leave Programa to Aside instead of the system default browser. Docs explain when an agent should use Programa's embedded browser versus Aside.

Summary

  • CLI/CLI+Aside.swift: locator for the aside binary, a report-only probe of http://127.0.0.1:9223/json/version, a pure command-plan builder, and status / install-mcp / uninstall-mcp with the same confirm-then-run flow as the Codex hooks installer. Registration shells out to claude mcp add and codex mcp add, so Programa never edits those config files itself. File menu gets "Install Aside Browser MCP…".
  • BrowserLinkOpenSettings.openExternally routes every http(s) external open through the chosen browser (browserExternalBrowserBundleIdentifier, browser.externalBrowser in settings.json). Deep-link schemes (slack://, mailto:) still go to the system handler on purpose.
  • Docs: new docs/aside-browser.md, a Browser work section in SKILL.md, and pointers from docs/agent-skill.md, docs/settings-json.md, and the README. The reverse direction (Aside driving a Claude Code pane) is documented as waiting on Aside shipping an MCP client; programa-mcp already has the tools it would need.

Review order: CLI/CLI+Aside.swift, then Sources/Panels/BrowserSettings.swift, then SettingsView.swift; the rest is call-site fallout and docs. Pairs with the browser_* MCP tools PR but does not depend on it.

Test plan

  • xcodebuild test -scheme programa-unit -only-testing:programaTests/BrowserLinkOpenSettingsTests passes (17 tests, verified locally).
  • Debug build: programa aside status prints the Aside path, the DevTools endpoint while Aside is running, and "not registered" for both clients.
  • Settings > Browser > Open External Links With lists installed browsers; pick Aside, cmd-click a non-local link in a terminal, it opens in Aside.
  • programa aside install-mcp --yes on a machine with Aside, then claude mcp list and codex mcp list show aside.

…owser

Adds programa aside <status|install-mcp|uninstall-mcp>, which registers Aside's
MCP server (and, with --with-devtools, a chrome-devtools-mcp pointed at Aside's
DevTools port) with Claude Code and Codex, plus a File menu entry that runs it.
Adds Settings > Browser > Open External Links With and the matching
browser.externalBrowser settings.json key so links that leave Programa can go
to Aside instead of the system default. Documents the split between the
embedded browser and Aside for agents.
…staller

Only http(s) links go to the chosen external browser; mailto:, slack:// and
other schemes keep their macOS handler. The popup-window insecure-HTTP alert
uses the same opener. programa aside uninstall-mcp no longer needs the Aside
binary, keeps going when one client fails and reports all failures at the
end, and a closed stdin at the confirmation prompt aborts instead of
proceeding.
@arzafran

arzafran commented Sep 3, 2026

Copy link
Copy Markdown
Member Author

Codex cross-model review: 4 medium, 3 low. Verified: scheme scoping, uninstall requiring the aside binary, fail-open confirmation on EOF, and the popup insecure-HTTP alert were real and are fixed in the follow-up commit, with a unit test for the scheme scoping. The launch completion error is now logged; the return value still means dispatched, which the doc comment says. Wrong or left as is: the -y flag is registered in the shared parser the same way as the existing installers; chrome-devtools-mcp@latest stays unpinned on purpose, matching how Codex's own config references it.

@arzafran
arzafran merged commit 63942b4 into main Sep 3, 2026
9 checks passed
@arzafran
arzafran deleted the feat/aside-browser-integration branch September 3, 2026 16:40
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