v1.1.3 is a feature-weight release: automations get a ground-up rewrite, the rebase/merge surface moves out of a modal into its own URL-routed tab, Work sessions can now run in parallel across multiple models from a single prompt, Work panes tile instead of pack, and the ADE CLI becomes usable from a freshDocumentation Index
Fetch the complete documentation index at: https://ade-app.dev/docs/llms.txt
Use this file to discover all available pages before exploring further.
gh auth login without duplicating credentials. Windows port foundations land alongside — not shipped to users yet, but every cross-platform seam the desktop needs is in place. The iOS app gets a large polish pass across Files, Lanes, PRs, and Work, and moves to TestFlight build 4.
Automations
The automations page is now a proper rules engine. Triggers are modelled asgithub.* / linear.* / schedule.* / local-git.* families; actions can be ADE Actions, agent sessions, or launch-mission runs; and each rule has its own per-rule history panel instead of a shared feed.
- GitHub polling triggers. A new
githubPollingServicewatches issues, PRs, comments, and reviews on every configured repo. Comment cursors usecreated_at#idfor stable ordering, and review cursors usesubmitted_at#review.id— two reviews submitted in the same ISO second no longer race each other off the cursor and get dropped. - ADE Actions registry.
apps/desktop/src/main/services/adeActions/registry.tsis the single source of truth for what an automation is allowed to invoke. Domains are exported asADE_ACTION_DOMAIN_NAMES, andadeRpcServerderives itslist_ade_actions/run_ade_actionenums from that list — we no longer advertise ~25 domains that had no registry backing, and the actually-implementedautomationsandissuedomains are now visible. - Role-gated CTO methods.
run_ade_actionrefuses CTO-only methods (Linear/GitHub credential set/clear, budget config, feedback drafts, usage start/stop, quit-and-install, flow policy, Linear sync queue ops, Linear ingress relay setup) when the caller is in an agent role. UI-state writes (layout.set,tiling_tree.set,graph_state.set) now reject calls missing the payload key instead of silently persisting{}/null. - Branch filters on PR events.
isPrCanonicalcoversgithub.pr_opened,pr_updated,pr_closed,pr_commented, andpr_review_submitted, so rules with abranchfilter actually match PR-comment and PR-review-submitted events instead of falling through to an undefinedlaneBranch. pr_updatedcontent gate.hasPrContentChangestopsgithub.pr_updatedfiring on pure discussion changes; the snapshot is also now written after the cursor is initialized so the very first poll cannot re-dispatch every existing PR.- Null-safe placeholder expansion.
resolvePlaceholderstreatsnullthe same asundefinedfor whole-match paths — a prompt that is exactly{{trigger.pr.body}}with a null body now resolves to an empty string instead of letting the literal template leak into the agent prompt. issue_edited+issue_labeledcoexist. Both fire when a label change and a title/body edit land in the sameupdated_attick.- Settings moved. Budget, usage, and cost UI moved out of the Automations page and into Settings; the Automations page is now exclusively rules.
Parallel multi-model lanes
Composer gained a multi-slot launcher. Pick N models, type one prompt, and ADE spawns one child lane per slot, starts a session, sends the prompt, and drops you into a Work-focus tiling that shows every lane running side-by-side.- AI-suggested lane names.
suggestLaneNameFromPromptruns through the existing prompt runner and falls back to a deterministic slug if the model call fails. No empty names, no model-suffix collisions. - Crash-recovery persistence. Parallel launch state (creating_lanes → sending → sent) is persisted to
kvDbasagent-chat-parallel-launch; a crash mid-launch is visible on the next start instead of leaving half-created lanes invisible. - Steer fallback on partial-send. Lanes whose first
agentChat.sendhits an already-active turn retry viasteer; lanes that already succeeded are preserved across later failures rather than being force-deleted alongside un-sent lanes. - Work-focus layout.
LanesPageadds multi-lane deep-link selection (?laneIds=…&workFocus=1) and aWORK_FOCUS_TREEtiling that only applies once every requested lane has appeared — no flicker, no signature replay. - Integration lane origin tracking. PRs can now adopt an existing lane as the merge target instead of always creating a new child;
integrationLaneOrigin+preferredIntegrationLaneIddistinguish adopted vs ADE-created integration lanes so cleanup/delete treats them correctly.mergeIntoLaneIdsimulates starting from that lane’s current HEAD.
Rebase and merge tab
The old rebase/merge modal is gone. It lives in its own URL-routed workflow tab (?tab=workflows&workflow=rebase) so you can link directly into it, navigate back/forward through browser history, and keep state across reloads.
- Memoized initial route read.
readInitialRouteStateinPrsProvidershares a singlewindow.locationparse across four state initializers, and mirrors the post-effectresolveRouteRebaseSelectionlogic so the initialselectedRebaseItemIdhas the same shape as the value the first effect would compute. - Hash wins over search. For BrowserRouter mock-mode URLs like
?tab=workflows&workflow=queue#/prs?...&workflow=rebase, the hash’sworkflowtakes precedence. - Lane filters survive late-arriving lanes.
useWorkSessionsholds off cachingappliedUrlFilterKeyRefwhen alaneIdfilter is requested but lanes haven’t loaded yet, so a later populated render can still apply it instead of early-returning. - QueueTab → Rebase tab.
openRebaseTabactually navigates to the Rebase workflow URL rather than only flipping local state. - Labels normalized. “Open Rebase/Merge tab” uses sentence case everywhere it appears.
Work pane tiling
The packed Work session grid is replaced withPaneTilingLayout, backed by a pure paneTreeOps module (reconcile, detect-drop-edge, flatten-single-child, remove-pane, swap, validate). Layouts persist under work:grid:tiling:v1: and seed from workSessionTiling.ts.
- Streaming-aware tool groups. Tool cards that are still streaming inside a group auto-expand (
localExpanded || running), so mid-stream progress doesn’t disappear into a collapsed group hint. - Codex thread state reuse. Rehydrating Codex effective thread state reuses the existing persisted approval/sandbox normalizers instead of re-implementing them.
- Serialized permission-picker updates.
pendingNativeControlUpdateRefserializes rapid native-permission toggles so back-to-back updates don’t stomp each other’s session summaries. - Unit coverage: 28 tests for
paneTreeOps, 8 forworkSessionTiling.
Identity session policy
Sessions pinned to an identity (agent:<id>) now refuse to bind to a foreign lane, and the full-auto permission mode is enforced at both create and update time.
- Strict primary-lane resolution.
registerIpcandsyncRemoteCommandServiceuseresolvePrimaryLaneIdOnlyfor CTO/agent identity ensure-session flows — no morelanes[0]fallback that silently attached an identity session to the first available lane. - Create/update/resume parity.
createSessionstrips every permission/sandbox/interaction-mode field from a pinned-identity payload before native-permission derivation runs.updateSessiongates those fields behind!identityPinnedso a stricter native mode can’t layer on over IPC.resumeSessiondetects rows whoselaneIddrifted, rewrites them viasessionService.updateMeta, and re-hydrates before spinning up the runtime. isPrimaryPinnedIdentityrequires a non-empty trimmedagent:<id>suffix;guardedIdentityPermissionModeForProvideris module-local.- Error strings normalized to “primary lane” across main and renderer copy.
ADE CLI
The CLI is now usable in an environment with onlygh auth login, and its RPC surface matches the desktop’s action registry instead of drifting from it.
- GitHub token fallback chain.
ADE_GITHUB_TOKEN → GITHUB_TOKEN → GH_TOKEN → gh auth token. The headless CLI can’t read desktop’s ElectronsafeStorage-encrypted token (different bundle identity), so it now reads fromgh auth tokenas a last resort. If none returns a token, the existing “missing token” error points atgh auth login. - Project root = workspace root by default. When
--project-rootorADE_PROJECT_ROOTfixes the project root,workspaceRootdefaults to that path unless explicitly overridden. hasHelpFlagrespects value-carrying flags. ~120 long-flags that take a value (including-qfor files/memory search) are treated as value carriers, so--helpafter a pending-value flag is handed to the flag instead of triggering help.- Integration lane provenance. Only flag an integration lane as “adopted” when
preferred_integration_lane_id === integration_lane_id; mismatched scratch lanes stay “ade-created” so cleanup/delete can remove them. - PR row handoff cleanup.
prService.upsertRownullsintegration_proposals.linked_pr_idalongsidepr_group_memberswhen a PR row moves lanes, so old integration workflows don’t silently track the new lane’s PR status. - No duplicate guidance.
promptInspectordedupes theADE_CLI_AGENT_GUIDANCEblock;agentChatServiceskips first-user-message guidance injection for Claude sessions (the system prompt already carries it). - Tighter duplicate-PR matching. The error-message match is tighter so an unrelated GitHub error is no longer treated as “PR already exists”.
Windows port foundations
Not shipped to end users yet — this is the seam work that the Windows build will need.- Portable process/CLI launching.
processExecutionswitches to acmd.exewrapper with safe argument quoting on Windows.cliExecutableResolverhandles case-insensitive PATH lookups and PATHEXT-aware extensions. - MCP over named pipes. The named-pipe path is derived from a realpath hash so case-variant paths collapse to one pipe while genuinely distinct directories get distinct pipes.
- ADE CLI Windows launch. The headless runtime augments
PATHwith shell + known CLI directories; the lane runtime env slot is derived fromsha256(laneId)so it stays stable across lane archival and reordering. - Tailscale CLI resolution. Default Windows install paths are probed in
resolveTailscaleCliPath. - PowerShell tokenizer. Doubled single-quote escapes are handled.
- CI. Vercel preview builds are skipped when
apps/webis unchanged so the Vercel free tier isn’t burned by desktop/CLI PRs.
Project open + stability
- Deferred background tasks on open. Project opening no longer blocks on background services starting; they come up lazily behind the first project-open frame.
- Pinned per-session terminal runtime.
TerminalViewpins per-session runtimeprojectRoot/revisionso a lateprojectRootnull→value transition doesn’t flap the cached runtime and force a reconnect.
iOS
Large polish pass across the five root tabs; no marketing-version bump (still 1.1.1), build moves to 4.- Streaming-duplication collapse. Legitimate
...ellipses survive: dots are halved only atrunLength >= 4, so real ellipses in assistant text render correctly. - Live/waiting chip accounting.
globalLiveSessionCountexcludes awaiting-input sessions, so the “N live” chip no longer overlaps the “N waiting” chip. Run-owned sessions are also excluded from global live/attention counts and scroll targets so the Work root counts match the visible tiles. - Repository PRs header. The dynamic
owner/reposection title is restored, with “Repository PRs” as the fallback. - Attention lanes. Dropped the
prefix(3)on the review section ofLaneListViewParts— all attention lanes render, not just the first three. - Pull-merge copy.
LaneSyncDetailScreenconfirmation copy matches the actual fast-forward-only semantics. - External PR rows are read-only.
PrRowCardandPrsRootScreengate the unmapped chip and Link-PR sheet onscope != "external"— external rows stay read-only instead of offering actions that can’t apply. - Files workspace preserved across jumps.
FilesRootScreensuppresses the workspace-reset that previously fired before cross-workspace jumps fromrequestedFilesNavigation. - Residual-overlap scan.
mergeWorkStreamingTextnow carries a note explaining why the residual-overlap branch is hit rarely, so future readers don’t treat it as dead code.
Other
- Better bot coverage in shipLane.
/shipLanenow requires both CI and all review bots (Greptile, CodeRabbit, Copilot) to be terminal before iterating, with a documented 12-minute wait floor. Less polling noise, fewer premature iterations. /releaseslash command. The end-to-end release flow is now a first-class slash command: scope detection, changelog generation, tag + push, workflow polling, iOS TestFlight upload..gitignore..asc/artifacts/is anchored with a leading/so only the top-level directory matches; trailing slash dropped onnode_modulesso nested matches work under BSD-style ignore parsing.release-core.yml. Release workflow updates for the new version surface.- Tests added for identity session policy (create/update/resume parity, non-identity fallback),
adeRpcServerdynamic action listing,automationServicetrigger matching, and orphan-lane ordering edge cases.