{"_id":"@astryx-svelte/cli","_rev":"5-ad026d1c8aa3b5c038e42776347416d9","name":"@astryx-svelte/cli","dist-tags":{"latest":"0.5.2"},"versions":{"0.3.0":{"name":"@astryx-svelte/cli","version":"0.3.0","license":"MIT","_id":"@astryx-svelte/cli@0.3.0","maintainers":[{"name":"devrohit06","email":"technicalrohit06@gmail.com"}],"homepage":"https://github.com/devrohit06/astryx-svelte#readme","bugs":{"url":"https://github.com/devrohit06/astryx-svelte/issues"},"bin":{"astryx-svelte":"bin/astryx-svelte.mjs"},"dist":{"shasum":"2a7f04490bfdd8336ca76f7079f5ab30ce407ac7","tarball":"https://registry.npmjs.org/@astryx-svelte/cli/-/cli-0.3.0.tgz","fileCount":306,"integrity":"sha512-HMPAYygoZLgBWN1zEUHok6ovOi5g1QI9bmAuYVGVrx+nZqojurFoohAg0xwEMTvRd7YSPIiPOI9r2Bl00vCrFw==","signatures":[{"sig":"MEYCIQDz8Pdq6vT0dbW7riF4IxRFKwrWHxz4wfwLS8yu9h91lAIhAPwgTXGryzvNYmY2wMr2iBGhphT9FVm+6WihGFaiUE0N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2065503},"type":"module","_from":"file:astryx-svelte-cli-0.3.0.tgz","engines":{"node":">=22"},"exports":{".":"./bin/astryx-svelte.mjs","./api":{"import":"./api/index.mjs"},"./doc":{"types":"./authoring/doctypes/types.ts","import":"./authoring/doctypes/parse.mjs"},"./xle":{"types":"./foundation/xle/browser.d.ts","import":"./foundation/xle/browser.mjs"},"./json":{"types":"./api/json/index.ts","import":"./api/json/parse.mjs"},"./config":{"types":"./authoring/config/type.ts","import":"./authoring/config/parse.mjs"},"./codemod":{"types":"./authoring/codemod/type.ts","import":"./authoring/codemod/parse.mjs"},"./template":{"types":"./authoring/doctypes/types.ts","import":"./authoring/doctypes/template/parse.mjs"},"./authoring":{"types":"./authoring/index.d.ts","import":"./authoring/index.mjs"},"./integration":{"types":"./authoring/integration/type.ts","import":"./authoring/integration/parse.mjs"}},"scripts":{"lint":"prettier --check . && eslint .","test":"npm run test:unit -- --run && npm run test:core-src && npm run test:themes-bundle","check":"tsc --noEmit -p tsconfig.json","format":"prettier --write .","test:unit":"vitest","astryx-svelte":"node bin/astryx-svelte.mjs","test:core-src":"node scripts/assert-core-ships-src.mjs","generate-themes":"node scripts/generate-cli-themes.mjs","test:themes-bundle":"node scripts/generate-cli-themes.mjs --check"},"_npmUser":{"name":"devrohit06","email":"technicalrohit06@gmail.com"},"_resolved":"/tmp/a46c6ed9bc4d55f20af37a4648f2b30e/astryx-svelte-cli-0.3.0.tgz","_integrity":"sha512-HMPAYygoZLgBWN1zEUHok6ovOi5g1QI9bmAuYVGVrx+nZqojurFoohAg0xwEMTvRd7YSPIiPOI9r2Bl00vCrFw==","repository":{"url":"git+https://github.com/devrohit06/astryx-svelte.git","type":"git","directory":"packages/cli"},"_npmVersion":"10.9.8","description":"Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.","directories":{},"displayName":"CLI","_nodeVersion":"22.23.1","dependencies":{"zod":"^4.0.0","jiti":"^2.7.0","commander":"^14.0.0","zimmerframe":"^1.1.4","magic-string":"^0.30.21"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.4.1","svelte":"^5.56.1","vitest":"^4.1.10","globals":"^17.6.0","prettier":"^3.8.3","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22","@lucide/svelte":"^1.25.0","typescript-eslint":"^8.60.1","@astryx-svelte/core":"0.3.0","eslint-config-prettier":"^10.1.8","@fvilers/heroicons-svelte":"2.1.5-fix.3","@astryx-svelte/theme-neutral":"0.3.0"},"peerDependencies":{"svelte":"^5.0.0","@astryx-svelte/core":"*","@astryx-svelte/theme-neutral":"*"},"peerDependenciesMeta":{"svelte":{"optional":true},"@astryx-svelte/core":{"optional":true},"@astryx-svelte/theme-neutral":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/cli_0.3.0_1786380843494_0.9525236226655709","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@astryx-svelte/cli","version":"0.3.1","license":"MIT","_id":"@astryx-svelte/cli@0.3.1","maintainers":[{"name":"devrohit06","email":"technicalrohit06@gmail.com"}],"homepage":"https://github.com/devrohit06/astryx-svelte#readme","bugs":{"url":"https://github.com/devrohit06/astryx-svelte/issues"},"bin":{"astryx-svelte":"bin/astryx-svelte.mjs"},"dist":{"shasum":"98d96478b2dbf5dbe89dacb24118a88a0a143942","tarball":"https://registry.npmjs.org/@astryx-svelte/cli/-/cli-0.3.1.tgz","fileCount":306,"integrity":"sha512-C9C/j9kefpbTRhvilZ2zJ1nTS/9aJgF0W8xKjcN9/6MbEN0VyEF3cjiQ6z4DAtKzRrWjBfQ0sK5OmSksM3xXuQ==","signatures":[{"sig":"MEYCIQDZKfZYbJHJ0840RubG1+Tbph1c+YAdyI03scwzNWoZUQIhAIpER3D87JHzbp0hJnPOBxm2J+ui3S14AFQfYLbnSdMn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2071906},"type":"module","_from":"file:astryx-svelte-cli-0.3.1.tgz","engines":{"node":">=22"},"exports":{".":"./bin/astryx-svelte.mjs","./api":{"import":"./api/index.mjs"},"./doc":{"types":"./authoring/doctypes/types.ts","import":"./authoring/doctypes/parse.mjs"},"./xle":{"types":"./foundation/xle/browser.d.ts","import":"./foundation/xle/browser.mjs"},"./json":{"types":"./api/json/index.ts","import":"./api/json/parse.mjs"},"./config":{"types":"./authoring/config/type.ts","import":"./authoring/config/parse.mjs"},"./codemod":{"types":"./authoring/codemod/type.ts","import":"./authoring/codemod/parse.mjs"},"./template":{"types":"./authoring/doctypes/types.ts","import":"./authoring/doctypes/template/parse.mjs"},"./authoring":{"types":"./authoring/index.d.ts","import":"./authoring/index.mjs"},"./integration":{"types":"./authoring/integration/type.ts","import":"./authoring/integration/parse.mjs"}},"scripts":{"lint":"prettier --check . && eslint .","test":"npm run test:unit -- --run && npm run test:core-src && npm run test:themes-bundle","check":"tsc --noEmit -p tsconfig.json","format":"prettier --write .","test:unit":"vitest","astryx-svelte":"node bin/astryx-svelte.mjs","test:core-src":"node scripts/assert-core-ships-src.mjs","generate-themes":"node scripts/generate-cli-themes.mjs","test:themes-bundle":"node scripts/generate-cli-themes.mjs --check"},"_npmUser":{"name":"devrohit06","email":"technicalrohit06@gmail.com"},"_resolved":"/tmp/950ce154bbcd697403de921f78e1796a/astryx-svelte-cli-0.3.1.tgz","_integrity":"sha512-C9C/j9kefpbTRhvilZ2zJ1nTS/9aJgF0W8xKjcN9/6MbEN0VyEF3cjiQ6z4DAtKzRrWjBfQ0sK5OmSksM3xXuQ==","repository":{"url":"git+https://github.com/devrohit06/astryx-svelte.git","type":"git","directory":"packages/cli"},"_npmVersion":"10.9.8","description":"Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.","directories":{},"displayName":"CLI","_nodeVersion":"22.23.1","dependencies":{"zod":"^4.0.0","jiti":"^2.7.0","commander":"^14.0.0","zimmerframe":"^1.1.4","magic-string":"^0.30.21"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.4.1","svelte":"^5.56.1","vitest":"^4.1.10","globals":"^17.6.0","prettier":"^3.8.3","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22","@lucide/svelte":"^1.25.0","typescript-eslint":"^8.60.1","@astryx-svelte/core":"0.3.1","eslint-config-prettier":"^10.1.8","@fvilers/heroicons-svelte":"2.1.5-fix.3","@astryx-svelte/theme-neutral":"0.3.1"},"peerDependencies":{"svelte":"^5.0.0","@astryx-svelte/core":"*","@astryx-svelte/theme-neutral":"*"},"peerDependenciesMeta":{"svelte":{"optional":true},"@astryx-svelte/core":{"optional":true},"@astryx-svelte/theme-neutral":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/cli_0.3.1_1786402107757_0.44349806516738943","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@astryx-svelte/cli","version":"0.4.1","license":"MIT","_id":"@astryx-svelte/cli@0.4.1","maintainers":[{"name":"devrohit06","email":"technicalrohit06@gmail.com"}],"homepage":"https://github.com/devrohit06/astryx-svelte#readme","bugs":{"url":"https://github.com/devrohit06/astryx-svelte/issues"},"bin":{"astryx-svelte":"bin/astryx-svelte.mjs"},"dist":{"shasum":"496fe3c6c340001f8f93334066ed2f1bbe0e0164","tarball":"https://registry.npmjs.org/@astryx-svelte/cli/-/cli-0.4.1.tgz","fileCount":310,"integrity":"sha512-cgaLCk7aYY9U6tMOU5I8Ba6qAwMSQhccN8mLnJR42xQyisGFLcrkd4G8DzfhWAtEkb19LjdOO1ftEk5IjEeDgA==","signatures":[{"sig":"MEYCIQDRy7pYwC19h1LYn+foPiZi9cl9auPHDnNf/a9S2pF+4wIhAI3n+du6yQVKeNfS0nNjXtbTHxGmn1ICjuCf5jlEmkKv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2111418},"type":"module","_from":"file:astryx-svelte-cli-0.4.1.tgz","engines":{"node":">=22"},"exports":{".":"./bin/astryx-svelte.mjs","./api":{"import":"./api/index.mjs"},"./doc":{"types":"./authoring/doctypes/types.ts","import":"./authoring/doctypes/parse.mjs"},"./xle":{"types":"./foundation/xle/browser.d.ts","import":"./foundation/xle/browser.mjs"},"./json":{"types":"./api/json/index.ts","import":"./api/json/parse.mjs"},"./config":{"types":"./authoring/config/type.ts","import":"./authoring/config/parse.mjs"},"./codemod":{"types":"./authoring/codemod/type.ts","import":"./authoring/codemod/parse.mjs"},"./template":{"types":"./authoring/doctypes/types.ts","import":"./authoring/doctypes/template/parse.mjs"},"./authoring":{"types":"./authoring/index.d.ts","import":"./authoring/index.mjs"},"./integration":{"types":"./authoring/integration/type.ts","import":"./authoring/integration/parse.mjs"}},"scripts":{"lint":"prettier --check . && eslint .","test":"npm run test:unit -- --run && npm run test:core-src && npm run test:themes-bundle","check":"tsc --noEmit -p tsconfig.json","format":"prettier --write .","test:unit":"vitest","astryx-svelte":"node bin/astryx-svelte.mjs","test:core-src":"node scripts/assert-core-ships-src.mjs","generate-themes":"node scripts/generate-cli-themes.mjs","test:themes-bundle":"node scripts/generate-cli-themes.mjs --check"},"_npmUser":{"name":"devrohit06","email":"technicalrohit06@gmail.com"},"_resolved":"/tmp/376a84a0ccfe5970d90b0d93c509d15c/astryx-svelte-cli-0.4.1.tgz","_integrity":"sha512-cgaLCk7aYY9U6tMOU5I8Ba6qAwMSQhccN8mLnJR42xQyisGFLcrkd4G8DzfhWAtEkb19LjdOO1ftEk5IjEeDgA==","repository":{"url":"git+https://github.com/devrohit06/astryx-svelte.git","type":"git","directory":"packages/cli"},"_npmVersion":"10.9.8","description":"Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.","directories":{},"displayName":"CLI","_nodeVersion":"22.23.2","dependencies":{"zod":"^4.0.0","jiti":"^2.7.0","commander":"^14.0.0","zimmerframe":"^1.1.4","magic-string":"^0.30.21"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.4.1","svelte":"^5.56.1","vitest":"^4.1.10","globals":"^17.6.0","prettier":"^3.8.3","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22","@lucide/svelte":"^1.25.0","typescript-eslint":"^8.60.1","@astryx-svelte/core":"0.4.1","eslint-config-prettier":"^10.1.8","@fvilers/heroicons-svelte":"2.1.5-fix.3","@astryx-svelte/theme-neutral":"0.4.1"},"peerDependencies":{"svelte":"^5.0.0","@astryx-svelte/core":"*","@astryx-svelte/theme-neutral":"*"},"peerDependenciesMeta":{"svelte":{"optional":true},"@astryx-svelte/core":{"optional":true},"@astryx-svelte/theme-neutral":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/cli_0.4.1_1786871782769_0.8549707608604842","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@astryx-svelte/cli","version":"0.4.5","license":"MIT","_id":"@astryx-svelte/cli@0.4.5","maintainers":[{"name":"devrohit06","email":"technicalrohit06@gmail.com"}],"homepage":"https://github.com/devrohit06/astryx-svelte#readme","bugs":{"url":"https://github.com/devrohit06/astryx-svelte/issues"},"bin":{"astryx-svelte":"bin/astryx-svelte.mjs"},"dist":{"shasum":"0f197fce3e5c507c2cb84d83f12efcb189e5f05e","tarball":"https://registry.npmjs.org/@astryx-svelte/cli/-/cli-0.4.5.tgz","fileCount":314,"integrity":"sha512-1mynouP64aTmzk+53dAxFAzyg7lu4vWTZFckIP3tbwT17erh7D1NSJP+FhJWiaV6IiicTDyRxds4ryCmnzyYBA==","signatures":[{"sig":"MEYCIQCr07xvI1P12zd1tC0/Ie+YOHcwWeC31IPs6B9QEXMlFQIhAKTwUzwUaj/MteoT7mB3aDMJ40zvujz5FiyItGkhZshN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2147809},"type":"module","_from":"file:astryx-svelte-cli-0.4.5.tgz","engines":{"node":">=22"},"exports":{".":"./bin/astryx-svelte.mjs","./api":{"import":"./api/index.mjs"},"./doc":{"types":"./authoring/doctypes/types.ts","import":"./authoring/doctypes/parse.mjs"},"./xle":{"types":"./foundation/xle/browser.d.ts","import":"./foundation/xle/browser.mjs"},"./json":{"types":"./api/json/index.ts","import":"./api/json/parse.mjs"},"./config":{"types":"./authoring/config/type.ts","import":"./authoring/config/parse.mjs"},"./codemod":{"types":"./authoring/codemod/type.ts","import":"./authoring/codemod/parse.mjs"},"./template":{"types":"./authoring/doctypes/types.ts","import":"./authoring/doctypes/template/parse.mjs"},"./authoring":{"types":"./authoring/index.d.ts","import":"./authoring/index.mjs"},"./integration":{"types":"./authoring/integration/type.ts","import":"./authoring/integration/parse.mjs"}},"scripts":{"lint":"prettier --check . && eslint .","test":"npm run test:unit -- --run && npm run test:core-src && npm run test:themes-bundle","check":"tsc --noEmit -p tsconfig.json","format":"prettier --write .","test:unit":"vitest","astryx-svelte":"node bin/astryx-svelte.mjs","test:core-src":"node scripts/assert-core-ships-src.mjs","generate-themes":"node scripts/generate-cli-themes.mjs","test:themes-bundle":"node scripts/generate-cli-themes.mjs --check"},"_npmUser":{"name":"devrohit06","email":"technicalrohit06@gmail.com"},"_resolved":"/tmp/6ff45622fc87c5432692884930f0f15d/astryx-svelte-cli-0.4.5.tgz","_integrity":"sha512-1mynouP64aTmzk+53dAxFAzyg7lu4vWTZFckIP3tbwT17erh7D1NSJP+FhJWiaV6IiicTDyRxds4ryCmnzyYBA==","repository":{"url":"git+https://github.com/devrohit06/astryx-svelte.git","type":"git","directory":"packages/cli"},"_npmVersion":"10.9.8","description":"Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.","directories":{},"displayName":"CLI","_nodeVersion":"22.23.2","dependencies":{"zod":"^4.0.0","jiti":"^2.7.0","commander":"^14.0.0","zimmerframe":"^1.1.4","magic-string":"^0.30.21"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.4.1","svelte":"^5.56.1","vitest":"^4.1.10","globals":"^17.6.0","prettier":"^3.8.3","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22","@lucide/svelte":"^1.25.0","typescript-eslint":"^8.60.1","@astryx-svelte/core":"0.4.5","eslint-config-prettier":"^10.1.8","@fvilers/heroicons-svelte":"2.1.5-fix.3","@astryx-svelte/theme-neutral":"0.4.5"},"peerDependencies":{"svelte":"^5.0.0","@astryx-svelte/core":"*","@astryx-svelte/theme-neutral":"*"},"peerDependenciesMeta":{"svelte":{"optional":true},"@astryx-svelte/core":{"optional":true},"@astryx-svelte/theme-neutral":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/cli_0.4.5_1787264410617_0.6567794909014333","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@astryx-svelte/cli","displayName":"CLI","version":"0.5.2","description":"Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.","type":"module","license":"MIT","repository":{"type":"git","url":"git+https://github.com/devrohit06/astryx-svelte.git","directory":"packages/cli"},"bugs":{"url":"https://github.com/devrohit06/astryx-svelte/issues"},"homepage":"https://github.com/devrohit06/astryx-svelte#readme","publishConfig":{"access":"public"},"bin":{"astryx-svelte":"bin/astryx-svelte.mjs"},"exports":{".":"./bin/astryx-svelte.mjs","./json":{"types":"./api/json/index.ts","import":"./api/json/parse.mjs"},"./api":{"import":"./api/index.mjs"},"./authoring":{"types":"./authoring/index.d.ts","import":"./authoring/index.mjs"},"./config":{"types":"./authoring/config/type.ts","import":"./authoring/config/parse.mjs"},"./integration":{"types":"./authoring/integration/type.ts","import":"./authoring/integration/parse.mjs"},"./doc":{"types":"./authoring/doctypes/types.ts","import":"./authoring/doctypes/parse.mjs"},"./template":{"types":"./authoring/doctypes/types.ts","import":"./authoring/doctypes/template/parse.mjs"},"./codemod":{"types":"./authoring/codemod/type.ts","import":"./authoring/codemod/parse.mjs"},"./xle":{"types":"./foundation/xle/browser.d.ts","import":"./foundation/xle/browser.mjs"}},"engines":{"node":">=22"},"dependencies":{"commander":"^14.0.0","jiti":"^2.7.0","magic-string":"^0.30.21","zimmerframe":"^1.1.4","zod":"^4.0.0"},"peerDependencies":{"@astryx-svelte/core":"*","@astryx-svelte/theme-neutral":"*","svelte":"^5.0.0"},"peerDependenciesMeta":{"@astryx-svelte/core":{"optional":true},"@astryx-svelte/theme-neutral":{"optional":true},"svelte":{"optional":true}},"devDependencies":{"@eslint/js":"^10.0.1","@fvilers/heroicons-svelte":"2.1.5-fix.3","@lucide/svelte":"^1.25.0","@types/node":"^22","eslint":"^10.4.1","eslint-config-prettier":"^10.1.8","globals":"^17.6.0","prettier":"^3.8.3","svelte":"^5.56.1","typescript":"^6.0.3","typescript-eslint":"^8.60.1","vitest":"^4.1.10","@astryx-svelte/core":"0.5.2","@astryx-svelte/theme-neutral":"0.5.2"},"scripts":{"astryx-svelte":"node bin/astryx-svelte.mjs","check":"tsc --noEmit -p tsconfig.json","lint":"prettier --check . && eslint .","format":"prettier --write .","test:unit":"vitest","test:core-src":"node scripts/assert-core-ships-src.mjs","generate-themes":"node scripts/generate-cli-themes.mjs","test:themes-bundle":"node scripts/generate-cli-themes.mjs --check","test":"npm run test:unit -- --run && npm run test:core-src && npm run test:themes-bundle"},"_id":"@astryx-svelte/cli@0.5.2","_integrity":"sha512-vDS9Wx1GH/n1n4oeWcXmLeNpFNUNTi0UmIanRA4JWEhyFFB7adzpIL42R5jpwmvuCsQ0S6+X8IfwJA/fZXYksw==","_resolved":"/tmp/0f2e5794975fefa72084fcac6a145275/astryx-svelte-cli-0.5.2.tgz","_from":"file:astryx-svelte-cli-0.5.2.tgz","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-vDS9Wx1GH/n1n4oeWcXmLeNpFNUNTi0UmIanRA4JWEhyFFB7adzpIL42R5jpwmvuCsQ0S6+X8IfwJA/fZXYksw==","shasum":"0b34b38cc8c39813baecdbdf7eb4203ee9aa2c9f","tarball":"https://registry.npmjs.org/@astryx-svelte/cli/-/cli-0.5.2.tgz","fileCount":314,"unpackedSize":2148310,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAmdbMAbFNCSFAH0RjIizBE6LSjwGHgXazVEkVEcLauKAiAPYwcFDCn7HBR9RSpcRY90ljCdE9xqnPD+NfmXsCLF5Q=="}]},"_npmUser":{"name":"devrohit06","email":"technicalrohit06@gmail.com"},"directories":{},"maintainers":[{"name":"devrohit06","email":"technicalrohit06@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cli_0.5.2_1788304800814_0.6391483512305305"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-10T16:54:03.341Z","modified":"2026-09-01T23:20:01.239Z","0.3.0":"2026-08-10T16:54:03.670Z","0.3.1":"2026-08-10T22:48:27.939Z","0.4.1":"2026-08-16T09:16:22.957Z","0.4.5":"2026-08-20T22:20:10.832Z","0.5.2":"2026-09-01T23:20:01.011Z"},"bugs":{"url":"https://github.com/devrohit06/astryx-svelte/issues"},"license":"MIT","homepage":"https://github.com/devrohit06/astryx-svelte#readme","repository":{"type":"git","url":"git+https://github.com/devrohit06/astryx-svelte.git","directory":"packages/cli"},"description":"Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.","maintainers":[{"name":"devrohit06","email":"technicalrohit06@gmail.com"}],"readme":"<!--\n\tAbsolute, and pinned to a commit rather than to a relative path: this file is\n\tpublished to npm, where a repo-relative `src` has nothing to resolve against.\n\tThe target is the same SVG the docs site imports as its favicon.\n-->\n\n<img\n\tsrc=\"https://raw.githubusercontent.com/DevRohit06/astryx-svelte/37d3aebd2335e38015274448b541c3b2a746a710/docs/src/lib/assets/favicon.svg\"\n\talt=\"\"\n\twidth=\"64\"\n\theight=\"64\"\n/>\n\n# @astryx-svelte/cli\n\nThe CLI is the primary interface for working with the design system, for humans and machines alike.\nIt provides component documentation, design tokens, reference topics, theming tools, page templates\nand upgrade codemods, all reachable as terminal commands, as a typed JSON API, or as programmatic\nimports. AI agents and build tools use the same API that powers the CLI, so an agent can run an\nend-to-end frontend loop without scraping `--help`.\n\n```bash\nnpm install -D @astryx-svelte/cli\n```\n\nEverything below is written as `pnpm exec astryx-svelte …`, which is the form that works once the\npackage is a dependency of your project, and is what the CLI itself prints in its follow-up\ncommands. From a clone of [the repository](https://github.com/devrohit06/astryx-svelte), the\nequivalent is `node packages/cli/bin/astryx-svelte.mjs …`.\n\nThe binary is `astryx-svelte`, not `astryx`. Astryx's own CLI publishes `astryx`, and bare `astryx`\non npm is an unrelated package; a distinct name means both can be installed in the same project.\n\nEverything the CLI prints is also on [the documentation site](https://astryx-svelte.rohitk06.in/) —\nboth read the same `.doc.mjs` modules, so the two cannot drift.\n\n## Finding things: `astryx-svelte search`\n\nWhen you do not know whether what you need is a component, a util, a docs topic or a template,\nsearch across all of them at once. Results are ranked by relevance — name and keyword matches\noutrank incidental prose mentions, with fuzzy matching for typos — and each carries the follow-up\ncommand to run:\n\n```text\n$ pnpm exec astryx-svelte search button\n\nResults for \"button\" (20)\n\nname:        Button\ndomain:      component\nimport:      @astryx-svelte/core\ndescription: Button triggers an action when clicked. Use it for form submissions, …\ncommand:     pnpm exec astryx-svelte component Button\n\nname:        IconButton\ndomain:      component\nimport:      @astryx-svelte/core\ndescription: A button that shows only an icon with no visible text. …\ncommand:     pnpm exec astryx-svelte component IconButton\n\nname:        useClickableContainer\ndomain:      hook\nimport:      @astryx-svelte/core/hooks\ndescription: Makes a container element clickable while preserving nested interactive …\ncommand:     pnpm exec astryx-svelte util useClickableContainer\n```\n\nOptions:\n\n- `--type <component|hook|doc|template>` — restrict to a single domain\n- `--limit <n>` — cap the number of results (default 20)\n- `--detail` — include the import path and the match reason/score\n- `--json` — typed `{ type: 'search', data: { query, results } }` envelope\n\n## Commands\n\n| Command                | Description                                                                          |\n| ---------------------- | ------------------------------------------------------------------------------------ |\n| `init`                 | Initialize the design system in your project: theming, agent docs, template pointers |\n| `component`            | List components or print docs, props, usage examples, and source                     |\n| `util` (alias `hook`)  | List the runes-based composables and print their docs                                |\n| `search`               | Find components, utils, docs and templates in one ranked, cross-domain result set    |\n| `docs`                 | Print reference documentation (tokens, theme, color, typography, spacing, …)         |\n| `template` (as `add`)  | Inject a page or block template into your project                                    |\n| `build`                | A composition kit for a page idea, or the page-building playbook with no arguments   |\n| `layout`               | Expand, check, and explain compressed layout expressions (XLE/XLO)                   |\n| `swizzle`              | Copy component source into your project for deep customization                       |\n| `theme`                | `theme list`, `theme add`, and `theme build` — scaffold and compile themes           |\n| `upgrade`              | Run codemods to migrate between versions                                             |\n| `discover`             | Discover external packages and the components they contribute                        |\n| `validate-integration` | Validate an integration package's manifest and contributions                         |\n| `doctor`               | Diagnose your setup and report problems with fixes (CI-friendly via exit code)       |\n\n`manifest` is a fifteenth command, described under\n[Capability manifest](#capability-manifest-agent-discovery).\n\nAstryx also ships a `blog` command, which reads its published RSS feed. It is not ported — this\nproject has no feed to read.\n\n### Global options\n\nThese flags work with any command:\n\n- `--json` — output a typed JSON envelope: `{ apiVersion, type, data }` (errors:\n  `{ apiVersion, error, code, suggestions? }`)\n- `--detail <level>` — detail level for list views, increasing in size: `brief` (names only,\n  default for `--list`) < `compact` (names + one-line descriptions) < `full` (full docs per entry).\n  Single-item views default to `full`\n- `--zh` — output docs in Chinese Simplified\n- `--dense` — compressed format (token-efficient, useful for AI agents)\n- `--lang <locale>` — language/format shorthand (`en`, `zh`, `dense`)\n\n`--zh` and `--dense` read the `.doc.zh.mjs` / `.doc.dense.mjs` overlays a doc ships. Where an\noverlay is absent the English doc is returned unchanged.\n\n## JSON API\n\nEvery command supports `--json` for machine-readable output. Responses are typed envelopes:\n\n```json\n{ \"apiVersion\": 1, \"type\": \"component.detail\", \"data\": { \"name\": \"Button\" } }\n```\n\nErrors:\n\n```json\n{\n\t\"apiVersion\": 1,\n\t\"error\": \"No component named \\\"Buttn\\\"\",\n\t\"code\": \"ERR_UNKNOWN_COMPONENT\",\n\t\"suggestions\": [{ \"name\": \"Button\", \"reason\": \"similar name (distance 1)\" }]\n}\n```\n\nThe `code` field is a **stable, machine-readable identifier**. Branch on it, never on the\nhuman-readable `error` string, which changes freely as the wording improves. Every error envelope\ncarries a `code`, falling back to `ERR_UNKNOWN` when no more specific code applies. The same `code`\nis exposed on thrown `AstryxError` instances from the programmatic API, so both surfaces agree.\n\nCodes are **append-only**: once shipped, a code's meaning never changes and a code is never removed.\nNew error conditions get new codes.\n\n```typescript\nimport { isError } from '@astryx-svelte/cli/json';\n\nconst result = parseResponse(raw);\nif (isError(result)) {\n\tswitch (result.code) {\n\t\tcase 'ERR_UNKNOWN_COMPONENT':\n\t\t\t// suggest the closest match\n\t\t\tbreak;\n\t\tcase 'ERR_CORE_NOT_FOUND':\n\t\t\t// prompt the user to install @astryx-svelte/core\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.error(result.error);\n\t}\n}\n```\n\n### Error codes\n\nThe list is transcribed from Astryx's own, in its order and with its groupings — an agent written\nagainst Astryx branches on the same strings here. Codes for commands this port has not landed are\npresent and unused, exactly as an append-only list requires.\n\n| Code                      | Meaning                                                                                |\n| ------------------------- | -------------------------------------------------------------------------------------- |\n| `ERR_UNKNOWN`             | Generic fallback for any error without a more specific code.                           |\n| `ERR_UNKNOWN_COMMAND`     | A top-level command name was not recognized (e.g. `astryx-svelte bogus`).              |\n| `ERR_UNKNOWN_SUBCOMMAND`  | A subcommand under a group was not recognized (e.g. `astryx-svelte theme bogus`).      |\n| `ERR_INVALID_OPTION`      | An unknown flag was passed, or `--json` was used on a command that doesn't support it. |\n| `ERR_INVALID_ARGUMENT`    | An option/argument value was rejected, or required flags were missing.                 |\n| `ERR_MISSING_ARGUMENT`    | A required positional argument was omitted (e.g. `theme build` with no file).          |\n| `ERR_INVALID_LANG`        | `--lang` was given a value outside its choices (`en`, `zh`, `dense`).                  |\n| `ERR_INVALID_DETAIL`      | `--detail` was given a value outside its choices (`full`, `compact`, `brief`).         |\n| `ERR_NODE_VERSION`        | The running Node.js version is below the supported minimum.                            |\n| `ERR_CORE_NOT_FOUND`      | `@astryx-svelte/core` could not be located (not installed / not in a monorepo).        |\n| `ERR_UNKNOWN_COMPONENT`   | No component matched the requested name.                                               |\n| `ERR_UNKNOWN_HOOK`        | No util matched the requested name.                                                    |\n| `ERR_UNKNOWN_TOPIC`       | No docs topic matched the requested name.                                              |\n| `ERR_UNKNOWN_SECTION`     | A docs topic exists but the requested section within it does not.                      |\n| `ERR_UNKNOWN_CATEGORY`    | A `--category` filter value did not match any known category.                          |\n| `ERR_UNKNOWN_TEMPLATE`    | No template matched the requested name.                                                |\n| `ERR_AMBIGUOUS_TEMPLATE`  | A template id matched more than one template (narrow with `--type`/`--package`).       |\n| `ERR_AMBIGUOUS_COMPONENT` | A component name is owned by more than one package (narrow with `--package`).          |\n| `ERR_UNKNOWN_THEME`       | No theme matched the requested slug (`theme add`).                                     |\n| `ERR_UNKNOWN_PACKAGE`     | No package matched the requested name (`discover`).                                    |\n| `ERR_UNKNOWN_AGENT`       | An unrecognized `--agent` value was passed (agent docs / `init`).                      |\n| `ERR_UNKNOWN_FEATURE`     | An unrecognized `--features` value was passed to `init`.                               |\n| `ERR_UNKNOWN_CODEMOD`     | A `--codemod` value did not match any registered codemod (`upgrade`).                  |\n| `ERR_CODEMOD_FAILED`      | One or more codemods failed during an upgrade run.                                     |\n| `ERR_NOT_FOUND`           | A discover/lookup query matched nothing in any package.                                |\n| `ERR_NO_DOC`              | A component exists but has no typed `.doc.mjs` file.                                   |\n| `ERR_NO_SHOWCASE`         | No showcase exists for the requested component.                                        |\n| `ERR_NO_SOURCE`           | No source file could be located for the component/template.                            |\n| `ERR_INVALID_DOC`         | A component's docs failed validation (malformed `.doc.mjs`).                           |\n| `ERR_FILE_NOT_FOUND`      | A required input file did not exist.                                                   |\n| `ERR_FILE_EXISTS`         | Refused to overwrite an existing file in non-interactive mode.                         |\n| `ERR_PATH_TRAVERSAL`      | A path escaped its allowed root, or a name contained traversal markers.                |\n| `ERR_WRITE_FAILED`        | Writing output files failed (and was rolled back).                                     |\n| `ERR_THEME_INVALID`       | A theme definition was missing a required property (e.g. `name`).                      |\n| `ERR_THEME_LOAD`          | A theme file could not be loaded / parsed into a `defineTheme` result.                 |\n| `ERR_VERSION_DETECT`      | The current `@astryx-svelte/core` version could not be detected.                       |\n| `ERR_INVALID_VERSION`     | A `--from`/`--to` value was not a valid semver string.                                 |\n| `ERR_DEP_MISSING`         | A required external dependency is missing.                                             |\n| `ERR_GH_CLI`              | GitHub CLI (`gh`) is not installed or not authenticated.                               |\n| `ERR_UNKNOWN_POST`        | No blog post matched the requested slug in the feed.                                   |\n| `ERR_FETCH_FAILED`        | A network fetch (RSS feed or post text) failed.                                        |\n| `ERR_LAYOUT_PARSE`        | A layout expression could not be parsed.                                               |\n| `ERR_LAYOUT_INVALID`      | A layout expression parsed but is not valid.                                           |\n\n## Capability manifest (agent discovery)\n\nAgents do not have to scrape `--help` to learn the CLI. A single call returns a **self-describing\nmanifest**: every command, its arguments, its flags (with types, choices and defaults), whether it\nsupports `--json`, and the response `type` discriminators it can emit. Think of it as an OpenAPI\nspec for the CLI.\n\n```bash\npnpm exec astryx-svelte manifest --json    # dedicated surface — type: \"manifest\"\npnpm exec astryx-svelte --json             # bare invocation — same payload under data.manifest\n```\n\nShape:\n\n```jsonc\n{\n\t\"apiVersion\": 1,\n\t\"type\": \"manifest\",\n\t\"data\": {\n\t\t\"name\": \"astryx-svelte\",\n\t\t\"version\": \"0.0.0\",\n\t\t\"description\": \"Design system CLI — components, themes, and tooling\",\n\t\t\"globalOptions\": [\n\t\t\t{ \"flag\": \"--json\", \"type\": \"boolean\", \"description\": \"Output as typed JSON…\" },\n\t\t\t{ \"flag\": \"--lang <locale>\", \"type\": \"enum\", \"choices\": [\"en\", \"zh\", \"dense\"] },\n\t\t\t{\n\t\t\t\t\"flag\": \"--detail <level>\",\n\t\t\t\t\"type\": \"enum\",\n\t\t\t\t\"choices\": [\"full\", \"compact\", \"brief\"],\n\t\t\t\t\"default\": \"full\"\n\t\t\t}\n\t\t],\n\t\t\"commands\": [\n\t\t\t{\n\t\t\t\t\"name\": \"component\",\n\t\t\t\t\"description\": \"List components or print component docs\",\n\t\t\t\t\"arguments\": [{ \"name\": \"name\", \"required\": false, \"variadic\": false }],\n\t\t\t\t\"options\": [\n\t\t\t\t\t{ \"flag\": \"--props\", \"type\": \"boolean\", \"description\": \"Print only the props table\" }\n\t\t\t\t],\n\t\t\t\t\"json\": true,\n\t\t\t\t\"responseTypes\": [\"component.list\", \"component.detail\", \"component.detail.props\", \"…\"],\n\t\t\t\t\"examples\": [\"astryx-svelte component Button --props --json\"]\n\t\t\t}\n\t\t\t// …one entry per command; subcommands (e.g. `theme build`) nest under `subcommands`\n\t\t],\n\t\t\"jsonSupported\": [\"component\", \"docs\", \"…\"],\n\t\t\"responseTypes\": { \"component\": [\"component.list\", \"…\"], \"theme build\": [\"theme.build\"] }\n\t}\n}\n```\n\nThe manifest is **derived from Commander metadata** (commands, arguments, options) so it cannot\ndrift from the real command definitions. The two facts Commander does not track — `--json` support\nand emitted response types — are layered on from a `JSON_SUPPORTED` allowlist and a declarative\n`RESPONSE_TYPES` map, guarded by a drift test that fails **in both directions**: a registered\ncommand missing from the tables fails, and a table entry naming a command that does not exist fails\ntoo.\n\n**Backwards-compatible:** the bare `astryx-svelte --json` envelope keeps `type: \"help\"` and its\noriginal shallow fields (`name`, `version`, `commands` as a `string[]` of names, `jsonSupported`);\nthe structured manifest is additive under `data.manifest`. For the standalone envelope\n(`type: \"manifest\"`), use `astryx-svelte manifest --json`.\n\n## Programmatic API\n\nThe same logic that powers `astryx-svelte --json` is available as importable functions:\n\n```typescript\nimport {\n\tcomponent,\n\tdocs,\n\tdiscover,\n\ttemplate,\n\tutil,\n\tsearch,\n\tAstryxError\n} from '@astryx-svelte/cli/api';\n\n// Same result as: astryx-svelte --json component Button\nconst btn = await component('Button');\nbtn.type; // 'component.detail'\nbtn.data.name; // 'Button' (typed as ComponentDoc)\n\n// Same result as: astryx-svelte --json component --list\nconst list = await component(undefined, { list: true });\n\n// Same result as: astryx-svelte --json docs principles\nconst principles = await docs('principles');\nprinciples.data.title; // 'Principles'\n\n// Same result as: astryx-svelte --json util useMediaQuery\nconst useMediaQuery = await util('useMediaQuery');\nuseMediaQuery.data.params; // typed as HookParamDoc[]\n\n// Errors throw AstryxError with a stable .code and optional .suggestions\ntry {\n\tawait component('Buttn');\n} catch (e) {\n\te.message; // 'No component named \"Buttn\"'\n\te.code; // 'ERR_UNKNOWN_COMPONENT' (stable; branch on this)\n\te.suggestions; // [{ name: 'Button', reason: 'similar name (distance 1)' }]\n}\n```\n\nThe command handlers are thin wrappers around these functions: they parse args, call the API, then\nformat the output. That is what guarantees `@astryx-svelte/cli/api` and `astryx-svelte --json`\nalways return identical data.\n\nAstryx names the composables surface `hook`; this port names it `util`, because a Svelte composable\nis not a React hook. `hook` remains as a command alias so a command written against Astryx keeps\nworking, but the API function and the response types are `util.*`.\n\n### Consumer utilities\n\nIf you spawn the CLI as a subprocess rather than importing the API:\n\n```typescript\nimport { parseResponse, isError } from '@astryx-svelte/cli/json';\nimport type {\n\tComponentDetailResponse,\n\tComponentListResponse,\n\tDocsListResponse\n\t// …import the response types for the commands you consume\n} from '@astryx-svelte/cli/json';\n\n// parseResponse returns the structural { apiVersion, type, data } envelope; `data`\n// is `unknown` until you narrow it. Reconstruct the union you care about from the\n// per-command response types, then narrow on `type`:\ntype MyResponse = ComponentDetailResponse | ComponentListResponse | DocsListResponse;\n\nconst result = parseResponse(stdout);\nif (isError(result)) {\n\tconsole.error(result.error);\n} else {\n\tconst r = result as MyResponse;\n\tswitch (r.type) {\n\t\tcase 'component.detail':\n\t\t\tr.data.name; // narrowed to ComponentDoc\n\t\t\tbreak;\n\t}\n}\n```\n\nPrefer narrowing at the call site? Wrap `assertResponse`, which throws on error or type mismatch:\n\n```typescript\nimport { assertResponse } from '@astryx-svelte/cli/json';\nimport type { ComponentDetailResponse } from '@astryx-svelte/cli/json';\n\ntype MyResponse = ComponentDetailResponse; /* | …others */\n\nfunction assertTyped<T extends MyResponse['type']>(raw: unknown, type: T) {\n\treturn assertResponse(raw, type) as Extract<MyResponse, { type: T }>;\n}\n\nconst detail = assertTyped(stdout, 'component.detail');\ndetail.data.name; // narrowed\n```\n\n### Type discriminators\n\nEvery response carries a `type` string that identifies it:\n\n| Command                                              | Type                                    |\n| ---------------------------------------------------- | --------------------------------------- |\n| `component [--list] [--detail brief\\|compact\\|full]` | `component.list` (see `data.detail`)    |\n| `component <name>`                                   | `component.detail`                      |\n| `component <name> --props`                           | `component.detail.props`                |\n| `component <name> --source`                          | `component.detail.source`               |\n| `component <name> --showcase`                        | `component.detail.showcase`             |\n| `component <name> --blocks`                          | `component.detail.blocks`               |\n| `util [--list]`                                      | `util.list`                             |\n| `util <name>`                                        | `util.detail`                           |\n| `util <name> --params`                               | `util.detail.params`                    |\n| `docs`                                               | `docs.list`                             |\n| `docs <topic>`                                       | `docs.detail`                           |\n| `docs <topic> <section>`                             | `docs.detail.section`                   |\n| `search <query>`                                     | `search`                                |\n| `template [--list]`                                  | `template.list`                         |\n| `template <name>`                                    | `template.show`                         |\n| `template <name> --skeleton`                         | `template.skeleton`                     |\n| `template <name> [path]`                             | `template.copy`                         |\n| `build`                                              | `build.help`, `build.kit`               |\n| `layout expand` / `check` / `grammar`                | `layout.expand` / `.check` / `.grammar` |\n| `swizzle [--list]`                                   | `swizzle.list`                          |\n| `swizzle <component>`                                | `swizzle.copy`                          |\n| `theme list`                                         | `theme.list`                            |\n| `theme add [slug]`                                   | `theme.list`, `theme.add`               |\n| `theme build <file>`                                 | `theme.build`, `theme.build.check`      |\n| `upgrade --list`                                     | `upgrade.list`                          |\n| `upgrade [--apply]`                                  | `upgrade.status`, `upgrade.run`         |\n| `discover`                                           | `discover.list`                         |\n| `discover @scope/name`                               | `discover.detail`                       |\n| `discover @scope/name/Comp`                          | `discover.detail.doc`                   |\n| `discover <search>`                                  | `discover.search`                       |\n| `validate-integration <package>`                     | `integration.validate`                  |\n| `doctor`                                             | `doctor`                                |\n| `manifest`                                           | `manifest`                              |\n\n## Doctor\n\n`astryx-svelte doctor` runs health checks against your project and environment and reports each as\n`ok` / `warn` / `fail` / `info`, with an actionable fix for anything that is not passing. It is\nread-only: it never installs or mutates anything, so it is safe to run anywhere, including CI.\n\n```text\n$ pnpm exec astryx-svelte doctor\nastryx-svelte doctor - diagnosing your setup\n\nstatus:  [ok]\ncheck:   Node.js version\nmessage: Node v22.13.0 meets the minimum (>=22.13.0).\n\nstatus:  [ok]\ncheck:   @astryx-svelte/core installed\nmessage: @astryx-svelte/core resolved (v0.0.0).\n\nstatus:  [warn]\ncheck:   Theme packages\nmessage: No @astryx-svelte/theme-* packages are installed.\nfix:     Install a theme, e.g. `npm install @astryx-svelte/theme-neutral`, then import its CSS.\n\nSummary: 3 passed, 3 warnings, 0 failures, 2 info\n```\n\n### Checks\n\n| Check                      | Status it can return | What it verifies                                                      |\n| -------------------------- | -------------------- | --------------------------------------------------------------------- |\n| Node.js version            | ok / fail            | Running Node meets the CLI's minimum                                  |\n| `@astryx-svelte/core`      | ok / fail            | Core is resolvable from the project                                   |\n| Version alignment          | ok / warn / info     | Installed core is in step with the CLI                                |\n| Theme packages             | ok / warn            | An `@astryx-svelte/theme-*` package is installed and a theme is wired |\n| `astryx-svelte.config.mjs` | ok / fail / info     | Config (if present) loads cleanly with a valid shape                  |\n| AI agent docs              | ok / warn / info     | Agent docs exist and contain the Astryx section markers               |\n| Peer dependencies          | ok / warn / info     | Core's peer dependency (`svelte`) is installed                        |\n| Package manager            | info                 | Reports the detected package manager                                  |\n\n### CI gate\n\nThe exit code is the contract: `doctor` exits `0` when there are no failures (warnings are fine) and\n`1` when any check fails, so it is usable directly as a CI step. Use `--json` for a structured\n`{ apiVersion, type: \"doctor\", data: { checks, summary } }` envelope.\n\n## Configuration\n\nThe CLI reads an optional `astryx-svelte.config.{ts,mjs,js}` from your project root, a sibling of\n`package.json`. Every field is optional; with no config file the CLI runs on defaults.\n\n```typescript\nexport default {\n\tintegrations: ['@acme/astryx-widgets'],\n\tissuesUrl: 'https://github.com/your-org/your-repo/issues'\n};\n```\n\nThere is no factory: write a plain object. For editor autocomplete and type-checking, annotate it\nwith the `AstryxConfig` type exported from `@astryx-svelte/cli/authoring`.\n\n| Field                         | Type                           | Purpose                                                                                         |\n| ----------------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------- |\n| `integrations`                | `string[]`                     | Integration package names to load (see [Integrations](#integrations)).                          |\n| `issuesUrl`                   | `string`                       | Where \"report an issue\" links point for your project.                                           |\n| `hooks.postCodemod`           | `PostCodemodHook[]`            | Commands to run after `upgrade` applies codemods (reinstall, rebuild, reformat).                |\n| `experimental.xle.components` | `Record<string, XleComponent>` | Register app-local components so layout (XLE) expressions can reference them by name. Unstable. |\n\nThe config is validated against a strict schema when the CLI loads it, so an unknown field is a hard\nerror rather than a silent no-op. `doctor` reports whether the config loads cleanly.\n\n## Integrations\n\nAn **integration** is any npm package that contributes its own components, templates and upgrade\ncodemods. The CLI surfaces them next to core's, through the same commands, so a consumer can run\n`component`, `template` and `upgrade` across core and every integration uniformly. Use it to ship a\nfirst-party add-on, publish a third-party component library, or share an internal design-system\npackage across apps.\n\nThe system runs on two files, each with a small typed API:\n\n| File                                    | Written by | Role                                      |\n| --------------------------------------- | ---------- | ----------------------------------------- |\n| `astryx-svelte.config.{ts,mjs,js}`      | Consumer   | Lists which integration packages to load. |\n| `astryx-svelte.integration.{ts,mjs,js}` | Author     | Declares what a package contributes.      |\n\n### The integration manifest\n\nA package becomes an integration by exporting a manifest from\n`astryx-svelte.integration.{ts,mjs,js}` at its root, a sibling of `package.json`. The manifest points\nat where each kind of contribution lives; identity (name, version) comes from `package.json`.\n\n```typescript\nexport default {\n\tcomponents: './components',\n\ttemplates: './templates',\n\tcodemods: './codemods',\n\tissuesUrl: 'https://github.com/acme/widgets/issues'\n};\n```\n\n| Field        | Type     | Purpose                                                               |\n| ------------ | -------- | --------------------------------------------------------------------- |\n| `components` | `string` | Directory holding the package's components and their `.doc.*` files.  |\n| `templates`  | `string` | Directory holding the package's page/block templates.                 |\n| `codemods`   | `string` | Directory holding upgrade codemods run by `upgrade`.                  |\n| `issuesUrl`  | `string` | Where \"report an issue\" links for this package's contributions point. |\n\nEvery field is optional; declare only the roots the package ships. There is no factory: write a\nplain object and annotate it with the `AstryxIntegration` type from\n`@astryx-svelte/cli/authoring`.\n\n### How it works\n\nEvery command loads the consumer's config, resolves each listed integration's manifest from\n`node_modules`, and discovers its contributions. Everything is validated against one strict schema\nat the load boundary, so core and integration contributions reach a single uniform surface.\n\nDiscovery is resilient: a broken or misconfigured integration is skipped with a one-line warning on\nstderr instead of crashing the CLI, and it never corrupts a `--json` envelope. To inspect problems,\nrun `astryx-svelte validate-integration <package>` for a detailed report on one package, or\n`astryx-svelte doctor` for an overall health check.\n\nFor the full authoring walkthrough — component doc format, template packaging and `exports`\nrequirements, and codemod authoring — read the guide:\n\n```bash\npnpm exec astryx-svelte docs cli-integrations\n```\n\n## What is empty, and why\n\nTwo surfaces are real mechanisms over genuinely empty data sets. Neither is a stub, and neither will\nsilently pretend otherwise.\n\n- **`upgrade` has no codemods to apply.** A codemod migrates between two releases, and this port has\n  had one. The version registry is empty, which routes every range to the \"no codemods\" result —\n  the same path Astryx takes for a range with nothing registered. The first real entry lands with\n  the second release.\n- **`discover` finds nothing until you install an integration.** It scans `node_modules` for\n  packages carrying an integration manifest; a project with none gets an empty list.\n","readmeFilename":"README.md"}