Repository navigation
chore: release - #177
Merged
Merged
chore: release#177
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 16, 2026 05:07
71917ac to
af2375a
Compare
dgesteves-release
Bot
force-pushed
the
changeset-release/main
branch
7 times, most recently
from
October 16, 2026 09:38
782daaf to
5fb5bac
Compare
dgesteves-release
Bot
force-pushed
the
changeset-release/main
branch
from
October 16, 2026 09:42
5fb5bac to
8d2c318
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
onsystem@0.8.0
Minor Changes
#180
9f40cac-checkandcheck_uiread only JS and TS files. A CSS, Markdown or JSON file named outright or matched by a glob, ascheck $(git diff --name-only), lint-staged's"*"orcheck "**/*"passes them, was parsed as TSX and gave hundreds of syntax errors (209 for a shadcn/uiapp/globals.css), so the run failed on files with no UI code in them.checknow skips such a file and counts it in the summary line (3 files that are not JS or TS skipped).check_uianswers with an error for apathorfilenamethat is not.tsx,.jsx,.tsor.js(or.mts,.cts,.mjs,.cjs): a.vueor.cssfile was checked as TSX before.--require-design-systemalso fails (exit code 2) when the folders and globs it is given leave no file to check, so CI cannot pass by checking nothing: a JavaScript app whose pages are.jsfiles, a job that runs in a design-system package, whose files are all its own components, or a glob that matches only styles. Files named outright that are not JS or TS still pass with nothing to check. This can fail a job that passed before.Folders still stand for their
.tsxand.jsxfiles, andchecknow names the.jsfiles in them that have JSX (Next.js's JavaScript template writesapp/page.js) with the command that checks them, such ascheck . "**/*.js", in place of "no files match" for a folder of.jspages, and as the first line of the--require-design-systemfailure. In the GitHub Action,paths: . **/*.jschecks them.A run with 50 findings or more ends, in the default output, with the count per rule and the ten Tailwind palette classes it found most, each with the token to use.
--format json,sarifandgithubprint the findings alone, as before.#183
7159b5b-excludeadds to the defaults instead of replacing them. A config whoseexcludelists folders without repeating the defaults now also leaves out tests and stories (*.test.tsx,*.stories.tsx,__tests__,__stories__and__mocks__folders) and.d.tsfiles, which it checked before. To check one of them again, add the default with!in front ("!**/*.{test,spec,stories}.{ts,tsx,js,jsx}"), or pass--include-teststo check tests and stories for one run; a!pattern that names no default gets a warning. A design-system package'sexcludeadds to the defaults for finding its own components too.#176
e7335d8- Zero config now reads a design-system package installed from a registry when it is named like one (@acme/ui,@acme/design-system) and itsexportspoint at the.tsxor.jsxsources it publishes, directly or through barrels, as it reads a workspace package, with no config in the app or the package. Before, such an app got no components and no tokens: a package that publishessrc/, such as one whoseexportspoint at./src/index.ts, was skipped as compiled. Its exported stylesheets are its tokens, with the ones of the package they@import, and an app stylesheet's@import "@acme/ui/globals.css"is followed intonode_moduleswhen the app's config names notokens. Other installed packages, such astailwindcss, are not read. Itsexportsare read through the conditions an app resolves (import,require,module-sync,node,module,browser,style,default), and the first of them decides, for its components and its stylesheets alike, so a package whosesourceorexpo-sourcecondition points atsrc/before adefaultthat points at its build, such as@expo/uior one built with react-native-builder-bob, is not read either. Unlike in a workspace package, exports that point atdist/are not followed back tosrc/, and nothing compiled in the package is read (JavaScript, JSX or CSS indist/,build/,lib/,out/,esm/orcjs/, or an export that points at JavaScript anywhere, such as./index.jsor./es/index.mjs, whose re-exports are not followed), so a component kit named like a design system that publishessrc/next todist/for its source maps is not read as a second design system. With pnpm the package is read innode_modules/.pnpm, so the props its components take from their own dependencies resolve. A package whoseexportspoint at build output is still not read, andinspect --explainnow says why:its exports point at build output (node_modules/@acme/ui/dist/index.mjs), not at component sources, instead of calling every installed package compiled. An app whose own config leavescomponentsunset now picks up such a package too.#183
83a40a0- Zero config reads the foldersnpx shadcn addcopies other registries' code into as read-only design systems, next tocomponents/ui: for each registry in theregistriesofcomponents.json, the folder of that name under thecomponentsalias (@signoff-ui→components/signoff-ui,@ai-elements→components/ai-elements). Before, that code was checked as the app's own: in VoltAgent's chatbot starter, which the corpus now checks, 11 of the 14 findings ofcheck .were incomponents/ai-elements, and the nextshadcn addcould bring findings in registry files nobody edited, which failedcheckand the GitHub Action. Nowcheck, the Claude Code hook, the ESLint plugin and the Action skip those files, as they skipcomponents/ui;search_components,get_componentandlist_componentsfind their components, andget_componentsays which registry one was installed from and that changes to it belong upstream; and the app's code is checked against them, so<DiffReview tone="danger">or<Message.Header>is a finding, and so is an icon-only registry button without a name. None of them is suggested in place of a native element, and the helpers in a folder'slib/(signoff-ui'sImgand icons) are left out oflist_componentsandsearch_components.inspectnames the folders on itsdetectedline, andinspect --explainsays why each was read or not. A folder is not read when the app's components come from a workspace package imported through itsexports, and code a registry copies loose intocomponents/is still checked as the app's.initnames those folders on its "Found the design system" line instead of a note of its own.A config that lists such a folder in
components, asinitwrites it, reads it the same way: its components are no longer suggested for native elements (signoff-ui'sImgfor an<img>); map one inelementsto have it suggested. A folder thatcomponents.jsonnames in noregistriesentry is read as before.#174
005d204-check,check_ui, the hook and the ESLint plugin report more of the hardcoded styling agents write, so code that passed can get new findings:no-hardcoded-colorreports Tailwind'swhiteandblack(bg-white,text-black,border-white), which passed whilebg-[white],style={{ color: "white" }}andfill="white"were reported, sobg-white dark:bg-zinc-900had only its dark half fixed. They are fixed only to a token of exactly that color (bg-white→bg-backgroundin a stock shadcn/ui theme), and suggested without a fix otherwise. A theme that defines--color-whiteor--color-blackmakes them its tokens, which are not reported. White or black text, fill or stroke is a warning without a fix, since its token depends on the surface under it. A hardcoded background (bg-white,bg-zinc-900,bg-[[#111](https://github.com/dgesteves/onsystem/issues/111)]) under hardcoded text that keeps no fix (white or black,text-black/80, or a color such astext-neutral-800held back as another shade), on it, inside it or inherited from around it, is not fixed to a token unless the text still stands out from it in every mode, by 0.25 of lightness or 3:1 contrast as it did on the hardcoded color:bg-black text-whitewould becomebg-primary text-white, white on near white in dark mode, andbg-white text-neutral-800dark gray on near black. The message says to change the text with it (text-primary-foreground). Before,bg-zinc-900 text-whitewas fixed that way, and so was a palette background under palette text that keeps no fix. The text is not reported on a surface it stands out from in each mode it shows in: one its class list sets (shadcn/ui'sbg-destructive text-white), its component's variants set, itsstylesets (a color swatch), or the nearest element around it sets. With an opacity modifier (bg-black/50,border-white/10) white and black are left alone, as they are inside an SVG<mask>. A palette color written as its CSS variable (bg-[var(--color-green-50)]) is reported as the palette class.const(className={tone},cn("p-4", extra)), a key of aconstobject map (className={statusStyles[status]}), or what a function of the file returns (className={toneOf(status)}). A palette color in a status map passed as clean. A value from another file, a prop or aletis still not followed.icon-button-accessible-namechecks an icon-only link that a button renders throughasChild(<Button asChild size="icon"><Link href="/users/1/edit"><Pencil /></Link></Button>), which it skipped, and puts the label fix on the link.no-hardcoded-spacingandno-hardcoded-radiusno longer fix a length inem:px-[0.5em]grows with the font, and was fixed topx-2with the message that it "is 8px, which is on the spacing scale". The nearest step is suggested without a fix.Patch Changes
#182
64a92cb- The plugin's hook now checks edits in Codex. Codex installs the Claude Code plugin from the same marketplace and runs its hook onapply_patch, but the hook read onlytool_input.file_path, and Codex puts the patch intool_input.command, so every edit passed unchecked. The hook now reads the files a patch adds or updates from its*** Add File:,*** Update File:and*** Move to:lines, checks each.tsxor.jsxfile in one run per project, and holds an updated file to the lines its hunks change, as it holds an Edit. It also reads the file frompathorfilePath, as other clients' tools name it, when the tool's input carries the text it wrote. Codex runs a plugin's hooks once you trust them in/hooks.init, run in a terminal, offers to add a short section to the project'sAGENTS.md(create-next-app writes one) orCLAUDE.md: use the onsystem tools before writing UI, and runcheck_ui, ornpx -y onsystem check <file>without the tools, on every UI file changed. It sits betweenBEGIN:onsystem-agent-rulesandEND:onsystem-agent-rulescomment markers, which a later run updates in place. ACLAUDE.mdthat importsAGENTS.mdis left alone, and--yesnever writes it.#175
d1b19d1-excludeleaves out the same files everywhere. A folder in it (app/legacy,app/legacy/,./app/legacy,app\legacyor**/legacy) left out everything in it only forcheckin the project:check .at a monorepo root and the ESLint plugin matched it against each file's own path, so they still reported the folder's files, and a CI job at the root failed on code the team had excluded. Now all of them leave the folder out, andcheck .at the root reports whatcheck .in each project does. Patterns are read the same way everywhere, with*,**,?,{a,b},[abc]and\escapes: an unescaped Next.js route group (app/(marketing)/**) now matches that folder in a project too, and extglobs (app/@(old|legacy)/**), which onlycheckin a project read before, match nothing.The Claude Code hook no longer blocks Claude on a file that
excludecovers, tests and stories by default (*.test.tsx,*.stories.tsx) or a folder you list: it runs the newcheck --skip-excluded, which leaves such a file out even though it is named, and says so in the summary line. Without the flag, a file named outright is still checked whateverexcludesays. With a project's own install from before this release, which does not know the flag, the hook checks the file as before.check_uileaves out apathorfilenamethatexcludecovers, and says why inskipped; code without afilenameis still checked.#173
1817817-initin a shadcn/ui app now adds tocomponents, next tocomponents/ui, the foldersnpx shadcn addcopies other registries' code into: for each registry in theregistriesofcomponents.json, the folder of that name under thecomponentsalias (@signoff-ui→components/signoff-ui,@ai-elements→components/ai-elements). A folder with no.tsxor.jsxfile yet is added too, and so is one that does not exist yet: a registry is often named incomponents.jsonbefore its firstshadcn add, and an item of only.tsfiles, such as signoff-ui'sag-ui, makes the folder before a component lands in it.check, the Claude Code hook, the dry run and the baseline skip that code as they skipcomponents/ui, so the nextshadcn addno longer brings findings in registry files nobody edited, and the app's code is checked against every component those files export, helpers included.initnames each folder it added, with a link to how to leave the helpers out or check that code as your own. When it cannot add them (--componentsgiven, or animportPaththat names a package), it says thatcheckreads that code as the app's own, and names the glob that sets it apart: forcomponents, or, when the config imports its components by a package name, for anoverridesentry that turns the rules off. Code a registry puts loose incomponents/, as React Bits does, is still checked as the app's. Configs written before are not changed.