feat: share assistant messages as branded social cards - #8040
Conversation
Design Review (Fable 5) — 🟡 CONCERNSDesign-level review of All the evidence is in. The design is sound overall — client-side only, reversible, lazy-loaded dependency, proportionate scan — but the description claims app-sdk host wiring that doesn't exist in the diff. Design-Verdict: CONCERNS Sound, reversible client-side feature, but the description claims app-sdk host wiring the diff doesn't contain — Share never renders in app-embedded chats. Watch
Suggestions
[DESIGN-REVIEWED] 51fa475 |
UX Review (Fable 5) — 🟡 CONCERNSUX-level review of UX-Verdict: CONCERNS The share flow's last step — pasting the card into the composer — happens in a tab where none of the product's guidance can follow. Watch
Suggestions
[UX-REVIEWED] 51fa475 |
First Principles Review (Fable 5) — 🟡 CONCERNSPremise-level review of First-Principles-Verdict: CONCERNS The description claims two hosts ship What this change shipsIntent: let a user post an assistant reply to X/LinkedIn as a branded PNG card instead of a screenshot — an ADDITION.
Watch
[FIRST-PRINCIPLES-REVIEWED] 51fa475 |
GPT 5.6 Review — ✅ no blocking findingsGPT 5.6 completed its review of This comment is updated in place on each push. Review detailsFINDING -- website/src/pages/chat/AssistantMessage.tsx:386 -- app-SDK assistant rows pass neither handler, so False positive or not applicable? A repository writer can comment: |
Opus 4.8 Review — ✅ no blocking findingsReviewed Review detailsBased on my analysis of the diff and the Candidate 1 — In Candidate 2 — Requires Candidate 3 — Missing feedback when export yields no blob (silent reset). Shares the root cause with Candidate 1 (unsurfaced No new grounded findings at the required bar. No BLOCKING findings — one advisory FINDING on the share export-failure path. FINDING — website/src/pages/chat/share/ShareMessageModal.tsx:1492 — on export failure [OPUS-REVIEWED] 51fa475 Verdict parsed from the review's SHA-scoped output markers for commit False positive or not applicable? A repository writer can comment: |
f77f757 to
e9b3cd8
Compare
e9b3cd8 to
71876b2
Compare
71876b2 to
14a7b3f
Compare
14a7b3f to
08da5a2
Compare
08da5a2 to
8ba51fd
Compare
8ba51fd to
28469cb
Compare
f6ae7d3 to
bfb7125
Compare
bfb7125 to
d0cd58b
Compare
d0cd58b to
9b9a6be
Compare
A Share action on assistant replies opens a dialog that renders the
message as a fixed-brand card (optionally paired with the question it
answered), exports it as a 2x PNG via download or clipboard, and opens
X / LinkedIn intent composers with an editable, prefilled caption.
The card text is click-to-edit for redaction before posting, and a
high-precision scan (AWS keys, API tokens, private keys, local paths,
loopback URLs) raises a pre-share warning banner. Everything runs
client-side; html-to-image (pinned) is loaded on demand so chat renders
never pay for it. Catalog strings ship in all 13 locales with
{{productName}} interpolation.
9b9a6be to
51fa475
Compare
bolichen97
left a comment
There was a problem hiding this comment.
Approving on the strength of a full readiness audit of every open PR against main, not a
line-by-line reading of this diff — recording that plainly so the next reader knows what this
stamp does and does not cover.
Verified against this exact head SHA:
readiness: passedpresent, andPR Readiness— the one required status context onmain
(rulesetprotected-branches) — issuccesson this head.- No check run on this head is
failure,cancelled,timed_outor still in flight. Skipped
jobs are path-filtered conditionals, none of them required. mergeable: true, and the head is not far enough behindmainfor its green CI to describe a
base that no longer exists.- No surviving reviewer
CHANGES_REQUESTED: any such review is on an older commit and therefore
already dismissed bydismiss_stale_reviews_on_push. - Every issue comment, inline review comment and review thread was read and classified. Nothing
left is an unresolved human change request — the remainder is bot review-lane output, resolved
or outdated threads, explicitly non-blocking suggestions, and author status notes.
Auto-merge (squash) is armed, so this lands once every other ruleset requirement is met.
Open PR relationship auditThis is a consolidated, point-in-time code-level audit note. It compares complete merge-base diffs and current/merged code; it does not treat a shared topic as duplication or partial coverage as completion. Relationship findings
No PR, Issue, label, branch, or review state was changed by the relationship-note portion of this audit. |
What
A Share action on assistant replies that turns a message into a branded social card — for posting "Kiro Crew did this amazing thing" moments to X / LinkedIn without screenshots or copy-paste gymnastics.
Screenshots
Default view (Q&A pair, prefilled caption):
The REAL exported PNG (captured from the download action), carrying the official Kiro ghost brand mark:
Sensitive-content warning after planting an AWS-key-shaped string in the caption:
Implementation notes
website/src/pages/chat/share/—shareSupport.ts(pure helpers: scan, intent URLs, clipboard/download fallbacks, prev-question lookup),ShareCard.tsx(the DOM node the PNG is rasterized from),ShareMessageModal.tsx(dialog).html-to-image@1.11.13(exact pin), imported on demand inside the export handler so no chat render path pays for it; the modal itself islazy()-loaded behind the button.prevUserText(ChatPage, app-sdkmessageRenderers).en.manual.json+ all 12 locale catalogs,en-XAregenerated; product name interpolated via{{productName}}(no hardcoded brand in catalog values); zh-CN full-width punctuation and hi informal tone follow the style suites.Tested
npx tsc -bclean; fullvitest run: 1777 files / 27919 tests passed (1 expected fail, 2 skipped — same as base).website/scripts/capture-share-message-card.mjsdrives the REAL built dist (harness screenshots above) and asserts the card pairs the question, carries the excerpt, and the warning fires.Not in scope (follow-ups)
share({files})for mobile.