For: a harness that draws MCP Apps cards shows a pull at a glance, as it already does for apps, runs, asks, waves, the map and the feed (CARD_OF_TOOL in src/web/studio/cards.ts).
Done:
[ ] CardKind gains pull; CARD_OF_TOOL maps pull to it; cardFor builds the model from the pull tool's answer: title, a status (open/merged/closed, check green/red/running, conflicts), rows for head→base and the preview link when there is one, every link absolute and http(s).
[ ] resources/list lists ui://forge/pull and resources/read serves it, as the other kinds are.
[ ] A case in test/mcp.test.ts reads the card for an open pull with a check and one for a merged pull, and fails without the change; the text answer is unchanged.
Files: src/web/studio/cards.ts, src/http/mcp.ts (only if the kind list is not derived), test/mcp.test.ts.
Risk: card text is escaped by the card page; never put HTML in the model.
For: a harness that draws MCP Apps cards shows a pull at a glance, as it already does for apps, runs, asks, waves, the map and the feed (
CARD_OF_TOOLin src/web/studio/cards.ts).Done:
CardKindgainspull;CARD_OF_TOOLmapspullto it;cardForbuilds the model from thepulltool's answer: title, a status (open/merged/closed, check green/red/running, conflicts), rows for head→base and the preview link when there is one, every link absolute and http(s).resources/listlistsui://forge/pullandresources/readserves it, as the other kinds are.Files: src/web/studio/cards.ts, src/http/mcp.ts (only if the kind list is not derived), test/mcp.test.ts. Risk: card text is escaped by the card page; never put HTML in the model.