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.
- package/AGENTS.md +50 -45
- package/CHANGELOG.md +543 -513
- package/MIGRATING.md +969 -37
- package/README.md +172 -367
- package/agent/rules/basalt-batteries.md +19 -74
- package/agent/rules/basalt-charts.md +21 -95
- package/agent/rules/basalt-controls.md +23 -131
- package/agent/rules/basalt-mantine.md +26 -99
- package/agent/rules/basalt-state.md +21 -103
- package/agent/rules/basalt-tokens.md +33 -114
- package/agent/skills/basalt-app/SKILL.md +229 -72
- package/agent/skills/basalt-charts/SKILL.md +23 -57
- package/agent/skills/basalt-design/SKILL.md +12 -70
- package/agent/templates/AGENTS-block.md.tpl +30 -0
- package/agent/templates/DESIGN.md.tpl +2 -2
- package/agent/templates/__root.tpl +9 -16
- package/agent/templates/main.tpl +21 -0
- package/agent/templates/nav.tpl +18 -0
- package/configs/check.yml +1 -1
- package/configs/oxlint-basalt.json +4 -10
- package/configs/oxlint-plugin.js +468 -847
- package/configs/oxlint-plugin.test.ts +662 -710
- package/configs/oxlint.json +10 -2
- package/dist/agent/ai-sdk-transport.d.ts +19 -7
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +10 -7
- package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
- package/dist/agent/chat/composer.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/composer.js +10 -9
- package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
- package/dist/agent/chat/message-affordances.d.ts.map +1 -0
- package/dist/agent/chat/relative-time.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
- package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
- package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
- package/dist/agent/chat/thread-feed.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
- package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
- package/dist/agent/chat/thread-message.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
- package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
- package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
- package/dist/agent/chat/tool-chip.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
- package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
- package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
- package/dist/agent/chat/virtualize.d.ts.map +1 -0
- package/dist/agent/error.d.ts +31 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +18 -0
- package/dist/agent/foreign.d.ts +3 -2
- package/dist/agent/foreign.d.ts.map +1 -1
- package/dist/agent/history.d.ts +2 -36
- package/dist/agent/history.d.ts.map +1 -1
- package/dist/agent/history.js +0 -32
- package/dist/agent/id.d.ts +4 -5
- package/dist/agent/id.d.ts.map +1 -1
- package/dist/agent/index.d.ts +19 -52
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -32
- package/dist/agent/outcome.d.ts +3 -14
- package/dist/agent/outcome.d.ts.map +1 -1
- package/dist/agent/outcome.js +0 -30
- package/dist/agent/part-list.d.ts +3 -3
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/parts.d.ts +23 -24
- package/dist/agent/parts.d.ts.map +1 -1
- package/dist/agent/run-committer.d.ts +23 -0
- package/dist/agent/run-committer.d.ts.map +1 -0
- package/dist/agent/run-committer.js +41 -0
- package/dist/agent/run-records.d.ts +77 -0
- package/dist/agent/run-records.d.ts.map +1 -0
- package/dist/agent/run-records.js +69 -0
- package/dist/agent/thread.d.ts +23 -47
- package/dist/agent/thread.d.ts.map +1 -1
- package/dist/agent/thread.js +3 -134
- package/dist/agent/transport.d.ts +6 -69
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +0 -18
- package/dist/agent/use-agent-thread-runs.d.ts +63 -26
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +202 -66
- package/dist/charts/BandStrip.d.ts +46 -0
- package/dist/charts/BandStrip.d.ts.map +1 -0
- package/dist/charts/BandStrip.js +151 -0
- package/dist/charts/Bars.d.ts +19 -0
- package/dist/charts/Bars.d.ts.map +1 -0
- package/dist/charts/Bars.js +77 -0
- package/dist/charts/CartesianChart.d.ts +57 -0
- package/dist/charts/CartesianChart.d.ts.map +1 -0
- package/dist/charts/CartesianChart.js +121 -0
- package/dist/charts/ChartCard.d.ts +34 -0
- package/dist/charts/ChartCard.d.ts.map +1 -0
- package/dist/charts/ChartCard.js +115 -0
- package/dist/charts/Donut.d.ts +25 -0
- package/dist/charts/Donut.d.ts.map +1 -0
- package/dist/charts/Donut.js +191 -0
- package/dist/charts/DualPanel.d.ts +47 -0
- package/dist/charts/DualPanel.d.ts.map +1 -0
- package/dist/charts/DualPanel.js +214 -0
- package/dist/charts/Heatmap.d.ts +41 -0
- package/dist/charts/Heatmap.d.ts.map +1 -0
- package/dist/charts/Heatmap.js +216 -0
- package/dist/charts/Lines.d.ts +11 -0
- package/dist/charts/Lines.d.ts.map +1 -0
- package/dist/charts/Lines.js +114 -0
- package/dist/charts/MirroredBars.d.ts +44 -0
- package/dist/charts/MirroredBars.d.ts.map +1 -0
- package/dist/charts/MirroredBars.js +190 -0
- package/dist/charts/Sparkline.d.ts +22 -0
- package/dist/charts/Sparkline.d.ts.map +1 -0
- package/dist/charts/Sparkline.js +129 -0
- package/dist/charts/StackedArea.d.ts +15 -0
- package/dist/charts/StackedArea.d.ts.map +1 -0
- package/dist/charts/StackedArea.js +46 -0
- package/dist/charts/box.d.ts +38 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +72 -0
- package/dist/charts/card-context.d.ts +3 -0
- package/dist/charts/card-context.d.ts.map +1 -0
- package/dist/charts/card-context.js +7 -0
- package/dist/charts/chart-box.module.css +64 -0
- package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
- package/dist/charts/chart-card.module.css +25 -0
- package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
- package/dist/charts/chart-legend.module.css +38 -0
- package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
- package/dist/charts/compile.d.ts +62 -0
- package/dist/charts/compile.d.ts.map +1 -0
- package/dist/charts/compile.js +386 -0
- package/dist/charts/cursor.d.ts +50 -0
- package/dist/charts/cursor.d.ts.map +1 -0
- package/dist/charts/cursor.js +157 -0
- package/dist/charts/curves.d.ts +12 -0
- package/dist/charts/curves.d.ts.map +1 -0
- package/dist/charts/curves.js +86 -0
- package/dist/charts/donut.module.css +54 -0
- package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
- package/dist/charts/host.d.ts +17 -0
- package/dist/charts/host.d.ts.map +1 -0
- package/dist/charts/host.js +35 -0
- package/dist/charts/index.d.ts +18 -53
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +17 -189
- package/dist/charts/legend.d.ts +23 -0
- package/dist/charts/legend.d.ts.map +1 -0
- package/dist/charts/legend.js +160 -0
- package/dist/charts/marks.d.ts +25 -0
- package/dist/charts/marks.d.ts.map +1 -0
- package/dist/charts/marks.js +128 -0
- package/dist/charts/panel.d.ts +56 -0
- package/dist/charts/panel.d.ts.map +1 -0
- package/dist/charts/panel.js +123 -0
- package/dist/charts/scales.d.ts +44 -0
- package/dist/charts/scales.d.ts.map +1 -0
- package/dist/charts/scales.js +163 -0
- package/dist/charts/sizing.d.ts +12 -0
- package/dist/charts/sizing.d.ts.map +1 -0
- package/dist/charts/sizing.js +33 -0
- package/dist/charts/state.d.ts +17 -0
- package/dist/charts/state.d.ts.map +1 -0
- package/dist/charts/state.js +53 -0
- package/dist/charts/theme.d.ts +38 -19
- package/dist/charts/theme.d.ts.map +1 -1
- package/dist/charts/theme.js +48 -26
- package/dist/charts/types.d.ts +227 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +4 -0
- package/dist/cli/audit-allows.d.ts +4 -17
- package/dist/cli/audit-allows.d.ts.map +1 -1
- package/dist/cli/config.d.ts +14 -43
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/doctor-upgrade.d.ts +31 -0
- package/dist/cli/doctor-upgrade.d.ts.map +1 -0
- package/dist/cli/doctor-upgrade.js +269 -0
- package/dist/cli/doctor.d.ts +13 -26
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +79 -8
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -4
- package/dist/cli/index.d.ts +68 -135
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +89 -76
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +43 -27
- package/dist/cli/sync.d.ts +5 -21
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -6
- package/dist/cli/tokens-css.d.ts +7 -28
- package/dist/cli/tokens-css.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +4 -5
- package/dist/commands/define-commands.d.ts +15 -31
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +1 -11
- package/dist/commands/define-overlays.d.ts +5 -19
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +3 -11
- package/dist/commands/index.d.ts +10 -40
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -46
- package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
- package/dist/commands/notifications/bell.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
- package/dist/commands/notifications/center.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.js +2 -2
- package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
- package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
- package/dist/commands/notifications/notify.d.ts +44 -0
- package/dist/commands/notifications/notify.d.ts.map +1 -0
- package/dist/commands/notifications/notify.js +79 -0
- package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
- package/dist/commands/notifications/store.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/store.js +4 -0
- package/dist/commands/projectors.d.ts +1 -131
- package/dist/commands/projectors.d.ts.map +1 -1
- package/dist/commands/projectors.js +2 -73
- package/dist/commands/shell-bridge.d.ts +3 -3
- package/dist/commands/shortcut-format.d.ts +5 -4
- package/dist/commands/shortcut-format.d.ts.map +1 -1
- package/dist/common/errors.d.ts +3 -3
- package/dist/common/use-measured-widths.d.ts.map +1 -1
- package/dist/common/use-measured-widths.js +5 -3
- package/dist/common/validate.d.ts +2 -2
- package/dist/content/article-layout.d.ts.map +1 -1
- package/dist/content/article-layout.js +3 -3
- package/dist/content/article-model.d.ts +1 -46
- package/dist/content/article-model.d.ts.map +1 -1
- package/dist/content/article-model.js +1 -29
- package/dist/content/copy-action.d.ts +1 -1
- package/dist/content/glyphs.d.ts +1 -1
- package/dist/content/index.d.ts +11 -41
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +3 -35
- package/dist/content/markdown.d.ts +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -1
- package/dist/content/mermaid.d.ts.map +1 -1
- package/dist/content/mermaid.js +7 -7
- package/dist/content/slug.d.ts +1 -8
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/slug.js +1 -8
- package/dist/content/url-hardening.d.ts +2 -2
- package/dist/content/url-hardening.d.ts.map +1 -1
- package/dist/content/url-hardening.js +2 -0
- package/dist/controls/actions.d.ts +16 -1
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/enum-filter.d.ts +1 -1
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-context.js +3 -1
- package/dist/controls/filter-set.js +4 -6
- package/dist/controls/form-layout.d.ts +1 -1
- package/dist/controls/form-layout.d.ts.map +1 -1
- package/dist/controls/form-layout.js +1 -1
- package/dist/controls/glyphs.d.ts +0 -2
- package/dist/controls/glyphs.d.ts.map +1 -1
- package/dist/controls/glyphs.js +0 -7
- package/dist/controls/index.d.ts +12 -17
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +5 -39
- package/dist/controls/multi-select-filter.d.ts +4 -3
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.d.ts +4 -3
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +3 -1
- package/dist/controls/range-filter.d.ts +4 -3
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.d.ts +4 -3
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +19 -14
- package/dist/controls/select-filter.d.ts +4 -3
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +12 -15
- package/dist/controls/toggle-filter.d.ts +4 -3
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/uncontrolled.d.ts +12 -0
- package/dist/controls/uncontrolled.d.ts.map +1 -0
- package/dist/controls/view-tabs.d.ts +2 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls-dates/index.d.ts +0 -1
- package/dist/controls-dates/index.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts +7 -9
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -23
- package/dist/dashboard/section.d.ts +4 -6
- package/dist/dashboard/section.d.ts.map +1 -1
- package/dist/dashboard/section.js +4 -10
- package/dist/dashboard/stat-card.d.ts +4 -4
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +3 -3
- package/dist/dashboard/widget-header.module.css +9 -7
- package/dist/dev-dock.d.ts.map +1 -1
- package/dist/dev-dock.js +6 -1
- package/dist/format/date.d.ts +0 -34
- package/dist/format/date.d.ts.map +1 -1
- package/dist/format/date.js +0 -54
- package/dist/format/index.d.ts +7 -22
- package/dist/format/index.d.ts.map +1 -1
- package/dist/format/index.js +2 -43
- package/dist/format/number.d.ts +3 -14
- package/dist/format/number.d.ts.map +1 -1
- package/dist/format/number.js +0 -13
- package/dist/format/shared.d.ts +2 -3
- package/dist/format/shared.d.ts.map +1 -1
- package/dist/forms/index.d.ts +0 -11
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -14
- package/dist/guard/index.d.ts +6 -21
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -115
- package/dist/guard/types.d.ts +7 -18
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +16 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -117
- package/dist/provider/create-router.d.ts +44 -0
- package/dist/provider/create-router.d.ts.map +1 -0
- package/dist/provider/create-router.js +62 -0
- package/dist/provider/hotkeys.d.ts +8 -0
- package/dist/provider/hotkeys.d.ts.map +1 -0
- package/dist/provider/hotkeys.js +50 -0
- package/dist/provider/index.d.ts +33 -110
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +182 -82
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/route-transition.d.ts +76 -0
- package/dist/provider/route-transition.d.ts.map +1 -0
- package/dist/provider/route-transition.js +98 -0
- package/dist/provider/spotlight-actions.d.ts +10 -0
- package/dist/provider/spotlight-actions.d.ts.map +1 -0
- package/dist/provider/spotlight-actions.js +55 -0
- package/dist/provider/test-router.d.ts +6 -0
- package/dist/provider/test-router.d.ts.map +1 -0
- package/dist/provider/test-router.js +18 -0
- package/dist/query-client.d.ts +4 -20
- package/dist/query-client.d.ts.map +1 -1
- package/dist/query-client.js +2 -2
- package/dist/router-tanstack/index.d.ts +18 -64
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +2 -16
- package/dist/router-tanstack/nav.d.ts +12 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/nav.js +8 -1
- package/dist/router-tanstack/search-store.d.ts +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.d.ts +8 -9
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +20 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +1 -1
- package/dist/shell/index.d.ts +31 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +14 -3
- package/dist/shell/page-aside.d.ts +2 -2
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +31 -12
- package/dist/shell/page-bar.d.ts +2 -2
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +1 -1
- package/dist/state.d.ts +10 -12
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -6
- package/dist/styles.css +107 -7
- package/dist/surfaces.d.ts +28 -103
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +54 -143
- package/dist/{data → table}/data-table-state.d.ts +1 -1
- package/dist/table/data-table-state.d.ts.map +1 -0
- package/dist/{data → table}/data-table-state.js +4 -3
- package/dist/{data → table}/data-table.d.ts +28 -49
- package/dist/table/data-table.d.ts.map +1 -0
- package/dist/{data → table}/data-table.js +74 -60
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/{data/table.js → table/index.js} +1 -1
- package/dist/table/query-branch.d.ts.map +1 -0
- package/dist/table/table-features.d.ts +69 -0
- package/dist/table/table-features.d.ts.map +1 -0
- package/dist/table/table-features.js +49 -0
- package/dist/telemetry.d.ts +77 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +33 -0
- package/dist/theme/index.d.ts +10 -21
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -14
- package/dist/theme/theme-toggle.d.ts.map +1 -1
- package/dist/theme/theme-toggle.js +7 -33
- package/dist/theme/theme-toggle.module.css +30 -0
- package/dist/theme/theme-toggle.module.css.d.ts +10 -0
- package/dist/theme-lab/derive-controls.d.ts.map +1 -1
- package/dist/theme-lab/derive-controls.js +5 -3
- package/dist/theme-lab/derive-state.d.ts.map +1 -1
- package/dist/theme-lab/derive-state.js +2 -1
- package/dist/tokens/core.d.ts +360 -0
- package/dist/tokens/core.d.ts.map +1 -0
- package/dist/tokens/core.js +708 -0
- package/dist/tokens/derive.d.ts +1 -1
- package/dist/tokens/derive.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +5 -373
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +8 -700
- package/dist/tokens/palette.d.ts +2 -6
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +1 -4
- package/dist/vite.d.ts +4 -3
- package/dist/vite.d.ts.map +1 -1
- package/llms.txt +43 -85
- package/package.json +77 -170
- package/src/agent/ai-sdk-transport.ts +57 -37
- package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
- package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
- package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
- package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
- package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
- package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
- package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
- package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
- package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
- package/src/agent/error.ts +43 -0
- package/src/agent/foreign.ts +3 -2
- package/src/agent/history.ts +2 -107
- package/src/agent/id.ts +4 -5
- package/src/agent/index.ts +23 -112
- package/src/agent/outcome.ts +3 -56
- package/src/agent/part-list.tsx +3 -3
- package/src/agent/parts.ts +23 -22
- package/src/agent/run-committer.ts +64 -0
- package/src/agent/run-records.ts +147 -0
- package/src/agent/thread.ts +24 -231
- package/src/agent/transport.ts +6 -96
- package/src/agent/use-agent-thread-runs.ts +364 -199
- package/src/charts/BandStrip.tsx +276 -0
- package/src/charts/Bars.tsx +141 -0
- package/src/charts/CartesianChart.tsx +206 -0
- package/src/charts/ChartCard.tsx +178 -0
- package/src/charts/Donut.tsx +256 -0
- package/src/charts/DualPanel.tsx +326 -0
- package/src/charts/Heatmap.tsx +282 -0
- package/src/charts/Lines.tsx +151 -0
- package/src/charts/MirroredBars.tsx +303 -0
- package/src/charts/Sparkline.tsx +176 -0
- package/src/charts/StackedArea.tsx +80 -0
- package/src/charts/box.tsx +96 -0
- package/src/charts/card-context.ts +11 -0
- package/src/charts/chart-box.module.css +64 -0
- package/src/charts/chart-box.module.css.d.ts +12 -0
- package/src/charts/chart-card.module.css +25 -0
- package/src/charts/chart-card.module.css.d.ts +8 -0
- package/src/charts/chart-legend.module.css +38 -0
- package/src/charts/chart-legend.module.css.d.ts +10 -0
- package/src/charts/compile.ts +585 -0
- package/src/charts/cursor.ts +282 -0
- package/src/charts/curves.ts +111 -0
- package/src/charts/donut.module.css +54 -0
- package/src/charts/donut.module.css.d.ts +9 -0
- package/src/charts/host.tsx +60 -0
- package/src/charts/index.ts +41 -178
- package/src/charts/legend.tsx +204 -0
- package/src/charts/marks.ts +201 -0
- package/src/charts/panel.tsx +227 -0
- package/src/charts/scales.ts +237 -0
- package/src/charts/sizing.ts +47 -0
- package/src/charts/state.tsx +80 -0
- package/src/charts/theme.ts +65 -0
- package/src/charts/types.ts +242 -0
- package/src/cli/audit-allows.ts +8 -30
- package/src/cli/config.ts +14 -43
- package/src/cli/doctor-upgrade.ts +392 -0
- package/src/cli/doctor.ts +120 -68
- package/src/cli/help.ts +2 -4
- package/src/cli/index.ts +161 -276
- package/src/cli/init.ts +60 -37
- package/src/cli/sync.ts +13 -45
- package/src/cli/tokens-css.ts +7 -28
- package/src/commands/ShortcutsHelp.tsx +8 -9
- package/src/commands/define-commands.ts +16 -43
- package/src/commands/define-overlays.ts +12 -36
- package/src/commands/index.ts +11 -94
- package/src/{notifications → commands/notifications}/bell.tsx +2 -2
- package/src/{notifications → commands/notifications}/center.tsx +7 -5
- package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
- package/src/commands/notifications/notify.tsx +158 -0
- package/src/{notifications → commands/notifications}/store.ts +10 -2
- package/src/commands/projectors.ts +5 -225
- package/src/commands/shell-bridge.ts +5 -5
- package/src/commands/shortcut-format.ts +5 -4
- package/src/common/errors.ts +3 -3
- package/src/common/use-measured-widths.ts +6 -3
- package/src/common/validate.ts +2 -2
- package/src/content/article-layout.tsx +37 -38
- package/src/content/article-model.ts +1 -84
- package/src/content/copy-action.tsx +1 -1
- package/src/content/glyphs.tsx +1 -1
- package/src/content/index.ts +12 -83
- package/src/content/markdown.tsx +4 -3
- package/src/content/mermaid.tsx +9 -7
- package/src/content/slug.ts +1 -16
- package/src/content/url-hardening.ts +8 -2
- package/src/controls/actions.tsx +24 -1
- package/src/controls/enum-filter.tsx +1 -1
- package/src/controls/filter-context.tsx +3 -1
- package/src/controls/filter-set.tsx +5 -7
- package/src/controls/form-layout.tsx +2 -2
- package/src/controls/glyphs.tsx +0 -10
- package/src/controls/index.ts +13 -64
- package/src/controls/multi-select-filter.tsx +5 -4
- package/src/controls/number-filter.tsx +8 -4
- package/src/controls/range-filter.tsx +5 -4
- package/src/controls/search-filter.tsx +25 -19
- package/src/controls/select-filter.tsx +5 -4
- package/src/controls/sync-button.tsx +18 -20
- package/src/controls/toggle-filter.tsx +5 -4
- package/src/controls/uncontrolled.ts +12 -0
- package/src/controls/view-tabs.tsx +3 -3
- package/src/controls-dates/date-range-picker.tsx +1 -1
- package/src/controls-dates/index.ts +0 -1
- package/src/dashboard/index.ts +7 -48
- package/src/dashboard/section.tsx +11 -40
- package/src/dashboard/stat-card.tsx +14 -16
- package/src/dashboard/widget-header.module.css +9 -7
- package/src/dev-dock.tsx +14 -27
- package/src/format/date.ts +2 -92
- package/src/format/index.ts +7 -53
- package/src/format/number.ts +3 -26
- package/src/format/shared.ts +2 -3
- package/src/forms/index.ts +0 -23
- package/src/guard/index.ts +37 -192
- package/src/guard/types.ts +6 -19
- package/src/index.ts +30 -282
- package/src/provider/create-router.tsx +138 -0
- package/src/provider/hotkeys.ts +70 -0
- package/src/provider/index.tsx +260 -230
- package/src/provider/lab-theme.ts +3 -2
- package/src/provider/route-transition.ts +199 -0
- package/src/provider/spotlight-actions.tsx +69 -0
- package/src/provider/test-router.tsx +25 -0
- package/src/query-client.ts +4 -22
- package/src/router-tanstack/index.ts +18 -112
- package/src/router-tanstack/nav.ts +28 -2
- package/src/router-tanstack/search-store.ts +9 -2
- package/src/router-tanstack/use-nav.ts +47 -13
- package/src/shell/app-mobile-nav.tsx +3 -2
- package/src/shell/app-sidebar.tsx +1 -1
- package/src/shell/aside-docking.ts +1 -1
- package/src/shell/index.tsx +61 -20
- package/src/shell/page-aside.tsx +47 -23
- package/src/shell/page-bar.tsx +3 -3
- package/src/shell/page-title.tsx +1 -1
- package/src/state.ts +11 -37
- package/src/styles.css +107 -7
- package/src/surfaces.ts +56 -151
- package/src/{data → table}/data-table-state.ts +5 -4
- package/src/{data → table}/data-table.tsx +170 -161
- package/src/table/index.ts +18 -0
- package/src/table/table-features.ts +102 -0
- package/src/telemetry.ts +110 -0
- package/src/theme/index.ts +22 -47
- package/src/theme/theme-toggle.module.css +30 -0
- package/src/theme/theme-toggle.module.css.d.ts +10 -0
- package/src/theme/theme-toggle.tsx +15 -43
- package/src/theme-lab/derive-controls.tsx +5 -3
- package/src/theme-lab/derive-state.ts +2 -1
- package/src/tokens/core.ts +1163 -0
- package/src/tokens/derive.ts +1 -1
- package/src/tokens/index.ts +14 -1181
- package/src/tokens/palette.ts +3 -7
- package/src/vite.ts +3 -3
- package/agent/templates/CLAUDE-block.md.tpl +0 -40
- package/agent/templates/query-client.ts.tpl +0 -26
- package/dist/agent/adapter.d.ts +0 -150
- package/dist/agent/adapter.d.ts.map +0 -1
- package/dist/agent/adapter.js +0 -482
- package/dist/agent/use-agent-stream.d.ts +0 -35
- package/dist/agent/use-agent-stream.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.js +0 -59
- package/dist/agent-chat/composer.d.ts.map +0 -1
- package/dist/agent-chat/index.d.ts +0 -31
- package/dist/agent-chat/index.d.ts.map +0 -1
- package/dist/agent-chat/index.js +0 -19
- package/dist/agent-chat/message-affordances.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
- package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.js +0 -115
- package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.d.ts.map +0 -1
- package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.d.ts +0 -44
- package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.js +0 -153
- package/dist/agent-chat/tool-chip.d.ts.map +0 -1
- package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.d.ts +0 -75
- package/dist/charts/cursor/resolve.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.js +0 -91
- package/dist/charts/cursor/scope.d.ts +0 -20
- package/dist/charts/cursor/scope.d.ts.map +0 -1
- package/dist/charts/cursor/scope.js +0 -20
- package/dist/charts/cursor/store.d.ts +0 -35
- package/dist/charts/cursor/store.d.ts.map +0 -1
- package/dist/charts/cursor/store.js +0 -25
- package/dist/charts/cursor/touch-pin.d.ts +0 -45
- package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
- package/dist/charts/cursor/touch-pin.js +0 -79
- package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
- package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
- package/dist/charts/hooks/use-discrete-cursor.js +0 -198
- package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
- package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
- package/dist/charts/hooks/use-hysteresis.js +0 -12
- package/dist/charts/hooks/useBandPlot.d.ts +0 -145
- package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
- package/dist/charts/hooks/useBandPlot.js +0 -178
- package/dist/charts/hooks/useChartCursor.d.ts +0 -75
- package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
- package/dist/charts/hooks/useChartCursor.js +0 -200
- package/dist/charts/hooks/useChartSize.d.ts +0 -29
- package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
- package/dist/charts/hooks/useChartSize.js +0 -8
- package/dist/charts/kinds/BandStrip.d.ts +0 -132
- package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.js +0 -241
- package/dist/charts/kinds/Bars.d.ts +0 -141
- package/dist/charts/kinds/Bars.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.js +0 -343
- package/dist/charts/kinds/Donut.d.ts +0 -77
- package/dist/charts/kinds/Donut.d.ts.map +0 -1
- package/dist/charts/kinds/Donut.js +0 -245
- package/dist/charts/kinds/DualPanel.d.ts +0 -111
- package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.js +0 -471
- package/dist/charts/kinds/Heatmap.d.ts +0 -85
- package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
- package/dist/charts/kinds/Heatmap.js +0 -243
- package/dist/charts/kinds/MirroredBars.d.ts +0 -98
- package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.js +0 -292
- package/dist/charts/kinds/MultiLine.d.ts +0 -87
- package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.js +0 -176
- package/dist/charts/kinds/StackedArea.d.ts +0 -73
- package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.js +0 -135
- package/dist/charts/kinds/ZonedLine.d.ts +0 -97
- package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.js +0 -155
- package/dist/charts/kinds/band-chrome.d.ts +0 -31
- package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
- package/dist/charts/kinds/band-chrome.js +0 -71
- package/dist/charts/kinds/donut-layout.d.ts +0 -47
- package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
- package/dist/charts/kinds/donut-layout.js +0 -52
- package/dist/charts/layout/auto-margin.d.ts +0 -122
- package/dist/charts/layout/auto-margin.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.js +0 -81
- package/dist/charts/layout/end-labels.d.ts +0 -64
- package/dist/charts/layout/end-labels.d.ts.map +0 -1
- package/dist/charts/layout/end-labels.js +0 -76
- package/dist/charts/layout/log-ticks.d.ts +0 -27
- package/dist/charts/layout/log-ticks.d.ts.map +0 -1
- package/dist/charts/layout/log-ticks.js +0 -42
- package/dist/charts/primitives/AreaGradient.d.ts +0 -18
- package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
- package/dist/charts/primitives/AreaGradient.js +0 -13
- package/dist/charts/primitives/Axes.d.ts +0 -83
- package/dist/charts/primitives/Axes.d.ts.map +0 -1
- package/dist/charts/primitives/Axes.js +0 -168
- package/dist/charts/primitives/CartesianChart.d.ts +0 -257
- package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.js +0 -549
- package/dist/charts/primitives/ChartCard.d.ts +0 -66
- package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.js +0 -143
- package/dist/charts/primitives/ChartFrame.d.ts +0 -156
- package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.js +0 -241
- package/dist/charts/primitives/ChartLegend.d.ts +0 -67
- package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.js +0 -292
- package/dist/charts/primitives/ChartPending.d.ts +0 -113
- package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
- package/dist/charts/primitives/ChartPending.js +0 -117
- package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
- package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.js +0 -197
- package/dist/charts/primitives/Crosshair.d.ts +0 -26
- package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
- package/dist/charts/primitives/Crosshair.js +0 -23
- package/dist/charts/primitives/HatchPattern.d.ts +0 -31
- package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
- package/dist/charts/primitives/HatchPattern.js +0 -31
- package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
- package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
- package/dist/charts/primitives/HoverOverlay.js +0 -72
- package/dist/charts/primitives/HoverOverlay.module.css +0 -13
- package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/dist/charts/primitives/XZoneRects.d.ts +0 -54
- package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.js +0 -65
- package/dist/charts/primitives/ZoneRects.d.ts +0 -38
- package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/ZoneRects.js +0 -30
- package/dist/charts/primitives/chart-card-context.d.ts +0 -33
- package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
- package/dist/charts/primitives/chart-card-context.js +0 -18
- package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-frame-layout.js +0 -175
- package/dist/charts/primitives/chart-layout.d.ts +0 -112
- package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-layout.js +0 -175
- package/dist/charts/primitives/chart-tier.d.ts +0 -16
- package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
- package/dist/charts/primitives/chart-tier.js +0 -44
- package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
- package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
- package/dist/charts/primitives/legend-disclosure.js +0 -153
- package/dist/charts/series.d.ts +0 -189
- package/dist/charts/series.d.ts.map +0 -1
- package/dist/charts/series.js +0 -84
- package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
- package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/BarSparkline.js +0 -53
- package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
- package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/LineSparkline.js +0 -51
- package/dist/charts/sparklines/index.d.ts +0 -3
- package/dist/charts/sparklines/index.d.ts.map +0 -1
- package/dist/charts/sparklines/index.js +0 -6
- package/dist/charts/utils/domain.d.ts +0 -35
- package/dist/charts/utils/domain.d.ts.map +0 -1
- package/dist/charts/utils/domain.js +0 -12
- package/dist/charts/utils/format.d.ts +0 -8
- package/dist/charts/utils/format.d.ts.map +0 -1
- package/dist/charts/utils/format.js +0 -20
- package/dist/charts/utils/measure-text.d.ts +0 -25
- package/dist/charts/utils/measure-text.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.js +0 -64
- package/dist/charts/utils/ticks.d.ts +0 -103
- package/dist/charts/utils/ticks.d.ts.map +0 -1
- package/dist/charts/utils/ticks.js +0 -92
- package/dist/commands/overlays-mount.d.ts +0 -122
- package/dist/commands/overlays-mount.d.ts.map +0 -1
- package/dist/commands/overlays-mount.js +0 -125
- package/dist/commands/useCommandHotkeys.d.ts +0 -14
- package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
- package/dist/commands/useCommandHotkeys.js +0 -45
- package/dist/content/article-actions.d.ts +0 -39
- package/dist/content/article-actions.d.ts.map +0 -1
- package/dist/content/article-actions.js +0 -28
- package/dist/content/article-card.d.ts +0 -58
- package/dist/content/article-card.d.ts.map +0 -1
- package/dist/content/article-card.js +0 -79
- package/dist/content/article-card.module.css +0 -111
- package/dist/content/mdx.d.ts +0 -20
- package/dist/content/mdx.d.ts.map +0 -1
- package/dist/content/mdx.js +0 -64
- package/dist/controls/compare-filter.d.ts +0 -42
- package/dist/controls/compare-filter.d.ts.map +0 -1
- package/dist/controls/compare-filter.js +0 -38
- package/dist/controls/slider-control.d.ts +0 -36
- package/dist/controls/slider-control.d.ts.map +0 -1
- package/dist/controls/slider-control.js +0 -64
- package/dist/dashboard/widget-grid.d.ts +0 -27
- package/dist/dashboard/widget-grid.d.ts.map +0 -1
- package/dist/dashboard/widget-grid.js +0 -40
- package/dist/dashboard/widget-grid.module.css +0 -69
- package/dist/data/data-table-state.d.ts.map +0 -1
- package/dist/data/data-table.d.ts.map +0 -1
- package/dist/data/query-branch.d.ts.map +0 -1
- package/dist/data/table.d.ts +0 -24
- package/dist/data/table.d.ts.map +0 -1
- package/dist/data/virtual-list.d.ts +0 -133
- package/dist/data/virtual-list.d.ts.map +0 -1
- package/dist/data/virtual-list.js +0 -157
- package/dist/data/virtual.d.ts +0 -21
- package/dist/data/virtual.d.ts.map +0 -1
- package/dist/data/virtual.js +0 -4
- package/dist/forms/FormErrorSummary.d.ts +0 -30
- package/dist/forms/FormErrorSummary.d.ts.map +0 -1
- package/dist/forms/FormErrorSummary.js +0 -30
- package/dist/forms/use-field-array.d.ts +0 -60
- package/dist/forms/use-field-array.d.ts.map +0 -1
- package/dist/forms/use-field-array.js +0 -20
- package/dist/forms/use-form-draft.d.ts +0 -76
- package/dist/forms/use-form-draft.d.ts.map +0 -1
- package/dist/forms/use-form-draft.js +0 -92
- package/dist/forms/use-form-submit.d.ts +0 -88
- package/dist/forms/use-form-submit.d.ts.map +0 -1
- package/dist/forms/use-form-submit.js +0 -63
- package/dist/notifications/bell.d.ts.map +0 -1
- package/dist/notifications/center.d.ts.map +0 -1
- package/dist/notifications/define-notifications.d.ts.map +0 -1
- package/dist/notifications/index.d.ts +0 -40
- package/dist/notifications/index.d.ts.map +0 -1
- package/dist/notifications/index.js +0 -54
- package/dist/notifications/mount-guard.d.ts +0 -8
- package/dist/notifications/mount-guard.d.ts.map +0 -1
- package/dist/notifications/mount-guard.js +0 -18
- package/dist/notifications/notify.d.ts +0 -149
- package/dist/notifications/notify.d.ts.map +0 -1
- package/dist/notifications/notify.js +0 -171
- package/dist/notifications/store.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.d.ts +0 -13
- package/dist/provider/connectivity-indicator.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.js +0 -205
- package/dist/provider/connectivity-provider.d.ts +0 -7
- package/dist/provider/connectivity-provider.d.ts.map +0 -1
- package/dist/provider/connectivity-provider.js +0 -128
- package/dist/provider/connectivity-types.d.ts +0 -36
- package/dist/provider/connectivity-types.d.ts.map +0 -1
- package/dist/provider/use-connectivity.d.ts +0 -3
- package/dist/provider/use-connectivity.d.ts.map +0 -1
- package/dist/provider/use-connectivity.js +0 -14
- package/dist/query-devtools.d.ts +0 -21
- package/dist/query-devtools.d.ts.map +0 -1
- package/dist/query-devtools.js +0 -13
- package/src/agent/adapter.ts +0 -945
- package/src/agent/use-agent-stream.ts +0 -154
- package/src/agent-chat/index.ts +0 -54
- package/src/agent-chat/thread-detail-panel.tsx +0 -201
- package/src/agent-chat/thread-workspace.tsx +0 -279
- package/src/charts/cursor/resolve.ts +0 -198
- package/src/charts/cursor/scope.tsx +0 -35
- package/src/charts/cursor/store.ts +0 -58
- package/src/charts/cursor/touch-pin.ts +0 -138
- package/src/charts/hooks/use-discrete-cursor.ts +0 -335
- package/src/charts/hooks/use-hysteresis.ts +0 -26
- package/src/charts/hooks/useBandPlot.ts +0 -383
- package/src/charts/hooks/useChartCursor.ts +0 -367
- package/src/charts/hooks/useChartSize.ts +0 -35
- package/src/charts/kinds/BandStrip.tsx +0 -449
- package/src/charts/kinds/Bars.tsx +0 -589
- package/src/charts/kinds/Donut.tsx +0 -368
- package/src/charts/kinds/DualPanel.tsx +0 -712
- package/src/charts/kinds/Heatmap.tsx +0 -396
- package/src/charts/kinds/MirroredBars.tsx +0 -469
- package/src/charts/kinds/MultiLine.tsx +0 -322
- package/src/charts/kinds/StackedArea.tsx +0 -267
- package/src/charts/kinds/ZonedLine.tsx +0 -301
- package/src/charts/kinds/band-chrome.tsx +0 -91
- package/src/charts/kinds/donut-layout.ts +0 -82
- package/src/charts/layout/auto-margin.ts +0 -242
- package/src/charts/layout/end-labels.ts +0 -135
- package/src/charts/layout/log-ticks.ts +0 -90
- package/src/charts/primitives/AreaGradient.tsx +0 -26
- package/src/charts/primitives/Axes.tsx +0 -271
- package/src/charts/primitives/CartesianChart.tsx +0 -1002
- package/src/charts/primitives/ChartCard.tsx +0 -280
- package/src/charts/primitives/ChartFrame.tsx +0 -493
- package/src/charts/primitives/ChartLegend.tsx +0 -422
- package/src/charts/primitives/ChartPending.tsx +0 -243
- package/src/charts/primitives/ChartTooltip.tsx +0 -265
- package/src/charts/primitives/Crosshair.tsx +0 -43
- package/src/charts/primitives/HatchPattern.tsx +0 -55
- package/src/charts/primitives/HoverOverlay.module.css +0 -13
- package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/src/charts/primitives/HoverOverlay.tsx +0 -109
- package/src/charts/primitives/XZoneRects.tsx +0 -132
- package/src/charts/primitives/ZoneRects.tsx +0 -67
- package/src/charts/primitives/chart-card-context.ts +0 -46
- package/src/charts/primitives/chart-frame-layout.ts +0 -430
- package/src/charts/primitives/chart-layout.ts +0 -318
- package/src/charts/primitives/chart-tier.tsx +0 -76
- package/src/charts/primitives/legend-disclosure.tsx +0 -178
- package/src/charts/series.ts +0 -276
- package/src/charts/sparklines/BarSparkline.tsx +0 -94
- package/src/charts/sparklines/LineSparkline.tsx +0 -71
- package/src/charts/sparklines/index.ts +0 -2
- package/src/charts/theme.tsx +0 -53
- package/src/charts/utils/domain.ts +0 -41
- package/src/charts/utils/format.ts +0 -19
- package/src/charts/utils/measure-text.ts +0 -109
- package/src/charts/utils/ticks.ts +0 -239
- package/src/commands/overlays-mount.tsx +0 -333
- package/src/commands/useCommandHotkeys.ts +0 -114
- package/src/content/article-actions.ts +0 -72
- package/src/content/article-card.module.css +0 -111
- package/src/content/article-card.tsx +0 -174
- package/src/content/mdx.tsx +0 -127
- package/src/controls/compare-filter.tsx +0 -81
- package/src/controls/slider-control.tsx +0 -159
- package/src/dashboard/widget-grid.module.css +0 -69
- package/src/dashboard/widget-grid.tsx +0 -146
- package/src/data/table.ts +0 -39
- package/src/data/virtual-list.tsx +0 -356
- package/src/data/virtual.ts +0 -26
- package/src/forms/FormErrorSummary.tsx +0 -71
- package/src/forms/use-field-array.ts +0 -94
- package/src/forms/use-form-draft.ts +0 -262
- package/src/forms/use-form-submit.ts +0 -199
- package/src/notifications/index.ts +0 -88
- package/src/notifications/mount-guard.ts +0 -38
- package/src/notifications/notify.tsx +0 -379
- package/src/provider/connectivity-indicator.tsx +0 -267
- package/src/provider/connectivity-provider.tsx +0 -189
- package/src/provider/connectivity-types.ts +0 -42
- package/src/provider/use-connectivity.ts +0 -26
- package/src/query-devtools.tsx +0 -40
- /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
- /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
- /package/dist/{notifications → commands/notifications}/bell.js +0 -0
- /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
- /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
- /package/dist/{data → table}/data-table.module.css +0 -0
- /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
- /package/dist/{data → table}/query-branch.d.ts +0 -0
- /package/dist/{data → table}/query-branch.js +0 -0
- /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
- /package/src/{data → table}/data-table.module.css +0 -0
- /package/src/{data → table}/data-table.module.css.d.ts +0 -0
- /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
|
|
88
|
-
*
|
|
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
|
|
183
|
-
* `
|
|
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
|
-
*
|
|
242
|
-
*
|
|
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`)
|
|
307
|
-
*
|
|
308
|
-
*
|
|
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
|
|
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
|
|
402
|
-
*
|
|
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
|
|
451
|
-
*
|
|
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
|
-
*
|
|
454
|
-
*
|
|
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
|
|
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
|
-
|
|
533
|
-
|
|
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,
|
|
565
|
-
*
|
|
566
|
-
*
|
|
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
|
-
*
|
|
638
|
-
*
|
|
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
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
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
|
-
/**
|
|
648
|
-
export
|
|
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
|
-
|
|
813
|
-
|
|
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/
|
|
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
|
|
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/
|
|
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:
|
|
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
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
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,
|
|
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
|
|
998
|
-
*
|
|
999
|
-
*
|
|
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
|
|
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
|
-
*
|
|
1093
|
-
*
|
|
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
|
|
1191
|
-
*
|
|
1192
|
-
*
|
|
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 :
|
|
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
|
|
1242
|
-
*
|
|
1243
|
-
*
|
|
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
|
-
*
|
|
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
|
|
1427
|
-
*
|
|
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
|
|
1562
|
-
*
|
|
1563
|
-
*
|
|
1564
|
-
*
|
|
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,
|
|
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
|
-
|
|
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(
|