@notis_ai/cli 0.2.18 → 0.2.20

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 (395) hide show
  1. package/README.md +542 -146
  2. package/bin/check-runtime.js +15 -0
  3. package/bin/notis.js +2 -0
  4. package/config/notis_app_design_rules.json +320 -0
  5. package/config/portal-route-roots.json +45 -0
  6. package/dist/agent-hooks/notis-agent-hook.mjs +42325 -18273
  7. package/dist/base-skills/notis-cli/.notis-base-skill.json +1 -0
  8. package/dist/base-skills/notis-cli/SKILL.md +51 -280
  9. package/dist/base-skills/notis-cli/references/app-delivery.md +17 -0
  10. package/dist/base-skills/notis-cli/references/intelligence.md +94 -0
  11. package/dist/base-skills/notis-cli/references/native-databases.md +21 -0
  12. package/dist/base-skills/notis-cli/references/tool-examples.md +56 -0
  13. package/dist/base-skills/notis-cli/references/troubleshooting.md +67 -0
  14. package/dist/base-skills/notis-query/.notis-base-skill.json +1 -0
  15. package/dist/base-skills/notis-query/SKILL.md +35 -699
  16. package/dist/base-skills/notis-query/references/database-discovery.md +59 -0
  17. package/dist/base-skills/notis-query/references/documents.md +74 -0
  18. package/dist/base-skills/notis-query/references/query.md +76 -0
  19. package/dist/base-skills/notis-spaces/.notis-base-skill.json +1 -0
  20. package/dist/base-skills/notis-spaces/SKILL.md +218 -0
  21. package/dist/base-skills/notis-spaces/references/architecture.md +116 -0
  22. package/dist/base-skills/notis-spaces/references/context.md +81 -0
  23. package/dist/base-skills/notis-spaces/references/design.md +141 -0
  24. package/dist/base-skills/notis-spaces/references/fixtures.md +29 -0
  25. package/dist/base-skills/notis-spaces/references/memory.md +58 -0
  26. package/dist/base-skills/notis-spaces/references/reading.md +73 -0
  27. package/dist/base-skills/notis-spaces/references/release.md +120 -0
  28. package/dist/base-skills/notis-spaces/references/reports.md +77 -0
  29. package/dist/base-skills/notis-spaces/references/sdk.md +273 -0
  30. package/dist/base-skills/notis-spaces/references/store.md +118 -0
  31. package/dist/base-skills/notis-spaces/references/troubleshooting.md +28 -0
  32. package/dist/base-skills/notis-spaces/references/views.md +229 -0
  33. package/{template/packages → dist}/sdk/package.json +9 -10
  34. package/dist/sdk/src/agentContext.ts +36 -0
  35. package/dist/sdk/src/bundleModule.ts +175 -0
  36. package/dist/sdk/src/components/Dialog.tsx +103 -0
  37. package/dist/sdk/src/components/DocumentEditor.tsx +113 -0
  38. package/dist/sdk/src/components/DocumentPage.tsx +184 -0
  39. package/{template/packages → dist}/sdk/src/components/Markdown.tsx +9 -3
  40. package/{template/packages → dist}/sdk/src/components/MarkdownEditor.tsx +26 -5
  41. package/{template/packages → dist}/sdk/src/components/MultiSelectActionBar.tsx +95 -12
  42. package/{template/packages → dist}/sdk/src/components/MultiSelectCheckbox.tsx +4 -2
  43. package/dist/sdk/src/components/NotisCommentBoundary.tsx +172 -0
  44. package/{template/packages → dist}/sdk/src/components/NotisSelectionBoundary.tsx +9 -5
  45. package/dist/sdk/src/components/RecordComponents.tsx +111 -0
  46. package/dist/sdk/src/components/Skeleton.tsx +38 -0
  47. package/dist/sdk/src/config.ts +31 -0
  48. package/{template/packages → dist}/sdk/src/documents.ts +21 -6
  49. package/dist/sdk/src/hooks/useAction.ts +28 -0
  50. package/dist/sdk/src/hooks/useAgentContext.ts +23 -0
  51. package/{template/packages → dist}/sdk/src/hooks/useBackend.ts +3 -2
  52. package/dist/sdk/src/hooks/useCloudComputer.ts +94 -0
  53. package/dist/sdk/src/hooks/useCloudComputerShell.ts +114 -0
  54. package/{template/packages → dist}/sdk/src/hooks/useCollectionInteractions.ts +157 -147
  55. package/dist/sdk/src/hooks/useDatabaseSchema.ts +50 -0
  56. package/{template/packages → dist}/sdk/src/hooks/useDatabaseSubscription.ts +2 -2
  57. package/dist/sdk/src/hooks/useDocument.ts +51 -0
  58. package/{template/packages → dist}/sdk/src/hooks/useDocuments.ts +25 -59
  59. package/{template/packages → dist}/sdk/src/hooks/useHandover.ts +7 -7
  60. package/dist/sdk/src/hooks/useLongPressSelection.ts +79 -0
  61. package/dist/sdk/src/hooks/useMarqueeSelection.ts +194 -0
  62. package/{template/packages → dist}/sdk/src/hooks/useMultiSelect.ts +2 -8
  63. package/dist/sdk/src/hooks/useNativeDocumentBody.ts +50 -0
  64. package/dist/sdk/src/hooks/useNativeDocuments.ts +143 -0
  65. package/{template/packages → dist}/sdk/src/hooks/useNotis.ts +6 -1
  66. package/dist/sdk/src/hooks/useNotisNavigation.ts +70 -0
  67. package/dist/sdk/src/hooks/useQuery.ts +81 -0
  68. package/dist/sdk/src/hooks/useToolQuery.ts +12 -0
  69. package/dist/sdk/src/hooks/useTopBarSearch.ts +102 -0
  70. package/dist/sdk/src/hooks/useTopBarTitleLeaf.ts +75 -0
  71. package/{template/packages → dist}/sdk/src/hooks/useUpsertDocument.ts +1 -1
  72. package/dist/sdk/src/hooks/useViewParams.ts +195 -0
  73. package/dist/sdk/src/hooks/useViewerReads.ts +129 -0
  74. package/{template/packages → dist}/sdk/src/index.ts +64 -1
  75. package/{template/packages → dist}/sdk/src/interactions/actions.ts +14 -1
  76. package/{template/packages → dist}/sdk/src/interactions/shortcuts.tsx +129 -23
  77. package/dist/sdk/src/interactions/visibility.ts +13 -0
  78. package/{template/packages → dist}/sdk/src/interactions.ts +5 -1
  79. package/dist/sdk/src/nativeData.ts +39 -0
  80. package/{template/packages → dist}/sdk/src/provider.tsx +9 -4
  81. package/dist/sdk/src/queryCache.ts +292 -0
  82. package/dist/sdk/src/queryErrors.ts +51 -0
  83. package/dist/sdk/src/runtime.ts +675 -0
  84. package/dist/sdk/src/runtimeModules.ts +33 -0
  85. package/dist/sdk/src/space.ts +442 -0
  86. package/dist/sdk/src/standardViewParams.ts +36 -0
  87. package/{template/packages → dist}/sdk/src/styles.css +81 -16
  88. package/dist/sdk/src/tailwind.ts +66 -0
  89. package/dist/sdk/src/ui/charts/RenderChartData.tsx +25 -0
  90. package/dist/sdk/src/ui/engine/core.ts +392 -0
  91. package/dist/sdk/src/ui/engine/dom.ts +183 -0
  92. package/dist/sdk/src/ui/engine/hooks.ts +195 -0
  93. package/dist/sdk/src/ui/engine/instance.ts +63 -0
  94. package/dist/sdk/src/ui/engine/keycapContext.ts +2 -0
  95. package/dist/sdk/src/ui/engine/registry.ts +262 -0
  96. package/dist/sdk/src/ui/engine/types.ts +62 -0
  97. package/dist/sdk/src/ui/icons.tsx +91 -0
  98. package/dist/sdk/src/ui/util.ts +83 -0
  99. package/dist/sdk/src/viewPeriod.ts +26 -0
  100. package/dist/sdk/src/vite.ts +92 -0
  101. package/dist/sdk/src/words/actions.ts +295 -0
  102. package/dist/sdk/src/words/clashes.ts +158 -0
  103. package/dist/sdk/src/words/format.ts +136 -0
  104. package/dist/sdk/src/words/index.ts +13 -0
  105. package/dist/sdk/src/words/keymap.ts +72 -0
  106. package/dist/sdk/src/words/keys.ts +297 -0
  107. package/dist/sdk/src/words/shell.ts +46 -0
  108. package/dist/sdk/src/words/types.ts +65 -0
  109. package/dist/skill-sync/index.js +832 -151
  110. package/dist/skill-sync/index.js.map +4 -4
  111. package/dist/skill-sync-worker.mjs +3941 -0
  112. package/dist/space-harness/host.js +1460 -0
  113. package/dist/space-sdk/dist/chunk-ZSN57ATH.js +5 -0
  114. package/dist/space-sdk/dist/index.js +15 -0
  115. package/dist/space-sdk/dist/ui.js +18 -0
  116. package/dist/space-sdk/package.json +33 -0
  117. package/dist/space-sdk/src/agentContext.d.ts +36 -0
  118. package/dist/space-sdk/src/components/Dialog.d.ts +20 -0
  119. package/dist/space-sdk/src/components/DocumentEditor.d.ts +46 -0
  120. package/dist/space-sdk/src/components/DocumentPage.d.ts +53 -0
  121. package/dist/space-sdk/src/components/Markdown.d.ts +18 -0
  122. package/dist/space-sdk/src/components/MarkdownEditor.d.ts +11 -0
  123. package/dist/space-sdk/src/components/MultiSelectActionBar.d.ts +31 -0
  124. package/dist/space-sdk/src/components/MultiSelectCheckbox.d.ts +14 -0
  125. package/dist/space-sdk/src/components/MultiSelectDragOverlay.d.ts +8 -0
  126. package/dist/space-sdk/src/components/NotisCommentBoundary.d.ts +36 -0
  127. package/dist/space-sdk/src/components/NotisSelectionBoundary.d.ts +16 -0
  128. package/dist/space-sdk/src/components/RecordComponents.d.ts +64 -0
  129. package/dist/space-sdk/src/components/ShortcutHints.d.ts +12 -0
  130. package/dist/space-sdk/src/components/Skeleton.d.ts +23 -0
  131. package/dist/space-sdk/src/config.ts +31 -0
  132. package/dist/space-sdk/src/documents.d.ts +59 -0
  133. package/dist/space-sdk/src/hooks/useAction.d.ts +8 -0
  134. package/dist/space-sdk/src/hooks/useActiveResource.d.ts +3 -0
  135. package/dist/space-sdk/src/hooks/useAgentContext.d.ts +7 -0
  136. package/dist/space-sdk/src/hooks/useBackend.d.ts +23 -0
  137. package/dist/space-sdk/src/hooks/useCloudComputer.d.ts +45 -0
  138. package/dist/space-sdk/src/hooks/useCloudComputerShell.d.ts +49 -0
  139. package/dist/space-sdk/src/hooks/useCollectionInteractions.d.ts +118 -0
  140. package/dist/space-sdk/src/hooks/useDatabaseSchema.d.ts +14 -0
  141. package/dist/space-sdk/src/hooks/useDatabaseSubscription.d.ts +26 -0
  142. package/dist/space-sdk/src/hooks/useDocument.d.ts +22 -0
  143. package/dist/space-sdk/src/hooks/useDocuments.d.ts +31 -0
  144. package/dist/space-sdk/src/hooks/useHandover.d.ts +43 -0
  145. package/dist/space-sdk/src/hooks/useLongPressSelection.d.ts +9 -0
  146. package/dist/space-sdk/src/hooks/useMarqueeSelection.d.ts +57 -0
  147. package/dist/space-sdk/src/hooks/useMultiSelect.d.ts +51 -0
  148. package/dist/space-sdk/src/hooks/useNativeDocumentBody.d.ts +24 -0
  149. package/dist/space-sdk/src/hooks/useNativeDocuments.d.ts +55 -0
  150. package/dist/space-sdk/src/hooks/useNotis.d.ts +25 -0
  151. package/dist/space-sdk/src/hooks/useNotisNavigation.d.ts +33 -0
  152. package/dist/space-sdk/src/hooks/useQuery.d.ts +22 -0
  153. package/dist/space-sdk/src/hooks/useTool.d.ts +20 -0
  154. package/dist/space-sdk/src/hooks/useToolQuery.d.ts +3 -0
  155. package/dist/space-sdk/src/hooks/useTools.d.ts +15 -0
  156. package/dist/space-sdk/src/hooks/useTopBarSearch.d.ts +48 -0
  157. package/dist/space-sdk/src/hooks/useTopBarTitleLeaf.d.ts +24 -0
  158. package/dist/space-sdk/src/hooks/useUpsertDocument.d.ts +27 -0
  159. package/dist/space-sdk/src/hooks/useViewParams.d.ts +76 -0
  160. package/dist/space-sdk/src/hooks/useViewerReads.d.ts +38 -0
  161. package/dist/space-sdk/src/index.d.ts +98 -0
  162. package/dist/space-sdk/src/interactions/actions.d.ts +33 -0
  163. package/dist/space-sdk/src/interactions/shortcuts.d.ts +42 -0
  164. package/dist/space-sdk/src/interactions/visibility.d.ts +2 -0
  165. package/dist/space-sdk/src/nativeData.d.ts +66 -0
  166. package/dist/space-sdk/src/provider.d.ts +17 -0
  167. package/dist/space-sdk/src/queryCache.d.ts +45 -0
  168. package/dist/space-sdk/src/queryErrors.ts +51 -0
  169. package/dist/space-sdk/src/runtime.d.ts +615 -0
  170. package/dist/space-sdk/src/runtimeModules.ts +33 -0
  171. package/dist/space-sdk/src/space.ts +442 -0
  172. package/dist/space-sdk/src/standardViewParams.d.ts +15 -0
  173. package/dist/space-sdk/src/tailwind-candidates.d.ts +3418 -0
  174. package/dist/space-sdk/src/tailwind.ts +66 -0
  175. package/dist/space-sdk/src/ui/actions/ActionToast.d.ts +15 -0
  176. package/dist/space-sdk/src/ui/actions/actionWords.d.ts +16 -0
  177. package/dist/space-sdk/src/ui/actions/index.d.ts +7 -0
  178. package/dist/space-sdk/src/ui/actions/useActions.d.ts +69 -0
  179. package/dist/space-sdk/src/ui/actions/useToast.d.ts +41 -0
  180. package/dist/space-sdk/src/ui/blocks/Tabs.d.ts +139 -0
  181. package/dist/space-sdk/src/ui/blocks/blocks.d.ts +217 -0
  182. package/dist/space-sdk/src/ui/blocks/index.d.ts +4 -0
  183. package/dist/space-sdk/src/ui/board/BoardView.d.ts +36 -0
  184. package/dist/space-sdk/src/ui/board/boardModel.d.ts +46 -0
  185. package/dist/space-sdk/src/ui/board/boardWords.d.ts +9 -0
  186. package/dist/space-sdk/src/ui/board/index.d.ts +5 -0
  187. package/dist/space-sdk/src/ui/calendar/CalendarView.d.ts +49 -0
  188. package/dist/space-sdk/src/ui/calendar/DayPicker.d.ts +23 -0
  189. package/dist/space-sdk/src/ui/calendar/calendarMath.d.ts +81 -0
  190. package/dist/space-sdk/src/ui/charts/Chart.d.ts +203 -0
  191. package/dist/space-sdk/src/ui/charts/ChartTable.d.ts +37 -0
  192. package/dist/space-sdk/src/ui/charts/RenderChartData.d.ts +16 -0
  193. package/dist/space-sdk/src/ui/charts/StatRow.d.ts +59 -0
  194. package/dist/space-sdk/src/ui/charts/chartData.d.ts +84 -0
  195. package/dist/space-sdk/src/ui/comments/CommentPane.d.ts +58 -0
  196. package/dist/space-sdk/src/ui/comments/commentModel.d.ts +157 -0
  197. package/dist/space-sdk/src/ui/comments/commentWords.d.ts +60 -0
  198. package/dist/space-sdk/src/ui/comments/index.d.ts +4 -0
  199. package/dist/space-sdk/src/ui/comments/useComments.d.ts +146 -0
  200. package/dist/space-sdk/src/ui/engine/HelpSheet.d.ts +12 -0
  201. package/dist/space-sdk/src/ui/engine/KeyboardEngine.d.ts +27 -0
  202. package/dist/space-sdk/src/ui/engine/core.d.ts +73 -0
  203. package/dist/space-sdk/src/ui/engine/hooks.d.ts +64 -0
  204. package/dist/space-sdk/src/ui/engine/index.d.ts +14 -0
  205. package/dist/space-sdk/src/ui/engine/instance.d.ts +21 -0
  206. package/dist/space-sdk/src/ui/engine/keycapContext.d.ts +2 -0
  207. package/dist/space-sdk/src/ui/engine/registry.d.ts +77 -0
  208. package/dist/space-sdk/src/ui/engine/step.d.ts +11 -0
  209. package/dist/space-sdk/src/ui/engine/types.d.ts +54 -0
  210. package/dist/space-sdk/src/ui/fields/fieldWords.d.ts +56 -0
  211. package/dist/space-sdk/src/ui/fields/fields.d.ts +162 -0
  212. package/dist/space-sdk/src/ui/fields/index.d.ts +5 -0
  213. package/dist/space-sdk/src/ui/fields/useFieldDraft.d.ts +22 -0
  214. package/dist/space-sdk/src/ui/gallery/AttachmentGallery.d.ts +53 -0
  215. package/dist/space-sdk/src/ui/gallery/ImageViewer.d.ts +27 -0
  216. package/dist/space-sdk/src/ui/gallery/galleryWords.d.ts +95 -0
  217. package/dist/space-sdk/src/ui/gallery/index.d.ts +5 -0
  218. package/dist/space-sdk/src/ui/icons.d.ts +13 -0
  219. package/dist/space-sdk/src/ui/index.d.ts +54 -0
  220. package/dist/space-sdk/src/ui/keycap/Keycap.d.ts +22 -0
  221. package/dist/space-sdk/src/ui/keycap/index.d.ts +2 -0
  222. package/dist/space-sdk/src/ui/layout/Panels.d.ts +50 -0
  223. package/dist/space-sdk/src/ui/layout/chatPanelEdge.d.ts +77 -0
  224. package/dist/space-sdk/src/ui/layout/index.d.ts +5 -0
  225. package/dist/space-sdk/src/ui/layout/panelMath.d.ts +91 -0
  226. package/dist/space-sdk/src/ui/list/ListReader.d.ts +380 -0
  227. package/dist/space-sdk/src/ui/list/Row.d.ts +145 -0
  228. package/dist/space-sdk/src/ui/list/SelectionBar.d.ts +65 -0
  229. package/dist/space-sdk/src/ui/list/index.d.ts +14 -0
  230. package/dist/space-sdk/src/ui/list/rowState.d.ts +22 -0
  231. package/dist/space-sdk/src/ui/list/useListKeys.d.ts +89 -0
  232. package/dist/space-sdk/src/ui/list/useReorder.d.ts +86 -0
  233. package/dist/space-sdk/src/ui/list/useSelection.d.ts +90 -0
  234. package/dist/space-sdk/src/ui/open/OpenAsMenu.d.ts +15 -0
  235. package/dist/space-sdk/src/ui/open/index.d.ts +6 -0
  236. package/dist/space-sdk/src/ui/open/openModeStore.d.ts +39 -0
  237. package/dist/space-sdk/src/ui/open/useOpenMode.d.ts +17 -0
  238. package/dist/space-sdk/src/ui/overlay/Menu.d.ts +88 -0
  239. package/dist/space-sdk/src/ui/overlay/Popover.d.ts +28 -0
  240. package/dist/space-sdk/src/ui/overlay/Tooltip.d.ts +19 -0
  241. package/dist/space-sdk/src/ui/overlay/index.d.ts +9 -0
  242. package/dist/space-sdk/src/ui/overlay/layerRoot.d.ts +24 -0
  243. package/dist/space-sdk/src/ui/overlay/position.d.ts +31 -0
  244. package/dist/space-sdk/src/ui/period/PeriodPicker.d.ts +30 -0
  245. package/dist/space-sdk/src/ui/period/dateFormat.d.ts +50 -0
  246. package/dist/space-sdk/src/ui/period/dateWords.d.ts +88 -0
  247. package/dist/space-sdk/src/ui/period/periods.d.ts +70 -0
  248. package/dist/space-sdk/src/ui/period/usePeriod.d.ts +23 -0
  249. package/dist/space-sdk/src/ui/present/index.d.ts +3 -0
  250. package/dist/space-sdk/src/ui/present/presentWords.d.ts +27 -0
  251. package/dist/space-sdk/src/ui/present/screens.d.ts +36 -0
  252. package/dist/space-sdk/src/ui/present/useAudienceScreen.d.ts +38 -0
  253. package/dist/space-sdk/src/ui/styles.d.ts +21 -0
  254. package/dist/space-sdk/src/ui/timeline/TimelineView.d.ts +44 -0
  255. package/dist/space-sdk/src/ui/timeline/timelineMath.d.ts +123 -0
  256. package/dist/space-sdk/src/viewPeriod.d.ts +8 -0
  257. package/dist/space-sdk/src/vite.ts +92 -0
  258. package/dist/space-sdk/src/words/actions.ts +295 -0
  259. package/dist/space-sdk/src/words/clashes.ts +158 -0
  260. package/dist/space-sdk/src/words/format.ts +136 -0
  261. package/dist/space-sdk/src/words/index.ts +13 -0
  262. package/dist/space-sdk/src/words/keymap.ts +72 -0
  263. package/dist/space-sdk/src/words/keys.ts +297 -0
  264. package/dist/space-sdk/src/words/shell.ts +46 -0
  265. package/dist/space-sdk/src/words/types.ts +65 -0
  266. package/dist/view-renderer/dist/host.css +1 -0
  267. package/dist/view-renderer/dist/host.js +2374 -0
  268. package/dist/view-renderer/dist/theme.css +73 -0
  269. package/dist/view-renderer/src/dom.js +212 -0
  270. package/dist/view-renderer/src/errors.js +8 -0
  271. package/dist/view-renderer/src/host.tsx +250 -0
  272. package/dist/view-renderer/src/index.js +4 -0
  273. package/dist/view-renderer/src/png.js +213 -0
  274. package/dist/view-renderer/src/pool.js +110 -0
  275. package/dist/view-renderer/src/remote-broker.js +59 -0
  276. package/dist/view-renderer/src/renderer.js +279 -0
  277. package/package.json +21 -11
  278. package/skills/notis-cli/AGENT_INSTRUCTIONS.md +63 -12
  279. package/skills/notis-onboarding/BRIEF.md +14 -9
  280. package/skills/notis-query/cli.md +1 -1
  281. package/skills/notis-spaces/cli.md +540 -0
  282. package/src/cli.js +8 -8
  283. package/src/command-specs/agents.js +121 -8
  284. package/src/command-specs/auth.js +3 -3
  285. package/src/command-specs/diagnostics.js +97 -20
  286. package/src/command-specs/documents.js +158 -0
  287. package/src/command-specs/files.js +29 -0
  288. package/src/command-specs/handover.js +331 -79
  289. package/src/command-specs/helpers.js +50 -40
  290. package/src/command-specs/index.js +14 -5
  291. package/src/command-specs/meta.js +38 -9
  292. package/src/command-specs/onboarding.js +1 -1
  293. package/src/command-specs/profile.js +42 -1
  294. package/src/command-specs/skills.js +314 -9
  295. package/src/command-specs/smoke.js +16 -4
  296. package/src/command-specs/spaces.js +783 -0
  297. package/src/command-specs/tools.js +118 -21
  298. package/src/command-specs/version-history.js +20 -0
  299. package/src/command-specs/views.js +69 -0
  300. package/src/runtime/agent-browser.js +178 -267
  301. package/src/runtime/agent-setup.js +172 -13
  302. package/src/runtime/app-boundary-validator.js +338 -2
  303. package/src/runtime/app-data-literals.js +82 -0
  304. package/src/runtime/app-platform.js +750 -1570
  305. package/src/runtime/auth-recovery.js +17 -0
  306. package/src/runtime/base-skills.d.ts +11 -0
  307. package/src/runtime/base-skills.js +100 -3
  308. package/src/runtime/computer-identity.d.ts +30 -0
  309. package/src/runtime/computer-identity.js +151 -0
  310. package/src/runtime/config-lock.js +135 -0
  311. package/src/runtime/confined-space-build.js +74 -0
  312. package/src/runtime/confined-space-verify.js +49 -0
  313. package/src/runtime/delegated-context.js +5 -21
  314. package/src/runtime/native-record-files.js +47 -0
  315. package/src/runtime/oauth.js +342 -31
  316. package/src/runtime/profiles.js +19 -112
  317. package/src/runtime/retired-sdk-files.js +24 -0
  318. package/src/runtime/retry.js +150 -0
  319. package/src/runtime/skill-sync/cloud-client.ts +33 -8
  320. package/src/runtime/skill-sync/index.ts +443 -106
  321. package/src/runtime/skill-sync/local-scanner.ts +248 -32
  322. package/src/runtime/skill-sync/native-identity.ts +102 -0
  323. package/src/runtime/skill-sync/native-plan.ts +70 -0
  324. package/src/runtime/skill-sync/symlink-manager.ts +66 -16
  325. package/src/runtime/skill-sync/sync-plan.ts +34 -2
  326. package/src/runtime/skill-sync/types.ts +54 -0
  327. package/src/runtime/skill-sync/write-cloud-skill.ts +4 -4
  328. package/src/runtime/skill-sync-service.js +109 -0
  329. package/src/runtime/source-root.js +32 -0
  330. package/src/runtime/space-collection-scaffold.js +107 -0
  331. package/src/runtime/space-database-structures.js +229 -0
  332. package/src/runtime/space-fixture-broker.js +68 -0
  333. package/src/runtime/space-lock.js +337 -0
  334. package/src/runtime/space-platform.js +133 -0
  335. package/src/runtime/space-source.js +290 -0
  336. package/src/runtime/space-test-server.js +354 -0
  337. package/src/runtime/space-verification.js +94 -0
  338. package/src/runtime/space-verify-browser-worker.js +51 -0
  339. package/src/runtime/space-view-manifest.js +368 -0
  340. package/src/runtime/sync-skills.d.ts +5 -1
  341. package/src/runtime/sync-skills.js +11 -2
  342. package/src/runtime/tool-confirmation.js +138 -0
  343. package/src/runtime/transport.js +118 -24
  344. package/src/runtime/upsell.js +219 -0
  345. package/src/runtime/view-render.js +49 -0
  346. package/src/skill-sync-worker-entry.js +2 -0
  347. package/src/skill-sync-worker.js +114 -0
  348. package/src/space-harness-host.ts +122 -0
  349. package/template/.harness/index.html.tmpl +9 -352
  350. package/template/app/globals.css +29 -3
  351. package/template/app/layout.tsx +2 -6
  352. package/template/components/ui/badge.tsx +7 -4
  353. package/template/components/ui/button.tsx +1 -1
  354. package/template/components/ui/native-select.tsx +24 -0
  355. package/template/notis.config.ts +4 -36
  356. package/template/package-lock.json +1800 -1867
  357. package/template/package.json +16 -14
  358. package/template/postcss.config.mjs +1 -1
  359. package/template/tailwind.config.ts +1 -6
  360. package/template/tsconfig.json +1 -0
  361. package/template/vite.config.ts +2 -2
  362. package/dist/base-skills/notis-apps/SKILL.md +0 -613
  363. package/skills/notis-apps/cli.md +0 -285
  364. package/src/command-specs/apps.js +0 -3011
  365. package/src/runtime/app-changelog.js +0 -79
  366. package/src/runtime/app-dev-consumers.js +0 -154
  367. package/src/runtime/app-dev-host-lock.js +0 -80
  368. package/src/runtime/app-dev-process-identity.js +0 -111
  369. package/src/runtime/app-dev-roots.js +0 -284
  370. package/src/runtime/app-dev-server.js +0 -1140
  371. package/src/runtime/app-dev-sessions.js +0 -185
  372. package/src/runtime/app-registry-scaffolds.js +0 -367
  373. package/src/runtime/assets/store-screenshot-dark.png +0 -0
  374. package/src/runtime/cli-mode.generated.js +0 -5
  375. package/src/runtime/cli-mode.js +0 -34
  376. package/src/runtime/store-screenshot.js +0 -143
  377. package/template/CHANGELOG.md +0 -5
  378. package/template/app/page.tsx +0 -60
  379. package/template/components/ui/card.tsx +0 -56
  380. package/template/packages/sdk/src/components/DocumentEditor.tsx +0 -103
  381. package/template/packages/sdk/src/config.ts +0 -259
  382. package/template/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  383. package/template/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  384. package/template/packages/sdk/src/hooks/useDocument.ts +0 -78
  385. package/template/packages/sdk/src/hooks/useNotisNavigation.ts +0 -52
  386. package/template/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  387. package/template/packages/sdk/src/runtime.ts +0 -439
  388. package/template/packages/sdk/src/vite.ts +0 -56
  389. package/template/packages/sdk/tsconfig.json +0 -15
  390. /package/{template/packages → dist}/sdk/src/components/MultiSelectDragOverlay.tsx +0 -0
  391. /package/{template/packages → dist}/sdk/src/components/ShortcutHints.tsx +0 -0
  392. /package/{template/packages → dist}/sdk/src/hooks/useActiveResource.ts +0 -0
  393. /package/{template/packages → dist}/sdk/src/hooks/useTool.ts +0 -0
  394. /package/{template/packages → dist}/sdk/src/hooks/useTools.ts +0 -0
  395. /package/{template/packages → dist}/sdk/src/ui.ts +0 -0
@@ -0,0 +1,15 @@
1
+ // Keep this dependency-free: npm engines are advisory unless engine-strict is set.
2
+ // Both installation and the public entry point check before loading dependencies.
3
+ import { readFileSync } from 'node:fs';
4
+
5
+ const { engines } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
6
+ // This package declares one inclusive minimum, not a compound semver range.
7
+ const minimum = engines.node.match(/^>=(\d+)\.(\d+)\.(\d+)$/);
8
+ if (!minimum) throw new Error('CLI engines.node must declare one inclusive minimum version.');
9
+ const required = minimum.slice(1).map(Number);
10
+ const current = process.versions.node.split('.').map(Number);
11
+ const difference = current.map((part, index) => part - required[index]).find((part) => part !== 0);
12
+ if (difference < 0) {
13
+ process.stderr.write(`Notis CLI requires Node.js ${engines.node}; found ${process.versions.node}. Upgrade Node.js before running or installing the CLI.\n`);
14
+ process.exit(1);
15
+ }
package/bin/notis.js CHANGED
@@ -1,2 +1,4 @@
1
1
  #!/usr/bin/env node
2
+ import './check-runtime.js';
3
+
2
4
  import('../src/cli.js').then(({ run }) => run());
@@ -0,0 +1,320 @@
1
+ {
2
+ "version": 1,
3
+ "include": ["app/**", "components/**", "spaces/**"],
4
+ "exclude": [
5
+ "components/ui/input.tsx",
6
+ "components/ui/textarea.tsx",
7
+ "components/ui/checkbox.tsx",
8
+ "components/ui/switch.tsx",
9
+ "components/ui/button.tsx"
10
+ ],
11
+ "extensions": [".js", ".jsx", ".ts", ".tsx", ".css"],
12
+ "allow_directive": "notis-design-allow",
13
+ "allow_reason_min_length": 12,
14
+ "profiles": {
15
+ "space": {
16
+ "description": "Every file a Space view can draw from. Used by notis spaces build/verify/preview/deploy and by the server on source-verify, source-stage and source-publish. Rules without a profiles field run in every profile; rules with profiles run only in the listed ones. A rule's profile_messages.<profile> replaces its message in that profile. Comments are blanked before matching.",
17
+ "include": ["app/**", "components/**", "hooks/**", "lib/**", "spaces/**", "src/**", "views/**"],
18
+ "exclude": ["**/*.test.*", "**/*.spec.*", "**/__tests__/**", "**/fixtures/**"]
19
+ }
20
+ },
21
+ "toolkit_live_pieces": [],
22
+ "toolkit_note": "Rules with a toolkit_piece point at a hand-rolled pattern the live Notis toolkit replaces. They stay warnings until that piece name is added to toolkit_live_pieces, then they refuse like any error.",
23
+ "rules": [
24
+ {
25
+ "id": "no-border-box",
26
+ "severity": "error",
27
+ "pattern": "(?<![\\w-])border(?![\\w-])(?!\\s*:\\s*(?:0(?:px)?|none)\\s*(?:!important\\s*)?(?:[;}]))|(?<![\\w-])border-(?:[xy]|\\d+)(?![\\w-])",
28
+ "message": "Four-side borders are banned. Use a flat tint (bg-muted / bg-background) or a single border-t / border-b hairline between sections.",
29
+ "exclude": ["components/ui/badge.tsx", "components/ui/native-select.tsx"]
30
+ },
31
+ {
32
+ "id": "no-side-bar",
33
+ "severity": "error",
34
+ "pattern": "(?<![\\w-])border-[lrtbse]-(?:[2-8](?![\\w.-])|\\[|(?:primary|destructive|foreground|muted-foreground|ring|accent|current)(?![\\w-]))|\\bshadow-\\[[^\\]\\s]*inset_(?:-?(?:[1-9]|0?\\.\\d*[1-9])|0(?:px)?_-?(?:[2-9]|[1-9]\\d))|(?:box-shadow|boxShadow)\\s*:[^;{}]*\\binset\\s+(?:-?(?:[1-9]|0?\\.\\d*[1-9])|0(?:px)?\\s+-?(?:[2-9]|[1-9]\\d))|(?<![\\w-])border-(?:left|right|top|bottom|inline-start|inline-end|block-start|block-end)(?:\\s*:(?!\\s*(?:(?:0(?:px)?|none)\\b|1px\\s+solid\\s+(?:transparent\\b|(?:hsl\\()?var\\(--[\\w-]*border)))|-width\\s*:(?!\\s*(?:0(?:px)?|1px)\\b)|-color\\s*:(?!\\s*(?:transparent\\b|(?:hsl\\()?var\\(--[\\w-]*border)))|\\bborder(?:Left|Right|Top|Bottom|InlineStart|InlineEnd|BlockStart|BlockEnd)\\s*:\\s*['\\\"`](?!(?:(?:0(?:px)?|none)\\b|1px\\s+solid\\s+(?:transparent\\b|(?:hsl\\()?var\\(--[\\w-]*border)))",
35
+ "message": "One-side edges are banned: no thicker or coloured border and no inset shadow on a single side. Mark a selection or highlight with a background tint (bg-muted) or a 1px ring on all four sides."
36
+ },
37
+ {
38
+ "id": "no-dashed-box",
39
+ "severity": "error",
40
+ "pattern": "\\bborder-dashed\\b",
41
+ "message": "Dashed boxes are banned. Empty states are centered muted text with an optional primary button."
42
+ },
43
+ {
44
+ "id": "no-divide",
45
+ "severity": "error",
46
+ "pattern": "\\bdivide-[xy]\\b|<hr\\b",
47
+ "message": "Row dividers are banned. Use spacing, the Row hover from @notis/sdk/ui, or one hairline between sections.",
48
+ "profile_messages": {
49
+ "space": "Row dividers are banned. Use Row from @notis/sdk/ui (its spacing and hover tint separate items) or one hairline between sections."
50
+ }
51
+ },
52
+ {
53
+ "id": "no-ring-box",
54
+ "severity": "error",
55
+ "pattern": "(?<![\\w:-])ring-(?:1|2|4|inset)\\b",
56
+ "message": "Rings as a box or selection indicator are banned. Keep focus-visible:ring-2 on controls; use bg-muted for selection."
57
+ },
58
+ {
59
+ "id": "no-shadow",
60
+ "severity": "error",
61
+ "pattern": "\\bshadow-(?:sm|md|xl|2xl)\\b",
62
+ "message": "Shadows are banned on panels, cards, tiles, and bubbles. Only a floating popover or menu may use shadow-lg with bg-popover.",
63
+ "exclude": ["components/ui/popover.tsx", "components/ui/dropdown-menu.tsx", "components/ui/tooltip.tsx", "components/ui/select.tsx", "components/ui/dialog.tsx", "components/ui/sheet.tsx"]
64
+ },
65
+ {
66
+ "id": "no-floating-shadow-without-popover",
67
+ "severity": "error",
68
+ "pattern": "^(?!.*bg-popover).*\\bshadow-lg\\b",
69
+ "message": "shadow-lg is only allowed on a floating layer that also uses bg-popover.",
70
+ "exclude": ["components/ui/popover.tsx", "components/ui/dropdown-menu.tsx", "components/ui/tooltip.tsx", "components/ui/select.tsx", "components/ui/dialog.tsx", "components/ui/sheet.tsx"]
71
+ },
72
+ {
73
+ "id": "no-palette-hue",
74
+ "severity": "error",
75
+ "pattern": "\\b(?:bg|text|border|ring|from|via|to|fill|stroke|outline|decoration|accent|caret|divide|shadow|placeholder)-(?:red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose|slate|gray|zinc|neutral|stone)-\\d{2,3}\\b",
76
+ "message": "Hardcoded Tailwind palette colors are banned. Use tokens: text-foreground, text-muted-foreground, text-primary, bg-muted, bg-primary/10, text-destructive, bg-destructive/10."
77
+ },
78
+ {
79
+ "id": "no-hex-color",
80
+ "severity": "error",
81
+ "pattern": "#[0-9a-fA-F]{3}(?:[0-9a-fA-F]{3}(?:[0-9a-fA-F]{2})?)?(?![\\w-])",
82
+ "message": "Hex colors are banned. Use theme tokens (hsl(var(--primary)) with opacity steps for charts)."
83
+ },
84
+ {
85
+ "id": "no-gradient",
86
+ "severity": "error",
87
+ "pattern": "\\bbg-gradient-|linear-gradient\\(|radial-gradient\\(|conic-gradient\\(",
88
+ "message": "Gradients are banned."
89
+ },
90
+ {
91
+ "id": "no-backdrop-blur",
92
+ "severity": "error",
93
+ "pattern": "\\bbackdrop-blur",
94
+ "message": "Glassmorphism is banned."
95
+ },
96
+ {
97
+ "id": "no-eyebrow",
98
+ "severity": "error",
99
+ "pattern": "\\buppercase\\b[^\\n]{0,80}\\btracking-(?:wide|wider|widest|\\[)|\\btracking-(?:wide|wider|widest|\\[)[^\\n]{0,80}\\buppercase\\b",
100
+ "message": "Uppercase tracking eyebrows are banned. Use a plain noun page title and text-xs text-muted-foreground labels.",
101
+ "profile_messages": {
102
+ "space": "Uppercase tracking eyebrows are banned. Use text-xs text-muted-foreground labels; the top bar crumb names the page."
103
+ }
104
+ },
105
+ {
106
+ "id": "no-tiny-text",
107
+ "severity": "error",
108
+ "pattern": "\\btext-\\[(?:[0-9]|1[01])(?:\\.\\d+)?px\\]",
109
+ "message": "Text below 12px is banned. Use text-xs (12px) at minimum."
110
+ },
111
+ {
112
+ "id": "no-badge-outline",
113
+ "severity": "error",
114
+ "pattern": "<Badge\\b[^>]*variant=[\"']outline[\"']",
115
+ "message": "Badge variant=\"outline\" is banned. Use default, secondary, or destructive."
116
+ },
117
+ {
118
+ "id": "no-raw-select",
119
+ "severity": "error",
120
+ "pattern": "<select\\b",
121
+ "message": "Raw <select> is banned. Use NativeSelect from @/components/ui/native-select.",
122
+ "exclude": ["components/ui/native-select.tsx"]
123
+ },
124
+ {
125
+ "id": "no-search-input",
126
+ "severity": "error",
127
+ "pattern": "<input\\b[^>]*type=[\"']search[\"']|<[Ii]nput\\b[^>]*placeholder=[\"'][^\"']*\\b[Ss]earch",
128
+ "message": "In-app search inputs are banned. The portal owns search: wire useTopBarSearch from @notis/sdk.",
129
+ "profile_messages": {
130
+ "space": "In-page search inputs are banned. Give ListReader a search prop from @notis/sdk/ui: the top bar owns the search field."
131
+ }
132
+ },
133
+ {
134
+ "id": "no-font-serif",
135
+ "severity": "error",
136
+ "pattern": "\\bfont-serif\\b",
137
+ "message": "font-serif is banned. Apps use the portal font."
138
+ },
139
+ {
140
+ "id": "no-loading-placeholder",
141
+ "severity": "error",
142
+ "pattern": ">\\s*Loading(?:\\.{3}|…)?(?:\\s[^<]{0,40})?<|[\"'`]Loading(?:\\.{3}|…)",
143
+ "message": "Loading text is banned. Keep headings visible and render Skeleton / ViewSkeleton from @notis/sdk in the missing region only.",
144
+ "profile_messages": {
145
+ "space": "Loading text is banned. Keep headings visible and render Skeleton from @notis/sdk/ui in the missing region only."
146
+ }
147
+ },
148
+ {
149
+ "id": "no-app-shell-split",
150
+ "severity": "error",
151
+ "profiles": ["app"],
152
+ "scope": "file",
153
+ "pattern": "notis-app-shell[\\s\\S]*<aside\\b|<aside\\b[\\s\\S]*notis-app-shell",
154
+ "message": "A list-plus-detail page must be full-bleed: no padded page with an aside. Lay it out with notis-app-split and the notis-app-pane-list / notis-app-pane-detail panes."
155
+ },
156
+ {
157
+ "id": "no-page-heading",
158
+ "severity": "error",
159
+ "profiles": ["space"],
160
+ "pattern": "\\bPageHeading\\b|(?<![\\w-])nui-heading(?:-[\\w-]+)?(?![\\w-])|\\bimport\\s+(?:type\\s+)?\\{[^}]*\\bCard\\b[^}]*\\}\\s*from\\b|<Card(?![\\w.])|['\\\"`]@/components/ui/card['\\\"`]",
161
+ "message": "Spaces have no in-page title or card: the top bar shows the Space and the open record. Remove PageHeading and Card; give ListReader a title and lay blocks out with Section from @notis/sdk/ui."
162
+ },
163
+ {
164
+ "id": "no-space-h1",
165
+ "severity": "error",
166
+ "profiles": ["space"],
167
+ "pattern": "<h1(?![\\w-])|\\bcreateElement\\(\\s*['\\\"`]h1['\\\"`]",
168
+ "message": "A Space never draws an h1: the top bar holds the title. Blocks inside the page take a Section title (an h2) from @notis/sdk/ui."
169
+ },
170
+ {
171
+ "id": "no-centered-column",
172
+ "severity": "error",
173
+ "profiles": ["space"],
174
+ "pattern": "(?<![\\w-])mx-auto(?![\\w-])[^\\n\\\"'`]*(?<![\\w-])(?:max-w-|container(?![\\w-]))|(?<![\\w-])(?:max-w-[\\w\\[\\]./-]+|container)(?![\\w-])[^\\n\\\"'`]*(?<![\\w-])mx-auto(?![\\w-])|(?:max-width|maxWidth)\\s*:[^{}]*\\bmargin(?:-inline|Inline)?\\s*:\\s*['\\\"`]?(?:0(?:px)?\\s+)?auto\\b|\\bmargin(?:-inline|Inline)?\\s*:\\s*['\\\"`]?(?:0(?:px)?\\s+)?auto\\b[^{}]*(?:max-width|maxWidth)\\s*:",
175
+ "message": "Spaces fill their pane edge to edge. Drop the centred column (mx-auto with max-w or container, or max-width with margin auto): Section from @notis/sdk/ui keeps the 24px inset and form fields cap their own width."
176
+ },
177
+ {
178
+ "id": "no-app-shell",
179
+ "severity": "error",
180
+ "profiles": ["space"],
181
+ "pattern": "(?<![\\w-])notis-app-(?:shell|surface)(?![\\w-])|(?<![\\w-])list-row(?![\\w-])",
182
+ "message": "notis-app-shell, notis-app-surface and list-row are gone. Use ListReader, Section and Row from @notis/sdk/ui: they own the page frame, its padding and the row hover."
183
+ },
184
+ {
185
+ "id": "no-root-shortcut-provider",
186
+ "severity": "error",
187
+ "profiles": ["space"],
188
+ "scope": "file",
189
+ "pattern": "\\bimport\\s+(?:type\\s+)?\\{[^}]*\\bShortcutProvider\\b[^}]*\\}\\s*from\\s*['\\\"`]@notis/sdk['\\\"`]",
190
+ "message": "@notis/sdk no longer exports ShortcutProvider: NotisProvider already mounts it for every Space. Drop the import and the wrapper; register keys with useShortcuts from @notis/sdk/interactions."
191
+ },
192
+ {
193
+ "id": "no-own-search",
194
+ "severity": "error",
195
+ "profiles": ["space"],
196
+ "pattern": "\\buseTopBarSearch\\s*\\(|\\btype=\\{?\\s*['\\\"`]search['\\\"`]",
197
+ "message": "A Space never wires its own search. Give ListReader a search prop from @notis/sdk/ui: the top bar shows the field and the reader filters its list."
198
+ },
199
+ {
200
+ "id": "no-removed-listreader-props",
201
+ "severity": "error",
202
+ "profiles": ["space"],
203
+ "pattern": "<ListReader(?![\\w.])(?:<[^<>]*>)?(?:[^{}>]|\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})*\\})*?\\s(?:(?:toolbar|header|fill)\\s*=|divided(?![\\w-])|fill(?=[\\s/>]))",
204
+ "message": "ListReader no longer takes toolbar, header, divided or fill. Put the bar in title, tabs, create, viewMenu, infoLine and search; the reader always fills its pane and Row owns the spacing."
205
+ },
206
+ {
207
+ "id": "tiles-galleries-only",
208
+ "severity": "warn",
209
+ "profiles": ["space"],
210
+ "pattern": "\\blayout\\s*=\\s*\\{?\\s*['\\\"`]tiles['\\\"`]|\\brenderTile\\b",
211
+ "message": "Tiles are for galleries only (competitors, integrations, discovering skills). Every other collection is a ListReader list: drop layout tiles and renderTile unless this view is a gallery."
212
+ },
213
+ {
214
+ "id": "space-no-global-key-listener",
215
+ "severity": "error",
216
+ "profiles": ["space"],
217
+ "pattern": "\\b(?:window|document|globalThis|self)\\s*\\.\\s*(?:addEventListener\\s*\\(\\s*['\"`](?:keydown|keyup|keypress)['\"`]|onkey(?:down|up|press)\\s*=)",
218
+ "message": "Spaces never listen for keys on window or document: the host runs one keyboard engine for every pane. Use useShortcut or useListKeys from @notis/sdk/ui, or onKeyDown on the focused element."
219
+ },
220
+ {
221
+ "id": "space-no-viewport-height",
222
+ "severity": "error",
223
+ "profiles": ["space"],
224
+ "pattern": "(?<![\\w-])(?:min-|max-)?h-(?:screen|dvh|svh|lvh)\\b|(?<![\\w.-])\\d+(?:\\.\\d+)?[dsl]?vh\\b",
225
+ "message": "The host gives every Space its full height. Use h-full, flex-1 and min-h-0 instead of screen or vh heights, which overflow the host frame and the phone layout."
226
+ },
227
+ {
228
+ "id": "space-no-raw-color",
229
+ "severity": "error",
230
+ "profiles": ["space"],
231
+ "pattern": "\\b(?:rgba?|hsla?|hwb|oklch|oklab|lab|lch)\\(\\s*(?!var\\(|from\\b)[\\d.]|(?<![\\w-])(?:bg|text|border|fill|stroke|ring|outline|decoration|from|via|to|caret|accent|placeholder|divide)-(?:white|black)\\b",
232
+ "message": "Colours come from theme tokens so light and dark both work: hsl(var(--primary)), text-foreground, bg-background, text-primary-foreground. Literal rgb/hsl/oklch values and white/black utilities are banned."
233
+ },
234
+ {
235
+ "id": "space-no-body-portal",
236
+ "severity": "error",
237
+ "profiles": ["space"],
238
+ "pattern": "\\bcreatePortal\\s*\\(|\\bdocument\\.body\\b|<(?:[A-Z]\\w*\\.)?Portal\\b",
239
+ "message": "Spaces render inside a Shadow root. A menu or popover portalled to document.body loses the Space's styles, theme and keyboard. Use Menu or Popover from @notis/sdk/ui or render the layer inline."
240
+ },
241
+ {
242
+ "id": "space-no-english-literal",
243
+ "severity": "error",
244
+ "profiles": ["space"],
245
+ "include": ["**/*.tsx", "**/*.jsx"],
246
+ "pattern": "(?:^[ \\t]*|(?<![\\s=]))>[ \\t]*(?=[^<>{}\\n]*[A-Za-z]{2})[A-Za-z][^<>{}\\n=;()&|]*(?:</|\\{)|\\b(?:placeholder|title|aria-label|alt|label)=[\"'](?=[^\"'{}\\n]*[A-Za-z]{2})[^\"'{}\\n]*[\"']",
247
+ "message": "A Space keeps its visible words in its words table (or uses a toolkit piece that owns its words) and renders them from there, never as a literal in JSX."
248
+ },
249
+ {
250
+ "id": "space-no-private-path",
251
+ "severity": "error",
252
+ "profiles": ["space"],
253
+ "pattern": "['\"`](?:/Users/|/home/[\\w.-]+/|/private/|/var/folders/|~/|file:/)|['\"`/]\\.(?:notis|context)/|['\"`/]\\.env(?:\\.[\\w-]+)?['\"`]",
254
+ "message": "A Space never names a private path (a home folder, .notis, .context or .env). Everything it needs ships with its source or comes from its declared resources."
255
+ },
256
+ {
257
+ "id": "space-no-outside-import",
258
+ "severity": "error",
259
+ "profiles": ["space"],
260
+ "pattern": "(?:\\bfrom\\s*|\\bimport\\s*\\(\\s*|\\brequire\\s*\\(\\s*|^\\s*import\\s+)['\"`](?:/|[A-Za-z]:[\\\\/]|node:|@notis/sdk/(?:src|dist|internal|lib)\\b|(?:\\.\\.?/)+packages/sdk/)",
261
+ "message": "Import only from this Space's own files and the public @notis/sdk entry points. Absolute paths, node: modules and toolkit internals break in the host."
262
+ },
263
+ {
264
+ "id": "toolkit-list-reader",
265
+ "severity": "warn",
266
+ "profiles": ["space"],
267
+ "toolkit_piece": "ListReader",
268
+ "pattern": "\\bnotis-app-(?:split|pane-list|pane-detail)\\b",
269
+ "message": "A hand-made list plus detail split. Use ListReader from @notis/sdk/ui: it owns the split, the one-pane rule next to chat and the phone layout."
270
+ },
271
+ {
272
+ "id": "toolkit-list-keys",
273
+ "severity": "warn",
274
+ "profiles": ["space"],
275
+ "toolkit_piece": "useListKeys",
276
+ "pattern": "['\"`]Arrow(?:Up|Down)['\"`]|\\.key\\s*===?\\s*['\"`][jkJK]['\"`]",
277
+ "message": "Hand-made up/down or J/K list movement. Use ListReader or useListKeys from @notis/sdk/ui so keys match the Manager (J wraps)."
278
+ },
279
+ {
280
+ "id": "toolkit-shortcut",
281
+ "severity": "warn",
282
+ "profiles": ["space"],
283
+ "toolkit_piece": "useShortcut",
284
+ "pattern": "\\.key\\s*===?\\s*['\"`](?![jkJK]['\"`])[a-zA-Z?/]['\"`]",
285
+ "message": "A hand-made letter shortcut. Use useShortcut from @notis/sdk/ui so it shows in the ? sheet and never clashes with the host's keys."
286
+ },
287
+ {
288
+ "id": "toolkit-selection-bar",
289
+ "severity": "warn",
290
+ "profiles": ["space"],
291
+ "toolkit_piece": "SelectionBar",
292
+ "pattern": "\\bMultiSelect(?:ActionBar|Checkbox|DragOverlay)\\b|\\buseMultiSelect\\b",
293
+ "message": "Old multi-select pieces. Use SelectionBar and useSelection from @notis/sdk/ui: they own the checkboxes, the bar, its standard actions and their EN/FR words."
294
+ },
295
+ {
296
+ "id": "toolkit-keycap",
297
+ "severity": "warn",
298
+ "profiles": ["space"],
299
+ "toolkit_piece": "Keycap",
300
+ "pattern": "<kbd\\b|\\bShortcutHints?\\b",
301
+ "message": "Hand-made key hints. Use Keycap from @notis/sdk/ui; the ? sheet lists every shortcut for free."
302
+ },
303
+ {
304
+ "id": "toolkit-menu",
305
+ "severity": "warn",
306
+ "profiles": ["space"],
307
+ "toolkit_piece": "Menu",
308
+ "pattern": "@radix-ui/react-(?:dropdown-menu|popover|context-menu|menubar)|\\brole=[\"']menu[\"']|\\bDropdownMenu\\b",
309
+ "message": "A hand-made menu or popover. Use Menu or Popover from @notis/sdk/ui: it opens inside the Shadow root with the host's keys and looks."
310
+ },
311
+ {
312
+ "id": "toolkit-open-as",
313
+ "severity": "warn",
314
+ "profiles": ["space"],
315
+ "toolkit_piece": "OpenAs",
316
+ "pattern": "\\bfixed\\b[^\\n\"'`]{0,80}\\binset-(?:0|x-0|y-0)\\b|\\binset-(?:0|x-0|y-0)\\b[^\\n\"'`]{0,80}\\bfixed\\b|position\\s*:\\s*fixed\\b",
317
+ "message": "A hand-made overlay or side panel. Open the item as Side, Center or Full through ListReader's openAs or OpenAsMenu from @notis/sdk/ui; a Space does not build its own reader frame."
318
+ }
319
+ ]
320
+ }
@@ -0,0 +1,45 @@
1
+ [
2
+ "api",
3
+ "apps",
4
+ "auth",
5
+ "authorized-agents",
6
+ "automations",
7
+ "billing",
8
+ "channels",
9
+ "chat",
10
+ "cli-connected",
11
+ "cli-setup",
12
+ "desktop-quick-login",
13
+ "documents",
14
+ "email-verified",
15
+ "install",
16
+ "integrations",
17
+ "invalid-access",
18
+ "login",
19
+ "manage",
20
+ "mcp-oauth-callback",
21
+ "memories",
22
+ "oauth",
23
+ "oauth-complete",
24
+ "overlay",
25
+ "pricing",
26
+ "referrals",
27
+ "reminders",
28
+ "sandbox-preview",
29
+ "settings",
30
+ "share",
31
+ "signup",
32
+ "skills",
33
+ "spaces",
34
+ "start",
35
+ "store",
36
+ "subscribe",
37
+ "team",
38
+ "transcript",
39
+ "typography-demo",
40
+ "usage",
41
+ "usage-menu-bar",
42
+ "view",
43
+ "voice-notch",
44
+ "wrapped"
45
+ ]