Skip to content

v0.6.0

Choose a tag to compare

@cpcloud cpcloud released this 07 Nov 11:56
· 106 commits to main since this release
v0.6.0
e1db5da

New features

  • A new Queues tab, next to PRs, lists every GitHub merge queue in one place. Each queued pull request shows its position, state, and estimated time to merge. Pull requests the queue removed show the reason and the checks that failed. You can search, filter by status and author, multi-select rows, and act on the selection from the right-click menu. Rows show the same CI, conflict, review, stack, and workspace icons as the PR list. A selected pull request opens beside the queues with the same inline workspace as the PRs tab.
  • "Add to merge queue" adds a pull request in one click. The dialog opens only when there is a real choice, such as pending or failed CI, a draft, or a workspace that would be deleted after the merge.
  • Click "In merge queue" and confirm to take a pull request out of a GitHub merge queue.
  • When a merge queue removes a pull request, the notice names the checks that failed on the queue's test commit and links to each failed job. An entry the queue marks unmergeable says which branch it can't merge into, and a queued pull request shows an amber Queued badge, as on GitHub.
  • On GitHub repositories that allow auto-merge, "Merge after CI" now turns on GitHub auto-merge. Queued merges survive Forge restarts and show on github.com. Click "Merge queued" to turn the queued merge off.
  • Merge or enqueue a whole GitHub native stack, including one made with gh stack, from its top pull request. The button shows how many pull requests will land. "Prefer GitHub native stacks" is now on by default; set prefer_github_native_stacks = false to turn it off. Enqueue stack works while CI is still running. Merged members of a stack show a Merged chip, and stack positions and counts stay put. Stacks Forge infers from branch names still merge one at a time.
  • Update a GitHub pull request branch that is behind its base from the PR action row. A notice under the actions says when an out-of-date branch or a missing required review stops the merge.
  • Open pull requests have a Convert to draft button and a matching command palette entry on GitHub.
  • Double-click Approve to approve a pull request with no comment. A single click still opens the review form.
  • Approve waiting GitHub Actions runs on outside-contributor pull requests from the PR list's right-click menu. With several rows selected, the action applies to the ones that have runs waiting, after a confirmation.
  • Drag a failed CI check into an agent chat to get a ready-made fix request in the composer. The prompt covers every failed check on the pull request, with details links and the gh run view --log-failed command for GitHub Actions jobs. The prompt is not sent until you send it.
  • PR filters have a Labels row. Click a label to require it, click again to exclude it, and once more to clear it. The picker has search, label colors, and counts.
  • The repository filter shows each repository's open pull request count.
  • A lock icon marks repositories their provider reports as private.
  • A small sparkline in the PR header and worklist rows shows how a pull request's size changed across the revisions Forge has seen. Hover it for the total change. It appears once a pull request has two observed revisions.
  • Cmd/Ctrl+A selects every visible row in the PR, issue, worklist, workspace, Queues, and focus lists. Bulk actions then apply to all of them.
  • Worklists gain quick filters for Involves me, Approved, Draft, Ready for review, Merge conflicts, No merge conflicts, Passing CI, Failed CI, and Has workspace.
  • Collapse a worklist item's notes strip to its header line. The choice is remembered in the browser.
  • The worklist picker is now a typeahead. Long titles truncate, and the "N left" count stays visible.
  • Phones have a Worklists view at /m/worklists for reading and working through agent-built lists.
  • Tapping a Forge kenn:// link on Android opens that page in the Forge app.
  • On a phone, the menu in an open terminal or chat has Delete workspace.
  • The sidebar workspace menu can run a quick action, stop all sessions, or pull remote changes across several selected workspaces at once. Pulls skip workspaces with uncommitted changes or local commits and list them.
  • Drag workspaces to reorder them within Pinned or a repository group in the sidebar.
  • Quick actions that start an ACP agent can set the chat's model, effort, mode, and other agent options. Set them in settings or under [quick_actions.acp_options] in config.toml. The quick actions settings page is now a compact list, and each row expands to edit and says what it still needs before Save works.
  • Type in the composer's model chip to search for a model.
  • Agents can show local images, video, and audio inline in a chat with the new kenn_forge_show_media tool. Videos play in the chat.
  • Agents can read merge queue state through Forge MCP. A new merge_queue: true filter on kenn_forge_list_pull_contexts lists every queued or removed pull request.
  • Create a workspace at an exact commit with source_revision, so repeated agent runs use the same source. Set disable_forge_tools to run an ACP agent without Forge's tools.
  • A fleet spoke the hub cannot reach directly, such as a laptop behind NAT, now keeps a tunnel open to its hub. Its workspaces, terminals, and remote actions work from the hub.
  • Devbox agents can push to a contributor's fork branch of an organization pull request when maintainer edits are allowed. Writable devbox accounts can push .github/workflows changes once the App has Workflows write. Read-only service accounts can start the broker, and service assignments can set worker_github_user_id so owners can connect to workers that run under an App bot.
  • kenn-forge rate-limits and the /rate-limits response break hourly spend down by discovery, watched PR refresh, detail, and archive work.
  • With OTEL_* export turned on, traces now show workspace setup stages, subprocesses, chat starts, and every outgoing HTTP call as separate spans. Browser spans join the server spans for the same request. make otel-lgtm starts a local Grafana stack to view them.

Improvements

  • Forge no longer has manual kanban states for pull requests and issues. The status selectors, filters, grouping, API fields, CLI filter, and MCP tools are gone. Upgrading permanently deletes stored kanban values.
  • Chats nobody is using park their agent after 30 minutes and reload on the next message, which frees memory on busy hosts. Concurrent chats of claude-agent-acp, codex-acp, and omp share one agent process on Linux and macOS, so a new chat skips the agent's cold start. Warm agents survive Forge upgrades. If a shared agent is slow or stuck, the chat starts an agent of its own.
  • Opening a workspace or chat no longer waits for an agent to start. A chat opens from its saved transcript, and the agent starts when you send a message. A slow start in one workspace no longer holds up others. A shell stopped while idle starts again only when its pane is shown.
  • Enter clears the chat composer at once, and every message the agent accepts runs. Messages that haven't arrived yet show as pending and resend after a reconnect. A refused message stays as "Not sent" with Retry and Edit.
  • The chat's top bar is gone. A spinner beside Stop shows a reply in progress, and status text sits by the composer. Claude chats read Working while a background command runs.
  • A chat always shows its conversation, a loading state, or an error with Retry, and recovers on its own when the daemon answers. A failed chat start shows the agent's own error right away. A stuck agent reads "Agent not responding. Try again in a minute."
  • Cold Codex chats start about 300 ms sooner.
  • A chat left behind an older agent after a Forge upgrade reopens from its saved conversation. Its queued prompts run in order on the next message.
  • Workspace guidance tells agents when their pull request is part of a stack, lists every layer, and says how merging works for that stack.
  • Forge MCP instructions and tool descriptions are 72% shorter. In replay tests agents made fewer redundant gh reads and stopped launching a second agent after a spawn timeout. Empty searches now explain why and suggest retry arguments, and lowered limits are reported.
  • MCP tools accept a repository object copied from any Forge listing and say which extra fields they ignored. Item reads work without the repository's numeric ID or host.
  • A disabled Merge button now says why under the actions. For a GitHub rules block it links to the pull request on GitHub.
  • The merge button follows what GitHub reports for the account that merges. This matters in setups where a read-only GitHub App syncs and your own token merges. While required checks run, Forge offers only "Merge after CI". People who can bypass the rules can tick a bypass box, and GitHub now receives that choice. The rules warning appears only when the rules actually block your merge.
  • The CI list shows required checks that never reported and workflow runs that failed before starting a job, and the CI summary no longer reads green when they block a merge.
  • Merging from a list or worklist menu no longer blocks the list. Each row shows Merging until its merge finishes.
  • Merges on GitHub.com finish sooner because Forge notices completion faster. Forge never polls faster than once a second.
  • A failed deferred merge toast has an Open pull request button.
  • The merge dialog has one primary button with shorter labels, and it fits on a phone. In narrow layouts a merge already waiting for CI reads "Waiting".
  • With an issue open, new GitHub comments show within about a minute.
  • Opening a pull request refreshes the rows around it, its stack, and pull requests checked out in your worktrees, using batched reads.
  • The status bar shows "N repos failing" when a tracked repository keeps failing to sync, and the tooltip lists each error. The sync counter shows "refreshing details" instead of looking stuck one short.
  • The Closed and All tabs of the PR and issue sidebars load the 200 most recently active items, with Load more for the next 200. On 100,000 issues the Closed tab opens in 0.38 s instead of 5.9 s.
  • Large stores load much faster. Some examples from the measurements:
    • Activity feed: up to 1.7x faster to load. Polls with nothing new take about 2 ms instead of 500 ms at 200,000 items, and the Involves me feed on a very busy pull request drops from 70 s to 46 ms.
    • Starred lists: under 100 ms.
    • Repositories page: about 1 s at 1.8 million cached items, down from 15 s.
    • Notifications with 50 tracked repositories: 70 ms instead of 20 s.
    • Mention and # suggestions: they no longer slow down as history grows.
    • gh pr list inside a workspace: about 1 ms at 100,000 pull requests.
    • Pull request diffs: about 70 ms in a repository of 100,000 files, down from 5 s. Commit line counts in large trees take milliseconds.
  • Pull requests open without waiting on background database writes or rate-limit bookkeeping, and they render sooner from the list.
  • Open windows no longer re-read every list on each change event. On busy daemons this frees most of the CPU, and lists still update within 5 seconds.
  • Busy workspace terminals use far less CPU.
  • Forge spends much less GitHub quota. Unchanged CI checks, repository metadata, and the open lists of large repositories are revalidated for free. Open-list validators are kept across restarts. Watched and active pull requests are checked in batches. In small repositories one changed pull request costs about 1 GraphQL point. Optional background work is spread across the hour, so watched pull requests keep refreshing late in the hour.
  • A GitHub host that hit a rate limit or network error during daemon startup now comes back on its own. Until then, the pull request view says the provider is unavailable and when Forge will retry.
  • Start several workspace deletes while others run. The delete dialog closes on confirm, and the row shows its progress.
  • Light mode has off-white reading panes on a warm-gray canvas, clearer muted text, and brighter status colors. In dark mode the selected sidebar row is easier to spot.
  • Label chips on pull request and issue rows show whole. Chips that don't fit count toward the +N badge.
  • Detail and chat columns no longer shift sideways when a scrollbar appears.
  • Long context menus grow to 80% of the window before they scroll.
  • Clicking a launch target in "Launch a session" no longer shifts the panel. The card shows a spinner.
  • Markdown videos show their length and first frame before you press play.
  • Phone review forms, pickers, and the Run workflow menu open as modals that stay on screen.
  • Manual workflows that use newer GitHub workflow syntax now parse and list their inputs.
  • In diffs and commit line counts, a file copied from an unchanged file now shows as added. Renames show as before.
  • Landed-work analysis credits more squash merges, including stacked pull requests and pull requests that got a push right before merging.
  • kenn-forge repos summaries replaces kenn-forge repo-summaries. The old name still works for at least one release and prints a warning. Help for serve, daemon start, and the quickstart commands now explains how they relate.
  • kenn-forge daemon start and daemon restart stop as soon as the background daemon dies and print its error, for example a port already in use. They used to wait 90 seconds and print "context deadline exceeded".
  • Ctrl-C now stops archive and api CLI requests, kenn-forge gh queries, and the GitHub App CLI commands.
  • Telemetry keys are now set at build time. make build and make install from a release tag report usage like a release. Plain go build and test builds send nothing. Packagers can override the key with POSTHOG_PROJECT_KEY= or turn telemetry off with the kit_posthog_disabled build tag.
  • The API document marks UUID fields with format: uuid. Chat transcripts mark where each turn starts and how it ended. PR and issue list endpoints accept a numbers parameter, and the PR list accepts a merge_queue filter.
  • The first start after upgrading runs several database migrations. On very large stores this can take tens of seconds. In a fleet, upgrade the hub first. Until it is upgraded, kenn_forge_find_review_candidates fails on upgraded spokes.

Bug fixes

  • Selecting Ready for review and Passing CI together no longer lists pull requests with failing CI. Options within one group still match either, and every selected group must match. Involves me plus Failed CI now shows only failing pull requests that involve you.
  • A pull request whose only failures are cancelled, replaced GitHub Actions runs now shows green CI.
  • Plain GitHub merges no longer fail with "an asynchronous merge request is already in progress" while an earlier merge is stuck.
  • Worklists no longer show merge-queued pull requests as open work. They no longer count old comments as new.
  • The "Removed from queue" warning clears after a new push.
  • Following a link to another item on the same worklist keeps you in the worklist.
  • Stack links in the pull request pane respond to clicks when a workspace pane appears or disappears.
  • Launching an agent from an issue works after the issue's branch opens a pull request.
  • Pull request details stay fast when GitHub's user lookup is slow or failing.
  • Agent status badges survive a daemon restart.
  • Saved labels, assignees, and reviewers no longer vanish when an older refresh arrives late.
  • PR and issue lists with more than about 32,000 items load instead of failing with "too many SQL variables".
  • Bulk quick actions retry workspaces that failed to set up instead of skipping them.
  • Saving settings as an Enterprise user keeps github.com repositories on the right host.
  • Workspace creation no longer fails while Forge prepares a spare checkout.
  • Workspaces for fork pull requests show the right number of unpushed commits.
  • Forge recognizes orphaned workspaces with Git 2.56.
  • Dragging a terminal selection past the edge keeps scrolling to the first line.
  • Diffs no longer show the word "undefined" on a blank last line.
  • Agents started in workspace terminals can authenticate to Forge MCP when [api].require_auth is on.
  • Remote MCP clients reaching Forge through Tailscale Serve get the right MCP URL. A blank MCP port now always means Forge's own port. If your config has enabled = true and no port, MCP moves from the backend port + 1 to the backend port after restart. Set port to keep a separate listener.
  • Agents on execution workers can list repositories and search items without crashing the worker. Clients can read an execution worker's ACP options before launching an agent. Workers that use GitHub App bot identities start again.
  • The relay reconnects after a laptop sleeps instead of staying disconnected for hours.
  • kenn-forge daemon start reuses a daemon running in a sandbox with its own PID namespace. daemon stop no longer signals an unrelated host process because of a sandboxed daemon's record.
  • On Windows, a terminal session no longer looks alive after it exits.
  • GitHub discovery archives resume after repository ID conversion finishes, without another restart.
  • Tapping a Fleet workspace's pull request number on a phone opens the linked item.
  • Merge controls on Activity stay visible on slow connections and say when merge settings are still loading.
  • Fresh source builds no longer fail with unknown revision v2.0.1 for the terminal dependency.
  • Mistyped non-GET requests to app pages return 404 instead of 200 with HTML.
  • Response compression uses Brotli v1.2.7 with upstream security fixes, and golang.org/x/net moves to v0.62.0 for a security fix.