What's New
Release notes and changelog for all packages.0.1.0
Breaking Changes
- Read project config from
astryx.config.mjs(wasxds.config.mjs) The CLI now resolves its optional project config fromastryx.config.mjsinstead ofxds.config.mjs— a hard cut, no fallback. Consumers with anxds.config.mjsmust rename it toastryx.config.mjs(the config shape and all fields are unchanged). Part of removingxdsnaming from the public API. - Rename the CLI command/bin from
xdstoastryxThe CLI binary is nowastryx(wasxds);bin/xds.mjsis renamed tobin/astryx.mjs, the dualxds+astryxbin entries collapse to a singleastryx, and the program/manifest name isastryx. Invoke the CLI asnpx astryx <command>(e.g.npx astryx component Button). The swizzle default output dir moves from./components/xdsto./components/astryx. Consumers usingnpx xds, anxdsnpm-script alias, or thexdsMCP server name should switch toastryx. Part of removingxdsnaming from the public API. - Rename the exported
XDSErrorclass toAstryxErrorThe CLI's programmatic API error class is renamedXDSError->AstryxError(exported from@xds/cli+ declared in its types). Consumers that catch or referenceXDSErrorfrom the CLI's API should switch toAstryxError. Part of removingxdsnaming from the public API. - Remove the XDS-prefix compatibility layer — astryx is now the only public surface
This release erases all
xdsnaming from the public API; there is no compatibility window. Consumers must migrate (we own all consumers pre-OSS): - Remove the daily, brutalist, and default themes; neutral is the new baseline Three theme packages are removed from the repo and will no longer be published:
Fixes
theme buildgenerates valid bare type imports (IconRegistry/DefinedTheme)astryx theme buildemitted.d.tsfiles importingXDSIconRegistry/XDSDefinedThemefrom@xds/core, but those aliases were removed — the generated types failed to resolve. GenerateIconRegistry/DefinedTheme(the bare names@xds/corenow exports) instead.
Documentation
- Update CLI theme docs to the current theme set
Refreshes the
astryx docs theme,getting-started,styling,styling-libraries, andmigrationreference docs to reflect the published themes:neutral,butter,chocolate,gothic,matcha,stone, andy2k. The removedtheme-default,theme-brutalist, andtheme-dailypackages are dropped from the docs, and install/import examples now use@astryxdesign/theme-neutralas the recommended starting theme.
Other Changes
- Component names: the
XDS*aliases are gone — use bare names (ButtonnotXDSButton,useThemenotuseXDSTheme,ButtonPropsnotXDSButtonProps). Thedrop-xds-prefix-importscodemod automates this. - CSS classes: components emit only
.astryx-*(the dual.xds-*class is gone). Update custom CSS selectors.xds-button->.astryx-button(prop/state value classes like.primary/.smare unchanged). - data attributes: only
data-astryx-theme/data-astryx-mediaare written; update custom selectors and SSR root attributes offdata-xds-*. - CSS layers:
@layer xds-base/xds-themeare renamed toastryx-base/astryx-theme; update your@layerorder line and any PostCSSlayersBeforeconfig.@astryxdesign/build's default library layer is nowastryx-base. - Pre-compiled stylesheet: the
@astryxdesign/core/xds.cssexport is removed — import@astryxdesign/core/astryx.css. - CSS custom properties: the
--xds-*padding fallback is gone; set--astryx-*. - CLI config key:
@astryxdesign/clireads the package.json"astryx"field (was"xds"). Rename the block; a stale"xds"key silently drops the package from discovery. @astryxdesign/theme-daily@astryxdesign/theme-brutalist@astryxdesign/theme-defaultimport {defaultTheme} from '@astryxdesign/theme-default/built';
- import {neutralTheme} from '@astryxdesign/theme-neutral/built';
<Theme theme={defaultTheme}>...</Theme>
```
- Remove the internal
drop-xds-meta-prefixcodemod from the OSS repo (#2970) This codemod has been moved to its own package's tooling, where it belongs. It was registered as an optional, version-independent transform and is not part of any standard upgrade path, so removing it does not affect the public0.0.13 → 0.0.15migration. - Rename the npm package scope from
@xds/*to@astryxdesign/*All published packages move to the new@astryxdesignscope (e.g.@xds/core→@astryxdesign/core), along with the workspace lockfile, build/runtime scope-directory scans, and docsite slug derivation. Consumers must update their imports and dependency names. The internal ESLint plugin namespace (@xds/*rules) is intentionally untouched and tracked separately. Existing@xds/*codemods continue to target the old scope so projects still on@xds/*can migrate.
Contributors
Thanks to everyone who contributed to this release:
- @cixzhang
- @ejhammond
0.0.15
Breaking Changes
- New
astryx upgradecodemods — This release ships codemods for the DatePicker→Input rename (rename-date-picker-to-input), Stackelement→as(rename-stack-element-to-as), ChatisStreaming→isStopShown(rename-isStreaming-to-isStopShown), imperativeref→handleRef(rename-imperative-ref-to-handleRef), the menu/selectorchildren→endContentmove (migrate-item-children-to-endcontent), and the selector function-children→renderOptionmove (migrate-selector-children-to-render-option). The bare-name migration (drop-xds-prefix-imports,drop-xds-meta-prefix) and the thememigrate-theme-selectors-to-data-attrscodemod ship as optional, run them explicitly. (#2879, #2957)
Upgrade
bashnpx astryx upgrade --apply
New Features
astryxbinary — The CLI is now also available asastryx(same launcher asxds), part of the un-prefix migration. Component discovery, the doc gate, and CI checks are prefix-agnostic — bothXDS{Name}.tsxand bare{Name}.tsxsource files are recognized. (#2867, #2878)astryx doctor— New health-check command for diagnosing project/setup issues. (#2565)- Unified search —
astryx searchsearches across components, hooks, docs, and templates in one query. (#2564) - Capability manifest — Full machine-readable capability manifest for agent discovery, plus stable machine-readable error codes on every error. (#2562, #2563)
@xds/cli/apihook export — Thehookis exposed via@xds/cli/apiwith types and parity coverage. (#2558)- CLI exit-code policy — Every user-visible error now exits with code 1 in both human and
--jsonmodes (previously several command-layer errors printed a message but exited 0, invisible to CI scripts and AI agents).xds bogus-cmd,astryx theme bogus-subcommand, the barethemegroup with an unknown subcommand, and "command not found"/"did you mean…" paths all exit 1. Help, version, and bare-list invocations still exit 0. Introduceslib/cli-error.mjsas the canonical exit-code helper. - Migration guide — Added an explicit guide for moving existing Tailwind, shadcn, and Radix applications to XDS incrementally.
- Data-attribute selector docs — Documented the data-attribute selector surface in CLI docs alongside the core dual-emit change.
Fixes
--jsonon Commander short-circuits —--jsonnow honored on parse errors and--help. A new shim wiresexitOverride()and a JSON-awareconfigureOutputonto every command and patchesoutputHelpto emit a{apiVersion, type:'help', data}envelope under--json. Parse errors produce{apiVersion, error}on stdout with exit 1; unknown subcommands now error instead of silently emitting help with exit 0;--detailis choice-validated. Non---jsoninvocations are unchanged.--jsoncontract enforcement — Commands that don't support--jsonreject the flag in apreActionhook before running side effects, soastryx init --jsonno longer creates files and then errors, leaving partial state behind.--jsonenvelope documented — Success responses are{ type, data }; error responses are{ error, suggestions? }. The--jsonhelp text describes both.xds --version --json— Emits{ type: 'version', data: { version } }instead of plain text.xds --json(no subcommand) — Emits{ type: 'help', data: { commands, jsonSupported, ... } }instead of human help text.astryx upgrade --json— "Already up to date" and "no codemods in version range" paths emit structured{ type: 'upgrade.status', ... }envelopes. The codemod runner is silent under--jsonso prompts and progress lines no longer corrupt stdout.astryx discover --json— Includesmeta: { configured: false }when no packages are configured, distinguishing "configured but empty" from "not configured".xds gap-report --json— Returns a structured error instead of starting an interactive prompt when required flags are missing; the "gh CLI missing" path also emits a JSON error.astryx theme --json— Thethemeparent command (without a subcommand) rejects--jsoncleanly;theme build --jsoncontinues to work.- Theme CSS prose regression —
astryx theme buildnow uses a single CSS generation path (@xds/core's generator) and treats a failed@xds/core/themeimport as a hard build error instead of a silent fallback, fixing the docsite Markdown typography regression after the XDS-prefix migration. (#2964)
Contributors
Thanks to everyone who contributed to this release:
- @cixzhang
- @czarandy
- @ejhammond
- @ernestt
- @imdreamrunner
- @josephfarina
- @kentonquatman
- @rubyycheung
- @thedjpetersen
0.0.14
Codemods
New Features
- New component showcases — XDSAvatarGroup, XDSInputGroup, XDSStepper, XDSButtonGroup, XDSContextMenu, XDSFileInput, XDSDateRangePicker, XDSDateTimePicker, XDSBlockquote
- Hook documentation system —
xds hooksCLI command for hook docs (#1849) - Playground defaults — Added to 19 more components (#2047)
- Theme/MediaTheme/SyntaxTheme showcases — Utility showcase support (#2040, #2028)
- Slot elements — Wired through playground UI for ReactNode props (#2012, #2005)
exampleForfield — Added to all block templates (#1966)scaffoldflag — Template metadata scaffold support (#1939)- Table page templates — Heatmap Status, Matcha Store, Chart Shoe Store (#2172, #2149, #2154)
Fixes
- Group useXDSToast and useXDSCollapsible with their parent components in docs (#2049)
- DropdownMenu inline data types — Inline into items prop docs (#2027)
- Parent hook docs to their component in docsite (#2022)
0.0.13
Codemods
New Features
--skip-installand--force-installflags forastryx upgrade(#1547)npx astryx docs iconsreference + updated icon prop descriptions (#1500)- Theme nudge in generated agent docs (#1456)
- Theme
expandColorScale— derive color tokens from accent hex inastryx theme build(#1452) - Component groups read from doc files instead of hardcoded map (#1650)
- Page and block template system (#1393)
Fixes
- Handle prerelease suffixes in
semverCompare(#1512) - Handle ternary/logical expressions in
icon-name-deprecationscodemod (#1513) - Don't inject XDS block into files without markers during upgrade (#1495)
findShowcasematches by directory name andcomponentsUsed(#1728)- Include
onMediaCSS in built theme output (#1450) - Register codemods for v0.0.13 (moved from v0.0.14) (#1508)
Upgrade
shnpx astryx upgrade --apply --to 0.0.13
0.0.12
Codemods
add-is-icon-only— AddisIconOnlyto icon-only Button and ToggleButton usages (#1257)
Upgrade
shnpx astryx upgrade --apply --to 0.0.12
0.0.10
Codemods
remove-size-props— Removesizeprop from StatusDot and ProgressBar (#966)
Upgrade
shnpx astryx upgrade --apply --to 0.0.10
0.0.8
New Features
- CLI: tsx parser for .ts files
- Update hints in postAction hook
Codemods
Upgrade
shnpx astryx upgrade --apply --to 0.0.8
0.0.7
Codemods
Upgrade
shnpx astryx upgrade --apply --to 0.0.7
0.0.6
Codemods
migrate-token-names— Design token renames per naming auditmigrate-shadow-tokens— Elevation → shadow semantic namingmigrate-collapse-to-collapsible— XDSCollapse → XDSCollapsiblemigrate-radius-tokens— Semantic radius → numeric scalemigrate-skeleton-radius— Skeleton radius prop → numeric scalemigrate-badge-children-to-label— Badge children → label prop
Upgrade
shnpx astryx upgrade --apply --to 0.0.6
0.0.5
New Features
Note: Codemods for v0.0.5 breaking changes are registered under v0.0.6. Use
--to 0.0.6.
0.0.4
Features
Refactors
- Split
component.mjsintolib/modules with lazy command registry (#613)
0.0.3
Patch Changes
- Sync package.json exports map
- Add verify-exports CI check (#537)
0.0.2
New Features
astryx upgradecommand with codemod supportastryx theme build(formerlybuild-theme)
Codemods
12 codemods for the v0.0.2 breaking changes:
rename-selector-items-to-options— Selectoritems→optionsunify-visibility-to-onOpenChange— Visibility callbacks →onOpenChangeunify-uncontrolled-to-defaultX— Uncontrolled state → defaultX patternrename-banner-endButton-to-endContent— BannerendButton→endContentrename-form-tooltip-startIcon— Formtooltip→labelTooltip,startIcon→labelIconrename-isShown-to-isOpen— Dialog/PopoverisShown→isOpenrename-topnav-title-to-heading— TopNav title → headingrename-sidenav-header-to-heading— SideNav header → headingmigrate-useXDSIcon-to-getIcon—useXDSIcon()→getIcon()migrate-gap-to-numeric— String gap tokens → numericmigrate-isFullBleed-to-padding—isFullBleed→padding={0}migrate-badge-dot-to-statusdot— Badge dot → StatusDot
Upgrade
shnpx astryx upgrade --apply --to 0.0.2
0.0.1
- Initial release