basalt-ui 1.40.3 → 1.41.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 +4 -2
- package/CHANGELOG.md +13 -0
- package/MIGRATING.md +36 -12
- package/README.md +1 -1
- package/agent/rules/basalt-batteries.md +1 -1
- package/agent/skills/basalt-app/SKILL.md +1 -1
- package/agent/skills/basalt-design/SKILL.md +1 -1
- package/agent/templates/DESIGN.md.tpl +1 -1
- package/configs/check.yml +1 -1
- package/configs/oxlint-plugin.js +5 -5
- package/configs/oxlint-plugin.test.ts +1 -1
- package/dist/agent/foreign.d.ts +3 -2
- package/dist/agent/foreign.d.ts.map +1 -1
- package/dist/cli/doctor.d.ts +5 -2
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +29 -0
- package/dist/cli/index.d.ts +61 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +112 -6
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +10 -0
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +18 -1
- package/dist/content/copy-action.d.ts +1 -1
- package/dist/content/glyphs.d.ts +1 -1
- package/dist/data/virtual-list.d.ts +1 -1
- package/llms.txt +2 -2
- package/package.json +1 -1
- package/src/agent/foreign.ts +3 -2
- package/src/charts/index.ts +2 -2
- package/src/cli/doctor.ts +47 -4
- package/src/cli/index.ts +180 -11
- package/src/cli/init.ts +14 -0
- package/src/cli/sync.ts +24 -1
- package/src/content/copy-action.tsx +1 -1
- package/src/content/glyphs.tsx +1 -1
- package/src/data/virtual-list.tsx +1 -1
- package/src/guard/index.ts +1 -1
- /package/agent/templates/{CLAUDE-block.md.tpl → AGENTS-block.md.tpl} +0 -0
package/AGENTS.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
## basalt-ui — Agent Quick Reference
|
|
2
2
|
|
|
3
|
+
> Maintaining this package? Read `packages/basalt-ui/MAINTAINING.md` first (repo-only — not in the tarball).
|
|
4
|
+
|
|
3
5
|
React 19 + Mantine v9 framework: `BasaltProvider` + `createBasaltTheme`, app shell, visx chart
|
|
4
6
|
system with a three-tier `--vx-*` CSS-variable token system, and TanStack adapter batteries.
|
|
5
7
|
Toolchain: Bun runtime, oxlint + oxfmt, conventional commits (empty scope), `master` branch.
|
|
@@ -67,10 +69,10 @@ correct for them **and only while basalt is not installed here** — once it is,
|
|
|
67
69
|
local bin like everything else. See the note below.
|
|
68
70
|
|
|
69
71
|
```bash
|
|
70
|
-
bunx basalt-ui init # FIRST STEP: scaffold .claude/rules/ + .claude/skills/, managed
|
|
72
|
+
bunx basalt-ui init # FIRST STEP: scaffold .claude/rules/ + .claude/skills/, managed AGENTS.md block, DESIGN.md seed, toolchain seeds
|
|
71
73
|
basalt-ui --version # one bare line, exit 0 — which CLI is actually running (also -v / version)
|
|
72
74
|
basalt-ui check-theme # fail on off-palette colors in consumer source
|
|
73
|
-
basalt-ui sync # reconcile managed files (.claude/rules/, .claude/skills/,
|
|
75
|
+
basalt-ui sync # reconcile managed files (.claude/rules/, .claude/skills/, AGENTS.md block) + delete the ones this version retired
|
|
74
76
|
basalt-ui sync --check # CI freshness gate — exits non-zero if any managed file drifted or a retired one is still present
|
|
75
77
|
basalt-ui doctor # integration health — SKIPPED is a third outcome and exits non-zero
|
|
76
78
|
bunx basalt-ui tokens:css # emit the --vx-* stylesheet (no React, no Mantine, no bundler) — bunx ONLY if basalt is not installed
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
# [1.41.0](https://github.com/jkrumm/basalt-ui/compare/v1.40.3...v1.41.0) (2026-10-10)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* refuse a bad block before any write, and never crash on sameFile ([e98edb5](https://github.com/jkrumm/basalt-ui/commit/e98edb57d9983838bb0d17adb4ba1f0379f32af8))
|
|
7
|
+
* report malformed or conflicting blocks, warn on a shadowing CLAUDE.md ([61c32de](https://github.com/jkrumm/basalt-ui/commit/61c32de15dc6cc1379ceda220e6b551eb54da572))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* place the managed block in AGENTS.md and migrate it out of CLAUDE.md ([ce26af8](https://github.com/jkrumm/basalt-ui/commit/ce26af8a4df0bad33f94a3d697b58c1c7e94f73c))
|
|
13
|
+
|
|
1
14
|
## [1.40.3](https://github.com/jkrumm/basalt-ui/compare/v1.40.2...v1.40.3) (2026-10-05)
|
|
2
15
|
|
|
3
16
|
|
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 | 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) | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
|
|
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 | 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
|
|
|
@@ -86,6 +86,30 @@ consumer read this index, found nothing, and diffed a KPI row that had silently
|
|
|
86
86
|
_Nothing yet. Author the next section under this heading as `## Unreleased — <title>`; the
|
|
87
87
|
release renames it and opens a new one here._
|
|
88
88
|
|
|
89
|
+
## 1.41.0 — the managed block moves to AGENTS.md
|
|
90
|
+
|
|
91
|
+
**Changed: `init` and `sync` splice the `<!-- basalt:begin … -->` block into `AGENTS.md`, not
|
|
92
|
+
`CLAUDE.md`.** Claude Code loads a repo-root `AGENTS.md` directly, but any `CLAUDE.md` in or above
|
|
93
|
+
the working directory suppresses it — so the block can no longer be the reason a `CLAUDE.md` exists.
|
|
94
|
+
The shipped template is renamed `agent/templates/AGENTS-block.md.tpl`, and the manifest key moves
|
|
95
|
+
from `CLAUDE.md` to `AGENTS.md`.
|
|
96
|
+
|
|
97
|
+
**Migration is automatic — run `basalt-ui sync` once.** If `CLAUDE.md` carries a basalt block:
|
|
98
|
+
|
|
99
|
+
- the block is cut out of `CLAUDE.md` and spliced into `AGENTS.md` (created if missing);
|
|
100
|
+
- a `CLAUDE.md` left empty, or holding only `@AGENTS.md`, is deleted; anything else in it is
|
|
101
|
+
yours and stays — move it into `AGENTS.md` and delete the file, or Claude Code keeps loading
|
|
102
|
+
`CLAUDE.md` instead of `AGENTS.md`;
|
|
103
|
+
- a hand-edited block is carried over as it is and treated as drift (skipped, reported;
|
|
104
|
+
`sync --force` restores the shipped text) — the same rule every other managed unit follows;
|
|
105
|
+
- `sync --check` exits 1 until the move has happened, then 0;
|
|
106
|
+
- nothing is discarded silently: if `AGENTS.md` already has a block that differs from the one in
|
|
107
|
+
`CLAUDE.md`, or either file has duplicate or unterminated markers, `sync` and `sync --check` exit 1
|
|
108
|
+
naming the file, and both files stay untouched until you resolve it by hand.
|
|
109
|
+
|
|
110
|
+
`doctor` now warns (never fails) when a project-root `CLAUDE.md` does not import `@AGENTS.md` — it
|
|
111
|
+
suppresses `AGENTS.md` — or still carries a basalt block.
|
|
112
|
+
|
|
89
113
|
## 1.40.3
|
|
90
114
|
|
|
91
115
|
_Nothing to migrate in this release._
|
package/README.md
CHANGED
|
@@ -61,7 +61,7 @@ That's the whole install — there is no plugin, no marketplace, and no second v
|
|
|
61
61
|
|
|
62
62
|
- `.claude/rules/basalt-*.md` — six Claude Code rules (`basalt-tokens`, `basalt-mantine`, `basalt-charts`, `basalt-state`, `basalt-controls`, `basalt-batteries`), each with a generated coverage header naming what enforces it
|
|
63
63
|
- `.claude/skills/basalt-{app,design,charts}/SKILL.md` — the three skills (`/basalt-app`, `/basalt-design`, `/basalt-charts`), same managed path as the rules
|
|
64
|
-
- A managed `<!-- basalt:begin/end -->` block in `
|
|
64
|
+
- A managed `<!-- basalt:begin/end -->` block in `AGENTS.md` — stack facts, the DESIGN.md pointer, and the frontend-design restraint override
|
|
65
65
|
- A thin `DESIGN.md` seed — your app's deltas (series dictionary, identity, deviations)
|
|
66
66
|
- Toolchain seeds: `.oxlintrc.json` and `lefthook.yml` as `extends` stubs into `node_modules/basalt-ui/configs/` (the presets auto-update with the package), plus `.oxfmtrc.json` and `.github/workflows/check.yml` as starting copies
|
|
67
67
|
- `.basalt/manifest.json` — sha256 per managed file + the basalt-ui version, for `sync` three-way diff and `doctor`
|
|
@@ -29,7 +29,7 @@ fails a build if you re-roll one of these seams by hand; follow the doctrine bel
|
|
|
29
29
|
works but leaves in a stated `removeIn` minor (autofix renames the import, keeps your local
|
|
30
30
|
binding). The replacement and removal minor are always in `MIGRATING.md` § Unreleased the moment
|
|
31
31
|
the deprecation ships — that file, not the warning text, is where you confirm what to migrate to.
|
|
32
|
-
Maintainer
|
|
32
|
+
Maintainer notes (`MAINTAINING.md` in the repo, not shipped): § Deprecation lifecycle.
|
|
33
33
|
|
|
34
34
|
## Query — `createBasaltQueryClient`/`unwrap` (root barrel, C1: `./query` dropped)
|
|
35
35
|
|
|
@@ -17,7 +17,7 @@ bunx basalt-ui init # the ONE command that legitimately p
|
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
`init` writes the managed doctrine (`.claude/rules/basalt-*.md`, `.claude/skills/basalt-*/SKILL.md`,
|
|
20
|
-
the `
|
|
20
|
+
the `AGENTS.md` block), the seeds you then own (`DESIGN.md`, `.oxlintrc.json`, `.oxfmtrc.json`,
|
|
21
21
|
`lefthook.yml`, CI, optional scaffolds), and `.basalt/manifest.json` — a sha256 per managed unit so
|
|
22
22
|
`sync` can three-way diff. It also patches `basalt.roots` and a `lint:basalt` script.
|
|
23
23
|
|
|
@@ -5,7 +5,7 @@ when_to_use: User is building or restyling charts, dashboards or metric UIs in a
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
`/basalt-design` is the METHOD. The law is the `basalt-*` rules plus this app's `DESIGN.md`, and the
|
|
8
|
-
managed `
|
|
8
|
+
managed `AGENTS.md` block states which wins — read them, do not re-derive them here. This skill is
|
|
9
9
|
the sequence to follow and the loop to run.
|
|
10
10
|
|
|
11
11
|
## 1. Load the law before touching code
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Seeded by basalt-ui `init`, then owned by you — `sync` never touches it again, and no version is
|
|
4
4
|
> stamped here (run `basalt-ui doctor` for the version; a number written into a file is frozen at
|
|
5
5
|
> scaffold time). It records this app's **deltas only**: the law lives in `.claude/rules/basalt-*.md`,
|
|
6
|
-
> and the precedence between this file, those rules and the skills is stated once in `
|
|
6
|
+
> and the precedence between this file, those rules and the skills is stated once in the managed `AGENTS.md` block.
|
|
7
7
|
|
|
8
8
|
## Identity
|
|
9
9
|
|
package/configs/check.yml
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# `basalt-ui check-theme` is the palette guard shipped by basalt-ui (fails on raw
|
|
5
5
|
# color literals / off-identity accents that bypass the --vx-* token system).
|
|
6
6
|
# `basalt-ui sync --check` fails when the basalt-managed files (rules, skills, the
|
|
7
|
-
#
|
|
7
|
+
# AGENTS block) have drifted from the installed basalt-ui version.
|
|
8
8
|
# The oxfmt globs below are rendered from `basalt.roots` at init time — `init` writes that
|
|
9
9
|
# key from the repo's real layout (workspace packages included), so a monorepo does not
|
|
10
10
|
# seed a `src/**` that matches nothing.
|
package/configs/oxlint-plugin.js
CHANGED
|
@@ -569,7 +569,7 @@ const SIZE_ATTRS = new Set(['size', 'fz', 'fontSize'])
|
|
|
569
569
|
* And a separate id can carry its own severity: this rule ships `error` in the consumer preset —
|
|
570
570
|
* it is a NEW form the sibling rule never caught (a numeric-only check let every string form walk
|
|
571
571
|
* straight past it), not a narrowing of code that previously passed, so the grace-minor doctrine in
|
|
572
|
-
* the package
|
|
572
|
+
* the package MAINTAINING.md does not apply to it. Widening `no-raw-font-size` in place would have meant
|
|
573
573
|
* the widened check inherited whatever level the sibling id already carried, with no way to give
|
|
574
574
|
* this specific form its own severity.
|
|
575
575
|
*
|
|
@@ -2106,7 +2106,7 @@ const BASALT_HOST_TAGS = new Set(['FilterSet', 'PageAside', 'PanelRow'])
|
|
|
2106
2106
|
*
|
|
2107
2107
|
* TWO dialects, because a repo picks one file-naming law and the convention has to survive either:
|
|
2108
2108
|
* `edit-session-modal.tsx` (kebab) and `CbbiPanel.tsx` (PascalCase — what a repo mandating
|
|
2109
|
-
* `PascalCase.tsx` for component files writes, basalt's own root `
|
|
2109
|
+
* `PascalCase.tsx` for component files writes, basalt's own root `AGENTS.md` included). The kebab
|
|
2110
2110
|
* form alone could never match a component file in such a repo, which is exactly how the CBBI panel
|
|
2111
2111
|
* — a `PageAside` child whose `<PageAside>` is in the PARENT page — collected four warns that no
|
|
2112
2112
|
* ancestry walk in that file could ever have avoided.
|
|
@@ -2839,7 +2839,7 @@ export const CTL_THEME_TAGS = new Set([
|
|
|
2839
2839
|
*
|
|
2840
2840
|
* `ChartCard` lives inside the Mantine-free chart layer (`src/charts/primitives/`), which means it
|
|
2841
2841
|
* cannot render a `MantineThemeProvider` at all — it writes `data-basalt-tier="widget"` by hand and
|
|
2842
|
-
* nothing else (`../
|
|
2842
|
+
* nothing else (`../MAINTAINING.md`, "A home sizes its own SLOT"; `docs/CONTROLS-SPEC.md` §5). So this
|
|
2843
2843
|
* rule's whole message — "the HOME sets the tier, drop the prop" — is FALSE in exactly one slot: a
|
|
2844
2844
|
* `Switch` in `ChartCard.actions` with no `size` renders at Mantine's default, not at `ctl`.
|
|
2845
2845
|
*
|
|
@@ -3633,7 +3633,7 @@ const queryFnUnwrap = {
|
|
|
3633
3633
|
* The deprecation ledger — every export that is `@deprecated` but still SHIPPED, with what to
|
|
3634
3634
|
* write instead and the minor it goes away in. B4: majors are banned here, so a rename cannot be
|
|
3635
3635
|
* signalled by a version number; the lifecycle is instead "ship the alias, lint the old name, write
|
|
3636
|
-
* the MIGRATING row, remove it a minor later" (`../
|
|
3636
|
+
* the MIGRATING row, remove it a minor later" (`../MAINTAINING.md`, "Deprecation lifecycle").
|
|
3637
3637
|
*
|
|
3638
3638
|
* A row without `prop` is a NAMED IMPORT from `subpath` — reported on the specifier, with an
|
|
3639
3639
|
* autofix that rewrites it to `{ <replacement> as <local> }` so no call site has to move in the
|
|
@@ -4526,7 +4526,7 @@ export const PLUGIN_RULE_ADVISORY = {
|
|
|
4526
4526
|
'deprecated-export': {
|
|
4527
4527
|
since: '1.28.0',
|
|
4528
4528
|
why:
|
|
4529
|
-
'B4, the sunset half of the deprecation lifecycle (`../
|
|
4529
|
+
'B4, the sunset half of the deprecation lifecycle (`../MAINTAINING.md`). A deprecation is a ' +
|
|
4530
4530
|
'SCHEDULE, not a defect: the code compiles, runs and is correct until the `removeIn` minor, ' +
|
|
4531
4531
|
'so promoting this to `error` would fail a consumer build over something that still works — ' +
|
|
4532
4532
|
'the one outcome the no-majors doctrine exists to avoid. There is no version at which that ' +
|
|
@@ -2089,7 +2089,7 @@ describe('basalt/control-outside-home', () => {
|
|
|
2089
2089
|
})
|
|
2090
2090
|
|
|
2091
2091
|
// The SECOND dialect: a repo mandating `PascalCase.tsx` for component files (basalt's own root
|
|
2092
|
-
//
|
|
2092
|
+
// AGENTS.md included) can never write `foo-panel.tsx`, so the kebab form alone exempted nothing
|
|
2093
2093
|
// there — which is how the CBBI panel collected four warns for a `<PageAside>` in its parent.
|
|
2094
2094
|
it.each(['src/EditSessionModal.tsx', 'src/FiltersDrawer.tsx', 'src/CbbiPanel.tsx'])(
|
|
2095
2095
|
'does NOT flag %s — the PascalCase dialect of the same convention',
|
package/dist/agent/foreign.d.ts
CHANGED
|
@@ -69,8 +69,9 @@ export type PartRenderContext<TPart = ForeignPart> = {
|
|
|
69
69
|
};
|
|
70
70
|
export type PartRenderer<TPart = ForeignPart> = (ctx: PartRenderContext<TPart>) => ReactNode;
|
|
71
71
|
/**
|
|
72
|
-
* Canonical const-generic factory (`packages/basalt-ui/
|
|
73
|
-
*
|
|
72
|
+
* Canonical const-generic factory (`packages/basalt-ui/MAINTAINING.md` § "Token system — the
|
|
73
|
+
* derived palette", "Series color is consumer data") — identity passthrough, exact-keyed return,
|
|
74
|
+
* no builder, no config bag. Mirrors
|
|
74
75
|
* `defineSeries` (`tokens/index.ts:648-650`) and `defineNotifications`
|
|
75
76
|
* (`notifications/define-notifications.ts:112-115`).
|
|
76
77
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foreign.d.ts","sourceRoot":"","sources":["../../src/agent/foreign.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIxC,gGAAgG;AAChG,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAC9B,CAAA;AAED,uGAAuG;AACvG,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,CAAA;AAuBpD,kFAAkF;AAClF,MAAM,MAAM,YAAY,GAAG,cAAc,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC,SAAS,WAAW,CAAA;CAAE,GAAG,CAAC,GAAG,KAAK,CAAA;AAIpG;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,GACtD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,GACnD;IAAE,QAAQ,EAAE,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAAE,CAAA;AAE9F,uEAAuE;AACvE,MAAM,MAAM,iBAAiB,CAAC,KAAK,GAAG,WAAW,IAAI;IACnD,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,KAAK,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,SAAS,CAAA;AAE5F
|
|
1
|
+
{"version":3,"file":"foreign.d.ts","sourceRoot":"","sources":["../../src/agent/foreign.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIxC,gGAAgG;AAChG,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAC9B,CAAA;AAED,uGAAuG;AACvG,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,CAAA;AAuBpD,kFAAkF;AAClF,MAAM,MAAM,YAAY,GAAG,cAAc,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC,SAAS,WAAW,CAAA;CAAE,GAAG,CAAC,GAAG,KAAK,CAAA;AAIpG;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,GACtD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,GACnD;IAAE,QAAQ,EAAE,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAAE,CAAA;AAE9F,uEAAuE;AACvE,MAAM,MAAM,iBAAiB,CAAC,KAAK,GAAG,WAAW,IAAI;IACnD,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,KAAK,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,SAAS,CAAA;AAE5F;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,CAAC,SAAS,aAAa,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAE5E;AAaD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAEtE"}
|
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export type DoctorResult = {
|
|
|
15
15
|
* Check a consumer repo's basalt integration and print a pass/warn report.
|
|
16
16
|
*
|
|
17
17
|
* Narrowed to what a single-directory-scoped run can actually verify — no workspace-glob walking,
|
|
18
|
-
* no ascend/descend project discovery (see {@link resolveProjectDir}).
|
|
18
|
+
* no ascend/descend project discovery (see {@link resolveProjectDir}). Seven checks, numbered in
|
|
19
19
|
* the order they run and print:
|
|
20
20
|
*
|
|
21
21
|
* Hard failures (exit non-zero):
|
|
@@ -29,7 +29,7 @@ export type DoctorResult = {
|
|
|
29
29
|
* preset AND that path resolves (warns when no `oxlint` bin does). `init` keeps an existing config, so the framework's whole
|
|
30
30
|
* lint half can be silently off — one repo carried six real violations invisibly across five
|
|
31
31
|
* minors this way.
|
|
32
|
-
*
|
|
32
|
+
* 7. `ai-major-parity`: within THIS package.json, `dependencies`/`devDependencies`/
|
|
33
33
|
* `peerDependencies` agree on the `ai` package's major — the shape `basalt/ai-sdk-major` (per
|
|
34
34
|
* linted FILE) cannot see. A skew is exempt-able via `basalt.aiMajorSkewReason` (a non-empty
|
|
35
35
|
* reason, not a bare `true`); a declared reason when the majors agree warns it is stale.
|
|
@@ -41,6 +41,9 @@ export type DoctorResult = {
|
|
|
41
41
|
* gate elsewhere); a config that resolves but wires no guard command warns; a config lefthook
|
|
42
42
|
* dump could not read at all (binary missing, or the dump failed) warns and says so, rather
|
|
43
43
|
* than inventing a verdict.
|
|
44
|
+
* 6. `claude-md`: a project-root `CLAUDE.md` that does not import `@AGENTS.md` suppresses
|
|
45
|
+
* `AGENTS.md` (and with it the managed block); one that still carries a basalt block — or a
|
|
46
|
+
* malformed one — says so. A `CLAUDE.md` symlinked to `AGENTS.md` is one file and passes.
|
|
44
47
|
*
|
|
45
48
|
* Returns the exit code: 0 = all good, 1 = one or more hard failures.
|
|
46
49
|
*/
|
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":"AA8CA,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;AA8DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,MAAM,CAAC,aAAa,GAAE,MAAsB,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,MAAM,CA+P1F"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { relative, resolve } from "node:path";
|
|
3
3
|
import {
|
|
4
|
+
AGENTS_MD,
|
|
5
|
+
LEGACY_BLOCK_HOST,
|
|
4
6
|
MANIFEST_PATH,
|
|
5
7
|
basaltBinCommand,
|
|
6
8
|
basaltPresetEntry,
|
|
@@ -8,6 +10,7 @@ import {
|
|
|
8
10
|
declaredProfile,
|
|
9
11
|
findBasaltInstall,
|
|
10
12
|
findRepoRoot,
|
|
13
|
+
importsAgentsMd,
|
|
11
14
|
inspectLefthookGate,
|
|
12
15
|
OXLINT_FILES,
|
|
13
16
|
OXLINT_NO_BIN,
|
|
@@ -17,11 +20,20 @@ import {
|
|
|
17
20
|
readIfExists,
|
|
18
21
|
readManifest,
|
|
19
22
|
resolveProjectDir,
|
|
23
|
+
sameFile,
|
|
20
24
|
scannableFiles,
|
|
25
|
+
scanBlock,
|
|
21
26
|
shippedAssetPath
|
|
22
27
|
} from "./index.js";
|
|
23
28
|
import { resolveRoots } from "./config.js";
|
|
24
29
|
import { findManifestAbove, parentInstallAdvice } from "./sync.js";
|
|
30
|
+
function isSameFile(a, b) {
|
|
31
|
+
try {
|
|
32
|
+
return sameFile(a, b);
|
|
33
|
+
} catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
25
37
|
function majorOf(range) {
|
|
26
38
|
if (typeof range !== "string") return null;
|
|
27
39
|
const match = range.match(/\d+/);
|
|
@@ -171,6 +183,23 @@ basalt-ui doctor \u2014 ${cwd}
|
|
|
171
183
|
`${lefthookGate.file}: \`lefthook dump\` could not be run or parsed here (lefthook may not be installed) \u2014 treat this check as advisory. Verify by running \`lefthook dump\` yourself.`
|
|
172
184
|
);
|
|
173
185
|
}
|
|
186
|
+
const legacyHost = resolve(cwd, LEGACY_BLOCK_HOST);
|
|
187
|
+
const legacy = profile === "tokens-only" ? null : readIfExists(legacyHost);
|
|
188
|
+
if (legacy !== null && !isSameFile(legacyHost, resolve(cwd, AGENTS_MD))) {
|
|
189
|
+
const scan = scanBlock(legacy);
|
|
190
|
+
const issues = [];
|
|
191
|
+
if (scan.problem !== null) {
|
|
192
|
+
issues.push(`has a malformed basalt block (${scan.problem}) \u2014 fix it by hand, then \`sync\``);
|
|
193
|
+
} else if (scan.region !== null) {
|
|
194
|
+
issues.push(`still carries a stale basalt block \u2014 run \`basalt-ui sync\` to move it`);
|
|
195
|
+
}
|
|
196
|
+
if (!importsAgentsMd(legacy)) {
|
|
197
|
+
issues.push(
|
|
198
|
+
`does not import \`@${AGENTS_MD}\`, so Claude Code loads it INSTEAD of ${AGENTS_MD} and the basalt block never reaches the agent \u2014 move its content into ${AGENTS_MD} and delete it, or add \`@${AGENTS_MD}\``
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
if (issues.length > 0) warn(`${LEGACY_BLOCK_HOST} ${issues.join("; and ")}.`);
|
|
202
|
+
}
|
|
174
203
|
const aiMajors = aiMajorsAt(cwd);
|
|
175
204
|
const aiEntries = AI_MAJOR_FIELDS.filter((field) => aiMajors[field] !== void 0).map(
|
|
176
205
|
(field) => ({ field, major: aiMajors[field] })
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -77,7 +77,7 @@ export declare function resolveProjectDir(cwd: string): ProjectResolution;
|
|
|
77
77
|
/**
|
|
78
78
|
* Which shape of consumer a project-scoped command is looking at — DECLARED, never inferred
|
|
79
79
|
* (`--tokens-only`, or `"basalt": { "profile": "tokens-only" }`), because the answer switches the
|
|
80
|
-
* Mantine-remedy guard kinds off. Why that direction: package
|
|
80
|
+
* Mantine-remedy guard kinds off. Why that direction: package MAINTAINING.md § CLI.
|
|
81
81
|
*/
|
|
82
82
|
export declare function declaredProfile(cfg: BasaltConfig, flags: readonly string[]): DoctorProfile;
|
|
83
83
|
/**
|
|
@@ -109,7 +109,7 @@ export declare function waiverHintFor(relPath: string, profile: DoctorProfile):
|
|
|
109
109
|
*
|
|
110
110
|
* - `managed` : basalt owns it. sync refreshes it to the shipped version; a local edit is skipped
|
|
111
111
|
* and reported (`--force` overwrites); `--check` exits 1 on drift. Applies to exactly
|
|
112
|
-
* what Claude reads (.claude/rules/*, .claude/skills/*, the
|
|
112
|
+
* what Claude reads (.claude/rules/*, .claude/skills/*, the AGENTS.md block) —
|
|
113
113
|
* Claude Code cannot load rules or skills from node_modules, and that platform limit
|
|
114
114
|
* is the only reason anything is copied at all. The sync diff is the review gate.
|
|
115
115
|
* - `seed` : written once if absent, then owned entirely by the consumer. sync never overwrites
|
|
@@ -119,7 +119,7 @@ export declare function waiverHintFor(relPath: string, profile: DoctorProfile):
|
|
|
119
119
|
* the package while the consumer still owns the file.
|
|
120
120
|
*
|
|
121
121
|
* A managed file with `markers: true` is spliced as a `<!-- basalt:begin -->…<!-- basalt:end -->`
|
|
122
|
-
* region inside a host file the consumer otherwise owns (
|
|
122
|
+
* region inside a host file the consumer otherwise owns (AGENTS.md) — not a third mode, just
|
|
123
123
|
* managed ownership scoped to a region.
|
|
124
124
|
*/
|
|
125
125
|
type Mode = 'managed' | 'seed';
|
|
@@ -172,6 +172,10 @@ type TemplateVars = {
|
|
|
172
172
|
BASALT_BIN: string;
|
|
173
173
|
};
|
|
174
174
|
export declare const MANIFEST_PATH = ".basalt/manifest.json";
|
|
175
|
+
/** The host file the managed block is spliced into (and its manifest key). */
|
|
176
|
+
export declare const AGENTS_MD = "AGENTS.md";
|
|
177
|
+
/** Where the block lived before it moved to {@link AGENTS_MD} — read only to migrate out of it. */
|
|
178
|
+
export declare const LEGACY_BLOCK_HOST = "CLAUDE.md";
|
|
175
179
|
export declare function sha256(text: string): string;
|
|
176
180
|
export declare function readIfExists(abs: string): string | null;
|
|
177
181
|
/** Read a shipped source asset from the package root; null if the sibling hasn't authored it yet. */
|
|
@@ -189,6 +193,57 @@ export declare function readFrameworkVersion(pkgRoot: string): string;
|
|
|
189
193
|
* be right.
|
|
190
194
|
*/
|
|
191
195
|
export declare function basaltBinCommand(install: BasaltInstall, cwd: string): string;
|
|
196
|
+
/** True when both paths resolve to one file (a symlinked pair). A missing path is simply "no". */
|
|
197
|
+
export declare function sameFile(a: string, b: string): boolean;
|
|
198
|
+
/** True when the host text carries a managed block (begin marker present). */
|
|
199
|
+
export declare function hasManagedBlock(host: string | null): boolean;
|
|
200
|
+
/**
|
|
201
|
+
* The block region of a host, or why it cannot be read: duplicate begin markers, or a begin marker
|
|
202
|
+
* with no end. The ONE detector `migrateBlockToAgentsMd` and `doctor` share, so they cannot disagree
|
|
203
|
+
* about whether a `CLAUDE.md` is well-formed.
|
|
204
|
+
*/
|
|
205
|
+
export declare function scanBlock(host: string): {
|
|
206
|
+
region: {
|
|
207
|
+
start: number;
|
|
208
|
+
end: number;
|
|
209
|
+
} | null;
|
|
210
|
+
problem: string | null;
|
|
211
|
+
};
|
|
212
|
+
/** One line that is exactly the `@AGENTS.md` import — not a prose or code-span mention, not `.bak`. */
|
|
213
|
+
export declare function isAgentsImportLine(line: string): boolean;
|
|
214
|
+
/** Whether a `CLAUDE.md` imports `AGENTS.md`, so Claude Code still loads it. */
|
|
215
|
+
export declare function importsAgentsMd(text: string): boolean;
|
|
216
|
+
export type BlockMigration = {
|
|
217
|
+
/** The legacy host (`CLAUDE.md`) carried a managed block that has to move. */
|
|
218
|
+
pending: boolean;
|
|
219
|
+
/** The legacy host was left empty (or `@AGENTS.md` only) and removed. */
|
|
220
|
+
deletedHost: boolean;
|
|
221
|
+
/** Why nothing was moved and the run must fail: malformed markers, or two differing blocks. */
|
|
222
|
+
problem: string | null;
|
|
223
|
+
};
|
|
224
|
+
/**
|
|
225
|
+
* Move the managed block out of `CLAUDE.md` into `AGENTS.md` (an install from before the move).
|
|
226
|
+
* Idempotent: a second run finds nothing and returns `pending: false`.
|
|
227
|
+
* 1. The ledger entry is re-keyed `CLAUDE.md` → `AGENTS.md` in memory (the caller persists it), so
|
|
228
|
+
* an unedited legacy block classifies `unchanged`, not untracked.
|
|
229
|
+
* 2. The region is cut out of `CLAUDE.md` and — unless `AGENTS.md` already has one — spliced into
|
|
230
|
+
* `AGENTS.md` AS IT IS, not as the new rendering: the normal three-way classify then sees a
|
|
231
|
+
* hand-edit and skips it like any drifted unit. The rest of `CLAUDE.md` is consumer-owned and
|
|
232
|
+
* stays, except the file is deleted when nothing but whitespace or `@AGENTS.md` is left.
|
|
233
|
+
* 3. Nothing is discarded silently: if `AGENTS.md` already has a block that differs (normalized,
|
|
234
|
+
* as the ledger compares) from the legacy one, or either file's markers are malformed, BOTH
|
|
235
|
+
* files are left byte-identical and `problem` says what to resolve by hand.
|
|
236
|
+
* `dryRun` (`sync --check`) writes nothing but still reports `pending` and `problem`.
|
|
237
|
+
*/
|
|
238
|
+
export declare function migrateBlockToAgentsMd(cwd: string, manifest: Manifest, opts?: {
|
|
239
|
+
dryRun?: boolean;
|
|
240
|
+
}): BlockMigration;
|
|
241
|
+
/**
|
|
242
|
+
* The refusal `init` and `sync` run BEFORE any side effect (roots patch, package.json script,
|
|
243
|
+
* manifest): a dry-run migration against a scratch manifest, so a block that cannot be moved
|
|
244
|
+
* safely stops the command with nothing written. Null = safe to proceed.
|
|
245
|
+
*/
|
|
246
|
+
export declare function blockMigrationProblem(cwd: string): string | null;
|
|
192
247
|
/**
|
|
193
248
|
* Explicit `--with-router` / `--with-query` CLI flags force-include a router/query scaffold even
|
|
194
249
|
* when the peer isn't detected in the consumer's package.json yet (e.g. it's about to be added).
|
|
@@ -291,6 +346,8 @@ export type PruneResult = {
|
|
|
291
346
|
* with no names is what made the kept-files line a false green before 1.23.0.
|
|
292
347
|
*/
|
|
293
348
|
export declare function reportPrune(pruned: PruneResult): void;
|
|
349
|
+
/** Name what {@link migrateBlockToAgentsMd} did — a file leaving a consumer's tree is never silent. */
|
|
350
|
+
export declare function reportBlockMigration(migration: BlockMigration, command: 'init' | 'sync'): void;
|
|
294
351
|
/**
|
|
295
352
|
* Delete the managed rule/skill files this basalt version retired, and drop their manifest entries.
|
|
296
353
|
*
|
|
@@ -335,7 +392,7 @@ type Classification = 'unchanged' | 'drifted' | 'missing' | 'current';
|
|
|
335
392
|
* - Blank out the per-release `BASALT_VERSION` token in a marker's begin line
|
|
336
393
|
* (`<!-- basalt:begin 1.0.1 -->` → `<!-- basalt:begin -->`). It changes on every release and is
|
|
337
394
|
* the only per-release variable that lands INSIDE the hashed region (the rest of
|
|
338
|
-
* `
|
|
395
|
+
* `AGENTS-block.md.tpl` has no other `{{…}}` placeholders today), so stripping it is what lets
|
|
339
396
|
* one normalized rendering stand in for every version of a given template body instead of
|
|
340
397
|
* needing one ledger entry per release. If a future marker template interpolates another
|
|
341
398
|
* per-release var inside its region, extend this normalization the same way.
|
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":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|