fabro/apps/fabro-web/app/components
Bryan Helmkamp d09e6cde33
feat(pr): support GitHub pull request associations (#270)
## Summary

Adds event-sourced pull request association management for runs while
preserving Fabro-created PR creation. A run can now store a current
GitHub PR association, replace it by linking another GitHub PR URL, and
remove it through an unlink event.

## What Changed

- Added `pull_request.linked` and `pull_request.unlinked` events,
projection replay support, and optional PR metadata fields in shared
pull request records.
- Added API, server, and client support for `PUT
/runs/{id}/pull_request` and `DELETE /runs/{id}/pull_request`; linking
accepts GitHub PR URLs, infers owner/repo/number, and captures live
GitHub title and branch metadata when available.
- Added `fabro pr link` and `fabro pr unlink`, updated `fabro pr view`,
and kept create/merge/close behavior guarded to GitHub PRs with usable
coordinates.
- Updated web UI rendering and internal event docs so stored PR links
display cleanly when live GitHub details are unavailable.

## Testing

- `cargo +nightly-2026-04-14 fmt --check --all`
- `git diff --check`
- `cargo build -p fabro-api`
- `cargo nextest run -p fabro-types -p fabro-store -p fabro-server -p
fabro-cli`
- `bun run typecheck` in `lib/packages/fabro-api-client`
- `bun run typecheck` in `apps/fabro-web`
- `bun test` in `apps/fabro-web`

Refs https://github.com/fabro-sh/fabro/issues/235

---

[![Compound
Engineering](https://img.shields.io/badge/Compound_Engineering-6366f1)](https://github.com/EveryInc/compound-engineering-plugin)
🤖 Generated with GPT-5 via [Codex](https://openai.com/codex)

---------

Co-authored-by: Haroldo Olivieri <6575718+haroldolivieri@users.noreply.github.com>
2026-05-16 12:47:27 -04:00
..
stage-renderers refactor(core): simplify reviewed run cleanup 2026-05-10 22:53:20 -04:00
auth-layout.tsx chore(web): namespace static images under /images and skip in HTTP logs 2026-04-30 08:57:14 -04:00
collapsible-file.tsx refactor(web): drop light mode, go dark-only 2026-04-20 09:27:08 -04:00
editable-run-title.test.tsx feat(web): inline-edit run titles in the run header 2026-05-09 11:54:41 -04:00
editable-run-title.tsx feat(web): inline-edit run titles in the run header 2026-05-09 11:54:41 -04:00
event-debug.tsx refactor(core): simplify reviewed run cleanup 2026-05-10 22:53:20 -04:00
graph-toolbar.tsx style(runs): tighten stages, graph toolbar, billing, and stage sidebar 2026-04-19 16:51:55 -04:00
icons.tsx feat(runs): link stored pull requests 2026-05-08 13:17:08 -07:00
inline-markdown.test.tsx feat(web): render inline Markdown in run titles 2026-05-08 18:30:51 -07:00
inline-markdown.tsx refactor: simplify reviewed run cleanup 2026-05-08 23:29:08 -04:00
interview-dock.test.tsx fix(api): type interview answer submissions 2026-05-08 09:18:35 -07:00
interview-dock.tsx fix(api): type interview answer submissions 2026-05-08 09:18:35 -07:00
pull-request-chip.test.tsx feat(pr): support GitHub pull request associations (#270) 2026-05-16 12:47:27 -04:00
pull-request-chip.tsx feat(pr): support GitHub pull request associations (#270) 2026-05-16 12:47:27 -04:00
settings-panel.tsx refactor(web): share settings panel UI between server and run pages 2026-04-29 17:10:07 -04:00
stage-sidebar.tsx feat(api): expose stage handlers on run stages 2026-05-08 13:36:02 -07:00
state.tsx feat(web): unify empty/error/loading states in one primitive 2026-04-19 17:22:57 -04:00
steer-bar.tsx feat(web): wire steer bar to interrupt and steer APIs 2026-05-07 22:38:18 -07:00
terminal-view.test.ts refactor(core): simplify reviewed run cleanup 2026-05-10 22:53:20 -04:00
terminal-view.tsx refactor(core): simplify reviewed run cleanup 2026-05-10 22:53:20 -04:00
toast.test.tsx feat(web): add run lifecycle actions 2026-04-20 08:43:30 -04:00
toast.tsx feat(web): add run lifecycle actions 2026-04-20 08:43:30 -04:00
tool-use.tsx style(run-stages): copy affordance, collapsed long output, sticky header 2026-04-19 17:27:25 -04:00
ui.tsx feat(web): add Delete action to archived run actions menu 2026-05-08 07:44:33 -07:00