zz-meridian 0.15.0 → 0.16.0

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 (458) hide show
  1. package/README.md +4 -3
  2. package/dist/adopt.js +2 -0
  3. package/dist/migrations.js +256 -0
  4. package/dist/ownership.js +2 -2
  5. package/package.json +1 -1
  6. package/payload/CHANGELOG.md +257 -0
  7. package/payload/CONTRIBUTING.md +2 -2
  8. package/payload/app/(dashboard)/(home)/README.md +129 -0
  9. package/payload/app/(dashboard)/(home)/loading.tsx +75 -0
  10. package/payload/app/(dashboard)/(home)/page.tsx +94 -0
  11. package/payload/app/(dashboard)/business/README.md +124 -0
  12. package/payload/app/(dashboard)/business/loading.tsx +81 -0
  13. package/payload/app/(dashboard)/business/page.tsx +86 -0
  14. package/payload/app/(dashboard)/customers/README.md +29 -9
  15. package/payload/app/(dashboard)/customers/[id]/README.md +98 -0
  16. package/payload/app/(dashboard)/customers/[id]/loading.tsx +34 -0
  17. package/payload/app/(dashboard)/customers/[id]/page.tsx +43 -0
  18. package/payload/app/(dashboard)/customers/loading.tsx +2 -1
  19. package/payload/app/(dashboard)/customers/page.tsx +9 -5
  20. package/payload/app/(dashboard)/engineering/README.md +136 -0
  21. package/payload/app/(dashboard)/engineering/loading.tsx +63 -0
  22. package/payload/app/(dashboard)/engineering/page.tsx +64 -0
  23. package/payload/app/(dashboard)/error.tsx +5 -5
  24. package/payload/app/(dashboard)/keys/README.md +20 -7
  25. package/payload/app/(dashboard)/keys/loading.tsx +2 -1
  26. package/payload/app/(dashboard)/keys/page.tsx +9 -8
  27. package/payload/app/(dashboard)/layout.tsx +9 -4
  28. package/payload/app/(dashboard)/members/README.md +19 -6
  29. package/payload/app/(dashboard)/members/loading.tsx +2 -1
  30. package/payload/app/(dashboard)/members/page.tsx +4 -2
  31. package/payload/app/(dashboard)/not-found.tsx +2 -1
  32. package/payload/app/(dashboard)/operations-tickets/README.md +21 -9
  33. package/payload/app/(dashboard)/operations-tickets/loading.tsx +3 -2
  34. package/payload/app/(dashboard)/operations-tickets/page.tsx +4 -4
  35. package/payload/app/(dashboard)/releases/README.md +15 -2
  36. package/payload/app/(dashboard)/releases/loading.tsx +2 -1
  37. package/payload/app/(dashboard)/releases/page.tsx +4 -2
  38. package/payload/app/(dashboard)/requests/README.md +20 -7
  39. package/payload/app/(dashboard)/requests/[id]/README.md +19 -5
  40. package/payload/app/(dashboard)/requests/[id]/actions.ts +4 -2
  41. package/payload/app/(dashboard)/requests/[id]/loading.tsx +2 -1
  42. package/payload/app/(dashboard)/requests/[id]/page.tsx +25 -12
  43. package/payload/app/(dashboard)/requests/loading.tsx +2 -1
  44. package/payload/app/(dashboard)/requests/page.tsx +6 -4
  45. package/payload/app/(dashboard)/services/README.md +113 -0
  46. package/payload/app/(dashboard)/services/loading.tsx +44 -0
  47. package/payload/app/(dashboard)/services/page.tsx +54 -0
  48. package/payload/app/(dashboard)/settings/README.md +2 -1
  49. package/payload/app/(dashboard)/settings/loading.tsx +2 -1
  50. package/payload/app/(dashboard)/settings/page.tsx +4 -2
  51. package/payload/app/(dashboard)/tests/README.md +17 -4
  52. package/payload/app/(dashboard)/tests/loading.tsx +3 -2
  53. package/payload/app/(dashboard)/tests/page.tsx +5 -3
  54. package/payload/app/(dashboard)/usage/README.md +131 -0
  55. package/payload/app/(dashboard)/usage/loading.tsx +52 -0
  56. package/payload/app/(dashboard)/usage/page.tsx +94 -0
  57. package/payload/app/api/assistant/route.ts +123 -11
  58. package/payload/app/embed/home/README.md +35 -0
  59. package/payload/app/embed/home/page.tsx +27 -0
  60. package/payload/app/embed/home/view.tsx +40 -0
  61. package/payload/app/embed/now/README.md +44 -0
  62. package/payload/app/embed/now/page.tsx +23 -0
  63. package/payload/app/embed/now/view.tsx +49 -0
  64. package/payload/app/embed/proposal/README.md +2 -2
  65. package/payload/app/embed/requests/README.md +1 -1
  66. package/payload/app/embed/requests/view.tsx +2 -2
  67. package/payload/app/layout.tsx +1 -1
  68. package/payload/app/not-found/README.md +4 -3
  69. package/payload/app/not-found.tsx +10 -4
  70. package/payload/app/sign-in/README.md +5 -5
  71. package/payload/app/sign-in/page.tsx +3 -3
  72. package/payload/app/system/(atlas)/[section]/[id]/page.tsx +2 -2
  73. package/payload/app/system/(atlas)/page.tsx +1 -1
  74. package/payload/app/system/states/loading/page.tsx +2 -2
  75. package/payload/decisions/0012-roles-and-feature-access.md +1 -1
  76. package/payload/docs/agents.md +70 -8
  77. package/payload/docs/assistant.md +26 -12
  78. package/payload/docs/atlas-scenario-coverage.md +117 -96
  79. package/payload/docs/benchmark.md +44 -24
  80. package/payload/docs/data-display.md +96 -10
  81. package/payload/docs/distribution.md +19 -16
  82. package/payload/docs/product-workspaces.md +40 -31
  83. package/payload/docs/start-a-dashboard.md +10 -9
  84. package/payload/docs/surfaces.md +35 -28
  85. package/payload/docs/voice.md +5 -4
  86. package/payload/journeys/workspaces.ts +375 -268
  87. package/payload/package.json +1 -1
  88. package/payload/scripts/ask.ts +397 -0
  89. package/payload/scripts/assistant.ts +168 -52
  90. package/payload/scripts/brand.ts +4 -3
  91. package/payload/scripts/check.ts +28 -4
  92. package/payload/scripts/contrast.ts +18 -7
  93. package/payload/scripts/fake-llm.ts +81 -19
  94. package/payload/scripts/lib/contrast-pairs.ts +10 -0
  95. package/payload/scripts/lib/routes.ts +154 -0
  96. package/payload/scripts/lib/sample.ts +23 -3
  97. package/payload/scripts/navigate.ts +134 -33
  98. package/payload/scripts/perf.ts +18 -5
  99. package/payload/scripts/shot.ts +8 -1
  100. package/payload/scripts/verify.baseline.json +29 -26
  101. package/payload/scripts/verify.config.ts +37 -14
  102. package/payload/scripts/verify.ts +12 -5
  103. package/payload/skills/zz-meridian/SKILL.md +4 -2
  104. package/payload/skills/zz-meridian/references/agents.md +57 -6
  105. package/payload/skills/zz-meridian/references/cache.md +81 -17
  106. package/payload/skills/zz-meridian/references/customize.md +345 -47
  107. package/payload/skills/zz-meridian/references/existing-project.md +14 -11
  108. package/payload/skills/zz-meridian/references/live.md +11 -4
  109. package/payload/skills/zz-meridian/references/ownership.md +1 -1
  110. package/payload/skills/zz-meridian/references/update.md +17 -9
  111. package/payload/skills/zz-meridian/references/validation.md +40 -7
  112. package/payload/skills/zz-meridian/references/voice.md +5 -4
  113. package/payload/src/app.config.ts +45 -14
  114. package/payload/src/components/base/icons/preview.tsx +2 -2
  115. package/payload/src/components/base/shell/README.md +56 -9
  116. package/payload/src/components/base/shell/index.tsx +122 -23
  117. package/payload/src/components/base/shell/preview.tsx +31 -3
  118. package/payload/src/components/base/surface/README.md +2 -2
  119. package/payload/src/components/base/surface/preview.tsx +4 -3
  120. package/payload/src/components/base/text-roles/README.md +2 -2
  121. package/payload/src/components/base/text-roles/index.tsx +1 -1
  122. package/payload/src/components/base/text-roles/preview.tsx +2 -2
  123. package/payload/src/components/charts/bar-list/README.md +11 -4
  124. package/payload/src/components/charts/bar-list/index.tsx +13 -1
  125. package/payload/src/components/charts/bar-list/preview.tsx +23 -5
  126. package/payload/src/components/charts/column-chart/README.md +127 -17
  127. package/payload/src/components/charts/column-chart/index.tsx +299 -59
  128. package/payload/src/components/charts/column-chart/preview.tsx +185 -23
  129. package/payload/src/components/charts/composition-bar/README.md +3 -2
  130. package/payload/src/components/charts/composition-bar/index.tsx +13 -7
  131. package/payload/src/components/charts/composition-bar/preview.tsx +6 -1
  132. package/payload/src/components/charts/heatmap/README.md +70 -21
  133. package/payload/src/components/charts/heatmap/index.tsx +334 -70
  134. package/payload/src/components/charts/heatmap/preview.tsx +123 -3
  135. package/payload/src/components/charts/meridian/README.md +12 -9
  136. package/payload/src/components/charts/meridian/index.tsx +8 -2
  137. package/payload/src/components/charts/meridian/preview.tsx +3 -3
  138. package/payload/src/components/charts/readout.tsx +48 -0
  139. package/payload/src/components/charts/scale.ts +18 -4
  140. package/payload/src/components/charts/sparkline/README.md +18 -7
  141. package/payload/src/components/charts/sparkline/index.tsx +24 -12
  142. package/payload/src/components/charts/sparkline/preview.tsx +16 -5
  143. package/payload/src/components/charts/trend-chart/README.md +25 -12
  144. package/payload/src/components/charts/trend-chart/index.tsx +106 -51
  145. package/payload/src/components/charts/trend-chart/preview.tsx +33 -5
  146. package/payload/src/components/charts/uptime-bars/README.md +7 -7
  147. package/payload/src/components/charts/uptime-bars/index.tsx +17 -6
  148. package/payload/src/components/charts/uptime-bars/preview.tsx +8 -0
  149. package/payload/src/components/patterns/ask-about/README.md +6 -2
  150. package/payload/src/components/patterns/ask-about/index.tsx +2 -3
  151. package/payload/src/components/patterns/assistant/README.md +4 -2
  152. package/payload/src/components/patterns/assistant/index.tsx +44 -22
  153. package/payload/src/components/patterns/assistant/page-text.ts +21 -0
  154. package/payload/src/components/patterns/assistant/preview.tsx +1 -1
  155. package/payload/src/components/patterns/assistant/scope.tsx +28 -0
  156. package/payload/src/components/patterns/assistant/thread.ts +65 -13
  157. package/payload/src/components/patterns/data-table/index.tsx +2 -2
  158. package/payload/src/components/patterns/embed-frame/README.md +2 -2
  159. package/payload/src/components/patterns/embed-frame/preview.tsx +5 -4
  160. package/payload/src/components/patterns/export-button/README.md +2 -2
  161. package/payload/src/components/patterns/export-button/preview.tsx +6 -5
  162. package/payload/src/components/patterns/featured-metric/README.md +137 -20
  163. package/payload/src/components/patterns/featured-metric/index.tsx +138 -46
  164. package/payload/src/components/patterns/featured-metric/preview.tsx +196 -32
  165. package/payload/src/components/patterns/form-section/README.md +14 -10
  166. package/payload/src/components/patterns/form-section/index.tsx +16 -7
  167. package/payload/src/components/patterns/form-section/preview.tsx +11 -2
  168. package/payload/src/components/patterns/incident-card/README.md +31 -14
  169. package/payload/src/components/patterns/incident-card/index.tsx +29 -7
  170. package/payload/src/components/patterns/incident-card/preview.tsx +25 -7
  171. package/payload/src/components/patterns/metric-tile/README.md +78 -13
  172. package/payload/src/components/patterns/metric-tile/index.tsx +100 -24
  173. package/payload/src/components/patterns/metric-tile/preview.tsx +124 -18
  174. package/payload/src/components/patterns/page-loading/README.md +37 -6
  175. package/payload/src/components/patterns/page-loading/index.tsx +72 -4
  176. package/payload/src/components/patterns/page-loading/preview.tsx +9 -1
  177. package/payload/src/components/patterns/period-select/README.md +2 -2
  178. package/payload/src/components/patterns/proposal/README.md +1 -1
  179. package/payload/src/components/patterns/proposal/index.tsx +2 -2
  180. package/payload/src/components/patterns/rail/README.md +5 -5
  181. package/payload/src/components/patterns/rail/index.tsx +15 -3
  182. package/payload/src/components/patterns/rail/preview.tsx +4 -4
  183. package/payload/src/components/patterns/shell-tools/README.md +1 -1
  184. package/payload/src/components/patterns/shell-tools/preview.tsx +1 -1
  185. package/payload/src/components/patterns/status-list/README.md +36 -14
  186. package/payload/src/components/patterns/status-list/index.tsx +29 -2
  187. package/payload/src/components/patterns/status-list/preview.tsx +15 -3
  188. package/payload/src/components/templates/records/README.md +2 -2
  189. package/payload/src/components/templates/records/preview.tsx +2 -5
  190. package/payload/src/components/ui/banner/index.tsx +1 -1
  191. package/payload/src/components/ui/card/README.md +7 -2
  192. package/payload/src/components/ui/card/index.tsx +4 -1
  193. package/payload/src/components/ui/card/preview.tsx +12 -0
  194. package/payload/src/components/ui/icon-button/preview.tsx +1 -1
  195. package/payload/src/components/ui/key-value/preview.tsx +2 -1
  196. package/payload/src/components/ui/segmented/README.md +3 -3
  197. package/payload/src/components/ui/segmented/index.tsx +2 -2
  198. package/payload/src/components/ui/table/index.tsx +1 -1
  199. package/payload/src/components/ui/tabs/preview.tsx +2 -2
  200. package/payload/src/data/README.md +27 -8
  201. package/payload/src/data/access.ts +50 -8
  202. package/payload/src/data/alerts.ts +21 -24
  203. package/payload/src/data/collections.ts +123 -44
  204. package/payload/src/data/engineering.ts +1 -1
  205. package/payload/src/data/features.ts +24 -20
  206. package/payload/src/data/main.ts +3 -31
  207. package/payload/src/data/member-mutations.ts +6 -5
  208. package/payload/src/data/metrics.ts +59 -21
  209. package/payload/src/data/read.ts +23 -5
  210. package/payload/src/data/refusal.ts +20 -0
  211. package/payload/src/data/requests.ts +48 -20
  212. package/payload/src/data/roles.ts +4 -4
  213. package/payload/src/data/sample.ts +9 -5
  214. package/payload/src/data/sign-in.ts +11 -0
  215. package/payload/src/data/ticket-mutations.ts +23 -10
  216. package/payload/src/data/{analytics.ts → usage.ts} +8 -9
  217. package/payload/src/lib/agent-guidance.ts +4 -3
  218. package/payload/src/lib/assistant/prompt.ts +65 -5
  219. package/payload/src/lib/assistant/respond.ts +21 -6
  220. package/payload/src/lib/assistant/scoped.ts +15 -32
  221. package/payload/src/lib/assistant/tools.ts +50 -14
  222. package/payload/src/lib/collection.ts +184 -22
  223. package/payload/src/lib/explore.ts +456 -0
  224. package/payload/src/lib/facts.ts +172 -0
  225. package/payload/src/lib/format-date.ts +26 -0
  226. package/payload/src/lib/format.ts +49 -22
  227. package/payload/src/lib/insight.ts +0 -56
  228. package/payload/src/lib/shared-context.ts +22 -7
  229. package/payload/src/styles/tokens.css +2 -2
  230. package/payload/src/system/atlas-shell.tsx +18 -7
  231. package/payload/src/system/content.ts +8 -5
  232. package/payload/src/system/fixtures/company.ts +410 -0
  233. package/payload/src/system/fixtures/sample-engineering.ts +15 -10
  234. package/payload/src/system/fixtures/sample-ops.ts +12 -16
  235. package/payload/src/system/fixtures/sample-records.ts +11 -21
  236. package/payload/src/system/fixtures/sample.ts +109 -127
  237. package/payload/src/system/hero.tsx +1 -1
  238. package/payload/src/system/page-stage.tsx +1 -1
  239. package/payload/src/system/sample-cells.tsx +13 -5
  240. package/payload/src/system/specimen.tsx +10 -2
  241. package/payload/src/system/strata.tsx +1 -1
  242. package/payload/src/system/token-view.tsx +2 -2
  243. package/payload/src/views/ask-period.tsx +15 -0
  244. package/payload/src/views/customer-context.ts +144 -0
  245. package/payload/src/views/customer-explore.ts +48 -0
  246. package/payload/src/views/customer.tsx +217 -0
  247. package/payload/src/views/customers-context.ts +75 -26
  248. package/payload/src/views/customers-explore.ts +42 -0
  249. package/payload/src/views/customers.tsx +52 -43
  250. package/payload/src/views/fact-insight.ts +56 -0
  251. package/payload/src/views/home-context.ts +250 -0
  252. package/payload/src/views/home-explore.ts +77 -0
  253. package/payload/src/views/home-parts.ts +336 -0
  254. package/payload/src/views/home.tsx +366 -0
  255. package/payload/src/views/keys-context.ts +6 -3
  256. package/payload/src/views/keys-explore.ts +27 -0
  257. package/payload/src/views/keys.tsx +24 -17
  258. package/payload/src/views/main-summary.ts +3 -33
  259. package/payload/src/views/members-context.ts +13 -6
  260. package/payload/src/views/members-explore.ts +31 -0
  261. package/payload/src/views/members.tsx +19 -31
  262. package/payload/src/views/missing-page.tsx +8 -4
  263. package/payload/src/views/no-access.tsx +1 -10
  264. package/payload/src/views/not-found-address.tsx +6 -5
  265. package/payload/src/views/not-found.tsx +9 -4
  266. package/payload/src/views/now-context.ts +291 -0
  267. package/payload/src/views/now-explore.ts +92 -0
  268. package/payload/src/views/now-parts.ts +238 -0
  269. package/payload/src/views/now.tsx +427 -0
  270. package/payload/src/views/period-actions.tsx +29 -0
  271. package/payload/src/views/releases-context.ts +1 -1
  272. package/payload/src/views/releases-explore.ts +57 -0
  273. package/payload/src/views/releases.tsx +31 -25
  274. package/payload/src/views/request-context.ts +8 -5
  275. package/payload/src/views/request-explore.ts +30 -0
  276. package/payload/src/views/request.tsx +43 -33
  277. package/payload/src/views/requests-context.ts +2 -3
  278. package/payload/src/views/requests-explore.ts +50 -0
  279. package/payload/src/views/requests.tsx +39 -36
  280. package/payload/src/views/revenue-context.ts +242 -0
  281. package/payload/src/views/revenue-explore.ts +48 -0
  282. package/payload/src/views/revenue-parts.ts +219 -0
  283. package/payload/src/views/revenue.tsx +351 -0
  284. package/payload/src/views/sample-footer.tsx +2 -2
  285. package/payload/src/views/services-context.ts +179 -0
  286. package/payload/src/views/services-explore.ts +44 -0
  287. package/payload/src/views/services.tsx +129 -0
  288. package/payload/src/views/settings.tsx +5 -5
  289. package/payload/src/views/tests-context.ts +3 -3
  290. package/payload/src/views/tests-explore.ts +46 -0
  291. package/payload/src/views/tests.tsx +32 -26
  292. package/payload/src/views/tickets-context.ts +3 -3
  293. package/payload/src/views/tickets-explore.ts +61 -0
  294. package/payload/src/views/tickets.tsx +39 -35
  295. package/payload/src/views/tools.ts +203 -52
  296. package/payload/src/views/unread.tsx +25 -0
  297. package/payload/src/views/usage-context.ts +163 -0
  298. package/payload/src/views/usage-explore.ts +66 -0
  299. package/payload/src/views/usage-parts.ts +126 -0
  300. package/payload/src/views/usage.tsx +220 -0
  301. package/payload/src/views/workspace-chrome.tsx +3 -2
  302. package/payload/tests/action-needs.test.tsx +12 -11
  303. package/payload/tests/agent-page-spec.test.ts +1 -1
  304. package/payload/tests/assistant-access.test.ts +22 -14
  305. package/payload/tests/assistant-brief.test.ts +1 -1
  306. package/payload/tests/assistant-errors.test.ts +1 -1
  307. package/payload/tests/assistant-explore-tool.test.ts +121 -0
  308. package/payload/tests/assistant-page-text.test.tsx +73 -0
  309. package/payload/tests/assistant-panel.test.tsx +1 -1
  310. package/payload/tests/assistant-prompt-truth.test.ts +89 -0
  311. package/payload/tests/assistant-proposal.test.tsx +2 -2
  312. package/payload/tests/assistant-respond.test.ts +3 -3
  313. package/payload/tests/assistant-route.test.ts +9 -0
  314. package/payload/tests/assistant-safety.test.ts +2 -2
  315. package/payload/tests/assistant-settings.test.tsx +2 -2
  316. package/payload/tests/assistant-stale-scope.test.tsx +93 -0
  317. package/payload/tests/assistant-thread-scope.test.tsx +121 -0
  318. package/payload/tests/assistant-thread.test.tsx +12 -10
  319. package/payload/tests/assistant-tools.test.ts +62 -21
  320. package/payload/tests/assistant-withheld.test.ts +73 -0
  321. package/payload/tests/atlas-layers.test.ts +2 -2
  322. package/payload/tests/atlas-shell-early-press.test.tsx +55 -0
  323. package/payload/tests/atlas-template-contracts.test.tsx +2 -1
  324. package/payload/tests/bar-list-links.test.tsx +38 -0
  325. package/payload/tests/bypasses.test.ts +8 -7
  326. package/payload/tests/card-header-title.test.tsx +24 -0
  327. package/payload/tests/chrome-navigation.test.tsx +2 -2
  328. package/payload/tests/client-imports.test.ts +85 -0
  329. package/payload/tests/collection-aggregate.test.ts +107 -0
  330. package/payload/tests/collection-null-group.test.ts +37 -0
  331. package/payload/tests/collection.test.ts +4 -13
  332. package/payload/tests/column-chart-crowded.test.tsx +93 -0
  333. package/payload/tests/column-chart-labels.test.tsx +77 -0
  334. package/payload/tests/column-chart-no-data.test.tsx +107 -0
  335. package/payload/tests/column-chart-readout.test.tsx +52 -0
  336. package/payload/tests/column-chart-running.test.tsx +49 -0
  337. package/payload/tests/column-chart-stacked.test.tsx +151 -0
  338. package/payload/tests/column-chart.test.tsx +153 -0
  339. package/payload/tests/composition-bar.test.tsx +33 -0
  340. package/payload/tests/console-chrome.test.tsx +2 -2
  341. package/payload/tests/counts-and-lists.test.tsx +76 -29
  342. package/payload/tests/customer-figures.test.ts +30 -10
  343. package/payload/tests/customers-payload.test.tsx +30 -0
  344. package/payload/tests/data-model.test.ts +88 -0
  345. package/payload/tests/day-in-progress.test.ts +85 -0
  346. package/payload/tests/empty-views.test.tsx +20 -14
  347. package/payload/tests/engineering-records.test.ts +4 -4
  348. package/payload/tests/engineering-workflows.test.ts +6 -6
  349. package/payload/tests/explore-contract.test.ts +43 -0
  350. package/payload/tests/explore-group-change.test.ts +65 -0
  351. package/payload/tests/explore-labels.test.ts +33 -0
  352. package/payload/tests/explore-money.test.ts +72 -0
  353. package/payload/tests/explore-narrowed-measure.test.ts +54 -0
  354. package/payload/tests/explore-none.test.ts +60 -0
  355. package/payload/tests/explore-percent.test.ts +62 -0
  356. package/payload/tests/explore-refers.test.ts +86 -0
  357. package/payload/tests/explore-runner.test.ts +224 -0
  358. package/payload/tests/fact-periods.test.ts +29 -0
  359. package/payload/tests/facts-config.test.ts +40 -0
  360. package/payload/tests/facts-engineering.test.ts +84 -0
  361. package/payload/tests/facts.test.ts +146 -0
  362. package/payload/tests/fake-llm.test.ts +98 -1
  363. package/payload/tests/feature-access.test.ts +14 -9
  364. package/payload/tests/featured-metric.test.tsx +178 -0
  365. package/payload/tests/form-section-actions.test.tsx +30 -0
  366. package/payload/tests/format-compact-boundary.test.ts +31 -0
  367. package/payload/tests/format-cost-axis.test.ts +39 -0
  368. package/payload/tests/format.test.ts +24 -7
  369. package/payload/tests/heatmap-calendar-timezone.test.tsx +29 -0
  370. package/payload/tests/heatmap-calendar.test.tsx +214 -0
  371. package/payload/tests/heatmap-hours-timezone.test.tsx +30 -0
  372. package/payload/tests/heatmap-names-column.test.tsx +30 -0
  373. package/payload/tests/heatmap-scale.test.tsx +91 -0
  374. package/payload/tests/heatmap-states.test.tsx +191 -0
  375. package/payload/tests/honest-controls.test.tsx +27 -10
  376. package/payload/tests/incident-card-hyphens.test.tsx +56 -0
  377. package/payload/tests/incident-card.test.tsx +54 -0
  378. package/payload/tests/linked-records.test.ts +126 -0
  379. package/payload/tests/loading-routes.test.tsx +28 -5
  380. package/payload/tests/member-mutations.test.ts +2 -1
  381. package/payload/tests/member-row-access.test.tsx +5 -3
  382. package/payload/tests/metric-tile-compact.test.tsx +107 -0
  383. package/payload/tests/metric-tile-note.test.tsx +28 -0
  384. package/payload/tests/metric-tile.test.tsx +100 -0
  385. package/payload/tests/navigate-menu-start.test.ts +35 -0
  386. package/payload/tests/navigate-start.test.ts +9 -9
  387. package/payload/tests/no-access.test.tsx +2 -2
  388. package/payload/tests/not-found.test.ts +2 -2
  389. package/payload/tests/page-fallbacks.test.tsx +4 -4
  390. package/payload/tests/page-frame-title.test.tsx +168 -0
  391. package/payload/tests/page-gates.test.tsx +6 -6
  392. package/payload/tests/page-loading.test.tsx +76 -2
  393. package/payload/tests/rail-menu-prefetch.test.tsx +46 -0
  394. package/payload/tests/rail-sign-out-thread.test.tsx +44 -0
  395. package/payload/tests/requests-summary-newest.test.ts +23 -0
  396. package/payload/tests/roles-context.test.ts +2 -2
  397. package/payload/tests/roles.test.ts +6 -3
  398. package/payload/tests/route-policy.test.ts +1 -1
  399. package/payload/tests/sample-company.test.ts +227 -0
  400. package/payload/tests/sample.test.ts +114 -5
  401. package/payload/tests/segmented-fit.test.tsx +22 -0
  402. package/payload/tests/settings-access.test.tsx +4 -2
  403. package/payload/tests/shared-context.test.tsx +478 -63
  404. package/payload/tests/shell-alerts.test.ts +21 -4
  405. package/payload/tests/shell-drawer-back.test.tsx +51 -0
  406. package/payload/tests/shell-early-press.test.tsx +58 -0
  407. package/payload/tests/shell-promise.test.tsx +1 -1
  408. package/payload/tests/sparkline-gaps.test.tsx +51 -0
  409. package/payload/tests/sparkline.test.tsx +20 -0
  410. package/payload/tests/status-list.test.tsx +56 -0
  411. package/payload/tests/ticket-mutations.test.ts +73 -10
  412. package/payload/tests/tickets-view.test.tsx +12 -3
  413. package/payload/tests/titles-engineering.test.ts +40 -0
  414. package/payload/tests/titles.test.ts +94 -0
  415. package/payload/tests/trend-chart-baseline.test.tsx +147 -0
  416. package/payload/tests/trend-chart-running.test.tsx +77 -0
  417. package/payload/tests/trend-chart.test.tsx +8 -4
  418. package/payload/tests/truncate.test.tsx +2 -2
  419. package/payload/tests/unsaved-leave.test.tsx +3 -3
  420. package/payload/tests/uptime-bars-end.test.tsx +20 -0
  421. package/payload/tests/uptime-no-data.test.tsx +34 -0
  422. package/payload/tests/{analytics-figures.test.ts → usage-figures.test.ts} +7 -7
  423. package/payload/tests/usage-summary.test.tsx +107 -0
  424. package/payload/tests/verify-coverage.test.ts +4 -4
  425. package/payload/tests/verify-explore-surfaces.test.ts +28 -0
  426. package/payload/tests/verify-personas.test.ts +3 -3
  427. package/payload/tests/verify-sample-surfaces.test.ts +20 -6
  428. package/payload/tests/verify-sizes.test.ts +1 -1
  429. package/payload/tests/view-tool-needs.test.ts +8 -3
  430. package/payload/tests/workspace-access.test.ts +4 -4
  431. package/payload/tests/workspace-chrome.test.tsx +10 -10
  432. package/payload/tests/workspace-data-paths.test.ts +8 -6
  433. package/payload/tests/workspace-home.test.tsx +119 -0
  434. package/payload/tests/workspaces.test.ts +15 -11
  435. package/payload/tokens/theme.light.tokens.json +1 -1
  436. package/payload/app/(dashboard)/(overview)/README.md +0 -69
  437. package/payload/app/(dashboard)/(overview)/loading.tsx +0 -60
  438. package/payload/app/(dashboard)/(overview)/page.tsx +0 -62
  439. package/payload/app/(dashboard)/analytics/README.md +0 -69
  440. package/payload/app/(dashboard)/analytics/loading.tsx +0 -24
  441. package/payload/app/(dashboard)/analytics/page.tsx +0 -61
  442. package/payload/app/(dashboard)/health/README.md +0 -68
  443. package/payload/app/(dashboard)/health/loading.tsx +0 -33
  444. package/payload/app/(dashboard)/health/page.tsx +0 -26
  445. package/payload/app/embed/health/README.md +0 -41
  446. package/payload/app/embed/health/page.tsx +0 -22
  447. package/payload/app/embed/health/view.tsx +0 -44
  448. package/payload/app/embed/overview/README.md +0 -31
  449. package/payload/app/embed/overview/page.tsx +0 -27
  450. package/payload/app/embed/overview/view.tsx +0 -59
  451. package/payload/src/views/analytics-context.ts +0 -88
  452. package/payload/src/views/analytics.tsx +0 -166
  453. package/payload/src/views/health-context.ts +0 -55
  454. package/payload/src/views/health.tsx +0 -103
  455. package/payload/src/views/overview-context.ts +0 -229
  456. package/payload/src/views/overview.tsx +0 -265
  457. package/payload/tests/analytics-summary.test.tsx +0 -80
  458. package/payload/tests/workspace-overview.test.tsx +0 -153
package/README.md CHANGED
@@ -42,7 +42,7 @@ in a page's kicker ("Production"); it does not touch the navigation workspaces.
42
42
  merges the dependencies and scripts it needs into your `package.json`; replaces your global stylesheet (yours is kept
43
43
  beside it as `*.before.css`); brands it; adds Meridian's managed block to your `AGENTS.md` between two markers, keeping your own text there byte
44
44
  for byte; writes an empty `docs/brief.md` (your product, users, data, decisions and glossary) if you have none; installs the skill into
45
- `.agents/skills/` (Codex) and `.claude/skills/` (Claude Code); records every copied file in `.meridian/manifest.json`;
45
+ `.agents/skills/` (Codex) and `.claude/skills/` (Claude Code); records every Meridian file it copied in `.meridian/manifest.json`;
46
46
  installs and type checks. Your routes, your data layer and your own components are not touched. Meridian's files
47
47
  import each other by relative path, so a `components/ui/button` of your own is never confused with Meridian's; your
48
48
  code imports Meridian as `@meridian/…`.
@@ -61,7 +61,8 @@ writes nothing; run it first.
61
61
  deleted or kept (`.meridian/keep.json`) is never overwritten: an edited or deleted one is staged as base/ours/new copies
62
62
  for you to merge.
63
63
  - It adds the dependencies and scripts this release needs to `package.json` and updates Meridian's managed block in
64
- `AGENTS.md`; a version or script you chose yourself becomes a migration to resolve, never a silent change.
64
+ `AGENTS.md`; an older version of the same major is raised, and a newer version, an older major or a script you
65
+ chose yourself becomes a migration to resolve, never a silent change.
65
66
  - It reports a migration for each interface the release changed where one of your own files still has the old shape,
66
67
  such as `cache-components-config` or `nav-needs`. `cli/src/migrations.ts` holds every one; resolve them as the skill's
67
68
  `references/update.md` says.
@@ -83,7 +84,7 @@ Requires Node 22.18 or newer. The default `pnpm verify` runs without Google Chro
83
84
 
84
85
  It has no dependencies and no install scripts: running it executes only its own code, and only when you call it. It
85
86
  sends nothing anywhere; the only network access is your package manager's install, which you can skip with
86
- `--no-install`. Every release is built and published by GitHub Actions with npm provenance, so the registry shows the
87
+ `--no-install`, and `update` reading releases from npm. Every release is built and published by GitHub Actions with npm provenance, so the registry shows the
87
88
  commit and workflow each version came from.
88
89
 
89
90
  ## Privacy and feedback
package/dist/adopt.js CHANGED
@@ -96,6 +96,8 @@ function verifyConfig() {
96
96
  return readPayload('scripts/verify.config.ts').replace(/const config: VerifyConfig = \{[\s\S]*?\n\};/, `const config: VerifyConfig = {
97
97
  // One detail page per state worth seeing (a normal record, a failed one, a missing one), with ids from your data.
98
98
  detailRoutes: [],
99
+ // What a route a persona may not open draws: the product's choice in src/app.config.ts.
100
+ refusal,
99
101
  };`);
100
102
  }
101
103
  /** The template's stylesheet, with its paths made relative to where the project keeps its own. */
@@ -100,6 +100,134 @@ function callArity(src, fn) {
100
100
  }
101
101
  return out;
102
102
  }
103
+ /** Where an import of the team's file `rel` points, as a project path with no extension; null for a package. */
104
+ const resolvedImport = (rel, spec) => {
105
+ const bare = spec.replace(/\.[mc]?[jt]sx?$/, '');
106
+ if (bare.startsWith('@/'))
107
+ return `src/${bare.slice(2)}`;
108
+ return bare.startsWith('.') ? path.posix.join(path.posix.dirname(rel), bare) : null;
109
+ };
110
+ /** Each import of a file of the team's: the module it resolves to, the names it takes and its namespace, if it has one. */
111
+ function importsOf(rel, src) {
112
+ const out = [];
113
+ for (const m of src.matchAll(/^\s*import\s+(?:type\s+)?([^'"]*?)\s+from\s+(['"])([^'"]+)\2/gm)) {
114
+ const from = resolvedImport(rel, m[3]);
115
+ if (from === null)
116
+ continue;
117
+ const names = (/\{([^}]*)\}/.exec(m[1])?.[1] ?? '').split(',').map((s) => s.trim().replace(/^type\s+/, '').split(/\s+as\s+/)[0]).filter(Boolean);
118
+ out.push({ from, names, namespace: /\*\s*as\s+([\w$]+)/.exec(m[1])?.[1] ?? null });
119
+ }
120
+ return out;
121
+ }
122
+ /**
123
+ * The index just past the string, template or comment that starts at `i`, or `i` when none does. A regular expression is
124
+ * not told from a division here: a view tool's object holds none whose brackets or quotes do not balance.
125
+ */
126
+ function skipLiteral(src, i) {
127
+ const c = src[i], next = src[i + 1];
128
+ if (c === '/' && next === '/') {
129
+ const e = src.indexOf('\n', i);
130
+ return e < 0 ? src.length : e;
131
+ }
132
+ if (c === '/' && next === '*') {
133
+ const e = src.indexOf('*/', i + 2);
134
+ return e < 0 ? src.length : e + 2;
135
+ }
136
+ if (c === "'" || c === '"') {
137
+ let j = i + 1;
138
+ while (j < src.length && src[j] !== c && src[j] !== '\n')
139
+ j += src[j] === '\\' ? 2 : 1;
140
+ return j + 1;
141
+ }
142
+ if (c === '`') {
143
+ let j = i + 1;
144
+ while (j < src.length && src[j] !== '`') {
145
+ if (src[j] === '\\')
146
+ j += 2;
147
+ else if (src[j] === '$' && src[j + 1] === '{')
148
+ j = closeOf(src, j + 1) + 1;
149
+ else
150
+ j++;
151
+ }
152
+ return j + 1;
153
+ }
154
+ return i;
155
+ }
156
+ /** The index of the bracket that closes the `{`, `(` or `[` at `open`, passing over strings and comments. */
157
+ function closeOf(src, open) {
158
+ let depth = 0;
159
+ for (let i = open; i < src.length;) {
160
+ const past = skipLiteral(src, i);
161
+ if (past !== i) {
162
+ i = past;
163
+ continue;
164
+ }
165
+ const c = src[i];
166
+ if ('{(['.includes(c))
167
+ depth++;
168
+ else if ('})]'.includes(c) && --depth === 0)
169
+ return i;
170
+ i++;
171
+ }
172
+ return src.length;
173
+ }
174
+ /**
175
+ * Each `defineViewTool({ … })` call of a file, as the keys of its object's own level, each with its value when that is a
176
+ * string and null otherwise; a key inside a nested object, call or function body, such as an input's `page`, is not
177
+ * the tool's. An object that spreads another has the key `...`, since what it spreads cannot be read here.
178
+ */
179
+ function viewToolCalls(src) {
180
+ const out = [];
181
+ const call = /defineViewTool\s*(?:<[^>]*>)?\s*\(\s*\{/y;
182
+ const key = /(?:async\s+)?([A-Za-z_$][\w$]*)(?:\s*:\s*(['"])((?:\\.|(?!\2)[^\\\n])*)\2)?/y;
183
+ for (let i = 0; i < src.length;) {
184
+ const past = skipLiteral(src, i);
185
+ if (past !== i) {
186
+ i = past;
187
+ continue;
188
+ }
189
+ call.lastIndex = i;
190
+ const m = call.exec(src);
191
+ if (!m || /[\w$.]/.test(src[i - 1] ?? '')) {
192
+ i++;
193
+ continue;
194
+ }
195
+ const open = i + m[0].length - 1;
196
+ const close = closeOf(src, open);
197
+ const keys = new Map();
198
+ let prev = '{';
199
+ for (let k = open + 1; k < close;) {
200
+ const lit = skipLiteral(src, k);
201
+ if (lit !== k) {
202
+ k = lit;
203
+ continue;
204
+ }
205
+ const c = src[k];
206
+ if (/\s/.test(c)) {
207
+ k++;
208
+ continue;
209
+ }
210
+ if (prev === '{' || prev === ',') {
211
+ if (src.startsWith('...', k))
212
+ keys.set('...', null);
213
+ key.lastIndex = k;
214
+ const found = key.exec(src);
215
+ if (found && !keys.has(found[1]))
216
+ keys.set(found[1], found[3] ?? null);
217
+ }
218
+ if ('{(['.includes(c)) {
219
+ k = closeOf(src, k) + 1;
220
+ prev = '}';
221
+ continue;
222
+ }
223
+ prev = c;
224
+ k++;
225
+ }
226
+ out.push(keys);
227
+ i = close + 1;
228
+ }
229
+ return out;
230
+ }
103
231
  // ── The registry ─────────────────────────────────────────────────────────────────────────────────────
104
232
  const GATE_AND_BUILD = ['gate', 'build'];
105
233
  export const RELEASE_MIGRATIONS = [
@@ -254,7 +382,135 @@ export const RELEASE_MIGRATIONS = [
254
382
  instructions: 'The gate asked this of pages under `app/(dashboard)/` only; from 0.15.0 it asks it under whatever route group sits at the top of the app folder. Read "A page spec" in references/customize.md. Under `## Agents` in each page\'s README.md listed here, add `### What the agent reads`: what the page\'s shared context tells each agent, with a real line of it, and what the MCP App and the console assistant do with it. A copy of the rule kept in `scripts/check.local.ts` for the project\'s own group can be deleted.',
255
383
  checks: ['gate'],
256
384
  },
385
+ {
386
+ id: 'refusal-declared',
387
+ since: '0.16.0',
388
+ applies: refusalUndeclared,
389
+ summary: 'The product says what an address a person may not open draws: `refusal` in `src/app.config.ts`.',
390
+ instructions: 'Read "Navigation: `src/app.config.ts`" in references/customize.md. Add `export const refusal: \'explain\' | \'absent\' = \'explain\';` to `src/app.config.ts`, beside `facts`: `explain` keeps the no-access page a refused page draws today, and `absent` answers as an address that names nothing. A project that keeps the sample\'s access seam brings `src/data/access.ts` and `src/data/refusal.ts` over from the release (`gate` reads `refusal`, with `gatedMetadata` and `withheldEntries` beside it, and `gatedLoading` reads it alone), titles each gated page with `export function generateMetadata() { return gatedMetadata(\'<feature>\', { title: \'<its title>\' }); }` in place of a static `metadata`, passes its loading state\'s `name` and `title` through `gatedLoading`, and adds `refusal,` to the config object of `scripts/verify.config.ts`, imported from `../src/app.config.ts`, so `verify --as` expects the page the product chose.',
391
+ checks: GATE_AND_BUILD,
392
+ },
393
+ {
394
+ id: 'managed-exports-removed',
395
+ since: '0.16.0',
396
+ applies: removedExportReaders,
397
+ summary: 'A file of the team\'s imports an export the release removed from a managed module: `deviations`, `largest`, `runs` or `weekendRatio` from `src/lib/insight.ts`, or `queryInput` from `src/lib/collection.ts`.',
398
+ instructions: 'The update brought `src/lib/insight.ts` and `src/lib/collection.ts` without them, so each file listed here fails the type check. A file of the sample\'s comes over from the release: the Overview context is Home\'s, `src/views/home-context.ts` (see `sample-pages-renamed`); the assistant reads through `view_<name>` and `explore_<view>` and has no `query_<name>` tools, so bring `src/lib/assistant/tools.ts` and `src/lib/assistant/respond.ts` over and pass `readable`, every collection the person may read, from the assistant route to `respond` beside `collections` (read "Prepared queries" in references/agents.md); and a shipped test that imports one, such as `tests/shared-context.test.tsx` or `tests/collection.test.ts`, comes over as the release has it. A file of your own that still needs one of the functions writes it in that file, from its 0.15.0 source.',
399
+ checks: GATE_AND_BUILD,
400
+ },
401
+ {
402
+ id: 'view-tool-page-explore',
403
+ since: '0.16.0',
404
+ applies: (root) => matching(root, (_, src) => viewToolCalls(src).some((k) => !k.has('...') && !(k.has('page') && k.has('explore')))),
405
+ summary: 'Every view tool names the page it renders and its prepared query: `page` and `explore` on `defineViewTool`.',
406
+ instructions: 'Read "Prepared queries" in references/agents.md. Add to each `defineViewTool` call in the files listed here `page`, the console route of the page the view renders (a rail destination\'s `href` in `nav`, or a detail page\'s route with its segment, such as `/customers/[id]`), and `explore`, its prepared query (`PreparedQuery` in `src/lib/explore.ts`), declared beside the view as the sample\'s are in `src/views/<view>-explore.ts`. `ViewTool` in `src/lib/shared-context.ts` requires both, so a tool without them fails the type check. A project that kept the sample\'s view tools brings `src/views/tools.ts` and the `src/views/*-explore.ts` files over from the release. Once a tool names its page, the gate asks that page\'s specification what the agent does there (`agent-does-here-section`).',
407
+ checks: GATE_AND_BUILD,
408
+ },
409
+ {
410
+ id: 'agent-does-here-section',
411
+ since: '0.16.0',
412
+ applies: viewToolPagesWithoutAgentDoes,
413
+ summary: 'The specification of a page a view tool renders says what the agent does there.',
414
+ instructions: 'Read "Prepared queries" in references/agents.md. Under `## Agents` in the README.md of each page a view tool\'s `page` names, add `### What the agent does here`: a line `Protagonist: <the card\'s name>.`, then at least three questions a person on the page asks that its context does not answer alone, each `- "<question>" — <what the prepared query is asked>`, and mark that card on the page with `data-protagonist="<name>"`. `scripts/check.ts` fails the gate on such a page without the part. While a view tool in `src/views/tools.ts` names no page yet (`view-tool-page-explore`), every console page specification without the part is listed: one that no tool comes to name needs nothing.',
415
+ checks: ['gate'],
416
+ },
417
+ {
418
+ id: 'sample-pages-renamed',
419
+ since: '0.16.0',
420
+ applies: renamedSampleFiles,
421
+ summary: 'The project holds the sample\'s pages and views under their 0.15.0 names: Overview is Home, Analytics is Usage at `/usage` and Operations is Services at `/services`.',
422
+ instructions: 'The release renamed them with no redirect, and an update writes none of the team\'s pages, views or tests. Each file listed is one of them or names one: a page or a view, the view tools, `src/app.config.ts`\'s nav and the feature ids it names, the routes of `scripts/verify.config.ts`, or a shipped test that expects them. A project that kept the sample\'s pages as they were brings the release\'s over: `app/(dashboard)/` and `app/embed/`, `src/views/`, `src/data/`, `src/lib/assistant/` beside `prompt.ts`, `src/app.config.ts` with its own `app` kept, and each shipped test as the release has it; a file listed here that the release no longer has is deleted. A project that made the pages its own keeps its own names, makes the changes this release\'s other migrations list in them, and reads "not applicable" for the assistant walk-through\'s steps on Home and Now (`scripts/lib/sample.ts`).',
423
+ checks: GATE_AND_BUILD,
424
+ },
257
425
  ];
426
+ /** The team's files that import an export 0.16.0 removed from a managed module, by name or through a namespace. */
427
+ function removedExportReaders(root) {
428
+ const removed = { 'src/lib/insight': ['deviations', 'largest', 'runs', 'weekendRatio'], 'src/lib/collection': ['queryInput'] };
429
+ return matching(root, (rel, src) => importsOf(rel, src).some(({ from, names, namespace }) => {
430
+ const gone = removed[from] ?? [];
431
+ return names.some((n) => gone.includes(n)) || (namespace !== null && gone.some((g) => new RegExp(`(?<![\\w$.])${namespace.replace(/\$/g, '\\$')}\\.${g}\\b`).test(src)));
432
+ }));
433
+ }
434
+ /**
435
+ * The specifications of the pages the view tools of `src/views/tools.ts` render, as the gate reads them from 0.16.0,
436
+ * that lack "What the agent does here". While a tool names no page, the gate cannot tell its page, and neither can this:
437
+ * every console page specification without the part is listed then.
438
+ */
439
+ function viewToolPagesWithoutAgentDoes(root) {
440
+ const tools = text(root, 'src/views/tools.ts');
441
+ if (tools === null)
442
+ return null;
443
+ const calls = viewToolCalls(tools).filter((k) => !k.has('...'));
444
+ if (calls.length === 0)
445
+ return null;
446
+ const pages = new Set(calls.map((k) => k.get('page')).filter((p) => typeof p === 'string'));
447
+ const unnamed = calls.some((k) => !k.has('page'));
448
+ const app = fs.existsSync(path.join(root, 'app')) ? 'app' : 'src/app';
449
+ const specs = [];
450
+ walk(root, app, specs, /^README\.md$/);
451
+ const hits = specs.filter((rel) => {
452
+ const rest = rel.slice(app.length + 1);
453
+ if (!/^\([^/)]+\)\//.test(rest))
454
+ return false;
455
+ const route = `/${path.posix.dirname(rest).split('/').filter((s) => !/^\(.*\)$/.test(s)).join('/')}`;
456
+ return (unnamed || pages.has(route)) && !/^## Agents$(?:\n(?!## ).*)*\n### What the agent does here$/m.test(text(root, rel) ?? '');
457
+ });
458
+ return hits.length > 0 ? hits : null;
459
+ }
460
+ /**
461
+ * The sample's pages and views under the names 0.16.0 replaced, and every file of the team's that names one: an import
462
+ * of one of their modules, a feature id or view tool of theirs, the walk-through's surfaces as they were, and the
463
+ * verify config's routes for them. Only a project that still holds one of the sample's old files is read, so a page of
464
+ * a product's own at the same address, or a feature of its own of the same name, is never taken for the sample's. The
465
+ * names are put together from their parts: the repository holds them out of everything but its history.
466
+ */
467
+ function renamedSampleFiles(root) {
468
+ const old = ['overview', 'analytics', 'health'];
469
+ const modules = new Set([...old.flatMap((n) => [`src/views/${n}`, `src/views/${n}-context`]), `src/data/${old[1]}`]);
470
+ const group = `(${old[0]})`;
471
+ const named = new RegExp(`\\b(?:FEATURES\\.|view_)(?:${old.join('|')})\\b`);
472
+ const isOld = (rel) => modules.has(rel.replace(/\.[mc]?[jt]sx?$/, '')) || (/^(?:src\/)?app\//.test(rel) && rel.split('/').includes(group));
473
+ const sources = teamSources(root);
474
+ if (!sources.some((f) => isOld(f.rel)))
475
+ return null;
476
+ const seeds = sources.filter(({ rel, src }) => isOld(rel)
477
+ || importsOf(rel, src).some((i) => modules.has(i.from))
478
+ || named.test(src)
479
+ || (/\bsampleSurfaces\b/.test(src) && new RegExp(`\\b${old[0]}\\s*:|\\.${old[0]}\\b`).test(src))).map((f) => f.rel);
480
+ // A page or an embed view of the sample's goes with its folder: its loading state and its specification name nothing
481
+ // of the old, and are as much the sample's. A file that imports one of the old files, such as a test that renders the
482
+ // page, names it too; a file that only names one, such as the configuration, is not itself the old.
483
+ const oldFiles = new Set(sources.map((f) => f.rel).filter(isOld));
484
+ const pages = sources.filter(({ rel, src }) => /^(?:src\/)?app\//.test(rel) && /^(?:page|view)\.tsx?$/.test(base(rel)) && (isOld(rel) || importsOf(rel, src).some((i) => modules.has(i.from))));
485
+ for (const { rel } of pages) {
486
+ const dir = path.posix.dirname(rel);
487
+ try {
488
+ for (const e of fs.readdirSync(path.join(root, dir), { withFileTypes: true }))
489
+ if (e.isFile())
490
+ oldFiles.add(`${dir}/${e.name}`);
491
+ }
492
+ catch { /* gone since it was read */ }
493
+ }
494
+ const oldPaths = new Set([...oldFiles].map((r) => r.replace(/\.[mc]?[jt]sx?$/, '')));
495
+ const found = new Set([...seeds, ...oldFiles]);
496
+ for (const { rel, src } of sources)
497
+ if (importsOf(rel, src).some((i) => oldPaths.has(i.from)))
498
+ found.add(rel);
499
+ const hits = [...found].sort();
500
+ const verifyConfig = 'scripts/verify.config.ts';
501
+ const routes = new RegExp(`'/(?:${old[1]}|${old[2]})'|title:\\s*'(?:Overview|Analytics|Operations)'`);
502
+ if (routes.test(text(root, verifyConfig) ?? ''))
503
+ hits.push(verifyConfig);
504
+ return hits;
505
+ }
506
+ /** The project's configuration, when it does not yet say what an address a person may not open draws (0.16.0). */
507
+ function refusalUndeclared(root) {
508
+ const rel = 'src/app.config.ts';
509
+ const body = text(root, rel);
510
+ if (body === null)
511
+ return null;
512
+ return /^export const refusal\b/m.test(body) ? null : [rel];
513
+ }
258
514
  /** The project's own nav, with any item still missing the `needs` that 0.13.0 requires of it. */
259
515
  function navItemsWithoutNeeds(root) {
260
516
  const rel = 'src/app.config.ts';
package/dist/ownership.js CHANGED
@@ -1,14 +1,14 @@
1
1
  const HASH = /^sha256-[0-9a-f]{64}$/;
2
2
  const SEMVER = /^\d+\.\d+\.\d+$/;
3
3
  /** The library modules Meridian's components and gates import; the rest of src/lib belongs to the template's pages. */
4
- export const LIB = ['cn', 'format', 'format-date', 'period', 'color', 'host', 'preferences', 'csv', 'safe-markdown', 'logo', 'collection', 'live', 'shared-context', 'agent-guidance', 'insight'].map((n) => `src/lib/${n}.ts`);
4
+ export const LIB = ['cn', 'format', 'format-date', 'period', 'color', 'host', 'preferences', 'csv', 'safe-markdown', 'logo', 'collection', 'explore', 'live', 'shared-context', 'agent-guidance', 'insight', 'facts'].map((n) => `src/lib/${n}.ts`);
5
5
  /** The single files adopt copies besides the folders and the library: all of them must be in a payload that is whole. */
6
6
  export const FIXED = [...LIB, 'src/lib/assistant/prompt.ts', 'src/views/console-chrome.tsx', 'tests/setup.ts'];
7
7
  /** The one rule, a plain-English line per clause. `references/ownership.md` renders it, so the guidance cannot drift. */
8
8
  export const OWNERSHIP = [
9
9
  'Managed: the payload files under `tokens/`, `src/styles/` and `src/components/`, except each component\'s `README.md` and `preview.tsx`.',
10
10
  'Managed: the distributed scripts under `scripts/`, except `scripts/verify.config.ts`, the first-load baseline `optional:scripts/verify.baseline.json` and a team-local `optional:scripts/check.local.ts`.',
11
- 'Managed: the library helpers `src/lib/cn.ts`, `src/lib/format.ts`, `src/lib/format-date.ts`, `src/lib/period.ts`, `src/lib/color.ts`, `src/lib/host.ts`, `src/lib/preferences.ts`, `src/lib/csv.ts`, `src/lib/safe-markdown.ts`, `src/lib/logo.ts`, `src/lib/collection.ts`, `src/lib/live.ts`, `src/lib/shared-context.ts`, `src/lib/agent-guidance.ts` and `src/lib/insight.ts`, and the assistant prompt `src/lib/assistant/prompt.ts`.',
11
+ 'Managed: the library helpers `src/lib/cn.ts`, `src/lib/format.ts`, `src/lib/format-date.ts`, `src/lib/period.ts`, `src/lib/color.ts`, `src/lib/host.ts`, `src/lib/preferences.ts`, `src/lib/csv.ts`, `src/lib/safe-markdown.ts`, `src/lib/logo.ts`, `src/lib/collection.ts`, `src/lib/explore.ts`, `src/lib/live.ts`, `src/lib/shared-context.ts`, `src/lib/agent-guidance.ts`, `src/lib/insight.ts` and `src/lib/facts.ts`, and the assistant prompt `src/lib/assistant/prompt.ts`.',
12
12
  'Managed: `src/views/console-chrome.tsx` and `tests/setup.ts`.',
13
13
  'Managed: `optional:scripts/package.json`, only when the adopt or create that set the project up generated it for this project shape.',
14
14
  'Managed: both installed skill trees, `optional:.agents/skills/zz-meridian/` and `optional:.claude/skills/zz-meridian/`, taken from the release\'s skill payload.',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zz-meridian",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "Bring ZZ Meridian, a dashboard design system, into a Next.js project, or start a new dashboard on it. Copies the files in; nothing depends on this package at runtime.",
5
5
  "license": "MIT",
6
6
  "type": "module",