@agent-native/core 0.101.14 → 0.102.1

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 (316) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +12 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/cli/templates-meta.ts +13 -0
  5. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +1 -1
  6. package/corpus/core/src/client/org/OrgSwitcher.tsx +2 -0
  7. package/corpus/templates/analytics/changelog/2026-07-15-fixed-the-agent-discarding-a-successful-dashboard-edit-and-r.md +6 -0
  8. package/corpus/templates/analytics/server/lib/real-data-actions.ts +30 -1
  9. package/corpus/templates/analytics/server/plugins/agent-chat.ts +15 -0
  10. package/corpus/templates/content/actions/_database-source-utils.ts +59 -4
  11. package/corpus/templates/content/actions/prepare-builder-source-review.ts +9 -0
  12. package/corpus/templates/content/actions/preview-builder-source-review.ts +6 -4
  13. package/corpus/templates/content/app/components/editor/DescriptionField.tsx +10 -2
  14. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +4 -0
  15. package/corpus/templates/content/changelog/2026-07-15-page-and-database-descriptions-now-use-a-clean-single-line-f.md +6 -0
  16. package/corpus/templates/content/changelog/2026-07-15-selected-builder-reviews-now-load-only-the-chosen-rows-avoid.md +6 -0
  17. package/corpus/templates/content/shared/api.ts +1 -0
  18. package/corpus/templates/tasks/.agents/commands/visual-plan.md +9 -0
  19. package/corpus/templates/tasks/.agents/commands/visual-recap.md +8 -0
  20. package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +492 -0
  21. package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +189 -0
  22. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +76 -0
  23. package/corpus/templates/tasks/.agents/skills/agent-watchdog/README.md +43 -0
  24. package/corpus/templates/tasks/.agents/skills/agent-watchdog/SKILL.md +110 -0
  25. package/corpus/templates/tasks/.agents/skills/agent-watchdog/agents/openai.yaml +4 -0
  26. package/corpus/templates/tasks/.agents/skills/capture-learnings/SKILL.md +89 -0
  27. package/corpus/templates/tasks/.agents/skills/change-summary/SKILL.md +83 -0
  28. package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +221 -0
  29. package/corpus/templates/tasks/.agents/skills/delegate-to-agent/SKILL.md +263 -0
  30. package/corpus/templates/tasks/.agents/skills/efficient-fable/README.md +75 -0
  31. package/corpus/templates/tasks/.agents/skills/efficient-fable/SKILL.md +95 -0
  32. package/corpus/templates/tasks/.agents/skills/efficient-frontier/README.md +53 -0
  33. package/corpus/templates/tasks/.agents/skills/efficient-frontier/SKILL.md +73 -0
  34. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +112 -0
  35. package/corpus/templates/tasks/.agents/skills/plan-arbiter/README.md +41 -0
  36. package/corpus/templates/tasks/.agents/skills/plan-arbiter/SKILL.md +114 -0
  37. package/corpus/templates/tasks/.agents/skills/plan-arbiter/agents/openai.yaml +4 -0
  38. package/corpus/templates/tasks/.agents/skills/plow-ahead/README.md +42 -0
  39. package/corpus/templates/tasks/.agents/skills/plow-ahead/SKILL.md +104 -0
  40. package/corpus/templates/tasks/.agents/skills/plow-ahead/agents/openai.yaml +4 -0
  41. package/corpus/templates/tasks/.agents/skills/quick-recap/README.md +55 -0
  42. package/corpus/templates/tasks/.agents/skills/quick-recap/SKILL.md +54 -0
  43. package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/README.md +54 -0
  44. package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/SKILL.md +126 -0
  45. package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/agents/openai.yaml +4 -0
  46. package/corpus/templates/tasks/.agents/skills/real-time-sync/SKILL.md +232 -0
  47. package/corpus/templates/tasks/.agents/skills/security/SKILL.md +280 -0
  48. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +106 -0
  49. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +95 -0
  50. package/corpus/templates/tasks/.agents/skills/stay-within-limits/README.md +61 -0
  51. package/corpus/templates/tasks/.agents/skills/stay-within-limits/SKILL.md +83 -0
  52. package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  53. package/corpus/templates/tasks/.agents/skills/visual-plan/SKILL.md +547 -0
  54. package/corpus/templates/tasks/.agents/skills/visual-plan/agent-native-skill.json +12 -0
  55. package/corpus/templates/tasks/.agents/skills/visual-plan/references/canvas.md +121 -0
  56. package/corpus/templates/tasks/.agents/skills/visual-plan/references/document-quality.md +178 -0
  57. package/corpus/templates/tasks/.agents/skills/visual-plan/references/exemplar.md +62 -0
  58. package/corpus/templates/tasks/.agents/skills/visual-plan/references/wireframe.md +264 -0
  59. package/corpus/templates/tasks/.agents/skills/visual-recap/SKILL.md +634 -0
  60. package/corpus/templates/tasks/.agents/skills/visual-recap/agent-native-skill.json +12 -0
  61. package/corpus/templates/tasks/.agents/skills/visual-recap/references/wireframe.md +264 -0
  62. package/corpus/templates/tasks/.claude/commands/visual-plan.md +9 -0
  63. package/corpus/templates/tasks/.claude/commands/visual-recap.md +8 -0
  64. package/corpus/templates/tasks/.env.example +5 -0
  65. package/corpus/templates/tasks/.ignore +0 -0
  66. package/corpus/templates/tasks/.prettierrc +5 -0
  67. package/corpus/templates/tasks/AGENTS.md +158 -0
  68. package/corpus/templates/tasks/DEVELOPING.md +185 -0
  69. package/corpus/templates/tasks/README.md +16 -0
  70. package/corpus/templates/tasks/actions/bulk-delete-inbox-items.ts +24 -0
  71. package/corpus/templates/tasks/actions/bulk-delete-tasks.ts +21 -0
  72. package/corpus/templates/tasks/actions/bulk-mark-inbox-items-ready.ts +27 -0
  73. package/corpus/templates/tasks/actions/bulk-update-tasks.ts +35 -0
  74. package/corpus/templates/tasks/actions/create-custom-field.ts +22 -0
  75. package/corpus/templates/tasks/actions/create-inbox-item.ts +30 -0
  76. package/corpus/templates/tasks/actions/create-task.ts +33 -0
  77. package/corpus/templates/tasks/actions/delete-custom-field.ts +19 -0
  78. package/corpus/templates/tasks/actions/delete-inbox-item.ts +17 -0
  79. package/corpus/templates/tasks/actions/delete-task.ts +17 -0
  80. package/corpus/templates/tasks/actions/lib/boolean-query-param.ts +30 -0
  81. package/corpus/templates/tasks/actions/list-custom-fields.ts +18 -0
  82. package/corpus/templates/tasks/actions/list-inbox-items.ts +16 -0
  83. package/corpus/templates/tasks/actions/list-tasks.ts +52 -0
  84. package/corpus/templates/tasks/actions/list-visible-task-fields.ts +18 -0
  85. package/corpus/templates/tasks/actions/mark-inbox-item-ready.ts +31 -0
  86. package/corpus/templates/tasks/actions/navigate.ts +51 -0
  87. package/corpus/templates/tasks/actions/reorder-custom-fields.ts +27 -0
  88. package/corpus/templates/tasks/actions/reorder-inbox-items.ts +24 -0
  89. package/corpus/templates/tasks/actions/reorder-tasks.ts +29 -0
  90. package/corpus/templates/tasks/actions/run.ts +2 -0
  91. package/corpus/templates/tasks/actions/update-custom-field.ts +33 -0
  92. package/corpus/templates/tasks/actions/update-inbox-item.ts +24 -0
  93. package/corpus/templates/tasks/actions/update-task.ts +68 -0
  94. package/corpus/templates/tasks/actions/update-visible-task-fields.ts +27 -0
  95. package/corpus/templates/tasks/actions/view-screen-helpers.ts +68 -0
  96. package/corpus/templates/tasks/actions/view-screen.ts +207 -0
  97. package/corpus/templates/tasks/app/components/custom-fields/FieldCreateBar.tsx +121 -0
  98. package/corpus/templates/tasks/app/components/custom-fields/FieldListRow.tsx +116 -0
  99. package/corpus/templates/tasks/app/components/custom-fields/FieldsList.tsx +225 -0
  100. package/corpus/templates/tasks/app/components/custom-fields/FieldsListSkeleton.tsx +18 -0
  101. package/corpus/templates/tasks/app/components/custom-fields/FieldsPage.tsx +42 -0
  102. package/corpus/templates/tasks/app/components/custom-fields/editor/FieldEditorSidebar.tsx +69 -0
  103. package/corpus/templates/tasks/app/components/custom-fields/editor/FieldTitleSection.tsx +32 -0
  104. package/corpus/templates/tasks/app/components/custom-fields/editor/config/CurrencyConfigControl.tsx +49 -0
  105. package/corpus/templates/tasks/app/components/custom-fields/editor/config/FieldConfigControl.tsx +56 -0
  106. package/corpus/templates/tasks/app/components/custom-fields/editor/config/NumberConfigControl.tsx +52 -0
  107. package/corpus/templates/tasks/app/components/custom-fields/editor/config/PercentConfigControl.tsx +30 -0
  108. package/corpus/templates/tasks/app/components/custom-fields/editor/config/SelectConfigControl.tsx +135 -0
  109. package/corpus/templates/tasks/app/components/custom-fields/editor/config/select-colors.ts +23 -0
  110. package/corpus/templates/tasks/app/components/custom-fields/editor/config/utils.ts +52 -0
  111. package/corpus/templates/tasks/app/components/custom-fields/editor/types.ts +7 -0
  112. package/corpus/templates/tasks/app/components/dnd/SortableItem.tsx +72 -0
  113. package/corpus/templates/tasks/app/components/dnd/SortableList.tsx +136 -0
  114. package/corpus/templates/tasks/app/components/dnd/reorder-moving-items.ts +160 -0
  115. package/corpus/templates/tasks/app/components/dnd/sortable-drag-props.ts +60 -0
  116. package/corpus/templates/tasks/app/components/inbox/InboxList.tsx +222 -0
  117. package/corpus/templates/tasks/app/components/inbox/InboxListPage.tsx +39 -0
  118. package/corpus/templates/tasks/app/components/inbox/InboxListRow.tsx +122 -0
  119. package/corpus/templates/tasks/app/components/layout/Header.tsx +55 -0
  120. package/corpus/templates/tasks/app/components/layout/HeaderActions.tsx +84 -0
  121. package/corpus/templates/tasks/app/components/layout/Layout.tsx +134 -0
  122. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +211 -0
  123. package/corpus/templates/tasks/app/components/shared/AddListItemInput.tsx +57 -0
  124. package/corpus/templates/tasks/app/components/shared/AlertDialog.tsx +53 -0
  125. package/corpus/templates/tasks/app/components/shared/BulkDeleteDialog.tsx +76 -0
  126. package/corpus/templates/tasks/app/components/shared/ChipSelect.tsx +240 -0
  127. package/corpus/templates/tasks/app/components/shared/DeleteItemDialog.tsx +40 -0
  128. package/corpus/templates/tasks/app/components/shared/InlineEditable.tsx +166 -0
  129. package/corpus/templates/tasks/app/components/shared/ListEmptyState.tsx +13 -0
  130. package/corpus/templates/tasks/app/components/shared/ListErrorMessage.tsx +15 -0
  131. package/corpus/templates/tasks/app/components/shared/ListViewHeader.tsx +75 -0
  132. package/corpus/templates/tasks/app/components/shared/PageHeader.tsx +25 -0
  133. package/corpus/templates/tasks/app/components/shared/RowActionsMenu.tsx +42 -0
  134. package/corpus/templates/tasks/app/components/shared/SidePanel.tsx +99 -0
  135. package/corpus/templates/tasks/app/components/shared/dnd/ListRowPreview.tsx +37 -0
  136. package/corpus/templates/tasks/app/components/shared/list/List.tsx +63 -0
  137. package/corpus/templates/tasks/app/components/shared/list/ListRow.tsx +159 -0
  138. package/corpus/templates/tasks/app/components/shared/list/ListRowDragHandle.tsx +52 -0
  139. package/corpus/templates/tasks/app/components/shared/list/ListSkeletonRows.tsx +11 -0
  140. package/corpus/templates/tasks/app/components/shared/list/SortableListItemShell.tsx +32 -0
  141. package/corpus/templates/tasks/app/components/shared/list/types.ts +1 -0
  142. package/corpus/templates/tasks/app/components/shared/selection/ListSelectionBar.tsx +158 -0
  143. package/corpus/templates/tasks/app/components/shared/selection/ListSelectionHeaderToggle.tsx +28 -0
  144. package/corpus/templates/tasks/app/components/shared/selection/ListSelectionToolbar.tsx +81 -0
  145. package/corpus/templates/tasks/app/components/shared/selection/get-list-row-selection-ui.ts +41 -0
  146. package/corpus/templates/tasks/app/components/shared/selection/use-list-selection.ts +196 -0
  147. package/corpus/templates/tasks/app/components/tasks/TaskList.tsx +333 -0
  148. package/corpus/templates/tasks/app/components/tasks/TaskListHeaderRow.tsx +46 -0
  149. package/corpus/templates/tasks/app/components/tasks/TaskListPage.tsx +115 -0
  150. package/corpus/templates/tasks/app/components/tasks/TaskListRow.css +49 -0
  151. package/corpus/templates/tasks/app/components/tasks/TaskListRow.tsx +307 -0
  152. package/corpus/templates/tasks/app/components/tasks/fields/TaskFieldsSidebar.tsx +102 -0
  153. package/corpus/templates/tasks/app/components/tasks/fields/TaskTitleSection.tsx +27 -0
  154. package/corpus/templates/tasks/app/components/tasks/fields/controls/DateValueControl.tsx +21 -0
  155. package/corpus/templates/tasks/app/components/tasks/fields/controls/FieldValueControl.tsx +76 -0
  156. package/corpus/templates/tasks/app/components/tasks/fields/controls/MultiSelectValueControl.tsx +52 -0
  157. package/corpus/templates/tasks/app/components/tasks/fields/controls/NumberValueControl.tsx +56 -0
  158. package/corpus/templates/tasks/app/components/tasks/fields/controls/RichTextValueControl.tsx +115 -0
  159. package/corpus/templates/tasks/app/components/tasks/fields/controls/SingleSelectValueControl.tsx +61 -0
  160. package/corpus/templates/tasks/app/components/tasks/fields/controls/TextValueControl.tsx +20 -0
  161. package/corpus/templates/tasks/app/components/tasks/use-task-row-completion-animation.ts +181 -0
  162. package/corpus/templates/tasks/app/components/ui/accordion.tsx +56 -0
  163. package/corpus/templates/tasks/app/components/ui/alert-dialog.tsx +1 -0
  164. package/corpus/templates/tasks/app/components/ui/alert.tsx +1 -0
  165. package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +5 -0
  166. package/corpus/templates/tasks/app/components/ui/avatar.tsx +1 -0
  167. package/corpus/templates/tasks/app/components/ui/badge.tsx +1 -0
  168. package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +115 -0
  169. package/corpus/templates/tasks/app/components/ui/button.tsx +1 -0
  170. package/corpus/templates/tasks/app/components/ui/calendar.tsx +70 -0
  171. package/corpus/templates/tasks/app/components/ui/card.tsx +1 -0
  172. package/corpus/templates/tasks/app/components/ui/carousel.tsx +260 -0
  173. package/corpus/templates/tasks/app/components/ui/chart.tsx +379 -0
  174. package/corpus/templates/tasks/app/components/ui/checkbox.tsx +1 -0
  175. package/corpus/templates/tasks/app/components/ui/collapsible.tsx +1 -0
  176. package/corpus/templates/tasks/app/components/ui/command.tsx +1 -0
  177. package/corpus/templates/tasks/app/components/ui/context-menu.tsx +1 -0
  178. package/corpus/templates/tasks/app/components/ui/dialog.tsx +1 -0
  179. package/corpus/templates/tasks/app/components/ui/drawer.tsx +1 -0
  180. package/corpus/templates/tasks/app/components/ui/dropdown-menu.tsx +1 -0
  181. package/corpus/templates/tasks/app/components/ui/form.tsx +177 -0
  182. package/corpus/templates/tasks/app/components/ui/hover-card.tsx +27 -0
  183. package/corpus/templates/tasks/app/components/ui/input-otp.tsx +69 -0
  184. package/corpus/templates/tasks/app/components/ui/input.tsx +1 -0
  185. package/corpus/templates/tasks/app/components/ui/label.tsx +1 -0
  186. package/corpus/templates/tasks/app/components/ui/menubar.tsx +254 -0
  187. package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +128 -0
  188. package/corpus/templates/tasks/app/components/ui/pagination.tsx +121 -0
  189. package/corpus/templates/tasks/app/components/ui/popover.tsx +1 -0
  190. package/corpus/templates/tasks/app/components/ui/progress.tsx +1 -0
  191. package/corpus/templates/tasks/app/components/ui/radio-group.tsx +1 -0
  192. package/corpus/templates/tasks/app/components/ui/resizable.tsx +43 -0
  193. package/corpus/templates/tasks/app/components/ui/scroll-area.tsx +1 -0
  194. package/corpus/templates/tasks/app/components/ui/select.tsx +1 -0
  195. package/corpus/templates/tasks/app/components/ui/separator.tsx +1 -0
  196. package/corpus/templates/tasks/app/components/ui/sheet.tsx +1 -0
  197. package/corpus/templates/tasks/app/components/ui/sidebar.tsx +782 -0
  198. package/corpus/templates/tasks/app/components/ui/skeleton.tsx +1 -0
  199. package/corpus/templates/tasks/app/components/ui/slider.tsx +1 -0
  200. package/corpus/templates/tasks/app/components/ui/sonner.tsx +1 -0
  201. package/corpus/templates/tasks/app/components/ui/spinner.tsx +1 -0
  202. package/corpus/templates/tasks/app/components/ui/switch.tsx +1 -0
  203. package/corpus/templates/tasks/app/components/ui/table.tsx +1 -0
  204. package/corpus/templates/tasks/app/components/ui/tabs.tsx +1 -0
  205. package/corpus/templates/tasks/app/components/ui/textarea.tsx +1 -0
  206. package/corpus/templates/tasks/app/components/ui/toast.tsx +1 -0
  207. package/corpus/templates/tasks/app/components/ui/toaster.tsx +1 -0
  208. package/corpus/templates/tasks/app/components/ui/toggle-group.tsx +1 -0
  209. package/corpus/templates/tasks/app/components/ui/toggle.tsx +43 -0
  210. package/corpus/templates/tasks/app/components/ui/tooltip.tsx +1 -0
  211. package/corpus/templates/tasks/app/components/ui/use-toast.ts +3 -0
  212. package/corpus/templates/tasks/app/entry.client.tsx +19 -0
  213. package/corpus/templates/tasks/app/entry.server.tsx +10 -0
  214. package/corpus/templates/tasks/app/global.css +93 -0
  215. package/corpus/templates/tasks/app/hooks/cache.ts +31 -0
  216. package/corpus/templates/tasks/app/hooks/use-custom-fields.ts +93 -0
  217. package/corpus/templates/tasks/app/hooks/use-inbox-items.ts +196 -0
  218. package/corpus/templates/tasks/app/hooks/use-mobile.tsx +21 -0
  219. package/corpus/templates/tasks/app/hooks/use-navigation-state.ts +40 -0
  220. package/corpus/templates/tasks/app/hooks/use-tasks.ts +276 -0
  221. package/corpus/templates/tasks/app/hooks/use-toast.ts +188 -0
  222. package/corpus/templates/tasks/app/hooks/use-visible-task-fields.ts +140 -0
  223. package/corpus/templates/tasks/app/lib/app-config.ts +11 -0
  224. package/corpus/templates/tasks/app/lib/tab-id.ts +1 -0
  225. package/corpus/templates/tasks/app/lib/utils.ts +1 -0
  226. package/corpus/templates/tasks/app/root.tsx +130 -0
  227. package/corpus/templates/tasks/app/routes/_index.tsx +22 -0
  228. package/corpus/templates/tasks/app/routes/extensions.$id.$slug.tsx +2 -0
  229. package/corpus/templates/tasks/app/routes/extensions.$id.tsx +11 -0
  230. package/corpus/templates/tasks/app/routes/extensions._index.tsx +11 -0
  231. package/corpus/templates/tasks/app/routes/extensions.tsx +5 -0
  232. package/corpus/templates/tasks/app/routes/fields.tsx +16 -0
  233. package/corpus/templates/tasks/app/routes/inbox.tsx +16 -0
  234. package/corpus/templates/tasks/app/routes/tasks.tsx +17 -0
  235. package/corpus/templates/tasks/app/routes/team.tsx +17 -0
  236. package/corpus/templates/tasks/app/routes.ts +4 -0
  237. package/corpus/templates/tasks/app/vite-env.d.ts +6 -0
  238. package/corpus/templates/tasks/components.json +20 -0
  239. package/corpus/templates/tasks/data/sync-config.json +1 -0
  240. package/corpus/templates/tasks/docs/features/README.md +81 -0
  241. package/corpus/templates/tasks/docs/features/f1-tasks.mdx +67 -0
  242. package/corpus/templates/tasks/docs/features/f2-custom-fields.mdx +68 -0
  243. package/corpus/templates/tasks/docs/features/f3-projects.mdx +33 -0
  244. package/corpus/templates/tasks/docs/features/f4-inbox.mdx +55 -0
  245. package/corpus/templates/tasks/docs/features/f5-views.mdx +65 -0
  246. package/corpus/templates/tasks/docs/features/f6-search.mdx +43 -0
  247. package/corpus/templates/tasks/docs/features/f7-first-run.mdx +66 -0
  248. package/corpus/templates/tasks/docs/features/f8-chat.mdx +120 -0
  249. package/corpus/templates/tasks/e2e/global-setup.ts +42 -0
  250. package/corpus/templates/tasks/e2e/helpers/inbox.ts +71 -0
  251. package/corpus/templates/tasks/e2e/helpers/tasks.ts +99 -0
  252. package/corpus/templates/tasks/learnings.defaults.md +5 -0
  253. package/corpus/templates/tasks/netlify.toml +10 -0
  254. package/corpus/templates/tasks/package.json +104 -0
  255. package/corpus/templates/tasks/playwright.config.ts +34 -0
  256. package/corpus/templates/tasks/public/agent-native-icon-dark.svg +10 -0
  257. package/corpus/templates/tasks/public/agent-native-icon-light.svg +10 -0
  258. package/corpus/templates/tasks/public/agent-native-logo-dark.svg +21 -0
  259. package/corpus/templates/tasks/public/agent-native-logo-light.svg +21 -0
  260. package/corpus/templates/tasks/public/favicon.svg +1 -0
  261. package/corpus/templates/tasks/public/icon-180.svg +1 -0
  262. package/corpus/templates/tasks/public/icon-192.svg +1 -0
  263. package/corpus/templates/tasks/public/icon-512.svg +1 -0
  264. package/corpus/templates/tasks/public/manifest.json +21 -0
  265. package/corpus/templates/tasks/react-router.config.ts +7 -0
  266. package/corpus/templates/tasks/server/custom-fields/normalize.ts +163 -0
  267. package/corpus/templates/tasks/server/custom-fields/parse.ts +146 -0
  268. package/corpus/templates/tasks/server/custom-fields/schema.ts +147 -0
  269. package/corpus/templates/tasks/server/custom-fields/store.ts +425 -0
  270. package/corpus/templates/tasks/server/custom-fields/task-fields.ts +104 -0
  271. package/corpus/templates/tasks/server/custom-fields/types.ts +98 -0
  272. package/corpus/templates/tasks/server/custom-fields/validate.ts +210 -0
  273. package/corpus/templates/tasks/server/custom-fields/values/store.ts +386 -0
  274. package/corpus/templates/tasks/server/db/bulk-write.ts +30 -0
  275. package/corpus/templates/tasks/server/db/index.ts +5 -0
  276. package/corpus/templates/tasks/server/db/record-utils.ts +7 -0
  277. package/corpus/templates/tasks/server/db/schema.ts +67 -0
  278. package/corpus/templates/tasks/server/db/test-tasks-table.ts +76 -0
  279. package/corpus/templates/tasks/server/db/transaction.ts +6 -0
  280. package/corpus/templates/tasks/server/errors.ts +31 -0
  281. package/corpus/templates/tasks/server/inbox/store.ts +216 -0
  282. package/corpus/templates/tasks/server/middleware/auth.ts +15 -0
  283. package/corpus/templates/tasks/server/plugins/agent-chat.ts +46 -0
  284. package/corpus/templates/tasks/server/plugins/auth.ts +15 -0
  285. package/corpus/templates/tasks/server/plugins/db.ts +90 -0
  286. package/corpus/templates/tasks/server/routes/[...page].get.ts +5 -0
  287. package/corpus/templates/tasks/server/stored-items/store.ts +548 -0
  288. package/corpus/templates/tasks/server/tasks/store.ts +306 -0
  289. package/corpus/templates/tasks/server/user-config/store.ts +138 -0
  290. package/corpus/templates/tasks/shared/app-state-tabs.ts +15 -0
  291. package/corpus/templates/tasks/shared/boolean-param.ts +22 -0
  292. package/corpus/templates/tasks/shared/bulk-limits.ts +7 -0
  293. package/corpus/templates/tasks/shared/list-screen-snapshot.ts +90 -0
  294. package/corpus/templates/tasks/shared/navigation.ts +104 -0
  295. package/corpus/templates/tasks/shared/visible-task-fields.ts +2 -0
  296. package/corpus/templates/tasks/ssr-entry.ts +15 -0
  297. package/corpus/templates/tasks/tsconfig.json +24 -0
  298. package/corpus/templates/tasks/vite.config.ts +19 -0
  299. package/corpus/templates/tasks/vitest.config.ts +8 -0
  300. package/dist/cli/templates-meta.d.ts.map +1 -1
  301. package/dist/cli/templates-meta.js +13 -0
  302. package/dist/cli/templates-meta.js.map +1 -1
  303. package/dist/client/agent-page/AgentTabsPage.js +1 -1
  304. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  305. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  306. package/dist/client/org/OrgSwitcher.js +2 -1
  307. package/dist/client/org/OrgSwitcher.js.map +1 -1
  308. package/dist/collab/routes.d.ts +1 -1
  309. package/dist/collab/struct-routes.d.ts +1 -1
  310. package/dist/notifications/routes.d.ts +2 -2
  311. package/dist/observability/routes.d.ts +5 -5
  312. package/dist/resources/handlers.d.ts +3 -3
  313. package/dist/secrets/routes.d.ts +9 -9
  314. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  315. package/dist/server/transcribe-voice.d.ts +1 -1
  316. package/package.json +1 -1
@@ -0,0 +1,634 @@
1
+ ---
2
+ name: visual-recap
3
+ description: >-
4
+ Turn a PR, branch, commit, or git diff into an interactive visual recap with
5
+ diagrams, file maps, API/schema summaries, annotated diffs, and focused review
6
+ notes.
7
+ metadata:
8
+ visibility: exported
9
+ ---
10
+
11
+ ## Installed Mode
12
+
13
+ Default storage for this installation: local files. Create and update plans and
14
+ recaps as MDX folders under `plans/<slug>/` when they should be checked in, or
15
+ under a repo-ignored/temp folder when they should stay private scratch. Before
16
+ authoring structured MDX, run
17
+ `npx @agent-native/core@latest plan blocks --out plan-blocks.md` and read the
18
+ no-auth block catalog; it sends no plan content. Then run
19
+ `npx @agent-native/core@latest plan local check --dir plans/<slug>`, then
20
+ `npx @agent-native/core@latest plan local serve --dir plans/<slug> --kind plan|recap --open`,
21
+ and report the local bridge URL from stdout or `plans/<slug>/.plan-url`. Treat
22
+ `.plan-url` as a local token file and do not commit it. It opens the hosted Plan
23
+ UI but reads from the localhost bridge on this machine, so it is not shareable
24
+ across machines. On macOS, use Chrome/Chromium if Safari blocks the localhost
25
+ bridge; run `plan local verify --dir plans/<slug> --kind plan|recap` for
26
+ headless diagnostics. No sharing, all local. Use a hosted or self-hosted Plan MCP
27
+ connector only if the user explicitly asks to publish or share.
28
+
29
+
30
+ # Visual Recap
31
+
32
+ `/visual-recap` creates a visual plan built **from** a diff, not toward one. It
33
+ is the reverse of forward planning: instead of describing the change you are
34
+ about to make, you describe the change that was just made, at a higher altitude
35
+ than line-by-line review. The same plan data model serves both directions —
36
+ schema, API, file, and architecture changes become the same `data-model`,
37
+ `api-endpoint`, `file-tree`, and `diagram` blocks a forward plan would use, only
38
+ now they summarize work that exists. A reviewer scans the shape of the change
39
+ before spending attention on the literal lines.
40
+
41
+ ## Local-Files Privacy Mode Exception
42
+
43
+ Use local-files privacy mode when the user explicitly asks for no DB writes,
44
+ no hosted Plan database writes, no Plan MCP publish, fully local files, offline/private
45
+ recaps, or when `AGENT_NATIVE_PLANS_MODE=local-files` is set. This is the only
46
+ exception to the hosted publish rule below.
47
+
48
+ In local-files mode:
49
+
50
+ - Read the diff/stat/source context from local files and shell commands only.
51
+ The existing `npx @agent-native/core@latest recap collect-diff`, `scan`, and
52
+ `build-prompt --local-files` helpers are safe to use because they operate on
53
+ local files and do not write to the Plan database.
54
+ - Fetch/read the block catalog before writing structured MDX. Use
55
+ `npx @agent-native/core@latest plan blocks --out plan-blocks.md` when the Plan
56
+ MCP connector is not registered; it calls the public no-auth
57
+ `get-plan-blocks` route and sends no recap content. If network access is
58
+ unavailable, use the bundled references and validate the MDX with
59
+ `plan local check`; do not run `plan local serve` unless the hosted Plan UI is
60
+ reachable or a local Plan app is already running. For `checklist` and `question-form`,
61
+ copy the catalog examples verbatim: checklist items need `id` and `label`;
62
+ question-form questions need `id`, `title`, and `mode`; and each option needs
63
+ `id` and `label`. `plan local check` validates these required fields against
64
+ the renderer schema.
65
+ - Write the recap as a local MDX folder: use `plans/<slug>/` when the user
66
+ wants the artifact checked into the repo, or use a repo-ignored/temporary
67
+ folder such as `.agent-native/plans/<slug>/` or `/tmp/agent-native-plans/<slug>/`
68
+ when it should not be checked in. The folder contains `plan.mdx`, optional
69
+ `canvas.mdx`, optional `prototype.mdx`, and optional `.plan-state.json`. Set
70
+ `kind: "recap"` and `localOnly: true` in frontmatter/state when authoring the
71
+ source. Use that exact chosen folder as `<plan-dir>` in every local CLI command
72
+ below.
73
+ - Run `npx @agent-native/core@latest plan local check --dir <plan-dir>` before
74
+ any preview. When the hosted Plan UI is reachable, run
75
+ `npx @agent-native/core@latest plan local serve --dir <plan-dir> --kind recap --open`.
76
+ Report the returned local bridge URL from stdout or `<plan-dir>/.plan-url`.
77
+ Treat `.plan-url` as a local token file and do not commit it. The URL opens
78
+ the hosted Plan UI but reads from the localhost bridge on this machine, so it
79
+ is not shareable across machines. On macOS, `--open` prefers Chromium browsers;
80
+ if Safari opens, switch to Chrome/Chromium because Safari can block the hosted
81
+ HTTPS page from fetching the HTTP localhost bridge. If the Plan app itself is
82
+ running locally with the same `PLAN_LOCAL_DIR`, the `/local-plans/<slug>` route
83
+ is also valid. In a truly offline environment, hand off the local `<plan-dir>`
84
+ path after `plan local check` and note that interactive preview requires either
85
+ network access to the hosted Plan UI or a running local Plan app.
86
+ - For headless verification, run
87
+ `npx @agent-native/core@latest plan local verify --dir <plan-dir> --kind recap`.
88
+ It starts the bridge, checks the private-network preflight and JSON payload,
89
+ prints diagnostics, and exits. If the browser hangs on "Loading plan", fetch
90
+ the `bridgeUrl` from the verify/serve JSON to read the concrete validation
91
+ error.
92
+ - Do **not** call `create-visual-recap`, `create-visual-plan`,
93
+ `import-visual-plan-source`, `update-visual-plan`,
94
+ `patch-visual-plan-source`, `get-plan-feedback`, `export-visual-plan`,
95
+ `set-resource-visibility`, or any hosted Plan tool for that recap except the
96
+ schema-only block catalog lookup above.
97
+ - Treat review feedback as file or chat feedback: update the MDX files directly,
98
+ rerun `plan local check`, and rerun `serve` or `verify` only when that preview
99
+ path is available. Summarize the new local URL when one exists; otherwise
100
+ summarize the checked local folder path.
101
+ Hosted comments, sharing, screenshots, usage attachment, and PR sticky comment
102
+ publishing are unavailable until the user explicitly opts into publishing.
103
+
104
+ Local-files mode prevents recap content from going to the Agent-Native Plan
105
+ database. It does not by itself make the coding agent's language model local;
106
+ for that stronger privacy boundary, the host agent/model must also be local or
107
+ otherwise approved by the user.
108
+
109
+ ## Always Publish As An Agent-Native Plan — Never Inline
110
+
111
+ The deliverable is ALWAYS a published Agent-Native Plan, created with the
112
+ `create-visual-recap` tool on the Plan MCP connector. The connector is usually
113
+ exposed as the `plan` server, but older installed agents may expose the same
114
+ hosted connector as `agent-native-plans`; both names are valid. NEVER hand the
115
+ recap to the user as inline chat content — not Markdown prose, not an ASCII
116
+ sketch, not a table, not a fenced "wireframe", not a "here's the recap" summary.
117
+ A recap's entire value is the hosted, interactive, annotatable plan; an inline
118
+ summary is not a recap, it is the thing a recap replaces. The only supported
119
+ output is to publish the plan and return its absolute URL.
120
+
121
+ Some clients lazy-load connector tools through a deferred tool registry instead
122
+ of showing the `plan` namespace upfront. Before declaring the Plan connector
123
+ missing, search/load tools with the host's discovery surface (`tool_search` when
124
+ available) for `create_visual_recap`, `create_visual_plan`, or
125
+ `get_plan_blocks`, then use the Plan MCP tools it exposes.
126
+
127
+ Except for the explicit local-files privacy mode above, if neither the `plan`
128
+ nor legacy `agent-native-plans` Plan MCP tools are available after deferred tool
129
+ discovery, do NOT improvise an inline recap as a fallback. Do not report the
130
+ connector as disconnected just because it is named `agent-native-plans` instead
131
+ of `plan`, or because the tools were not visible before discovery. The usual
132
+ cause is a connector that did not finish connecting this session (it registers
133
+ zero tools), NOT necessarily an auth problem — so do not assume the user must
134
+ authenticate. Stop and tell the user how to restore it for their current client: in
135
+ Codex/Codex Desktop, run
136
+ `npx -y @agent-native/core@latest reconnect https://plan.agent-native.com --client codex`
137
+ and start a new Codex session; in Claude Code, run `/mcp` and choose
138
+ Authenticate/Reconnect, or run the reconnect command with `--client claude-code`
139
+ and restart Claude. Auth is stored per client config/session; `--client all`
140
+ refreshes every local client config that already has the Plan entry, but each
141
+ running client still has to reload its MCP tools. Reconnect re-authenticates
142
+ WITHOUT reinstalling and finds the entry by URL regardless of connector name.
143
+ Never reinstall from scratch just to fix auth. Then publish once the tool is
144
+ reachable. Falling back to inline content is a defect, not a degraded mode.
145
+
146
+ ## When To Use
147
+
148
+ Build a recap when a PR or commit is large, multi-file, or touches schema, API
149
+ contracts, or architecture, and a reviewer would benefit from seeing the change
150
+ mapped to structured blocks before reading the raw diff. A GitHub Action can
151
+ generate one automatically from a PR diff; an agent can generate one on request
152
+ ("recap this PR", "show me what this branch changed"). Skip it for small,
153
+ single-file, or obvious diffs — a recap is review overhead, and a tiny change
154
+ reviews faster as plain diff.
155
+
156
+ ## Recap The Whole Work Unit
157
+
158
+ When `/visual-recap` is invoked in a chat thread after work has already happened,
159
+ the default scope is the whole current work unit/thread, not only the most recent
160
+ user message, tool action, or follow-up fix. Gather the thread-owned changes
161
+ across the conversation: original implementation work, later bug fixes, UI
162
+ follow-ups, tests, changesets, skill/instruction updates, generated plan/source
163
+ artifacts, and any local import/linking fixes needed to make the recap open.
164
+
165
+ Use the current diff plus conversation context to separate thread-owned changes
166
+ from unrelated dirty work that existed before the thread. Exclude unrelated
167
+ pre-existing edits. If the scope is genuinely ambiguous and cannot be inferred,
168
+ state the assumption or ask a concise question before publishing.
169
+
170
+ When updating an existing recap after feedback, revise the recap so it still
171
+ covers the whole thread/work unit plus the new correction. Do not replace a broad
172
+ recap with a narrow recap of only the latest feedback unless the user explicitly
173
+ asks for that narrower scope.
174
+
175
+ ## Keep The Recap Body Lean
176
+
177
+ Do not add boilerplate intro, disclaimer, provenance, or summary prose blocks to
178
+ the generated plan body. In particular, do not create a `rich-text` block just to
179
+ say the recap is an aid, that the reviewer should still review the diff, how many
180
+ files changed, or which ref/working tree generated the recap. The plan title,
181
+ brief, and `file-tree` (which carries the per-file change stats) already carry
182
+ that context.
183
+
184
+ Only add prose blocks when they tell the reviewer something specific about the
185
+ change that the structured blocks do not: the objective, a real compatibility
186
+ risk, an important decision visible in the diff, or a grounded review note.
187
+
188
+ ## Recaps Must Be Substantial
189
+
190
+ Lean is not the same as thin. A recap is not a single wireframe plus one
191
+ sentence — that under-serves the reviewer as much as boilerplate prose over-serves
192
+ them. Alongside the visual/structural headline (wireframes, `data-model`,
193
+ `api-endpoint`, `diagram`), a substantial recap also carries the implementation
194
+ evidence:
195
+
196
+ - A short surface/state inventory before authoring: list the changed routes,
197
+ components, popovers/dialogs, role/access states, empty/error states, and
198
+ shared abstractions visible in the diff. The final recap must either represent
199
+ each meaningful item with a block or intentionally omit it because it is tiny,
200
+ redundant, or not user-visible.
201
+ - A `file-tree` of the changed files with each entry's `change` flag, so the
202
+ reviewer sees the footprint of the work at a glance.
203
+ - The split `diff` of the KEY changed files, grouped under a `## Key changes`
204
+ `rich-text` heading in a single horizontal `tabs` block (the default
205
+ orientation, one file per tab), with a one-line `summary` and a few
206
+ `annotations` on each — so the reviewer can drop from the high-altitude shape
207
+ straight into the load-bearing code. Use horizontal file tabs, not a vertical
208
+ side rail, so the selected file has enough width for the side-by-side diff.
209
+
210
+ Skip the diff appendix only for a genuinely tiny change that reviews faster as
211
+ plain diff (see "When To Use"); for any change worth recapping, the file-tree and
212
+ key-change diffs belong in the plan.
213
+
214
+ ## Canonical Shape And Budgets
215
+
216
+ A strong recap follows one skeleton, top to bottom:
217
+
218
+ 1. UI-impact headline — wireframes first, when the diff changed rendered UI.
219
+ 2. Short outcome narrative (`rich-text`): what changed and why, 1-3 paragraphs.
220
+ 3. `data-model` / `api-endpoint` blocks for schema and contract changes.
221
+ 4. `file-tree` of the changed files with `change` flags.
222
+ 5. `## Key changes` — one horizontal `tabs` block of `diff` / `annotated-code`.
223
+
224
+ Budgets that keep the recap reviewable:
225
+
226
+ - 3-8 key-change tabs. Fewer than 3 on a large change under-serves the
227
+ reviewer; more than 8 stops being a summary.
228
+ - Keep each diff/annotated-code excerpt focused — prefer under ~150 lines per
229
+ tab; summarize or link the rest of a long file instead of dumping it.
230
+ - Title at most ~70 characters; brief 1-3 sentences.
231
+
232
+ **GOOD.** A 25-file auth change: Before/After wireframes of the login surface,
233
+ a two-paragraph narrative, a diff-aware `data-model` of the sessions table, an
234
+ `api-endpoint` for the new refresh route, a `file-tree` with change flags, and
235
+ `## Key changes` with five focused tabs, each with a one-line `summary` and a
236
+ few annotations on the load-bearing hunks.
237
+
238
+ **BAD.** One giant unsegmented diff dump with no summaries or annotations; or a
239
+ sparse three-block recap of a 40-file change (one wireframe, one sentence, one
240
+ file list) that forces the reviewer back into the raw diff anyway.
241
+
242
+ ## UI Impact Needs Wireframes
243
+
244
+ When the diff changes rendered UI, layout, density, visual state, interaction
245
+ affordances, navigation, controls, menus, dialogs, or design tokens, the recap
246
+ MUST include one or more wireframes. Prose and file diffs are not a substitute
247
+ for showing what changed visually.
248
+
249
+ Before choosing wireframes, make a UI coverage pass from the diff:
250
+
251
+ - Identify the entry surface where the change appears, such as a page header,
252
+ list row, toolbar, route shell, or menu trigger.
253
+ - Identify the interaction surface that opens or changes, such as a popover,
254
+ dialog, tab, sheet, dropdown, inline editor, or toast.
255
+ - Identify the resulting destination or persistent state, such as a public page,
256
+ read-only view, empty state, error state, loading state, permission-denied
257
+ state, or saved/shared state.
258
+ - Identify access or role variants when permissions change. Owner/admin/editor
259
+ versus viewer/non-manager differences are visual behavior and need a compact
260
+ matrix, paired wireframes, or clearly labeled state sequence.
261
+
262
+ For UI-heavy PRs, a single before/after of the entry surface is not enough.
263
+ Show the changed entry point, the main changed interaction surface, and the
264
+ resulting/destination state. Add more states when the diff adds tabs, role-based
265
+ controls, public/private visibility, invite/manage flows, destructive controls,
266
+ or empty/error branches.
267
+
268
+ Choose the smallest visual surface that makes the review clear:
269
+
270
+ - Use a `Before` / `After` wireframe pair when the reviewer benefits from direct
271
+ comparison, such as a removed or added control, a changed state, layout
272
+ density, ordering, navigation, or a visible component replacement.
273
+ `references/wireframe.md` owns how to lay that pair out (columns vs.
274
+ vertical stack by geometry).
275
+ - Use an after-only wireframe when the change is purely additive or the "before"
276
+ state would only show absence without adding review value.
277
+ - Use more than two wireframes when the UI change is flow-dependent, responsive,
278
+ or stateful; show the meaningful states in order instead of forcing a single
279
+ before/after pair.
280
+ - For tiny surfaces like menus, popovers, dialogs, toasts, or panels, use the
281
+ matching `surface` (`popover`, `panel`, etc.) and show the focused sub-surface.
282
+ Do not redraw a full page unless placement in the page is itself part of the
283
+ change.
284
+
285
+ Ground each wireframe in the changed UI behavior, component names, file paths,
286
+ and diff-visible labels/states. If exact pixels are inferred rather than
287
+ captured, say so in the wireframe caption or a concise annotation. For
288
+ local/manual recaps, import or update the plan source that holds the wireframes
289
+ so the rendered recap opens with the UI visual available.
290
+
291
+ ## Wireframe Quality — read `references/wireframe.md`
292
+
293
+ UI recap/plan wireframes must meet a strict quality bar — full-width chrome,
294
+ pinned bottom bars, real product content, before/after comparability, the right
295
+ `surface` preset, `--wf-*` tokens instead of hex, and no `<html>`/`<style>`/font
296
+ tags. Before authoring ANY wireframe / `<Screen>` / `WireframeBlock`, READ
297
+ `references/wireframe.md` in this skill directory — it is the single source of
298
+ truth for HTML wireframe quality, shared word for word with `/visual-plan`
299
+ and `/visual-recap`. Do not author wireframes from memory.
300
+
301
+ Use the standard `WireframeBlock` / `<Screen>` format so the Plan viewer owns the
302
+ surface frame, theme, and sketchy/clean toggle. HTML wireframes are appropriate
303
+ when placement precision matters, especially popovers, menus, dialogs, and dense
304
+ forms. For HTML
305
+ wireframes, keep `renderMode` unset or `wireframe` unless a design-only editable
306
+ mockup is explicitly required, because `renderMode="design"` disables the
307
+ sketchy rough overlay.
308
+
309
+ When a browser tool is available, render a UI-impact recap in the Plan viewer
310
+ and visually inspect it at the current theme before sharing. If any label,
311
+ annotation, toolbar, or wireframe content overlaps another element, fix the MDX
312
+ and re-import before reporting the link. A text-match screenshot is not enough;
313
+ visually inspect the captured image. When no browser is available (for example
314
+ a headless CI agent), state that in the recap handoff instead.
315
+
316
+ ## Top Canvas Recaps — read `../visual-plan/references/canvas.md`
317
+
318
+ When a recap includes a top canvas, storyboard, or flow view, READ
319
+ `../visual-plan/references/canvas.md` before authoring `canvas.mdx`. Recap
320
+ canvas artboards must use the same HTML wireframe path as good document-body
321
+ wireframes: `<Screen surface="..." html={...} />` with a semantic HTML fragment.
322
+ Do not author fresh kit-tree children such as `<FrameScreen>`, `<Card>`,
323
+ `<Row>`, `<Title>`, or `<Btn>` inside canvas `<Screen>` tags. Those components
324
+ are legacy compatibility markup for old plans; in new canvas storyboards they
325
+ can produce cramped or overlapping layouts even when the inline body wireframe
326
+ looks good. If a canvas mockup looks worse than the same screen below the fold,
327
+ assume it used the legacy kit path and replace it with an HTML screen.
328
+
329
+ ## Open And Report The Recap
330
+
331
+ In local-files privacy mode, run `plan local check` first, then report the local
332
+ bridge URL from
333
+ `npx @agent-native/core@latest plan local serve --dir <plan-dir> --kind recap --open`
334
+ or from `<plan-dir>/.plan-url`. It opens the hosted Plan UI but reads from the
335
+ localhost bridge on this machine, so it is not shareable across machines. If the
336
+ Plan app itself is running locally with the same `PLAN_LOCAL_DIR`, the
337
+ `/local-plans/<slug>` route is also valid. Do not invent a hosted database URL
338
+ and do not publish just to get an absolute Plan link.
339
+
340
+ After creating the recap, link the reviewer to the rendered plan with an
341
+ **absolute URL on the origin whose database actually holds the plan**. That
342
+ origin is the Plan MCP server you just created the recap through — NOT whatever
343
+ dev server you happen to know is running. The create tool returns the correct
344
+ link; report THAT. Never make the primary link a local `plan.mdx` file, a local
345
+ mirror folder, or a relative path such as `/plans/<id>`.
346
+
347
+ When the recap is posted to a PR for a private repo, the plan link is not a
348
+ public URL. Make the PR comment/handoff copy explicit: reviewers may need to
349
+ sign in to Agent-Native Plans with an account that has access to the owning
350
+ organization before the link loads. Use wording like: "Private repo recap:
351
+ sign in with access to this org if the plan does not open." Do not imply the
352
+ link is broken or public when access is gated by repo/org visibility.
353
+
354
+ A recap lives only in the database of the MCP that created it. A separately
355
+ running local dev server (e.g. `http://localhost:8081`) has its OWN database and
356
+ will NOT contain a recap created through the hosted MCP, so a hand-built
357
+ `localhost` link returns "Plan not found". This is the most common recap
358
+ mistake — do not guess an origin you have not confirmed shares the MCP's data.
359
+
360
+ Resolve the URL in this order:
361
+
362
+ 1. Use the absolute URL the create tool RETURNS — `openLink.webUrl`, else the
363
+ `visualUrl` in the returned `plan.mdx` frontmatter, else `url`/`path`
364
+ resolved against the MCP server's own origin (for the hosted MCP that is
365
+ `https://plan.agent-native.com`). This always points at the database that has
366
+ the plan.
367
+ 2. Use a `localhost`/dev origin ONLY when the recap was created through a Plan
368
+ MCP bound to that same origin — i.e. that MCP's url is
369
+ `http://localhost:<port>/_agent-native/mcp`. Creating through the hosted MCP
370
+ and linking to localhost is the exact mismatch that 404s.
371
+ 3. If only a plan id is available, build the MCP origin's absolute URL
372
+ (hosted: `https://plan.agent-native.com/plans/<id>`) and say it was inferred.
373
+
374
+ If the user wants to review on localhost but the recap was created through the
375
+ hosted MCP, say so plainly: the local dev server cannot see it. To view a recap
376
+ on localhost (e.g. to exercise un-deployed local renderer changes), they must
377
+ connect a LOCAL Plan MCP (`http://localhost:<port>/_agent-native/mcp`) and
378
+ re-create the recap through it so it lands in the local database; offer to do
379
+ that rather than handing over a localhost URL that will not resolve.
380
+
381
+ When running in Codex and the Browser/in-app side browser tools are available,
382
+ open the returned absolute recap URL there automatically after creation. Still
383
+ include the same absolute URL in the final response. Local mirror files like
384
+ `plans/<slug>/plan.mdx` may be mentioned only as secondary source-control
385
+ artifacts, not as the main way to open the recap.
386
+
387
+ ## Diff → Block Mapping
388
+
389
+ Map each kind of change to the block that carries it, derived mechanically from
390
+ the actual diff. The names below are the CONCEPTUAL block types, not the JSX
391
+ tags — resolve every conceptual name to its exact tag + prop schema with the
392
+ `get-plan-blocks` tool (see "Block reference" below) before authoring.
393
+
394
+ - **Schema / migration change** → `data-model` for the resulting entities,
395
+ fields, and relations. Flag what moved per field/entity with
396
+ `change: "added" | "modified" | "removed" | "renamed"`, and for a changed type
397
+ set `was` to the prior value (e.g. the old column type) — grounded in the real
398
+ migration diff. That diff-aware `data-model` is the headline; reach for a split
399
+ `diff` of the literal SQL only when the exact statement still matters, not by
400
+ default.
401
+ - **API / action / route change** → `api-endpoint` with the method, path,
402
+ params, request, and responses as they are after the change. Flag each changed
403
+ param/response with `change` (and `was` on a param whose type/shape changed),
404
+ and set `change` on the endpoint root for a wholly added or removed route. Mark
405
+ removed endpoints with `deprecated: true` and explain in prose.
406
+ Keep multiple API endpoints in the normal single-column document flow unless
407
+ they are an explicit before/after contract comparison.
408
+ Author each request/response example as a SINGLE valid JSON value — one
409
+ top-level object or array, parseable on its own — so it renders in the
410
+ collapsible JSON explorer. Do not put `//` or `/* */` comments, prose,
411
+ trailing commas, or two or more concatenated top-level objects inside one
412
+ example; a non-parseable body falls back to flat text and loses the explorer.
413
+ When an endpoint has several distinct message shapes (for example separate
414
+ websocket frame types, or a success body versus an error body), give each its
415
+ OWN example with its own label rather than cramming them into one body.
416
+ - **Compatibility-sensitive change** → short `rich-text` notes beside the
417
+ relevant `data-model` / `api-endpoint` block. Name the changed field,
418
+ endpoint, or behavior and mark whether it is breaking, risky, or non-breaking;
419
+ pair that note with a split `diff` for the literal lines.
420
+ - **Any meaningful code hunk** → `diff` with `mode: "split"`, carrying the real
421
+ `before` / `after` text and the `filename` / `language`. Split mode is the
422
+ default for recap code review because before/after legibility is the point;
423
+ use `mode: "unified"` only for a genuinely narrow standalone hunk where
424
+ side-by-side would hide the code. Give every `diff` a one-line `summary`
425
+ saying what the hunk changes and why; it renders as a description above the
426
+ code so the reviewer reads intent first. Never leave a diff unlabeled.
427
+ For the KEY changed files, attach `annotations` to the `diff` so the recap
428
+ calls out what each important hunk does — this is the headline affordance for
429
+ annotating the key files updated. Each annotation anchors to the AFTER-side
430
+ line numbers by default (set `side: "before"` to point at removed lines). Keep
431
+ it to a few high-signal notes per file, not one per line.
432
+ When several key files each need a substantial diff, introduce the group with a
433
+ `rich-text` heading block whose markdown is `## Key changes`, then place the
434
+ `diff` blocks under it in a reusable `tabs` block with horizontal orientation
435
+ (the default — omit `orientation`) so the selected file's split diff gets the
436
+ full document width. Let that heading label the section — do NOT also set a
437
+ `title` on the `tabs` block. Keep each tab label to the file path or a short
438
+ basename plus directory hint.
439
+ The renderer's wide document layout is intentionally allowlisted: `diff`,
440
+ `annotated-code`, vertical `tabs`, and `tabs` containing diff-like children
441
+ break out wider than prose. Do not put API endpoints, OpenAPI specs, data
442
+ models, JSON explorers, wireframes, question forms, or custom HTML into tabs
443
+ merely to make them wide.
444
+ If the recap ends with more than one supporting diff, that trailing diff
445
+ appendix should be one horizontal `tabs` block under its own `## Key changes`
446
+ heading, not a stack of separate `diff` blocks.
447
+ - **Brand-new file or a substantial added block with no meaningful "before"** →
448
+ `annotated-code` rather than a one-sided split `diff`. Carry the real new code
449
+ with its `filename` / `language` and anchor a few high-signal notes to the lines
450
+ that matter so the reviewer reads what the new code does, not code for code's
451
+ sake. Keep split `diff` for true before/after hunks where the removed lines
452
+ still carry meaning, and group several annotated walkthroughs in a horizontal
453
+ `tabs` block the same way diffs are grouped.
454
+ - **Files added / removed / renamed** → `file-tree` with each entry's `change`
455
+ flag (`added`, `removed`, `modified`, `renamed`) and a short `note`; attach a
456
+ `snippet` only when one tells the reviewer something the path does not.
457
+ - **Rendered UI / interaction change** → one or more wireframes showing the
458
+ visible UI delta before the reviewer reads code. Use `Before` / `After`
459
+ wireframes when the comparison clarifies the change; otherwise use after-only
460
+ or a short state/flow sequence. Use realistic UI surfaces: for a popover
461
+ change, show a popover with its title row, top-right actions, options/fields,
462
+ tabs, selected/disabled states, people/lists/rows, and any opened prompt/menu
463
+ anchored to the correct trigger. If a route was added, show the route body and
464
+ the unavailable/empty state when the diff implements one. If permissions
465
+ changed, show what managers can do and what viewers/non-managers see instead.
466
+ Keep the body lean: the wireframe carries the UI story, while the file tree
467
+ and `diff` blocks carry implementation evidence.
468
+ - **Architecture or data-flow shift** → `diagram` with `data.html` / `data.css`
469
+ as a two-panel before/after, layered, or swimlane layout, or `mermaid` for a
470
+ quick graph. Use two-dimensional layouts; do not reduce a structural change to
471
+ a left-to-right chain. Do not use `diagram` as a stand-in for rendered UI
472
+ controls; UI changes need `wireframe` blocks.
473
+ Author diagram HTML/CSS with the renderer-owned `.diagram-*` primitives
474
+ (`.diagram-panel`, `.diagram-node`, `.diagram-pill`, `[data-rough]`, …) and
475
+ the same `--wf-*` theme tokens `references/wireframe.md` defines — never
476
+ `font-family`, hex, rgb/hsl literals, or one-off dark/light palettes.
477
+ - **Outcome-first narrative** → `rich-text` for the "what changed and why" prose:
478
+ the objective the diff served, the key decisions visible in it, and the risks a
479
+ reviewer should weigh. This is the only place the model writes freely.
480
+
481
+ ## Block reference — call `get-plan-blocks`, do not memorize tags
482
+
483
+ The conceptual block names above (`api-endpoint`, `data-model`, `json-explorer`,
484
+ `tabs`, …) are NOT the JSX tags you author with, and the exact tags, required
485
+ fields, and prop shapes change as the block library evolves. Do not author from
486
+ memorized tags — they drift and silently produce a wrong tag (`ApiEndpoint`
487
+ instead of `Endpoint`, `JsonExplorer` instead of `Json`, `Tabs` instead of
488
+ `TabsBlock`) that errors on import.
489
+
490
+ **Before writing any structured plan content, fetch/read the block catalog.** In
491
+ hosted or self-hosted mode, call `get-plan-blocks` on the Plan MCP connector
492
+ (`plan` or legacy `agent-native-plans`). If no Plan tools are visible yet in a
493
+ lazy-loading client, search/load them through the host's tool discovery surface
494
+ first (`tool_search` when available). In local-files mode, or when the skill was
495
+ installed as plain text and no MCP tools are registered after discovery, run
496
+ `npx @agent-native/core@latest plan blocks --out plan-blocks.md` and read that
497
+ file first. The CLI command calls the public no-auth `get-plan-blocks` route and
498
+ sends no plan/recap content. If network access is unavailable, use the bundled
499
+ references and validate with `plan local check`; run `plan local serve` only
500
+ when the hosted Plan UI is reachable or a local Plan app is already running.
501
+
502
+ The catalog returns the authoritative, always-current block vocabulary generated
503
+ live from the app's own block registry — the same config the renderer and MDX
504
+ round-trip use — so it can never be stale even if this SKILL.md is an old
505
+ installed copy:
506
+
507
+ - `get-plan-blocks` (default `format: "reference"`) → a compact table of every
508
+ block's runtime `type`, exact MDX `<Tag>`, placement, and key data fields.
509
+ This is your map from each conceptual name above to its real tag and props.
510
+ - `get-plan-blocks` with `format: "schema"` → the full per-block JSON Schema
511
+ plus a worked example for each block, when you need exact field types,
512
+ enums, or nesting (e.g. `Diff.annotations`, `Endpoint.params[].in`,
513
+ `DataModel.entities[].fields[]`).
514
+
515
+ Author the recap source against the tags and schemas that call returns. The
516
+ complete set of valid block-level tags is whatever `get-plan-blocks` lists;
517
+ any other capitalized tag at the block level is rejected on import with an
518
+ "Unknown plan block" / "did you mean" error. Lowercase HTML tags inside
519
+ `rich-text`/markdown prose (`<div>`, `<span>`, `<code>`, `<br>`, …) are always
520
+ fine — only capitalized component-style block tags are validated.
521
+
522
+ A few recap-specific authoring rules the registry table cannot encode:
523
+
524
+ - Every block takes a REQUIRED `id` (unique across the whole plan) plus the
525
+ shared optional `summary` / `editable` envelope; give a block a heading by
526
+ placing a `rich-text` block with a Markdown `###` heading directly above it
527
+ (blocks no longer take a `title`).
528
+ - Every capitalized block component must be self-closing (`<RichText ... />`) or
529
+ explicitly closed around children (`<RichText ...>...</RichText>`). Never
530
+ leave a bare opening tag like `<RichText ...>` in a paragraph; MDX treats it
531
+ as unclosed JSX and import fails before the recap can render.
532
+ - `Endpoint`: prose `description` is the MDX **children** (body between the
533
+ tags), not an attribute; for a WebSocket upgrade use `method="GET"`. Each
534
+ request/response `example` is a JSON **string** (the renderer parses it into
535
+ the JSON explorer), so keep it a single parseable JSON value.
536
+ - `TabsBlock`: the whole `tabs` array (including nested child blocks) is ONE
537
+ JSON `tabs={[…]}` prop — there is NO nested `<Tab>` element.
538
+ - `WireframeBlock`: its body is a single `<Screen surface ... html=… />` subtree
539
+ (nested MDX, not a flat prop); `html` must be a single-quoted string or static
540
+ template literal, never a dynamic `html={someVar}` expression. See
541
+ `references/wireframe.md` for the HTML rules.
542
+ - `Diagram`: the whole payload is one `data={{ html?, css?, nodes?, edges?, … }}`
543
+ attribute and requires either `html` or at least one node; `Mermaid` is its
544
+ own separate block (`source` text), not a `Diagram` prop.
545
+
546
+ ## Before / After Is The Headline
547
+
548
+ The recap's center of gravity is the before/after comparison. For document-body
549
+ comparisons there are two primitives, and they cover the whole need together:
550
+
551
+ - **`columns`** — the side-by-side container, for **structured** comparisons.
552
+ Use two columns labeled `Before` and `After`, each holding a block (commonly a
553
+ `data-model`, `api-endpoint`, or `rich-text`), so the reviewer reads the old
554
+ shape against the new shape in one glance. This is the right primitive for
555
+ "the schema went from X to Y" or "the endpoint contract changed like this."
556
+ Do not use `columns` simply to compact or group a list of API endpoints.
557
+ - **`diff`** — for **code**. It renders the literal removed and added lines. Use
558
+ it for the actual hunks. Use split mode by default for recap code review;
559
+ reserve `mode: "unified"` for genuinely narrow standalone hunks where
560
+ side-by-side would hide the code. Key-file diff groups should use horizontal
561
+ tabs so split diffs get the full document width.
562
+
563
+ For UI diffs, wireframes are the visual comparison primitive. Use before/after
564
+ wireframes when the comparison clarifies the change; use after-only or a state
565
+ sequence when that better matches the change. The visual headline must show
566
+ exact placement, realistic chrome, and adequate padding before any abstract
567
+ explanation. Do not stop at the first visible affordance when the diff adds a
568
+ flow; show the entry point, the opened surface, and the resulting state or page
569
+ so the reviewer can trace the actual user path. `references/wireframe.md` owns
570
+ the before/after layout choice —
571
+ the `columns` renderer keeps narrow surfaces side by side and auto-stacks wide
572
+ `desktop`/`browser` frames vertically; never hand-build a side-by-side
573
+ wireframe layout in `custom-html`. For document-body
574
+ comparisons, there is no other multi-column primitive — `columns` plus the
575
+ `diff` block are the whole comparison vocabulary. Do not hand-build side-by-side
576
+ layouts in `custom-html`, and do not stack two `data-model` blocks vertically
577
+ and call it a comparison when `columns` exists to put them side by side.
578
+
579
+ ## Grounding Rule
580
+
581
+ Structured blocks are **true by construction** only if they are derived from the
582
+ actual changed lines. The `diff`, `data-model`, `api-endpoint`, and `file-tree`
583
+ blocks MUST be built mechanically from the real diff — real paths, real fields,
584
+ real method/path, real before/after text — never inferred, rounded, or invented.
585
+ The model writes only the prose: the "why", the narrative, the risk read. A
586
+ confidently wrong recap is dangerous in a review context, because a reviewer who
587
+ trusts the summary may skip the very line the summary got wrong. When the diff
588
+ does not contain a fact, leave it out rather than guess; mark anything the model
589
+ inferred (not extracted) as inferred in prose.
590
+
591
+ ## Security
592
+
593
+ - **Gate visibility.** Recaps of a private repo are org/login-gated — set the
594
+ plan's visibility to the owning org or login, never auto-public. A recap can
595
+ expose unreleased schema, internal endpoints, and architecture; treat it like
596
+ the source it summarizes. Any PR comment or handoff that links to the recap
597
+ must say that private-repo recaps require signing in with access to the owning
598
+ org if the link does not load.
599
+ - **Never transcribe secrets.** A diff can contain API keys, tokens, webhook
600
+ URLs, signing secrets, `.env` values, or credential-looking literals. Do not
601
+ copy any of these into a `diff`, `file-tree` snippet, `api-endpoint`, or prose
602
+ block — redact them (`sk-•••`, `<redacted>`). This mirrors the repo's
603
+ hardcoded-secret rule: obviously fake placeholders only, never the real value,
604
+ in any block, caption, or note.
605
+
606
+ ## Bidirectional Loop
607
+
608
+ In hosted mode, because a recap is a real, editable plan, the same review loop
609
+ as forward plans applies: a reviewer can annotate any block, and the coding
610
+ agent reads `get-plan-feedback` to drive fixes back into the code — annotation →
611
+ agent → diff, the same close-the-loop flow forward plans use. After a reviewer
612
+ annotates a block, call `get-plan-feedback` to read the structured feedback,
613
+ then either update the recap with `create-visual-recap` (passing the existing
614
+ `planId` to replace it in place) or apply targeted changes with
615
+ `update-visual-plan`. The loop is live and wired. In local-files privacy mode,
616
+ do not call those hosted tools; read review notes from chat or local files, edit
617
+ `<plan-dir>/*.mdx` directly, and rerun `plan local check`, `serve`, or `verify`
618
+ for `<plan-dir>`. The one thing not yet automatic is PR-comment-triggered
619
+ re-runs: the GitHub Action creates an initial recap per PR, but it does not yet
620
+ re-run automatically when new review feedback is posted in GitHub — that
621
+ auto-re-run is the remaining fast-follow.
622
+
623
+ ## Related Skills
624
+
625
+ - **visual-plan** — the canonical command and the source of the shared Wireframe
626
+ & Canvas and Document Quality cores; a recap follows the same block discipline
627
+ in reverse.
628
+ - **comment anchors** — recap comments use the same anchor rules as forward
629
+ plans; see "Interpreting comment anchors" in the visual-plan skill for
630
+ coordinate frames, wireframe node ids, text-quote resolution, detached
631
+ threads, routing via `resolutionTarget`, and two-axis consumed/resolved state.
632
+ - **security** — data scoping, secret handling, and the hardcoded-secret rule the
633
+ recap's redaction and visibility gating mirror.
634
+ - **sharing** — org/login-gated visibility for the plan that holds the recap.
@@ -0,0 +1,12 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "source": "agent-native",
4
+ "appSkillId": "visual-plans",
5
+ "displayName": "Agent-Native Plan",
6
+ "skillName": "visual-recap",
7
+ "contentHash": "9fd570449519afc1",
8
+ "mcpUrl": "",
9
+ "installedAt": "2026-06-24T09:25:14.735Z",
10
+ "updateCommand": "npx @agent-native/core@latest skills update visual-recap",
11
+ "planMode": "local-files"
12
+ }