basalt-ui 2.0.1 → 2.0.3
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/CHANGELOG.md +18 -0
- package/MIGRATING.md +37 -19
- package/configs/check.yml +5 -5
- package/dist/cli/config.d.ts +10 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +1 -1
- package/dist/cli/doctor-upgrade.d.ts +1 -1
- package/dist/cli/doctor-upgrade.d.ts.map +1 -1
- package/dist/cli/doctor-upgrade.js +36 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +28 -3
- package/dist/cli/index.d.ts +28 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +60 -7
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +7 -1
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +5 -0
- package/dist/provider/index.d.ts +8 -1
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +3 -2
- package/dist/provider/spotlight-actions.d.ts +3 -2
- package/dist/provider/spotlight-actions.d.ts.map +1 -1
- package/dist/provider/spotlight-actions.js +5 -3
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +9 -2
- package/dist/shell/app-sidebar.module.css +6 -0
- package/dist/shell/app-sidebar.module.css.d.ts +1 -0
- package/dist/tokens/core.d.ts +12 -11
- package/dist/tokens/core.d.ts.map +1 -1
- package/dist/tokens/core.js +9 -1
- package/llms.txt +2 -2
- package/package.json +1 -1
- package/src/cli/config.ts +11 -1
- package/src/cli/doctor-upgrade.ts +49 -2
- package/src/cli/doctor.ts +37 -3
- package/src/cli/index.ts +93 -7
- package/src/cli/init.ts +10 -1
- package/src/cli/sync.ts +6 -0
- package/src/provider/index.tsx +10 -2
- package/src/provider/spotlight-actions.tsx +8 -3
- package/src/shell/app-sidebar.module.css +6 -0
- package/src/shell/app-sidebar.module.css.d.ts +1 -0
- package/src/shell/app-sidebar.tsx +16 -2
- package/src/tokens/core.ts +25 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
## [2.0.3](https://github.com/jkrumm/basalt-ui/compare/v2.0.2...v2.0.3) (2026-10-14)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* follow the router import in app-wiring and let CI run make check ([47b6152](https://github.com/jkrumm/basalt-ui/commit/47b61526ab3ae959c1d9e4595916782defb0454f))
|
|
7
|
+
* label the provider's nav commands and drop duplicate nav entries ([08ec6ee](https://github.com/jkrumm/basalt-ui/commit/08ec6eef320f1ae8e072584c48a903f672222364))
|
|
8
|
+
* show nav badges in the collapsed rail ([5e09ea0](https://github.com/jkrumm/basalt-ui/commit/5e09ea07f05822f853c118a19c2cf72fe593501a))
|
|
9
|
+
|
|
10
|
+
## [2.0.2](https://github.com/jkrumm/basalt-ui/compare/v2.0.1...v2.0.2) (2026-10-14)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* keep the brand symbol out of keyof a groupTokens result ([27f44d3](https://github.com/jkrumm/basalt-ui/commit/27f44d3da50f07f9adb5b850edc86e8e388d0550))
|
|
16
|
+
* make doctor and sync monorepo-aware ([eafb701](https://github.com/jkrumm/basalt-ui/commit/eafb7013d07a7935b393c70553e11d2a57f01c71))
|
|
17
|
+
* throw a clear error for a group not built by groupTokens ([7c0dc44](https://github.com/jkrumm/basalt-ui/commit/7c0dc447e2faff22561166f66d6e449be511981c))
|
|
18
|
+
|
|
1
19
|
## [2.0.1](https://github.com/jkrumm/basalt-ui/compare/v2.0.0...v2.0.1) (2026-10-14)
|
|
2
20
|
|
|
3
21
|
|
package/MIGRATING.md
CHANGED
|
@@ -66,18 +66,18 @@ There is one row per SURFACE, not per export, and a surface earns a row once any
|
|
|
66
66
|
shipped lefthook preset both changed in 1.30.0 with no row that owned them — which is how a
|
|
67
67
|
consumer read this index, found nothing, and diffed a KPI row that had silently gone 4-up → 2-up.
|
|
68
68
|
|
|
69
|
-
| Surface | 1.27.0 | 1.28.0 | 1.29.0 | 1.30.0 | 1.30.1 | 1.30.2 | 1.31.0 | 1.32.0 | 1.32.1 | 1.33.0 | 1.34.0 | 1.34.1 | 1.35.0 | 1.36.0 | 1.36.1 | 1.37.0 | 1.37.1 | 1.38.0 | 1.38.1 | 1.39.0 | 1.40.0 | 1.40.1 | 1.40.2 | 1.40.3 | 1.41.0 | 2.0.0 | 2.0.1 | Unreleased |
|
|
70
|
-
| ----------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ---------------------------------- | ------ | ------ | -------------------------------------------------------------------------------------------- | ------ | ------ | ------ | ------ | ------ | ----------------------------------------------- | ------ | ------ | ------ | ------ | ------------------------------------------------------------ | ---------- | --- | --- | --- |
|
|
71
|
-
| **tokens** (`./tokens`) | — | `--vx-divider` → `rgba()` on both schemes (§ Shell) | `--vx-space-touch-target` added (§ Additions) | eight spacing numbers (§ Chrome) | — | — | `--vx-hit` replaces the touch vars; `SIZE_CLASSES` (§ 1.31.0) | — | `SIZE_CLASSES`/`CONTAINER_CLASSES` actually exported (§ Fixes) | `CONTAINER_GRID_BREAKPOINTS`; `raw-breakpoint` trusts it (§ 1.33.0) | `CONTAINER_KEYS` (§ 1.34.0) | — | — | — | — | — | — | — | | `appShellInset` 20 → 16 (§ 1.38.1) | — | — | — | — | — | — | — | — | — |
|
|
72
|
-
| **charts** (`./charts`) | — | phone tier, `curve`, formatters, `state`, log axis (§ preamble) | `ChartState.empty: string`, `AxisBottomNumeric` (§ Additions) | responsive `height`, `legend.maxRows` (§ Charts) | `height` reaches the kinds; `maxRows` beats the `fill` fit (§ Charts) | — | container-class tier + `height` keys (§ 1.31.0) | — | `ResponsiveChartHeight` `sm` → key (§ Container recipes) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
73
|
-
| **shell** (`.`) | — | scrollport, region seams, **the brand left the sidebar** (§§ scrollport, brand, Shell) | `PageTitle`, `BasaltDevDock`, `useBreakpoint` (§ Additions) | More popover, aside pill, the responsive gutter, `useBasaltSpacing` (§ Chrome) | — | — | `theme.breakpoints` derived, `useSizeClass`, `data-basalt-host`, `useBreakpoint` on notice (§ 1.31.0) | `useBreakpoint` removal → 1.33.0; `useSizeClass` is shell-only (§ 1.32.0) | shell-less `shell/` gutter, `AppShell` breakpoints, `useSizeClass` for overlays (§§ Shell-less, `useSizeClass`) | — | `useBreakpoint` removed (§ 1.34.0) | — | — | `useCoarsePointer()` (§ `useCoarsePointer()`) | — | — | — | — | | content gutter 16, block 8 from `sm` (§ 1.38.1) | — | — | — | — | — | — | — | — | — |
|
|
74
|
-
| **controls** (`./controls`) | `NumberFilter`, `field.number` (§ Controls) | sheet renders panel rows; `PanelRow`, `SliderControl` (§ `basalt-ui/controls`) | — | — | — | — | — | — | — | `NumberFilter clearable`; `createSearchStore` `resets` (§ State and controls) | — | — | — | `FormSection`/`FormRow`/`FormGroup`/`FormActions` move here (§ The form layout moves) | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
75
|
-
| **forms** (`./forms`) | — | `field` → `inputProps`, **`inputProps` drops `key`**, the layout tier (§ `inputProps`) | `field` DELETED — and the `--fix` recipe no longer works (§ Consolidation) | — | — | — | — | — | `FormGroup` row no longer stretches (§ Fixes) | — | — | — | — | the layout + `useForm`/`schemaResolver` deprecated, removed 1.37.0 (§ The form layout moves) | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
76
|
-
| **data** (`./data/table`) | — | root is a `<div>`, row selection, `getItemKey` required (§ `basalt-ui/data`) | `./data` + `./query` + `./connectivity` dropped (§ Consolidation) | — | — | — | — | — | `renderCard` documented (§ `renderCard`) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
77
|
-
| **dashboard** (`.`) | `StatCard`: `unit`, `breakdown`, delta format (§ `StatCard`) | `StatGroup`, `WidgetGrid`, query-aware `StatCard` — additive | — | **the column law keys on the CONTAINER; `cols={4}` is 2-up at `sm`** (§ Dashboard) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
78
|
-
| **toolchain** (`./configs/*`) | — | — | the shipped lefthook preset's `check-theme` BROKE — the CLI resolver stopped ascending (§ CLI) | the preset's default bin, and the `root:` recipe (§ Toolchain) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
79
|
-
| **CLI** (`basalt-ui`) | — | — | **resolver stops relocating; `doctor` loses 6 of 10 checks** (§ CLI) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | the managed block moves `CLAUDE.md` → `AGENTS.md` (§ 1.41.0) | — | — | — |
|
|
80
|
-
| **guards** | five rules → `error` (§ Guards) | six new ids at `warn` (§ preamble) | `query-dual-import` retired in 1.29.1 (§ Guards) | four rules → `error` (§ Guards) | — | — | — | `raw-breakpoint`: the container-grid answer, `error` at 1.33.0 (§ 1.32.0) | `FormRow`/`FormGroup` homes in both lanes; `basalt-main` dropped (§ Fixes) | C1 + breakpoint pairs → `error`; `unknown-vx-token` `warn` (§ Guards) | — | — | — | `unknown-vx-token` → `error`; the token factories throw (§ Guards) | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
69
|
+
| Surface | 1.27.0 | 1.28.0 | 1.29.0 | 1.30.0 | 1.30.1 | 1.30.2 | 1.31.0 | 1.32.0 | 1.32.1 | 1.33.0 | 1.34.0 | 1.34.1 | 1.35.0 | 1.36.0 | 1.36.1 | 1.37.0 | 1.37.1 | 1.38.0 | 1.38.1 | 1.39.0 | 1.40.0 | 1.40.1 | 1.40.2 | 1.40.3 | 1.41.0 | 2.0.0 | 2.0.1 | 2.0.2 | 2.0.3 | Unreleased |
|
|
70
|
+
| ----------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ---------------------------------- | ------ | ------ | -------------------------------------------------------------------------------------------- | ------ | ------ | ------ | ------ | ------ | ----------------------------------------------- | ------ | ------ | ------ | ------ | ------------------------------------------------------------ | ---------- | --- | --- | --- | --- | --- |
|
|
71
|
+
| **tokens** (`./tokens`) | — | `--vx-divider` → `rgba()` on both schemes (§ Shell) | `--vx-space-touch-target` added (§ Additions) | eight spacing numbers (§ Chrome) | — | — | `--vx-hit` replaces the touch vars; `SIZE_CLASSES` (§ 1.31.0) | — | `SIZE_CLASSES`/`CONTAINER_CLASSES` actually exported (§ Fixes) | `CONTAINER_GRID_BREAKPOINTS`; `raw-breakpoint` trusts it (§ 1.33.0) | `CONTAINER_KEYS` (§ 1.34.0) | — | — | — | — | — | — | — | | `appShellInset` 20 → 16 (§ 1.38.1) | — | — | — | — | — | — | — | — | — | — | — |
|
|
72
|
+
| **charts** (`./charts`) | — | phone tier, `curve`, formatters, `state`, log axis (§ preamble) | `ChartState.empty: string`, `AxisBottomNumeric` (§ Additions) | responsive `height`, `legend.maxRows` (§ Charts) | `height` reaches the kinds; `maxRows` beats the `fill` fit (§ Charts) | — | container-class tier + `height` keys (§ 1.31.0) | — | `ResponsiveChartHeight` `sm` → key (§ Container recipes) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
73
|
+
| **shell** (`.`) | — | scrollport, region seams, **the brand left the sidebar** (§§ scrollport, brand, Shell) | `PageTitle`, `BasaltDevDock`, `useBreakpoint` (§ Additions) | More popover, aside pill, the responsive gutter, `useBasaltSpacing` (§ Chrome) | — | — | `theme.breakpoints` derived, `useSizeClass`, `data-basalt-host`, `useBreakpoint` on notice (§ 1.31.0) | `useBreakpoint` removal → 1.33.0; `useSizeClass` is shell-only (§ 1.32.0) | shell-less `shell/` gutter, `AppShell` breakpoints, `useSizeClass` for overlays (§§ Shell-less, `useSizeClass`) | — | `useBreakpoint` removed (§ 1.34.0) | — | — | `useCoarsePointer()` (§ `useCoarsePointer()`) | — | — | — | — | | content gutter 16, block 8 from `sm` (§ 1.38.1) | — | — | — | — | — | — | — | — | — | — | — |
|
|
74
|
+
| **controls** (`./controls`) | `NumberFilter`, `field.number` (§ Controls) | sheet renders panel rows; `PanelRow`, `SliderControl` (§ `basalt-ui/controls`) | — | — | — | — | — | — | — | `NumberFilter clearable`; `createSearchStore` `resets` (§ State and controls) | — | — | — | `FormSection`/`FormRow`/`FormGroup`/`FormActions` move here (§ The form layout moves) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
75
|
+
| **forms** (`./forms`) | — | `field` → `inputProps`, **`inputProps` drops `key`**, the layout tier (§ `inputProps`) | `field` DELETED — and the `--fix` recipe no longer works (§ Consolidation) | — | — | — | — | — | `FormGroup` row no longer stretches (§ Fixes) | — | — | — | — | the layout + `useForm`/`schemaResolver` deprecated, removed 1.37.0 (§ The form layout moves) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
76
|
+
| **data** (`./data/table`) | — | root is a `<div>`, row selection, `getItemKey` required (§ `basalt-ui/data`) | `./data` + `./query` + `./connectivity` dropped (§ Consolidation) | — | — | — | — | — | `renderCard` documented (§ `renderCard`) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
77
|
+
| **dashboard** (`.`) | `StatCard`: `unit`, `breakdown`, delta format (§ `StatCard`) | `StatGroup`, `WidgetGrid`, query-aware `StatCard` — additive | — | **the column law keys on the CONTAINER; `cols={4}` is 2-up at `sm`** (§ Dashboard) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
78
|
+
| **toolchain** (`./configs/*`) | — | — | the shipped lefthook preset's `check-theme` BROKE — the CLI resolver stopped ascending (§ CLI) | the preset's default bin, and the `root:` recipe (§ Toolchain) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
79
|
+
| **CLI** (`basalt-ui`) | — | — | **resolver stops relocating; `doctor` loses 6 of 10 checks** (§ CLI) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | the managed block moves `CLAUDE.md` → `AGENTS.md` (§ 1.41.0) | — | — | — | — | — |
|
|
80
|
+
| **guards** | five rules → `error` (§ Guards) | six new ids at `warn` (§ preamble) | `query-dual-import` retired in 1.29.1 (§ Guards) | four rules → `error` (§ Guards) | — | — | — | `raw-breakpoint`: the container-grid answer, `error` at 1.33.0 (§ 1.32.0) | `FormRow`/`FormGroup` homes in both lanes; `basalt-main` dropped (§ Fixes) | C1 + breakpoint pairs → `error`; `unknown-vx-token` `warn` (§ Guards) | — | — | — | `unknown-vx-token` → `error`; the token factories throw (§ Guards) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
@@ -992,11 +992,33 @@ optional, subpath-required peers.
|
|
|
992
992
|
_Nothing yet. Author the next section under this heading as `## Unreleased — <title>`; the
|
|
993
993
|
release renames it and opens a new one here._
|
|
994
994
|
|
|
995
|
-
## 2.0.
|
|
995
|
+
## 2.0.3 — argo shell and CI friction
|
|
996
|
+
|
|
997
|
+
- `doctor`'s `app-wiring` follows the entry's relative imports (three deep): `createBasaltRouter`
|
|
998
|
+
may be called in `src/lib/router.ts` (or any module `main.tsx` imports), not only in `main.tsx`.
|
|
999
|
+
- The seeded `.github/workflows/check.yml` runs `make check` when the repo's Makefile has a
|
|
1000
|
+
`check:` target, after `doctor` and `sync --check` (which always run, so drift is never
|
|
1001
|
+
skippable); otherwise it keeps the built-in lint, theme and format steps. `init` decides once, on
|
|
1002
|
+
seeding. An already-seeded workflow is yours and unchanged: replace its lint/theme/format steps
|
|
1003
|
+
with `- run: make check` to adopt it.
|
|
1004
|
+
- The collapsed `BasaltShell` rail shows a dot on the icon of any nav item with a count or badge,
|
|
1005
|
+
and the link's accessible name carries the count (e.g. "Calendar, 3"). Expanded rendering is
|
|
1006
|
+
unchanged.
|
|
1007
|
+
- `BasaltProvider` takes `navCommandLabel?: (item) => string` to label the Spotlight `nav.<id>`
|
|
1008
|
+
entries it generates from the nav (e.g. "Go to …"); default unchanged. A `defineCommands` entry
|
|
1009
|
+
with id `nav.<id>` now replaces the generated one instead of showing twice.
|
|
996
1010
|
|
|
997
|
-
|
|
1011
|
+
## 2.0.2
|
|
998
1012
|
|
|
999
|
-
|
|
1013
|
+
- `doctor` and `sync` are monorepo-aware. The manifest, `.claude/` and the AGENTS block stay at the
|
|
1014
|
+
install root; the app-scoped half (`tsconfig-base`, `app-wiring`, the `src/main.tsx`,
|
|
1015
|
+
`src/lib/nav.tsx` and `src/routes/__root.tsx` seeds) targets the app package: `basalt.app`
|
|
1016
|
+
(relative path, e.g. `"apps/dashboard"`) in the root package.json, else the one workspace package
|
|
1017
|
+
that depends on basalt-ui and has `src/main.tsx` or `index.html`, else the cwd. Two candidates
|
|
1018
|
+
fail with a message naming `basalt.app`. `doctor` run inside the app package finds the root
|
|
1019
|
+
manifest, and warns about a router seed an earlier `sync` left at the root — delete it.
|
|
1020
|
+
|
|
1021
|
+
## 2.0.1
|
|
1000
1022
|
|
|
1001
1023
|
- `doctor` gains `exact-peers`: for each exact-pinned peer of the installed basalt-ui (the three
|
|
1002
1024
|
`@fontsource-variable/*`, `motion`, `remend`, …) it compares your installed version and prints a
|
|
@@ -1009,10 +1031,6 @@ _Nothing to migrate in this release._
|
|
|
1009
1031
|
spotlight layer imports; extension packages (`@mantine/dates`, `@mantine/schedule`) stay, after
|
|
1010
1032
|
`basalt-ui/styles.css`.
|
|
1011
1033
|
|
|
1012
|
-
## 2.0.0
|
|
1013
|
-
|
|
1014
|
-
_Nothing to migrate in this release._
|
|
1015
|
-
|
|
1016
1034
|
## 1.41.0 — the managed block moves to AGENTS.md
|
|
1017
1035
|
|
|
1018
1036
|
**Changed: `init` and `sync` splice the `<!-- basalt:begin … -->` block into `AGENTS.md`, not
|
package/configs/check.yml
CHANGED
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
# from the working directory (bun's isolated linker puts it beside the package that depends
|
|
14
14
|
# on it, not at the root) bunx silently downloads a DIFFERENT copy from npm and the gate
|
|
15
15
|
# runs a version nobody pinned.
|
|
16
|
+
# The gate is the consumer's when it has one: with a Makefile `check:` target the workflow runs
|
|
17
|
+
# `make check` (after `doctor` and `sync --check`, which always run first so drift can never be
|
|
18
|
+
# skipped by a custom gate); without one it runs the built-in lint + theme guard + format steps.
|
|
19
|
+
# `init` decides once, when it seeds this file. Add gates to your `make check`, not to this file.
|
|
16
20
|
name: check
|
|
17
21
|
on:
|
|
18
22
|
pull_request:
|
|
@@ -28,11 +32,7 @@ jobs:
|
|
|
28
32
|
with:
|
|
29
33
|
bun-version: latest
|
|
30
34
|
- run: bun install --frozen-lockfile
|
|
31
|
-
|
|
32
|
-
- run: '{{BASALT_BIN}} doctor'
|
|
33
|
-
- run: '{{BASALT_BIN}} check-theme'
|
|
34
|
-
- run: '{{BASALT_BIN}} sync --check'
|
|
35
|
-
- run: bunx oxfmt {{ROOTS_GLOBS}} '!**/dist/**' --check
|
|
35
|
+
# {{GATE_STEPS}}
|
|
36
36
|
# Enable once your app defines these package.json scripts:
|
|
37
37
|
# - run: bun run typecheck
|
|
38
38
|
# - run: bun run test
|
package/dist/cli/config.d.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import type { GuardKind, GuardSeverity } from '../guard/index.js';
|
|
2
2
|
/** Shape of the optional `"basalt"` key in a consumer's package.json. */
|
|
3
3
|
export type BasaltConfig = {
|
|
4
|
+
/**
|
|
5
|
+
* The Vite app's directory relative to the install root, for a workspace monorepo whose manifest,
|
|
6
|
+
* `.claude/` and AGENTS block live at the root. App-scoped checks (`tsconfig-base`, `app-wiring`)
|
|
7
|
+
* and the router seeds target it. Default: the single workspace package that depends on basalt-ui
|
|
8
|
+
* and has a Vite entry, else the root itself.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* { app: 'apps/dashboard' }
|
|
12
|
+
*/
|
|
13
|
+
app?: string;
|
|
4
14
|
/** Source roots to scan. Default: `['src']`. Set explicitly for a monorepo layout. */
|
|
5
15
|
roots?: string[];
|
|
6
16
|
/** Files exempt from the scan (they ARE the palette source). Default: argo's exempt set. */
|
package/dist/cli/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExD,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG;IACzB,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAA;IACnC;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,uGAAuG;IACvG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB;wFACoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAA;IACpD,6FAA6F;IAC7F,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;;;;;;;;;;OAeG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAA;IACzD;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5E,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,EAAE,CAG5E;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGlF;AAED,eAAO,MAAM,YAAY,QAAQ,CAAA;AACjC,eAAO,MAAM,aAAa,UAAiB,CAAA;AAE3C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,EAAE,CAExD;AAED,mGAAmG;AACnG,eAAO,MAAM,kBAAkB,EAIf,CAAC,MAAM,YAAY,CAAC,EAAE,CAAA;AAEtC,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEhE,CAAA"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExD,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAA;IACnC;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,uGAAuG;IACvG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB;wFACoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAA;IACpD,6FAA6F;IAC7F,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;;;;;;;;;;OAeG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAA;IACzD;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5E,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,EAAE,CAG5E;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGlF;AAED,eAAO,MAAM,YAAY,QAAQ,CAAA;AACjC,eAAO,MAAM,aAAa,UAAiB,CAAA;AAE3C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,EAAE,CAExD;AAED,mGAAmG;AACnG,eAAO,MAAM,kBAAkB,EAIf,CAAC,MAAM,YAAY,CAAC,EAAE,CAAA;AAEtC,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEhE,CAAA"}
|
package/dist/cli/config.js
CHANGED
|
@@ -11,7 +11,7 @@ const DEFAULT_ROOTS = [DEFAULT_ROOT];
|
|
|
11
11
|
function resolveRoots(cfg) {
|
|
12
12
|
return cfg.roots?.length ? cfg.roots : DEFAULT_ROOTS;
|
|
13
13
|
}
|
|
14
|
-
const BASALT_CONFIG_KEYS = "roots exempt profile include spacingSteps severity forbiddenAccents accentHue rawRadius rawSurface cardWithBorder offSystemSurfaceVar mantineShadeIndex rawHtmlLayout inlineSpacing inlineDisplay rawMotionValue rawFormControl sub16InputFont seriesModulePath exemptRules aiMajorSkewReason".split(" ");
|
|
14
|
+
const BASALT_CONFIG_KEYS = "app roots exempt profile include spacingSteps severity forbiddenAccents accentHue rawRadius rawSurface cardWithBorder offSystemSurfaceVar mantineShadeIndex rawHtmlLayout inlineSpacing inlineDisplay rawMotionValue rawFormControl sub16InputFont seriesModulePath exemptRules aiMajorSkewReason".split(" ");
|
|
15
15
|
const RETIRED_CONFIG_KEYS = {
|
|
16
16
|
chartMissingAriaLabel: "its guard kind is gone in 2.0 (`ariaLabel` is required on a chart now)"
|
|
17
17
|
};
|
|
@@ -22,7 +22,7 @@ export declare function droppedSubpathsCheck(cwd: string, cfg: BasaltConfig, ins
|
|
|
22
22
|
export declare function seedTsconfigExtends(cwd: string): string | null;
|
|
23
23
|
/**
|
|
24
24
|
* `app-wiring`: the entry module `index.html` loads (default src/main.tsx) mounts `BasaltProvider`
|
|
25
|
-
* on a `createBasaltRouter` router, and the router tree is generated: the vite config calls a
|
|
25
|
+
* on a `createBasaltRouter` router (called in the entry or a module it imports), and the router tree is generated: the vite config calls a
|
|
26
26
|
* binding imported from `@tanstack/router-plugin` in `plugins`, or a `routeTree.gen.*` already sits
|
|
27
27
|
* beside the entry (or in src/). `basaltViteConfig` does not register that plugin, so naming it
|
|
28
28
|
* proves nothing.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-upgrade.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-upgrade.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAA;AAgB9D,wEAAwE;AACxE,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,MACc,CAAA;AA+CvD,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAqBpD;AA+CD,4FAA4F;AAC5F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,KAAK,CAyBhF;AA4CD,mGAAmG;AACnG,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,aAAa,GACrB,KAAK,CA8BP;AAUD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkC9D;
|
|
1
|
+
{"version":3,"file":"doctor-upgrade.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-upgrade.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAA;AAgB9D,wEAAwE;AACxE,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,MACc,CAAA;AA+CvD,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAqBpD;AA+CD,4FAA4F;AAC5F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,KAAK,CAyBhF;AA4CD,mGAAmG;AACnG,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,aAAa,GACrB,KAAK,CA8BP;AAUD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkC9D;AAgGD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAkCjD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAezD;AAaD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,KAAK,CAwB1E"}
|
|
@@ -234,6 +234,39 @@ function registersRouterPlugin(src) {
|
|
|
234
234
|
);
|
|
235
235
|
});
|
|
236
236
|
}
|
|
237
|
+
const RELATIVE_IMPORT = /(?:\b(?:import|export)\b[^'";]*?\bfrom|\bimport)\s*['"](\.{1,2}\/[^'"]+)['"]/g;
|
|
238
|
+
function resolveRelative(from, spec) {
|
|
239
|
+
const base = resolve(dirname(from), spec.replace(/\.[jt]sx?$/, ""));
|
|
240
|
+
return [
|
|
241
|
+
resolve(dirname(from), spec),
|
|
242
|
+
`${base}.ts`,
|
|
243
|
+
`${base}.tsx`,
|
|
244
|
+
`${base}/index.ts`,
|
|
245
|
+
`${base}/index.tsx`
|
|
246
|
+
].find((f) => /\.[jt]sx?$/.test(f) && existsSync(f)) ?? null;
|
|
247
|
+
}
|
|
248
|
+
function routerCreatedInImports(cwd, entry) {
|
|
249
|
+
const seen = /* @__PURE__ */ new Set([resolve(cwd, entry)]);
|
|
250
|
+
let frontier = [...seen];
|
|
251
|
+
for (let depth = 0; depth < 3 && frontier.length > 0; depth++) {
|
|
252
|
+
const next = [];
|
|
253
|
+
for (const file of frontier) {
|
|
254
|
+
for (const m of (readIfExists(file) ?? "").matchAll(RELATIVE_IMPORT)) {
|
|
255
|
+
const dep = resolveRelative(file, m[1] ?? "");
|
|
256
|
+
if (dep === null || seen.has(dep)) continue;
|
|
257
|
+
seen.add(dep);
|
|
258
|
+
const { code, inLiteral } = tokenize(readIfExists(dep) ?? "");
|
|
259
|
+
const called = [...code.matchAll(/\bcreateBasaltRouter\b/g)].some(
|
|
260
|
+
(c) => !inLiteral(c.index)
|
|
261
|
+
);
|
|
262
|
+
if (called) return true;
|
|
263
|
+
next.push(dep);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
frontier = next;
|
|
267
|
+
}
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
237
270
|
function appWiringCheck(cwd) {
|
|
238
271
|
return guarded("app-wiring", () => {
|
|
239
272
|
const entry = (htmlEntry(readIfExists(resolve(cwd, "index.html")) ?? "") ?? "src/main.tsx").replace(/^\//, "");
|
|
@@ -243,7 +276,9 @@ function appWiringCheck(cwd) {
|
|
|
243
276
|
}
|
|
244
277
|
const { code, inLiteral } = tokenize(text);
|
|
245
278
|
const used = (name) => [...code.matchAll(new RegExp(`\\b${name}\\b`, "g"))].some((m) => !inLiteral(m.index));
|
|
246
|
-
const missing = ["BasaltProvider", "createBasaltRouter"].filter(
|
|
279
|
+
const missing = ["BasaltProvider", "createBasaltRouter"].filter(
|
|
280
|
+
(name) => !used(name) && !(name === "createBasaltRouter" && routerCreatedInImports(cwd, entry))
|
|
281
|
+
);
|
|
247
282
|
if (missing.length > 0) {
|
|
248
283
|
return {
|
|
249
284
|
fail: `app-wiring: ${entry} does not use ${missing.join(" or ")}. Fix: make it match ${SEED_HINT} (\`init\` seeds it only when the file is absent).`
|
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAyDA,MAAM,MAAM,YAAY,GAAG;IACzB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAA;IACpB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AA8CD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,MAAM,CAAC,aAAa,GAAE,MAAsB,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,MAAM,CAsU1F"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -19,7 +19,9 @@ import {
|
|
|
19
19
|
readBasaltConfig,
|
|
20
20
|
readIfExists,
|
|
21
21
|
readManifest,
|
|
22
|
+
resolveAppDir,
|
|
22
23
|
resolveProjectDir,
|
|
24
|
+
ROUTER_SEED_DESTS,
|
|
23
25
|
sameFile,
|
|
24
26
|
scannableFiles,
|
|
25
27
|
scanBlock,
|
|
@@ -74,7 +76,12 @@ function resolveAiMajorSkewReason(cfg) {
|
|
|
74
76
|
function doctor(invocationCwd = process.cwd(), flags = []) {
|
|
75
77
|
if (conflictingProfileFlags("doctor", flags)) return 1;
|
|
76
78
|
const project = resolveProjectDir(invocationCwd);
|
|
77
|
-
const
|
|
79
|
+
const aboveRoot = project.relocatedFrom === null && !existsSync(resolve(project.dir, MANIFEST_PATH)) ? findManifestAbove(project.dir) : null;
|
|
80
|
+
const insideApp = aboveRoot !== null && (() => {
|
|
81
|
+
const app2 = resolveAppDir(aboveRoot);
|
|
82
|
+
return !("error" in app2) && app2.dir === project.dir;
|
|
83
|
+
})();
|
|
84
|
+
const cwd = insideApp && aboveRoot !== null ? aboveRoot : project.dir;
|
|
78
85
|
const cfg = readBasaltConfig(cwd);
|
|
79
86
|
const result = { hardFailures: 0, warnings: 0, skipped: 0 };
|
|
80
87
|
const lines = [`
|
|
@@ -99,6 +106,11 @@ basalt-ui doctor \u2014 ${cwd}
|
|
|
99
106
|
lines.push(` \u2192 BASALT_CWD relocated from ${project.relocatedFrom} to ${cwd}.
|
|
100
107
|
`);
|
|
101
108
|
}
|
|
109
|
+
if (insideApp)
|
|
110
|
+
lines.push(` \u2192 ${project.dir} is the app package; checking the install root ${cwd}.
|
|
111
|
+
`);
|
|
112
|
+
const app = resolveAppDir(cwd);
|
|
113
|
+
const appDir = "error" in app ? cwd : app.dir;
|
|
102
114
|
const profile = declaredProfile(cfg, flags);
|
|
103
115
|
if (profile === "tokens-only") {
|
|
104
116
|
lines.push(
|
|
@@ -120,6 +132,19 @@ basalt-ui doctor \u2014 ${cwd}
|
|
|
120
132
|
fail(`${MANIFEST_PATH} missing \u2014 run \`basalt-ui init\` to scaffold the consumer repo`);
|
|
121
133
|
}
|
|
122
134
|
const install = findBasaltInstall(cwd);
|
|
135
|
+
if ("error" in app) {
|
|
136
|
+
fail(`app-dir: ${app.error}`);
|
|
137
|
+
} else if (app.rel !== "") {
|
|
138
|
+
pass(`app-dir: the app is ${app.rel} (agent layer and manifest stay at the install root)`);
|
|
139
|
+
const ledger = readManifest(cwd).files;
|
|
140
|
+
for (const seed of Object.values(ROUTER_SEED_DESTS)) {
|
|
141
|
+
if (ledger[seed] !== void 0 && existsSync(resolve(cwd, seed))) {
|
|
142
|
+
warn(
|
|
143
|
+
`app-dir: ${seed} was seeded at the install root by an earlier \`sync\`, but the app is ${app.rel} \u2014 it is dead code there. Delete it (\`sync\` seeds ${app.rel}/${seed} instead).`
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
123
148
|
const manifestVersion = profile === "tokens-only" ? void 0 : readManifest(cwd).basaltVersion;
|
|
124
149
|
const at = install.dir === null ? "" : `${relative(cwd, install.dir)} (${install.version})`;
|
|
125
150
|
if (install.dir === null) {
|
|
@@ -255,7 +280,7 @@ basalt-ui doctor \u2014 ${cwd}
|
|
|
255
280
|
);
|
|
256
281
|
} else {
|
|
257
282
|
const upgrade = [
|
|
258
|
-
["tsconfig-base: tsconfig.json extends the shipped preset", tsconfigBaseCheck(
|
|
283
|
+
["tsconfig-base: tsconfig.json extends the shipped preset", tsconfigBaseCheck(appDir)],
|
|
259
284
|
[
|
|
260
285
|
"retired-lint-rules: .oxlintrc.json sets no retired basalt/* rule",
|
|
261
286
|
retiredLintRulesCheck(cwd, install)
|
|
@@ -266,7 +291,7 @@ basalt-ui doctor \u2014 ${cwd}
|
|
|
266
291
|
],
|
|
267
292
|
[
|
|
268
293
|
"app-wiring: the entry mounts BasaltProvider and the router tree is generated",
|
|
269
|
-
appWiringCheck(
|
|
294
|
+
appWiringCheck(appDir)
|
|
270
295
|
],
|
|
271
296
|
["exact-peers: installed exact-pinned peers match basalt-ui", exactPeersCheck(cwd, install)],
|
|
272
297
|
[
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -152,6 +152,8 @@ type TemplateVars = {
|
|
|
152
152
|
* `bunx basalt-ui` only as the pre-install fallback.
|
|
153
153
|
*/
|
|
154
154
|
BASALT_BIN: string;
|
|
155
|
+
/** The CI gate steps after install: `make check` when the repo owns one, else the built-in set. */
|
|
156
|
+
GATE_STEPS: string;
|
|
155
157
|
};
|
|
156
158
|
export declare const MANIFEST_PATH = ".basalt/manifest.json";
|
|
157
159
|
/** The host file the managed block is spliced into (and its manifest key). */
|
|
@@ -170,6 +172,12 @@ export declare function readFrameworkVersion(pkgRoot: string): string;
|
|
|
170
172
|
* cached package, so it lets a consumer pin one version and be gated by another).
|
|
171
173
|
*/
|
|
172
174
|
export declare function basaltBinCommand(install: BasaltInstall, cwd: string): string;
|
|
175
|
+
/**
|
|
176
|
+
* The consumer owns the CI gate when its Makefile has a `check:` target: `doctor` and `sync --check`
|
|
177
|
+
* stay as steps of their own (drift is never skippable), then `make check` replaces the built-in
|
|
178
|
+
* lint/theme/format steps. Without one, the built-in steps run. Rendered at `{{GATE_STEPS}}`.
|
|
179
|
+
*/
|
|
180
|
+
export declare function ciGateSteps(cwd: string): string;
|
|
173
181
|
/** True when both paths resolve to one file (a symlinked pair). A missing path is simply "no". */
|
|
174
182
|
export declare function sameFile(a: string, b: string): boolean;
|
|
175
183
|
/** True when the host text carries a managed block (begin marker present). */
|
|
@@ -199,6 +207,22 @@ export declare const ROUTER_SEED_DESTS: {
|
|
|
199
207
|
readonly root: "src/routes/__root.tsx";
|
|
200
208
|
readonly main: "src/main.tsx";
|
|
201
209
|
};
|
|
210
|
+
/** A router seed's dest, relative to the install root: under the app dir when it is not the root. */
|
|
211
|
+
export declare function routerSeedDest(appRel: string, seed: keyof typeof ROUTER_SEED_DESTS): string;
|
|
212
|
+
/** The app directory a command's app-scoped half targets: `rel` is '' when it is the install root. */
|
|
213
|
+
export type AppResolution = {
|
|
214
|
+
dir: string;
|
|
215
|
+
rel: string;
|
|
216
|
+
} | {
|
|
217
|
+
error: string;
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* Where the Vite app lives relative to the install root `root` (manifest, `.claude/`, AGENTS block).
|
|
221
|
+
* ONE resolution for `doctor`, `sync` and `init`, in order: `basalt.app` in the root package.json;
|
|
222
|
+
* else the single workspace package that depends on basalt-ui AND has a Vite entry; else `root`
|
|
223
|
+
* itself (a single-package app). Two such packages is an error — the choice is not inferable.
|
|
224
|
+
*/
|
|
225
|
+
export declare function resolveAppDir(root: string): AppResolution;
|
|
202
226
|
/**
|
|
203
227
|
* Where the seed engine is running relative to the consumer's git repo — decides which
|
|
204
228
|
* repo-root-shaped seeds are safe to write. `init`/`sync` compute it once per run via
|
|
@@ -214,6 +238,10 @@ export type PlacementFlags = {
|
|
|
214
238
|
/** Absolute path of the detected repo root. Meaningful only when `isPackageRepoRoot` is false —
|
|
215
239
|
* otherwise it equals the package dir and is never read. */
|
|
216
240
|
repoRoot: string;
|
|
241
|
+
/** The app directory relative to the install root ('' = the root itself); see {@link resolveAppDir}. */
|
|
242
|
+
appRel: string;
|
|
243
|
+
/** Non-null when the app directory is ambiguous or invalid: commands refuse rather than guess. */
|
|
244
|
+
appError: string | null;
|
|
217
245
|
};
|
|
218
246
|
/** The default placement — today's single-package-at-repo-root behaviour, unconditionally. */
|
|
219
247
|
export declare const ROOT_PLACEMENT: PlacementFlags;
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,UAAU,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AA+B5C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,WAAW,CAiBzF;AAwBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,EAAE,CAEzD;AAED,eAAO,MAAM,IAAI,QAAyC,CAAA;AAC1D,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,QAA6B,CAAA;AA8B/D;qGACqG;AACrG,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOjD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAS1D;AA6CD,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIrE;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,mGAAmG;IACnG,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,gDAAgD;IAChD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,4FAA4F;IAC5F,GAAG,EAAE,KAAK,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,CAAA;CAC7C,CAAA;AAiBD,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAmB5D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/F;AAED;;;;GAIG;AACH,KAAK,iBAAiB,GAAG;IACvB,uFAAuF;IACvF,GAAG,EAAE,MAAM,CAAA;IACX,wFAAwF;IACxF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAOhE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,aAAa,CAI1F;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAO1F;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAKhF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,EAAE,CAqBvE;AAwBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAQ7E;AAMD;;;;;;;;;GASG;AACH,KAAK,IAAI,GAAG,SAAS,GAAG,MAAM,CAAA;AAE9B,+DAA+D;AAC/D,KAAK,WAAW,GAAG;IACjB,0FAA0F;IAC1F,IAAI,EAAE,MAAM,CAAA;IACZ,sBAAsB;IACtB,IAAI,EAAE,IAAI,CAAA;IACV;;;OAGG;IACH,OAAO,CAAC,EAAE,IAAI,CAAA;IACd,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,GAAG,IAAI,CAAA;CAC9C,CAAA;AAED,uEAAuE;AACvE,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,YAAY,CAAA;CACnB,CAAA;AAED;;;;GAIG;AACH,KAAK,YAAY,GAAG;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,uGAAuG;IACvG,WAAW,EAAE,MAAM,CAAA;IACnB,qGAAqG;IACrG,kBAAkB,EAAE,MAAM,CAAA;IAC1B,mFAAmF;IACnF,oBAAoB,EAAE,MAAM,CAAA;IAC5B;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB,mGAAmG;IACnG,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAMD,eAAO,MAAM,aAAa,0BAA0B,CAAA;AACpD,8EAA8E;AAC9E,eAAO,MAAM,SAAS,cAAc,CAAA;AACpC,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,cAAc,CAAA;AAE5C,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvD;AAED,qGAAqG;AACrG,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzE;AAYD,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI5E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAa/C;AAgED,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOtD;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAE5D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IACvC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC7C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,CAiBA;AAED,uGAAuG;AACvG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wGAAwG;AACxG,MAAM,MAAM,aAAa,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAErD,0GAA0G;AAC1G,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAA;AAEV,qGAAqG;AACrG,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,iBAAiB,GAAG,MAAM,CAE3F;AAED,sGAAsG;AACtG,MAAM,MAAM,aAAa,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAS5E;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA2BzD;AAoBD;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;;;;eAIW;IACX,iBAAiB,EAAE,OAAO,CAAA;IAC1B;iEAC6D;IAC7D,QAAQ,EAAE,MAAM,CAAA;IAChB,wGAAwG;IACxG,MAAM,EAAE,MAAM,CAAA;IACd,kGAAkG;IAClG,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,CAAA;AAED,8FAA8F;AAC9F,eAAO,MAAM,cAAc,EAAE,cAK5B,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,oGAAoG;AACpG,eAAO,MAAM,aAAa,2GAC2E,CAAA;AACrG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMtD;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAS5D;AAED,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,SAAS,GAAE,cAA+B,GAAG,WAAW,EAAE,CA4JtF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,EAAE,CAqBjF;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,CAAC,CAAA;IACV,gGAAgG;IAChG,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gGAAgG;IAChG,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC,CAAA;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAyBlD;AAiBD,0FAA0F;AAC1F,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,SAAS,WAAW,EAAE,GAC5B,SAAS,MAAM,EAAE,CAMnB;AAED,sGAAsG;AACtG,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAElE;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAarD;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,WAAW,CAqBb;AAgBD,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGvE;AAED,kFAAkF;AAClF,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,+FAA+F;IAC/F,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,CAAA;AAUD,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,SAAS,CAQvF;AAED,KAAK,cAAc,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;AAErE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CASjF;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAa3F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAMvE;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAGxD;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GAChD,OAAO,CAcT;AAyBD,+FAA+F;AAC/F,MAAM,MAAM,UAAU;AACpB,oDAAoD;AAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE;AACtD,iEAAiE;GAC/D;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE;AACnC,wFAAwF;GACtF;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAQ5F;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,UAAU,CAgBhF;AAED,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAuClF;AAgCD,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMvE;AAED,gGAAgG;AAChG,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,cAAc,CAAA;AAE5F,+FAA+F;AAC/F,eAAO,MAAM,YAAY;;;;CAIf,CAAA;AAEV,gFAAgF;AAChF,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,EAAE,MAAM,MAAM,KAAG,KAAK,IAAI,MACH,CAAA;AAElE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGjE;AAiCD,MAAM,MAAM,YAAY;AACtB,wFAAwF;AACtF;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE;AAC9B,kDAAkD;GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACnD,0FAA0F;GACxF;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACpD,oFAAoF;GAClF;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1D,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAuBlE;AAID;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,CAiCnF;AAQD;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,aAAa,CAAA;AA6IvD,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,EAAE,CAE/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4DzF;AAGD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAA;AAClC,YAAY,EAAE,WAAW,EAAE,CAAA;AAI3B,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,uBAAuB,EAAE,SAAS,EAAE,CAAA;AAClG,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACzC,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/cli/index.js
CHANGED
|
@@ -268,6 +268,18 @@ function basaltBinCommand(install, cwd) {
|
|
|
268
268
|
const binDir = resolve(install.dir, "..", ".bin");
|
|
269
269
|
return `${relativePosix(cwd, binDir).replace(/^\.\//, "")}/basalt-ui`;
|
|
270
270
|
}
|
|
271
|
+
function ciGateSteps(cwd) {
|
|
272
|
+
const owned = /^check\s*:/m.test(readIfExists(resolve(cwd, "Makefile")) ?? "");
|
|
273
|
+
const drift = ["- run: '{{BASALT_BIN}} doctor'", "- run: '{{BASALT_BIN}} sync --check'"];
|
|
274
|
+
const steps = owned ? [...drift, "- run: make check"] : [
|
|
275
|
+
"- run: bunx oxlint .",
|
|
276
|
+
drift[0],
|
|
277
|
+
"- run: '{{BASALT_BIN}} check-theme'",
|
|
278
|
+
drift[1],
|
|
279
|
+
"- run: bunx oxfmt {{ROOTS_GLOBS}} '!**/dist/**' --check"
|
|
280
|
+
];
|
|
281
|
+
return steps.join("\n ");
|
|
282
|
+
}
|
|
271
283
|
function buildTemplateVars(pkgRoot, cwd, cfg) {
|
|
272
284
|
const install = findBasaltInstall(cwd);
|
|
273
285
|
return {
|
|
@@ -278,14 +290,16 @@ function buildTemplateVars(pkgRoot, cwd, cfg) {
|
|
|
278
290
|
ROOTS_GLOBS: resolveRoots(cfg).map(toRootGlob).join(" "),
|
|
279
291
|
OXLINT_PRESET_PATH: shippedAssetPath(install, cwd, OXLINT_FILES.preset),
|
|
280
292
|
LEFTHOOK_PRESET_PATH: shippedAssetPath(install, cwd, "configs/lefthook.yml"),
|
|
281
|
-
BASALT_BIN: basaltBinCommand(install, cwd)
|
|
293
|
+
BASALT_BIN: basaltBinCommand(install, cwd),
|
|
294
|
+
GATE_STEPS: ciGateSteps(cwd)
|
|
282
295
|
};
|
|
283
296
|
}
|
|
284
297
|
function fillTemplate(tpl, vars) {
|
|
285
|
-
|
|
298
|
+
const fill = (text) => text.replace(/\{\{(\w+)\}\}/g, (m, key) => {
|
|
286
299
|
const v = vars[key];
|
|
287
300
|
return v ?? m;
|
|
288
301
|
});
|
|
302
|
+
return fill(tpl.replace("# {{GATE_STEPS}}", vars.GATE_STEPS));
|
|
289
303
|
}
|
|
290
304
|
function findBlockRegion(host) {
|
|
291
305
|
const start = host.indexOf(BLOCK_BEGIN_PREFIX);
|
|
@@ -351,6 +365,37 @@ const ROUTER_SEED_DESTS = {
|
|
|
351
365
|
root: "src/routes/__root.tsx",
|
|
352
366
|
main: "src/main.tsx"
|
|
353
367
|
};
|
|
368
|
+
function routerSeedDest(appRel, seed) {
|
|
369
|
+
return appRel === "" ? ROUTER_SEED_DESTS[seed] : `${appRel}/${ROUTER_SEED_DESTS[seed]}`;
|
|
370
|
+
}
|
|
371
|
+
const appRelative = (root, dir) => relativePosix(root, dir).replace(/^\.\/?/, "");
|
|
372
|
+
const hasViteEntry = (dir) => existsSync(resolve(dir, "src/main.tsx")) || existsSync(resolve(dir, "index.html"));
|
|
373
|
+
function resolveAppDir(root) {
|
|
374
|
+
const self = { dir: root, rel: "" };
|
|
375
|
+
const explicit = readBasaltConfig(root).app;
|
|
376
|
+
if (explicit !== void 0) {
|
|
377
|
+
const dir = resolve(root, explicit);
|
|
378
|
+
const rel = appRelative(root, dir);
|
|
379
|
+
if (rel.startsWith("..") || !existsSync(resolve(dir, "package.json"))) {
|
|
380
|
+
return {
|
|
381
|
+
error: `basalt.app "${explicit}" must be a directory with a package.json inside ${root}.`
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
return dir === root ? self : { dir, rel };
|
|
385
|
+
}
|
|
386
|
+
const candidates = collectWorkspacePackages(root).packages.filter(
|
|
387
|
+
(pkg) => pkg.dir !== root && hasDependency(pkg.dir, "basalt-ui") && hasViteEntry(pkg.dir)
|
|
388
|
+
);
|
|
389
|
+
if (candidates.length === 0) return self;
|
|
390
|
+
const [only] = candidates;
|
|
391
|
+
if (candidates.length === 1 && only !== void 0) {
|
|
392
|
+
return { dir: only.dir, rel: appRelative(root, only.dir) };
|
|
393
|
+
}
|
|
394
|
+
const names = candidates.map((pkg) => appRelative(root, pkg.dir)).join(", ");
|
|
395
|
+
return {
|
|
396
|
+
error: `${candidates.length} workspace packages depend on basalt-ui and have a Vite entry (${names}) \u2014 cannot tell which is the app. Set \`basalt.app\` (e.g. \`"basalt": { "app": "apps/web" }\`) in the root package.json.`
|
|
397
|
+
};
|
|
398
|
+
}
|
|
354
399
|
function hasDependency(cwd, pkgName) {
|
|
355
400
|
try {
|
|
356
401
|
const pkg = JSON.parse(readFileSync(resolve(cwd, "package.json"), "utf8"));
|
|
@@ -363,7 +408,9 @@ function hasDependency(cwd, pkgName) {
|
|
|
363
408
|
}
|
|
364
409
|
const ROOT_PLACEMENT = {
|
|
365
410
|
isPackageRepoRoot: true,
|
|
366
|
-
repoRoot: ""
|
|
411
|
+
repoRoot: "",
|
|
412
|
+
appRel: "",
|
|
413
|
+
appError: null
|
|
367
414
|
};
|
|
368
415
|
function findRepoRoot(dir) {
|
|
369
416
|
let current = dir;
|
|
@@ -384,9 +431,12 @@ function oxlintBinResolves(dir) {
|
|
|
384
431
|
}
|
|
385
432
|
function resolvePlacement(cwd) {
|
|
386
433
|
const repoRoot = findRepoRoot(cwd);
|
|
434
|
+
const app = resolveAppDir(cwd);
|
|
387
435
|
return {
|
|
388
436
|
isPackageRepoRoot: repoRoot === cwd,
|
|
389
|
-
repoRoot
|
|
437
|
+
repoRoot,
|
|
438
|
+
appRel: "error" in app ? "" : app.rel,
|
|
439
|
+
appError: "error" in app ? app.error : null
|
|
390
440
|
};
|
|
391
441
|
}
|
|
392
442
|
function managedFiles(placement = ROOT_PLACEMENT) {
|
|
@@ -480,7 +530,7 @@ pre-commit:
|
|
|
480
530
|
`
|
|
481
531
|
};
|
|
482
532
|
const rootRoute = {
|
|
483
|
-
dest:
|
|
533
|
+
dest: routerSeedDest(placement.appRel, "root"),
|
|
484
534
|
mode: "seed",
|
|
485
535
|
source: "agent/templates/__root.tpl",
|
|
486
536
|
render: (ctx) => {
|
|
@@ -490,13 +540,13 @@ pre-commit:
|
|
|
490
540
|
}
|
|
491
541
|
};
|
|
492
542
|
const navModule = {
|
|
493
|
-
dest:
|
|
543
|
+
dest: routerSeedDest(placement.appRel, "nav"),
|
|
494
544
|
mode: "seed",
|
|
495
545
|
source: "agent/templates/nav.tpl",
|
|
496
546
|
render: (ctx) => readSource(ctx.pkgRoot, "agent/templates/nav.tpl")
|
|
497
547
|
};
|
|
498
548
|
const mainEntry = {
|
|
499
|
-
dest:
|
|
549
|
+
dest: routerSeedDest(placement.appRel, "main"),
|
|
500
550
|
mode: "seed",
|
|
501
551
|
source: "agent/templates/main.tpl",
|
|
502
552
|
render: (ctx) => readSource(ctx.pkgRoot, "agent/templates/main.tpl")
|
|
@@ -964,6 +1014,7 @@ export {
|
|
|
964
1014
|
basaltBinCommand,
|
|
965
1015
|
basaltPresetEntry,
|
|
966
1016
|
checkTheme,
|
|
1017
|
+
ciGateSteps,
|
|
967
1018
|
classify,
|
|
968
1019
|
conflictingProfileFlags,
|
|
969
1020
|
declaredProfile,
|
|
@@ -1002,11 +1053,13 @@ export {
|
|
|
1002
1053
|
relativePosix,
|
|
1003
1054
|
renderContext,
|
|
1004
1055
|
reportPrune,
|
|
1056
|
+
resolveAppDir,
|
|
1005
1057
|
resolveGuardConfig,
|
|
1006
1058
|
resolvePlacement,
|
|
1007
1059
|
resolveProjectDir,
|
|
1008
1060
|
retiredManagedDests,
|
|
1009
1061
|
rootsNotices,
|
|
1062
|
+
routerSeedDest,
|
|
1010
1063
|
run,
|
|
1011
1064
|
sameFile,
|
|
1012
1065
|
scanBlock,
|
package/dist/cli/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,SAAS,CAAA;AA6D7D,yGAAyG;AACzG,wBAAgB,IAAI,CAAC,GAAG,GAAE,MAAsB,EAAE,aAAa,GAAE,aAAkB,GAAG,MAAM,CA0L3F"}
|
package/dist/cli/init.js
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
declaredProfile,
|
|
7
7
|
readBasaltConfig,
|
|
8
8
|
ROUTER_SEED_DESTS,
|
|
9
|
+
routerSeedDest,
|
|
9
10
|
findBasaltInstall,
|
|
10
11
|
managedFiles,
|
|
11
12
|
mergeOxlintExtends,
|
|
@@ -47,6 +48,11 @@ function init(cwd = process.cwd(), scaffoldFlags = {}) {
|
|
|
47
48
|
`\u26A0 basalt-ui init: basalt-ui does not resolve from ${cwd} or any directory above it \u2014 the seeded \`extends\` paths and CI steps are being written against the repo root by assumption. Install basalt-ui here (or at the repo root) and re-run \`basalt-ui init\` so they resolve.`
|
|
48
49
|
);
|
|
49
50
|
}
|
|
51
|
+
const appError = resolvePlacement(cwd).appError;
|
|
52
|
+
if (appError !== null) {
|
|
53
|
+
console.error(`\u2716 basalt-ui init: ${appError}`);
|
|
54
|
+
return 1;
|
|
55
|
+
}
|
|
50
56
|
const rootsState = reconcileRoots(cwd, { write: true });
|
|
51
57
|
const ctx = renderContext(cwd);
|
|
52
58
|
const lintScript = `oxlint . && ${ctx.vars.BASALT_BIN} check-theme`;
|
|
@@ -74,7 +80,7 @@ function init(cwd = process.cwd(), scaffoldFlags = {}) {
|
|
|
74
80
|
const manifest = readManifest(cwd);
|
|
75
81
|
const placement = resolvePlacement(cwd);
|
|
76
82
|
const tokensOnly = declaredProfile(readBasaltConfig(cwd), []) === "tokens-only";
|
|
77
|
-
const routerSeeds = Object.
|
|
83
|
+
const routerSeeds = Object.keys(ROUTER_SEED_DESTS).map((seed) => routerSeedDest(placement.appRel, seed));
|
|
78
84
|
const files = managedFiles(placement).filter((f) => !(tokensOnly && routerSeeds.includes(f.dest)));
|
|
79
85
|
const writtenFiles = [];
|
|
80
86
|
const keptFiles = [];
|
package/dist/cli/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"AAwCA,gGAAgG;AAChG,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAGjE;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mGAAmG;IACnG,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrF;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,IAAI,GAAE,WAAgB,EAAE,aAAa,GAAE,MAAsB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"AAwCA,gGAAgG;AAChG,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAGjE;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mGAAmG;IACnG,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrF;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,IAAI,GAAE,WAAgB,EAAE,aAAa,GAAE,MAAsB,GAAG,MAAM,CAgM1F"}
|
package/dist/cli/sync.js
CHANGED
|
@@ -63,6 +63,11 @@ function sync(opts = {}, invocationCwd = process.cwd()) {
|
|
|
63
63
|
);
|
|
64
64
|
return 0;
|
|
65
65
|
}
|
|
66
|
+
const appError = resolvePlacement(cwd).appError;
|
|
67
|
+
if (appError !== null) {
|
|
68
|
+
console.error(`\u2716 basalt-ui sync: ${appError}`);
|
|
69
|
+
return 1;
|
|
70
|
+
}
|
|
66
71
|
if (!existsSync(resolve(cwd, MANIFEST_PATH))) {
|
|
67
72
|
const elsewhere = findManifestAbove(cwd);
|
|
68
73
|
const wouldWrite = managedFiles(resolvePlacement(cwd)).length;
|