@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,121 @@
1
+ # Canvas & artboard placement — single source of truth
2
+
3
+ This file is the canonical guide for how the visual-plan canvas works: artboard
4
+ placement, lane layout, annotations, patching, and the legacy kit tree. Read it
5
+ in full before authoring or editing any canvas/artboard content; do not author
6
+ canvas layouts from memory or paraphrase these rules per mode.
7
+
8
+ <!-- SHARED-CORE:canvas-surface START -->
9
+
10
+ **The coordinate rule.** The `surface` locks each artboard's footprint and
11
+ aspect — never set artboard width/height and never use coordinates inside the
12
+ wireframe HTML; board-level artboard `x`/`y` IS allowed when it creates clear
13
+ lanes. Let canvas auto-placement handle simple one-row boards.
14
+
15
+ **Lay out mixed canvases in lanes.** When a canvas contains broad browser /
16
+ desktop frames plus compact `mobile`, `popover`, or `panel` surfaces, do not put
17
+ everything in one horizontal strip. Use board-level artboard `x`/`y` to reserve
18
+ lanes with generous empty space: main flow on one row, compact surfaces in their
19
+ own column or row, and loading/error states in a lower row. Keep at least 96px
20
+ between rendered artboard rectangles plus room for annotation gutters; when a
21
+ broad browser/desktop frame sits beside a compact panel/popover, leave at least
22
+ 160px so frame borders, labels, and hover controls never touch. Connect only
23
+ neighboring steps; never draw a long connector that skips across unrelated
24
+ frames. Connector labels must sit in open canvas space. If the label would touch
25
+ or cross either artboard, remove the label and explain the transition with a
26
+ nearby annotation instead. Before handoff, inspect the top canvas at default zoom
27
+ and move any frame whose label, connector, or annotation crosses another frame.
28
+
29
+ **Canvas annotations are designer notes on the artboard.** When a top canvas is
30
+ present, sprinkle Figma-style notes near the frames they explain: a short
31
+ heading, supporting text, and bullets — plain text layers, never bordered or
32
+ shadowed cards, and never a box around a frame. The renderer spaces notes away
33
+ from frames, so place each note by the frame it describes. Use an arrow only to
34
+ point at one specific control or transition; for a broad frame-level note, write
35
+ text beside the frame with no connector. Connectors are for real sequences only —
36
+ never fake "Step 1 → Step 2" lines between independent states.
37
+
38
+ **Do not create overlapping annotations.** Anchor each ordinary note to the
39
+ frame it explains with `targetId` + `placement` (top/right/bottom/left), and
40
+ omit `type` or use `type: "note"`. The renderer parks notes in a gutter beside
41
+ the frame and lays them out automatically. Do not use `type: "callout"`,
42
+ `type: "text"`, `type: "arrow"`, x/y, or points for ordinary notes; those are
43
+ freeform review-markup layers and must be reserved for intentional markup in
44
+ open canvas space. Reserve arrows for a note that must point at one specific
45
+ control inside a frame; a note that simply sits beside its frame needs no arrow.
46
+
47
+ **Patching.** Edit one wireframe, canvas annotation, diagram, or block with targeted `contentPatches`
48
+ (for example `patch-wireframe-html`, `patch-diagram-html`, `update-block`,
49
+ `replace-blocks`, `update-canvas-annotation`) rather
50
+ than regenerating the whole plan. `contentPatches` are part of the public MCP
51
+ action schema, so Claude Code, Codex, Cursor, and other hosts can make surgical
52
+ edits. If an agent is working from exported source files, use
53
+ `read-visual-plan-source` / `patch-visual-plan-source`: `plan.mdx` holds
54
+ frontmatter plus markdown/document blocks, `canvas.mdx` holds
55
+ `<DesignBoard>/<Section>/<Artboard>/<Screen>/<Annotation>/<Connector>`, and the
56
+ patch action normalizes the MDX back into the same JSON runtime model. JSON is
57
+ the canonical runtime shape; MDX is the repo-friendly authoring/export surface.
58
+ In the browser, humans edit `rich-text` prose inline; agents should still use
59
+ `update-rich-text` content patches or source patches for prose, and use
60
+ comments/structured patches for canvas, artboard, wireframe, and diagram edits.
61
+ Never send a partial top-level `content` object as a shortcut to add a canvas,
62
+ frame, or block: `content` is a full structured replacement, so omitted blocks
63
+ or surfaces can disappear. If a full replacement is truly unavoidable, read the
64
+ complete source/JSON first, include every existing block and surface in the new
65
+ payload, and verify the source/export immediately after the update.
66
+
67
+ **Never emit a titled artboard with no interior wireframe content.** Every artboard
68
+ you place on the canvas must carry an `html` wireframe or reference a wireframe
69
+ block via `blockId`; when using `blockId`, the referenced `wireframe` /
70
+ `legacy-wireframe` block must remain in the plan. If you remove a duplicate
71
+ wireframe from the document body, first move its `data` inline onto the
72
+ corresponding `content.canvas.frames[*].wireframe` / `legacyWireframe`. A
73
+ label-only frame or a frame pointing at a deleted block renders empty and is
74
+ rejected at parse time. If you only have a title, write it as a section header or
75
+ annotation, not an empty artboard.
76
+
77
+ **UI mockups belong in the top visual review area.** Static UI/product visuals
78
+ live on the canvas; multi-step UI flows get both canvas wireframes and a
79
+ prototype. When the user asks for a mockup, UI state, loading state, layout,
80
+ screen, or visual comparison, make the canvas the primary home for that static
81
+ visual. When the user asks for a prototype or the plan contains a sequence the
82
+ reviewer must feel, keep the canvas artboards and add `content.prototype` so the
83
+ top surface shows Wireframes / Prototype tabs. Architecture/code diagrams stay
84
+ inline in the document (the SKILL.md Visual Surface Choice section owns that
85
+ rule) unless the user explicitly asks for a spatial board. Document blocks
86
+ can explain, compare, or map implementation, but they should not host the
87
+ primary UI mockup or prototype just because `custom-html`, screenshots, or prose
88
+ are easier to produce. If the canvas/prototype surface cannot represent the
89
+ requested UI fidelity, still keep the closest top-surface representation and
90
+ call out or extend the needed renderer capability. A skeleton/loading mockup
91
+ also lives in a canvas artboard — never move a mockup out of the canvas.
92
+
93
+ **Storyboards are canvas artifacts, not document diagrams.** When the requested
94
+ output is a product flow, onboarding journey, "light storyboard", or canvas
95
+ wireframe, author the flow as multiple top-canvas artboards with real screen
96
+ content and neighboring connectors. Keep document-body `diagram` blocks for
97
+ architecture and mechanics that are not themselves user-visible screens. A
98
+ storyboard made from a single inline HTML diagram is the wrong surface.
99
+
100
+ For abstract product concepts, use the canvas to create the first "I get it"
101
+ moment: one real app state near the top showing how the concept appears to a
102
+ user, followed by separate annotations or diagrams for mechanics. Do not make
103
+ the first artboard a hybrid of app UI and architecture notes; the app screen
104
+ should be inspectable as product UI on its own.
105
+
106
+ **Legacy kit tree.** Older plans set a `screen` array of `{ el, ...props }` kit
107
+ nodes instead of `html`; the renderer still accepts and displays it so saved
108
+ plans round-trip, but new plans emit `html`. Do not author fresh kit-tree
109
+ screens, and do not put nested kit components such as `<FrameScreen>`, `<Card>`,
110
+ `<Row>`, `<Title>`, or `<Btn>` inside a canvas `<Screen>`. A new canvas artboard
111
+ with kit-tree children is a defect: replace it with
112
+ `<Screen surface="..." html={...} />` using the HTML wireframe rules. The HTML
113
+ path is the one that gets the renderer-owned surface sizing, theme tokens,
114
+ sketch/clean toggle, and safe text layout used by good document-body
115
+ wireframes. Likewise, old or imported plans may carry coordinate-based regions
116
+ or free-float x/y on notes; those are legacy escape hatches the renderer still
117
+ shows but you must never produce. The gutter parks notes by `targetId` +
118
+ `placement`, and the coordinate rule at the top of this file governs all
119
+ new-plan placement.
120
+
121
+ <!-- SHARED-CORE:canvas-surface END -->
@@ -0,0 +1,178 @@
1
+ # Plan document quality — single source of truth
2
+
3
+ This file is the canonical quality bar for the plan document below the canvas:
4
+ how it reads, which blocks to use, how open questions are surfaced, and the
5
+ pre-handoff check. Read it in full before authoring the plan document; it is the
6
+ quality bar. Do not write the document from memory or paraphrase these rules per
7
+ mode.
8
+
9
+ <!-- SHARED-CORE:document-quality START -->
10
+
11
+ **The document is a serious technical plan, not marketing.** Write it the way a
12
+ strong Claude or Codex implementation plan reads: outcome-first, prose-first,
13
+ self-contained, and specific. State the objective and what "done" means, the
14
+ scope and non-goals, the proposed approach with the key decisions and their
15
+ rationale, ordered steps that name real files, symbols, actions, and data
16
+ shapes, the risks, and a closing verification step (tests, build, or a checkable
17
+ behavior). Replace vague prose with specifics; never ship a step like "make it
18
+ work." No hero art, gradients, logos, nav bars, slogans, value props, giant
19
+ landing-page headings, or marketing cards unless the user explicitly asks.
20
+
21
+ **Every published plan must stand alone.** Even when the agent is revising an
22
+ existing plan, the output is a plan to do the work, not a changelog of the
23
+ conversation. Do not write phrases like "preserve the previous plan", "do not
24
+ drop the old idea", "as discussed above", "this revision", "unlike the prior
25
+ version", or "correction from the earlier plan". Fold the right decisions into
26
+ the plan as normal objective, architecture, scope, and roadmap prose. A reviewer
27
+ who opens the plan from a link with no chat history should understand it. Avoid
28
+ negative framing that only makes sense against absent context ("not the old
29
+ mode", "not just X") unless the contrast is defined in the plan and genuinely
30
+ helps; state the positive model directly.
31
+
32
+ **Make abstract plans instantly legible.** If the idea is broad, strategic, or
33
+ intended for a third-party reviewer, put one concrete product snapshot near the
34
+ top before dense architecture, mode tables, manifests, or roadmaps. For
35
+ UI-capable concepts, that snapshot is usually a top-canvas app state plus a
36
+ short paragraph that says what the user sees and what changes under the hood.
37
+ Then put mechanics, data flow, sync boundaries, and implementation detail in
38
+ separate diagrams or document sections.
39
+
40
+ **Preserve the user's level of abstraction.** A motivating use case is not
41
+ automatically the architecture. When the prompt describes a broader framework,
42
+ product mode, or reusable primitive, separate the reusable core from specific
43
+ apps, providers, customers, scripts, or launch examples. Use the concrete
44
+ example to make the plan understandable, then make clear which parts are core,
45
+ which are app-specific adapters, and which are future examples.
46
+
47
+ **When top visuals exist, they and the document never duplicate each other.**
48
+ For UI work, the UI story lives in the top visual surface: canvas artboards for
49
+ static inspection, plus prototype tabs when the flow should be functional. The
50
+ document carries the technical depth the visuals cannot show — concrete
51
+ file/symbol maps, API and data contracts, code snippets, migration or
52
+ implementation phases, risks, and validation. For architecture/code reviews,
53
+ invert that: the document is the visual surface, and each recommendation
54
+ carries its own nearby inline `diagram` / `data-model` block plus file
55
+ evidence (the `diagram` bullet below owns how to author those diagrams).
56
+ Repeat a wireframe in the document only for a genuinely new detail view or
57
+ comparison. Skip the visual surface entirely for non-visual work and write a
58
+ clean rich document. For a simple binary UI visual choice, show the two
59
+ directions in the canvas only; do not repeat the same options as body
60
+ wireframes or prose. Put the actual choice in the bottom "Open Questions" form.
61
+
62
+ **Use the right block, and make it carry substance.** For the authoritative,
63
+ machine-checked list of block types and their data schemas, call `get-plan-blocks`
64
+ — it returns the live registry vocabulary (type, MDX tag, placement, key fields)
65
+ so you never emit a block the editor cannot render or round-trip:
66
+
67
+ - `rich-text` for plan prose with real bold/italic/code/links and nested lists.
68
+ - `annotated-code` for the file map: when a load-bearing file is worth
69
+ highlighting, prefer the annotated walkthrough over a bare `code` block — carry
70
+ the real, syntax-highlighted code AND anchor short margin notes to the lines
71
+ that actually change (the new action, the changed schema, the wiring point), so
72
+ the reader sees what matters and why instead of code for code's sake. Each
73
+ annotation is `{ lines: "12" | "12-18"; label?; note }`; keep a few high-signal
74
+ notes per file, not one per line. Highlight only the files worth reading; never
75
+ an exhaustive list of every touched file, and never a prose-only description of
76
+ a file. Drop to a plain `code` block only for a throwaway snippet with nothing
77
+ to call out. When more than one file matters, group the blocks in a vertical
78
+ `tabs` block (the standard tab primitive) rather than a bespoke container. If
79
+ the exact code is unknown, show the smallest plausible planned shape or a
80
+ commented stub naming what to fill in. (`code-tabs` and `implementation-map`
81
+ are legacy: their renderers stay for old plans, but do not author new ones.)
82
+ - For a decision: if the reviewer must still pick between a genuinely-open
83
+ either/or, put it in the bottom Open Questions `question-form` as a `single`
84
+ question — one option per real alternative, each with a short detail and
85
+ `recommended: true` on the one you would choose; do not also restate the same
86
+ choice elsewhere. If you have already committed to an approach, state it as
87
+ settled prose or a `callout` with `tone="decision"`, optionally with a
88
+ `columns` block for a side-by-side comparison of the options you weighed — not
89
+ as a confusing mid-document form for a question you have already answered.
90
+ - `columns` for side-by-side before/after or current/target comparisons where
91
+ each side needs real nested blocks; label the columns clearly and avoid
92
+ stacking comparison blocks vertically when parallel reading is the point.
93
+ - `diagram` for two-dimensional architecture, dependency, data-flow, or state
94
+ relationships, only when it clarifies something real. Prefer standard
95
+ two-dimensional layouts — paired before/after panels, layered diagrams,
96
+ swimlanes, dependency maps, matrices, or grouped regions; do not default to
97
+ left-to-right chains, and use a line only when the relationship is truly a
98
+ sequence. Do not use a body `diagram` as the primary artifact for a requested
99
+ product canvas, light storyboard, UI flow, screen flow, or wireframe; those
100
+ belong in the top canvas as artboards with `Screen` wireframes first. Use
101
+ diagrams below that canvas only for architecture, data flow, or implementation
102
+ mechanics. For architecture/code
103
+ diagrams, prefer `data.html` / `data.css` with semantic HTML and inline SVG so
104
+ the diagram can use panels, layers, matrices, arrows, annotations, and
105
+ responsive layout directly. Author diagram HTML with renderer-owned primitives
106
+ like `.diagram-panel`, `.diagram-card`, `.diagram-node`, `.diagram-box`,
107
+ `.diagram-pill`, `.diagram-muted`, and `[data-rough]`; they map to the plan's
108
+ Tailwind theme variables through `--wf-ink`, `--wf-muted`, `--wf-line`,
109
+ `--wf-paper`, `--wf-card`, `--wf-accent`, `--wf-accent-soft`, `--wf-warn`, and
110
+ `--wf-ok`, and switch to Excalifont plus rough.js outlines in sketchy mode. Do not
111
+ set `font-family` and do not hard-code hex, rgb, or hsl colors in diagram HTML
112
+ or CSS. Leave room for the sketch font: keep labels short, give nodes generous
113
+ width, and place boundary/annotation labels in unused space instead of over
114
+ nodes; labels must not overlap nodes, connectors, or each other. For small
115
+ text/SVG changes to an existing HTML diagram, use `patch-diagram-html` with a
116
+ unique `find`/`replace` snippet instead of resending the whole `data.html`
117
+ string. Use legacy `nodes` / `edges` only for small previews or truly
118
+ sequential flows. In architecture/code plans, prefer a repeated section rhythm:
119
+ recommendation title, confidence and category badges, code-path evidence, a
120
+ local before/after or current/target spatial diagram, then concise
121
+ Problem/Solution/Why text.
122
+ - `tabs` for multiple states, directions, or comparisons. A tab that reveals
123
+ only prose usually means the plan is under-specified — include a relevant
124
+ visual unless the tab is intentionally document-only.
125
+ - `table`, `checklist`, `callout` for scannable structure.
126
+
127
+ **Open questions live at the bottom as a form when answers would change the
128
+ plan.** Surface answerable unresolved decisions in a final `question-form`
129
+ block titled "Open Questions" so the renderer presents it as a distinct section.
130
+ That bottom form is the ONLY place that enumerates the open questions: never add
131
+ a second "Open Questions" heading, list, or recap of the same questions earlier
132
+ in the document. A one-line pointer in the overview prose ("a few decisions are
133
+ still open — see Open Questions below") is fine, but do not reproduce the
134
+ question list or a parallel questions/decisions section above it.
135
+ Use `single` or `multi` for clear choices, `freeform` for constraints,
136
+ `recommended: true` for the default you would pick, and option `wireframe` /
137
+ `diagram` previews only when the options are not already visible in the top
138
+ canvas. `single` and `multi` questions always render a write-in field so a
139
+ reviewer can answer with a custom option — never add an explicit "Other" option
140
+ yourself; set `allowOther: false` only when a free-text answer makes no sense.
141
+ Keep non-answerable assumptions or risks as concise `callout` blocks in
142
+ the relevant section. Never bury a questions/decisions wall inside the plan
143
+ narrative, and never ask the same question twice.
144
+
145
+ For complex plans, do not end without an open-question audit. If architecture,
146
+ scope, UX, data shape, rollout, provider mapping, or ownership still depends on
147
+ a choice, either commit to a recommendation with rationale or add it to the
148
+ bottom form with a recommended default. A complex plan with no open questions is
149
+ fine only when every meaningful decision has been explicitly made.
150
+
151
+ **Verification must exercise the real workflow.** The final verification section
152
+ should go beyond typecheck/unit tests when the plan changes UI, local files,
153
+ sync, providers, browser behavior, or multi-app flows. Include at least one
154
+ end-to-end smoke that matches the user journey, such as a fresh repo/folder,
155
+ real manifest or data fixture, browser interaction, save/sync action, and an
156
+ on-disk or database assertion. Name the command or manual browser path when it
157
+ is known.
158
+
159
+ **`custom-html` is a bounded escape hatch only** — a single complete fragment
160
+ inside a block, never `html`/`head`/`body`/`script` tags, never a generic
161
+ placeholder, density demo, or proof that custom HTML works. Prefer the native
162
+ blocks for normal plans. For architecture/code reviews, use `diagram`
163
+ `data.html` / `data.css` for rich local HTML/SVG diagrams instead of
164
+ `custom-html`. For UI/product work, `custom-html` is never the primary home for a
165
+ requested mockup, UI state, or visual comparison. If UI fidelity requires
166
+ HTML/CSS, image capture, or real React/CSS, the product fix is canvas support
167
+ for that artifact type, not moving the mockup into the document.
168
+ When `custom-html` is genuinely needed, author it against the sandbox-provided
169
+ theme tokens (`--wf-paper`, `--wf-card`, `--wf-ink`, `--wf-muted`,
170
+ `--wf-line`, `--wf-radius`, and the matching `--plan-*` aliases). Do not hardcode
171
+ hex/rgb/hsl light palettes such as white cards with dark ink; the same fragment
172
+ must read in dark mode without a plan-specific patch.
173
+
174
+ **Before handoff, open the plan and check it.** Fix overlap, excessive
175
+ whitespace, clipped fragments, misleading inactive controls, poor contrast, and
176
+ unreadable diagrams before asking for approval.
177
+
178
+ <!-- SHARED-CORE:document-quality END -->
@@ -0,0 +1,62 @@
1
+ # Good vs. bad exemplar — single source of truth
2
+
3
+ This file is the canonical worked example of a great plan (and the anti-patterns
4
+ to avoid). Read it alongside the document-quality and canvas references before
5
+ authoring a plan; it is the bar these plans must clear.
6
+
7
+ <!-- SHARED-CORE:exemplar START -->
8
+
9
+ **GOOD.** A UI-first plan for a todo app: a canvas with a `desktop` artboard whose
10
+ `data.html` is a real flex layout — a sidebar of links (`Inbox 12`, `Today 4`,
11
+ `Done`), a main column with an `<h1>Today</h1>`, accent `.wf-pill`s for the
12
+ filters, a muted section label `OVERDUE`, and `.wf-card` task rows carrying real
13
+ titles, due dates, and a primary `button.primary` — styled only through bare
14
+ elements, helper classes, and `--wf-*` tokens, so the renderer applies the
15
+ correct desktop footprint, theme, and one subtle whole-frame wobble. Plain-text
16
+ designer notes sit spaced off the frame, pointing only at the controls that need
17
+ explanation. Below it, a Claude/Codex-grade document: objective and
18
+ done-criteria, a few `code` blocks (grouped in a vertical `tabs` block when
19
+ more than one) showing the real shape of the load-bearing files, a `callout`
20
+ with `tone="decision"` stating the chosen approach with a `columns` block
21
+ weighing the two real options behind it,
22
+ and a validation step — none of it repeating the canvas. If the task also
23
+ changes a multi-step completion flow, the same top area includes a Prototype tab
24
+ whose screens use the same labels and states as the canvas artboards, with
25
+ `data-goto` controls for the sequence. This is the bar.
26
+
27
+ **GOOD.** A broad product-architecture plan opens with a plain recommendation
28
+ and one concrete app state before the abstraction. The first canvas artboard is
29
+ pure product UI that matches the current app shell; nearby notes explain the
30
+ user-visible delta. A separate diagram below shows the mechanics, such as file
31
+ or data flow. The document then separates the reusable core from app/provider
32
+ adapters and examples, covers contracts, folder or schema shape, sync
33
+ boundaries, roadmap, non-goals, a bottom Open Questions form for unresolved
34
+ decisions, and a verification section with at least one realistic end-to-end
35
+ smoke. A reviewer who was not in the chat gets the idea from the top snapshot
36
+ before reading the technical plan.
37
+
38
+ **GOOD.** A `/visual-plan` for a backend architecture review: no top canvas.
39
+ The document opens with context and a legend, then repeats recommendation cards:
40
+ title, confidence/category badges, a monospace grid of real file paths, one
41
+ inline two-dimensional before/after or layered architecture diagram, and terse
42
+ Problem/Solution/Why bullets using the codebase's vocabulary. The diagram uses
43
+ space to show boundaries, layers, and ownership; it is not a default
44
+ left-to-right chain. The plan ends with a top recommendation and a bottom
45
+ question-form only if the next architecture direction is genuinely open. This is
46
+ better than a top canvas because each diagram is local to the claim it supports.
47
+
48
+ **BAD.** A `data.html` with hard-coded hex colors, a `font-family`, or fixed
49
+ pixel width/height; gray placeholder bars "insinuating" text on a non-skeleton
50
+ frame; a forced desktop + mobile pair for a popover; floating bordered
51
+ annotation cards hugging the frames; a fresh hand-authored kit-tree `screen`
52
+ instead of `html`; a multi-step UI flow with only static frames and no prototype
53
+ tab; a mockup escaped into a document `custom-html` block; and a marketing-style
54
+ document with a hero heading and value props that just restates what the canvas
55
+ already shows. Also bad: an architecture-only plan forced into a top canvas of
56
+ labeled boxes with overlapping text, where the actual code evidence and
57
+ recommendations live elsewhere; a product wireframe that mixes a real screen
58
+ with repo names, file-contract arrows, architecture explanations, or a made-up
59
+ permanent inspector; and a plan that describes itself as a revision of a prior
60
+ conversation instead of a standalone proposal. Never produce this.
61
+
62
+ <!-- SHARED-CORE:exemplar END -->
@@ -0,0 +1,264 @@
1
+ # HTML wireframe quality — single source of truth
2
+
3
+ This file is the canonical quality bar for HTML wireframes / `<Screen>` /
4
+ `WireframeBlock` content, shared word for word by `/visual-plan` and
5
+ `/visual-recap`. Read it in full before authoring ANY wireframe; do not
6
+ author wireframes from memory or paraphrase these rules per command.
7
+
8
+ <!-- SHARED-CORE:wireframe-quality START -->
9
+
10
+ **A wireframe is an HTML mockup. The renderer owns the look; you write the
11
+ content.** Set `data.html` to a self-contained, semantic HTML fragment of the
12
+ screen and set `data.surface`. The renderer owns the surface footprint/aspect,
13
+ the dark/light theme, the hand-drawn font, and the rough.js sketch overlay — you
14
+ never write `<html>`/`<body>`/`<script>`/`<style>` tags or any
15
+ width/height/coordinates. You write real HTML layout and real product
16
+ content; the renderer styles and roughens it.
17
+
18
+ **A wireframe block's data is an HTML screen plus a surface:**
19
+
20
+ ```json
21
+ {
22
+ "surface": "browser",
23
+ "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>"
24
+ }
25
+ ```
26
+
27
+ **Write PLAIN semantic HTML and let the renderer style it.** Bare elements
28
+ (`h1`/`h2`/`h3`, `p`, `button`, `input`, `<input type="checkbox">`, `a`, `hr`)
29
+ are auto-themed — no classes needed. Helper classes carry the rest:
30
+
31
+ - `.wf-card` / `.wf-box` — a bordered, padded container (a panel, a list item).
32
+ - `.wf-pill` / `.wf-chip` — a rounded tag or filter; add `.accent`
33
+ (`<span class="wf-pill accent">`) for the accent-filled variant.
34
+ - `.wf-muted` — secondary/muted text (or use `<small>`).
35
+ - `button.primary` or any element with `[data-primary]` — the accent-filled
36
+ primary button.
37
+
38
+ **No decorative shadows around mockups.** Do not put `box-shadow`, `filter:
39
+ drop-shadow(...)`, Tailwind `shadow-*` classes, or other fake depth effects on a
40
+ wireframe frame, root container, `.wf-card` / `.wf-box`, or canvas artboard.
41
+ Mockups should read as flat, bordered surfaces; use spacing, borders, labels,
42
+ and annotations for separation. Only show a shadow when the real product UI
43
+ already has that shadow and it is essential to the change being reviewed.
44
+
45
+ **Use renderer icons, not visible icon words.** For icon-only buttons or leading
46
+ icons inside fields, chips, menu items, and toolbars, write an empty marker such
47
+ as `<span data-icon="mail" aria-label="Email"></span>` or
48
+ `<i data-icon="lock"></i>`. The renderer replaces it with a Tabler-style SVG and
49
+ the `.wf-icon` class sizes it to the surrounding text. Supported names and
50
+ aliases: `mail`/`email`, `lock`/`password`, `search`, `plus`/`add`, `x`/`close`,
51
+ `check`, `chevronDown`, `chevronUp`, `chevronLeft`, `chevronRight`, `dots`/`more`,
52
+ `chevron`/`caret`/`dropdown` (down chevron), `user`, `settings`, `calendar`,
53
+ `bell`, `send`, `edit`, `arrowLeft`, and `arrowRight`. Do not put visible words
54
+ like "email", "lock", "search", "chevron", or "more" where the product UI would
55
+ show an icon; use text only when it is a real label a user would read.
56
+
57
+ **Use the `--wf-*` tokens for any custom color, never hex.** The renderer flips
58
+ these on light/dark, so reading them is what keeps a mockup correct in both
59
+ themes. For any inline border, background, or text color, reference a token:
60
+ `style="border:1.4px solid var(--wf-line)"`. The tokens are `--wf-ink` (text),
61
+ `--wf-muted` (secondary text), `--wf-line` (borders/dividers), `--wf-paper`
62
+ (page background), `--wf-card` (container surface), `--wf-accent` /
63
+ `--wf-accent-fg` / `--wf-accent-soft` (brand action), `--wf-warn`, `--wf-ok`,
64
+ and `--wf-radius`. Never hard-code a hex color and never set `font-family` — the
65
+ renderer owns the sketch/clean font.
66
+
67
+ **Lay out with inline `style` flex/grid.** You write the real layout —
68
+ `display:flex; flex-direction:column; gap:10px; padding:16px` and so on — and the
69
+ renderer never repositions anything. Compose the actual product: reproduce the
70
+ current screen, then show the modification. Real labels, real counts, real dates,
71
+ real button text grounded in the screen you read; not lorem or gray bars.
72
+
73
+ **Surface presets — match the real footprint, never default to desktop+mobile.**
74
+ Pick the `surface` that matches what the user will actually see:
75
+
76
+ - `browser`: a web page that needs a browser chrome frame around it.
77
+ - `desktop`: a full desktop app page or app shell.
78
+ - `mobile`: a phone screen, only when the work is genuinely mobile.
79
+ - `popover`: a small floating menu, dropdown, or inline popover.
80
+ - `panel`: a side panel, inspector, or sidebar widget.
81
+
82
+ A sidebar popover renders as a small surface, not a desktop page and a phone
83
+ frame. Do not emit `desktop` + `mobile` variants unless responsive behavior
84
+ actually changes the layout. For a component or widget, show one broader
85
+ app-context frame only when placement affects understanding, then the focused
86
+ component states.
87
+
88
+ **Model the actual component shell for small surfaces.** A rendered UI change
89
+ belongs in a wireframe; reserve `diagram` for architecture, dependency, state,
90
+ or data-flow relationships. Popovers, dropdown menus, command palettes, and
91
+ context menus use `surface: "popover"` unless the surrounding page placement is
92
+ the point of the change. Dialogs, sheets, inspectors, sidebars, and long
93
+ property panels use the matching `panel` / `desktop` surface as appropriate.
94
+ Show the real chrome: trigger or anchor when it matters, title/header row,
95
+ top-right actions, separators, fields, options, selected states, body content,
96
+ and footer actions that are visible in the workflow.
97
+
98
+ **Modify, don't redesign.** When the task changes an existing screen, reproduce
99
+ the current screen's real layout and footprint FIRST, then change only the delta
100
+ and call it out with a single annotation. Do not restack the page into a new
101
+ layout. For net-new surfaces, compose from the real app shell. Inspect the
102
+ actual app components before drawing an existing product: sidebar density,
103
+ toolbar actions, overflow menus, property panels, and framework chrome should
104
+ match the product unless the plan intentionally changes them.
105
+
106
+ **Keep product screens pure.** A product wireframe shows the app state a user
107
+ would actually see. Do not embed file contracts, architecture arrows, repo pills,
108
+ mode explanations, or implementation callouts inside the screen just to explain
109
+ the plan. Put those in canvas annotations, a separate diagram, or the document
110
+ body. Secondary UI such as properties, history, sync, export, or agent controls
111
+ should appear where the real product would put them: an overflow popover, sheet,
112
+ panel, or separate framework sidebar state, not a generic permanent right
113
+ inspector unless that inspector is the actual design.
114
+
115
+ **Classify mockup scope before implementation.** Before turning a plan mockup
116
+ into source code, decide whether each artboard represents the whole page/app
117
+ shell, a route body inside an existing shell, or a component/sub-surface. If an
118
+ artboard includes navigation, sidebars, auth banners, or a signup/login form,
119
+ map those pieces to the real shared shell/auth components instead of nesting the
120
+ entire mockup inside the current page. When a mockup references the product's
121
+ standard signup/login page, find and reuse that existing implementation; do not
122
+ approximate it from the wireframe.
123
+
124
+ **Zoom in on sub-surfaces, don't redraw the page.** For a small sub-surface (a
125
+ popover, menu, dialog, toast), show the full screen once, then add a small
126
+ separate artboard whose `html` contains ONLY that sub-surface — do not re-draw
127
+ the whole page around it, and do not scale a duplicate up. Pick the matching
128
+ `surface` (e.g. `popover`) so the footprint is right; never widen a popover to
129
+ page width.
130
+
131
+ **Loading / skeleton states.** Set `data.skeleton: true` on the wireframe and
132
+ fill the `html` with neutral, textless placeholder geometry — boxes and bars
133
+ built as `<div>`s with `background:var(--wf-line)` and explicit heights/widths,
134
+ no labels or copy. The renderer drops borders, sketch, and color into the
135
+ skeleton register automatically. Never escape to a `custom-html` document block
136
+ to fake a loader.
137
+
138
+ **Editing an existing mockup.** In hosted mode, to change one element, text, or
139
+ color in an existing html mockup, do not regenerate the frame — call
140
+ `update-visual-plan` with
141
+ `contentPatches: [{ op: "patch-wireframe-html", blockId, edits: [{ find,
142
+ replace }] }]`. Each `find` is a unique snippet of the current html (read it
143
+ first with `get-visual-plan`); set `all: true` on an edit to replace every
144
+ occurrence. The result is re-sanitized. In local-files privacy mode, do not call
145
+ hosted Plan tools; edit the local MDX source directly and rerun the local
146
+ check/serve or verify command for `<plan-dir>`.
147
+
148
+ **Treat the wireframe border as part of the visible design.** Always wrap HTML
149
+ wireframe content in a root container with real inner padding before drawing
150
+ cards, fields, pills, labels, or controls. Use at least 14-16px of padding,
151
+ `box-sizing: border-box`, `height: 100%`, and `gap` between child rows so the
152
+ first row never sits flush against the screen border. Keep text away from
153
+ borders: every container, field, button, menu item, and annotation needs enough
154
+ padding and line-height to read cleanly in the rendered Plan view.
155
+
156
+ **Lay out children safely so they never collide.** Use HTML flex/grid with
157
+ `gap`, `min-width: 0`, and sensible overflow. Avoid negative margins, absolute
158
+ positioning, or fixed child widths that can collide when the renderer switches
159
+ between light/dark, sketch/clean, or different zoom levels.
160
+
161
+ **Do not wrap intentionally single-line labels.** For toolbars, tab rails,
162
+ breadcrumbs, chip/filter rows, branch and file names, file chips, and code
163
+ filenames — any deliberately single-line row — do not let long text wrap. Put
164
+ `white-space: nowrap` on the row (and `overflow: hidden; text-overflow: ellipsis`
165
+ on the individual labels that can grow), so the wireframe demonstrates the actual
166
+ layout behavior instead of producing ugly stacked or vertical text. Use
167
+ horizontally scrollable or clipped rails for overflow.
168
+
169
+ **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).
170
+
171
+ **Persistent chrome bars span the full frame width.** Top bars, app headers,
172
+ toolbars, and bottom tab/nav bars are full-width chrome, not centered content.
173
+ Lay each one out as a single flex row that fills the frame
174
+ (`style="display:flex;align-items:center;width:100%"`) and push trailing actions
175
+ to the right edge with a flex spacer (`<div style="flex:1"></div>`) between the
176
+ leading group and the trailing group — never center a bar inside a narrow,
177
+ centered block, and never let it collapse to the width of its contents. In a
178
+ Before/After pair the bar stays full-width in BOTH states even when one state has
179
+ fewer controls; the spacer absorbs the difference so the remaining controls hold
180
+ their edge alignment instead of sliding to the center.
181
+
182
+ **Pin bottom bars to the bottom of the frame.** For mobile tab bars, footers, and
183
+ any persistent bottom action row, make the frame itself a flex column at
184
+ `height:100%` (`style="display:flex;flex-direction:column;height:100%"`), give the
185
+ scrolling body `flex:1` so it absorbs the slack, and place the bar as the LAST
186
+ child of the frame (or set `margin-top:auto` on it). The bar then sits flush at
187
+ the bottom of the surface instead of floating directly under the content with an
188
+ empty band beneath it.
189
+
190
+ **Before / after must be comparable.** When showing a state change, preserve the
191
+ unchanged controls in both states so the reviewer can see exactly what moved or
192
+ appeared; do not show an added control as a generic box floating elsewhere in
193
+ the surface. Place the new/changed affordance where the implementation puts it —
194
+ for example, a new `Edit with AI` action in a popover header belongs in the
195
+ top-right header slot, aligned with the title, not in the body or footer. Use
196
+ the same frame size, scale, outer padding, border radius, and visual density on
197
+ both sides unless the change itself alters those properties, and let the frame
198
+ height fit the content rather than leaving a tall empty lower half.
199
+
200
+ **Name the states with the column header, never inside the frame.** For
201
+ document-body wireframes (recaps), put the two
202
+ states in a `columns` block and set each column's `label` to `Before` and
203
+ `After` — the renderer draws that label as an `h4` heading above each frame. Do
204
+ NOT bake a `Before`/`After` pill, title, or heading into the wireframe `html`: a
205
+ label placed inside reads as part of the product UI, lands in a random corner,
206
+ and clutters the comparison. The column header is the one and only place the
207
+ state name belongs. On a canvas, place the two state artboards as neighbors with
208
+ frame labels — never encode Before/After inside the html.
209
+
210
+ **Let the surface choose side-by-side vs. stacked.** For document-body
211
+ wireframes (recaps), the `columns` renderer lays
212
+ narrow surfaces (`mobile`, `popover`, `panel`) out side by side, and
213
+ automatically stacks wide surfaces (`desktop`, `browser`) vertically at full
214
+ document width so a large frame is never crushed into a half-width column and
215
+ cropped. Author both wireframes with the real `surface` and the matching
216
+ `Before`/`After` column labels; do not hand-stack the pair into separate
217
+ top-level wireframes or duplicate the state name as body content.
218
+
219
+ **Good example — a contacts list, surface `browser`.** A small, real screen
220
+ composed from the helper classes and tokens, layout in inline flex, no fonts or
221
+ hex colors:
222
+
223
+ ```html
224
+ <div
225
+ style="display:flex;flex-direction:column;gap:12px;padding:16px;height:100%"
226
+ >
227
+ <div style="display:flex;align-items:center;justify-content:space-between">
228
+ <h1>Contacts</h1>
229
+ <button class="primary">New contact</button>
230
+ </div>
231
+ <div style="display:flex;gap:6px">
232
+ <span class="wf-pill accent">All 128</span>
233
+ <span class="wf-pill">Favorites</span>
234
+ <span class="wf-pill">Archived</span>
235
+ </div>
236
+ <div
237
+ class="wf-card"
238
+ style="display:flex;flex-direction:column;gap:0;padding:0"
239
+ >
240
+ <div
241
+ style="display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1.4px solid var(--wf-line)"
242
+ >
243
+ <div
244
+ style="width:32px;height:32px;border-radius:999px;background:var(--wf-accent-soft)"
245
+ ></div>
246
+ <div style="flex:1">
247
+ <strong>Jane Cooper</strong><br /><small>jane@acme.co</small>
248
+ </div>
249
+ <span class="wf-pill">Lead</span>
250
+ </div>
251
+ <div style="display:flex;align-items:center;gap:10px;padding:10px 12px">
252
+ <div
253
+ style="width:32px;height:32px;border-radius:999px;background:var(--wf-accent-soft)"
254
+ ></div>
255
+ <div style="flex:1">
256
+ <strong>Marcus Lee</strong><br /><small>marcus@globex.io</small>
257
+ </div>
258
+ <span class="wf-pill">Customer</span>
259
+ </div>
260
+ </div>
261
+ </div>
262
+ ```
263
+
264
+ <!-- SHARED-CORE:wireframe-quality END -->