feat(tasks): per-member PR/CI rows + update-all for multi-repo tasks - #352
Conversation
Adds az/azure-devops as a third forge alongside gh and glab: remote detection (dev.azure.com, *.visualstudio.com, ssh.dev.azure.com v3, vs-ssh), CLI + extension + Entra/PAT auth probing, PR status/policies/ comments, Azure Boards work-item listing and issue-task seeding, PR creation, IPC + frontend wiring, sandbox/Docker allowlisting, and docs. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…te-chip echo Codex 0.159 TUI fires sessionStart on the FIRST prompt submit, not at startup, so gating the seeded prompt on hook readiness guaranteed a timeout: every codex task ended in seed-blocked. hooksOwnStartupReadiness excludes codex from hook-owned startup readiness (work-state hooks still gate mid-turn), so it falls back to the painted-and-quiet heuristic with echo verification - which still refuses to submit into a picker dialog. Two stacked delivery bugs then surfaced on that path: the echo listener attached inside the text write's .then (an echo riding the write's own round trip read as 'did not echo' and withheld the CR), and the literal echo check never passes for multi-line prompts because codex renders a bracketed paste as a '[Pasted Content N chars]' chip - the chip IS the echo (a selection dialog can't draw one), so it is accepted for paste-wrapped sends. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
The card's identity row is all shrink-0 except the spacer; a fully
populated row (~330px) overran the 280px default right panel and the
window clipped the rightmost 'Open on' button. ReviewChip ('Changes
requested', the widest label) now truncates with a title fallback.
forge.rs: pr_status/pr_comments/issue_list/pr_create re-probe the CLI
path instead of the startup-time cache, so a CLI installed mid-session
works without visiting Settings first.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- az calls scope explicitly (--org/--project/--repository); --detect gone, so PAT remotes cannot silently resolve the wrong org - From a PR works for azure: pr list --creator me, pr show, per-provider fetch refspecs, fork PRs refused instead of fetching the wrong branch - Multi-pick issues seed ONE task; plural WORK_ISSUES_PROMPT tail with provider noun swap; unmodified builtins only, user edits win - agentSend: paste chip counts as echo again for wrapped sends, failure diagnostics restored; cliRpc inject gets readiness + echo verification - NewTaskDialog: stale guards on seed-object identity, pane exclusivity, !N ref parsing, branch latch; CreatePrDialog provider gating - visualstudio.com org URLs drop the collection path (extension rejects it); legacy _ssh remotes parse; sibling-project repo guard Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Multi-repo tasks polled PR state for the host worktree only; member repos' PRs were invisible everywhere. Member lookups now ride inside the existing pr.refresh() cadence (same triggers, allSettled so one dead remote can't freeze the other leg), keyed by each member's live branch in its own checkout - repo_root members track live HEAD instead of a frozen recorded branch. Rows render under the Git tab PR card and as board-card mini-rows, including main-checkout tasks where the host card stays hidden; a shared on_disk_members helper keeps status/member-PR/update-all enumeration consistent (existing paths, never the host twice). The branch-chip dropdown gains an "All repos" section: pull / merge base / rebase base across host + members in one shot via task_git_update_all, each repo on its own base branch, failures surfaced per repo without aborting the batch. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
# Conflicts: # src/components/dialogs/WelcomeDialog.tsx
simion
left a comment
There was a problem hiding this comment.
Verified locally on top of main once #351 was in: clean merge, cargo test 1216, npm test 2665, tsc -b and the e2e typecheck clean, git.e2e 75/75 on a rebuilt binary.
With #351 merged this reduces to its own single commit, which is what I reviewed.
The design calls I want to note as right, because they are the ones that would have been easy to get wrong:
Polling each member by its LIVE branch (git branch --show-current) rather than the recorded one. A repo_root member tracks whatever is checked out, and a frozen branch would have quietly reported another branch's PR as that member's.
Promise.allSettled for host + members, so one dead remote cannot freeze the other half. With a settled instead of an all, a single unreachable forge would have taken out PR status for every repo in the task.
Dropping member snapshots when the composition changed mid-flight. That is the kind of staleness nobody notices until a removed member's PR keeps rendering.
on_disk_members as one shared contract for "which members are real checkouts", used by status, member lookups and update-all alike. Three callers each deciding that separately is how they drift.
Thanks for this, and for splitting it from the forge work rather than leaving it in one branch.
|
Merged, by pushing the merge commit rather than the button: GitHub had this branch as CONFLICTING/DIRTY, but the merge is clean in both directions. Verified on that exact main before pushing: cargo 1216, npm test 2665, git.e2e 75/75, Thanks for splitting this out of the forge branch rather than leaving it as one diff. With #351 in first, this reduced to a single reviewable commit, which is the difference between reading it and skimming it. |
Summary
Multi-repo tasks only polled PR state for the host worktree — member repos' PRs/MRs were invisible on both the Git tab and the board. This adds per-member PR/CI visibility and a one-shot "update all repos" action.
Stacked on #351 — this branch is cut from
azure-devops, so the diff includes that work until #351 merges, then shrinks to this feature only.Per-member PR/CI
task_member_pr_statuscommand: polls each non-host member's checkout by its live branch (git branch --show-current), sorepo_rootmembers track what's actually checked out rather than a frozen recorded branch. Same remote→provider resolution and status vocabulary as the host lookup (github/gitlab/azure).pr.refresh()now fires host + member lookups together (Promise.allSettled) — a dead remote on one side can't freeze the other, and a failed member call keeps the last snapshot.repo · branch, state pill,#42/!42ref, CI chip, open-in-browser. Rendered for main-checkout tasks too (host card stays hidden there, so this is the only PR surface).+N more; board mount seeds discovery.prRelevant= host PR, or member PRs for main-checkout multi-repo tasks;MemberPrRowsruns its own tick only whenPrCardisn't mounted.setLookuplanding mid-refresh isn't clobbered by the stale response.Update all repos
task_git_update_all(id, mode): pull / merge-base / rebase-base across host + every on-disk member, each on its ownrepo_base_branch, via the existinggit_update_repo(fetch + autostash + conflict detection). Per-repo results; one failure never aborts the batch.on_disk_membershelper is the single contract for "which members are real checkouts" — skips missing paths and any legacy record pointing at the host — used bytask_git_status, member PR lookups, and update-all.Test plan
tsc -b,cargo check,cargo test— cleansetLookupraces, host-fail/member-okallSettled,prFocusEligible, Rust tests foron_disk_members+ live-HEAD member lookupsOut of scope (deliberate)
task_pr_createstays host-only), per-check CI details, remote picker, member PR background polling on unfocused tasks.Generated with Devin