basalt-ui 1.40.3 → 2.0.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 (923) hide show
  1. package/AGENTS.md +50 -45
  2. package/CHANGELOG.md +543 -513
  3. package/MIGRATING.md +969 -37
  4. package/README.md +172 -367
  5. package/agent/rules/basalt-batteries.md +19 -74
  6. package/agent/rules/basalt-charts.md +21 -95
  7. package/agent/rules/basalt-controls.md +23 -131
  8. package/agent/rules/basalt-mantine.md +26 -99
  9. package/agent/rules/basalt-state.md +21 -103
  10. package/agent/rules/basalt-tokens.md +33 -114
  11. package/agent/skills/basalt-app/SKILL.md +229 -72
  12. package/agent/skills/basalt-charts/SKILL.md +23 -57
  13. package/agent/skills/basalt-design/SKILL.md +12 -70
  14. package/agent/templates/AGENTS-block.md.tpl +30 -0
  15. package/agent/templates/DESIGN.md.tpl +2 -2
  16. package/agent/templates/__root.tpl +9 -16
  17. package/agent/templates/main.tpl +21 -0
  18. package/agent/templates/nav.tpl +18 -0
  19. package/configs/check.yml +1 -1
  20. package/configs/oxlint-basalt.json +4 -10
  21. package/configs/oxlint-plugin.js +468 -847
  22. package/configs/oxlint-plugin.test.ts +662 -710
  23. package/configs/oxlint.json +10 -2
  24. package/dist/agent/ai-sdk-transport.d.ts +19 -7
  25. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  26. package/dist/agent/ai-sdk-transport.js +10 -7
  27. package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
  28. package/dist/agent/chat/composer.d.ts.map +1 -0
  29. package/dist/{agent-chat → agent/chat}/composer.js +10 -9
  30. package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
  31. package/dist/agent/chat/message-affordances.d.ts.map +1 -0
  32. package/dist/agent/chat/relative-time.d.ts.map +1 -0
  33. package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
  34. package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
  35. package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
  36. package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
  37. package/dist/agent/chat/thread-feed.d.ts.map +1 -0
  38. package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
  39. package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
  40. package/dist/agent/chat/thread-message.d.ts.map +1 -0
  41. package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
  42. package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
  43. package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
  44. package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
  45. package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
  46. package/dist/agent/chat/tool-chip.d.ts.map +1 -0
  47. package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
  48. package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
  49. package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
  50. package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
  51. package/dist/agent/chat/virtualize.d.ts.map +1 -0
  52. package/dist/agent/error.d.ts +31 -0
  53. package/dist/agent/error.d.ts.map +1 -0
  54. package/dist/agent/error.js +18 -0
  55. package/dist/agent/foreign.d.ts +3 -2
  56. package/dist/agent/foreign.d.ts.map +1 -1
  57. package/dist/agent/history.d.ts +2 -36
  58. package/dist/agent/history.d.ts.map +1 -1
  59. package/dist/agent/history.js +0 -32
  60. package/dist/agent/id.d.ts +4 -5
  61. package/dist/agent/id.d.ts.map +1 -1
  62. package/dist/agent/index.d.ts +19 -52
  63. package/dist/agent/index.d.ts.map +1 -1
  64. package/dist/agent/index.js +10 -32
  65. package/dist/agent/outcome.d.ts +3 -14
  66. package/dist/agent/outcome.d.ts.map +1 -1
  67. package/dist/agent/outcome.js +0 -30
  68. package/dist/agent/part-list.d.ts +3 -3
  69. package/dist/agent/part-list.d.ts.map +1 -1
  70. package/dist/agent/parts.d.ts +23 -24
  71. package/dist/agent/parts.d.ts.map +1 -1
  72. package/dist/agent/run-committer.d.ts +23 -0
  73. package/dist/agent/run-committer.d.ts.map +1 -0
  74. package/dist/agent/run-committer.js +41 -0
  75. package/dist/agent/run-records.d.ts +77 -0
  76. package/dist/agent/run-records.d.ts.map +1 -0
  77. package/dist/agent/run-records.js +69 -0
  78. package/dist/agent/thread.d.ts +23 -47
  79. package/dist/agent/thread.d.ts.map +1 -1
  80. package/dist/agent/thread.js +3 -134
  81. package/dist/agent/transport.d.ts +6 -69
  82. package/dist/agent/transport.d.ts.map +1 -1
  83. package/dist/agent/transport.js +0 -18
  84. package/dist/agent/use-agent-thread-runs.d.ts +63 -26
  85. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  86. package/dist/agent/use-agent-thread-runs.js +202 -66
  87. package/dist/charts/BandStrip.d.ts +46 -0
  88. package/dist/charts/BandStrip.d.ts.map +1 -0
  89. package/dist/charts/BandStrip.js +151 -0
  90. package/dist/charts/Bars.d.ts +19 -0
  91. package/dist/charts/Bars.d.ts.map +1 -0
  92. package/dist/charts/Bars.js +77 -0
  93. package/dist/charts/CartesianChart.d.ts +57 -0
  94. package/dist/charts/CartesianChart.d.ts.map +1 -0
  95. package/dist/charts/CartesianChart.js +121 -0
  96. package/dist/charts/ChartCard.d.ts +34 -0
  97. package/dist/charts/ChartCard.d.ts.map +1 -0
  98. package/dist/charts/ChartCard.js +115 -0
  99. package/dist/charts/Donut.d.ts +25 -0
  100. package/dist/charts/Donut.d.ts.map +1 -0
  101. package/dist/charts/Donut.js +191 -0
  102. package/dist/charts/DualPanel.d.ts +47 -0
  103. package/dist/charts/DualPanel.d.ts.map +1 -0
  104. package/dist/charts/DualPanel.js +214 -0
  105. package/dist/charts/Heatmap.d.ts +41 -0
  106. package/dist/charts/Heatmap.d.ts.map +1 -0
  107. package/dist/charts/Heatmap.js +216 -0
  108. package/dist/charts/Lines.d.ts +11 -0
  109. package/dist/charts/Lines.d.ts.map +1 -0
  110. package/dist/charts/Lines.js +114 -0
  111. package/dist/charts/MirroredBars.d.ts +44 -0
  112. package/dist/charts/MirroredBars.d.ts.map +1 -0
  113. package/dist/charts/MirroredBars.js +190 -0
  114. package/dist/charts/Sparkline.d.ts +22 -0
  115. package/dist/charts/Sparkline.d.ts.map +1 -0
  116. package/dist/charts/Sparkline.js +129 -0
  117. package/dist/charts/StackedArea.d.ts +15 -0
  118. package/dist/charts/StackedArea.d.ts.map +1 -0
  119. package/dist/charts/StackedArea.js +46 -0
  120. package/dist/charts/box.d.ts +38 -0
  121. package/dist/charts/box.d.ts.map +1 -0
  122. package/dist/charts/box.js +72 -0
  123. package/dist/charts/card-context.d.ts +3 -0
  124. package/dist/charts/card-context.d.ts.map +1 -0
  125. package/dist/charts/card-context.js +7 -0
  126. package/dist/charts/chart-box.module.css +64 -0
  127. package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
  128. package/dist/charts/chart-card.module.css +25 -0
  129. package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
  130. package/dist/charts/chart-legend.module.css +38 -0
  131. package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
  132. package/dist/charts/compile.d.ts +62 -0
  133. package/dist/charts/compile.d.ts.map +1 -0
  134. package/dist/charts/compile.js +386 -0
  135. package/dist/charts/cursor.d.ts +50 -0
  136. package/dist/charts/cursor.d.ts.map +1 -0
  137. package/dist/charts/cursor.js +157 -0
  138. package/dist/charts/curves.d.ts +12 -0
  139. package/dist/charts/curves.d.ts.map +1 -0
  140. package/dist/charts/curves.js +86 -0
  141. package/dist/charts/donut.module.css +54 -0
  142. package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
  143. package/dist/charts/host.d.ts +17 -0
  144. package/dist/charts/host.d.ts.map +1 -0
  145. package/dist/charts/host.js +35 -0
  146. package/dist/charts/index.d.ts +18 -53
  147. package/dist/charts/index.d.ts.map +1 -1
  148. package/dist/charts/index.js +17 -189
  149. package/dist/charts/legend.d.ts +23 -0
  150. package/dist/charts/legend.d.ts.map +1 -0
  151. package/dist/charts/legend.js +160 -0
  152. package/dist/charts/marks.d.ts +25 -0
  153. package/dist/charts/marks.d.ts.map +1 -0
  154. package/dist/charts/marks.js +128 -0
  155. package/dist/charts/panel.d.ts +56 -0
  156. package/dist/charts/panel.d.ts.map +1 -0
  157. package/dist/charts/panel.js +123 -0
  158. package/dist/charts/scales.d.ts +44 -0
  159. package/dist/charts/scales.d.ts.map +1 -0
  160. package/dist/charts/scales.js +163 -0
  161. package/dist/charts/sizing.d.ts +12 -0
  162. package/dist/charts/sizing.d.ts.map +1 -0
  163. package/dist/charts/sizing.js +33 -0
  164. package/dist/charts/state.d.ts +17 -0
  165. package/dist/charts/state.d.ts.map +1 -0
  166. package/dist/charts/state.js +53 -0
  167. package/dist/charts/theme.d.ts +38 -19
  168. package/dist/charts/theme.d.ts.map +1 -1
  169. package/dist/charts/theme.js +48 -26
  170. package/dist/charts/types.d.ts +227 -0
  171. package/dist/charts/types.d.ts.map +1 -0
  172. package/dist/charts/types.js +4 -0
  173. package/dist/cli/audit-allows.d.ts +4 -17
  174. package/dist/cli/audit-allows.d.ts.map +1 -1
  175. package/dist/cli/config.d.ts +14 -43
  176. package/dist/cli/config.d.ts.map +1 -1
  177. package/dist/cli/doctor-upgrade.d.ts +31 -0
  178. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  179. package/dist/cli/doctor-upgrade.js +269 -0
  180. package/dist/cli/doctor.d.ts +13 -26
  181. package/dist/cli/doctor.d.ts.map +1 -1
  182. package/dist/cli/doctor.js +79 -8
  183. package/dist/cli/help.d.ts.map +1 -1
  184. package/dist/cli/help.js +2 -4
  185. package/dist/cli/index.d.ts +68 -135
  186. package/dist/cli/index.d.ts.map +1 -1
  187. package/dist/cli/index.js +89 -76
  188. package/dist/cli/init.d.ts.map +1 -1
  189. package/dist/cli/init.js +43 -27
  190. package/dist/cli/sync.d.ts +5 -21
  191. package/dist/cli/sync.d.ts.map +1 -1
  192. package/dist/cli/sync.js +4 -6
  193. package/dist/cli/tokens-css.d.ts +7 -28
  194. package/dist/cli/tokens-css.d.ts.map +1 -1
  195. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  196. package/dist/commands/ShortcutsHelp.js +4 -5
  197. package/dist/commands/define-commands.d.ts +15 -31
  198. package/dist/commands/define-commands.d.ts.map +1 -1
  199. package/dist/commands/define-commands.js +1 -11
  200. package/dist/commands/define-overlays.d.ts +5 -19
  201. package/dist/commands/define-overlays.d.ts.map +1 -1
  202. package/dist/commands/define-overlays.js +3 -11
  203. package/dist/commands/index.d.ts +10 -40
  204. package/dist/commands/index.d.ts.map +1 -1
  205. package/dist/commands/index.js +9 -46
  206. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  207. package/dist/commands/notifications/bell.d.ts.map +1 -0
  208. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  209. package/dist/commands/notifications/center.d.ts.map +1 -0
  210. package/dist/{notifications → commands/notifications}/center.js +2 -2
  211. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  212. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  213. package/dist/commands/notifications/notify.d.ts +44 -0
  214. package/dist/commands/notifications/notify.d.ts.map +1 -0
  215. package/dist/commands/notifications/notify.js +79 -0
  216. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  217. package/dist/commands/notifications/store.d.ts.map +1 -0
  218. package/dist/{notifications → commands/notifications}/store.js +4 -0
  219. package/dist/commands/projectors.d.ts +1 -131
  220. package/dist/commands/projectors.d.ts.map +1 -1
  221. package/dist/commands/projectors.js +2 -73
  222. package/dist/commands/shell-bridge.d.ts +3 -3
  223. package/dist/commands/shortcut-format.d.ts +5 -4
  224. package/dist/commands/shortcut-format.d.ts.map +1 -1
  225. package/dist/common/errors.d.ts +3 -3
  226. package/dist/common/use-measured-widths.d.ts.map +1 -1
  227. package/dist/common/use-measured-widths.js +5 -3
  228. package/dist/common/validate.d.ts +2 -2
  229. package/dist/content/article-layout.d.ts.map +1 -1
  230. package/dist/content/article-layout.js +3 -3
  231. package/dist/content/article-model.d.ts +1 -46
  232. package/dist/content/article-model.d.ts.map +1 -1
  233. package/dist/content/article-model.js +1 -29
  234. package/dist/content/copy-action.d.ts +1 -1
  235. package/dist/content/glyphs.d.ts +1 -1
  236. package/dist/content/index.d.ts +11 -41
  237. package/dist/content/index.d.ts.map +1 -1
  238. package/dist/content/index.js +3 -35
  239. package/dist/content/markdown.d.ts +1 -1
  240. package/dist/content/markdown.d.ts.map +1 -1
  241. package/dist/content/markdown.js +1 -1
  242. package/dist/content/mermaid.d.ts.map +1 -1
  243. package/dist/content/mermaid.js +7 -7
  244. package/dist/content/slug.d.ts +1 -8
  245. package/dist/content/slug.d.ts.map +1 -1
  246. package/dist/content/slug.js +1 -8
  247. package/dist/content/url-hardening.d.ts +2 -2
  248. package/dist/content/url-hardening.d.ts.map +1 -1
  249. package/dist/content/url-hardening.js +2 -0
  250. package/dist/controls/actions.d.ts +16 -1
  251. package/dist/controls/actions.d.ts.map +1 -1
  252. package/dist/controls/enum-filter.d.ts +1 -1
  253. package/dist/controls/enum-filter.d.ts.map +1 -1
  254. package/dist/controls/filter-context.d.ts.map +1 -1
  255. package/dist/controls/filter-context.js +3 -1
  256. package/dist/controls/filter-set.js +4 -6
  257. package/dist/controls/form-layout.d.ts +1 -1
  258. package/dist/controls/form-layout.d.ts.map +1 -1
  259. package/dist/controls/form-layout.js +1 -1
  260. package/dist/controls/glyphs.d.ts +0 -2
  261. package/dist/controls/glyphs.d.ts.map +1 -1
  262. package/dist/controls/glyphs.js +0 -7
  263. package/dist/controls/index.d.ts +12 -17
  264. package/dist/controls/index.d.ts.map +1 -1
  265. package/dist/controls/index.js +5 -39
  266. package/dist/controls/multi-select-filter.d.ts +4 -3
  267. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  268. package/dist/controls/number-filter.d.ts +4 -3
  269. package/dist/controls/number-filter.d.ts.map +1 -1
  270. package/dist/controls/number-filter.js +3 -1
  271. package/dist/controls/range-filter.d.ts +4 -3
  272. package/dist/controls/range-filter.d.ts.map +1 -1
  273. package/dist/controls/search-filter.d.ts +4 -3
  274. package/dist/controls/search-filter.d.ts.map +1 -1
  275. package/dist/controls/search-filter.js +19 -14
  276. package/dist/controls/select-filter.d.ts +4 -3
  277. package/dist/controls/select-filter.d.ts.map +1 -1
  278. package/dist/controls/sync-button.d.ts.map +1 -1
  279. package/dist/controls/sync-button.js +12 -15
  280. package/dist/controls/toggle-filter.d.ts +4 -3
  281. package/dist/controls/toggle-filter.d.ts.map +1 -1
  282. package/dist/controls/uncontrolled.d.ts +12 -0
  283. package/dist/controls/uncontrolled.d.ts.map +1 -0
  284. package/dist/controls/view-tabs.d.ts +2 -2
  285. package/dist/controls/view-tabs.d.ts.map +1 -1
  286. package/dist/controls-dates/index.d.ts +0 -1
  287. package/dist/controls-dates/index.d.ts.map +1 -1
  288. package/dist/dashboard/index.d.ts +7 -9
  289. package/dist/dashboard/index.d.ts.map +1 -1
  290. package/dist/dashboard/index.js +3 -23
  291. package/dist/dashboard/section.d.ts +4 -6
  292. package/dist/dashboard/section.d.ts.map +1 -1
  293. package/dist/dashboard/section.js +4 -10
  294. package/dist/dashboard/stat-card.d.ts +4 -4
  295. package/dist/dashboard/stat-card.d.ts.map +1 -1
  296. package/dist/dashboard/stat-card.js +3 -3
  297. package/dist/dashboard/widget-header.module.css +9 -7
  298. package/dist/dev-dock.d.ts.map +1 -1
  299. package/dist/dev-dock.js +6 -1
  300. package/dist/format/date.d.ts +0 -34
  301. package/dist/format/date.d.ts.map +1 -1
  302. package/dist/format/date.js +0 -54
  303. package/dist/format/index.d.ts +7 -22
  304. package/dist/format/index.d.ts.map +1 -1
  305. package/dist/format/index.js +2 -43
  306. package/dist/format/number.d.ts +3 -14
  307. package/dist/format/number.d.ts.map +1 -1
  308. package/dist/format/number.js +0 -13
  309. package/dist/format/shared.d.ts +2 -3
  310. package/dist/format/shared.d.ts.map +1 -1
  311. package/dist/forms/index.d.ts +0 -11
  312. package/dist/forms/index.d.ts.map +1 -1
  313. package/dist/forms/index.js +1 -14
  314. package/dist/guard/index.d.ts +6 -21
  315. package/dist/guard/index.d.ts.map +1 -1
  316. package/dist/guard/index.js +27 -115
  317. package/dist/guard/types.d.ts +7 -18
  318. package/dist/guard/types.d.ts.map +1 -1
  319. package/dist/index.d.ts +16 -48
  320. package/dist/index.d.ts.map +1 -1
  321. package/dist/index.js +21 -117
  322. package/dist/provider/create-router.d.ts +44 -0
  323. package/dist/provider/create-router.d.ts.map +1 -0
  324. package/dist/provider/create-router.js +62 -0
  325. package/dist/provider/hotkeys.d.ts +8 -0
  326. package/dist/provider/hotkeys.d.ts.map +1 -0
  327. package/dist/provider/hotkeys.js +50 -0
  328. package/dist/provider/index.d.ts +33 -110
  329. package/dist/provider/index.d.ts.map +1 -1
  330. package/dist/provider/index.js +182 -82
  331. package/dist/provider/lab-theme.d.ts.map +1 -1
  332. package/dist/provider/route-transition.d.ts +76 -0
  333. package/dist/provider/route-transition.d.ts.map +1 -0
  334. package/dist/provider/route-transition.js +98 -0
  335. package/dist/provider/spotlight-actions.d.ts +10 -0
  336. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  337. package/dist/provider/spotlight-actions.js +55 -0
  338. package/dist/provider/test-router.d.ts +6 -0
  339. package/dist/provider/test-router.d.ts.map +1 -0
  340. package/dist/provider/test-router.js +18 -0
  341. package/dist/query-client.d.ts +4 -20
  342. package/dist/query-client.d.ts.map +1 -1
  343. package/dist/query-client.js +2 -2
  344. package/dist/router-tanstack/index.d.ts +18 -64
  345. package/dist/router-tanstack/index.d.ts.map +1 -1
  346. package/dist/router-tanstack/index.js +2 -16
  347. package/dist/router-tanstack/nav.d.ts +12 -1
  348. package/dist/router-tanstack/nav.d.ts.map +1 -1
  349. package/dist/router-tanstack/nav.js +8 -1
  350. package/dist/router-tanstack/search-store.d.ts +1 -1
  351. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  352. package/dist/router-tanstack/use-nav.d.ts +8 -9
  353. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  354. package/dist/router-tanstack/use-nav.js +20 -1
  355. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  356. package/dist/shell/app-sidebar.js +1 -1
  357. package/dist/shell/index.d.ts +31 -10
  358. package/dist/shell/index.d.ts.map +1 -1
  359. package/dist/shell/index.js +14 -3
  360. package/dist/shell/page-aside.d.ts +2 -2
  361. package/dist/shell/page-aside.d.ts.map +1 -1
  362. package/dist/shell/page-aside.js +31 -12
  363. package/dist/shell/page-bar.d.ts +2 -2
  364. package/dist/shell/page-bar.d.ts.map +1 -1
  365. package/dist/shell/page-bar.js +1 -1
  366. package/dist/state.d.ts +10 -12
  367. package/dist/state.d.ts.map +1 -1
  368. package/dist/state.js +4 -6
  369. package/dist/styles.css +107 -7
  370. package/dist/surfaces.d.ts +28 -103
  371. package/dist/surfaces.d.ts.map +1 -1
  372. package/dist/surfaces.js +54 -143
  373. package/dist/{data → table}/data-table-state.d.ts +1 -1
  374. package/dist/table/data-table-state.d.ts.map +1 -0
  375. package/dist/{data → table}/data-table-state.js +4 -3
  376. package/dist/{data → table}/data-table.d.ts +28 -49
  377. package/dist/table/data-table.d.ts.map +1 -0
  378. package/dist/{data → table}/data-table.js +74 -60
  379. package/dist/table/index.d.ts +18 -0
  380. package/dist/table/index.d.ts.map +1 -0
  381. package/dist/{data/table.js → table/index.js} +1 -1
  382. package/dist/table/query-branch.d.ts.map +1 -0
  383. package/dist/table/table-features.d.ts +69 -0
  384. package/dist/table/table-features.d.ts.map +1 -0
  385. package/dist/table/table-features.js +49 -0
  386. package/dist/telemetry.d.ts +77 -0
  387. package/dist/telemetry.d.ts.map +1 -0
  388. package/dist/telemetry.js +33 -0
  389. package/dist/theme/index.d.ts +10 -21
  390. package/dist/theme/index.d.ts.map +1 -1
  391. package/dist/theme/index.js +3 -14
  392. package/dist/theme/theme-toggle.d.ts.map +1 -1
  393. package/dist/theme/theme-toggle.js +7 -33
  394. package/dist/theme/theme-toggle.module.css +30 -0
  395. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  396. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  397. package/dist/theme-lab/derive-controls.js +5 -3
  398. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  399. package/dist/theme-lab/derive-state.js +2 -1
  400. package/dist/tokens/core.d.ts +360 -0
  401. package/dist/tokens/core.d.ts.map +1 -0
  402. package/dist/tokens/core.js +708 -0
  403. package/dist/tokens/derive.d.ts +1 -1
  404. package/dist/tokens/derive.d.ts.map +1 -1
  405. package/dist/tokens/index.d.ts +5 -373
  406. package/dist/tokens/index.d.ts.map +1 -1
  407. package/dist/tokens/index.js +8 -700
  408. package/dist/tokens/palette.d.ts +2 -6
  409. package/dist/tokens/palette.d.ts.map +1 -1
  410. package/dist/tokens/palette.js +1 -4
  411. package/dist/vite.d.ts +4 -3
  412. package/dist/vite.d.ts.map +1 -1
  413. package/llms.txt +43 -85
  414. package/package.json +77 -170
  415. package/src/agent/ai-sdk-transport.ts +57 -37
  416. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  417. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  418. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  419. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  420. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  421. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  422. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  423. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  424. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  425. package/src/agent/error.ts +43 -0
  426. package/src/agent/foreign.ts +3 -2
  427. package/src/agent/history.ts +2 -107
  428. package/src/agent/id.ts +4 -5
  429. package/src/agent/index.ts +23 -112
  430. package/src/agent/outcome.ts +3 -56
  431. package/src/agent/part-list.tsx +3 -3
  432. package/src/agent/parts.ts +23 -22
  433. package/src/agent/run-committer.ts +64 -0
  434. package/src/agent/run-records.ts +147 -0
  435. package/src/agent/thread.ts +24 -231
  436. package/src/agent/transport.ts +6 -96
  437. package/src/agent/use-agent-thread-runs.ts +364 -199
  438. package/src/charts/BandStrip.tsx +276 -0
  439. package/src/charts/Bars.tsx +141 -0
  440. package/src/charts/CartesianChart.tsx +206 -0
  441. package/src/charts/ChartCard.tsx +178 -0
  442. package/src/charts/Donut.tsx +256 -0
  443. package/src/charts/DualPanel.tsx +326 -0
  444. package/src/charts/Heatmap.tsx +282 -0
  445. package/src/charts/Lines.tsx +151 -0
  446. package/src/charts/MirroredBars.tsx +303 -0
  447. package/src/charts/Sparkline.tsx +176 -0
  448. package/src/charts/StackedArea.tsx +80 -0
  449. package/src/charts/box.tsx +96 -0
  450. package/src/charts/card-context.ts +11 -0
  451. package/src/charts/chart-box.module.css +64 -0
  452. package/src/charts/chart-box.module.css.d.ts +12 -0
  453. package/src/charts/chart-card.module.css +25 -0
  454. package/src/charts/chart-card.module.css.d.ts +8 -0
  455. package/src/charts/chart-legend.module.css +38 -0
  456. package/src/charts/chart-legend.module.css.d.ts +10 -0
  457. package/src/charts/compile.ts +585 -0
  458. package/src/charts/cursor.ts +282 -0
  459. package/src/charts/curves.ts +111 -0
  460. package/src/charts/donut.module.css +54 -0
  461. package/src/charts/donut.module.css.d.ts +9 -0
  462. package/src/charts/host.tsx +60 -0
  463. package/src/charts/index.ts +41 -178
  464. package/src/charts/legend.tsx +204 -0
  465. package/src/charts/marks.ts +201 -0
  466. package/src/charts/panel.tsx +227 -0
  467. package/src/charts/scales.ts +237 -0
  468. package/src/charts/sizing.ts +47 -0
  469. package/src/charts/state.tsx +80 -0
  470. package/src/charts/theme.ts +65 -0
  471. package/src/charts/types.ts +242 -0
  472. package/src/cli/audit-allows.ts +8 -30
  473. package/src/cli/config.ts +14 -43
  474. package/src/cli/doctor-upgrade.ts +392 -0
  475. package/src/cli/doctor.ts +120 -68
  476. package/src/cli/help.ts +2 -4
  477. package/src/cli/index.ts +161 -276
  478. package/src/cli/init.ts +60 -37
  479. package/src/cli/sync.ts +13 -45
  480. package/src/cli/tokens-css.ts +7 -28
  481. package/src/commands/ShortcutsHelp.tsx +8 -9
  482. package/src/commands/define-commands.ts +16 -43
  483. package/src/commands/define-overlays.ts +12 -36
  484. package/src/commands/index.ts +11 -94
  485. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  486. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  487. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  488. package/src/commands/notifications/notify.tsx +158 -0
  489. package/src/{notifications → commands/notifications}/store.ts +10 -2
  490. package/src/commands/projectors.ts +5 -225
  491. package/src/commands/shell-bridge.ts +5 -5
  492. package/src/commands/shortcut-format.ts +5 -4
  493. package/src/common/errors.ts +3 -3
  494. package/src/common/use-measured-widths.ts +6 -3
  495. package/src/common/validate.ts +2 -2
  496. package/src/content/article-layout.tsx +37 -38
  497. package/src/content/article-model.ts +1 -84
  498. package/src/content/copy-action.tsx +1 -1
  499. package/src/content/glyphs.tsx +1 -1
  500. package/src/content/index.ts +12 -83
  501. package/src/content/markdown.tsx +4 -3
  502. package/src/content/mermaid.tsx +9 -7
  503. package/src/content/slug.ts +1 -16
  504. package/src/content/url-hardening.ts +8 -2
  505. package/src/controls/actions.tsx +24 -1
  506. package/src/controls/enum-filter.tsx +1 -1
  507. package/src/controls/filter-context.tsx +3 -1
  508. package/src/controls/filter-set.tsx +5 -7
  509. package/src/controls/form-layout.tsx +2 -2
  510. package/src/controls/glyphs.tsx +0 -10
  511. package/src/controls/index.ts +13 -64
  512. package/src/controls/multi-select-filter.tsx +5 -4
  513. package/src/controls/number-filter.tsx +8 -4
  514. package/src/controls/range-filter.tsx +5 -4
  515. package/src/controls/search-filter.tsx +25 -19
  516. package/src/controls/select-filter.tsx +5 -4
  517. package/src/controls/sync-button.tsx +18 -20
  518. package/src/controls/toggle-filter.tsx +5 -4
  519. package/src/controls/uncontrolled.ts +12 -0
  520. package/src/controls/view-tabs.tsx +3 -3
  521. package/src/controls-dates/date-range-picker.tsx +1 -1
  522. package/src/controls-dates/index.ts +0 -1
  523. package/src/dashboard/index.ts +7 -48
  524. package/src/dashboard/section.tsx +11 -40
  525. package/src/dashboard/stat-card.tsx +14 -16
  526. package/src/dashboard/widget-header.module.css +9 -7
  527. package/src/dev-dock.tsx +14 -27
  528. package/src/format/date.ts +2 -92
  529. package/src/format/index.ts +7 -53
  530. package/src/format/number.ts +3 -26
  531. package/src/format/shared.ts +2 -3
  532. package/src/forms/index.ts +0 -23
  533. package/src/guard/index.ts +37 -192
  534. package/src/guard/types.ts +6 -19
  535. package/src/index.ts +30 -282
  536. package/src/provider/create-router.tsx +138 -0
  537. package/src/provider/hotkeys.ts +70 -0
  538. package/src/provider/index.tsx +260 -230
  539. package/src/provider/lab-theme.ts +3 -2
  540. package/src/provider/route-transition.ts +199 -0
  541. package/src/provider/spotlight-actions.tsx +69 -0
  542. package/src/provider/test-router.tsx +25 -0
  543. package/src/query-client.ts +4 -22
  544. package/src/router-tanstack/index.ts +18 -112
  545. package/src/router-tanstack/nav.ts +28 -2
  546. package/src/router-tanstack/search-store.ts +9 -2
  547. package/src/router-tanstack/use-nav.ts +47 -13
  548. package/src/shell/app-mobile-nav.tsx +3 -2
  549. package/src/shell/app-sidebar.tsx +1 -1
  550. package/src/shell/aside-docking.ts +1 -1
  551. package/src/shell/index.tsx +61 -20
  552. package/src/shell/page-aside.tsx +47 -23
  553. package/src/shell/page-bar.tsx +3 -3
  554. package/src/shell/page-title.tsx +1 -1
  555. package/src/state.ts +11 -37
  556. package/src/styles.css +107 -7
  557. package/src/surfaces.ts +56 -151
  558. package/src/{data → table}/data-table-state.ts +5 -4
  559. package/src/{data → table}/data-table.tsx +170 -161
  560. package/src/table/index.ts +18 -0
  561. package/src/table/table-features.ts +102 -0
  562. package/src/telemetry.ts +110 -0
  563. package/src/theme/index.ts +22 -47
  564. package/src/theme/theme-toggle.module.css +30 -0
  565. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  566. package/src/theme/theme-toggle.tsx +15 -43
  567. package/src/theme-lab/derive-controls.tsx +5 -3
  568. package/src/theme-lab/derive-state.ts +2 -1
  569. package/src/tokens/core.ts +1163 -0
  570. package/src/tokens/derive.ts +1 -1
  571. package/src/tokens/index.ts +14 -1181
  572. package/src/tokens/palette.ts +3 -7
  573. package/src/vite.ts +3 -3
  574. package/agent/templates/CLAUDE-block.md.tpl +0 -40
  575. package/agent/templates/query-client.ts.tpl +0 -26
  576. package/dist/agent/adapter.d.ts +0 -150
  577. package/dist/agent/adapter.d.ts.map +0 -1
  578. package/dist/agent/adapter.js +0 -482
  579. package/dist/agent/use-agent-stream.d.ts +0 -35
  580. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  581. package/dist/agent/use-agent-stream.js +0 -59
  582. package/dist/agent-chat/composer.d.ts.map +0 -1
  583. package/dist/agent-chat/index.d.ts +0 -31
  584. package/dist/agent-chat/index.d.ts.map +0 -1
  585. package/dist/agent-chat/index.js +0 -19
  586. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  587. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  588. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  589. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  590. package/dist/agent-chat/thread-detail-panel.js +0 -115
  591. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  592. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  593. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  594. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  595. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  596. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  597. package/dist/agent-chat/thread-workspace.js +0 -153
  598. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  599. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  600. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  601. package/dist/charts/cursor/resolve.d.ts +0 -75
  602. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  603. package/dist/charts/cursor/resolve.js +0 -91
  604. package/dist/charts/cursor/scope.d.ts +0 -20
  605. package/dist/charts/cursor/scope.d.ts.map +0 -1
  606. package/dist/charts/cursor/scope.js +0 -20
  607. package/dist/charts/cursor/store.d.ts +0 -35
  608. package/dist/charts/cursor/store.d.ts.map +0 -1
  609. package/dist/charts/cursor/store.js +0 -25
  610. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  611. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  612. package/dist/charts/cursor/touch-pin.js +0 -79
  613. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  614. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  615. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  616. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  617. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  618. package/dist/charts/hooks/use-hysteresis.js +0 -12
  619. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  620. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  621. package/dist/charts/hooks/useBandPlot.js +0 -178
  622. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  623. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  624. package/dist/charts/hooks/useChartCursor.js +0 -200
  625. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  626. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  627. package/dist/charts/hooks/useChartSize.js +0 -8
  628. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  629. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  630. package/dist/charts/kinds/BandStrip.js +0 -241
  631. package/dist/charts/kinds/Bars.d.ts +0 -141
  632. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  633. package/dist/charts/kinds/Bars.js +0 -343
  634. package/dist/charts/kinds/Donut.d.ts +0 -77
  635. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  636. package/dist/charts/kinds/Donut.js +0 -245
  637. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  638. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  639. package/dist/charts/kinds/DualPanel.js +0 -471
  640. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  641. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  642. package/dist/charts/kinds/Heatmap.js +0 -243
  643. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  644. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  645. package/dist/charts/kinds/MirroredBars.js +0 -292
  646. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  647. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  648. package/dist/charts/kinds/MultiLine.js +0 -176
  649. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  650. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  651. package/dist/charts/kinds/StackedArea.js +0 -135
  652. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  653. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  654. package/dist/charts/kinds/ZonedLine.js +0 -155
  655. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  656. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  657. package/dist/charts/kinds/band-chrome.js +0 -71
  658. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  659. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  660. package/dist/charts/kinds/donut-layout.js +0 -52
  661. package/dist/charts/layout/auto-margin.d.ts +0 -122
  662. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  663. package/dist/charts/layout/auto-margin.js +0 -81
  664. package/dist/charts/layout/end-labels.d.ts +0 -64
  665. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  666. package/dist/charts/layout/end-labels.js +0 -76
  667. package/dist/charts/layout/log-ticks.d.ts +0 -27
  668. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  669. package/dist/charts/layout/log-ticks.js +0 -42
  670. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  671. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  672. package/dist/charts/primitives/AreaGradient.js +0 -13
  673. package/dist/charts/primitives/Axes.d.ts +0 -83
  674. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  675. package/dist/charts/primitives/Axes.js +0 -168
  676. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  677. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  678. package/dist/charts/primitives/CartesianChart.js +0 -549
  679. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  680. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  681. package/dist/charts/primitives/ChartCard.js +0 -143
  682. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  683. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  684. package/dist/charts/primitives/ChartFrame.js +0 -241
  685. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  686. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  687. package/dist/charts/primitives/ChartLegend.js +0 -292
  688. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  689. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  690. package/dist/charts/primitives/ChartPending.js +0 -117
  691. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  692. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  693. package/dist/charts/primitives/ChartTooltip.js +0 -197
  694. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  695. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  696. package/dist/charts/primitives/Crosshair.js +0 -23
  697. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  698. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  699. package/dist/charts/primitives/HatchPattern.js +0 -31
  700. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  701. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  702. package/dist/charts/primitives/HoverOverlay.js +0 -72
  703. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  704. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  705. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  706. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  707. package/dist/charts/primitives/XZoneRects.js +0 -65
  708. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  709. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  710. package/dist/charts/primitives/ZoneRects.js +0 -30
  711. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  712. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  713. package/dist/charts/primitives/chart-card-context.js +0 -18
  714. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  715. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  716. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  717. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  718. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  719. package/dist/charts/primitives/chart-layout.js +0 -175
  720. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  721. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  722. package/dist/charts/primitives/chart-tier.js +0 -44
  723. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  724. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  725. package/dist/charts/primitives/legend-disclosure.js +0 -153
  726. package/dist/charts/series.d.ts +0 -189
  727. package/dist/charts/series.d.ts.map +0 -1
  728. package/dist/charts/series.js +0 -84
  729. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  730. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  731. package/dist/charts/sparklines/BarSparkline.js +0 -53
  732. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  733. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  734. package/dist/charts/sparklines/LineSparkline.js +0 -51
  735. package/dist/charts/sparklines/index.d.ts +0 -3
  736. package/dist/charts/sparklines/index.d.ts.map +0 -1
  737. package/dist/charts/sparklines/index.js +0 -6
  738. package/dist/charts/utils/domain.d.ts +0 -35
  739. package/dist/charts/utils/domain.d.ts.map +0 -1
  740. package/dist/charts/utils/domain.js +0 -12
  741. package/dist/charts/utils/format.d.ts +0 -8
  742. package/dist/charts/utils/format.d.ts.map +0 -1
  743. package/dist/charts/utils/format.js +0 -20
  744. package/dist/charts/utils/measure-text.d.ts +0 -25
  745. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  746. package/dist/charts/utils/measure-text.js +0 -64
  747. package/dist/charts/utils/ticks.d.ts +0 -103
  748. package/dist/charts/utils/ticks.d.ts.map +0 -1
  749. package/dist/charts/utils/ticks.js +0 -92
  750. package/dist/commands/overlays-mount.d.ts +0 -122
  751. package/dist/commands/overlays-mount.d.ts.map +0 -1
  752. package/dist/commands/overlays-mount.js +0 -125
  753. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  754. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  755. package/dist/commands/useCommandHotkeys.js +0 -45
  756. package/dist/content/article-actions.d.ts +0 -39
  757. package/dist/content/article-actions.d.ts.map +0 -1
  758. package/dist/content/article-actions.js +0 -28
  759. package/dist/content/article-card.d.ts +0 -58
  760. package/dist/content/article-card.d.ts.map +0 -1
  761. package/dist/content/article-card.js +0 -79
  762. package/dist/content/article-card.module.css +0 -111
  763. package/dist/content/mdx.d.ts +0 -20
  764. package/dist/content/mdx.d.ts.map +0 -1
  765. package/dist/content/mdx.js +0 -64
  766. package/dist/controls/compare-filter.d.ts +0 -42
  767. package/dist/controls/compare-filter.d.ts.map +0 -1
  768. package/dist/controls/compare-filter.js +0 -38
  769. package/dist/controls/slider-control.d.ts +0 -36
  770. package/dist/controls/slider-control.d.ts.map +0 -1
  771. package/dist/controls/slider-control.js +0 -64
  772. package/dist/dashboard/widget-grid.d.ts +0 -27
  773. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  774. package/dist/dashboard/widget-grid.js +0 -40
  775. package/dist/dashboard/widget-grid.module.css +0 -69
  776. package/dist/data/data-table-state.d.ts.map +0 -1
  777. package/dist/data/data-table.d.ts.map +0 -1
  778. package/dist/data/query-branch.d.ts.map +0 -1
  779. package/dist/data/table.d.ts +0 -24
  780. package/dist/data/table.d.ts.map +0 -1
  781. package/dist/data/virtual-list.d.ts +0 -133
  782. package/dist/data/virtual-list.d.ts.map +0 -1
  783. package/dist/data/virtual-list.js +0 -157
  784. package/dist/data/virtual.d.ts +0 -21
  785. package/dist/data/virtual.d.ts.map +0 -1
  786. package/dist/data/virtual.js +0 -4
  787. package/dist/forms/FormErrorSummary.d.ts +0 -30
  788. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  789. package/dist/forms/FormErrorSummary.js +0 -30
  790. package/dist/forms/use-field-array.d.ts +0 -60
  791. package/dist/forms/use-field-array.d.ts.map +0 -1
  792. package/dist/forms/use-field-array.js +0 -20
  793. package/dist/forms/use-form-draft.d.ts +0 -76
  794. package/dist/forms/use-form-draft.d.ts.map +0 -1
  795. package/dist/forms/use-form-draft.js +0 -92
  796. package/dist/forms/use-form-submit.d.ts +0 -88
  797. package/dist/forms/use-form-submit.d.ts.map +0 -1
  798. package/dist/forms/use-form-submit.js +0 -63
  799. package/dist/notifications/bell.d.ts.map +0 -1
  800. package/dist/notifications/center.d.ts.map +0 -1
  801. package/dist/notifications/define-notifications.d.ts.map +0 -1
  802. package/dist/notifications/index.d.ts +0 -40
  803. package/dist/notifications/index.d.ts.map +0 -1
  804. package/dist/notifications/index.js +0 -54
  805. package/dist/notifications/mount-guard.d.ts +0 -8
  806. package/dist/notifications/mount-guard.d.ts.map +0 -1
  807. package/dist/notifications/mount-guard.js +0 -18
  808. package/dist/notifications/notify.d.ts +0 -149
  809. package/dist/notifications/notify.d.ts.map +0 -1
  810. package/dist/notifications/notify.js +0 -171
  811. package/dist/notifications/store.d.ts.map +0 -1
  812. package/dist/provider/connectivity-indicator.d.ts +0 -13
  813. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  814. package/dist/provider/connectivity-indicator.js +0 -205
  815. package/dist/provider/connectivity-provider.d.ts +0 -7
  816. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  817. package/dist/provider/connectivity-provider.js +0 -128
  818. package/dist/provider/connectivity-types.d.ts +0 -36
  819. package/dist/provider/connectivity-types.d.ts.map +0 -1
  820. package/dist/provider/use-connectivity.d.ts +0 -3
  821. package/dist/provider/use-connectivity.d.ts.map +0 -1
  822. package/dist/provider/use-connectivity.js +0 -14
  823. package/dist/query-devtools.d.ts +0 -21
  824. package/dist/query-devtools.d.ts.map +0 -1
  825. package/dist/query-devtools.js +0 -13
  826. package/src/agent/adapter.ts +0 -945
  827. package/src/agent/use-agent-stream.ts +0 -154
  828. package/src/agent-chat/index.ts +0 -54
  829. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  830. package/src/agent-chat/thread-workspace.tsx +0 -279
  831. package/src/charts/cursor/resolve.ts +0 -198
  832. package/src/charts/cursor/scope.tsx +0 -35
  833. package/src/charts/cursor/store.ts +0 -58
  834. package/src/charts/cursor/touch-pin.ts +0 -138
  835. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  836. package/src/charts/hooks/use-hysteresis.ts +0 -26
  837. package/src/charts/hooks/useBandPlot.ts +0 -383
  838. package/src/charts/hooks/useChartCursor.ts +0 -367
  839. package/src/charts/hooks/useChartSize.ts +0 -35
  840. package/src/charts/kinds/BandStrip.tsx +0 -449
  841. package/src/charts/kinds/Bars.tsx +0 -589
  842. package/src/charts/kinds/Donut.tsx +0 -368
  843. package/src/charts/kinds/DualPanel.tsx +0 -712
  844. package/src/charts/kinds/Heatmap.tsx +0 -396
  845. package/src/charts/kinds/MirroredBars.tsx +0 -469
  846. package/src/charts/kinds/MultiLine.tsx +0 -322
  847. package/src/charts/kinds/StackedArea.tsx +0 -267
  848. package/src/charts/kinds/ZonedLine.tsx +0 -301
  849. package/src/charts/kinds/band-chrome.tsx +0 -91
  850. package/src/charts/kinds/donut-layout.ts +0 -82
  851. package/src/charts/layout/auto-margin.ts +0 -242
  852. package/src/charts/layout/end-labels.ts +0 -135
  853. package/src/charts/layout/log-ticks.ts +0 -90
  854. package/src/charts/primitives/AreaGradient.tsx +0 -26
  855. package/src/charts/primitives/Axes.tsx +0 -271
  856. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  857. package/src/charts/primitives/ChartCard.tsx +0 -280
  858. package/src/charts/primitives/ChartFrame.tsx +0 -493
  859. package/src/charts/primitives/ChartLegend.tsx +0 -422
  860. package/src/charts/primitives/ChartPending.tsx +0 -243
  861. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  862. package/src/charts/primitives/Crosshair.tsx +0 -43
  863. package/src/charts/primitives/HatchPattern.tsx +0 -55
  864. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  865. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  866. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  867. package/src/charts/primitives/XZoneRects.tsx +0 -132
  868. package/src/charts/primitives/ZoneRects.tsx +0 -67
  869. package/src/charts/primitives/chart-card-context.ts +0 -46
  870. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  871. package/src/charts/primitives/chart-layout.ts +0 -318
  872. package/src/charts/primitives/chart-tier.tsx +0 -76
  873. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  874. package/src/charts/series.ts +0 -276
  875. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  876. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  877. package/src/charts/sparklines/index.ts +0 -2
  878. package/src/charts/theme.tsx +0 -53
  879. package/src/charts/utils/domain.ts +0 -41
  880. package/src/charts/utils/format.ts +0 -19
  881. package/src/charts/utils/measure-text.ts +0 -109
  882. package/src/charts/utils/ticks.ts +0 -239
  883. package/src/commands/overlays-mount.tsx +0 -333
  884. package/src/commands/useCommandHotkeys.ts +0 -114
  885. package/src/content/article-actions.ts +0 -72
  886. package/src/content/article-card.module.css +0 -111
  887. package/src/content/article-card.tsx +0 -174
  888. package/src/content/mdx.tsx +0 -127
  889. package/src/controls/compare-filter.tsx +0 -81
  890. package/src/controls/slider-control.tsx +0 -159
  891. package/src/dashboard/widget-grid.module.css +0 -69
  892. package/src/dashboard/widget-grid.tsx +0 -146
  893. package/src/data/table.ts +0 -39
  894. package/src/data/virtual-list.tsx +0 -356
  895. package/src/data/virtual.ts +0 -26
  896. package/src/forms/FormErrorSummary.tsx +0 -71
  897. package/src/forms/use-field-array.ts +0 -94
  898. package/src/forms/use-form-draft.ts +0 -262
  899. package/src/forms/use-form-submit.ts +0 -199
  900. package/src/notifications/index.ts +0 -88
  901. package/src/notifications/mount-guard.ts +0 -38
  902. package/src/notifications/notify.tsx +0 -379
  903. package/src/provider/connectivity-indicator.tsx +0 -267
  904. package/src/provider/connectivity-provider.tsx +0 -189
  905. package/src/provider/connectivity-types.ts +0 -42
  906. package/src/provider/use-connectivity.ts +0 -26
  907. package/src/query-devtools.tsx +0 -40
  908. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  909. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  910. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  911. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  912. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  913. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  914. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  915. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  916. /package/dist/{data → table}/data-table.module.css +0 -0
  917. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  918. /package/dist/{data → table}/query-branch.d.ts +0 -0
  919. /package/dist/{data → table}/query-branch.js +0 -0
  920. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  921. /package/src/{data → table}/data-table.module.css +0 -0
  922. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  923. /package/src/{data → table}/query-branch.ts +0 -0
package/src/cli/index.ts CHANGED
@@ -14,6 +14,7 @@ import {
14
14
  readFileSync,
15
15
  rmdirSync,
16
16
  statSync,
17
+ realpathSync,
17
18
  unlinkSync,
18
19
  writeFileSync,
19
20
  } from 'node:fs'
@@ -56,9 +57,7 @@ const GUARD_PASSTHROUGH = {
56
57
  rawHtmlLayout: true,
57
58
  inlineSpacing: true,
58
59
  inlineDisplay: true,
59
- rawVisxAxis: true,
60
60
  rawMotionValue: true,
61
- chartMissingAriaLabel: true,
62
61
  rawFormControl: true,
63
62
  sub16InputFont: true,
64
63
  severity: true,
@@ -84,13 +83,9 @@ export function resolveGuardConfig(cfg: BasaltConfig, profile: DoctorProfile): G
84
83
  }
85
84
 
86
85
  /**
87
- * The one consumer series path — the DESIGN.md template's `{{SERIES_MODULE_PATH}}`, the default
88
- * scan exemption, and the skills' prose all resolve through this single function.
89
- *
90
- * Derived from the FIRST configured root (argo's convention: `<root>/lib/series.ts`), not a fixed
91
- * `src/lib/series.ts` — a monorepo that correctly sets `roots: ['apps/web/src']` has no top-level
92
- * `src/`, so a hardcoded default would seed a DESIGN.md pointing at a path that cannot exist and
93
- * silently exempt nothing. `seriesModulePath` still overrides for a layout that isn't `<root>/lib/`.
86
+ * The one consumer series path (DESIGN.md's `{{SERIES_MODULE_PATH}}`, the default scan exemption,
87
+ * the skills' prose). Derived from the FIRST configured root (`<root>/lib/series.ts`), since a
88
+ * monorepo with `roots: ['apps/web/src']` has no top-level `src/`. `seriesModulePath` overrides.
94
89
  */
95
90
  function resolveSeriesModulePath(cfg: BasaltConfig): string {
96
91
  if (cfg.seriesModulePath !== undefined) return cfg.seriesModulePath
@@ -125,14 +120,8 @@ export const SERIES_MODULE_HINT_RE = /(series|palette)\.tsx?$/i
125
120
  const SEVERITY_VALUES: readonly string[] = ['warn', 'error']
126
121
 
127
122
  /**
128
- * Drop `basalt.severity` entries whose value is not `'warn'` / `'error'`, loudly.
129
- *
130
- * This is the one config field where a typo REMOVES enforcement rather than failing: package.json
131
- * is untyped at runtime, and `"warning"` would stamp findings with a value matching neither the
132
- * error bucket (which fails the build) nor the warn bucket (which prints them) — the kind would
133
- * vanish and `check-theme` would exit 0 as if the tree were clean. Dropping the entry falls the
134
- * kind back to its default, so the failure direction of a typo is "stricter than you meant, and
135
- * told about it" instead of "silently unguarded".
123
+ * Drop `basalt.severity` entries whose value is not `'warn'` / `'error'`, loudly: a typo there would
124
+ * silently REMOVE enforcement. The kind falls back to its default instead (stricter, and told about).
136
125
  */
137
126
  function sanitizeSeverity(cfg: BasaltConfig): BasaltConfig {
138
127
  const raw: unknown = cfg.severity
@@ -179,17 +168,10 @@ export function readBasaltConfig(cwd: string): BasaltConfig {
179
168
  }
180
169
 
181
170
  /**
182
- * Extensions the walker collects. `html?`/`webmanifest` close argo's finding that raw hex ships in
183
- * `index.html`'s `theme-color` and the webmanifest's `theme_color`/`background_color` — the two
184
- * places whose colors nothing re-derives on a scheme change, and which the scan never reached.
185
- *
186
- * `astro`/`jsx`/`vue` close the same gap one component layer up. rollhook's marketing site is
187
- * Astro: `apps/marketing/src` holds two `.astro` templates that are its ENTIRE markup layer, and
188
- * check-theme reported a clean 4-file scan without ever opening either. The colour and typography
189
- * kinds apply to them exactly as they do to `.html`, which was already scanned; `.jsx` and `.vue`
190
- * were missing from the same regex, so a plain-JS or Vue consumer was unguarded end to end.
171
+ * Extensions the walker collects: source (`.astro`/`.jsx`/`.vue` and the `.mjs`/`.cjs`/`.mts`/`.cts`
172
+ * module spellings) plus `html?`/`webmanifest`, where raw hex ships in `theme-color` and friends.
191
173
  */
192
- const SCANNABLE_EXT = /\.(?:tsx?|jsx|astro|vue|css|html?|webmanifest)$/
174
+ const SCANNABLE_EXT = /\.(?:tsx?|jsx|[cm][jt]s|astro|vue|css|html?|webmanifest)$/
193
175
 
194
176
  /**
195
177
  * Recursively collect scannable files under a root, skipping dependency/build dirs. Node+Bun-safe.
@@ -236,14 +218,10 @@ export function relativePosix(fromDir: string, toPath: string): string {
236
218
  }
237
219
 
238
220
  /**
239
- * Where `basalt-ui` actually resolves from, seen from a consumer directory.
240
- *
241
- * Every seam basalt seeds (oxlint/lefthook `extends`, the CI `run:` steps) used to hardcode
242
- * `./node_modules/basalt-ui` at the repo ROOT; under bun's isolated linker a package that declares
243
- * basalt a peer + devDependency gets it at `<pkg>/node_modules` and NOTHING at the root, so all three
244
- * silently failed to resolve and `bunx` fetched a second, different copy. Resolution therefore walks
245
- * OUTWARD from the consumer dir, then across the workspace packages — and every caller renders its
246
- * paths from the answer rather than assuming the root.
221
+ * Where `basalt-ui` actually resolves from, seen from a consumer directory. Under bun's isolated
222
+ * linker a package that declares basalt gets it at `<pkg>/node_modules` and nothing at the root, so
223
+ * resolution walks OUTWARD from the consumer dir, then across workspace packages, and every caller
224
+ * renders its paths from the answer rather than assuming the root.
247
225
  */
248
226
  export type BasaltInstall = {
249
227
  /** Absolute path of the resolved `node_modules/basalt-ui` directory, or null when unresolvable. */
@@ -303,14 +281,9 @@ export function shippedAssetPath(install: BasaltInstall, fromDir: string, asset:
303
281
  }
304
282
 
305
283
  /**
306
- * Which directory a project-scoped command (`check-theme`, `doctor`) should actually read.
307
- *
308
- * One resolver, nothing inferred: `BASALT_CWD` when set, else the invocation cwd. A monorepo
309
- * package whose install lives elsewhere sets `BASALT_CWD` explicitly (or the invoking script's
310
- * `root:`/`cwd` does) rather than relying on workspace-glob discovery or an ancestor/descendant
311
- * walk — both were deleted (see `resolveProjectDir`'s own doc below) as multi-repo speculation for
312
- * a single-owner fleet where every consumer already runs its own commands from its own directory.
313
- * The scan scope within that directory is `basalt.roots` in `package.json` (default `src`).
284
+ * Which directory a project-scoped command (`check-theme`, `doctor`) reads: `BASALT_CWD` when set,
285
+ * else the invocation cwd. Nothing is inferred (workspace discovery was deleted). The scan scope
286
+ * within it is `basalt.roots` in `package.json` (default `src`).
314
287
  */
315
288
  type ProjectResolution = {
316
289
  /** The directory to read. Equals the invocation cwd unless BASALT_CWD relocated it. */
@@ -338,7 +311,7 @@ export function resolveProjectDir(cwd: string): ProjectResolution {
338
311
  /**
339
312
  * Which shape of consumer a project-scoped command is looking at — DECLARED, never inferred
340
313
  * (`--tokens-only`, or `"basalt": { "profile": "tokens-only" }`), because the answer switches the
341
- * Mantine-remedy guard kinds off. Why that direction: package CLAUDE.md § CLI.
314
+ * Mantine-remedy guard kinds off. Why that direction: package MAINTAINING.md § CLI.
342
315
  */
343
316
  export function declaredProfile(cfg: BasaltConfig, flags: readonly string[]): DoctorProfile {
344
317
  if (flags.includes('--tokens-only')) return 'tokens-only'
@@ -398,15 +371,9 @@ export function scannableFiles(cwd: string, cfg: BasaltConfig): string[] {
398
371
  }
399
372
 
400
373
  /**
401
- * The app-shell files that sit BESIDE a source root rather than inside it — `index.html` and
402
- * anything under `public/`.
403
- *
404
- * Widening the walker's extension filter alone would still have missed every one of them: argo
405
- * configures `roots: ['apps/dashboard/src']`, while the raw hex lives in `apps/dashboard/index.html`
406
- * and `apps/dashboard/public/site.webmanifest`. Both locations are the Vite convention basalt's own
407
- * `basaltViteConfig`/`basaltAppPlugin` assume, so deriving them from each root's parent needs no
408
- * config and holds for a monorepo package the same way it holds at a repo root. Nothing else in the
409
- * parent is walked — a sibling `docs/` full of throwaway HTML stays unscanned.
374
+ * The app-shell files that sit BESIDE a source root rather than inside it: `index.html` and anything
375
+ * under `public/` (argo's raw hex lives in `apps/dashboard/index.html`, with `roots` on `…/src`).
376
+ * Nothing else in the parent is walked.
410
377
  */
411
378
  function appShellFiles(rootAbs: string): string[] {
412
379
  const appDir = dirname(rootAbs)
@@ -447,23 +414,14 @@ export function waiverHintFor(relPath: string, profile: DoctorProfile): string {
447
414
  // ──────────────────────────────────────────────────────────────────────────────
448
415
 
449
416
  /**
450
- * How a file the framework writes into a consumer repo is owned. Two modes, one question:
451
- * **does Claude read this file?**
417
+ * How a file the framework writes into a consumer repo is owned:
418
+ * - `managed`: basalt owns it (what Claude reads: .claude/rules/*, .claude/skills/*, the AGENTS.md
419
+ * block). sync refreshes it; a local edit is skipped and reported (`--force` overwrites); `--check`
420
+ * exits 1 on drift.
421
+ * - `seed`: written once if absent, then the consumer's. sync never overwrites it or reports drift.
452
422
  *
453
- * - `managed` : basalt owns it. sync refreshes it to the shipped version; a local edit is skipped
454
- * and reported (`--force` overwrites); `--check` exits 1 on drift. Applies to exactly
455
- * what Claude reads (.claude/rules/*, .claude/skills/*, the CLAUDE.md block) —
456
- * Claude Code cannot load rules or skills from node_modules, and that platform limit
457
- * is the only reason anything is copied at all. The sync diff is the review gate.
458
- * - `seed` : written once if absent, then owned entirely by the consumer. sync never overwrites
459
- * it and never reports drift (a starting point, not a managed mirror). Everything a
460
- * machine reads is a seed, and a good seed's content is a REFERENCE (`extends` into
461
- * node_modules/basalt-ui/configs/*), not a copy, so the toolchain auto-updates with
462
- * the package while the consumer still owns the file.
463
- *
464
- * A managed file with `markers: true` is spliced as a `<!-- basalt:begin -->…<!-- basalt:end -->`
465
- * region inside a host file the consumer otherwise owns (CLAUDE.md) — not a third mode, just
466
- * managed ownership scoped to a region.
423
+ * `markers: true` splices a managed `<!-- basalt:begin -->…<!-- basalt:end -->` region into a host
424
+ * file the consumer otherwise owns (AGENTS.md).
467
425
  */
468
426
  type Mode = 'managed' | 'seed'
469
427
 
@@ -518,19 +476,26 @@ type TemplateVars = {
518
476
  BASALT_BIN: string
519
477
  }
520
478
 
521
- // The block markers the CLAUDE.md template emits. The begin marker carries the framework version
479
+ // The block markers the AGENTS.md template emits. The begin marker carries the framework version
522
480
  // (`<!-- basalt:begin 1.0.0 -->`), so the region is matched by the begin PREFIX, not an exact string.
523
481
  const BLOCK_BEGIN_PREFIX = '<!-- basalt:begin'
524
482
  const BLOCK_END = '<!-- basalt:end -->'
525
483
  export const MANIFEST_PATH = '.basalt/manifest.json'
484
+ /** The host file the managed block is spliced into (and its manifest key). */
485
+ export const AGENTS_MD = 'AGENTS.md'
486
+ /** A `CLAUDE.md` shadows {@link AGENTS_MD} unless it imports it — `doctor` warns on one. */
487
+ export const LEGACY_BLOCK_HOST = 'CLAUDE.md'
526
488
 
527
489
  export function sha256(text: string): string {
528
490
  return createHash('sha256').update(text, 'utf8').digest('hex')
529
491
  }
530
492
 
531
493
  export function readIfExists(abs: string): string | null {
532
- if (!existsSync(abs)) return null
533
- return readFileSync(abs, 'utf8')
494
+ try {
495
+ return readFileSync(abs, 'utf8')
496
+ } catch {
497
+ return null // absent, a directory, unreadable or raced away: callers treat all four as "not there"
498
+ }
534
499
  }
535
500
 
536
501
  /** Read a shipped source asset from the package root; null if the sibling hasn't authored it yet. */
@@ -561,14 +526,9 @@ export function readFrameworkVersion(pkgRoot: string): string {
561
526
  }
562
527
 
563
528
  /**
564
- * How a seeded script, a seeded CI step, or a piece of doctor advice should invoke the CLI.
565
- *
566
- * The LOCAL bin wherever basalt actually resolved; `bunx basalt-ui` only as the pre-install
567
- * fallback. `bunx` does not re-resolve a package it has cached, so a seeded `bunx basalt-ui` lets a
568
- * consumer pin one version and be gated by another — which is exactly what happened across three
569
- * consumer repos, in CI, in package.json scripts and in a `.claude` PreToolUse hook, all of them
570
- * placed here. Every emitted invocation goes through this function so there is one place for it to
571
- * be right.
529
+ * How a seeded script, CI step or piece of doctor advice invokes the CLI: the LOCAL bin wherever
530
+ * basalt resolved, `bunx basalt-ui` only as the pre-install fallback (`bunx` does not re-resolve a
531
+ * cached package, so it lets a consumer pin one version and be gated by another).
572
532
  */
573
533
  export function basaltBinCommand(install: BasaltInstall, cwd: string): string {
574
534
  if (install.dir === null) return 'bunx basalt-ui'
@@ -633,19 +593,66 @@ function applyBlock(host: string, block: string): string {
633
593
  return base.length === 0 ? `${block.trim()}\n` : `${base}\n\n${block.trim()}\n`
634
594
  }
635
595
 
596
+ /** True when both paths resolve to one file (a symlinked pair). A missing path is simply "no". */
597
+ export function sameFile(a: string, b: string): boolean {
598
+ try {
599
+ return realpathSync(a) === realpathSync(b)
600
+ } catch (error) {
601
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') return false
602
+ throw error
603
+ }
604
+ }
605
+
606
+ /** True when the host text carries a managed block (begin marker present). */
607
+ export function hasManagedBlock(host: string | null): boolean {
608
+ return host !== null && host.includes(BLOCK_BEGIN_PREFIX)
609
+ }
610
+
636
611
  /**
637
- * Explicit `--with-router` / `--with-query` CLI flags force-include a router/query scaffold even
638
- * when the peer isn't detected in the consumer's package.json yet (e.g. it's about to be added).
612
+ * The block region of a host, or why it cannot be read: duplicate begin markers, or a begin marker
613
+ * with no end. Read by `doctor` to say whether a leftover `CLAUDE.md` is well-formed.
639
614
  */
640
- export type ScaffoldFlags = {
641
- withRouter?: boolean
642
- withQuery?: boolean
643
- /** `--merge-lint`: splice the shipped preset's `extends` into an `.oxlintrc.json` init would keep. */
644
- mergeLint?: boolean
615
+ export function scanBlock(host: string): {
616
+ region: { start: number; end: number } | null
617
+ problem: string | null
618
+ } {
619
+ const begin = hasManagedBlock(host)
620
+ if (!begin && !host.includes(BLOCK_END)) return { region: null, problem: null }
621
+ const bad = (problem: string): { region: null; problem: string } => ({ region: null, problem })
622
+ if (!begin) return bad(`\`${BLOCK_END}\` with no \`${BLOCK_BEGIN_PREFIX}\``)
623
+ let region: { start: number; end: number } | null
624
+ try {
625
+ region = findBlockRegion(host)
626
+ } catch (error) {
627
+ return bad((error as Error).message)
628
+ }
629
+ if (region === null) return bad(`\`${BLOCK_BEGIN_PREFIX}\` has no matching \`${BLOCK_END}\``)
630
+ // Exactly one end marker, after the begin: an orphan or extra one means the region is a guess.
631
+ if (host.indexOf(BLOCK_END) < region.start || host.indexOf(BLOCK_END, region.end) !== -1) {
632
+ return bad(`an extra or misplaced \`${BLOCK_END}\` outside the basalt block`)
633
+ }
634
+ return { region, problem: null }
645
635
  }
646
636
 
647
- /** Router/query peer presence, resolved from detection + explicit flags. */
648
- export type PeerFlags = { hasRouter: boolean; hasQuery: boolean }
637
+ /** One line that is exactly the `@AGENTS.md` import — not a prose or code-span mention, not `.bak`. */
638
+ export function isAgentsImportLine(line: string): boolean {
639
+ return line.trim() === `@${AGENTS_MD}`
640
+ }
641
+
642
+ /** Whether a `CLAUDE.md` imports `AGENTS.md`, so Claude Code still loads it. */
643
+ export function importsAgentsMd(text: string): boolean {
644
+ return text.split(/\r?\n/).some(isAgentsImportLine)
645
+ }
646
+
647
+ /** Scaffold options. `noMergeLint`: `--no-merge-lint` leaves an existing `.oxlintrc.json` untouched. */
648
+ export type ScaffoldFlags = { noMergeLint?: boolean }
649
+
650
+ /** The router seeds (TanStack Router and Query are required peers of `.`, so they are always written). */
651
+ export const ROUTER_SEED_DESTS = {
652
+ nav: 'src/lib/nav.tsx',
653
+ root: 'src/routes/__root.tsx',
654
+ main: 'src/main.tsx',
655
+ } as const
649
656
 
650
657
  /** True when `pkgName` appears in the consumer's dependencies, devDependencies, or peerDependencies. */
651
658
  function hasDependency(cwd: string, pkgName: string): boolean {
@@ -665,19 +672,6 @@ function hasDependency(cwd: string, pkgName: string): boolean {
665
672
  }
666
673
  }
667
674
 
668
- /**
669
- * Resolves whether the consumer has the optional TanStack router/query peers — auto-detected from
670
- * package.json, or forced via `--with-router` / `--with-query`. Both `basalt-ui init` (for gating
671
- * which seed scaffolds to write) and `basalt-ui sync` (so it doesn't silently re-seed a scaffold whose
672
- * peer was never installed) call this once, up front.
673
- */
674
- export function resolvePeerFlags(cwd: string, flags: ScaffoldFlags): PeerFlags {
675
- return {
676
- hasRouter: flags.withRouter === true || hasDependency(cwd, '@tanstack/react-router'),
677
- hasQuery: flags.withQuery === true || hasDependency(cwd, '@tanstack/react-query'),
678
- }
679
- }
680
-
681
675
  /**
682
676
  * Where the seed engine is running relative to the consumer's git repo — decides which
683
677
  * repo-root-shaped seeds are safe to write. `init`/`sync` compute it once per run via
@@ -693,18 +687,12 @@ export type PlacementFlags = {
693
687
  /** Absolute path of the detected repo root. Meaningful only when `isPackageRepoRoot` is false —
694
688
  * otherwise it equals the package dir and is never read. */
695
689
  repoRoot: string
696
- /** Absolute path of a `query-client.ts` already present elsewhere under the package's `src/` (the
697
- * consumer relocated it — e.g. to `src/lib/query-client.ts`), or null. The seed's OWN
698
- * destination is deliberately excluded here — that exact-path case is handled by the ordinary
699
- * skip-if-exists logic every seed file already goes through, unchanged. */
700
- relocatedQueryClient: string | null
701
690
  }
702
691
 
703
692
  /** The default placement — today's single-package-at-repo-root behaviour, unconditionally. */
704
693
  export const ROOT_PLACEMENT: PlacementFlags = {
705
694
  isPackageRepoRoot: true,
706
695
  repoRoot: '',
707
- relocatedQueryClient: null,
708
696
  }
709
697
 
710
698
  /**
@@ -734,63 +722,17 @@ export function oxlintBinResolves(dir: string): boolean {
734
722
  }
735
723
  }
736
724
 
737
- /**
738
- * First path under `dir` (recursive) whose basename is `filename`, or null. Skips dependency/build
739
- * dirs, mirroring `walkSourceFiles`'s scoping.
740
- */
741
- function findFileNamed(dir: string, filename: string): string | null {
742
- let entries: string[]
743
- try {
744
- entries = readdirSync(dir)
745
- } catch {
746
- return null
747
- }
748
- for (const name of entries) {
749
- if (name === 'node_modules' || name === '.git' || name === 'dist') continue
750
- const abs = resolve(dir, name)
751
- let isDir: boolean
752
- try {
753
- isDir = statSync(abs).isDirectory()
754
- } catch {
755
- continue
756
- }
757
- if (isDir) {
758
- const found = findFileNamed(abs, filename)
759
- if (found !== null) return found
760
- } else if (name === filename) {
761
- return abs
762
- }
763
- }
764
- return null
765
- }
766
-
767
- /**
768
- * Absolute path of a `query-client.ts` living elsewhere under the package's `src/`, or null. The
769
- * seed's own destination is excluded — reseeding on top of a RELOCATED client (the failure this
770
- * exists to prevent) is a different case from the seed's own path already being occupied, which the
771
- * ordinary skip-if-exists logic handles unchanged.
772
- */
773
- function findRelocatedQueryClient(cwd: string): string | null {
774
- const seedAbs = resolve(cwd, 'src/query-client.ts')
775
- const found = findFileNamed(resolve(cwd, 'src'), 'query-client.ts')
776
- return found !== null && found !== seedAbs ? found : null
777
- }
778
-
779
725
  /** Resolve a run's placement flags once, from the consumer cwd. */
780
726
  export function resolvePlacement(cwd: string): PlacementFlags {
781
727
  const repoRoot = findRepoRoot(cwd)
782
728
  return {
783
729
  isPackageRepoRoot: repoRoot === cwd,
784
730
  repoRoot,
785
- relocatedQueryClient: findRelocatedQueryClient(cwd),
786
731
  }
787
732
  }
788
733
 
789
734
  /** The full managed-file manifest. Stable, declarative — the single source of truth for init/sync. */
790
- export function managedFiles(
791
- peers: PeerFlags,
792
- placement: PlacementFlags = ROOT_PLACEMENT,
793
- ): ManagedFile[] {
735
+ export function managedFiles(placement: PlacementFlags = ROOT_PLACEMENT): ManagedFile[] {
794
736
  // ── managed: exactly what Claude reads ──────────────────────────────────────
795
737
  const rules: ManagedFile[] = RULE_NAMES.map((name) => ({
796
738
  dest: `.claude/rules/basalt-${name}.md`,
@@ -809,15 +751,17 @@ export function managedFiles(
809
751
  render: (ctx: RenderContext) => readSource(ctx.pkgRoot, `agent/skills/${name}/SKILL.md`),
810
752
  }))
811
753
 
812
- const claudeBlock: ManagedFile = {
813
- dest: 'CLAUDE.md',
754
+ // AGENTS.md, not CLAUDE.md: Claude Code loads a repo-root AGENTS.md directly, but ANY CLAUDE.md
755
+ // in or above the cwd suppresses it — so the block must not be the reason a CLAUDE.md exists.
756
+ const agentsBlock: ManagedFile = {
757
+ dest: AGENTS_MD,
814
758
  mode: 'managed',
815
759
  markers: true,
816
- source: 'agent/templates/CLAUDE-block.md.tpl',
760
+ source: 'agent/templates/AGENTS-block.md.tpl',
817
761
  // With markers, render() returns the fully-rendered region INCLUDING its begin/end markers.
818
- // The writer splices it into the consumer's host CLAUDE.md at apply time.
762
+ // The writer splices it into the consumer's host AGENTS.md at apply time.
819
763
  render: (ctx) => {
820
- const tpl = readSource(ctx.pkgRoot, 'agent/templates/CLAUDE-block.md.tpl')
764
+ const tpl = readSource(ctx.pkgRoot, 'agent/templates/AGENTS-block.md.tpl')
821
765
  if (tpl === null) return null
822
766
  return fillTemplate(tpl, ctx.vars).trim()
823
767
  },
@@ -908,21 +852,9 @@ export function managedFiles(
908
852
  // ── Seed scaffolds: written by init, never overwritten by sync ─────────────
909
853
  // These are starting-point files owned entirely by the consumer after first write.
910
854
 
911
- /** TanStack Query client bootstrap (seed — consumer-owned after init). */
912
- const queryClient: ManagedFile = {
913
- dest: 'src/query-client.ts',
914
- mode: 'seed',
915
- source: 'agent/templates/query-client.ts.tpl',
916
- render: (ctx) => {
917
- const tpl = readSource(ctx.pkgRoot, 'agent/templates/query-client.ts.tpl')
918
- if (tpl === null) return null
919
- return fillTemplate(tpl, ctx.vars)
920
- },
921
- }
922
-
923
855
  /** TanStack Router root route with QueryClient context wiring (seed — consumer-owned after init). */
924
856
  const rootRoute: ManagedFile = {
925
- dest: 'src/routes/__root.tsx',
857
+ dest: ROUTER_SEED_DESTS.root,
926
858
  mode: 'seed',
927
859
  source: 'agent/templates/__root.tpl',
928
860
  render: (ctx) => {
@@ -932,13 +864,22 @@ export function managedFiles(
932
864
  },
933
865
  }
934
866
 
935
- // `query-client.ts` only needs @tanstack/react-query; `__root.tsx` imports BOTH
936
- // @tanstack/react-router (createRootRouteWithContext) and @tanstack/react-query (the QueryClient
937
- // type) — both are documented optional peers, so seeding either scaffold without its peer(s)
938
- // installed would ship a file with an unresolved import.
939
- const scaffolds: ManagedFile[] = []
940
- if (peers.hasQuery && placement.relocatedQueryClient === null) scaffolds.push(queryClient)
941
- if (peers.hasRouter && peers.hasQuery) scaffolds.push(rootRoute)
867
+ /** The leaf `NAV` module `__root.tsx` imports (seed — consumer-owned after init). */
868
+ const navModule: ManagedFile = {
869
+ dest: ROUTER_SEED_DESTS.nav,
870
+ mode: 'seed',
871
+ source: 'agent/templates/nav.tpl',
872
+ render: (ctx) => readSource(ctx.pkgRoot, 'agent/templates/nav.tpl'),
873
+ }
874
+
875
+ /** The 2.0 entry: mounts the router and declares the `Register` augmentation `defineNav` needs. */
876
+ const mainEntry: ManagedFile = {
877
+ dest: ROUTER_SEED_DESTS.main,
878
+ mode: 'seed',
879
+ source: 'agent/templates/main.tpl',
880
+ render: (ctx) => readSource(ctx.pkgRoot, 'agent/templates/main.tpl'),
881
+ }
882
+ const scaffolds: ManagedFile[] = [navModule, rootRoute, mainEntry]
942
883
 
943
884
  // lefthook.yml / .github/workflows/check.yml are repo-root-shaped: lefthook and GitHub Actions
944
885
  // only ever read config at the repo root, so a package living in a subdirectory (a monorepo's
@@ -946,7 +887,7 @@ export function managedFiles(
946
887
  // lefthook/CI config, and writing over or beside it is worse than not writing at all.
947
888
  const rootTooling: ManagedFile[] = placement.isPackageRepoRoot ? [lefthook, ci] : []
948
889
 
949
- return [...rules, ...skills, claudeBlock, design, oxfmt, ...rootTooling, oxlintrc, ...scaffolds]
890
+ return [...rules, ...skills, agentsBlock, design, oxfmt, ...rootTooling, oxlintrc, ...scaffolds]
950
891
  }
951
892
 
952
893
  /**
@@ -977,13 +918,6 @@ export function placementNotices(cwd: string, placement: PlacementFlags): string
977
918
  'performs for lefthook, and needed for the same reason.',
978
919
  )
979
920
  }
980
- if (placement.relocatedQueryClient !== null) {
981
- out.push(
982
- `skipped src/query-client.ts (found an existing query client at ` +
983
- `${relative(cwd, placement.relocatedQueryClient)}) — import it from there instead of ` +
984
- 're-seeding at the original path.',
985
- )
986
- }
987
921
  return out
988
922
  }
989
923
 
@@ -994,16 +928,9 @@ export type Manifest = {
994
928
  /** dest path → sha256 of the managed unit (file bytes, block body, or stanza) at last write. */
995
929
  files: Record<string, string>
996
930
  /**
997
- * The resolved level-0 spacing scale (`xs`..`xl`, px) at last write — `doctor`'s second
998
- * reconciliation axis, and the only one that reports a change in RENDERED OUTPUT rather than in
999
- * placed files.
1000
- *
1001
- * A retune of the spacing bases moves every surface in every consumer calling
1002
- * `createBasaltTheme()` bare. basalt-ui bans majors by design, so the changelog is the only
1003
- * channel that carries that, and a one-line `feat:` subject cannot convey blast radius: the
1004
- * 1.2.0 retune shipped as "tighten the sidebar, open up components" and went unverified in
1005
- * production for a day because nothing said "every padding moved". Recording the scale makes the
1006
- * move mechanically visible on the next `doctor` run instead of depending on a subject line.
931
+ * The resolved level-0 spacing scale (`xs`..`xl`, px) at last write: `doctor`'s second axis, and
932
+ * the only one that reports a change in RENDERED OUTPUT. A retune of the spacing bases moves every
933
+ * surface in every consumer, which a one-line `feat:` subject cannot convey.
1007
934
  */
1008
935
  spacingScale?: Record<string, number>
1009
936
  }
@@ -1042,8 +969,7 @@ export function readManifest(cwd: string): Manifest {
1042
969
  *
1043
970
  * Scoped to these two patterns on purpose, and never applied to the manifest wholesale: several
1044
971
  * managed/seed entries are legitimately absent from `managedFiles()` for a run (`lefthook.yml` and
1045
- * `check.yml` when the package is not the repo root, `src/query-client.ts` when it was relocated,
1046
- * the scaffolds without their peers). Deleting a dest just because this run did not place it would
972
+ * `check.yml` when the package is not the repo root). Deleting a dest just because this run did not place it would
1047
973
  * remove a consumer's CI workflow on a monorepo.
1048
974
  */
1049
975
  const RETIREABLE_DEST_PATTERNS: readonly RegExp[] = [
@@ -1088,17 +1014,9 @@ export function reportPrune(pruned: PruneResult): void {
1088
1014
 
1089
1015
  /**
1090
1016
  * Delete the managed rule/skill files this basalt version retired, and drop their manifest entries.
1091
- *
1092
- * The 13→6 rule merge (`docs/CONTROLS-SPEC.md` §7) is the case this exists for: nine
1093
- * `.claude/rules/basalt-*.md` files stopped shipping in one minor, and without this a consumer's
1094
- * agent would go on reading `basalt-router.md`'s superseded placement doctrine forever, with
1095
- * `sync --check` reporting green because nothing in the ledger asks about a dest the run no longer
1096
- * places.
1097
- *
1098
- * Same three-way discipline as every other managed unit, so a consumer edit is never discarded
1099
- * silently: an untouched file (matching its recorded hash, raw or normalized) is deleted and its
1100
- * entry dropped; a locally-edited one is LEFT in place, reported, and keeps its entry so
1101
- * `sync --check` stays red and `--force` can still finish the job. `dryRun` is `--check`.
1017
+ * Same three-way discipline as every managed unit: an untouched file is deleted; a locally-edited
1018
+ * one is LEFT in place, reported, and keeps its entry so `sync --check` stays red and `--force` can
1019
+ * finish. `dryRun` is `--check`.
1102
1020
  */
1103
1021
  export function pruneRetiredManagedFiles(
1104
1022
  cwd: string,
@@ -1187,25 +1105,9 @@ export function unitState(file: ManagedFile, cwd: string, ctx: RenderContext): U
1187
1105
  type Classification = 'unchanged' | 'drifted' | 'missing' | 'current'
1188
1106
 
1189
1107
  /**
1190
- * Normalize a managed unit's rendered bytes for the ledger comparison below — makes a delta that is
1191
- * PURELY formatting or a version bump invisible to drift detection, while a real prose/content edit
1192
- * stays fully visible:
1193
- *
1194
- * - Blank out the per-release `BASALT_VERSION` token in a marker's begin line
1195
- * (`<!-- basalt:begin 1.0.1 -->` → `<!-- basalt:begin -->`). It changes on every release and is
1196
- * the only per-release variable that lands INSIDE the hashed region (the rest of
1197
- * `CLAUDE-block.md.tpl` has no other `{{…}}` placeholders today), so stripping it is what lets
1198
- * one normalized rendering stand in for every version of a given template body instead of
1199
- * needing one ledger entry per release. If a future marker template interpolates another
1200
- * per-release var inside its region, extend this normalization the same way.
1201
- * - Trim trailing whitespace per line and collapse every run of blank lines to none. This is the
1202
- * fix for the actual argo repro: lefthook's oxfmt reformats a spliced block (or a whole managed
1203
- * file) AFTER `writeUnit` has already exited and the manifest hash was recorded, so the manifest
1204
- * can never account for the reformat up front — normalizing it away here is the only place that
1205
- * can.
1206
- *
1207
- * Deliberately whitespace-only — word content is untouched, so a genuine hand-edit inside the block
1208
- * still changes the normalized text and still classifies `drifted`.
1108
+ * Normalize a managed unit's rendered bytes for the ledger comparison: blank the per-release version
1109
+ * in a marker's begin line, trim trailing whitespace per line and collapse blank-line runs. A
1110
+ * formatter run or a version bump is invisible to drift detection; a real content edit is not.
1209
1111
  */
1210
1112
  export function normalizeForLedger(text: string): string {
1211
1113
  return text
@@ -1235,21 +1137,12 @@ export function writeUnit(file: ManagedFile, cwd: string, desired: string): stri
1235
1137
  }
1236
1138
 
1237
1139
  /**
1238
- * Classify a managed file against the manifest for a sync run.
1239
- * - missing : the managed unit is absent on disk → recreate.
1140
+ * Classify a managed file against the manifest for a sync run:
1141
+ * - missing : absent on disk → recreate.
1240
1142
  * - current : on disk == desired → nothing to do.
1241
- * - unchanged: on disk matches a KNOWN-SHIPPED rendering of this template (any one is sufficient) —
1242
- * but != desired as-is → safe overwrite:
1243
- * 1. `sha256(current) === manifestHash` — legacy raw-hash path (manifests written before
1244
- * the ledger normalized hold the RAW hash; keep matching so an upgrade never
1245
- * mass-classifies a pristine tree as drifted).
1246
- * 2. `sha256(normalizeForLedger(current)) === manifestHash` — the ledger proper (see
1247
- * `writeUnit`): survives a downstream formatter AND a version bump that changed the
1248
- * template's own words since the manifest entry was written (the argo false positive).
1249
- * 3. `normalizeForLedger(current) === normalizeForLedger(desired)` — same-version
1250
- * fallback when no manifest entry exists at all.
1251
- * - drifted : on disk matches NONE of the above (a real, word-level local edit) → skip unless
1252
- * --force.
1143
+ * - unchanged: on disk matches a KNOWN-SHIPPED rendering (raw manifest hash, normalized manifest
1144
+ * hash, or normalized == normalized desired when no entry exists) → safe overwrite.
1145
+ * - drifted : matches none of them (a real local edit) → skip unless --force.
1253
1146
  */
1254
1147
  export function classify(state: UnitState, manifestHash: string | undefined): Classification {
1255
1148
  if (state.current === null) return 'missing'
@@ -1348,19 +1241,9 @@ function rootCovers(root: string, detected: string): boolean {
1348
1241
  }
1349
1242
 
1350
1243
  /**
1351
- * Read — and when absent and `write` is set, seed — `basalt.roots`.
1352
- *
1353
- * Shared by `init` and `sync` because the key going missing is the SAME false green in both: the
1354
- * built-in `src` default happens to resolve from a package cwd, so `guard-scan` passes, `check-theme`
1355
- * scans something, and the repo is silently guarding a subset of itself. `init` wrote it and `sync`
1356
- * did not — which meant the fix reached new scaffolds only, while every existing consumer (the ones
1357
- * who by definition upgrade rather than scaffold) stayed on the undeclared default.
1358
- *
1359
- * A DECLARED value is never overwritten, not even when the layout disagrees with it. `roots` is a
1360
- * subset by construction in a monorepo — a React-free package deliberately left out is the normal
1361
- * case, not drift — so a disagreement is reported as one line naming what is not covered, and the
1362
- * consumer decides. Silently widening someone's deliberate scope would turn an upgrade into an
1363
- * unplanned lint debt.
1244
+ * Read — and when absent and `write` is set, seed — `basalt.roots`. Shared by `init` and `sync`: a
1245
+ * missing key silently guards a subset of the repo. A DECLARED value is never overwritten (a subset
1246
+ * is normal in a monorepo); a disagreement is reported as one line and the consumer decides.
1364
1247
  */
1365
1248
  export function reconcileRoots(cwd: string, opts: { write: boolean }): RootsState {
1366
1249
  const declared = readBasaltConfig(cwd).roots
@@ -1423,13 +1306,8 @@ export function rootsNotices(state: RootsState): { log: string[]; error: string[
1423
1306
  }
1424
1307
 
1425
1308
  /**
1426
- * Strip JSONC comments (and trailing commas) so `.oxlintrc.json` can be READ. oxlint accepts JSONC
1427
- * and real consumer configs use it — a plain `JSON.parse` there reported "not valid JSON" on a
1428
- * perfectly good config. String-aware, so a `//` inside a value survives.
1429
- *
1430
- * Only ever used for reading. The trailing-comma pass is a plain regex and could in principle mangle
1431
- * a `, }` sequence inside a string; the failure direction is a parse error, which the caller already
1432
- * treats as "cannot tell", never as "passes".
1309
+ * Strip JSONC comments and trailing commas so oxlint/tsconfig files can be READ (string-aware). A
1310
+ * mangled string fails as a parse error, which callers treat as "cannot tell", never as a pass.
1433
1311
  */
1434
1312
  function stripJsonc(text: string): string {
1435
1313
  let out = ''
@@ -1460,7 +1338,7 @@ function stripJsonc(text: string): string {
1460
1338
  /** Parse a JSONC document, or null when it does not parse at all. */
1461
1339
  export function parseJsonc(text: string): Record<string, unknown> | null {
1462
1340
  try {
1463
- return JSON.parse(stripJsonc(text)) as Record<string, unknown>
1341
+ return JSON.parse(stripJsonc(text.replace(/^\uFEFF/, ''))) as Record<string, unknown>
1464
1342
  } catch {
1465
1343
  return null
1466
1344
  }
@@ -1557,11 +1435,13 @@ export function inspectLefthookGate(repoRoot: string): LefthookGate {
1557
1435
  return wired ? { kind: 'wired', file } : { kind: 'absent', file }
1558
1436
  }
1559
1437
 
1438
+ const ONLY_EXPORT_COMPONENTS = 'react/only-export-components'
1439
+
1560
1440
  /**
1561
- * Splice the shipped preset into an EXISTING `.oxlintrc.json` (`init --merge-lint`). Opt-in, not
1562
- * automatic: turning the framework on adds real lint debt to previously-clean code (see the
1563
- * lint-debt notice `init` prints), and that is a decision, not a scaffold step. Prepends the preset
1564
- * so the consumer's own `extends` entries still win.
1441
+ * Splice the shipped preset into an EXISTING `.oxlintrc.json` (`init` does this unless
1442
+ * `--no-merge-lint`; the lint-debt notice says what it switches on). Prepends the preset so the
1443
+ * consumer's own `extends` entries still win. Only `extends` is rewritten; the config's own `plugins`
1444
+ * are untouched, and oxlint (1.87, checked with `--print-config`) unions them with the preset's.
1565
1445
  */
1566
1446
  export function mergeOxlintExtends(cwd: string, presetPath: string): MergeLintResult {
1567
1447
  const abs = resolve(cwd, '.oxlintrc.json')
@@ -1583,6 +1463,16 @@ export function mergeOxlintExtends(cwd: string, presetPath: string): MergeLintRe
1583
1463
  for (const [key, value] of Object.entries(cfg)) {
1584
1464
  merged[key] = key === 'extends' ? [presetPath, ...existing] : value
1585
1465
  }
1466
+ // A consumer-set only-export-components (create-vite) replaces the preset's options: re-add `Route`.
1467
+ const rules = merged['rules'] as Record<string, unknown> | undefined
1468
+ if (rules !== undefined && ONLY_EXPORT_COMPONENTS in rules) {
1469
+ const [level, options] = [rules[ONLY_EXPORT_COMPONENTS]].flat()
1470
+ const opts = (typeof options === 'object' && options !== null ? options : {}) as {
1471
+ allowExportNames?: string[]
1472
+ }
1473
+ const allowExportNames = [...new Set([...(opts.allowExportNames ?? []), 'Route'])]
1474
+ rules[ONLY_EXPORT_COMPONENTS] = [level, { ...opts, allowExportNames }]
1475
+ }
1586
1476
  const indent = /\n([ \t]+)"/.exec(raw)?.[1] ?? ' '
1587
1477
  writeFileSync(abs, JSON.stringify(merged, null, indent) + (raw.endsWith('\n') ? '\n' : ''))
1588
1478
  return 'added'
@@ -1772,10 +1662,7 @@ export function run(argv: string[], cwd: string = process.cwd()): number | Promi
1772
1662
  console.log(USAGE)
1773
1663
  return 0
1774
1664
  }
1775
- // Before dispatch, for the same reason --help is: this answers "which basalt-ui is running" and
1776
- // must never run a command to do it. `bunx` does not re-resolve a cached package, so a consumer
1777
- // can pin 1.23.0, invoke `bunx basalt-ui`, and be gated by a months-old copy — the version is the
1778
- // only thing that catches it, and it has to be one bare line an agent can compare.
1665
+ // Before dispatch, like --help: it answers "which basalt-ui is running" as one bare line.
1779
1666
  if (cmd === '--version' || cmd === '-v' || cmd === 'version') {
1780
1667
  console.log(readFrameworkVersion(packageRoot()))
1781
1668
  return 0
@@ -1794,9 +1681,7 @@ export function run(argv: string[], cwd: string = process.cwd()): number | Promi
1794
1681
  switch (cmd) {
1795
1682
  case 'init':
1796
1683
  return init(cwd, {
1797
- withRouter: flags.includes('--with-router'),
1798
- withQuery: flags.includes('--with-query'),
1799
- mergeLint: flags.includes('--merge-lint'),
1684
+ noMergeLint: flags.includes('--no-merge-lint'),
1800
1685
  })
1801
1686
  case 'sync':
1802
1687
  return sync(