feat(pipeline): render issue dependency DAG on the per-issue Monitor page #234

Closed
opened 2026-04-21 12:49:34 +00:00 by claude-desktop · 1 comment
Collaborator

User story

As an operator, I want a dependency DAG panel on /app/monitor/issue/:owner/:repo/:issueNumber that renders the current issue's blockers + dependents as a navigable graph, so I can see long chains at a glance and click through without scanning Forgejo body text.

Dependencies

  • Blocked by the Penpot mockup ticket (sibling). Ship against the approved design.

Acceptance criteria

Server

  • New endpoint GET /issues/deps?repo=…&number=N&depth=k (auth-gated). Returns { nodes: [{ number, title, state, assignee, labels }], edges: [{ from, to }] } for the k-hop neighbourhood (default depth=2, max=5). Uses the existing getIssueBlockers / getIssueBlocks wrappers.
  • 30 s cache keyed on (repo, issue, depth).

UI

  • New <DependencyGraph> component on routes/monitor.issue.$owner.$repo.$issueNumber.tsx. Hydrates from /issues/deps, renders per the mockup.
  • Compact inline version on the Pipeline list row (hover / expand affordance from the mockup).
  • Click node → router navigate; hover → tooltip.

Verification

  • Unit test: endpoint returns the expected DAG for a synthetic #A blocks #B blocks #C chain.
  • Playwright: load a known-dep issue, assert the graph renders + click navigates.

Out of scope

  • Cross-repo deps (single-repo for now).
  • Editing deps from the UI (read-only view).

References

  • apps/server/src/deps.ts — data source.
  • Companion mockup ticket — blocker.
## User story As an operator, I want a **dependency DAG panel** on `/app/monitor/issue/:owner/:repo/:issueNumber` that renders the current issue's blockers + dependents as a navigable graph, so I can see long chains at a glance and click through without scanning Forgejo body text. ## Dependencies - **Blocked by the Penpot mockup ticket** (sibling). Ship against the approved design. ## Acceptance criteria ### Server - [ ] New endpoint `GET /issues/deps?repo=…&number=N&depth=k` (auth-gated). Returns `{ nodes: [{ number, title, state, assignee, labels }], edges: [{ from, to }] }` for the k-hop neighbourhood (default depth=2, max=5). Uses the existing `getIssueBlockers` / `getIssueBlocks` wrappers. - [ ] 30 s cache keyed on `(repo, issue, depth)`. ### UI - [ ] New `<DependencyGraph>` component on `routes/monitor.issue.$owner.$repo.$issueNumber.tsx`. Hydrates from `/issues/deps`, renders per the mockup. - [ ] Compact inline version on the Pipeline list row (hover / expand affordance from the mockup). - [ ] Click node → router navigate; hover → tooltip. ### Verification - [ ] Unit test: endpoint returns the expected DAG for a synthetic `#A blocks #B blocks #C` chain. - [ ] Playwright: load a known-dep issue, assert the graph renders + click navigates. ## Out of scope - Cross-repo deps (single-repo for now). - Editing deps from the UI (read-only view). ## References - `apps/server/src/deps.ts` — data source. - Companion mockup ticket — blocker.
Collaborator

🤖 Auto-assigned to dev (heuristic: area:dashboard + body 1470 bytes (≤ 2 KB) — dev). Reply /unassign to reroute.

🤖 Auto-assigned to **dev** (heuristic: area:dashboard + body 1470 bytes (≤ 2 KB) — dev). Reply `/unassign` to reroute.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
charles/claude-hooks#234
No description provided.