@notis_ai/cli 0.2.0-beta.137.1 → 0.2.0-beta.144.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 (294) hide show
  1. package/README.md +82 -20
  2. package/dist/agent-hooks/notis-agent-hook.mjs +19750 -0
  3. package/{skills → dist/base-skills}/notis-apps/SKILL.md +84 -53
  4. package/{skills → dist/base-skills}/notis-cli/SKILL.md +9 -9
  5. package/dist/base-skills/notis-query/SKILL.md +705 -0
  6. package/dist/skill-sync/index.js +1528 -0
  7. package/dist/skill-sync/index.js.map +7 -0
  8. package/package.json +5 -2
  9. package/skills/notis-apps/cli.md +38 -17
  10. package/skills/notis-cli/AGENT_INSTRUCTIONS.md +39 -0
  11. package/skills/notis-onboarding/BRIEF.md +16 -0
  12. package/src/agent-hook-entry.js +5 -0
  13. package/src/cli.js +23 -14
  14. package/src/command-specs/agents.js +392 -0
  15. package/src/command-specs/apps.js +871 -387
  16. package/src/command-specs/auth.js +63 -10
  17. package/src/command-specs/index.js +6 -0
  18. package/src/command-specs/onboarding.js +69 -5
  19. package/src/command-specs/skills.js +56 -0
  20. package/src/runtime/agent-memory-state.js +126 -0
  21. package/src/runtime/agent-setup.js +383 -0
  22. package/src/runtime/app-dev-consumers.js +154 -0
  23. package/src/runtime/app-dev-host-lock.js +80 -0
  24. package/src/runtime/app-dev-roots.js +284 -0
  25. package/src/runtime/app-dev-server.js +212 -22
  26. package/src/runtime/app-dev-sessions.js +105 -145
  27. package/src/runtime/app-platform.js +1291 -165
  28. package/src/runtime/app-registry-scaffolds.js +367 -0
  29. package/src/runtime/base-skills.d.ts +20 -0
  30. package/src/runtime/base-skills.js +167 -0
  31. package/src/runtime/login-listener.js +15 -0
  32. package/src/runtime/oauth.js +1506 -141
  33. package/src/runtime/output.js +7 -0
  34. package/src/runtime/ports.js +16 -0
  35. package/src/runtime/profiles.js +0 -5
  36. package/src/runtime/skill-sync/cloud-client.ts +96 -0
  37. package/src/runtime/skill-sync/index.ts +644 -0
  38. package/src/runtime/skill-sync/local-scanner.ts +1046 -0
  39. package/src/runtime/skill-sync/symlink-manager.ts +383 -0
  40. package/src/runtime/skill-sync/sync-plan.ts +22 -0
  41. package/src/runtime/skill-sync/types.ts +103 -0
  42. package/src/runtime/skill-sync/write-cloud-skill.ts +50 -0
  43. package/src/runtime/store-screenshot.js +6 -1
  44. package/src/runtime/sync-skills.d.ts +37 -0
  45. package/src/runtime/sync-skills.js +215 -0
  46. package/template/app/layout.tsx +5 -1
  47. package/template/notis.config.ts +1 -0
  48. package/template/packages/sdk/package.json +2 -1
  49. package/template/packages/sdk/src/components/MarkdownEditor.tsx +121 -0
  50. package/template/packages/sdk/src/components/MultiSelectActionBar.tsx +37 -119
  51. package/template/packages/sdk/src/components/MultiSelectCheckbox.tsx +5 -1
  52. package/template/packages/sdk/src/components/MultiSelectDragOverlay.tsx +1 -1
  53. package/template/packages/sdk/src/components/NotisSelectionBoundary.tsx +55 -0
  54. package/template/packages/sdk/src/components/ShortcutHints.tsx +56 -0
  55. package/template/packages/sdk/src/config.ts +19 -0
  56. package/template/packages/sdk/src/hooks/useActiveResource.ts +19 -0
  57. package/template/packages/sdk/src/hooks/useCollectionInteractions.ts +709 -0
  58. package/template/packages/sdk/src/hooks/useHandover.ts +3 -0
  59. package/template/packages/sdk/src/hooks/useMultiSelect.ts +44 -482
  60. package/template/packages/sdk/src/hooks/useTool.ts +5 -4
  61. package/template/packages/sdk/src/index.ts +47 -2
  62. package/template/packages/sdk/src/interactions/actions.ts +46 -0
  63. package/template/packages/sdk/src/interactions/shortcuts.tsx +628 -0
  64. package/template/packages/sdk/src/interactions.ts +41 -0
  65. package/template/packages/sdk/src/provider.tsx +2 -1
  66. package/template/packages/sdk/src/runtime.ts +85 -3
  67. package/dist/scaffolds/notis-database/CHANGELOG.md +0 -5
  68. package/dist/scaffolds/notis-database/app/globals.css +0 -44
  69. package/dist/scaffolds/notis-database/app/layout.tsx +0 -6
  70. package/dist/scaffolds/notis-database/app/page.tsx +0 -1088
  71. package/dist/scaffolds/notis-database/components/ui/badge.tsx +0 -28
  72. package/dist/scaffolds/notis-database/components/ui/button.tsx +0 -53
  73. package/dist/scaffolds/notis-database/components/ui/card.tsx +0 -56
  74. package/dist/scaffolds/notis-database/components/ui/table.tsx +0 -120
  75. package/dist/scaffolds/notis-database/components.json +0 -20
  76. package/dist/scaffolds/notis-database/index.html +0 -12
  77. package/dist/scaffolds/notis-database/lib/types.ts +0 -132
  78. package/dist/scaffolds/notis-database/lib/utils.ts +0 -6
  79. package/dist/scaffolds/notis-database/metadata/screenshot-1.png +0 -0
  80. package/dist/scaffolds/notis-database/metadata/screenshot-2.png +0 -0
  81. package/dist/scaffolds/notis-database/metadata/screenshot-3.png +0 -0
  82. package/dist/scaffolds/notis-database/metadata/screenshot-4.png +0 -0
  83. package/dist/scaffolds/notis-database/metadata/screenshot-5.png +0 -0
  84. package/dist/scaffolds/notis-database/metadata/screenshot-fixtures.json +0 -1839
  85. package/dist/scaffolds/notis-database/notis.config.ts +0 -73
  86. package/dist/scaffolds/notis-database/package-lock.json +0 -3935
  87. package/dist/scaffolds/notis-database/package.json +0 -32
  88. package/dist/scaffolds/notis-database/packages/sdk/package.json +0 -36
  89. package/dist/scaffolds/notis-database/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  90. package/dist/scaffolds/notis-database/packages/sdk/src/components/Markdown.tsx +0 -60
  91. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  92. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  93. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  94. package/dist/scaffolds/notis-database/packages/sdk/src/config.ts +0 -234
  95. package/dist/scaffolds/notis-database/packages/sdk/src/documents.ts +0 -250
  96. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useBackend.ts +0 -41
  97. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  98. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  99. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  100. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDocument.ts +0 -78
  101. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDocuments.ts +0 -121
  102. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useHandover.ts +0 -75
  103. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  104. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useNotis.ts +0 -34
  105. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  106. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTool.ts +0 -64
  107. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTools.ts +0 -56
  108. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  109. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  110. package/dist/scaffolds/notis-database/packages/sdk/src/index.ts +0 -100
  111. package/dist/scaffolds/notis-database/packages/sdk/src/provider.tsx +0 -43
  112. package/dist/scaffolds/notis-database/packages/sdk/src/runtime.ts +0 -351
  113. package/dist/scaffolds/notis-database/packages/sdk/src/styles.css +0 -186
  114. package/dist/scaffolds/notis-database/packages/sdk/src/ui.ts +0 -15
  115. package/dist/scaffolds/notis-database/packages/sdk/src/vite.ts +0 -56
  116. package/dist/scaffolds/notis-database/packages/sdk/tsconfig.json +0 -15
  117. package/dist/scaffolds/notis-database/postcss.config.mjs +0 -8
  118. package/dist/scaffolds/notis-database/src/dev-main.tsx +0 -23
  119. package/dist/scaffolds/notis-database/src/mock-runtime.ts +0 -561
  120. package/dist/scaffolds/notis-database/tailwind.config.ts +0 -59
  121. package/dist/scaffolds/notis-database/tsconfig.json +0 -23
  122. package/dist/scaffolds/notis-database/vite.config.ts +0 -22
  123. package/dist/scaffolds/notis-journal/CHANGELOG.md +0 -29
  124. package/dist/scaffolds/notis-journal/app/globals.css +0 -37
  125. package/dist/scaffolds/notis-journal/app/insights/page.tsx +0 -513
  126. package/dist/scaffolds/notis-journal/app/journal-core.tsx +0 -362
  127. package/dist/scaffolds/notis-journal/app/journal-ui.tsx +0 -337
  128. package/dist/scaffolds/notis-journal/app/layout.tsx +0 -6
  129. package/dist/scaffolds/notis-journal/app/page.tsx +0 -486
  130. package/dist/scaffolds/notis-journal/components/ui/badge.tsx +0 -28
  131. package/dist/scaffolds/notis-journal/components/ui/button.tsx +0 -53
  132. package/dist/scaffolds/notis-journal/components/ui/card.tsx +0 -56
  133. package/dist/scaffolds/notis-journal/components.json +0 -20
  134. package/dist/scaffolds/notis-journal/index.html +0 -12
  135. package/dist/scaffolds/notis-journal/lib/utils.ts +0 -6
  136. package/dist/scaffolds/notis-journal/metadata/screenshot-1.png +0 -0
  137. package/dist/scaffolds/notis-journal/metadata/screenshot-2.png +0 -0
  138. package/dist/scaffolds/notis-journal/metadata/screenshot-3.png +0 -0
  139. package/dist/scaffolds/notis-journal/metadata/screenshot-4.png +0 -0
  140. package/dist/scaffolds/notis-journal/metadata/screenshot-5.png +0 -0
  141. package/dist/scaffolds/notis-journal/metadata/screenshot-6.png +0 -0
  142. package/dist/scaffolds/notis-journal/metadata/screenshot-fixtures.json +0 -132
  143. package/dist/scaffolds/notis-journal/notis.config.ts +0 -93
  144. package/dist/scaffolds/notis-journal/package-lock.json +0 -4615
  145. package/dist/scaffolds/notis-journal/package.json +0 -34
  146. package/dist/scaffolds/notis-journal/packages/sdk/package.json +0 -36
  147. package/dist/scaffolds/notis-journal/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  148. package/dist/scaffolds/notis-journal/packages/sdk/src/components/Markdown.tsx +0 -60
  149. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  150. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  151. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  152. package/dist/scaffolds/notis-journal/packages/sdk/src/config.ts +0 -234
  153. package/dist/scaffolds/notis-journal/packages/sdk/src/documents.ts +0 -250
  154. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useBackend.ts +0 -41
  155. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  156. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  157. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  158. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDocument.ts +0 -78
  159. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDocuments.ts +0 -121
  160. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useHandover.ts +0 -75
  161. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  162. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useNotis.ts +0 -34
  163. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  164. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTool.ts +0 -64
  165. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTools.ts +0 -56
  166. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  167. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  168. package/dist/scaffolds/notis-journal/packages/sdk/src/index.ts +0 -100
  169. package/dist/scaffolds/notis-journal/packages/sdk/src/provider.tsx +0 -43
  170. package/dist/scaffolds/notis-journal/packages/sdk/src/runtime.ts +0 -351
  171. package/dist/scaffolds/notis-journal/packages/sdk/src/styles.css +0 -186
  172. package/dist/scaffolds/notis-journal/packages/sdk/src/ui.ts +0 -15
  173. package/dist/scaffolds/notis-journal/packages/sdk/src/vite.ts +0 -56
  174. package/dist/scaffolds/notis-journal/packages/sdk/tsconfig.json +0 -15
  175. package/dist/scaffolds/notis-journal/postcss.config.mjs +0 -8
  176. package/dist/scaffolds/notis-journal/skills/journal-onboarding/SKILL.md +0 -120
  177. package/dist/scaffolds/notis-journal/src/dev-main.tsx +0 -58
  178. package/dist/scaffolds/notis-journal/src/mock-runtime.ts +0 -199
  179. package/dist/scaffolds/notis-journal/tailwind.config.ts +0 -58
  180. package/dist/scaffolds/notis-journal/tsconfig.json +0 -23
  181. package/dist/scaffolds/notis-journal/vite.config.ts +0 -10
  182. package/dist/scaffolds/notis-notes/CHANGELOG.md +0 -5
  183. package/dist/scaffolds/notis-notes/app/globals.css +0 -3
  184. package/dist/scaffolds/notis-notes/app/layout.tsx +0 -6
  185. package/dist/scaffolds/notis-notes/app/page.tsx +0 -1943
  186. package/dist/scaffolds/notis-notes/app/phosphor-icons.ts +0 -596
  187. package/dist/scaffolds/notis-notes/components/ui/badge.tsx +0 -28
  188. package/dist/scaffolds/notis-notes/components/ui/button.tsx +0 -53
  189. package/dist/scaffolds/notis-notes/components/ui/card.tsx +0 -56
  190. package/dist/scaffolds/notis-notes/components.json +0 -20
  191. package/dist/scaffolds/notis-notes/lib/utils.ts +0 -6
  192. package/dist/scaffolds/notis-notes/lib/visible-properties.ts +0 -144
  193. package/dist/scaffolds/notis-notes/metadata/screenshot-1.png +0 -0
  194. package/dist/scaffolds/notis-notes/metadata/screenshot-2.png +0 -0
  195. package/dist/scaffolds/notis-notes/metadata/screenshot-3.png +0 -0
  196. package/dist/scaffolds/notis-notes/metadata/screenshot-4.png +0 -0
  197. package/dist/scaffolds/notis-notes/metadata/screenshot-5.png +0 -0
  198. package/dist/scaffolds/notis-notes/metadata/screenshot-fixtures.json +0 -752
  199. package/dist/scaffolds/notis-notes/notis.config.ts +0 -80
  200. package/dist/scaffolds/notis-notes/package-lock.json +0 -4636
  201. package/dist/scaffolds/notis-notes/package.json +0 -35
  202. package/dist/scaffolds/notis-notes/packages/sdk/package.json +0 -36
  203. package/dist/scaffolds/notis-notes/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  204. package/dist/scaffolds/notis-notes/packages/sdk/src/components/Markdown.tsx +0 -60
  205. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  206. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  207. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  208. package/dist/scaffolds/notis-notes/packages/sdk/src/config.ts +0 -234
  209. package/dist/scaffolds/notis-notes/packages/sdk/src/documents.ts +0 -250
  210. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useBackend.ts +0 -41
  211. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  212. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  213. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  214. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDocument.ts +0 -78
  215. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDocuments.ts +0 -121
  216. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useHandover.ts +0 -75
  217. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  218. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useNotis.ts +0 -34
  219. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  220. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTool.ts +0 -64
  221. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTools.ts +0 -56
  222. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  223. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  224. package/dist/scaffolds/notis-notes/packages/sdk/src/index.ts +0 -100
  225. package/dist/scaffolds/notis-notes/packages/sdk/src/provider.tsx +0 -43
  226. package/dist/scaffolds/notis-notes/packages/sdk/src/runtime.ts +0 -351
  227. package/dist/scaffolds/notis-notes/packages/sdk/src/styles.css +0 -186
  228. package/dist/scaffolds/notis-notes/packages/sdk/src/ui.ts +0 -15
  229. package/dist/scaffolds/notis-notes/packages/sdk/src/vite.ts +0 -56
  230. package/dist/scaffolds/notis-notes/packages/sdk/tsconfig.json +0 -15
  231. package/dist/scaffolds/notis-notes/postcss.config.mjs +0 -8
  232. package/dist/scaffolds/notis-notes/tailwind.config.ts +0 -58
  233. package/dist/scaffolds/notis-notes/tsconfig.json +0 -23
  234. package/dist/scaffolds/notis-notes/vite.config.ts +0 -10
  235. package/dist/scaffolds/notis-random/CHANGELOG.md +0 -15
  236. package/dist/scaffolds/notis-random/README.md +0 -33
  237. package/dist/scaffolds/notis-random/app/globals.css +0 -11
  238. package/dist/scaffolds/notis-random/app/history/page.tsx +0 -67
  239. package/dist/scaffolds/notis-random/app/layout.tsx +0 -7
  240. package/dist/scaffolds/notis-random/app/page.tsx +0 -289
  241. package/dist/scaffolds/notis-random/components/ui/button.tsx +0 -50
  242. package/dist/scaffolds/notis-random/components/ui/card.tsx +0 -16
  243. package/dist/scaffolds/notis-random/components/ui/input.tsx +0 -23
  244. package/dist/scaffolds/notis-random/components.json +0 -20
  245. package/dist/scaffolds/notis-random/index.html +0 -12
  246. package/dist/scaffolds/notis-random/lib/notis-tools.ts +0 -128
  247. package/dist/scaffolds/notis-random/lib/rng.ts +0 -202
  248. package/dist/scaffolds/notis-random/lib/roll-record.ts +0 -189
  249. package/dist/scaffolds/notis-random/lib/utils.ts +0 -25
  250. package/dist/scaffolds/notis-random/metadata/screenshot-1.png +0 -0
  251. package/dist/scaffolds/notis-random/metadata/screenshot-2.png +0 -0
  252. package/dist/scaffolds/notis-random/metadata/screenshot-3.png +0 -0
  253. package/dist/scaffolds/notis-random/metadata/screenshot-4.png +0 -0
  254. package/dist/scaffolds/notis-random/metadata/screenshot-5.png +0 -0
  255. package/dist/scaffolds/notis-random/metadata/screenshot-fixtures.json +0 -753
  256. package/dist/scaffolds/notis-random/notis.config.ts +0 -86
  257. package/dist/scaffolds/notis-random/package-lock.json +0 -4513
  258. package/dist/scaffolds/notis-random/package.json +0 -36
  259. package/dist/scaffolds/notis-random/packages/sdk/package.json +0 -36
  260. package/dist/scaffolds/notis-random/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  261. package/dist/scaffolds/notis-random/packages/sdk/src/components/Markdown.tsx +0 -60
  262. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  263. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  264. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  265. package/dist/scaffolds/notis-random/packages/sdk/src/config.ts +0 -234
  266. package/dist/scaffolds/notis-random/packages/sdk/src/documents.ts +0 -250
  267. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useBackend.ts +0 -41
  268. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  269. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  270. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  271. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDocument.ts +0 -78
  272. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDocuments.ts +0 -121
  273. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useHandover.ts +0 -75
  274. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  275. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useNotis.ts +0 -34
  276. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  277. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTool.ts +0 -64
  278. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTools.ts +0 -56
  279. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  280. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  281. package/dist/scaffolds/notis-random/packages/sdk/src/index.ts +0 -100
  282. package/dist/scaffolds/notis-random/packages/sdk/src/provider.tsx +0 -43
  283. package/dist/scaffolds/notis-random/packages/sdk/src/runtime.ts +0 -351
  284. package/dist/scaffolds/notis-random/packages/sdk/src/styles.css +0 -186
  285. package/dist/scaffolds/notis-random/packages/sdk/src/ui.ts +0 -15
  286. package/dist/scaffolds/notis-random/packages/sdk/src/vite.ts +0 -56
  287. package/dist/scaffolds/notis-random/packages/sdk/tsconfig.json +0 -15
  288. package/dist/scaffolds/notis-random/postcss.config.mjs +0 -6
  289. package/dist/scaffolds/notis-random/src/dev-main.tsx +0 -70
  290. package/dist/scaffolds/notis-random/src/mock-runtime.ts +0 -129
  291. package/dist/scaffolds/notis-random/tailwind.config.ts +0 -50
  292. package/dist/scaffolds/notis-random/tsconfig.json +0 -23
  293. package/dist/scaffolds/notis-random/vite.config.ts +0 -11
  294. package/dist/scaffolds.json +0 -49
@@ -1,37 +0,0 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
4
-
5
- /* The portal mounts the app inside [data-notis-app-root]; let it fill the width. */
6
- [data-notis-app-root] {
7
- width: 100%;
8
- }
9
-
10
- /*
11
- * Dev-preview fallback tokens. Active only under [data-dev-preview], which the
12
- * standalone dev entrypoint sets. The production bundle runs inside the portal
13
- * shadow root where the host injects real theme tokens, so this rule is scoped
14
- * narrowly enough to never collide with portal-provided values.
15
- */
16
- [data-dev-preview] {
17
- --background: 0 0% 100%;
18
- --foreground: 222.2 84% 4.9%;
19
- --card: 0 0% 100%;
20
- --card-foreground: 222.2 84% 4.9%;
21
- --popover: 0 0% 100%;
22
- --popover-foreground: 222.2 84% 4.9%;
23
- --primary: 222.2 47.4% 11.2%;
24
- --primary-foreground: 210 40% 98%;
25
- --secondary: 210 40% 96.1%;
26
- --secondary-foreground: 222.2 47.4% 11.2%;
27
- --muted: 210 40% 96.1%;
28
- --muted-foreground: 0 0% 46.9%;
29
- --accent: 210 40% 96.1%;
30
- --accent-foreground: 222.2 47.4% 11.2%;
31
- --destructive: 0 84.2% 60.2%;
32
- --destructive-foreground: 210 40% 98%;
33
- --border: 214.3 31.8% 91.4%;
34
- --input: 214.3 31.8% 91.4%;
35
- --ring: 222.2 84% 4.9%;
36
- --radius: 0.5rem;
37
- }
@@ -1,513 +0,0 @@
1
- 'use client';
2
-
3
- import { useMemo } from 'react';
4
- import { useNotisNavigation } from '@notis/sdk';
5
- import {
6
- ChartLineUpIcon,
7
- FlameIcon,
8
- LightningIcon,
9
- MoonStarsIcon,
10
- NotebookIcon,
11
- RocketLaunchIcon,
12
- SparkleIcon,
13
- SunHorizonIcon,
14
- } from '@phosphor-icons/react';
15
-
16
- import { Button } from '@/components/ui/button';
17
- import { cn } from '@/lib/utils';
18
- import {
19
- DAY_MOOD_COLOR,
20
- ENERGY_COLOR,
21
- MOOD_SCALE,
22
- MORNING_MOOD_COLOR,
23
- MOTIVATION_COLOR,
24
- average,
25
- computeStreak,
26
- dayKey,
27
- eveningComplete,
28
- formatDay,
29
- moodStep,
30
- morningComplete,
31
- recentGratitudes,
32
- round1,
33
- topMoodWords,
34
- useJournalEntries,
35
- type JournalEntry,
36
- } from '../journal-core';
37
- import { EmptyState, LoadingState, SectionCard, StatTile } from '../journal-ui';
38
-
39
- export default function StatsPage() {
40
- const { entries, loading, error } = useJournalEntries();
41
- const navigation = useNotisNavigation();
42
-
43
- const chrono = useMemo(() => [...entries].reverse(), [entries]); // oldest -> newest
44
- const recent = useMemo(() => chrono.slice(-21), [chrono]); // last ~3 weeks for trends
45
-
46
- const streak = useMemo(() => computeStreak(entries), [entries]);
47
- const totals = useMemo(
48
- () => ({
49
- morningMood: average(entries.map((e) => e.morningMood)),
50
- dayMood: average(entries.map((e) => e.dayMood)),
51
- energy: average(entries.map((e) => e.energy)),
52
- motivation: average(entries.map((e) => e.motivation)),
53
- }),
54
- [entries],
55
- );
56
- const lift = useMemo(() => moodLift(entries), [entries]);
57
- const consistency = useMemo(() => ritualConsistency(entries, 30), [entries]);
58
- const words = useMemo(() => topMoodWords(entries), [entries]);
59
- const gratitudes = useMemo(() => recentGratitudes(entries, 12), [entries]);
60
-
61
- if (loading && !entries.length) {
62
- return (
63
- <div data-store-screenshot="stats" className="mx-auto w-full max-w-6xl px-5 py-6 sm:px-8">
64
- <LoadingState label="Reading back through your days…" />
65
- </div>
66
- );
67
- }
68
-
69
- return (
70
- <div data-store-screenshot="stats" className="mx-auto w-full max-w-6xl px-5 py-6 sm:px-8">
71
- <header className="flex flex-wrap items-end justify-between gap-4">
72
- <div>
73
- <div className="flex items-center gap-2 text-xs font-medium text-muted-foreground">
74
- <ChartLineUpIcon size={14} weight="bold" />
75
- 5 Minutes Journal
76
- </div>
77
- <h1 className="mt-1 text-2xl font-semibold tracking-tight">Stats</h1>
78
- <p className="mt-1 text-sm text-muted-foreground">
79
- What {entries.length} {entries.length === 1 ? 'day' : 'days'} of checking in with
80
- yourself add up to.
81
- </p>
82
- </div>
83
- <Button variant="outline" onClick={() => navigation.toRoute('/')} className="gap-1.5">
84
- <NotebookIcon size={16} weight="bold" />
85
- Back to journal
86
- </Button>
87
- </header>
88
-
89
- {error ? (
90
- <p className="mt-6 rounded-lg bg-destructive/10 px-3 py-2 text-sm text-destructive">{error}</p>
91
- ) : null}
92
-
93
- {entries.length === 0 ? (
94
- <div className="mt-8">
95
- <EmptyState
96
- icon={ChartLineUpIcon}
97
- title="No patterns to show yet"
98
- description="After a few mornings and evenings with Notis, your moods, energy, and gratitude will start telling a story here."
99
- action={
100
- <Button onClick={() => navigation.toRoute('/')} className="gap-1.5">
101
- <NotebookIcon size={16} weight="bold" />
102
- Open journal
103
- </Button>
104
- }
105
- />
106
- </div>
107
- ) : (
108
- <>
109
- <div className="mt-5 grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6">
110
- <StatTile
111
- label="Streak"
112
- value={streak}
113
- suffix={streak === 1 ? 'day' : 'days'}
114
- icon={FlameIcon}
115
- accent="#f59e0b"
116
- />
117
- <StatTile label="Days journaled" value={entries.length} icon={NotebookIcon} />
118
- <StatTile
119
- label="Waking mood"
120
- value={totals.morningMood ?? '—'}
121
- suffix={totals.morningMood != null ? '/ 7' : undefined}
122
- icon={SunHorizonIcon}
123
- accent={MORNING_MOOD_COLOR}
124
- hint={moodStep(totals.morningMood)?.label}
125
- />
126
- <StatTile
127
- label="Day mood"
128
- value={totals.dayMood ?? '—'}
129
- suffix={totals.dayMood != null ? '/ 7' : undefined}
130
- icon={MoonStarsIcon}
131
- accent={DAY_MOOD_COLOR}
132
- hint={moodStep(totals.dayMood)?.label}
133
- />
134
- <StatTile
135
- label="Energy"
136
- value={totals.energy ?? '—'}
137
- suffix={totals.energy != null ? '/ 10' : undefined}
138
- icon={LightningIcon}
139
- accent={ENERGY_COLOR}
140
- />
141
- <StatTile
142
- label="Motivation"
143
- value={totals.motivation ?? '—'}
144
- suffix={totals.motivation != null ? '/ 10' : undefined}
145
- icon={RocketLaunchIcon}
146
- accent={MOTIVATION_COLOR}
147
- />
148
- </div>
149
-
150
- <div className="mt-6 grid grid-cols-1 gap-5 lg:grid-cols-2">
151
- <SectionCard
152
- title="Mood, morning to evening"
153
- description="How you woke up next to how the day ended, on the pleasant scale"
154
- icon={SunHorizonIcon}
155
- className="lg:col-span-2"
156
- >
157
- <MoodTrend entries={recent} />
158
- <div className="mt-3 flex items-center gap-4 text-[11px] text-muted-foreground">
159
- <span className="inline-flex items-center gap-1.5">
160
- <span className="h-2 w-2 rounded-sm bg-foreground/70" />
161
- Waking mood
162
- </span>
163
- <span className="inline-flex items-center gap-1.5">
164
- <span className="h-2 w-2 rounded-sm border-[1.5px] border-foreground/70 bg-foreground/20" />
165
- Whole-day mood
166
- </span>
167
- <span>Bars take the color of the mood itself.</span>
168
- {lift != null ? (
169
- <span className="ml-auto">
170
- {lift > 0
171
- ? `Your days tend to end ${lift} above where they start.`
172
- : lift < 0
173
- ? `Your days tend to end ${Math.abs(lift)} below where they start.`
174
- : 'Your days tend to end where they start.'}
175
- </span>
176
- ) : (
177
- <span className="ml-auto">Scale 1–7</span>
178
- )}
179
- </div>
180
- </SectionCard>
181
-
182
- <SectionCard
183
- title="Energy & motivation"
184
- description="Morning levels day by day"
185
- icon={LightningIcon}
186
- className="lg:col-span-2"
187
- >
188
- <LevelTrend entries={recent} />
189
- <div className="mt-3 flex items-center gap-4 text-[11px] text-muted-foreground">
190
- <LegendSwatch color={ENERGY_COLOR} label="Energy" />
191
- <LegendSwatch color={MOTIVATION_COLOR} label="Motivation" />
192
- <span className="ml-auto">Scale 1–10</span>
193
- </div>
194
- </SectionCard>
195
-
196
- <SectionCard
197
- title="How your days feel"
198
- description="Where the whole-day mood lands on the scale"
199
- icon={MoonStarsIcon}
200
- >
201
- <MoodDistribution entries={entries} pick={(e) => e.dayMood} />
202
- </SectionCard>
203
-
204
- <SectionCard
205
- title="How you wake up"
206
- description="Where the waking mood lands on the scale"
207
- icon={SunHorizonIcon}
208
- >
209
- <MoodDistribution entries={entries} pick={(e) => e.morningMood} />
210
- </SectionCard>
211
-
212
- <SectionCard
213
- title="The ritual"
214
- description="Check-ins completed over the last 30 days"
215
- icon={FlameIcon}
216
- >
217
- <div className="space-y-4 pt-1">
218
- <ConsistencyRow
219
- icon={SunHorizonIcon}
220
- label="Mornings"
221
- fraction={consistency.morning}
222
- color={MORNING_MOOD_COLOR}
223
- />
224
- <ConsistencyRow
225
- icon={MoonStarsIcon}
226
- label="Evenings"
227
- fraction={consistency.evening}
228
- color={DAY_MOOD_COLOR}
229
- />
230
- </div>
231
- </SectionCard>
232
-
233
- <SectionCard
234
- title="Words you reach for"
235
- description="The adjectives you use most for your moods"
236
- icon={ChartLineUpIcon}
237
- >
238
- {words.length ? (
239
- <div className="flex flex-wrap gap-2">
240
- {words.map(({ word, count }) => (
241
- <span
242
- key={word}
243
- className="inline-flex items-center gap-1.5 rounded-full bg-muted px-3 py-1 text-xs font-medium capitalize"
244
- >
245
- {word}
246
- <span className="text-[10px] tabular-nums text-muted-foreground">{count}</span>
247
- </span>
248
- ))}
249
- </div>
250
- ) : (
251
- <NoData label="No mood words yet" />
252
- )}
253
- </SectionCard>
254
-
255
- <SectionCard
256
- title="Gratitude wall"
257
- description="The latest things you said thank you for"
258
- icon={SparkleIcon}
259
- className="lg:col-span-2"
260
- >
261
- {gratitudes.length ? (
262
- <div className="grid grid-cols-1 gap-2 sm:grid-cols-2 lg:grid-cols-3">
263
- {gratitudes.map((item, index) => (
264
- <div
265
- key={`${item.text}-${index}`}
266
- className="rounded-xl border border-border/70 bg-muted/30 px-3.5 py-3"
267
- >
268
- <p className="text-sm leading-snug">{item.text}</p>
269
- <p className="mt-1.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground">
270
- {formatDay(item.date)}
271
- </p>
272
- </div>
273
- ))}
274
- </div>
275
- ) : (
276
- <NoData label="Your gratitudes will collect here" />
277
- )}
278
- </SectionCard>
279
- </div>
280
- </>
281
- )}
282
- </div>
283
- );
284
- }
285
-
286
- // ---------------------------------------------------------------------------
287
- // Charts
288
- // ---------------------------------------------------------------------------
289
-
290
- function MoodTrend({ entries }: { entries: JournalEntry[] }) {
291
- if (!entries.length) return <NoData />;
292
- const summary = entries
293
- .map(
294
- (e) =>
295
- `${formatDay(e.date)}: waking ${e.morningMood ?? 'not logged'}, day ${e.dayMood ?? 'not logged'}`,
296
- )
297
- .join('; ');
298
- return (
299
- <div
300
- className="flex items-end gap-1.5 overflow-x-auto pb-1"
301
- style={{ height: 168 }}
302
- role="img"
303
- aria-label={`Waking and whole-day mood by day, on a 1 to 7 scale. ${summary}`}
304
- >
305
- {entries.map((entry) => (
306
- <div key={entry.id} className="flex min-w-[26px] flex-1 flex-col items-center gap-1.5">
307
- <div className="flex h-[128px] w-full items-end justify-center gap-1">
308
- <Bar
309
- fraction={(entry.morningMood ?? 0) / 7}
310
- color={moodStep(entry.morningMood)?.color ?? MORNING_MOOD_COLOR}
311
- title={`Waking ${entry.morningMood ?? '—'}`}
312
- />
313
- <Bar
314
- fraction={(entry.dayMood ?? 0) / 7}
315
- color={moodStep(entry.dayMood)?.color ?? DAY_MOOD_COLOR}
316
- title={`Day ${entry.dayMood ?? '—'}`}
317
- hollow
318
- />
319
- </div>
320
- <span className="text-[9px] text-muted-foreground">{shortDay(entry.date)}</span>
321
- </div>
322
- ))}
323
- </div>
324
- );
325
- }
326
-
327
- function LevelTrend({ entries }: { entries: JournalEntry[] }) {
328
- if (!entries.length) return <NoData />;
329
- const summary = entries
330
- .map(
331
- (e) =>
332
- `${formatDay(e.date)}: energy ${e.energy ?? 'not logged'}, motivation ${e.motivation ?? 'not logged'}`,
333
- )
334
- .join('; ');
335
- return (
336
- <div
337
- className="flex items-end gap-1.5 overflow-x-auto pb-1"
338
- style={{ height: 168 }}
339
- role="img"
340
- aria-label={`Energy and motivation by day. ${summary}`}
341
- >
342
- {entries.map((entry) => (
343
- <div key={entry.id} className="flex min-w-[26px] flex-1 flex-col items-center gap-1.5">
344
- <div className="flex h-[128px] w-full items-end justify-center gap-1">
345
- <Bar fraction={(entry.energy ?? 0) / 10} color={ENERGY_COLOR} title={`Energy ${entry.energy ?? '—'}`} />
346
- <Bar
347
- fraction={(entry.motivation ?? 0) / 10}
348
- color={MOTIVATION_COLOR}
349
- title={`Motivation ${entry.motivation ?? '—'}`}
350
- />
351
- </div>
352
- <span className="text-[9px] text-muted-foreground">{shortDay(entry.date)}</span>
353
- </div>
354
- ))}
355
- </div>
356
- );
357
- }
358
-
359
- function Bar({
360
- fraction,
361
- color,
362
- title,
363
- hollow,
364
- }: {
365
- fraction: number;
366
- color: string;
367
- title: string;
368
- hollow?: boolean;
369
- }) {
370
- const pct = Math.max(0, Math.min(1, fraction)) * 100;
371
- return (
372
- <div className="flex h-full w-2.5 items-end" title={title}>
373
- <div
374
- className="w-full rounded-t-sm transition-all"
375
- style={{
376
- height: `${Math.max(pct, fraction > 0 ? 4 : 0)}%`,
377
- backgroundColor: hollow ? `${color}55` : color,
378
- boxShadow: hollow ? `inset 0 0 0 1.5px ${color}` : undefined,
379
- }}
380
- />
381
- </div>
382
- );
383
- }
384
-
385
- function MoodDistribution({
386
- entries,
387
- pick,
388
- }: {
389
- entries: JournalEntry[];
390
- pick: (entry: JournalEntry) => number | null;
391
- }) {
392
- const counts = new Map<number, number>();
393
- let total = 0;
394
- for (const entry of entries) {
395
- const value = pick(entry);
396
- const step = moodStep(value);
397
- if (!step) continue;
398
- counts.set(step.value, (counts.get(step.value) ?? 0) + 1);
399
- total += 1;
400
- }
401
- if (!total) return <NoData />;
402
- const max = Math.max(1, ...counts.values());
403
- // Best mood first, mirroring how the scale reads left to right.
404
- const rows = [...MOOD_SCALE].reverse();
405
- return (
406
- <div className="space-y-2.5">
407
- {rows.map((step) => {
408
- const count = counts.get(step.value) ?? 0;
409
- const pct = Math.round((count / total) * 100);
410
- return (
411
- <div
412
- key={step.value}
413
- className="flex items-center gap-3"
414
- aria-label={`${step.label}: ${count} days, ${pct} percent`}
415
- >
416
- <span className="w-32 shrink-0 truncate text-xs font-medium">{step.label}</span>
417
- <div className="h-2.5 flex-1 overflow-hidden rounded-full bg-muted">
418
- <div
419
- className="h-full rounded-full transition-all"
420
- style={{ width: `${(count / max) * 100}%`, backgroundColor: step.color }}
421
- />
422
- </div>
423
- <span className="w-14 shrink-0 text-right text-[11px] tabular-nums text-muted-foreground">
424
- {count} · {pct}%
425
- </span>
426
- </div>
427
- );
428
- })}
429
- </div>
430
- );
431
- }
432
-
433
- function ConsistencyRow({
434
- icon: IconCmp,
435
- label,
436
- fraction,
437
- color,
438
- }: {
439
- icon: typeof SunHorizonIcon;
440
- label: string;
441
- fraction: number;
442
- color: string;
443
- }) {
444
- const pct = Math.round(Math.max(0, Math.min(1, fraction)) * 100);
445
- return (
446
- <div className="flex items-center gap-3">
447
- <span className="flex w-24 shrink-0 items-center gap-1.5 text-xs font-medium text-muted-foreground">
448
- <IconCmp size={14} weight="bold" style={{ color }} />
449
- {label}
450
- </span>
451
- <div className="h-2.5 flex-1 overflow-hidden rounded-full bg-muted">
452
- <div
453
- className="h-full rounded-full transition-all"
454
- style={{ width: `${pct}%`, backgroundColor: color }}
455
- />
456
- </div>
457
- <span className="w-10 shrink-0 text-right text-xs font-semibold tabular-nums">{pct}%</span>
458
- </div>
459
- );
460
- }
461
-
462
- function LegendSwatch({ color, label }: { color: string; label: string }) {
463
- return (
464
- <span className="inline-flex items-center gap-1.5">
465
- <span className="h-2 w-2 rounded-sm" style={{ backgroundColor: color }} />
466
- {label}
467
- </span>
468
- );
469
- }
470
-
471
- function NoData({ label = 'Not enough data yet' }: { label?: string }) {
472
- return (
473
- <div className={cn('flex items-center justify-center py-10 text-xs text-muted-foreground')}>
474
- {label}
475
- </div>
476
- );
477
- }
478
-
479
- // ---------------------------------------------------------------------------
480
- // Aggregation
481
- // ---------------------------------------------------------------------------
482
-
483
- /** Average change from waking mood to whole-day mood, when both were logged. */
484
- function moodLift(entries: JournalEntry[]): number | null {
485
- const deltas = entries
486
- .filter((e) => e.morningMood != null && e.dayMood != null)
487
- .map((e) => (e.dayMood as number) - (e.morningMood as number));
488
- if (!deltas.length) return null;
489
- return round1(deltas.reduce((sum, d) => sum + d, 0) / deltas.length);
490
- }
491
-
492
- /** Fraction of the last `windowDays` days with complete morning / evening rituals. */
493
- function ritualConsistency(
494
- entries: JournalEntry[],
495
- windowDays: number,
496
- ): { morning: number; evening: number } {
497
- const cutoff = new Date();
498
- cutoff.setDate(cutoff.getDate() - windowDays);
499
- const cutoffKey = dayKey(cutoff.toISOString()) ?? '';
500
- const recent = entries.filter((e) => (dayKey(e.date) ?? '') >= cutoffKey);
501
- if (!recent.length) return { morning: 0, evening: 0 };
502
- return {
503
- morning: Math.min(1, recent.filter(morningComplete).length / windowDays),
504
- evening: Math.min(1, recent.filter(eveningComplete).length / windowDays),
505
- };
506
- }
507
-
508
- function shortDay(value: string | null): string {
509
- const key = dayKey(value);
510
- if (!key) return '';
511
- const [, m, d] = key.split('-');
512
- return `${Number(m)}/${Number(d)}`;
513
- }