Skip to content

v1.4.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 09:18
· 95 commits to main since this release
v1.4.0
cee9e93

Added

  • README section "Upgrading from 1.3.x": the one-link-per-pair rule for link, and refreshing agent instructions with xpo init / xpo doctor --fix (xpo-4659c8)
  • Board cards: the assignee avatar is now an assignee picker button. Unassigned cards show a muted dashed placeholder avatar. Press a on a focused card to open the picker (xpo-5afd82)
  • Backlog rows: the assignee avatar is now an assignee picker button, like the status, priority and estimate cells. Unassigned rows show a muted dashed placeholder avatar instead of nothing, so the column stays aligned. Press a on a focused row to open the picker (xpo-dcd4f6)
  • The issue Activity section reads as a timeline: a vertical rail runs through the avatar column and joins consecutive events and comment cards. When an event row wraps, its continuation lines now indent under the name instead of running under the avatar. Comment bodies (new .prose-activity class) and the comment box are now 14px instead of 15px (xpo-a1470f)
  • overwrite for the MCP link tool (--overwrite / "overwrite": true in the CLI): replaces an existing link of a different kind between two issues, whichever side stores it; the output lists what was replaced (replaced, and e.g. Linked xpo-a relates_to xpo-b (replaced blocks)) (xpo-c93b11)

Changed

  • Two issues can have at most one link between them. link on an already-linked pair fails unless overwrite is set, and add/update reject a links set with two entries for the same issue (create previously had no duplicate check). Pairs recorded before this rule keep working until a write changes them. unlink now takes its own UnlinkToolInput (xpo-c93b11)

  • Issue sidebar relations overhaul:

    • Relationships button: the Parent property becomes a flag-icon Relationships button ("No relations" / "N Relationships", where the parent counts as one). It opens a popover menu that replaces the Add relation modal:
      • Remove parent comes first when the issue has a parent.
      • Then Parent of…, Sub-issue of…, Related to…, Blocked by…, Blocking… and Duplicate of….
      • Then More ▸, holding Depends on…, Dependency of… and Duplicated by….
      • Picking a kind leads to an issue search with one-line titles.
    • Relations card: relations are grouped into per-kind sections worded from the viewed issue ("Blocked by" / "Blocking"). Each linked issue is a chip that shows × on hover and a 250 ms preview card (ID, assignee, title, status, priority). Right-click offers Change to ▸ (change a link's kind in place), Remove relation and Copy link. Clicking a chip opens the issue, and a Waypoints button on the card opens the dependency graph (xpo-903ca3)
  • One attribution rule across the web UI: when an agent acted on behalf of a person, their name renders with a dashed underline and reveals the agent on hover/focus (and to screen readers); direct actions render plain. Applies to the issue Activity timeline (events and comments), Merge view comments, Dashboard activity feed, Timeline, Inbox change summary and the sidebar assignee via a shared ActorName component. Replaces the spelled-out "Claude Code on behalf of Name" comment headers, and the Inbox now shows the principal instead of the raw agent (xpo-a9560c, xpo-6e0026)

Fixed

  • Board popovers opened with s, e and l (and the new assignee picker) now anchor to the focused card instead of the board's top-left corner (xpo-bfca2d)

  • Board keyboard navigation no longer focuses cards in hidden or collapsed columns. With Backlog hidden, j now focuses a visible card and shows the focus ring (xpo-93efdd)

  • Issue detail property popovers are now accessible:

    • Shared pickers: status, estimate, priority and assignee use the shared Menu-based pickers instead of hand-rolled lists. Menu owns their keyboard navigation, so number shortcuts also work for estimate and priority.
    • ARIA: every sidebar property trigger exposes aria-haspopup="menu" and aria-expanded, and each picker menu has an aria-label. Single-choice pickers (status, priority, estimate, cycle, assignee) announce their options as menuitemradio via a new MenuItem radio prop. Multi-select menus keep menuitemcheckbox.
    • Assignee: a new shared AssigneePicker is used by the sidebar and the context menu. "Remove assignee" becomes a "No assignee" option with a dashed placeholder avatar, checked when nobody is assigned.
    • Look: picker menus have an even 4px inset, and checked options show in primary text (xpo-c8eaf4)
  • The issue detail view shows a single scrollbar on devices with classic scrollbars, instead of three. The page no longer scrolls: Layout and ViewContainer's scroller are relative, so ActorName's sr-only text can't extend the document. The property sidebar is capped to the pane's height (100cqh) instead of the viewport. It hides its scrollbar and fades its bottom edge while more content is below. The global scrollbar styles moved into @layer base so utilities can override them (xpo-fe51ab)

  • Status icons in the issue sidebar's Relations card no longer shrink next to long titles; StatusIcon now always applies shrink-0, which fixes every flex-row call site (xpo-334821)

  • MCP merge records the MERGE event and DONE transition as the agent acting on behalf of the user (created_by agent, on_behalf_of principal) instead of as the configured user; MergeIssue and ResolveReviewIssue now sync the client identity to the transport (xpo-40ab84)

  • The issue-detail artifact list shows the principal with the dashed-underline agent attribution instead of the raw agent identity; artifacts now carry on_behalf_of from their latest write in the HTTP API and CLI/MCP JSON output (xpo-61ff1e)

  • The Dependencies view shows each relates_to link once (table row and graph edge) instead of twice; its derived inverse is now deduplicated as an undirected pair. A relates_to between two issues that also share a blocking/duplicate link is hidden as redundant, and cycle detection only considers blocked_by/depends_on edges, so relates_to no longer produces false cycle warnings (xpo-2fc583)

  • The Dependencies table search trims its query: leading and trailing whitespace no longer cause missed matches, and a whitespace-only query shows all rows like an empty search (xpo-3d9d5a)

  • xpo demo no longer assigns issues to agents with no person behind them: agent work is assigned to a human (Claude for Sarah, Devin for Jake, Whiskers for Luna) with the agent as assignee_via, agent events carry on_behalf_of, and agents are left out of the demo contributors (xpo-53daa5)

  • The Dependencies graph dims nodes and edges outside the focus/hover set less (nodes 0.55, edges 0.4, DONE 0.7), so dimmed labels and ids stay readable; opacity now comes from dep-dimmed/dep-done CSS classes backed by --dep-*-opacity variables in index.css instead of inline styles (xpo-aab636)

  • xpo link, xpo link --json and the MCP link tool share one Client.Link helper and return identical "already exists" and self-link errors (xpo-f94753, fixed by xpo-c93b11)