mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-09-05 08:10:39 +00:00
## 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
---
[](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>
40 lines
759 B
TypeScript
40 lines
759 B
TypeScript
import type { ReactNode } from "react";
|
|
|
|
import { GitPullRequestIcon } from "./icons";
|
|
|
|
export function PullRequestChip({
|
|
number,
|
|
url,
|
|
className = "inline-flex items-center gap-1.5 font-mono text-xs text-fg-muted",
|
|
iconClassName = "size-3",
|
|
children,
|
|
}: {
|
|
number: number;
|
|
url?: string;
|
|
className?: string;
|
|
iconClassName?: string;
|
|
children?: ReactNode;
|
|
}) {
|
|
const content = (
|
|
<>
|
|
<GitPullRequestIcon className={iconClassName} />
|
|
{`#${number}`}
|
|
{children}
|
|
</>
|
|
);
|
|
|
|
if (url == null) {
|
|
return <span className={className}>{content}</span>;
|
|
}
|
|
|
|
return (
|
|
<a
|
|
href={url}
|
|
target="_blank"
|
|
rel="noreferrer"
|
|
className={`${className} hover:text-fg`}
|
|
>
|
|
{content}
|
|
</a>
|
|
);
|
|
}
|