@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.
Files changed (64) hide show
  1. package/dist/agent/production-agent.d.ts.map +1 -1
  2. package/dist/agent/production-agent.js +28 -13
  3. package/dist/agent/production-agent.js.map +1 -1
  4. package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
  5. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  6. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  7. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  8. package/dist/cli/skills.d.ts +5 -1
  9. package/dist/cli/skills.d.ts.map +1 -1
  10. package/dist/cli/skills.js +651 -21
  11. package/dist/cli/skills.js.map +1 -1
  12. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
  13. package/dist/client/blocks/library/AnnotatedCodeBlock.js +14 -3
  14. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
  15. package/dist/client/blocks/library/ApiEndpointBlock.d.ts.map +1 -1
  16. package/dist/client/blocks/library/ApiEndpointBlock.js +11 -7
  17. package/dist/client/blocks/library/ApiEndpointBlock.js.map +1 -1
  18. package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
  19. package/dist/client/blocks/library/DiffBlock.js +89 -5
  20. package/dist/client/blocks/library/DiffBlock.js.map +1 -1
  21. package/dist/client/blocks/library/HighlightedCode.d.ts +2 -1
  22. package/dist/client/blocks/library/HighlightedCode.d.ts.map +1 -1
  23. package/dist/client/blocks/library/HighlightedCode.js +2 -2
  24. package/dist/client/blocks/library/HighlightedCode.js.map +1 -1
  25. package/dist/client/blocks/library/JsonExplorerBlock.d.ts.map +1 -1
  26. package/dist/client/blocks/library/JsonExplorerBlock.js +57 -13
  27. package/dist/client/blocks/library/JsonExplorerBlock.js.map +1 -1
  28. package/dist/client/blocks/library/code.d.ts.map +1 -1
  29. package/dist/client/blocks/library/code.js +27 -6
  30. package/dist/client/blocks/library/code.js.map +1 -1
  31. package/dist/client/blocks/library/columns.d.ts.map +1 -1
  32. package/dist/client/blocks/library/columns.js +11 -1
  33. package/dist/client/blocks/library/columns.js.map +1 -1
  34. package/dist/client/blocks/library/narrow-container.d.ts +13 -0
  35. package/dist/client/blocks/library/narrow-container.d.ts.map +1 -0
  36. package/dist/client/blocks/library/narrow-container.js +32 -0
  37. package/dist/client/blocks/library/narrow-container.js.map +1 -0
  38. package/dist/client/blocks/library/question-form.d.ts.map +1 -1
  39. package/dist/client/blocks/library/question-form.js +8 -9
  40. package/dist/client/blocks/library/question-form.js.map +1 -1
  41. package/dist/client/blocks/library/tabs.d.ts.map +1 -1
  42. package/dist/client/blocks/library/tabs.js +6 -5
  43. package/dist/client/blocks/library/tabs.js.map +1 -1
  44. package/dist/client/blocks/types.d.ts +2 -0
  45. package/dist/client/blocks/types.d.ts.map +1 -1
  46. package/dist/client/blocks/types.js.map +1 -1
  47. package/dist/client/context-xray/ContextMeter.d.ts.map +1 -1
  48. package/dist/client/context-xray/ContextMeter.js +5 -3
  49. package/dist/client/context-xray/ContextMeter.js.map +1 -1
  50. package/dist/db/client.d.ts +11 -0
  51. package/dist/db/client.d.ts.map +1 -1
  52. package/dist/db/client.js +20 -0
  53. package/dist/db/client.js.map +1 -1
  54. package/dist/db/migrations.d.ts.map +1 -1
  55. package/dist/db/migrations.js +9 -2
  56. package/dist/db/migrations.js.map +1 -1
  57. package/dist/file-upload/builder.d.ts.map +1 -1
  58. package/dist/file-upload/builder.js +23 -8
  59. package/dist/file-upload/builder.js.map +1 -1
  60. package/dist/styles/blocks.css +36 -10
  61. package/dist/vite/client.d.ts.map +1 -1
  62. package/dist/vite/client.js +26 -3
  63. package/dist/vite/client.js.map +1 -1
  64. package/package.json +1 -1
@@ -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 split \`diff\` of the KEY changed files, grouped under a \`## Key changes\`
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
- ${WIREFRAME_QUALITY_CORE}
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 split \`diff\` for the literal lines.
1676
- - **Any meaningful code hunk** → \`diff\` with \`mode: "split"\`, carrying the real
1677
- \`before\` / \`after\` text and the \`filename\` / \`language\`. Split mode is the
1678
- default for a recap because before/after legibility is the whole point. Give
1679
- every \`diff\` a one-line \`summary\` saying what the hunk changes and why; it
1680
- renders as a description above the code so the reviewer reads intent first.
1681
- Never leave a diff unlabeled.
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 split diff renders on the right. Let that heading label the section do
1694
- NOT also set a \`title\` on the \`tabs\` block. Keep each tab label to the file
1695
- path or a short basename plus directory hint.
1916
+ file's diff renders unified on the right. Leave each diff's \`mode\` unsetthe
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 split \`diff\`. Carry the real new code
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 split \`diff\` for true
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 split \`diff\`
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\` with \`mode: "split"\`** — for **code**. The split renders the literal
1748
- removed and added lines side by side. Use it for the actual hunks.
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 split
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-recap skills plus the Plan MCP connector. Authenticate only for hosted/account-backed sharing.",
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
  ],