What's New
Release notes and changelog for all packages.0.1.1
New Features
- Add
astryx buildcommand for page composition, with natural-language search ranking.build "<idea>"returns a composition kit — the closest page template, the blocks that cover parts, and components to fill gaps, plus a Compose suggestion.buildwith no args prints the how-to-build playbook. The shared search ranking now handles oblique natural-language queries via tokenization + stopwords, a synonym/intent map, light stemming, and page-template keyword enrichment. - Make generated agent docs build-first and restructure
initoutput. The generatedCLAUDE.mdnow leads with thebuildworkflow (search reframed as a neutral universal find), and includes a required-CSS setup note (reset.css+astryx.css) so components never render unstyled.initnow points agents atastryx build/astryx searchinstead of dumping page-template names. - Improve
astryx buildoutput into a complete composition kit.build "<idea>"now returns an agent-ready kit grouped by role: a START line (scaffold vs compose), the closest PAGE template, an always-on FRAME (page shell) and FOUNDATION (layout/typography/action primitives), idea-specific BLOCKS and DOMAIN COMPONENTS (with a relevance floor to cut noise), and a SETUP reminder. The always-on FRAME/FOUNDATION groups fix low recall of the structural primitives every page needs but that never keyword-match an idea (measured: component recall 15% to 71% on an agent-grounded eval). - Densify agent docs + tailor styling guidance to the project's configured system
Tightened the generated
CLAUDE.md/AGENTS.mdblock from ~48 lines to ~26 (the per-topicdocsdump collapsed to one line,build/search/componentno longer duplicated between workflow and reference, run-prefix stated once, filler prose removed) — same information, far denser.
Fixes
npx astryxnow works when the CLI is installed as a real npm package. The bin imported its../src/*modules relative to the invoked path, so running through thenode_modules/.bin/astryxsymlink made them resolve outside the package (ERR_MODULE_NOT_FOUND: .../node_modules/src/...) on Node versions that don't realpath the bin entry. It now resolves siblings via the bin's real path (realpath ofimport.meta.url), working whether invoked via symlink, copy, or Windows shim. Also fixes the non-interactiveinit/themeerror to sayastryx <command>instead of the stalexds <command>.- Add a v0.1.0 upgrade codemod that migrates legacy
@xds/*module specifiers and config surfaces to the Astryx v0.1.0 names. [breaking] Remove legacyastryx.versionFileupdate-hint support from package.json.
Documentation
- Add npm install step to the Theme System guide
The Quick Start section jumped straight to
import {neutralTheme} from '@astryxdesign/theme-neutral', which fails withCannot find modulefor anyone who hasn't already installed the theme package. Prepend a one-line preamble +npm installcode block, and add a short prose note above the Available Themes table pointing at the install command pattern. Reported in #3082.
Other Changes
- StyleX compiler wired →
xstyle/ StyleX token imports - Tailwind → utility classes backed by
@astryxdesign/core/tailwind-theme.css - neither →
style/classNamewithvar(--token)design tokens, plus an explicit note NOT to usexstyle/utilities (they would not compile)
Contributors
Thanks to everyone who contributed to this release:
- @ejhammond
- @joeyfarina
- @josephfarina
- @nynexman4464
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';
```
```
- 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