@agent-native/core 0.44.1 → 0.44.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +28 -13
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/skills.d.ts +5 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +651 -21
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.js +14 -3
- package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
- package/dist/client/blocks/library/ApiEndpointBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/ApiEndpointBlock.js +11 -7
- package/dist/client/blocks/library/ApiEndpointBlock.js.map +1 -1
- package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/DiffBlock.js +89 -5
- package/dist/client/blocks/library/DiffBlock.js.map +1 -1
- package/dist/client/blocks/library/HighlightedCode.d.ts +2 -1
- package/dist/client/blocks/library/HighlightedCode.d.ts.map +1 -1
- package/dist/client/blocks/library/HighlightedCode.js +2 -2
- package/dist/client/blocks/library/HighlightedCode.js.map +1 -1
- package/dist/client/blocks/library/JsonExplorerBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/JsonExplorerBlock.js +57 -13
- package/dist/client/blocks/library/JsonExplorerBlock.js.map +1 -1
- package/dist/client/blocks/library/code.d.ts.map +1 -1
- package/dist/client/blocks/library/code.js +27 -6
- package/dist/client/blocks/library/code.js.map +1 -1
- package/dist/client/blocks/library/columns.d.ts.map +1 -1
- package/dist/client/blocks/library/columns.js +11 -1
- package/dist/client/blocks/library/columns.js.map +1 -1
- package/dist/client/blocks/library/narrow-container.d.ts +13 -0
- package/dist/client/blocks/library/narrow-container.d.ts.map +1 -0
- package/dist/client/blocks/library/narrow-container.js +32 -0
- package/dist/client/blocks/library/narrow-container.js.map +1 -0
- package/dist/client/blocks/library/question-form.d.ts.map +1 -1
- package/dist/client/blocks/library/question-form.js +8 -9
- package/dist/client/blocks/library/question-form.js.map +1 -1
- package/dist/client/blocks/library/tabs.d.ts.map +1 -1
- package/dist/client/blocks/library/tabs.js +6 -5
- package/dist/client/blocks/library/tabs.js.map +1 -1
- package/dist/client/blocks/types.d.ts +2 -0
- package/dist/client/blocks/types.d.ts.map +1 -1
- package/dist/client/blocks/types.js.map +1 -1
- package/dist/client/context-xray/ContextMeter.d.ts.map +1 -1
- package/dist/client/context-xray/ContextMeter.js +5 -3
- package/dist/client/context-xray/ContextMeter.js.map +1 -1
- package/dist/db/client.d.ts +11 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +20 -0
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +9 -2
- package/dist/db/migrations.js.map +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +23 -8
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/styles/blocks.css +36 -10
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +26 -3
- package/dist/vite/client.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/skills.js
CHANGED
|
@@ -1537,11 +1537,12 @@ evidence:
|
|
|
1537
1537
|
|
|
1538
1538
|
- A \`file-tree\` of the changed files with each entry's \`change\` flag, so the
|
|
1539
1539
|
reviewer sees the footprint of the work at a glance.
|
|
1540
|
-
- The
|
|
1540
|
+
- The \`diff\` of the KEY changed files, grouped under a \`## Key changes\`
|
|
1541
1541
|
\`rich-text\` heading in a single vertical \`tabs\` block (file labels as the left
|
|
1542
1542
|
rail), with a one-line \`summary\` and a few \`annotations\` on each — so the
|
|
1543
1543
|
reviewer can drop from the high-altitude shape straight into the load-bearing
|
|
1544
|
-
code.
|
|
1544
|
+
code. Leave \`mode\` unset so each diff renders unified — the default — because a
|
|
1545
|
+
tab panel is too narrow for split's side-by-side gutters to stay legible.
|
|
1545
1546
|
|
|
1546
1547
|
Skip the diff appendix only for a genuinely tiny change that reviews faster as
|
|
1547
1548
|
plain diff (see "When To Use"); for any change worth recapping, the file-tree and
|
|
@@ -1585,7 +1586,226 @@ architecture boxes. The following bar is shared, word for word, with
|
|
|
1585
1586
|
wireframe quality, and applies to a recap's standalone \`wireframe\` /
|
|
1586
1587
|
\`WireframeBlock\` / \`<Screen>\` exactly as it applies to a plan's canvas artboard.
|
|
1587
1588
|
|
|
1588
|
-
|
|
1589
|
+
<!-- SHARED-CORE:wireframe-quality START -->
|
|
1590
|
+
|
|
1591
|
+
**A wireframe is an HTML mockup. The renderer owns the look; you write the
|
|
1592
|
+
content.** Set \`data.html\` to a self-contained, semantic HTML fragment of the
|
|
1593
|
+
screen and set \`data.surface\`. The renderer owns the surface footprint/aspect,
|
|
1594
|
+
the dark/light theme, the hand-drawn font, and the rough.js sketch overlay — you
|
|
1595
|
+
never write \`<html>\`/\`<body>\`/\`<script>\`/\`<style>\` tags, font-family, hex colors,
|
|
1596
|
+
or any width/height/coordinates. You write real HTML layout and real product
|
|
1597
|
+
content; the renderer styles and roughens it.
|
|
1598
|
+
|
|
1599
|
+
**A wireframe block's data is an HTML screen plus a surface:**
|
|
1600
|
+
|
|
1601
|
+
\`\`\`json
|
|
1602
|
+
{
|
|
1603
|
+
"surface": "browser",
|
|
1604
|
+
"html": "<div style=\\"display:flex;flex-direction:column;gap:10px;padding:16px;height:100%\\"><h1>Sign in</h1><p class=\\"wf-muted\\">Use your work email to continue.</p><div class=\\"wf-card\\" style=\\"display:flex;flex-direction:column;gap:10px\\"><label>Email<input value=\\"jane@acme.co\\" /></label><label>Password<input value=\\"••••••••\\" /></label><label style=\\"display:flex;align-items:center;gap:8px\\"><input type=\\"checkbox\\" checked /> Remember me</label><button class=\\"primary\\">Sign in</button></div><a href=\\"#\\">Forgot password?</a></div>"
|
|
1605
|
+
}
|
|
1606
|
+
\`\`\`
|
|
1607
|
+
|
|
1608
|
+
**Write PLAIN semantic HTML and let the renderer style it.** Bare elements
|
|
1609
|
+
(\`h1\`/\`h2\`/\`h3\`, \`p\`, \`button\`, \`input\`, \`<input type="checkbox">\`, \`a\`, \`hr\`)
|
|
1610
|
+
are auto-themed — no classes needed. Helper classes carry the rest:
|
|
1611
|
+
|
|
1612
|
+
- \`.wf-card\` / \`.wf-box\` — a bordered, padded container (a panel, a list item).
|
|
1613
|
+
- \`.wf-pill\` / \`.wf-chip\` — a rounded tag or filter; add \`.accent\`
|
|
1614
|
+
(\`<span class="wf-pill accent">\`) for the accent-filled variant.
|
|
1615
|
+
- \`.wf-muted\` — secondary/muted text (or use \`<small>\`).
|
|
1616
|
+
- \`button.primary\` or any element with \`[data-primary]\` — the accent-filled
|
|
1617
|
+
primary button.
|
|
1618
|
+
|
|
1619
|
+
**Use the \`--wf-*\` tokens for any custom color, never hex.** The renderer flips
|
|
1620
|
+
these on light/dark, so reading them is what keeps a mockup correct in both
|
|
1621
|
+
themes. For any inline border, background, or text color, reference a token:
|
|
1622
|
+
\`style="border:1.4px solid var(--wf-line)"\`. The tokens are \`--wf-ink\` (text),
|
|
1623
|
+
\`--wf-muted\` (secondary text), \`--wf-line\` (borders/dividers), \`--wf-paper\`
|
|
1624
|
+
(page background), \`--wf-card\` (raised surface), \`--wf-accent\` /
|
|
1625
|
+
\`--wf-accent-fg\` / \`--wf-accent-soft\` (brand action), \`--wf-warn\`, \`--wf-ok\`,
|
|
1626
|
+
and \`--wf-radius\`. Never hard-code a hex color and never set \`font-family\` — the
|
|
1627
|
+
renderer owns the sketch/clean font.
|
|
1628
|
+
|
|
1629
|
+
**Lay out with inline \`style\` flex/grid.** You write the real layout —
|
|
1630
|
+
\`display:flex; flex-direction:column; gap:10px; padding:16px\` and so on — and the
|
|
1631
|
+
renderer never repositions anything. Compose the actual product: reproduce the
|
|
1632
|
+
current screen, then show the modification. Real labels, real counts, real dates,
|
|
1633
|
+
real button text grounded in the screen you read; not lorem or gray bars.
|
|
1634
|
+
|
|
1635
|
+
**Surface presets — match the real footprint, never default to desktop+mobile.**
|
|
1636
|
+
Pick the \`surface\` that matches what the user will actually see:
|
|
1637
|
+
|
|
1638
|
+
- \`browser\`: a web page that needs a browser chrome frame around it.
|
|
1639
|
+
- \`desktop\`: a full desktop app page or app shell.
|
|
1640
|
+
- \`mobile\`: a phone screen, only when the work is genuinely mobile.
|
|
1641
|
+
- \`popover\`: a small floating menu, dropdown, or inline popover.
|
|
1642
|
+
- \`panel\`: a side panel, inspector, or sidebar widget.
|
|
1643
|
+
|
|
1644
|
+
A sidebar popover renders as a small surface, not a desktop page and a phone
|
|
1645
|
+
frame. Do not emit \`desktop\` + \`mobile\` variants unless responsive behavior
|
|
1646
|
+
actually changes the layout. For a component or widget, show one broader
|
|
1647
|
+
app-context frame only when placement affects understanding, then the focused
|
|
1648
|
+
component states.
|
|
1649
|
+
|
|
1650
|
+
**Model the actual component shell for small surfaces.** A rendered UI change
|
|
1651
|
+
belongs in a wireframe; reserve \`diagram\` for architecture, dependency, state,
|
|
1652
|
+
or data-flow relationships. Popovers, dropdown menus, command palettes, and
|
|
1653
|
+
context menus use \`surface: "popover"\` unless the surrounding page placement is
|
|
1654
|
+
the point of the change. Dialogs, sheets, inspectors, sidebars, and long
|
|
1655
|
+
property panels use the matching \`panel\` / \`desktop\` surface as appropriate.
|
|
1656
|
+
Show the real chrome: trigger or anchor when it matters, title/header row,
|
|
1657
|
+
top-right actions, separators, fields, options, selected states, body content,
|
|
1658
|
+
and footer actions that are visible in the workflow.
|
|
1659
|
+
|
|
1660
|
+
**Modify, don't redesign.** When the task changes an existing screen, reproduce
|
|
1661
|
+
the current screen's real layout and footprint FIRST, then change only the delta
|
|
1662
|
+
and call it out with a single annotation. Do not restack the page into a new
|
|
1663
|
+
layout. For net-new surfaces, compose from the real app shell.
|
|
1664
|
+
|
|
1665
|
+
**Classify mockup scope before implementation.** Before turning a plan mockup
|
|
1666
|
+
into source code, decide whether each artboard represents the whole page/app
|
|
1667
|
+
shell, a route body inside an existing shell, or a component/sub-surface. If an
|
|
1668
|
+
artboard includes navigation, sidebars, auth banners, or a signup/login form,
|
|
1669
|
+
map those pieces to the real shared shell/auth components instead of nesting the
|
|
1670
|
+
entire mockup inside the current page. When a mockup references the product's
|
|
1671
|
+
standard signup/login page, find and reuse that existing implementation; do not
|
|
1672
|
+
approximate it from the wireframe.
|
|
1673
|
+
|
|
1674
|
+
**Zoom in on sub-surfaces, don't redraw the page.** For a small sub-surface (a
|
|
1675
|
+
popover, menu, dialog, toast), show the full screen once, then add a small
|
|
1676
|
+
separate artboard whose \`html\` contains ONLY that sub-surface — do not re-draw
|
|
1677
|
+
the whole page around it, and do not scale a duplicate up. Pick the matching
|
|
1678
|
+
\`surface\` (e.g. \`popover\`) so the footprint is right; never widen a popover to
|
|
1679
|
+
page width.
|
|
1680
|
+
|
|
1681
|
+
**Loading / skeleton states.** Set \`data.skeleton: true\` on the wireframe and
|
|
1682
|
+
fill the \`html\` with neutral, textless placeholder geometry — boxes and bars
|
|
1683
|
+
built as \`<div>\`s with \`background:var(--wf-line)\` and explicit heights/widths,
|
|
1684
|
+
no labels or copy. The renderer drops borders, sketch, and color into the
|
|
1685
|
+
skeleton register automatically. Never escape to a \`custom-html\` document block
|
|
1686
|
+
to fake a loader.
|
|
1687
|
+
|
|
1688
|
+
**Editing an existing mockup.** To change one element, text, or color in an
|
|
1689
|
+
existing html mockup, do NOT regenerate the frame — call \`update-visual-plan\`
|
|
1690
|
+
with \`contentPatches: [{ op: "patch-wireframe-html", blockId, edits: [{ find,
|
|
1691
|
+
replace }] }]\`. Each \`find\` is a unique snippet of the current html (read it
|
|
1692
|
+
first with \`get-visual-plan\`); set \`all: true\` on an edit to replace every
|
|
1693
|
+
occurrence. The result is re-sanitized.
|
|
1694
|
+
|
|
1695
|
+
**Treat the wireframe border as part of the visible design.** Always wrap HTML
|
|
1696
|
+
wireframe content in a root container with real inner padding before drawing
|
|
1697
|
+
cards, fields, pills, labels, or controls. Use at least 14-16px of padding,
|
|
1698
|
+
\`box-sizing: border-box\`, \`height: 100%\`, and \`gap\` between child rows so the
|
|
1699
|
+
first row never sits flush against the screen border. Keep text away from
|
|
1700
|
+
borders: every container, field, button, menu item, and annotation needs enough
|
|
1701
|
+
padding and line-height to read cleanly in the rendered Plan view.
|
|
1702
|
+
|
|
1703
|
+
**Lay out children safely so they never collide.** Use HTML flex/grid with
|
|
1704
|
+
\`gap\`, \`min-width: 0\`, and sensible overflow. Avoid negative margins, absolute
|
|
1705
|
+
positioning, or fixed child widths that can collide when the renderer switches
|
|
1706
|
+
between light/dark, sketch/clean, or different zoom levels.
|
|
1707
|
+
|
|
1708
|
+
**Do not wrap intentionally single-line labels.** For toolbars, tab rails,
|
|
1709
|
+
breadcrumbs, chip/filter rows, branch and file names, file chips, and code
|
|
1710
|
+
filenames — any deliberately single-line row — do not let long text wrap. Put
|
|
1711
|
+
\`white-space: nowrap\` on the row (and \`overflow: hidden; text-overflow: ellipsis\`
|
|
1712
|
+
on the individual labels that can grow), so the wireframe demonstrates the actual
|
|
1713
|
+
layout behavior instead of producing ugly stacked or vertical text. Use
|
|
1714
|
+
horizontally scrollable or clipped rails for overflow.
|
|
1715
|
+
|
|
1716
|
+
**Fill the frame; keep labels short.** Each artboard is a fixed-size surface — compose enough realistic HTML to fill it top to bottom with even vertical rhythm; never leave a large empty band. On desktop/app-shell sidebars, let the nav stack flex to fill (\`flex:1\`) and add any persistent bottom action/status after it so the rail reads complete in taller frames. On mobile especially, flow real rows down the whole screen (status bar, header, then list/detail content) rather than a header floating above a gap. Keep every label short enough to sit on one line within its column — shorten the copy rather than relying on the frame to absorb it (long labels wrap or clip).
|
|
1717
|
+
|
|
1718
|
+
**Persistent chrome bars span the full frame width.** Top bars, app headers,
|
|
1719
|
+
toolbars, and bottom tab/nav bars are full-width chrome, not centered content.
|
|
1720
|
+
Lay each one out as a single flex row that fills the frame
|
|
1721
|
+
(\`style="display:flex;align-items:center;width:100%"\`) and push trailing actions
|
|
1722
|
+
to the right edge with a flex spacer (\`<div style="flex:1"></div>\`) between the
|
|
1723
|
+
leading group and the trailing group — never center a bar inside a narrow,
|
|
1724
|
+
centered block, and never let it collapse to the width of its contents. In a
|
|
1725
|
+
Before/After pair the bar stays full-width in BOTH states even when one state has
|
|
1726
|
+
fewer controls; the spacer absorbs the difference so the remaining controls hold
|
|
1727
|
+
their edge alignment instead of sliding to the center.
|
|
1728
|
+
|
|
1729
|
+
**Pin bottom bars to the bottom of the frame.** For mobile tab bars, footers, and
|
|
1730
|
+
any persistent bottom action row, make the frame itself a flex column at
|
|
1731
|
+
\`height:100%\` (\`style="display:flex;flex-direction:column;height:100%"\`), give the
|
|
1732
|
+
scrolling body \`flex:1\` so it absorbs the slack, and place the bar as the LAST
|
|
1733
|
+
child of the frame (or set \`margin-top:auto\` on it). The bar then sits flush at
|
|
1734
|
+
the bottom of the surface instead of floating directly under the content with an
|
|
1735
|
+
empty band beneath it.
|
|
1736
|
+
|
|
1737
|
+
**Before / after must be comparable.** When showing a state change, preserve the
|
|
1738
|
+
unchanged controls in both states so the reviewer can see exactly what moved or
|
|
1739
|
+
appeared; do not show an added control as a generic box floating elsewhere in
|
|
1740
|
+
the surface. Place the new/changed affordance where the implementation puts it —
|
|
1741
|
+
for example, a new \`Edit with AI\` action in a popover header belongs in the
|
|
1742
|
+
top-right header slot, aligned with the title, not in the body or footer. Use
|
|
1743
|
+
the same frame size, scale, outer padding, border radius, and visual density on
|
|
1744
|
+
both sides unless the change itself alters those properties, and let the frame
|
|
1745
|
+
height fit the content rather than leaving a tall empty lower half.
|
|
1746
|
+
|
|
1747
|
+
**Name the states with the column header, never inside the frame.** Put the two
|
|
1748
|
+
states in a \`columns\` block and set each column's \`label\` to \`Before\` and
|
|
1749
|
+
\`After\` — the renderer draws that label as an \`h4\` heading above each frame. Do
|
|
1750
|
+
NOT bake a \`Before\`/\`After\` pill, title, or heading into the wireframe \`html\`: a
|
|
1751
|
+
label placed inside reads as part of the product UI, lands in a random corner,
|
|
1752
|
+
and clutters the comparison. The column header is the one and only place the
|
|
1753
|
+
state name belongs.
|
|
1754
|
+
|
|
1755
|
+
**Let the surface choose side-by-side vs. stacked.** The \`columns\` renderer lays
|
|
1756
|
+
narrow surfaces (\`mobile\`, \`popover\`, \`panel\`) out side by side, and
|
|
1757
|
+
automatically stacks wide surfaces (\`desktop\`, \`browser\`) vertically at full
|
|
1758
|
+
document width so a large frame is never crushed into a half-width column and
|
|
1759
|
+
cropped. Author both wireframes with the real \`surface\` and the matching
|
|
1760
|
+
\`Before\`/\`After\` column labels; do not hand-stack the pair into separate
|
|
1761
|
+
top-level wireframes or duplicate the state name as body content.
|
|
1762
|
+
|
|
1763
|
+
**Good example — a contacts list, surface \`browser\`.** A small, real screen
|
|
1764
|
+
composed from the helper classes and tokens, layout in inline flex, no fonts or
|
|
1765
|
+
hex colors:
|
|
1766
|
+
|
|
1767
|
+
\`\`\`html
|
|
1768
|
+
<div
|
|
1769
|
+
style="display:flex;flex-direction:column;gap:12px;padding:16px;height:100%"
|
|
1770
|
+
>
|
|
1771
|
+
<div style="display:flex;align-items:center;justify-content:space-between">
|
|
1772
|
+
<h1>Contacts</h1>
|
|
1773
|
+
<button class="primary">New contact</button>
|
|
1774
|
+
</div>
|
|
1775
|
+
<div style="display:flex;gap:6px">
|
|
1776
|
+
<span class="wf-pill accent">All 128</span>
|
|
1777
|
+
<span class="wf-pill">Favorites</span>
|
|
1778
|
+
<span class="wf-pill">Archived</span>
|
|
1779
|
+
</div>
|
|
1780
|
+
<div
|
|
1781
|
+
class="wf-card"
|
|
1782
|
+
style="display:flex;flex-direction:column;gap:0;padding:0"
|
|
1783
|
+
>
|
|
1784
|
+
<div
|
|
1785
|
+
style="display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1.4px solid var(--wf-line)"
|
|
1786
|
+
>
|
|
1787
|
+
<div
|
|
1788
|
+
style="width:32px;height:32px;border-radius:999px;background:var(--wf-accent-soft)"
|
|
1789
|
+
></div>
|
|
1790
|
+
<div style="flex:1">
|
|
1791
|
+
<strong>Jane Cooper</strong><br /><small>jane@acme.co</small>
|
|
1792
|
+
</div>
|
|
1793
|
+
<span class="wf-pill">Lead</span>
|
|
1794
|
+
</div>
|
|
1795
|
+
<div style="display:flex;align-items:center;gap:10px;padding:10px 12px">
|
|
1796
|
+
<div
|
|
1797
|
+
style="width:32px;height:32px;border-radius:999px;background:var(--wf-accent-soft)"
|
|
1798
|
+
></div>
|
|
1799
|
+
<div style="flex:1">
|
|
1800
|
+
<strong>Marcus Lee</strong><br /><small>marcus@globex.io</small>
|
|
1801
|
+
</div>
|
|
1802
|
+
<span class="wf-pill">Customer</span>
|
|
1803
|
+
</div>
|
|
1804
|
+
</div>
|
|
1805
|
+
</div>
|
|
1806
|
+
\`\`\`
|
|
1807
|
+
|
|
1808
|
+
<!-- SHARED-CORE:wireframe-quality END -->
|
|
1589
1809
|
|
|
1590
1810
|
Use the standard \`WireframeBlock\` / \`<Screen>\` format so the Plan viewer owns the
|
|
1591
1811
|
surface frame, theme, and sketchy/clean toggle. HTML wireframes are appropriate
|
|
@@ -1672,13 +1892,16 @@ the actual diff:
|
|
|
1672
1892
|
- **Compatibility-sensitive change** → short \`rich-text\` notes beside the
|
|
1673
1893
|
relevant \`data-model\` / \`api-endpoint\` block. Name the changed field,
|
|
1674
1894
|
endpoint, or behavior and mark whether it is breaking, risky, or non-breaking;
|
|
1675
|
-
pair that note with a
|
|
1676
|
-
- **Any meaningful code hunk** → \`diff\`
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1895
|
+
pair that note with a \`diff\` for the literal lines.
|
|
1896
|
+
- **Any meaningful code hunk** → \`diff\` carrying the real \`before\` / \`after\` text
|
|
1897
|
+
and the \`filename\` / \`language\`. Leave \`mode\` unset: unified is the default and
|
|
1898
|
+
the right choice for a recap, since recap diffs almost always sit inside a
|
|
1899
|
+
width-constrained container (a vertical-tabs panel or a comparison column)
|
|
1900
|
+
where split's two line-number gutters cut the code off. Reach for \`mode:
|
|
1901
|
+
"split"\` only for a standalone, full-document-width diff where side-by-side
|
|
1902
|
+
genuinely helps. Give every \`diff\` a one-line \`summary\` saying what the hunk
|
|
1903
|
+
changes and why; it renders as a description above the code so the reviewer
|
|
1904
|
+
reads intent first. Never leave a diff unlabeled.
|
|
1682
1905
|
For the KEY changed files, attach \`annotations\` to the \`diff\` so the recap
|
|
1683
1906
|
calls out what each important hunk does — this is the headline affordance for
|
|
1684
1907
|
annotating the key files updated. Each annotation is
|
|
@@ -1690,17 +1913,18 @@ the actual diff:
|
|
|
1690
1913
|
\`rich-text\` heading block whose markdown is \`## Key changes\`, then place the
|
|
1691
1914
|
\`diff\` blocks under it in a reusable \`tabs\` block with
|
|
1692
1915
|
\`orientation: "vertical"\` so file labels form a left rail and the selected
|
|
1693
|
-
file's
|
|
1694
|
-
|
|
1695
|
-
|
|
1916
|
+
file's diff renders unified on the right. Leave each diff's \`mode\` unset — the
|
|
1917
|
+
tab panel is too narrow for split — and let the unified default carry it. Let
|
|
1918
|
+
that heading label the section — do NOT also set a \`title\` on the \`tabs\` block.
|
|
1919
|
+
Keep each tab label to the file path or a short basename plus directory hint.
|
|
1696
1920
|
If the recap ends with more than one supporting diff, that trailing diff
|
|
1697
1921
|
appendix should be one vertical \`tabs\` block under its own \`## Key changes\`
|
|
1698
1922
|
heading, not a stack of separate \`diff\` blocks.
|
|
1699
1923
|
- **Brand-new file or a substantial added block with no meaningful "before"** →
|
|
1700
|
-
\`annotated-code\` rather than a one-sided
|
|
1924
|
+
\`annotated-code\` rather than a one-sided \`diff\`. Carry the real new code
|
|
1701
1925
|
with its \`filename\` / \`language\` and anchor a few high-signal notes to the lines
|
|
1702
1926
|
that matter (\`{ lines: "12" | "12-18"; label?; note }\`) so the reviewer reads
|
|
1703
|
-
what the new code does, not code for code's sake. Keep
|
|
1927
|
+
what the new code does, not code for code's sake. Keep \`diff\` for true
|
|
1704
1928
|
before/after hunks where the removed lines still carry meaning, and group
|
|
1705
1929
|
several annotated walkthroughs in a vertical \`tabs\` block the same way diffs are
|
|
1706
1930
|
grouped.
|
|
@@ -1713,7 +1937,7 @@ the actual diff:
|
|
|
1713
1937
|
or a short state/flow sequence. Use realistic UI surfaces: for a popover
|
|
1714
1938
|
change, show a popover with its title row, top-right actions, options/fields,
|
|
1715
1939
|
and any opened prompt/menu anchored to the correct trigger. Keep the body lean:
|
|
1716
|
-
the wireframe carries the UI story, while the file tree and
|
|
1940
|
+
the wireframe carries the UI story, while the file tree and \`diff\`
|
|
1717
1941
|
blocks carry implementation evidence.
|
|
1718
1942
|
- **Architecture or data-flow shift** → \`diagram\` with \`data.html\` / \`data.css\`
|
|
1719
1943
|
as a two-panel before/after, layered, or swimlane layout, or \`mermaid\` for a
|
|
@@ -1733,6 +1957,350 @@ the actual diff:
|
|
|
1733
1957
|
the objective the diff served, the key decisions visible in it, and the risks a
|
|
1734
1958
|
reviewer should weigh. This is the only place the model writes freely.
|
|
1735
1959
|
|
|
1960
|
+
## Block MDX reference
|
|
1961
|
+
|
|
1962
|
+
This is the authoritative tag + prop shape for every importable block. Author the
|
|
1963
|
+
recap source against THESE tags and props — do not guess from the conceptual
|
|
1964
|
+
names above (the conceptual name like \`api-endpoint\` is NOT the JSX tag). A wrong
|
|
1965
|
+
tag or prop shape either 500s the import with a ZodError or, for an unrecognized
|
|
1966
|
+
capitalized tag, now **fails the import with a clear "Unknown plan block" error**
|
|
1967
|
+
(it used to silently render as raw \`<JsonExplorer …>\` text — that footgun is
|
|
1968
|
+
fixed). Every block also takes the shared envelope attributes \`id\` (REQUIRED,
|
|
1969
|
+
unique across the whole plan), and optional \`title\`, \`summary\`, \`editable\` —
|
|
1970
|
+
those are omitted from the per-block prop lists below.
|
|
1971
|
+
|
|
1972
|
+
The complete set of real block tags is exactly: \`RichText\`, \`FileTree\`,
|
|
1973
|
+
\`DataModel\`, \`Endpoint\`, \`Diff\`, \`AnnotatedCode\`, \`WireframeBlock\` (body
|
|
1974
|
+
\`<Screen>\` + wireframe-kit children), \`Columns\`/\`Column\`, \`TabsBlock\`, \`Callout\`,
|
|
1975
|
+
\`Diagram\`, \`Mermaid\`, \`Json\`, \`HtmlBlock\`, \`Table\`, \`Checklist\`, \`Code\`,
|
|
1976
|
+
\`OpenApi\`. Any other capitalized tag at the block level is rejected on import.
|
|
1977
|
+
|
|
1978
|
+
Quick tag map (conceptual name → real JSX tag):
|
|
1979
|
+
|
|
1980
|
+
| Conceptual | Real tag | Conceptual | Real tag |
|
|
1981
|
+
| --- | --- | --- | --- |
|
|
1982
|
+
| api-endpoint | \`Endpoint\` | diff | \`Diff\` |
|
|
1983
|
+
| data-model | \`DataModel\` | annotated-code | \`AnnotatedCode\` |
|
|
1984
|
+
| file-tree | \`FileTree\` | code | \`Code\` |
|
|
1985
|
+
| mermaid | \`Mermaid\` | rich-text | \`RichText\` |
|
|
1986
|
+
| diagram | \`Diagram\` | callout | \`Callout\` |
|
|
1987
|
+
| json-explorer | \`Json\` | columns | \`Columns\` (cols are \`Column\`) |
|
|
1988
|
+
| openapi-spec | \`OpenApi\` | tabs | \`TabsBlock\` |
|
|
1989
|
+
| wireframe | \`WireframeBlock\` (body \`<Screen>\`) | table | \`Table\` |
|
|
1990
|
+
| custom-html | \`HtmlBlock\` | checklist | \`Checklist\` |
|
|
1991
|
+
|
|
1992
|
+
### Common mistakes (these now error on import)
|
|
1993
|
+
|
|
1994
|
+
These WRONG tags used to be swallowed as raw text. Common synonyms are now
|
|
1995
|
+
auto-corrected to the canonical tag on import; anything not in this map is
|
|
1996
|
+
rejected with a "did you mean" hint. Always author with the canonical tag —
|
|
1997
|
+
do not rely on the aliases.
|
|
1998
|
+
|
|
1999
|
+
| WRONG tag | → use |
|
|
2000
|
+
| --- | --- |
|
|
2001
|
+
| \`JsonExplorer\` | \`Json\` |
|
|
2002
|
+
| \`Tabs\` (or a nested \`Tab\` child) | \`TabsBlock\` (tabs are ONE JSON \`tabs={[…]}\` prop — there is NO nested \`<Tab>\` element) |
|
|
2003
|
+
| \`ApiEndpoint\` | \`Endpoint\` |
|
|
2004
|
+
| \`DiffBlock\` | \`Diff\` |
|
|
2005
|
+
| \`AnnotatedCodeBlock\` | \`AnnotatedCode\` |
|
|
2006
|
+
| \`Wireframe\` | \`WireframeBlock\` |
|
|
2007
|
+
|
|
2008
|
+
Lowercase HTML tags inside \`RichText\`/markdown prose (\`<div>\`, \`<span>\`,
|
|
2009
|
+
\`<code>\`, \`<br>\`, …) are always fine — only capitalized component-style tags at
|
|
2010
|
+
the block level are validated.
|
|
2011
|
+
|
|
2012
|
+
### \`Endpoint\` (API / route)
|
|
2013
|
+
|
|
2014
|
+
Tag is \`Endpoint\` — NOT \`ApiEndpoint\`. Required attrs: \`method\`, \`path\`. Optional
|
|
2015
|
+
attrs: \`summary\` (the short title — NOT \`title\`), \`auth\`, \`deprecated\` (bool),
|
|
2016
|
+
\`change\`, \`params\`, \`request\`, \`responses\`. The prose \`description\` is the MDX
|
|
2017
|
+
**children** (body between the tags), NOT an attribute.
|
|
2018
|
+
|
|
2019
|
+
- \`method\` ∈ \`GET | POST | PUT | PATCH | DELETE | HEAD | OPTIONS\`. For a
|
|
2020
|
+
WebSocket upgrade use \`GET\`.
|
|
2021
|
+
- \`change\` (and per-param/per-response \`change\`) ∈ \`added | modified | removed | renamed\`.
|
|
2022
|
+
- \`params={[{ name, in, type?, required?, description?, change?, was? }]}\` where
|
|
2023
|
+
\`in\` ∈ \`path | query | header | body\`.
|
|
2024
|
+
- \`request={{ contentType?, example? }}\` — \`example\` is a JSON **string**, not a
|
|
2025
|
+
nested object.
|
|
2026
|
+
- \`responses={[{ status, description?, example?, change? }]}\` — each \`example\` is
|
|
2027
|
+
a JSON **string** (the renderer parses it into the collapsible JsonExplorer).
|
|
2028
|
+
Give each distinct message shape (e.g. success vs error, or separate WS frame
|
|
2029
|
+
types) its OWN response entry, not one merged body.
|
|
2030
|
+
|
|
2031
|
+
\`\`\`mdx
|
|
2032
|
+
<Endpoint
|
|
2033
|
+
id="ep-create-task"
|
|
2034
|
+
method="POST"
|
|
2035
|
+
path="/api/tasks"
|
|
2036
|
+
summary="Create a task"
|
|
2037
|
+
request={{ contentType: "application/json", example: '{"title":"Ship recap"}' }}
|
|
2038
|
+
responses={[{ status: "201", description: "Created", example: '{"id":"t_1","title":"Ship recap"}' }]}
|
|
2039
|
+
>
|
|
2040
|
+
|
|
2041
|
+
Creates a task scoped to the caller's org.
|
|
2042
|
+
|
|
2043
|
+
</Endpoint>
|
|
2044
|
+
\`\`\`
|
|
2045
|
+
|
|
2046
|
+
### \`DataModel\` (schema / ER)
|
|
2047
|
+
|
|
2048
|
+
Tag is \`DataModel\`. Required attr: \`entities\` (>= 1). Optional attr: \`relations\`.
|
|
2049
|
+
There is NO top-level \`fields=\` attribute — fields live inside each entity. There
|
|
2050
|
+
is NO per-field \`required\` or \`description\` key; fold either into \`note\`.
|
|
2051
|
+
|
|
2052
|
+
- \`entities={[{ id, name, note?, change?, fields: [...] }]}\` — \`id\` is referenced
|
|
2053
|
+
by relations.
|
|
2054
|
+
- each field: \`{ name, type?, pk?, fk?, nullable?, default?, note?, change?, was? }\`.
|
|
2055
|
+
\`pk\`/\`nullable\` are booleans; \`fk\` is a string target like \`"User.id"\`;
|
|
2056
|
+
\`change\` ∈ \`added | modified | removed | renamed\`; \`was\` is the prior value
|
|
2057
|
+
when \`change\` is \`modified\`.
|
|
2058
|
+
- \`relations={[{ from, to, kind?, label? }]}\` (optional — the renderer infers
|
|
2059
|
+
simple \`1-n\` from \`fk\` when omitted); \`kind\` ∈ \`1-1 | 1-n | n-n\`.
|
|
2060
|
+
|
|
2061
|
+
\`\`\`mdx
|
|
2062
|
+
<DataModel
|
|
2063
|
+
id="dm-tasks"
|
|
2064
|
+
entities={[
|
|
2065
|
+
{
|
|
2066
|
+
id: "task",
|
|
2067
|
+
name: "Task",
|
|
2068
|
+
fields: [
|
|
2069
|
+
{ name: "id", type: "uuid", pk: true },
|
|
2070
|
+
{ name: "title", type: "text" },
|
|
2071
|
+
{ name: "status", type: "text", change: "added", note: "open|done" }
|
|
2072
|
+
]
|
|
2073
|
+
}
|
|
2074
|
+
]}
|
|
2075
|
+
/>
|
|
2076
|
+
\`\`\`
|
|
2077
|
+
|
|
2078
|
+
### \`FileTree\` (changed files)
|
|
2079
|
+
|
|
2080
|
+
Tag is \`FileTree\`. Required attr: \`entries\` (>= 1). Optional attr: \`title\`. The
|
|
2081
|
+
tree is built from the leaf \`path\`s — do NOT pass an ASCII tree in children; the
|
|
2082
|
+
block is self-closing.
|
|
2083
|
+
|
|
2084
|
+
- \`entries={[{ path, change?, note?, snippet?, language? }]}\` — \`path\` is
|
|
2085
|
+
slash-delimited; \`change\` ∈ \`added | modified | removed | renamed\`. Add a
|
|
2086
|
+
\`snippet\` (with optional \`language\`) only when it says something the path does
|
|
2087
|
+
not.
|
|
2088
|
+
|
|
2089
|
+
\`\`\`mdx
|
|
2090
|
+
<FileTree
|
|
2091
|
+
id="ft-changed"
|
|
2092
|
+
title="Files touched"
|
|
2093
|
+
entries={[
|
|
2094
|
+
{ path: "server/routes/tasks.ts", change: "modified", note: "add POST handler" },
|
|
2095
|
+
{ path: "server/db/schema.ts", change: "modified" },
|
|
2096
|
+
{ path: "tests/tasks.test.ts", change: "added" }
|
|
2097
|
+
]}
|
|
2098
|
+
/>
|
|
2099
|
+
\`\`\`
|
|
2100
|
+
|
|
2101
|
+
### \`Mermaid\` (graph)
|
|
2102
|
+
|
|
2103
|
+
Tag is \`Mermaid\` — this is its OWN block, separate from \`Diagram\`. Required attr:
|
|
2104
|
+
\`source\` (the diagram text). Optional attr: \`caption\`. Do NOT put mermaid text
|
|
2105
|
+
inside a \`Diagram\` block, and do NOT use \`<Diagram mermaid={...}>\` — that is not a
|
|
2106
|
+
real prop and will not render.
|
|
2107
|
+
|
|
2108
|
+
\`\`\`mdx
|
|
2109
|
+
<Mermaid
|
|
2110
|
+
id="mm-flow"
|
|
2111
|
+
source={\`flowchart LR
|
|
2112
|
+
Client --> API
|
|
2113
|
+
API --> DB\`}
|
|
2114
|
+
caption="Request path"
|
|
2115
|
+
/>
|
|
2116
|
+
\`\`\`
|
|
2117
|
+
|
|
2118
|
+
### \`Diagram\` (HTML/SVG or node graph)
|
|
2119
|
+
|
|
2120
|
+
Tag is \`Diagram\`. The whole payload is ONE \`data\` attribute:
|
|
2121
|
+
\`data={{ html?, css?, caption?, nodes?, edges?, notes? }}\`. It requires either
|
|
2122
|
+
\`html\` (an inert HTML/SVG fragment) OR at least one node — a \`Diagram\` with
|
|
2123
|
+
neither fails validation. This is for architecture / data-flow / dependency
|
|
2124
|
+
relationships, NOT rendered UI (use a wireframe for UI) and NOT mermaid (use
|
|
2125
|
+
\`Mermaid\`). Use \`.diagram-*\` primitives + \`--wf-*\` tokens in \`html\`/\`css\`; never
|
|
2126
|
+
hex colors or \`font-family\`.
|
|
2127
|
+
|
|
2128
|
+
\`\`\`mdx
|
|
2129
|
+
<Diagram
|
|
2130
|
+
id="dg-arch"
|
|
2131
|
+
data={{
|
|
2132
|
+
nodes: [
|
|
2133
|
+
{ id: "ui", label: "UI" },
|
|
2134
|
+
{ id: "api", label: "API" },
|
|
2135
|
+
{ id: "db", label: "DB" }
|
|
2136
|
+
],
|
|
2137
|
+
edges: [
|
|
2138
|
+
{ from: "ui", to: "api" },
|
|
2139
|
+
{ from: "api", to: "db" }
|
|
2140
|
+
]
|
|
2141
|
+
}}
|
|
2142
|
+
/>
|
|
2143
|
+
\`\`\`
|
|
2144
|
+
|
|
2145
|
+
### \`Json\` (JSON explorer)
|
|
2146
|
+
|
|
2147
|
+
Tag is \`Json\`. Required attr: \`json\` — a **string** containing the JSON.
|
|
2148
|
+
Optional attrs: \`title\`, \`collapsedDepth\` (number, default 2).
|
|
2149
|
+
|
|
2150
|
+
\`\`\`mdx
|
|
2151
|
+
<Json
|
|
2152
|
+
id="json-config"
|
|
2153
|
+
title="Resolved config"
|
|
2154
|
+
json={'{"flags":{"recap":true},"limit":50}'}
|
|
2155
|
+
/>
|
|
2156
|
+
\`\`\`
|
|
2157
|
+
|
|
2158
|
+
### \`Diff\` (before/after)
|
|
2159
|
+
|
|
2160
|
+
Tag is \`Diff\`. Required attrs: \`before\`, \`after\` (multiline source strings).
|
|
2161
|
+
Optional attrs: \`filename\`, \`language\`, \`mode\` (\`unified | split\`), \`annotations\`.
|
|
2162
|
+
Leave \`mode\` unset: it defaults to **unified**, which reads cleanly at any width
|
|
2163
|
+
and is what recap diffs want — they almost always live inside a width-constrained
|
|
2164
|
+
container (a vertical-tabs panel or a comparison column) where split's two
|
|
2165
|
+
line-number gutters cut the code off. Only set \`mode: "split"\` for a standalone,
|
|
2166
|
+
full-document-width diff where side-by-side genuinely helps. The reader always
|
|
2167
|
+
exposes a Unified/Split toggle (when there is room), so a viewer can switch
|
|
2168
|
+
either way regardless of the authored default. Give every diff a \`summary\` (the
|
|
2169
|
+
shared envelope attr) so the reviewer reads intent first.
|
|
2170
|
+
|
|
2171
|
+
- \`annotations={[{ side?, lines, label?, note }]}\` — \`side\` ∈ \`before | after\`
|
|
2172
|
+
(default \`after\`); \`lines\` is a 1-based ref like \`"13"\` or \`"13-15"\`.
|
|
2173
|
+
|
|
2174
|
+
\`\`\`mdx
|
|
2175
|
+
<Diff
|
|
2176
|
+
id="diff-handler"
|
|
2177
|
+
filename="server/routes/tasks.ts"
|
|
2178
|
+
language="ts"
|
|
2179
|
+
summary="Add the POST /api/tasks handler"
|
|
2180
|
+
before={\`router.get("/api/tasks", list);\`}
|
|
2181
|
+
after={\`router.get("/api/tasks", list);\\nrouter.post("/api/tasks", create);\`}
|
|
2182
|
+
annotations={[{ side: "after", lines: "2", label: "New route", note: "Creates a task" }]}
|
|
2183
|
+
/>
|
|
2184
|
+
\`\`\`
|
|
2185
|
+
|
|
2186
|
+
### \`AnnotatedCode\` (new-file walkthrough)
|
|
2187
|
+
|
|
2188
|
+
Tag is \`AnnotatedCode\`. Required attr: \`code\` (multiline string). Optional attrs:
|
|
2189
|
+
\`filename\`, \`language\`, \`annotations\`. Use this for a brand-new file with no
|
|
2190
|
+
meaningful "before".
|
|
2191
|
+
|
|
2192
|
+
- \`annotations={[{ lines, label?, note }]}\` — 1-based \`lines\` ref (no \`side\`,
|
|
2193
|
+
unlike \`Diff\`).
|
|
2194
|
+
|
|
2195
|
+
\`\`\`mdx
|
|
2196
|
+
<AnnotatedCode
|
|
2197
|
+
id="ac-create"
|
|
2198
|
+
filename="server/tasks/create.ts"
|
|
2199
|
+
language="ts"
|
|
2200
|
+
code={\`export async function create(input: NewTask) {\\n return db.tasks.insert(input);\\n}\`}
|
|
2201
|
+
annotations={[{ lines: "1-3", label: "Handler", note: "Inserts and returns the row" }]}
|
|
2202
|
+
/>
|
|
2203
|
+
\`\`\`
|
|
2204
|
+
|
|
2205
|
+
### \`RichText\` (prose)
|
|
2206
|
+
|
|
2207
|
+
Tag is \`RichText\`. The markdown is the MDX **children** (body between the tags),
|
|
2208
|
+
NOT an attribute. Use \`## Key changes\` here as the heading above a grouped diff
|
|
2209
|
+
\`TabsBlock\`.
|
|
2210
|
+
|
|
2211
|
+
\`\`\`mdx
|
|
2212
|
+
<RichText id="rt-why">
|
|
2213
|
+
|
|
2214
|
+
## Why
|
|
2215
|
+
|
|
2216
|
+
Adds a create endpoint so the agent can author tasks directly.
|
|
2217
|
+
|
|
2218
|
+
</RichText>
|
|
2219
|
+
\`\`\`
|
|
2220
|
+
|
|
2221
|
+
### \`Callout\` (tone note)
|
|
2222
|
+
|
|
2223
|
+
Tag is \`Callout\`. Optional attr: \`tone\` ∈ \`info | decision | risk | warning | success\`.
|
|
2224
|
+
The body markdown is the MDX **children**, NOT an attribute.
|
|
2225
|
+
|
|
2226
|
+
\`\`\`mdx
|
|
2227
|
+
<Callout id="co-risk" tone="risk">
|
|
2228
|
+
|
|
2229
|
+
The new column is non-nullable with no default — existing rows need a backfill.
|
|
2230
|
+
|
|
2231
|
+
</Callout>
|
|
2232
|
+
\`\`\`
|
|
2233
|
+
|
|
2234
|
+
### \`Columns\` (side-by-side)
|
|
2235
|
+
|
|
2236
|
+
Tag is \`Columns\`; each column is a nested \`<Column label="...">\` whose body is
|
|
2237
|
+
markdown and/or block components. 1–4 columns. Use labels \`Before\` / \`After\` for
|
|
2238
|
+
structured comparisons.
|
|
2239
|
+
|
|
2240
|
+
\`\`\`mdx
|
|
2241
|
+
<Columns id="cols-schema">
|
|
2242
|
+
<Column label="Before">
|
|
2243
|
+
|
|
2244
|
+
\`status\` did not exist.
|
|
2245
|
+
|
|
2246
|
+
</Column>
|
|
2247
|
+
<Column label="After">
|
|
2248
|
+
|
|
2249
|
+
<DataModel id="dm-after" entities={[{ id: "task", name: "Task", fields: [{ name: "status", type: "text", change: "added" }] }]} />
|
|
2250
|
+
|
|
2251
|
+
</Column>
|
|
2252
|
+
</Columns>
|
|
2253
|
+
\`\`\`
|
|
2254
|
+
|
|
2255
|
+
### \`TabsBlock\` (tab rail)
|
|
2256
|
+
|
|
2257
|
+
Tag is \`TabsBlock\` — NOT \`Tabs\`, and there is NO nested \`<Tab>\` element. Required
|
|
2258
|
+
attr: \`tabs\` (1–12). Optional attr: \`orientation\` (\`horizontal | vertical\`; use
|
|
2259
|
+
\`vertical\` for a file rail). The whole \`tabs\` array (including nested child
|
|
2260
|
+
blocks) is ONE JSON prop; do NOT nest the tabs or their child blocks as MDX
|
|
2261
|
+
elements. Label the section with a preceding \`## Key changes\` \`RichText\` heading
|
|
2262
|
+
rather than a \`title\` on the block.
|
|
2263
|
+
|
|
2264
|
+
\`\`\`mdx
|
|
2265
|
+
<TabsBlock
|
|
2266
|
+
id="tabs-key"
|
|
2267
|
+
orientation="vertical"
|
|
2268
|
+
tabs={[
|
|
2269
|
+
{ id: "t-route", label: "routes/tasks.ts", blocks: [ /* Diff block objects */ ] },
|
|
2270
|
+
{ id: "t-schema", label: "db/schema.ts", blocks: [ /* Diff block objects */ ] }
|
|
2271
|
+
]}
|
|
2272
|
+
/>
|
|
2273
|
+
\`\`\`
|
|
2274
|
+
|
|
2275
|
+
### \`WireframeBlock\` + \`<Screen>\` (UI)
|
|
2276
|
+
|
|
2277
|
+
Tag is \`WireframeBlock\`; its body is a single \`<Screen surface ... >\` subtree
|
|
2278
|
+
(this is nested MDX, not a flat prop). On \`<Screen>\`, \`html\` must be a
|
|
2279
|
+
single-quoted string or a static template literal — NEVER a dynamic expression
|
|
2280
|
+
(\`html={someVar}\` throws on import). \`surface\` ∈
|
|
2281
|
+
\`desktop | mobile | popover | panel | browser\`. Optional \`<Screen>\` attrs:
|
|
2282
|
+
\`renderMode\` (\`wireframe | design\`), \`caption\`, \`css\`, \`skeleton\`. See the
|
|
2283
|
+
Wireframe Quality core above for the HTML rules.
|
|
2284
|
+
|
|
2285
|
+
\`\`\`mdx
|
|
2286
|
+
<WireframeBlock id="wf-tasks">
|
|
2287
|
+
<Screen surface="browser" html={'<div style="display:flex;flex-direction:column;gap:12px;padding:16px;height:100%"><h1>Tasks</h1><button class="primary">New task</button></div>'} />
|
|
2288
|
+
</WireframeBlock>
|
|
2289
|
+
\`\`\`
|
|
2290
|
+
|
|
2291
|
+
### Other blocks
|
|
2292
|
+
|
|
2293
|
+
- \`HtmlBlock\` (custom-html) — flat attrs \`html\` (required, bounded fragment),
|
|
2294
|
+
\`css?\`, \`caption?\`. Prefer a wireframe for UI; this is an escape hatch.
|
|
2295
|
+
- \`Table\` — flat attrs \`columns={["A","B"]}\` and \`rows={[["1","2"]]}\` (both arrays
|
|
2296
|
+
of strings), optional \`density\` (\`compact | normal | relaxed\`).
|
|
2297
|
+
- \`Checklist\` — flat attr \`items={[{ id, label, checked?, note? }]}\`.
|
|
2298
|
+
- \`Code\` — flat attrs \`code\` (required string), \`language?\`, \`filename?\`,
|
|
2299
|
+
\`caption?\`, \`maxLines?\`. For a multi-file rail use a \`TabsBlock\` of \`Code\`
|
|
2300
|
+
blocks.
|
|
2301
|
+
- \`OpenApi\` — flat attrs \`spec\` (required JSON string of a whole OpenAPI/Swagger
|
|
2302
|
+
doc), \`title?\`. The whole-document counterpart to \`Endpoint\`.
|
|
2303
|
+
|
|
1736
2304
|
## Before / After Is The Headline
|
|
1737
2305
|
|
|
1738
2306
|
The recap's center of gravity is the before/after comparison. For document-body
|
|
@@ -1744,8 +2312,11 @@ comparisons there are two primitives, and they cover the whole need together:
|
|
|
1744
2312
|
shape against the new shape in one glance. This is the right primitive for
|
|
1745
2313
|
"the schema went from X to Y" or "the endpoint contract changed like this."
|
|
1746
2314
|
Do not use \`columns\` simply to compact or group a list of API endpoints.
|
|
1747
|
-
- **\`diff
|
|
1748
|
-
|
|
2315
|
+
- **\`diff\`** — for **code**. It renders the literal removed and added lines. Use
|
|
2316
|
+
it for the actual hunks. Leave \`mode\` unset so it renders unified (the default,
|
|
2317
|
+
legible at any width); reserve \`mode: "split"\` for a standalone full-width diff
|
|
2318
|
+
where side-by-side genuinely helps — never inside a tabs panel or column, where
|
|
2319
|
+
split's doubled gutters cut the code off.
|
|
1749
2320
|
|
|
1750
2321
|
For UI diffs, wireframes are the visual comparison primitive. Use before/after
|
|
1751
2322
|
wireframes when the comparison clarifies the change; use after-only or a state
|
|
@@ -1755,8 +2326,8 @@ explanation. The Wireframe Quality core owns the before/after layout choice —
|
|
|
1755
2326
|
the \`columns\` renderer keeps narrow surfaces side by side and auto-stacks wide
|
|
1756
2327
|
\`desktop\`/\`browser\` frames vertically; never hand-build a side-by-side
|
|
1757
2328
|
wireframe layout in \`custom-html\`. For document-body
|
|
1758
|
-
comparisons, there is no other multi-column primitive — \`columns\` plus
|
|
1759
|
-
\`diff\` are the whole comparison vocabulary. Do not hand-build side-by-side
|
|
2329
|
+
comparisons, there is no other multi-column primitive — \`columns\` plus the
|
|
2330
|
+
\`diff\` block are the whole comparison vocabulary. Do not hand-build side-by-side
|
|
1760
2331
|
layouts in \`custom-html\`, and do not stack two \`data-model\` blocks vertically
|
|
1761
2332
|
and call it a comparison when \`columns\` exists to put them side by side.
|
|
1762
2333
|
|
|
@@ -2032,6 +2603,10 @@ export const BUILT_IN_APP_SKILLS = {
|
|
|
2032
2603
|
skillName: "visual-plan",
|
|
2033
2604
|
extraSkills: {
|
|
2034
2605
|
"visual-recap": VISUAL_RECAP_SKILL_MD,
|
|
2606
|
+
"visual-questions": VISUAL_QUESTIONS_SKILL_MD,
|
|
2607
|
+
"ui-plan": UI_PLAN_SKILL_MD,
|
|
2608
|
+
"prototype-plan": PROTOTYPE_PLAN_SKILL_MD,
|
|
2609
|
+
"plan-design": PLAN_DESIGN_SKILL_MD,
|
|
2035
2610
|
},
|
|
2036
2611
|
manifest: normalizeAppSkillManifest({
|
|
2037
2612
|
schemaVersion: 1,
|
|
@@ -2045,7 +2620,7 @@ export const BUILT_IN_APP_SKILLS = {
|
|
|
2045
2620
|
mcp: { serverName: "agent-native-plans" },
|
|
2046
2621
|
auth: {
|
|
2047
2622
|
mode: "oauth",
|
|
2048
|
-
setup: "Install with the Agent-Native CLI to add the /visual-plan and /visual-
|
|
2623
|
+
setup: "Install with the Agent-Native CLI to add the /visual-plan, /visual-recap, /ui-plan, /prototype-plan, /plan-design, and /visual-questions skills plus the Plan MCP connector. Authenticate only for hosted/account-backed sharing.",
|
|
2049
2624
|
},
|
|
2050
2625
|
surfaces: [
|
|
2051
2626
|
{
|
|
@@ -2060,6 +2635,30 @@ export const BUILT_IN_APP_SKILLS = {
|
|
|
2060
2635
|
path: "/plans",
|
|
2061
2636
|
description: "Create a visual recap plan from a PR, commit, branch, or git diff for high-altitude review.",
|
|
2062
2637
|
},
|
|
2638
|
+
{
|
|
2639
|
+
id: "ui-plan",
|
|
2640
|
+
action: "create-ui-plan",
|
|
2641
|
+
path: "/plans",
|
|
2642
|
+
description: "Create a UI-first Agent-Native plan with an optional top pan/zoom wireframe canvas and a refined rich document below.",
|
|
2643
|
+
},
|
|
2644
|
+
{
|
|
2645
|
+
id: "prototype-plan",
|
|
2646
|
+
action: "create-prototype-plan",
|
|
2647
|
+
path: "/plans",
|
|
2648
|
+
description: "Create a prototype-first Agent-Native plan with a functional live prototype above the document.",
|
|
2649
|
+
},
|
|
2650
|
+
{
|
|
2651
|
+
id: "plan-design",
|
|
2652
|
+
action: "create-plan-design",
|
|
2653
|
+
path: "/plans",
|
|
2654
|
+
description: "Create a full-fidelity Agent-Native design plan with a Design canvas tab and optional matching Prototype tab.",
|
|
2655
|
+
},
|
|
2656
|
+
{
|
|
2657
|
+
id: "visual-questions",
|
|
2658
|
+
action: "create-visual-questions",
|
|
2659
|
+
path: "/plans",
|
|
2660
|
+
description: "Create a rich visual intake questionnaire for explicit /visual-questions workflows.",
|
|
2661
|
+
},
|
|
2063
2662
|
],
|
|
2064
2663
|
skills: [
|
|
2065
2664
|
{
|
|
@@ -2072,6 +2671,26 @@ export const BUILT_IN_APP_SKILLS = {
|
|
|
2072
2671
|
visibility: "exported",
|
|
2073
2672
|
exportAs: "visual-recap",
|
|
2074
2673
|
},
|
|
2674
|
+
{
|
|
2675
|
+
path: "skills/visual-questions",
|
|
2676
|
+
visibility: "exported",
|
|
2677
|
+
exportAs: "visual-questions",
|
|
2678
|
+
},
|
|
2679
|
+
{
|
|
2680
|
+
path: "skills/ui-plan",
|
|
2681
|
+
visibility: "exported",
|
|
2682
|
+
exportAs: "ui-plan",
|
|
2683
|
+
},
|
|
2684
|
+
{
|
|
2685
|
+
path: "skills/prototype-plan",
|
|
2686
|
+
visibility: "exported",
|
|
2687
|
+
exportAs: "prototype-plan",
|
|
2688
|
+
},
|
|
2689
|
+
{
|
|
2690
|
+
path: "skills/plan-design",
|
|
2691
|
+
visibility: "exported",
|
|
2692
|
+
exportAs: "plan-design",
|
|
2693
|
+
},
|
|
2075
2694
|
],
|
|
2076
2695
|
hostAdapters: [
|
|
2077
2696
|
"codex-plugin",
|
|
@@ -2139,6 +2758,13 @@ const BUILT_IN_APP_SKILL_ALIASES = {
|
|
|
2139
2758
|
"visual-recaps": "visual-plans",
|
|
2140
2759
|
"code-review-recap": "visual-plans",
|
|
2141
2760
|
"code-review-recaps": "visual-plans",
|
|
2761
|
+
"ui-plan": "visual-plans",
|
|
2762
|
+
"prototype-plan": "visual-plans",
|
|
2763
|
+
"plan-design": "visual-plans",
|
|
2764
|
+
"plan-designs": "visual-plans",
|
|
2765
|
+
"design-plan": "visual-plans",
|
|
2766
|
+
"design-plans": "visual-plans",
|
|
2767
|
+
"visual-questions": "visual-plans",
|
|
2142
2768
|
"html-plan": "visual-plans",
|
|
2143
2769
|
"plan-mode": "visual-plans",
|
|
2144
2770
|
plannotate: "visual-plans",
|
|
@@ -2162,6 +2788,10 @@ const BUILT_IN_APP_SKILL_DISPLAY_ALIASES = {
|
|
|
2162
2788
|
"visual-plan",
|
|
2163
2789
|
"visual-recap",
|
|
2164
2790
|
"code-review-recap",
|
|
2791
|
+
"ui-plan",
|
|
2792
|
+
"prototype-plan",
|
|
2793
|
+
"plan-design",
|
|
2794
|
+
"visual-questions",
|
|
2165
2795
|
"html-plan",
|
|
2166
2796
|
"plannotate",
|
|
2167
2797
|
],
|