v1.1.5 builds the two-way pty bridge so an iOS device can drive a desktop shell, ships bulk session management (select / archive / restore / export to markdown) on both desktop and iOS, lands an onboarding tour rewrite plus a one-shotDocumentation 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.
ade install that wires up your shell PATH, and fixes a class of mobile-sync regressions where switching projects would mis-flag healthy reconnects as failures. iOS gets a full liquid-glass pass across Lanes, Work, Files, CTO, and AttentionDrawer, plus desktop feature parity for lane templates, multi-attach, branch picker, and a pan/pinch stack canvas. The release pipeline fix that was held back from v1.1.4’s draft (publish-release needed --repo to gh) lands here. Ships in TestFlight build 7 of 1.1.1.
Desktop
- Two-way pty bridge.
ptyServiceexposeswriteBySessionId/resizeBySessionIdso callers don’t need to know the internalptyId.syncHostServicehandles newterminal_inputandterminal_resizeenvelopes from iOS, gated behind a priorterminal_subscribeso only attached peers can drive a shell. The wire protocol now flows in both directions: desktop→iOS keepsterminal_data/terminal_exit, iOS→desktop addsterminal_input/terminal_resize. - Bulk session select / archive / restore / export. Long-press or the Select context menu in the Work view enters bulk-select mode; the action bar exposes Close, Archive, Restore, Delete, and Export. Export writes markdown transcripts via the new
transcriptExporthelper. Works across both chat and terminal sessions. - Bulk discard for staged lane changes. New action in
LaneGitActionsPanelets you drop all staged changes on a lane in one shot. ade installshell-profile wiring.adeCliServicenow installs the ADE CLI onto yourPATHby editing the right shell profile: bash/zsh get an export line, fish gets explicitfish_add_pathin~/.config/fish/config.fish. ReturnsShellPathResult { profilePath, modified }so the caller can distinguish “added” vs “already present” instead of always claiming success.- Onboarding tour revamp.
firstJourneyTourand the per-feature tours are rewritten end-to-end. Detail-drawer steps now carry fallback selectors and dispatchade:tour-pr-detail-tabto switch tabs in-flight, so a user can never get stuck on a tutorial step. Pinned withprsTour.test.tsandfirstJourneyTour.test.ts. - Project-switch sync correctness.
main.tsgates sync-status broadcasts to the active project and nulls thesyncServicewhen there is no active project, so a switched-away project can’t keep emitting status.TopBarnow refetchessync.getStatuson project switch via aproject?.rootPathdep.SyncService.initialize()coalesces concurrent calls (initializingPromise+initializedflag) so a fast project switch on mobile doesn’t double-initialize. - Plan-approval turn safety.
agentChatServicedefers the post-approvalsendMessage, approval delete, andemitPendingInputResolveduntil the current turn is idle via apendingPlanFollowupsqueue. Cancelled on teardown, abort, or process exit. Atry/finallyaround the deferredsendMessagemakes sure we never strand a half-approved plan. - Reasoning-effort sequence guard.
AgentChatPanenow sequences reasoning-effort changes with rollback on stale or failedupdateSession, so a slow ASC round-trip can’t clobber a newer choice. - OpenCode listener-pid recovery.
openCodeServerManagerrecovers servers from orphaned ports by listener-pid; whenlistenerPid === proc.pid, the listener-PID kill is the sole signal — only fall through tostopChildProcesswhen they differ. - PTY title fallback. Hardened to a deterministic CLI placeholder so a brand-new shell never renders an empty title.
ExitPlanModebehaviour. Flipped tobehavior:"allow"so the SDK’s native handler runs, removing a layer of indirection that was eating the resume signal.getOptionalSyncServiceresolver.registerIpcrouteslanesListandapnsSendTestPushthrough a single resolver that respects an injectedgetSyncServicenull result instead of falling through toctx. Keeps tests honest about which projects have sync wired.- PTY resume target backfill on launch. When relaunching a tracked CLI session whose
resumeMetadatais missingtargetId,ptyServicenow runstryBackfillResumeTarget("resume-launch")before spawning so the new pty starts on the correct resume command instead of cold-starting. Replaces the prior warn-only branch. - Per-project route memory.
AppShellpersists each project’s last-visited route tolocalStorageand restores it on project switch, instead of always slamming/work. Allowed roots only — falls back to/workfor anything unrecognized.
/shipLane runbook fixes
Four fixes learned from running/shipLane end-to-end on PR #197.
- Wait for both signals before fixing. Review-comment edits routinely cause new CI failures, so applying them on a partial signal wastes the prior CI cycle. The “one push per iteration” guidance now spells out the why and the parallel-dispatch flow.
- UTC-normalize SINCE.
git show --format=%cIreturns local-tz strings; GitHub returns…Z.jq’s string compare on04:52:10-04:00<08:52:10Z(lexicographic) silently flagged every old comment as new. Phase 1.2 now pipes through python’sastimezone(utc).strftimeso the filter is correct. - Done-clean means merge, not stop. New Phase 3c (auto-merge) with squash →
--admin→--autofallback chain. Phase 5.2 + Exit-states routes the iteration cap through 3c; only lands indone-maxwhen all three merge paths are genuinely blocked. - Don’t pass
--delete-branchtogh pr merge. It triggers a local checkout that fails whenmainis in another worktree (always true for/shipLaneruns from lane worktrees). Phase 3c.4 now documents server-side ref delete viagh api -X DELETE.
Release pipeline
publish-releasejob passes--repoto gh. v1.1.4’spublish-releasehad noactions/checkoutstep, sogh release view/upload/createall failed withfatal: not a git repository. Pass--repo $GH_REPO(=github.repository) to all three calls. No checkout step added — the publish job only needs the downloaded artifacts plus gh.
iOS
iOS picks up the desktop pty bridge, the bulk-session work, and a focused liquid-glass pass across every root tab. Ships in TestFlight build 7 of 1.1.1.- Terminal input from the phone.
SyncService.sendTerminalInput/sendTerminalResizemirror the new desktop wire surface.WorkTerminalSessionViewgains a bottom input bar (^C, command field, paperplane send) and an ANSI/CSI strip helper so the plainTextrenderer reads cleanly until SwiftTerm lands. - Bulk session management.
WorkRootScreen+Selectionadds the same long-press / Select bulk mode as desktop, with Close, Archive, Restore, Delete, and Export. Bulk restore/delete now track per-session success and only mutatearchivedSessionIdsStoragefor succeeded ids, so a partial failure never strands a session in the wrong bucket locally. - Lane templates picker.
LaneCreateSheetgains a templates picker with an env-init progress view that pollsfetchLaneEnvStatuswhile a template is applied — full parity with the desktop flow. - Lane multi-attach.
LaneMultiAttachSheetdiscovers unregistered worktrees and bulk-attaches them, with an optional adopt-into-.ade/worktreestoggle. Backed by a newlanes.listUnregisteredWorktreesRPC andUnregisteredLaneCandidatemodel. - Branch picker in lane actions.
LaneBranchPickerSheetis wired intoLaneActionsCard’s Advanced git disclosure forgit.checkoutBranch. - Stack canvas.
LaneStackCanvasScreenis a full-page pan/pinch-zoom stack canvas, presented from a new top-bar pill button next to+. - Switch-project null-connection is the success path. Desktop returns
connection:nullas the normal response on a project switch (the phone keeps pairing creds and reconnects). The previous rollback-and-throw turned every healthy switch intosetDomainStatus(.failed). Now:connection:nullkeeps the new active project, tears down the stale socket if live, schedulesreconnectIfPossibleunconditionally, and returnsok— clearinglastErrorand setting all domains to.disconnectedfirst so the UX shows “switching” instead of a stale “failed”. Genuine error catches still roll back. - Lane UI polish. Error cards use glass cards (no more raw danger backgrounds). Text wraps with
minimumScaleFactorand middle-truncation. Conflict resolution buttons fall back to a vertical stack on narrow widths viaViewThatFits. Sync tiles get thetintLanesaccent and breathing room. Status banner is a singleadeGlassCardinstead of layered modifiers. Disabled live-action buttons fade to0.55opacity. Stale.ultraThinMaterialin the manage-sheet busy overlay is replaced with a glass scrim panel. - Work liquid glass. Fixes
listRowInsetsso cards stop hugging screen edges (16pt horizontal). Activity feed pulse only animates the first row.withAnimation+scrollDismissesKeyboard.interactively. Glass effect + glass border applied consistently across the filter section, chips, count pills, queued steer strip/row, composer surface, new-chat composer, lane picker, model/runtime menus, reasoning card, tool cards, and command card. - CTO liquid glass + AttentionDrawer.
CtoTabShellsegmented picker gets glass + soft top highlight.WorkerRowCard: glass background + top highlight + thicker border.MiniActionButtonand the Hire-worker pill: glass + accent shadow.CtoWorkflowsScreen: 16pt horizontallistRowInsets, glass Sync-now, plusadeNavigationGlass.AttentionDrawerSheet: 24pt bottom safe-area +scrollBounceBehavior. - Files polish. Quick-open and text-search results capped at 40 with an overflow hint. Drops hardcoded
.padding(.bottom, 88)for.contentMargins(.bottom, 24). Tagline horizontal padding 18 → 16 for consistency. Glass effect on the proof artifact icon. - Deep-link graceful degrade.
DeepLinkRouter.resolvePrIdreturns nil when the numeric lookup misses the workspace snapshot, soPrsRootScreencan degrade gracefully instead of silently dropping the deep-link nav. - ADE error 26 on no-connection switch. iOS
SyncServicerolls back the active project and throws ADE 26 when aswitch_projectcall has no available connection (distinct from theconnection:nullsuccess path above).