import { Cta } from "./cta"; import { MediaPanel } from "./media-panel"; import { Window } from "./window"; const FEATURES = [ { body: "Send a prompt, read the response from steps..outputs.summary, and pipe it wherever the workflow needs it.", cta: "Read the quickstart", figure: "outputs", href: "/quickstart", // The two outputs action.yml actually declares, rather than another copy of // the step in the hero. Split by line because each line is typed separately. summary: ['"Two risks: the retry', 'loop has no ceiling."'], title: "One step, one output", }, { body: "Every push to main runs the action on all three runners, so the platform you build on is the one it was tested on.", cta: "See how it runs", figure: "Actions", href: "/behaviour", run: [ { label: "Build & Test", state: "done" }, { label: "Integration (ubuntu)", state: "done" }, { label: "Integration (windows)", state: "done" }, { label: "Integration (macos)", state: "running" }, ], title: "Ubuntu, Windows, macOS", }, { body: "The reference tables are generated from action.yml, and the inputs that do not work yet say so on the page.", cta: "Open the reference", figure: "Reference", href: "/reference", // The point of the card is that the reference states what an input does // *not* do, so the figure is that column and nothing else. inputs: [ { name: "prompt", state: "works" }, { name: "timeout", state: "works" }, { name: "permissions", state: "Not enforced" }, { name: "cursor-version", state: "Ignored" }, ], title: "Documented honestly", }, ]; const CONSUMER_BEFORE = `- name: Comment the review uses: actions/github-script@v8 with: script: | github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: \``; // The workflow expression is rendered verbatim, not interpolated here. It is // split out so the shimmer can mark it: it is the one value the whole section // is about, and the card to its left is shown writing it. // oxlint-disable-next-line no-template-curly-in-string const CONSUMER_TOKEN = "${{ steps.cursor.outputs.summary }}"; const CONSUMER_AFTER = "`,\n })"; /** * Both cards carry the same surface. cursor.com's `.card` is a filled panel * with a 1px border at 2.4% of the foreground, and `.card:is(a):hover` lifts * it — the hover *is* the link affordance in their system, which is why a card * that is not a link never gets one. Every card here is a link. * * cursor.com's `card--large`: one card across a 24-column grid, text in columns * 1 to 9 and the media in 9 to 25, both vertically centred, collapsing to * stacked rows below `lg`. * * The whole card is the link, as theirs is, but labelled by its heading — * theirs takes its accessible name from every word inside it, which is a link * name three sentences long. */ const LargeCard = () => (

The answer is a value, not a log line

steps.<id>.outputs.summary {" "} holds whatever the agent wrote back. Comment it on the pull request, append it to the job summary, or gate what runs next. The action does not decide for you.

See the examples
); /** * The demo under each card. cursor.com's equivalents are animated but inert — * every control in their markup is `disabled` and the whole block is * `aria-hidden` — so these are pictures of the product, not miniatures of it. * The motion lives in `app.css`; the resting markup here is the finished state. */ const FeatureFigure = ({ feature }: { feature: (typeof FEATURES)[number] }) => { const body = (() => { if (feature.summary) { return (
summary
{feature.summary.map((line) => ( // `--chars` is the finished width and the resting width; the // animation only starts it at zero. {line} ))}
exit-code
0▌
); } if (feature.run) { return ( ); } return ( ); })(); return (
{body}
); }; const FeatureCard = ({ feature }: { feature: (typeof FEATURES)[number] }) => { const headingId = `feature-${feature.href.slice(1)}`; return (

{feature.title}

{feature.body}

{/* mt-auto so the links line up across cards whose text runs to different lengths, as theirs do. */}
{feature.cta}
{/* Decorative, like theirs: hidden from assistive tech, and nothing in it pretends to be a control. */}
); }; /** * Their card grid: the heading sits in a narrow measure, then one large card * across the container, then a stretch grid of smaller ones. */ export const Features = () => (

What you get

{FEATURES.map((feature) => ( ))}
);