Skip to content

feat(bestax-migrate): react-bulma-components → bestax-bulma codemod CLI, skill, and docs - #333

Merged
allxsmith merged 18 commits into
mainfrom
claude/react-bulma-migration-skill-854wp3
Jul 20, 2026
Merged

allxsmith merged 18 commits into
mainfrom
claude/react-bulma-migration-skill-854wp3

Conversation

@allxsmith

@allxsmith allxsmith commented Jul 19, 2026 •

Copy link
Copy Markdown
Owner

Pull Request

Description

Adds bestax-migrate, a new workspace package publishing the bestax-migrate CLI: a jscodeshift codemod that migrates existing apps from the unmaintained react-bulma-components (v4, Bulma 0.9) to @allxsmith/bestax-bulma (Bulma v1). Multi-source by design (src/sources/registry.ts) so future library codemods slot in as new source folders.

  • bulma-ui (@allxsmith/bestax-bulma) — packaging fix (see below)
  • create-bestax (create-bestax)
  • docs (@allxsmith/bestax-docs)
  • Other (please specify): new bestax-migrate workspace package; skills/bestax-migrate; repo wiring (pnpm-workspace, commitlint scope, turbo, CI release step)

What the codemod converts — imports (named/namespace/const { Input } = Form destructuring), all 32 RBC v4 components and compounds via a data-driven mapping table, prop renames/value conversions, responsive breakpoint objects, structural rewrites (Navbar dropdowns, Card.Image, Field grouping, icon-font children → <Icon name…>), stylesheets (CSS imports → bestax.css; SCSS @import 'bulma/bulma' + $var !default overrides → @use 'bulma/sass' with (…) + extras, including Parcel-style relative node_modules paths), and package.json (RBC removed, bestax-bulma added, bulma → ^1.0.4, node-sass → dart sass ^1.79, peer-deps warnings for React <18 / Font Awesome <6). Anything unsafe gets an inline // TODO(bestax-migrate) comment + a report entry — never a silent skip. Files in unparseable formats (.astro/.vue/.svelte/.mdx) importing RBC are reported as unsupported-file.

Also in this PR — fix(bulma-ui): removed the typesVersions wildcard that remapped the root types field onto itself, which broke type resolution for every moduleResolution: node10 consumer (surfaced by migrating a real app).

Supply-chain: react-bulma-components is never installed anywhere in this repo. Fixtures and validation corpora are text-only; the kitchen-sink e2e typechecks migrated output against the workspace bestax-bulma. The corpus script is deliberately not in CI.

Related Issue(s)

Closes #332

Type of Change

  • New feature
  • Bug fix (bulma-ui typesVersions)
  • Documentation
  • Build tooling

Checklist

  • My code follows the project style guidelines
  • I have performed a self-review of my code
  • I have added tests that prove my fix is effective or that my feature works (184 unit/e2e tests, 13 fixture pairs, kitchen-sink e2e with tsc --noEmit against built bulma-ui; coverage over the package thresholds)
  • I have added/updated documentation as needed (migration guide, skills listing, bestax-migrate/CLAUDE.md, README)
  • I have updated Storybook stories as needed (bulma-ui) — n/a, no component changes
  • My changes require a change to the documentation
  • All new and existing tests passed (pnpm all equivalent gates: build, typecheck, test+coverage, lint, format, conformance)
  • Any relevant dependencies are updated (@babel/parser added — declared, already in the lockfile transitively)
  • If this PR changes commands, conventions, or package structure, the affected CLAUDE.md files are updated (root + new bestax-migrate/CLAUDE.md)

Screenshots / Demos

Validated against real frontend-only RBC v4 apps, all reaching a green production build post-migration:

App Stack Result
openaedmap-frontend Vite 7, TS, React 19 ✓ builds, zero manual edits
python-events Vite, TS, React 19, FA 5 ✓ builds (--legacy-peer-deps for their FA 5 pin — now predicted by the peer-deps report)
i8008-tools emulator UI Parcel, JS, React 17, SCSS ✓ builds (React 17→18 upgrade — now predicted; sass ≥1.79 pin)

Before/after screenshot comparison: i8008 (SCSS path) is pixel-identical; python-events (CSS path) differs only in the documented bestax.css primary color (#1e6b99) and Bulma v1 spacing. Story-level visual comparison of the RBC storybook corpus (49 stories/side) was reviewed during development.

Additional Context

  • Independent semantic-release: bestax-migrate scope, tag bestax-migrate@x.y.z; first feat on main publishes 1.0.0. The fix(bulma-ui) commit patches @allxsmith/bestax-bulma independently.
  • @allxsmith/bestax-bulma is a runtime dependency of bestax-migrate (workspace:^) so the published package registers as an npm dependent and dlx runs pull the library through the registry.
  • The skill ships via npx skills add https://github.com/allxsmith/bestax --skill bestax-migrate and is intentionally not synced into create-bestax.

🤖 Generated with Claude Code

https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu


Generated by Claude Code

Summary by CodeRabbit

  • New Features

    • Added the bestax-migrate CLI to migrate React Bulma apps from react-bulma-components to Bestax Bulma on Bulma v1, including component, prop, responsive, stylesheet, and dependency updates.
    • Added dry-run previews with end-of-run reports, TODO markers for manual work, and checks that flag unsupported inputs.
  • Documentation

    • Published migration guides and a dedicated migration skill with reference tables covering components, props, CSS, and remaining TODOs.
    • Updated repo and skills documentation to include bestax-migrate.
  • Tests/Quality

    • Added CLI/transform/unit and end-to-end “kitchen-sink” coverage, plus mapping-coverage validation.
  • Chores

    • Improved CI coverage publishing and release automation for bestax-migrate, along with repo formatting/lint exclusions.

claude added 11 commits July 19, 2026 07:28
Adds the bestax-migrate package to the pnpm workspace and commitlint release
scopes, orders its tests after the bulma-ui build in turbo, adds its
semantic-release step and coverage artifact to CI, and excludes its codemod
fixtures (byte-exact expected transform output) from eslint and prettier.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
…od CLI

New workspace package published as bestax-migrate: a jscodeshift-based,
multi-source codemod platform run via `pnpm dlx bestax-migrate <source>
<paths…> [--dry] [--print]`. The first source migrates react-bulma-components
v4 apps to @allxsmith/bestax-bulma:

- rewrites imports (named/namespace/Form destructuring) to one merged
  bestax-bulma import; v3 bundled-CSS imports become the Bulma v1 stylesheet
- maps all 32 RBC components and their compound sub-components via a
  declarative mapping table, with structural handlers for the cases a rename
  can't express (Table.Container, Navbar dropdown split, Card.Image wrapping,
  Heading→Title/SubTitle, icon-font children → Icon name/library/variant)
- converts props (renderAs→as where supported, boolean is*/has* prefixes,
  numeric spacing/text sizes → string unions, value remaps) and flattens
  responsive breakpoint objects to flat per-viewport props
- everything unsafe gets an inline TODO(bestax-migrate) comment plus an
  end-of-run report — never a silent skip or a guess

react-bulma-components is never installed: fixture pairs are read as text,
and the kitchen-sink e2e migrates a full source-only RBC app and typechecks
the OUTPUT against the workspace @allxsmith/bestax-bulma. A mapping-coverage
test walks the vendored RBC v4 export list so no surface goes unmapped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
…on guide

- skills/bestax-migrate/: SKILL.md driving the codemod-then-resolve-TODOs
  workflow, with references for the full component map, universal prop map,
  per-TODO recipes, and the Bulma 0.9→1 CSS step. Deliberately NOT bundled
  into create-bestax (it's for existing sites) but installable standalone via
  npx skills add.
- docs: new guides/getting-started/migration/react-bulma-components.md, the
  'coming soon' migration-tool placeholder in bulma-0-9-to-1.md replaced with
  the real bestax-migrate command, a link from the migration index, a new
  skills/migrate page wired into the skills sidebar, and the skills overview
  updated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
Absolute /docs/api/grid/grid URLs failed the Docusaurus broken-link check;
relative .md links match the house style on the same page.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
Fetches react-bulma-components' own MIT-licensed Storybook stories (pinned
SHA, text only, into the gitignored .e2e-tmp/) and runs the transform over
them, failing on any crash or unknown-component TODO. Not wired into CI —
no third-party fetches in the pipeline; documented as the pre-release
validation step.

Corpus results: 31/32 story files transformed (the other is empty), 0
crashes, 0 unknown components; all 64 TODOs are by-design flags. Also
validated against two real v4 apps in a scratch environment: one full
portfolio site migrated 8/8 files and builds + renders against
@allxsmith/bestax-bulma.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
Rendered all 32 react-bulma-components Storybook stories side by side
(original RBC + Bulma 0.9 vs migrated bestax-bulma + Bulma 1) and fixed
every divergence the comparison surfaced:

- alias new imports that collide with local bindings
  (export const Field = … → import { Field as BulmaField })
- convert value references to components (renderAs={Block},
  const W = Icon.Text), retaining + flagging unmappable ones
- wrap Tabs.Item children in an anchor (RBC Tabs.Tab rendered its own;
  Bulma styles .tabs li a)
- preserve RBC's Columns multiline=true default (inject isMultiline;
  dynamic values become expr ?? true)
- map Loader to a plain <div class="loader"> (Bulma v1 still ships the
  class; bestax Loading is an overlay, not an inline spinner)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
The codemod now covers the CSS/Sass/toolchain layer of a
react-bulma-components migration:

- CSS imports converge on @allxsmith/bestax-bulma/bestax.css by default
  (--css bulma keeps plain Bulma v1 CSS + a separate extras import;
  --css keep leaves stylesheets alone)
- .scss files move from Bulma 0.9's @import + $var !default overrides to
  @use 'bulma/sass' with (…) plus @use '@allxsmith/bestax-bulma/scss/extras',
  with 0.9 _all partial paths mapped onto the v1 module tree; computed
  variables and indented-syntax .sass files are flagged, not guessed at
- the nearest package.json drops react-bulma-components, gains
  @allxsmith/bestax-bulma, bumps bulma to ^1.0.4, and swaps node-sass for
  dart sass (--no-deps opts out; no install is ever run)

Validated end-to-end: a real portfolio app migrated with zero manual edits
(code + CSS + manifest), then installed and built successfully.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
…tion

The wildcard typesVersions entry remapped the top-level types field onto
itself (dist/types/dist/types/index.d.ts), so every consumer compiling
with moduleResolution: node (node10) got TS2307 for the package. The map
served no purpose: all subpath exports are CSS/SCSS, which carry no
types. Found migrating openaedmap-frontend, whose tsconfig uses node10
resolution.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
Findings from migrating three real frontend-only RBC v4 apps
(openaedmap-frontend, python-events, i8008-tools):

- parse the legacy 'import … assert { type: json }' syntax instead of
  crashing (custom tsx parser with deprecatedImportAssert)
- keep tabs in tab-indented sources and preserve package.json
  indentation, so diffs stay limited to the actual changes
- preserve relative node_modules prefixes in SCSS root/partial rewrites
  (Parcel-era '@import ../../node_modules/bulma/bulma') and point the
  extras @use at the shipped file for raw-path toolchains
- report 'peer-deps' install blockers from package.json (react < 18,
  fontawesome-free < 6) and 'unsupported-file' for .astro/.vue/.svelte/
  .mdx files importing the source library
- targeted hint for third-party bulma-* extension stylesheet imports
- bump the node-sass replacement to sass ^1.79 (Bulma v1 uses
  color.channel) and say 'Would update' for the manifest in dry runs

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
…guide

- peer-deps install blockers (React 18/19 requirement, Font Awesome >= 6.7
  or --legacy-peer-deps) in the skill workflow and the docs install step
- unsupported-file rule (.astro/.vue/.svelte/.mdx) with a hand-migration
  recipe
- stylesheet notes: bestax.css ships $primary as bestax blue (#1e6b99)
  with --css bulma as the stock-look escape hatch, relative node_modules
  prefix handling, dart-sass >= 1.79, and third-party bulma-* extension
  guidance

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
…endency

Moves the library from devDependencies to dependencies (workspace:^, so
the published manifest carries a caret range) so bestax-migrate is
counted among bestax-bulma's npm dependents and dlx runs pull the
library through the registry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
@coderabbitai

coderabbitai Bot commented Jul 19, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@allxsmith, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 21 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 42a355db-bc24-45a5-bdd8-d9b416af5f0c

📥 Commits

Reviewing files that changed from the base of the PR and between 387732a and 78e9ed4.

📒 Files selected for processing (2)
  • docs/docs/guides/getting-started/migration/bulma-0-9-to-1.md
  • docs/docs/skills/migrate.mdx

Walkthrough

The PR adds the bestax-migrate workspace package, a React Bulma Components-to-bestax-bulma codemod, stylesheet and dependency migration, CLI reporting, extensive fixtures and tests, release integration, and migration documentation and skills.

Changes

bestax-migrate implementation

Layer / File(s) Summary
Transform contracts and AST conversion
bestax-migrate/src/types.ts, bestax-migrate/src/sources/react-bulma-components/*
Defines mapping contracts and implements JSX, prop, responsive, structural, stylesheet, and import transformations.
CLI, runner, and reporting
bestax-migrate/src/{cli,runner,report,index}.ts
Adds the executable CLI, file and manifest discovery, dry-run support, unsupported-file reporting, transform execution, and TODO summaries.
Dependency and stylesheet migration
bestax-migrate/src/sources/react-bulma-components/{deps,styles}.ts
Updates Bulma Sass imports, CSS modes, package dependencies, Sass tooling, and peer-dependency diagnostics.
Fixtures and automated validation
bestax-migrate/fixtures/*, bestax-migrate/e2e/*, bestax-migrate/src/**/__tests__/*
Adds kitchen-sink and byte-exact fixtures covering component mappings, edge cases, styles, dependencies, CLI behavior, and typechecking.
Workspace and release integration
bestax-migrate/package.json, bestax-migrate/release.config.js, pnpm-workspace.yaml, .github/workflows/ci.yml
Registers the package, configures publishing, adds coverage artifact handling, and runs semantic-release for bestax-migrate.
Migration documentation and skill
docs/docs/guides/getting-started/migration/*, docs/docs/skills/*, skills/bestax-migrate/*
Documents codemod usage, supported mappings, CSS migration, TODO handling, and the agent-assisted workflow.

Estimated code review effort: 5 (Critical) | ~120 minutes

Suggested labels: needs-human-review

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Clear and specific: it names the new bestax-migrate codemod CLI, skill, and docs.
Description check ✅ Passed It covers the required sections, package checkboxes, issue reference, type, checklist, demos, and extra context.
Linked Issues check ✅ Passed The PR implements the codemod, multi-source registry, skill, docs, tests, repo wiring, and packaging fix requested by #332.
Out of Scope Changes check ✅ Passed No clearly unrelated changes stand out; the extra repo wiring and formatting updates support the new workspace package.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/react-bulma-migration-skill-854wp3

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
bestax-migrate/src/__tests__/cli.test.ts (1)

6-8: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Track and clean up temporary directories in an afterEach hook.

If an assertion fails during a test, execution will abort, skipping the manual fs.rmSync at the end of the test and leaking the temporary directory on disk. Tracking directories centrally ensures they are always cleaned up, regardless of the test outcome.

♻️ Proposed refactor
+let tempDirs: string[] = [];
+
+afterEach(() => {
+  for (const dir of tempDirs) {
+    fs.rmSync(dir, { recursive: true, force: true });
+  }
+  tempDirs = [];
+});
+
 function makeTempProject(): string {
   const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'bestax-migrate-test-'));
+  tempDirs.push(dir);
   fs.mkdirSync(path.join(dir, 'src', 'node_modules'), { recursive: true });

(You can then safely remove all the manual fs.rmSync(dir, { recursive: true, force: true }); calls at the end of each test block).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@bestax-migrate/src/__tests__/cli.test.ts` around lines 6 - 8, Update
makeTempProject to register each created directory in shared test state, and add
an afterEach hook that removes all tracked temporary directories with recursive,
forced cleanup before resetting the tracking state. Remove the per-test manual
fs.rmSync calls while preserving existing test behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@bestax-migrate/scripts/validate-corpus.mjs`:
- Line 104: Update the output variable declaration in the validation flow to
remove the unused null initializer while preserving its later assignment and
use. Run the repository formatter on this file to resolve all reported Prettier
violations, then verify the applicable lint and format checks pass.

In `@bestax-migrate/src/sources/react-bulma-components/styles.ts`:
- Around line 172-182: Move the bestax extras injection logic from the
root-import-only path into the shared handling for the first rewritten Bulma
import, so partial `bulma/sass/...` migrations also receive it. Update the
surrounding flow in the stylesheet migration function while preserving the
existing path-prefixed `extrasPrefix` resolution and `extrasAdded` guard.

In `@docs/docs/guides/getting-started/migration/bulma-0-9-to-1.md`:
- Line 262: Update the migration guide paragraph describing deprecated Tile
usage to explicitly state that the codemod only flags Tile instances with a
TODO(bestax-migrate) for manual conversion and does not automatically map them
to Grid/Cell components. Keep the existing references to the Grid documentation
and full guide.

In `@docs/docs/skills/migrate.mdx`:
- Around line 27-34: Update the workflow summary in the migration documentation
to match SKILL.md: describe running the codemod before installing dependencies,
and state that the codemod updates package.json for the dependency changes,
including removing react-bulma-components. Keep the remaining review, TODO
resolution, and CSS migration steps unchanged.

---

Nitpick comments:
In `@bestax-migrate/src/__tests__/cli.test.ts`:
- Around line 6-8: Update makeTempProject to register each created directory in
shared test state, and add an afterEach hook that removes all tracked temporary
directories with recursive, forced cleanup before resetting the tracking state.
Remove the per-test manual fs.rmSync calls while preserving existing test
behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 7e08ff73-cfb6-4044-9a83-eb6fbd01ce94

📥 Commits

Reviewing files that changed from the base of the PR and between dd2c479 and 6c1e141.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml, !pnpm-lock.yaml
📒 Files selected for processing (90)
  • .github/workflows/ci.yml
  • .prettierignore
  • README.md
  • bestax-migrate/.gitignore
  • bestax-migrate/.prettierignore
  • bestax-migrate/CLAUDE.md
  • bestax-migrate/README.md
  • bestax-migrate/e2e/kitchen-sink.test.ts
  • bestax-migrate/fixtures/kitchen-sink/package.json
  • bestax-migrate/fixtures/kitchen-sink/src/App.tsx
  • bestax-migrate/fixtures/kitchen-sink/src/columns.tsx
  • bestax-migrate/fixtures/kitchen-sink/src/components.tsx
  • bestax-migrate/fixtures/kitchen-sink/src/elements.tsx
  • bestax-migrate/fixtures/kitchen-sink/src/form.tsx
  • bestax-migrate/fixtures/kitchen-sink/src/helpers.tsx
  • bestax-migrate/fixtures/kitchen-sink/src/layout.tsx
  • bestax-migrate/fixtures/kitchen-sink/src/leftovers.tsx
  • bestax-migrate/fixtures/kitchen-sink/src/styles.scss
  • bestax-migrate/jest.config.mjs
  • bestax-migrate/package.json
  • bestax-migrate/release.config.js
  • bestax-migrate/scripts/validate-corpus.mjs
  • bestax-migrate/src/__tests__/cli.test.ts
  • bestax-migrate/src/__tests__/report.test.ts
  • bestax-migrate/src/cli.ts
  • bestax-migrate/src/index.ts
  • bestax-migrate/src/report.ts
  • bestax-migrate/src/runner.ts
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/button.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/button.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/columns-responsive.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/columns-responsive.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/compounds.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/compounds.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/edge-cases-2.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/edge-cases-2.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/edge-cases.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/edge-cases.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/form.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/form.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/helpers.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/helpers.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/imports-basic.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/imports-basic.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/imports-namespace.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/imports-namespace.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/navigation.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/navigation.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/overlays.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/overlays.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/todos-unmappable.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/todos-unmappable.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/value-reference.input.tsx
  • bestax-migrate/src/sources/react-bulma-components/__testfixtures__/value-reference.output.tsx
  • bestax-migrate/src/sources/react-bulma-components/__tests__/deps.test.ts
  • bestax-migrate/src/sources/react-bulma-components/__tests__/jsx-utils.test.ts
  • bestax-migrate/src/sources/react-bulma-components/__tests__/mapping-coverage.test.ts
  • bestax-migrate/src/sources/react-bulma-components/__tests__/styles.test.ts
  • bestax-migrate/src/sources/react-bulma-components/__tests__/transform.test.ts
  • bestax-migrate/src/sources/react-bulma-components/deps.ts
  • bestax-migrate/src/sources/react-bulma-components/index.ts
  • bestax-migrate/src/sources/react-bulma-components/jsx-utils.ts
  • bestax-migrate/src/sources/react-bulma-components/mapping.ts
  • bestax-migrate/src/sources/react-bulma-components/props.ts
  • bestax-migrate/src/sources/react-bulma-components/responsive.ts
  • bestax-migrate/src/sources/react-bulma-components/specials.ts
  • bestax-migrate/src/sources/react-bulma-components/styles.ts
  • bestax-migrate/src/sources/react-bulma-components/transform.ts
  • bestax-migrate/src/sources/registry.ts
  • bestax-migrate/src/types.ts
  • bestax-migrate/tsconfig.eslint.json
  • bestax-migrate/tsconfig.json
  • bulma-ui/package.json
  • commitlint.config.js
  • docs/docs/guides/getting-started/migration/bulma-0-9-to-1.md
  • docs/docs/guides/getting-started/migration/index.md
  • docs/docs/guides/getting-started/migration/react-bulma-components.md
  • docs/docs/skills/intro.md
  • docs/docs/skills/migrate.mdx
  • docs/sidebars.js
  • eslint.config.js
  • pnpm-workspace.yaml
  • skills/README.md
  • skills/bestax-migrate/SKILL.md
  • skills/bestax-migrate/references/component-map.md
  • skills/bestax-migrate/references/css-migration.md
  • skills/bestax-migrate/references/prop-map.md
  • skills/bestax-migrate/references/unmappables.md
  • tsconfig.eslint.json
  • turbo.json
💤 Files with no reviewable changes (1)
  • bulma-ui/package.json

Comment thread bestax-migrate/scripts/validate-corpus.mjs Outdated
Comment thread bestax-migrate/src/sources/react-bulma-components/styles.ts
Comment thread docs/docs/guides/getting-started/migration/bulma-0-9-to-1.md Outdated
Comment thread docs/docs/skills/migrate.mdx Outdated
claude added 5 commits July 19, 2026 20:14
…gration-skill-854wp3

# Conflicts:
#	docs/docs/skills/intro.md
#	docs/sidebars.js
#	skills/README.md
Modular builds that import bulma/sass/<partial> without a root import
were migrated without the bestax extras, losing the styling the bestax
components need. The extras tree only reads Bulma utilities (never
configures them), so injecting the @use after the first rewritten
partial is load-order safe. Raised by CodeRabbit on #333.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
A failing assertion previously skipped the manual rmSync at the end of
each test and leaked the temp project on disk. Raised by CodeRabbit on
#333.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
The repo format scripts skipped .mjs entirely, so validate-corpus.mjs
was never formatted (raised by CodeRabbit on #333). Also drops that
script's dead null initializer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
Tile usage is flagged with a TODO, not auto-converted to Grid; the
skill workflow runs the codemod (which rewrites package.json) before
the install step. Raised by CodeRabbit on #333.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/docs/guides/getting-started/migration/bulma-0-9-to-1.md`:
- Line 262: In the migration guide text, replace the user-facing word
“afterwards” with the American English spelling “afterward,” leaving the
surrounding migration instructions unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 6a682b33-ae2a-4988-875f-05a7a24a9c46

📥 Commits

Reviewing files that changed from the base of the PR and between 6c1e141 and 387732a.

📒 Files selected for processing (12)
  • bestax-migrate/jest.config.mjs
  • bestax-migrate/scripts/validate-corpus.mjs
  • bestax-migrate/src/__tests__/cli.test.ts
  • bestax-migrate/src/sources/react-bulma-components/__tests__/styles.test.ts
  • bestax-migrate/src/sources/react-bulma-components/styles.ts
  • docs/docs/guides/getting-started/migration/bulma-0-9-to-1.md
  • docs/docs/skills/intro.md
  • docs/docs/skills/migrate.mdx
  • docs/sidebars.js
  • package.json
  • scripts/gen-component-catalog.mjs
  • skills/README.md
🚧 Files skipped from review as they are similar to previous changes (9)
  • docs/sidebars.js
  • skills/README.md
  • docs/docs/skills/intro.md
  • docs/docs/skills/migrate.mdx
  • bestax-migrate/jest.config.mjs
  • bestax-migrate/src/sources/react-bulma-components/tests/styles.test.ts
  • bestax-migrate/scripts/validate-corpus.mjs
  • bestax-migrate/src/tests/cli.test.ts
  • bestax-migrate/src/sources/react-bulma-components/styles.ts

Comment thread docs/docs/guides/getting-started/migration/bulma-0-9-to-1.md Outdated
'React <18' reads as a JSX tag opener in MDX and broke the docs build
on #333; reworded. Also the LanguageTool locale nit from CodeRabbit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
@allxsmith allxsmith added deep-review and removed deep-review labels Jul 19, 2026 — with Claude
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://21287869.bestax.pages.dev

Comment thread bestax-migrate/src/sources/react-bulma-components/specials.ts

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deep review — 1 finding

No Severity Area Finding Location
1 🟠 Major Correctness Structural specials silently drop a user-supplied className (no rewrite, no TODO) when rewriting to a plain element bestax-migrate/src/sources/react-bulma-components/specials.ts:194

Overall: This is a large, carefully-built codemod with a strong test/fixture harness, a data-driven mapping table verified against both libraries, and a consistent "never a silent skip" philosophy. The riskiest part is the hand-written structural handlers in specials.ts, where six of the seven plain-element rewrites (heading, plain-label, plain-help, panel-tab, breadcrumb-item, table-container) drop the element's original className with no TODO — plain-loader is the one that gets it right, which shows the intent. The fixtures bake the loss in as "expected", so it won't surface without this being fixed. Everything else I checked — import/alias resolution, responsive flattening, prop actions, deps (^5 matches the current bulma-ui 5.6.2), the CSS/SCSS @use rewrites, and the typesVersions removal — held up. Human should focus first on the className handling and decide merge-vs-TODO. (One local e2e failure is environmental: the workspace bulma-ui wasn't built in this checkout, so tsc couldn't resolve @allxsmith/bestax-bulma; the 184 unit/fixture tests pass.)

🏄 Dude, this codemod paddles out clean and rides the whole break — mapping table's dialed, TODOs never ghost you. Just one sneaky undertow: it quietly washes away your custom classNames on the plain-element rewrites. Patch that leak and it's an all-day glassy session, brah.

Six structural specials (heading, plain-label, plain-help, panel-tab,
breadcrumb-item, table-container) filtered the user's className out and
hard-coded the new Bulma class, silently dropping custom classes with no
report entry — violating the package's never-a-silent-skip invariant.
Only plain-loader handled it correctly.

Extract that treatment into a shared mergeClassName helper: a string
literal is merged into the emitted class ("heading extra"), a dynamic
value keeps the base class and leaves a prop:className TODO, and the
table-container single-child fold (which has no element to merge onto)
leaves a TODO when the container carried a className. plain-loader now
uses the same helper. Fixtures regenerated; edge-cases-2 gains coverage
for the merge-without-base, dynamic-TODO, and single-child-fold cases.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yX1c4wgFY9knAAVzWNPJu
@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://4d0c01b0.bestax.pages.dev

@allxsmith
allxsmith merged commit e04a12b into main Jul 20, 2026
16 of 24 checks passed
@allxsmith
allxsmith deleted the claude/react-bulma-migration-skill-854wp3 branch July 20, 2026 23:44
github-actions Bot pushed a commit that referenced this pull request Jul 20, 2026
# 1.0.0 (2026-07-20)

* feat(bulma-ui)!: remove bestax-bulma-prefixed CSS variant ([94baa34](94baa34))
* feat(create-bestax)!: require Node.js 18+ and align with bestax-bulma v2 ([#118](#118)) ([b22f183](b22f183))

### Bug Fixes

* add comprehensive rules to prevent bulma-ui versioning on non-bulma-ui commits ([#122](#122)) ([525ccfa](525ccfa)), closes [#119](#119)
* **bulma-ui:** a11y + case-insensitive Taginput matching from PR review ([d576829](d576829))
* **bulma-ui:** accept router props like `to` on Navbar.Item without casts ([#311](#311)) ([b78856b](b78856b)), closes [#306](#306)
* **bulma-ui:** Add build step to publish in ci.yml ([e3707fc](e3707fc))
* **bulma-ui:** add fontawesome-free as explicit devDependency ([a4a5389](a4a5389))
* **bulma-ui:** add missing exports ([0d16633](0d16633))
* **bulma-ui:** Add Skeleton to exports ([e481599](e481599))
* **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([cc3a3e2](cc3a3e2))
* **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([314bc39](314bc39))
* **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([c930693](c930693))
* **bulma-ui:** complete domain migration and fix semantic-release configuration ([#64](#64)) ([f4cd71d](f4cd71d))
* **bulma-ui:** correct blog post examples and add Modal compound components ([#81](#81)) ([559c2e3](559c2e3))
* **bulma-ui:** correct NPM_TOKEN env variable in ci.yml ([94b48b4](94b48b4))
* **bulma-ui:** Fix release.config.js to include package-lock.json ([390da59](390da59))
* **bulma-ui:** fix standalone Badge pointer-events, pulse halo, and falsy content ([#295](#295)) ([a9db031](a9db031)), closes [#264](#264)
* **bulma-ui:** full classPrefix support across layout/grid + prefix utils ([4ce0b53](4ce0b53))
* **bulma-ui:** improve npm package discoverability with optimized keywords and badges ([#72](#72)) ([8c7a696](8c7a696))
* **bulma-ui:** Initial semantic release changes ([b78d785](b78d785))
* **bulma-ui:** migrate domain from bestax.cc to bestax.io ([#64](#64)) ([4870b1e](4870b1e))
* **bulma-ui:** migrate ionicons to v8 to unblock publish and Storybook ([927a55b](927a55b)), closes [#142](#142)
* **bulma-ui:** publish rewritten README to npm ([9810081](9810081))
* **bulma-ui:** publish with npm provenance attestation ([172da62](172da62)), closes [#180](#180)
* **bulma-ui:** reference llms docs from README and package.json ([#198](#198)) ([db8aab3](db8aab3))
* **bulma-ui:** reject predicate-blocked values during manual entry ([a8f6e28](a8f6e28))
* **bulma-ui:** resolve flex item properties and Card compound component issues ([#55](#55)) ([e774da3](e774da3))
* **bulma-ui:** resolve flex item properties and Card compound component issues ([#55](#55)) ([7641a53](7641a53))
* **bulma-ui:** resolve react-hooks v7 and [@eslint-react](https://github.com/eslint-react) findings ([14caaaf](14caaaf))
* **bulma-ui:** resolve security vulnerabilities and update dependencies ([#128](#128)) ([112f6e4](112f6e4)), closes [#127](#127)
* **bulma-ui:** restrict semantic-release to bulma-ui scoped commits only ([2d67bf9](2d67bf9)), closes [#62](#62)
* **bulma-ui:** retry failed Avatar src, flatten Fragment children in Avatars, RTL-safe overlap ([#297](#297)) ([c00b9db](c00b9db))
* **bulma-ui:** route every hardcoded class through the prefix helpers; add classPrefix sweep test ([#301](#301)) ([a50b134](a50b134)), closes [#286](#286)
* **bulma-ui:** setup gpg signing with semantic-release ([3e24722](3e24722))
* **bulma-ui:** strip redundant library prefix from Icon name ([#242](#242)) ([dbe3622](dbe3622)), closes [#189](#189)
* **bulma-ui:** trigger release to publish via OIDC trusted publishing ([e2d09c5](e2d09c5))
* **bulma-ui:** update bundle size claims to accurate 21KB gzipped ([#66](#66)) ([6e381bd](6e381bd))
* **bulma-ui:** update package-lock.json ([853d585](853d585))
* **bulma-ui:** update package.json for better seo, exports, types, engines, funding, etc ([98cbc56](98cbc56))
* **bulma-ui:** use createRequire for ESM compatibility in Storybook 10 ([#130](#130)) ([b27e60e](b27e60e)), closes [#129](#129)
* **ci:** collect screenshots as artifacts and commit in single batch to avoid conflicts ([27b259d](27b259d))
* **ci:** ensure npm install uses fresh downloads with --prefer-online ([1f2e15d](1f2e15d))
* **ci:** properly extract base path for recursive file search ([e0330ff](e0330ff))
* **ci:** use find command instead of glob module in verified-commit action ([0e2d159](0e2d159))
* **ci:** use npm ci for scaffolded app dependencies ([35652c8](35652c8))
* **create-bestax:** correct browser title to prioritize Bestax branding ([#106](#106)) ([23aa535](23aa535)), closes [#105](#105)
* **create-bestax:** correct template path resolution from ../../ to ../ ([65b4493](65b4493)), closes [#78](#78)
* **create-bestax:** dark-mode contrast rules in theming/layout skills and docs ([#303](#303)) ([490bf21](490bf21)), closes [#194](#194) [#195](#195)
* **create-bestax:** exclude templates directory from linting and typecheck ([18fec0b](18fec0b))
* **create-bestax:** fail fast with guidance instead of hanging when stdin is not a TTY ([#293](#293)) ([46a172d](46a172d)), closes [#192](#192)
* **create-bestax:** move templates into package directory and update docs ([195bf01](195bf01)), closes [#78](#78)
* **create-bestax:** point scaffolded CLAUDE.md at llms docs; document skills ([#198](#198)) ([b2e0514](b2e0514))
* **create-bestax:** publish with npm provenance attestation ([21ffe8f](21ffe8f)), closes [#180](#180)
* **create-bestax:** read version from package.json instead of hardcoded value ([#109](#109)) ([8605699](8605699))
* **create-bestax:** refresh README and bump scaffolded bestax-bulma to ^5 ([4e19e86](4e19e86))
* **create-bestax:** reject dot-only project names, pin icon versions, bundle bestax-icons skill ([#310](#310)) ([ddff8e5](ddff8e5))
* **create-bestax:** scaffold @allxsmith/bestax-bulma ^4.0.0 ([1d3b802](1d3b802))
* **create-bestax:** scaffold bundled bestax CSS flavors, not stock Bulma ([43621dc](43621dc))
* **create-bestax:** ship improved bundled skills + component catalog ([#199](#199)) ([a1515c2](a1515c2))
* **create-bestax:** skills-sync conformance gate + theming skill reference backfill ([#326](#326)) ([9584133](9584133)), closes [#285](#285)
* **create-bestax:** synchronize version with bestax-bulma to 2.4.0 ([623ee79](623ee79)), closes [#96](#96)
* **create-bestax:** update template dependency to ^2.4.0 ([200971d](200971d))
* **create-bestax:** use scenario-specific screenshot directories to prevent overwrites ([#108](#108)) ([c675957](c675957)), closes [#107](#107)
* **docs:** correct Content Signals syntax in robots.txt ([#134](#134)) ([85dd9de](85dd9de))
* **docs:** emit per-page markdown so llms.txt links resolve ([#200](#200)) ([7877083](7877083))
* **docs:** escape apostrophe in QuickStart notification text ([25d6d72](25d6d72))
* **docs:** generate llms.txt so the advertised homepage link resolves ([9fae464](9fae464)), closes [#177](#177)
* **docs:** improve homepage hero layout and button spacing ([5f7a5a7](5f7a5a7))
* **docs:** move robots.txt to correct deployment location ([#90](#90)) ([1e2aeee](1e2aeee))
* **docs:** rebrand and reorganize Storybook ([#83](#83)) ([dfb9937](dfb9937))
* **docs:** remove Google Analytics and add robots.txt ([94776f7](94776f7))
* **docs:** update Storybook logo path to /img/logo.svg for deployed site ([bf59758](bf59758))
* **e2e:** correct notification CSS selectors to use contains instead of ends-with ([182acc1](182acc1))
* implement independent package versioning strategy ([#111](#111)) ([7819c73](7819c73)), closes [#110](#110)
* prevent bulma-ui from versioning on create-bestax commits ([#120](#120)) ([4dfaf9c](4dfaf9c)), closes [#119](#119)
* resolve React Hooks violations and ESLint configuration issues ([32d2931](32d2931))
* upgrade Turbo, Storybook, and Docusaurus dependencies ([5b4ebdd](5b4ebdd)), closes [#98](#98)

### Documentation

* fix stale versioning and coverage docs; drop CLAUDE.md stale-docs flags ([71c4583](71c4583))

### Features

* add theme system and config provider with comprehensive test coverage ([f3ca7f0](f3ca7f0))
* **bestax-migrate:** react-bulma-components → bestax-bulma codemod CLI, skill, and docs ([#333](#333)) ([e04a12b](e04a12b)), closes [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99)
* **bulma-ui:** add Avatar, Avatars, and Badge components ([#257](#257)) ([0817018](0817018)), closes [#256](#256)
* **bulma-ui:** add colorMode dark-mode prop to Theme ([4acc41e](4acc41e)), closes [#174](#174)
* **bulma-ui:** add consistent gap prop to Columns, aliasing gapSize ([#300](#300)) ([6c36455](6c36455)), closes [#282](#282)
* **bulma-ui:** add cursor helper, closeDelay prop, and polish Tooltip stories ([37945b5](37945b5))
* **bulma-ui:** add extra components, form elements, and SCSS styles ([59daf28](59daf28))
* **bulma-ui:** add HTML element wrapper components ([#135](#135)) ([#136](#136)) ([20fb16d](20fb16d))
* **bulma-ui:** add manual-entry stories for format, bounds, and blocked-value variations ([e93d51c](e93d51c))
* **bulma-ui:** add Reveal component for scroll-triggered animations ([#255](#255)) ([a89c574](a89c574))
* **bulma-ui:** Add skeletons ([6c46e4b](6c46e4b))
* **bulma-ui:** add themed Checkbox/Radio, convenience Field components, and Autocomplete cleanup ([3c57a5a](3c57a5a))
* **bulma-ui:** add typing-first story variants for all picker property variations ([078433f](078433f))
* **bulma-ui:** avatar/badge a11y batch — decorative alt, accessible names, live region, button type, surplus i18n, focus ring ([#298](#298)) ([508477f](508477f)), closes [#266](#266) [#266](#266)
* **bulma-ui:** change the default primary color to [#1](#1 ([8872620](8872620)), closes [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99) [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99)
* **bulma-ui:** compound (dot-notation) sub-components for all parent/child families via shared withSubComponents helper ([#331](#331)) ([07516c5](07516c5))
* **bulma-ui:** dim and blur the calendar behind the Datetimepicker time wheels ([3d90619](3d90619))
* **bulma-ui:** finalize the 3.0 component set ([87ccc0e](87ccc0e))
* **bulma-ui:** make Button and Link as prop polymorphic (React.ElementType) ([#238](#238)) ([ce90304](ce90304)), closes [#188](#188)
* **bulma-ui:** require React 18 as the minimum supported version ([c7251b0](c7251b0))
* **ci:** add verified-commit action for GPG-signed commits ([d078dfa](d078dfa))
* **create-bestax:** add bestax-optimize skill for shrinking built CSS ([#329](#329)) ([f597b9f](f597b9f))
* **create-bestax:** add CLI tool with Vite templates and automated publishing ([9748c3d](9748c3d))
* **create-bestax:** add cross-platform emoji support with figures ([#103](#103)) ([15567d9](15567d9))
* **create-bestax:** add README with templates location note ([8ddc73d](8ddc73d))
* **create-bestax:** add visual regression testing and synchronized versioning ([17e1e22](17e1e22)), closes [#94](#94)
* **create-bestax:** bestax-icons skill — teach agents the icon system ([#302](#302)) ([61c8ef2](61c8ef2)), closes [#287](#287)
* **create-bestax:** improve favicon visibility and add distinct branding ([621590d](621590d)), closes [#100](#100)
* **create-bestax:** modernize templates (Vite 8, ESLint 10, TS 6) + add working lint config ([4537629](4537629)), closes [#167](#167)
* **create-bestax:** offer to install the bestax AI skills when scaffolding ([625b7bf](625b7bf)), closes [#174](#174)
* **create-bestax:** scaffold-aware CLAUDE.md with setup facts and house style ([#271](#271)) ([c1681b0](c1681b0))
* **docs:** add Google Analytics tracking for usage insights ([#68](#68)) ([90ab951](90ab951))
* **docs:** add pronunciation guide and dark mode support ([#58](#58)) ([48a8916](48a8916))
* **docs:** migrate from GitHub Pages to Cloudflare Pages ([#132](#132)) ([2154672](2154672)), closes [#131](#131)
* **form:** add Datepicker, Timepicker, and Datetimepicker components ([c6684e6](c6684e6))

### BREAKING CHANGES

* footer requirement, and the commitlint scope rule
- CONTRIBUTING.md: replace the type-less commit example with a
  commitlint-valid conventional format (verified against commitlint);
  correct all four coverage mentions to the real jest thresholds
  (bulma-ui 99%, create-bestax 95%/78% branches); fix the npm package
  name (@allxsmith/bestax-bulma, plus create-bestax) and link VERSIONING.md
- CLAUDE.md: remove the stale-docs warning and asides now that the
  underlying docs are correct; point at VERSIONING.md again

Closes #206.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0131uD6QKmAij7Byk3SByyLh
* the @allxsmith/bestax-bulma/versions/bestax-bulma-prefixed.css
export is removed. Use versions/bestax-prefixed.css with classPrefix="bestax-".
* **bulma-ui:** React 16 and 17 are no longer supported; the minimum
supported React version is now 18.
* **bulma-ui:** Snackbar has been removed and merged into Toast; use Toast
with its positioning and queue props instead.
* **bulma-ui:** form controls now auto-wrap in Field/Control, and Checkbox
and Radio ship new themed visuals. See the 2.x -> 3.x migration guide.
* This version requires Node.js 18.0.0 or higher. The CLI now enforces this requirement and will exit with an error message if running on older Node.js versions. This aligns create-bestax with the bestax-bulma v2.x ecosystem.

* fix(create-bestax): correct Prettier formatting in index.ts
* None - all changes are additive and backward compatible
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 1.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

github-actions Bot pushed a commit that referenced this pull request Jul 21, 2026
# [3.5.0](https://github.com/allxsmith/bestax/compare/create-bestax@3.4.0...create-bestax@3.5.0) (2026-07-21)

### Features

* **bestax-migrate:** react-bulma-components → bestax-bulma codemod CLI, skill, and docs ([#333](#333)) ([e04a12b](e04a12b)), closes [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99)
* **bulma-ui:** compound (dot-notation) sub-components for all parent/child families via shared withSubComponents helper ([#331](#331)) ([07516c5](07516c5))
* **create-bestax:** scaffold .claude/launch.json with the AI skills opt-in ([#343](#343)) ([189135a](189135a))
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.5.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

github-actions Bot pushed a commit that referenced this pull request Jul 22, 2026
# [5.8.0](https://github.com/allxsmith/bestax/compare/@allxsmith/bestax-bulma@5.7.0...@allxsmith/bestax-bulma@5.8.0) (2026-07-22)

### Features

* **bestax-migrate:** react-bulma-components → bestax-bulma codemod CLI, skill, and docs ([#333](#333)) ([e04a12b](e04a12b)), closes [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99)
* **bulma-ui:** ship agent-discovery files in the npm tarball ([#345](#345)) ([4b58739](4b58739)), closes [#344](#344) [#344](#344) [#344](#344)
* **create-bestax:** scaffold .claude/launch.json with the AI skills opt-in ([#343](#343)) ([189135a](189135a))
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 5.8.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

bestax-release-bot Bot pushed a commit that referenced this pull request Aug 12, 2026
# 1.0.0 (2026-08-12)

* feat(bulma-ui)!: remove bestax-bulma-prefixed CSS variant ([94baa34](94baa34))
* feat(create-bestax)!: require Node.js 18+ and align with bestax-bulma v2 ([#118](#118)) ([b22f183](b22f183))

### Bug Fixes

* add comprehensive rules to prevent bulma-ui versioning on non-bulma-ui commits ([#122](#122)) ([525ccfa](525ccfa)), closes [#119](#119)
* **bestax-mcp:** derive the near-miss guidance from the skill, and only when it helps ([1141cca](1141cca))
* **bestax-mcp:** do not split a helper-prop table cell on an escaped pipe ([bdac820](bdac820))
* **bestax-mcp:** lead get_helper_props with the inline-style prohibition ([ffc627a](ffc627a))
* **bestax-mcp:** make list_components point at the next step ([8ddb2fd](8ddb2fd))
* **bestax-mcp:** make tests and cached builds work from a clean checkout ([6e63820](6e63820)), closes [bestax-mcp#build](https://github.com/bestax-mcp/issues/build)
* **bestax-mcp:** name list_components as the entry point, not search_bestax ([206380b](206380b))
* **bestax-mcp:** name the three near-miss components in the list_components footer ([1c7af67](1c7af67))
* **bestax-mcp:** route helper questions to the tool that answers them ([cd6ce12](cd6ce12))
* **bestax-mcp:** validate the one input that is not ours, and bound the rest ([3e1adc9](3e1adc9))
* **bestax-migrate:** give the kitchen-sink e2e a per-process scratch dir ([2211ea5](2211ea5))
* **bestax-migrate:** reject pnpm's workspace alias form instead of unwrapping it ([de6a900](de6a900))
* **bestax-migrate:** require the pack script to exist, not just be named ([5315efe](5315efe))
* **bestax-migrate:** resolve bare workspace: and guard the catalog: protocol ([7fda9db](7fda9db)), closes [#417](#417) [#412](#412)
* **bestax-migrate:** resolve workspace: specifiers before publishing ([782829a](782829a)), closes [bestax-migrate#test](https://github.com/bestax-migrate/issues/test) [#412](#412)
* **bestax-migrate:** stop the pack hooks excusing a catalog: devDependency ([4127ead](4127ead)), closes [#412-shaped](#412)
* **bulma-ui:** a11y + case-insensitive Taginput matching from PR review ([d576829](d576829))
* **bulma-ui:** accept router props like `to` on Navbar.Item without casts ([#311](#311)) ([b78856b](b78856b)), closes [#306](#306)
* **bulma-ui:** Add build step to publish in ci.yml ([e3707fc](e3707fc))
* **bulma-ui:** add fontawesome-free as explicit devDependency ([a4a5389](a4a5389))
* **bulma-ui:** add missing exports ([0d16633](0d16633))
* **bulma-ui:** Add Skeleton to exports ([e481599](e481599))
* **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([cc3a3e2](cc3a3e2))
* **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([314bc39](314bc39))
* **bulma-ui:** another attempt to fix semantic release builds with ci.yml ([c930693](c930693))
* **bulma-ui:** associate Autocomplete and Taginput labels with their inner inputs ([7ae37d4](7ae37d4))
* **bulma-ui:** associate Autocomplete and Taginput labels with their inner inputs ([384bd38](384bd38))
* **bulma-ui:** associate the form label prop with its control via a generated id ([e6686af](e6686af))
* **bulma-ui:** complete domain migration and fix semantic-release configuration ([#64](#64)) ([f4cd71d](f4cd71d))
* **bulma-ui:** correct blog post examples and add Modal compound components ([#81](#81)) ([559c2e3](559c2e3))
* **bulma-ui:** correct NPM_TOKEN env variable in ci.yml ([94b48b4](94b48b4))
* **bulma-ui:** cover horizontal-layout group label association ([ef3ca9f](ef3ca9f))
* **bulma-ui:** deprecate CSS-less color values, warn in dev, fix has-text fall-through ([fb111eb](fb111eb))
* **bulma-ui:** fail closed on missing process and scope color guidance to real props ([117c0c0](117c0c0))
* **bulma-ui:** Fix release.config.js to include package-lock.json ([390da59](390da59))
* **bulma-ui:** fix standalone Badge pointer-events, pulse halo, and falsy content ([#295](#295)) ([a9db031](a9db031)), closes [#264](#264)
* **bulma-ui:** full classPrefix support across layout/grid + prefix utils ([4ce0b53](4ce0b53))
* **bulma-ui:** honor the htmlFor opt-out in the convenience hook and tighten the association docs ([92aa622](92aa622))
* **bulma-ui:** improve npm package discoverability with optimized keywords and badges ([#72](#72)) ([8c7a696](8c7a696))
* **bulma-ui:** Initial semantic release changes ([b78d785](b78d785))
* **bulma-ui:** keep Taginput's fallback name unless the label targets its input ([73cec33](73cec33))
* **bulma-ui:** keep Taginput's fallback name unless the label targets its input ([ca5996a](ca5996a))
* **bulma-ui:** migrate domain from bestax.cc to bestax.io ([#64](#64)) ([4870b1e](4870b1e))
* **bulma-ui:** migrate ionicons to v8 to unblock publish and Storybook ([927a55b](927a55b)), closes [#142](#142)
* **bulma-ui:** name Rate, Checkboxes, and Radios groups from their labels via aria-labelledby ([dce0ee7](dce0ee7))
* **bulma-ui:** name Rate, Checkboxes, and Radios groups from their labels via aria-labelledby ([#497](#497)) ([5c4222e](5c4222e))
* **bulma-ui:** name the three near-miss components in AGENTS.md ([c63f491](c63f491)), closes [#344](#344)
* **bulma-ui:** never let labelProps.htmlFor wire a group label to a control ([3b3aaaf](3b3aaaf))
* **bulma-ui:** publish rewritten README to npm ([9810081](9810081))
* **bulma-ui:** publish with npm provenance attestation ([172da62](172da62)), closes [#180](#180)
* **bulma-ui:** reference llms docs from README and package.json ([#198](#198)) ([db8aab3](db8aab3))
* **bulma-ui:** reject predicate-blocked values during manual entry ([a8f6e28](a8f6e28))
* **bulma-ui:** resolve flex item properties and Card compound component issues ([#55](#55)) ([e774da3](e774da3))
* **bulma-ui:** resolve flex item properties and Card compound component issues ([#55](#55)) ([7641a53](7641a53))
* **bulma-ui:** resolve react-hooks v7 and [@eslint-react](https://github.com/eslint-react) findings ([14caaaf](14caaaf))
* **bulma-ui:** resolve security vulnerabilities and update dependencies ([#128](#128)) ([112f6e4](112f6e4)), closes [#127](#127)
* **bulma-ui:** restrict semantic-release to bulma-ui scoped commits only ([2d67bf9](2d67bf9)), closes [#62](#62)
* **bulma-ui:** retry failed Avatar src, flatten Fragment children in Avatars, RTL-safe overlap ([#297](#297)) ([c00b9db](c00b9db))
* **bulma-ui:** route every hardcoded class through the prefix helpers; add classPrefix sweep test ([#301](#301)) ([a50b134](a50b134)), closes [#286](#286)
* **bulma-ui:** setup gpg signing with semantic-release ([3e24722](3e24722))
* **bulma-ui:** strip redundant library prefix from Icon name ([#242](#242)) ([dbe3622](dbe3622)), closes [#189](#189)
* **bulma-ui:** trigger release to publish via OIDC trusted publishing ([e2d09c5](e2d09c5))
* **bulma-ui:** update bundle size claims to accurate 21KB gzipped ([#66](#66)) ([6e381bd](6e381bd))
* **bulma-ui:** update package-lock.json ([853d585](853d585))
* **bulma-ui:** update package.json for better seo, exports, types, engines, funding, etc ([98cbc56](98cbc56))
* **bulma-ui:** use createRequire for ESM compatibility in Storybook 10 ([#130](#130)) ([b27e60e](b27e60e)), closes [#129](#129)
* **ci:** collect screenshots as artifacts and commit in single batch to avoid conflicts ([27b259d](27b259d))
* **ci:** ensure npm install uses fresh downloads with --prefer-online ([1f2e15d](1f2e15d))
* **ci:** properly extract base path for recursive file search ([e0330ff](e0330ff))
* **ci:** use find command instead of glob module in verified-commit action ([0e2d159](0e2d159))
* **ci:** use npm ci for scaffolded app dependencies ([35652c8](35652c8))
* **create-bestax:** concrete inline-style → helper-prop mapping for the never-inline rule ([#357](#357)) ([5f72a90](5f72a90)), closes [#350](#350) [#350](#350)
* **create-bestax:** correct browser title to prioritize Bestax branding ([#106](#106)) ([23aa535](23aa535)), closes [#105](#105)
* **create-bestax:** correct template path resolution from ../../ to ../ ([65b4493](65b4493)), closes [#78](#78)
* **create-bestax:** dark-mode contrast rules in theming/layout skills and docs ([#303](#303)) ([490bf21](490bf21)), closes [#194](#194) [#195](#195)
* **create-bestax:** exclude templates directory from linting and typecheck ([18fec0b](18fec0b))
* **create-bestax:** fail fast with guidance instead of hanging when stdin is not a TTY ([#293](#293)) ([46a172d](46a172d)), closes [#192](#192)
* **create-bestax:** move templates into package directory and update docs ([195bf01](195bf01)), closes [#78](#78)
* **create-bestax:** point scaffolded CLAUDE.md at llms docs; document skills ([#198](#198)) ([b2e0514](b2e0514))
* **create-bestax:** publish with npm provenance attestation ([21ffe8f](21ffe8f)), closes [#180](#180)
* **create-bestax:** put the near-miss guidance where every session sees it ([6db49f3](6db49f3))
* **create-bestax:** read version from package.json instead of hardcoded value ([#109](#109)) ([8605699](8605699))
* **create-bestax:** refresh README and bump scaffolded bestax-bulma to ^5 ([4e19e86](4e19e86))
* **create-bestax:** reject dot-only project names, pin icon versions, bundle bestax-icons skill ([#310](#310)) ([ddff8e5](ddff8e5))
* **create-bestax:** scaffold @allxsmith/bestax-bulma ^4.0.0 ([1d3b802](1d3b802))
* **create-bestax:** scaffold bundled bestax CSS flavors, not stock Bulma ([43621dc](43621dc))
* **create-bestax:** ship improved bundled skills + component catalog ([#199](#199)) ([a1515c2](a1515c2))
* **create-bestax:** shrink the near-miss block and pin the copies together ([d582da5](d582da5))
* **create-bestax:** skills-sync conformance gate + theming skill reference backfill ([#326](#326)) ([9584133](9584133)), closes [#285](#285)
* **create-bestax:** stop the skills teaching a Theme call that does not compile ([2935bb2](2935bb2))
* **create-bestax:** synchronize version with bestax-bulma to 2.4.0 ([623ee79](623ee79)), closes [#96](#96)
* **create-bestax:** teach the skills the three components Bulma hides ([22dcff7](22dcff7))
* **create-bestax:** update template dependency to ^2.4.0 ([200971d](200971d))
* **create-bestax:** use scenario-specific screenshot directories to prevent overwrites ([#108](#108)) ([c675957](c675957)), closes [#107](#107)
* **create-bestax:** validate at submit in the bestax-form signup example ([0b9518f](0b9518f))
* **create-bestax:** wire labeled controls in the skill showcase story ([af49a16](af49a16))
* **docs:** announce the hero copy, and stop remounting the icons ([98e2cb0](98e2cb0)), closes [#434](#434)
* **docs:** correct Content Signals syntax in robots.txt ([#134](#134)) ([85dd9de](85dd9de))
* **docs:** correct the frozen-install translation and reject leaked fences ([1883de3](1883de3))
* **docs:** drop dead nomodule ionicons fallback ([82be3e4](82be3e4))
* **docs:** emit per-page markdown so llms.txt links resolve ([#200](#200)) ([7877083](7877083))
* **docs:** escape apostrophe in QuickStart notification text ([25d6d72](25d6d72))
* **docs:** generate llms.txt so the advertised homepage link resolves ([9fae464](9fae464)), closes [#177](#177)
* **docs:** give every batch run its own port — slot reuse was corrupting runs ([6ef1755](6ef1755))
* **docs:** harden PackageManagerTabs and document how to author it ([5b0d3e6](5b0d3e6)), closes [#434](#434)
* **docs:** harden the hero copy button and share the tab storage key ([9e16cd7](9e16cd7))
* **docs:** improve homepage hero layout and button spacing ([5f7a5a7](5f7a5a7))
* **docs:** make the eval batch resumable after a container restart ([d56229e](d56229e))
* **docs:** make the hero package-manager switcher a real radiogroup ([aa14ff2](aa14ff2)), closes [#434](#434)
* **docs:** move robots.txt to correct deployment location ([#90](#90)) ([1e2aeee](1e2aeee))
* **docs:** rebrand and reorganize Storybook ([#83](#83)) ([dfb9937](dfb9937))
* **docs:** remove Google Analytics and add robots.txt ([94776f7](94776f7))
* **docs:** stop cssnano stripping Font Awesome [@font-face](https://github.com/font-face), add [#3](#3) CSS framework blog post ([#401](#401)) ([5d114e1](5d114e1)), closes [#400](#400)
* **docs:** update Storybook logo path to /img/logo.svg for deployed site ([bf59758](bf59758))
* **e2e:** correct notification CSS selectors to use contains instead of ends-with ([182acc1](182acc1))
* implement independent package versioning strategy ([#111](#111)) ([7819c73](7819c73)), closes [#110](#110)
* prevent bulma-ui from versioning on create-bestax commits ([#120](#120)) ([4dfaf9c](4dfaf9c)), closes [#119](#119)
* resolve React Hooks violations and ESLint configuration issues ([32d2931](32d2931))
* upgrade Turbo, Storybook, and Docusaurus dependencies ([5b4ebdd](5b4ebdd)), closes [#98](#98)

### chore

* **deps:** consolidate the dependabot backlog, require Node 22 in both CLIs ([#447](#447)) ([e68148c](e68148c)), closes [#427](#427) [#428](#428) [#431](#431) [#432](#432) [#440](#440) [#393](#393)

### Documentation

* fix stale versioning and coverage docs; drop CLAUDE.md stale-docs flags ([71c4583](71c4583))

### Features

* add theme system and config provider with comprehensive test coverage ([f3ca7f0](f3ca7f0))
* **bestax-mcp:** serve component docs, props, examples and skills over MCP ([c2abcc4](c2abcc4))
* **bestax-migrate:** react-bulma-components → bestax-bulma codemod CLI, skill, and docs ([#333](#333)) ([e04a12b](e04a12b)), closes [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99)
* **bestax-migrate:** require Node 22 and take chalk 6 ([#449](#449)) ([4c0e1e2](4c0e1e2)), closes [#447](#447)
* **bulma-ui:** add Avatar, Avatars, and Badge components ([#257](#257)) ([0817018](0817018)), closes [#256](#256)
* **bulma-ui:** add colorMode dark-mode prop to Theme ([4acc41e](4acc41e)), closes [#174](#174)
* **bulma-ui:** add consistent gap prop to Columns, aliasing gapSize ([#300](#300)) ([6c36455](6c36455)), closes [#282](#282)
* **bulma-ui:** add cursor helper, closeDelay prop, and polish Tooltip stories ([37945b5](37945b5))
* **bulma-ui:** add extra components, form elements, and SCSS styles ([59daf28](59daf28))
* **bulma-ui:** add HTML element wrapper components ([#135](#135)) ([#136](#136)) ([20fb16d](20fb16d))
* **bulma-ui:** add manual-entry stories for format, bounds, and blocked-value variations ([e93d51c](e93d51c))
* **bulma-ui:** add Reveal component for scroll-triggered animations ([#255](#255)) ([a89c574](a89c574))
* **bulma-ui:** Add skeletons ([6c46e4b](6c46e4b))
* **bulma-ui:** add themed Checkbox/Radio, convenience Field components, and Autocomplete cleanup ([3c57a5a](3c57a5a))
* **bulma-ui:** add typing-first story variants for all picker property variations ([078433f](078433f))
* **bulma-ui:** associate Field's label with a composed base control ([219f631](219f631))
* **bulma-ui:** avatar/badge a11y batch — decorative alt, accessible names, live region, button type, surplus i18n, focus ring ([#298](#298)) ([508477f](508477f)), closes [#266](#266) [#266](#266)
* **bulma-ui:** change the default primary color to [#1](#1 ([8872620](8872620)), closes [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99) [#1e6b99](https://github.com/allxsmith/bestax/issues/1e6b99)
* **bulma-ui:** compound (dot-notation) sub-components for all parent/child families via shared withSubComponents helper ([#331](#331)) ([07516c5](07516c5))
* **bulma-ui:** dim and blur the calendar behind the Datetimepicker time wheels ([3d90619](3d90619))
* **bulma-ui:** finalize the 3.0 component set ([87ccc0e](87ccc0e))
* **bulma-ui:** make Button and Link as prop polymorphic (React.ElementType) ([#238](#238)) ([ce90304](ce90304)), closes [#188](#188)
* **bulma-ui:** require React 18 as the minimum supported version ([c7251b0](c7251b0))
* **bulma-ui:** ship agent-discovery files in the npm tarball ([#345](#345)) ([4b58739](4b58739)), closes [#344](#344) [#344](#344) [#344](#344)
* **ci:** add verified-commit action for GPG-signed commits ([d078dfa](d078dfa))
* **create-bestax:** add bestax-optimize skill for shrinking built CSS ([#329](#329)) ([f597b9f](f597b9f))
* **create-bestax:** add CLI tool with Vite templates and automated publishing ([9748c3d](9748c3d))
* **create-bestax:** add controlled-Burger Navbar to the landing archetype ([#355](#355)) ([36d4d09](36d4d09)), closes [#348](#348)
* **create-bestax:** add cross-platform emoji support with figures ([#103](#103)) ([15567d9](15567d9))
* **create-bestax:** add README with templates location note ([8ddc73d](8ddc73d))
* **create-bestax:** add visual regression testing and synchronized versioning ([17e1e22](17e1e22)), closes [#94](#94)
* **create-bestax:** agent-validated guidance for skills, scaffold CLAUDE.md, and catalog ([#365](#365)) ([6fd06ae](6fd06ae)), closes [#2](#2)
* **create-bestax:** bestax-icons skill — teach agents the icon system ([#302](#302)) ([61c8ef2](61c8ef2)), closes [#287](#287)
* **create-bestax:** improve favicon visibility and add distinct branding ([621590d](621590d)), closes [#100](#100)
* **create-bestax:** modernize templates (Vite 8, ESLint 10, TS 6) + add working lint config ([4537629](4537629)), closes [#167](#167)
* **create-bestax:** offer to install the bestax AI skills when scaffolding ([625b7bf](625b7bf)), closes [#174](#174)
* **create-bestax:** require Node 22 and take chalk 6 ([#448](#448)) ([90fced2](90fced2)), closes [#447](#447)
* **create-bestax:** scaffold .claude/launch.json with the AI skills opt-in ([#343](#343)) ([189135a](189135a))
* **create-bestax:** scaffold-aware CLAUDE.md with setup facts and house style ([#271](#271)) ([c1681b0](c1681b0))
* **create-bestax:** set scaffolded index.html title to the project name ([#356](#356)) ([3bfbea3](3bfbea3)), closes [#349](#349) [#349](#349)
* **docs:** add Google Analytics tracking for usage insights ([#68](#68)) ([90ab951](90ab951))
* **docs:** add package-manager switches to the homepage hero ([374caf8](374caf8))
* **docs:** add PackageManagerTabs and register it globally ([23c9989](23c9989))
* **docs:** add pronunciation guide and dark mode support ([#58](#58)) ([48a8916](48a8916))
* **docs:** aggregate-runs.mjs — distribution stats across a runs directory ([5de9c07](5de9c07))
* **docs:** batch runner for the eval harness, with the concurrency fixes it needed ([f8e268c](f8e268c))
* **docs:** migrate from GitHub Pages to Cloudflare Pages ([#132](#132)) ([2154672](2154672)), closes [#131](#131)
* **docs:** rubric v2 and a brief that demands the components beyond Bulma ([e6047be](e6047be))
* **docs:** show all posts in the blog sidebar ([d29e9c6](d29e9c6))
* **form:** add Datepicker, Timepicker, and Datetimepicker components ([c6684e6](c6684e6))

### Performance Improvements

* **bestax-mcp:** stop get_helper_props costing half the session ([b865651](b865651))
* **docs:** defer live previews until they scroll into view ([d6bf87b](d6bf87b))
* **docs:** share one parsed stylesheet set across every live preview ([feb993a](feb993a))

### BREAKING CHANGES

* **bestax-migrate:** bestax-migrate now requires Node.js 22 or newer. Node 18 and
20 are both past end-of-life. Running it on an older runtime prints an explicit
upgrade message and exits 1. This applies to the runtime the codemod executes
on, not to the app being migrated.

Claude-Session: https://claude.ai/code/session_01TGA6sFTUGsJ6oXhfpjKEnh
* **create-bestax:** create-bestax now requires Node.js 22 or newer. Node 18 and 20
are both past end-of-life. Running it on an older runtime prints an explicit
upgrade message and exits 1.

Claude-Session: https://claude.ai/code/session_01TGA6sFTUGsJ6oXhfpjKEnh
* **deps:** create-bestax now requires Node.js 22 or newer. Node 18 and 20
are both past end-of-life. Running it on an older runtime prints an explicit
upgrade message and exits 1.

Claude-Session: https://claude.ai/code/session_01TGA6sFTUGsJ6oXhfpjKEnh

* feat(bestax-migrate): require Node 22 and take chalk 6

chalk 6 drops support for Node below 22. The API surface this package uses is
unchanged, so no calling code changes.

The version guard in src/index.ts moves ahead of every import and no longer
depends on anything: import declarations are hoisted and evaluated before any
statement in the module, and chalk 6 itself requires Node >= 22, so a static
import would fail to load on exactly the runtimes the guard exists to catch.
./cli.js is now imported dynamically for the same reason.

@babel/parser deliberately stays on 7.x. Babel 8 removes the
`deprecatedImportAssert` plugin with no replacement, and this package parses
the legacy `import x from 'y' assert { type: 'json' }` form on purpose — a
codemod that migrates older codebases must not crash on the syntax those
codebases still contain. There is a regression test for it ("parses the legacy
import-assert syntax"), which Babel 8 fails outright. jscodeshift 17 bundles
its own Babel 7 regardless, so staying on 7 also keeps a single parser in the
tree rather than two.
* **deps:** bestax-migrate now requires Node.js 22 or newer. Node 18 and
20 are both past end-of-life. Running it on an older runtime prints an explicit
upgrade message and exits 1.

Claude-Session: https://claude.ai/code/session_01TGA6sFTUGsJ6oXhfpjKEnh
* footer requirement, and the commitlint scope rule
- CONTRIBUTING.md: replace the type-less commit example with a
  commitlint-valid conventional format (verified against commitlint);
  correct all four coverage mentions to the real jest thresholds
  (bulma-ui 99%, create-bestax 95%/78% branches); fix the npm package
  name (@allxsmith/bestax-bulma, plus create-bestax) and link VERSIONING.md
- CLAUDE.md: remove the stale-docs warning and asides now that the
  underlying docs are correct; point at VERSIONING.md again

Closes #206.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0131uD6QKmAij7Byk3SByyLh
* the @allxsmith/bestax-bulma/versions/bestax-bulma-prefixed.css
export is removed. Use versions/bestax-prefixed.css with classPrefix="bestax-".
* **bulma-ui:** React 16 and 17 are no longer supported; the minimum
supported React version is now 18.
* **bulma-ui:** Snackbar has been removed and merged into Toast; use Toast
with its positioning and queue props instead.
* **bulma-ui:** form controls now auto-wrap in Field/Control, and Checkbox
and Radio ship new themed visuals. See the 2.x -> 3.x migration guide.
* This version requires Node.js 18.0.0 or higher. The CLI now enforces this requirement and will exit with an error message if running on older Node.js versions. This aligns create-bestax with the bestax-bulma v2.x ecosystem.

* fix(create-bestax): correct Prettier formatting in index.ts
* None - all changes are additive and backward compatible
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 1.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] bestax-migrate: codemod CLI + agent skill to migrate apps off react-bulma-components

2 participants