kosmesis
Changelog for kosmesis.
0.6.1
kosmesis initinstalls@morphos/icons@^2.0.3, the range the registry components are now type-checked against, together with@praxisjs/runtime0.8.1 (booleanaria-*attributes written as"true"/"false") and the latest Morphos releases.
0.6.0
kosmesis initcan run without prompts. Every question has a flag (--style-system,--icon-library,--css,--root-component,--overwrite,--erase/--no-erase,--force), and--yes(or--defaults) answers the rest with their default. In that mode nothing is erased or overwritten unless its flag says so, and a run that needs one of those answers stops with exit code 1 and names the flag. Flags you pass also skip their prompt in the interactive flow, which is otherwise unchanged.kosmesis init --helplists them.kosmesis initwires@tailwindcss/vite,praxisjsCSS()and the@alias into thevite.config.tscreate-praxisjs writes for Tauri v2 apps (defineConfig(({ mode }) => ...)withimport { defineConfig, loadEnv } from "vite"). Before, the plugin call was added without its import and the alias was skipped, so the build failed. When the file has no shape it can edit,initnow says to add the alias by hand.- With Tailwind, the stylesheet content
kosmesis initkeeps below the theme tokens now goes inside@layer base. Unlayered CSS beats every Tailwind layer, so a kept reset such as the create-praxisjs template's* { margin: 0; padding: 0 }stripped the padding and margins off every component. Content that is already written for Tailwind (@import,@theme,@plugin,@utility, ...) is kept as it was.
0.5.0
kosmesis initworks with@morphos/icons2.0.0, which movedLucideSourceto the@morphos/icons/lucidesubpath. The generated root component now importsIconProviderfrom@morphos/iconsandLucideSourcefrom@morphos/icons/lucide; before, a fresh project failed to type-check (Module "@morphos/icons" has no exported member "LucideSource"). Projects initialized with 0.4.0 can apply the same one-line import change by hand.kosmesis initinstalls@morphos/icons@^2.0.1andlucide@^1.27.0instead of whatever is latest, so a future major of either can't break the code it generates. A package already inpackage.jsonis left alone.kosmesis registry buildfails when a component imports a package it doesn't list independencies(or, for type-only imports,devDependencies), or a relative file that isn't its own or one of itsregistryDependencies, and lists every case. Only@praxisjs/core,@praxisjs/decorators,@praxisjs/jsxand@praxisjs/runtimemay be imported undeclared.kosmesis registry init's example now lists@praxisjs/sharedunderdevDependencies.- Registry fixes found by that check: every component that imports
@praxisjs/sharednow lists it underdevDependencies(with pnpm,kosmesis addused to leave 72 imports unresolved), Morphing Dialog lists@morphos/icons, the Tailwind Sidebar listsclass-variance-authority, and Command listsdialogas a registry dependency. - Components are versioned. Every registry item has a
version(every Kosmesis component starts at 1.0.0), andkosmesis addrecords it, with a hash of each file it wrote, in a newcomponents.lock.jsonnext tocomponents.json(commit it). - New
kosmesis outdatedlists installed components with the installed and latest version, and whether you edited them, including components from your own registries. - New
kosmesis update <component...>(or--all) shows the diff and asks before writing. A file you edited is never replaced silently: you choose to skip it (the default), overwrite it, or write the new version next to it as<name>.new.tsxto merge by hand. When not interactive (CI),updateonly writes with--yes, and never overwrites edited files. Files the registry didn't change keep your edits, and new registry or npm dependencies are installed. - Projects created before 0.5.0 are migrated on the first
outdatedorupdate: components found in theuifolder that match a registry component start being tracked, at the registry's version when the file is identical to it, otherwise with an unknown version and treated as possibly edited. Your own components are never tracked. kosmesis addasks before overwriting a file you edited or that it didn't install (default: no), and skips such files when not interactive.--overwritereplaces them anyway. Unedited files it installed are replaced as before.kosmesis registry buildchecks each item'sversionagainst a committedregistry-lock.json: it fails when an item's files or dependencies changed without a version bump, when a version goes down, or when a version isn't semver. Items without a version build with a warning and are served unversioned (shown asunknown, never as an update). Built items carry ahashper file, and each style system gets anindex.jsonlisting every item without content.kosmesis registry init's example starts at version 1.0.0.
0.4.0
kosmesis initnow prompts for an icon library (Lucide, backed by@morphos/icons' built-inLucideSourceprovider, orNone), stores the choice asiconLibraryincomponents.json, installs@morphos/icons/lucidewhen Lucide is selected, and wires@IconProvider(LucideSource)onto the project's root component — the same "ensure" pattern already used for@Themed(...).- Every registry component that previously rendered an emoji or a hand-picked Unicode glyph as a
pseudo-icon now renders a real
<Icon>from@morphos/iconsinstead, in both style systems.
0.3.2
kosmesis initnow wires thevirtual:praxisjs/styles.cssimport into@praxisjs/cssprojects: it addsimport "virtual:praxisjs/styles.css";to the entry file (src/main.tsx) after wiringpraxisjsCSS()intovite.config.ts, and declares the module insrc/vite-env.d.tsso TypeScript doesn't error on it. Previously this step was missing, so the CSS the Vite plugin extracts at build time never reached the production bundle.
0.3.1
- Bumped
tsdownto0.22.4, resolving a peer dependency mismatch withtypescript.
0.3.0
kosmesis initnow asks before touching pre-existing file content instead of silently keeping or discarding it:- If your global CSS file or
@praxisjs/csstheme module already has content, you're asked whether to erase it before Kosmesis adds its tokens. - For
@praxisjs/cssprojects, the create-praxisjs template's default stylesheet (a separate file from the theme module) gets the same treatment, since it's otherwise never touched. - For
@praxisjs/cssprojects,initalso asks for your root component's path and automatically wires@Themed(KosmesisTokens, LightTheme, { persist: true, syncTabs: true })above@Component()— previously this was left as a manual note.
- If your global CSS file or
0.2.0
- Added a named-registry system:
kosmesis registry add|remove|listmanages aregistriesmap incomponents.json, andkosmesis add @<namespace>/<component>resolves a component from its namespace's registry instead of the project default. - Added
kosmesis registry initandkosmesis registry buildto scaffold and build a custom registry — no more hand-writing aregistry.json-to-inlined-JSON build script. See Custom Registry. - Registry entries can now declare
devDependenciesalongsidedependencies—kosmesis addinstalls each group separately, withdevDependenciesgetting the package manager's-D/--save-devflag.
0.1.2
- Removed the unnecessary
baseUrlassignment fromensureTsconfigAlias. This avoids the deprecatedbaseUrlcompiler option, which is scheduled to stop working in TypeScript 7.0, while preserving the generated path alias configuration.
0.1.1
kosmesis initandkosmesis addnow install missing runtime dependencies automatically with the detected package manager. If the install fails, the CLI still prints the command to run manually.
0.1.0
Initial release.
kosmesis init— writescomponents.json, prompts once for a style system (Tailwind CSS or@praxisjs/css), wires theme tokens and the matching Vite plugin into the project, adds the@/*import alias, and (Tailwind only) writes thecn()helper.kosmesis add <component...>— resolves a component'sregistryDependenciesclosure in dependency-first order, writes every file intosrc/components/ui/, and reports any missing runtime dependencies.- A registry of 65 components ported from shadcn/ui, each shipped in two independent style
systems with an identical public prop API — Tailwind CSS +
class-variance-authority, and@praxisjs/css— built on Morphos instead of Radix UI.