From bf0d866793bd3df7f544f51771ddd0d0b4288c7e Mon Sep 17 00:00:00 2001 From: Ajay Ghanwat Date: Wed, 12 Aug 2026 17:08:38 +0530 Subject: [PATCH] fix(cli): scaffold installable framework versions --- packages/cli/src/create.ts | 54 +++++++++++++++++--------------- packages/cli/test/create.test.ts | 10 +++--- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/packages/cli/src/create.ts b/packages/cli/src/create.ts index 566fba56..e547791d 100644 --- a/packages/cli/src/create.ts +++ b/packages/cli/src/create.ts @@ -10,7 +10,11 @@ import { dirname, join, resolve } from "node:path"; import { AI_GUIDE, CLAUDE_MD } from "./ai-guide.ts"; import { currentCliVersion } from "./update-notifier.ts"; -const frameworkVersion = currentCliVersion(); +const cliVersion = currentCliVersion(); + +// Framework packages use independent patch versions. Keep scaffolds on the +// compatible 0.8 line instead of assuming every package shares the CLI patch. +export const scaffoldFrameworkRange = "^0.8.8"; /** Map of file (relative to app root) -> contents. */ const TEMPLATE: Record = { @@ -72,7 +76,7 @@ Thumbs.db "private": true, "type": "module", "wrnexus": { - "version": "${frameworkVersion}" + "version": "${cliVersion}" }, "scripts": { "dev": "wrnexus dev .", @@ -92,31 +96,31 @@ Thumbs.db "check": "bun run typecheck && bun run lint && bun run test && bun run format:check" }, "dependencies": { - "@wrnexus/ai": "${frameworkVersion}", - "@wrnexus/auth": "${frameworkVersion}", - "@wrnexus/captcha": "${frameworkVersion}", - "@wrnexus/core": "${frameworkVersion}", - "@wrnexus/csr": "${frameworkVersion}", - "@wrnexus/db": "${frameworkVersion}", - "@wrnexus/dev-server": "${frameworkVersion}", - "@wrnexus/encryption": "${frameworkVersion}", - "@wrnexus/helpers": "${frameworkVersion}", - "@wrnexus/i18n": "${frameworkVersion}", - "@wrnexus/image": "${frameworkVersion}", - "@wrnexus/jwt": "${frameworkVersion}", - "@wrnexus/observability": "${frameworkVersion}", - "@wrnexus/realtime": "${frameworkVersion}", - "@wrnexus/security": "${frameworkVersion}", - "@wrnexus/store": "${frameworkVersion}", - "@wrnexus/styles": "${frameworkVersion}", - "@wrnexus/tracking": "${frameworkVersion}", - "@wrnexus/ui": "${frameworkVersion}", - "@wrnexus/uploader": "${frameworkVersion}", - "@wrnexus/validation": "${frameworkVersion}", - "@wrnexus/authz": "${frameworkVersion}" + "@wrnexus/ai": "${scaffoldFrameworkRange}", + "@wrnexus/auth": "${scaffoldFrameworkRange}", + "@wrnexus/captcha": "${scaffoldFrameworkRange}", + "@wrnexus/core": "${scaffoldFrameworkRange}", + "@wrnexus/csr": "${scaffoldFrameworkRange}", + "@wrnexus/db": "${scaffoldFrameworkRange}", + "@wrnexus/dev-server": "${scaffoldFrameworkRange}", + "@wrnexus/encryption": "${scaffoldFrameworkRange}", + "@wrnexus/helpers": "${scaffoldFrameworkRange}", + "@wrnexus/i18n": "${scaffoldFrameworkRange}", + "@wrnexus/image": "${scaffoldFrameworkRange}", + "@wrnexus/jwt": "${scaffoldFrameworkRange}", + "@wrnexus/observability": "${scaffoldFrameworkRange}", + "@wrnexus/realtime": "${scaffoldFrameworkRange}", + "@wrnexus/security": "${scaffoldFrameworkRange}", + "@wrnexus/store": "${scaffoldFrameworkRange}", + "@wrnexus/styles": "${scaffoldFrameworkRange}", + "@wrnexus/tracking": "${scaffoldFrameworkRange}", + "@wrnexus/ui": "${scaffoldFrameworkRange}", + "@wrnexus/uploader": "${scaffoldFrameworkRange}", + "@wrnexus/validation": "${scaffoldFrameworkRange}", + "@wrnexus/authz": "${scaffoldFrameworkRange}" }, "devDependencies": { - "@wrnexus/cli": "${frameworkVersion}", + "@wrnexus/cli": "${cliVersion}", "@eslint/js": "^9.0.0", "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", diff --git a/packages/cli/test/create.test.ts b/packages/cli/test/create.test.ts index fc8aaf3f..b1ebe394 100644 --- a/packages/cli/test/create.test.ts +++ b/packages/cli/test/create.test.ts @@ -3,7 +3,7 @@ import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { format } from "prettier"; -import { scaffoldApp } from "../src/create.ts"; +import { scaffoldApp, scaffoldFrameworkRange } from "../src/create.ts"; import { currentCliVersion } from "../src/update-notifier.ts"; test("scaffoldApp creates a comprehensive .gitignore", () => { @@ -88,7 +88,7 @@ test("scaffoldApp includes the complete v0.8 configuration and starter structure "@wrnexus/uploader", "@wrnexus/validation", ]) { - expect(pkg.dependencies[packageName]).toBe(currentCliVersion()); + expect(pkg.dependencies[packageName]).toBe(scaffoldFrameworkRange); } for (const block of [ @@ -131,7 +131,7 @@ test("scaffoldApp includes the complete v0.8 configuration and starter structure } }); -test("scaffoldApp pins the current framework and exposes llms.txt publicly", () => { +test("scaffoldApp uses compatible framework packages and pins the current CLI", () => { const parent = mkdtempSync(join(tmpdir(), "wrnexus-create-")); const root = join(parent, "current-app"); @@ -141,9 +141,9 @@ test("scaffoldApp pins the current framework and exposes llms.txt publicly", () const version = currentCliVersion(); expect(pkg.wrnexus.version).toBe(version); - expect(pkg.dependencies["@wrnexus/helpers"]).toBe(version); + expect(pkg.dependencies["@wrnexus/helpers"]).toBe(scaffoldFrameworkRange); for (const dependency of Object.values(pkg.dependencies) as string[]) { - expect(dependency).toBe(version); + expect(dependency).toBe(scaffoldFrameworkRange); } expect(pkg.devDependencies["@wrnexus/cli"]).toBe(version); expect(pkg.devDependencies["@iconify/tailwind4"]).toBe("^1.2.3");