create-next-style-guide 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/index.js +439 -377
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/template/tsconfig.json +8 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/helpers/package-manager.ts","../src/helpers/slugify.ts","../src/presets.ts","../src/prompts.ts","../src/types.ts","../src/scaffold.ts","../src/helpers/run-package-install.ts","../src/helpers/replace-tokens.ts","../src/installers/api-envelope.ts","../src/helpers/app-providers.ts","../src/installers/app-providers.ts","../src/installers/auth-authjs.ts","../src/helpers/package-json.ts","../src/installers/auth-jwt.ts","../src/installers/ci.ts","../src/installers/dark-mode.ts","../src/installers/docker-compose.ts","../src/installers/docker.ts","../src/installers/endpoints.ts","../src/installers/eslint.ts","../src/installers/husky.ts","../src/installers/i18n.ts","../src/installers/icons.ts","../src/installers/mui.ts","../src/installers/package-manager.ts","../src/installers/prettier.ts","../src/installers/seo.ts","../src/installers/shadcn.ts","../src/installers/store.ts","../src/installers/surface.ts","../src/installers/tailwind.ts","../src/installers/tanstack-query.ts","../src/installers/testing.ts","../src/installers/validation.ts","../src/installers/vercel.ts","../src/installers/index.ts","../src/upgrade.ts"],"sourcesContent":["import * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\nimport path from \"node:path\";\n\nimport { PKG_NAME, TITLE } from \"./constants.js\";\nimport { getPackageManager } from \"./helpers/package-manager.js\";\nimport { slugify } from \"./helpers/slugify.js\";\nimport {\n collectOptionWarnings,\n PRESET_SEEDS,\n type PresetId,\n} from \"./presets.js\";\nimport { runPrompts } from \"./prompts.js\";\nimport { scaffold } from \"./scaffold.js\";\nimport { runUpgrade } from \"./upgrade.js\";\nimport {\n DEFAULT_OPTIONS,\n normalizeOptions,\n type AuthOption,\n type DeployOption,\n type IconOption,\n type PackageManager,\n type ScaffoldOptions,\n type ShadcnSetOption,\n type StoreOption,\n type StylingOption,\n type ValidationOption,\n} from \"./types.js\";\n\nconst ICON_VALUES = new Set<IconOption>([\"none\", \"lucide\", \"tabler\"]);\nconst STYLING_VALUES = new Set<StylingOption>([\"none\", \"tailwind\", \"mui\"]);\nconst VALIDATION_VALUES = new Set<ValidationOption>([\"zod\", \"yup\"]);\nconst AUTH_VALUES = new Set<AuthOption>([\"none\", \"jwt\", \"authjs\"]);\nconst STORE_VALUES = new Set<StoreOption>([\"none\", \"zustand\", \"redux\"]);\nconst PM_VALUES = new Set<PackageManager>([\"pnpm\", \"npm\", \"yarn\"]);\nconst SHADCN_SET_VALUES = new Set<ShadcnSetOption>([\"minimal\", \"starter\"]);\nconst DEPLOY_VALUES = new Set<DeployOption>([\"none\", \"vercel\", \"docker\"]);\nconst PRESET_VALUES = new Set<PresetId>([\n \"custom\",\n \"minimal\",\n \"api-app\",\n \"marketing\",\n \"dashboard\",\n]);\n\ntype FlagBag = {\n name?: string;\n noInstall: boolean;\n yes: boolean;\n upgrade: boolean;\n apply: boolean;\n verbose: boolean;\n preset?: PresetId;\n packageManager?: PackageManager;\n icons?: IconOption;\n styling?: StylingOption;\n shadcn?: boolean;\n shadcnSet?: ShadcnSetOption;\n validation?: ValidationOption;\n auth?: AuthOption;\n store?: StoreOption;\n tanstackQuery?: boolean;\n endpoints?: boolean;\n apiEnvelope?: boolean;\n seo?: boolean;\n i18n?: boolean;\n darkMode?: boolean;\n testing?: boolean;\n playwright?: boolean;\n eslint?: boolean;\n prettier?: boolean;\n husky?: boolean;\n deploy?: DeployOption;\n ci?: boolean;\n};\n\nfunction parseBoolFlag(\n arg: string,\n positive: string,\n negative: string,\n): boolean | undefined {\n if (arg === positive) return true;\n if (arg === negative) return false;\n return undefined;\n}\n\nfunction readChoice<T extends string>(\n arg: string,\n flag: string,\n values: Set<T>,\n args: string[],\n i: number,\n): { value: T; nextIndex: number } | null {\n if (arg.startsWith(`${flag}=`)) {\n const value = arg.slice(flag.length + 1) as T;\n if (!values.has(value)) {\n throw new Error(`Invalid ${flag}=${value}.`);\n }\n return { value, nextIndex: i };\n }\n if (arg === flag) {\n const value = args[i + 1] as T | undefined;\n if (!value || !values.has(value)) {\n throw new Error(`Invalid ${flag}.`);\n }\n return { value, nextIndex: i + 1 };\n }\n return null;\n}\n\nfunction parseArgs(argv: string[]): FlagBag {\n const args = argv.slice(2);\n const out: FlagBag = {\n noInstall: false,\n yes: false,\n upgrade: false,\n apply: false,\n verbose: false,\n };\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i]!;\n\n if (arg === \"upgrade\") {\n out.upgrade = true;\n continue;\n }\n if (arg === \"--apply\") {\n out.apply = true;\n continue;\n }\n if (arg === \"--diff\") {\n out.upgrade = true;\n out.apply = false;\n continue;\n }\n if (arg === \"--verbose\" || arg === \"-V\") {\n out.verbose = true;\n continue;\n }\n if (arg === \"--no-install\") {\n out.noInstall = true;\n continue;\n }\n if (arg === \"--yes\" || arg === \"-y\") {\n out.yes = true;\n continue;\n }\n if (arg === \"--help\" || arg === \"-h\") {\n printHelp();\n process.exit(0);\n }\n\n const boolKeys = [\n [\"tanstackQuery\", \"--tanstack-query\", \"--no-tanstack-query\"],\n [\"endpoints\", \"--endpoints\", \"--no-endpoints\"],\n [\"apiEnvelope\", \"--api-envelope\", \"--no-api-envelope\"],\n [\"seo\", \"--seo\", \"--no-seo\"],\n [\"i18n\", \"--i18n\", \"--no-i18n\"],\n [\"darkMode\", \"--dark-mode\", \"--no-dark-mode\"],\n [\"testing\", \"--testing\", \"--no-testing\"],\n [\"playwright\", \"--playwright\", \"--no-playwright\"],\n [\"eslint\", \"--eslint\", \"--no-eslint\"],\n [\"prettier\", \"--prettier\", \"--no-prettier\"],\n [\"husky\", \"--husky\", \"--no-husky\"],\n [\"ci\", \"--ci\", \"--no-ci\"],\n [\"shadcn\", \"--shadcn\", \"--no-shadcn\"],\n ] as const;\n let matched = false;\n for (const [key, pos, neg] of boolKeys) {\n const v = parseBoolFlag(arg, pos, neg);\n if (v !== undefined) {\n out[key] = v;\n matched = true;\n break;\n }\n }\n if (matched) continue;\n\n const preset = readChoice(arg, \"--preset\", PRESET_VALUES, args, i);\n if (preset) {\n out.preset = preset.value;\n i = preset.nextIndex;\n continue;\n }\n const pm = readChoice(arg, \"--pm\", PM_VALUES, args, i);\n if (pm) {\n out.packageManager = pm.value;\n i = pm.nextIndex;\n continue;\n }\n const pmLong = readChoice(arg, \"--package-manager\", PM_VALUES, args, i);\n if (pmLong) {\n out.packageManager = pmLong.value;\n i = pmLong.nextIndex;\n continue;\n }\n const store = readChoice(arg, \"--store\", STORE_VALUES, args, i);\n if (store) {\n out.store = store.value;\n i = store.nextIndex;\n continue;\n }\n const styling = readChoice(arg, \"--styling\", STYLING_VALUES, args, i);\n if (styling) {\n out.styling = styling.value;\n i = styling.nextIndex;\n continue;\n }\n const validation = readChoice(\n arg,\n \"--validation\",\n VALIDATION_VALUES,\n args,\n i,\n );\n if (validation) {\n out.validation = validation.value;\n i = validation.nextIndex;\n continue;\n }\n const auth = readChoice(arg, \"--auth\", AUTH_VALUES, args, i);\n if (auth) {\n out.auth = auth.value;\n i = auth.nextIndex;\n continue;\n }\n const icons = readChoice(arg, \"--icons\", ICON_VALUES, args, i);\n if (icons) {\n out.icons = icons.value;\n i = icons.nextIndex;\n continue;\n }\n const shadcnSet = readChoice(arg, \"--shadcn-set\", SHADCN_SET_VALUES, args, i);\n if (shadcnSet) {\n out.shadcnSet = shadcnSet.value;\n out.shadcn = true;\n i = shadcnSet.nextIndex;\n continue;\n }\n const deploy = readChoice(arg, \"--deploy\", DEPLOY_VALUES, args, i);\n if (deploy) {\n out.deploy = deploy.value;\n i = deploy.nextIndex;\n continue;\n }\n // Back-compat aliases\n if (arg === \"--docker\") {\n out.deploy = \"docker\";\n continue;\n }\n if (arg === \"--no-docker\") {\n if (out.deploy === undefined || out.deploy === \"docker\") {\n out.deploy = \"none\";\n }\n continue;\n }\n\n if (!arg.startsWith(\"-\") && !out.name) {\n out.name = arg;\n }\n }\n\n return out;\n}\n\nfunction printHelp(): void {\n console.log(`\n${TITLE} — ${PKG_NAME}\n\nUsage:\n npx create-next-style-guide [name] [options]\n npx create-next-style-guide upgrade [--apply] [dir]\n npx create-next-style-guide --diff [dir]\n\nOptions:\n --yes, -y\n --no-install\n --preset minimal|api-app|marketing|dashboard|custom\n --pm, --package-manager pnpm|npm|yarn\n --store none|zustand|redux\n --styling none|tailwind|mui\n --shadcn | --no-shadcn\n --shadcn-set minimal|starter\n --dark-mode | --no-dark-mode\n --validation zod|yup\n --auth none|jwt|authjs\n --icons none|lucide|tabler\n --tanstack-query | --no-tanstack-query\n --endpoints | --no-endpoints\n --api-envelope | --no-api-envelope\n --seo | --no-seo\n --i18n | --no-i18n\n --testing | --no-testing\n --playwright | --no-playwright\n --eslint | --no-eslint\n --prettier | --no-prettier\n --husky | --no-husky\n --deploy none|vercel|docker\n --docker | --no-docker (alias for --deploy docker / none)\n --ci | --no-ci\n --verbose, -V advisory tips (e.g. Query vs store)\n --help, -h\n\nUpgrade:\n upgrade [--apply] Diff (default) or apply AGENTS.md + core .cursor/rules\n --diff Alias for upgrade without --apply\n`);\n}\n\nfunction applyFlagOverrides(\n options: ScaffoldOptions,\n flags: FlagBag,\n): ScaffoldOptions {\n let next = { ...options };\n if (flags.packageManager !== undefined) {\n next.packageManager = flags.packageManager;\n }\n if (flags.icons !== undefined) next.icons = flags.icons;\n if (flags.styling !== undefined) next.styling = flags.styling;\n if (flags.shadcn !== undefined) next.ui = flags.shadcn ? \"shadcn\" : \"none\";\n if (flags.shadcnSet !== undefined) {\n next.shadcnSet = flags.shadcnSet;\n next.ui = \"shadcn\";\n }\n if (flags.validation !== undefined) next.validation = flags.validation;\n if (flags.auth !== undefined) next.auth = flags.auth;\n if (flags.store !== undefined) next.store = flags.store;\n if (flags.tanstackQuery !== undefined) {\n next.data = flags.tanstackQuery ? \"tanstack-query\" : \"rsc\";\n }\n if (flags.endpoints !== undefined) next.endpoints = flags.endpoints;\n if (flags.apiEnvelope !== undefined) next.apiEnvelope = flags.apiEnvelope;\n if (flags.seo !== undefined) next.seo = flags.seo;\n if (flags.i18n !== undefined) next.i18n = flags.i18n;\n if (flags.darkMode !== undefined) next.darkMode = flags.darkMode;\n if (flags.testing !== undefined) next.testing = flags.testing;\n if (flags.playwright !== undefined) next.playwright = flags.playwright;\n if (flags.eslint !== undefined) next.eslint = flags.eslint;\n if (flags.prettier !== undefined) next.prettier = flags.prettier;\n if (flags.husky !== undefined) next.husky = flags.husky;\n if (flags.deploy !== undefined) next.deploy = flags.deploy;\n if (flags.ci !== undefined) next.ci = flags.ci;\n return normalizeOptions(next);\n}\n\nasync function main(): Promise<void> {\n const flags = parseArgs(process.argv);\n\n if (flags.upgrade) {\n const projectDir = path.resolve(process.cwd(), flags.name ?? \".\");\n await runUpgrade({ projectDir, apply: flags.apply });\n return;\n }\n\n let options: ScaffoldOptions;\n\n if (flags.yes) {\n const name = (flags.name ?? \"my-app\").trim();\n const presetSeed =\n flags.preset && flags.preset !== \"custom\"\n ? PRESET_SEEDS[flags.preset]\n : DEFAULT_OPTIONS;\n\n options = applyFlagOverrides(\n {\n name,\n slug: slugify(name),\n ...presetSeed,\n noInstall: flags.noInstall,\n },\n flags,\n );\n p.intro(color.bgCyan(color.black(` ${TITLE} `)));\n p.log.info(\n [\n `Non-interactive: ${options.name} (${options.slug})`,\n flags.preset ? `preset=${flags.preset}` : null,\n `pm=${options.packageManager}`,\n `styling=${options.styling} ui=${options.ui}${options.ui === \"shadcn\" ? `:${options.shadcnSet}` : \"\"} auth=${options.auth} store=${options.store}`,\n `deploy=${options.deploy} endpoints=${options.endpoints} seo=${options.seo} i18n=${options.i18n} testing=${options.testing}`,\n ]\n .filter(Boolean)\n .join(\" · \"),\n );\n } else {\n options = await runPrompts(flags.name);\n options.noInstall = flags.noInstall;\n options = applyFlagOverrides(options, flags);\n }\n\n const warnings = collectOptionWarnings(options, { verbose: flags.verbose });\n for (const warning of warnings) {\n p.log.warn(warning);\n }\n\n const projectDir = await scaffold(options);\n const pm = getPackageManager(options.packageManager);\n\n const nextSteps = [\n `cd ${path.relative(process.cwd(), projectDir) || \".\"}`,\n options.noInstall ? `${pm.id} ${pm.installArgs.filter((a) => a !== \"--ignore-workspace\").join(\" \")}`.trim() : null,\n options.ui === \"shadcn\" && options.shadcnSet === \"minimal\"\n ? \"npx shadcn@latest add input # or re-scaffold with --shadcn-set starter\"\n : null,\n options.endpoints\n ? `${pm.runScript(\"endpoints:generate\")} # when API schema is up`\n : null,\n options.testing ? pm.runScript(\"test\") : null,\n pm.runScript(\"dev\"),\n ].filter(Boolean);\n\n p.note(nextSteps.join(\"\\n\"), \"Next steps\");\n p.outro(color.green(\"Done. Happy shipping.\"));\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n p.log.error(message);\n p.cancel(\"Scaffold failed.\");\n process.exit(1);\n});\n","import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst here = path.dirname(fileURLToPath(import.meta.url));\n\n/** Resolved at runtime: dist/ → ../template, or src via tsx → ../template */\nexport const TEMPLATE_DIR = path.resolve(here, \"../template\");\n/** Optional feature file packs copied by installers */\nexport const ADDONS_DIR = path.resolve(here, \"../addons\");\n\nexport const TITLE = \"Next Style Guide\";\nexport const PKG_NAME = \"create-next-style-guide\";\n","import type { PackageManager } from \"../types.js\";\n\nexport type PackageManagerMeta = {\n id: PackageManager;\n /** Corepack `packageManager` field; omit for npm */\n packageManagerField: string | null;\n lockfile: string;\n installArgs: string[];\n /** Run a package.json script: `typecheck`, `dev`, … */\n runScript: (script: string, args?: string[]) => string;\n /** Run a binary from node_modules */\n exec: (bin: string, args?: string[]) => string;\n};\n\nfunction joinArgs(args?: string[]): string {\n return args?.length ? ` ${args.join(\" \")}` : \"\";\n}\n\nexport const PACKAGE_MANAGERS: Record<PackageManager, PackageManagerMeta> = {\n pnpm: {\n id: \"pnpm\",\n packageManagerField: \"pnpm@9.15.0\",\n lockfile: \"pnpm-lock.yaml\",\n installArgs: [\"install\", \"--ignore-workspace\"],\n runScript: (script, args) => `pnpm ${script}${joinArgs(args)}`,\n exec: (bin, args) => `pnpm exec ${bin}${joinArgs(args)}`,\n },\n npm: {\n id: \"npm\",\n packageManagerField: null,\n lockfile: \"package-lock.json\",\n // --install-strategy=hoisted keeps the app isolated if nested under another workspace tree\n installArgs: [\"install\", \"--install-strategy=hoisted\"],\n runScript: (script, args) => `npm run ${script}${joinArgs(args)}`,\n exec: (bin, args) => `npx ${bin}${joinArgs(args)}`,\n },\n yarn: {\n id: \"yarn\",\n packageManagerField: \"yarn@1.22.22\",\n lockfile: \"yarn.lock\",\n installArgs: [\"install\"],\n runScript: (script, args) => `yarn ${script}${joinArgs(args)}`,\n exec: (bin, args) => `yarn ${bin}${joinArgs(args)}`,\n },\n};\n\nexport function getPackageManager(id: PackageManager): PackageManagerMeta {\n return PACKAGE_MANAGERS[id];\n}\n\n/** CI install command (frozen lockfile when present). */\nexport function ciInstallCommand(id: PackageManager): string {\n switch (id) {\n case \"pnpm\":\n return \"pnpm install --frozen-lockfile\";\n case \"npm\":\n return \"npm ci\";\n case \"yarn\":\n return \"yarn install --frozen-lockfile\";\n }\n}\n","/** Lowercase slug: spaces / hyphens / dots → `_` */\nexport function slugify(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[\\s.-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\")\n .replace(/_+/g, \"_\")\n .replace(/^_|_$/g, \"\");\n\n if (!slug) {\n throw new Error(`Could not derive a package slug from \"${name}\".`);\n }\n if (/^[0-9]/.test(slug)) {\n return `app_${slug}`;\n }\n return slug;\n}\n","import type { ScaffoldOptions } from \"./types.js\";\n\nexport type PresetId =\n | \"custom\"\n | \"minimal\"\n | \"api-app\"\n | \"marketing\"\n | \"dashboard\";\n\ntype OptionSeed = Omit<ScaffoldOptions, \"name\" | \"slug\" | \"noInstall\">;\n\nexport const PRESET_SEEDS: Record<Exclude<PresetId, \"custom\">, OptionSeed> = {\n minimal: {\n packageManager: \"pnpm\",\n auth: \"none\",\n styling: \"none\",\n ui: \"none\",\n shadcnSet: \"minimal\",\n data: \"rsc\",\n store: \"none\",\n icons: \"none\",\n validation: \"zod\",\n i18n: false,\n darkMode: false,\n apiEnvelope: false,\n endpoints: false,\n seo: false,\n eslint: false,\n prettier: false,\n husky: false,\n deploy: \"none\",\n ci: false,\n testing: false,\n playwright: false,\n },\n \"api-app\": {\n packageManager: \"pnpm\",\n auth: \"jwt\",\n styling: \"tailwind\",\n ui: \"shadcn\",\n shadcnSet: \"starter\",\n data: \"tanstack-query\",\n store: \"zustand\",\n icons: \"lucide\",\n validation: \"zod\",\n i18n: false,\n darkMode: true,\n apiEnvelope: true,\n endpoints: true,\n seo: false,\n eslint: true,\n prettier: true,\n husky: true,\n deploy: \"none\",\n ci: true,\n testing: true,\n playwright: false,\n },\n marketing: {\n packageManager: \"pnpm\",\n auth: \"none\",\n styling: \"tailwind\",\n ui: \"shadcn\",\n shadcnSet: \"minimal\",\n data: \"rsc\",\n store: \"none\",\n icons: \"lucide\",\n validation: \"zod\",\n i18n: true,\n darkMode: true,\n apiEnvelope: false,\n endpoints: false,\n seo: true,\n eslint: true,\n prettier: true,\n husky: true,\n deploy: \"vercel\",\n ci: true,\n testing: true,\n playwright: false,\n },\n dashboard: {\n packageManager: \"pnpm\",\n auth: \"none\",\n styling: \"tailwind\",\n ui: \"shadcn\",\n shadcnSet: \"starter\",\n data: \"tanstack-query\",\n store: \"zustand\",\n icons: \"lucide\",\n validation: \"zod\",\n i18n: false,\n darkMode: true,\n apiEnvelope: false,\n endpoints: false,\n seo: false,\n eslint: true,\n prettier: true,\n husky: true,\n deploy: \"none\",\n ci: true,\n testing: true,\n playwright: false,\n },\n};\n\nexport function describePreset(id: Exclude<PresetId, \"custom\">): string {\n const seed = PRESET_SEEDS[id];\n return [\n `styling=${seed.styling}`,\n seed.ui === \"shadcn\" ? `shadcn:${seed.shadcnSet}` : null,\n `auth=${seed.auth}`,\n seed.store !== \"none\" ? `store=${seed.store}` : null,\n `validation=${seed.validation}`,\n seed.endpoints ? \"endpoints\" : null,\n seed.data === \"tanstack-query\" ? \"query\" : null,\n seed.darkMode ? \"dark\" : null,\n seed.deploy !== \"none\" ? `deploy=${seed.deploy}` : null,\n seed.seo ? \"seo\" : null,\n seed.i18n ? \"i18n\" : null,\n seed.testing ? \"vitest\" : null,\n ]\n .filter(Boolean)\n .join(\" · \");\n}\n\ntype WarningOpts = {\n /** Include advisory tips (Query vs store, etc.). Default: false. */\n verbose?: boolean;\n};\n\n/** Soft warnings for odd but allowed combinations. */\nexport function collectOptionWarnings(\n options: ScaffoldOptions,\n { verbose = false }: WarningOpts = {},\n): string[] {\n const warnings: string[] = [];\n\n if (options.auth === \"jwt\" && !options.endpoints) {\n warnings.push(\n \"JWT without endpoints: only token-storage is added (no axios refresh wiring).\",\n );\n }\n if (options.ui === \"shadcn\" && options.styling !== \"tailwind\") {\n warnings.push(\"shadcn requires Tailwind — ui forced to none.\");\n }\n if (options.darkMode && options.styling !== \"tailwind\") {\n warnings.push(\"Dark mode requires Tailwind — disabled.\");\n }\n if (options.apiEnvelope && !options.endpoints) {\n warnings.push(\n \"API envelope enabled without endpoints: unwrap applies to src/lib/http.ts apiFetch.\",\n );\n }\n if (options.playwright && !options.testing) {\n warnings.push(\"Playwright was requested without Vitest — enabling testing.\");\n }\n if (\n verbose &&\n options.store !== \"none\" &&\n options.data === \"tanstack-query\"\n ) {\n warnings.push(\n \"Tip: Query = server cache; store = UI/session only. See docs/style-guide/overview/architecture.md\",\n );\n }\n\n return warnings;\n}\n","import * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\n\nimport { TITLE } from \"./constants.js\";\nimport { slugify } from \"./helpers/slugify.js\";\nimport {\n collectOptionWarnings,\n describePreset,\n PRESET_SEEDS,\n type PresetId,\n} from \"./presets.js\";\nimport {\n DEFAULT_OPTIONS,\n normalizeOptions,\n type AuthOption,\n type DeployOption,\n type IconOption,\n type PackageManager,\n type ScaffoldOptions,\n type ShadcnSetOption,\n type StoreOption,\n type StylingOption,\n type ValidationOption,\n} from \"./types.js\";\n\nfunction assertNotCancel<T>(value: T): Exclude<T, symbol> {\n if (p.isCancel(value)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n return value as Exclude<T, symbol>;\n}\n\nasync function promptCustomOptions(\n base: Omit<ScaffoldOptions, \"name\" | \"slug\" | \"noInstall\">,\n): Promise<Omit<ScaffoldOptions, \"name\" | \"slug\" | \"noInstall\">> {\n const styling = assertNotCancel(\n await p.select({\n message: \"Styling system?\",\n options: [\n { value: \"none\" satisfies StylingOption, label: \"None\", hint: \"plain CSS\" },\n {\n value: \"tailwind\" satisfies StylingOption,\n label: \"Tailwind CSS\",\n hint: \"enables optional shadcn\",\n },\n {\n value: \"mui\" satisfies StylingOption,\n label: \"MUI\",\n hint: \"no shadcn\",\n },\n ],\n initialValue: base.styling,\n }),\n );\n\n let ui: ScaffoldOptions[\"ui\"] = \"none\";\n let shadcnSet: ShadcnSetOption = \"minimal\";\n let darkMode = false;\n if (styling === \"tailwind\") {\n const useShadcn = assertNotCancel(\n await p.confirm({\n message: \"Add shadcn/ui?\",\n initialValue: base.ui === \"shadcn\",\n }),\n );\n ui = useShadcn ? \"shadcn\" : \"none\";\n if (useShadcn) {\n shadcnSet = assertNotCancel(\n await p.select({\n message: \"shadcn component set?\",\n options: [\n {\n value: \"minimal\" satisfies ShadcnSetOption,\n label: \"Minimal\",\n hint: \"Button only\",\n },\n {\n value: \"starter\" satisfies ShadcnSetOption,\n label: \"Starter\",\n hint: \"Button · Input · Card · Dialog\",\n },\n ],\n initialValue: base.shadcnSet,\n }),\n );\n }\n darkMode = assertNotCancel(\n await p.confirm({\n message: \"Add dark mode (next-themes)?\",\n initialValue: base.darkMode,\n }),\n );\n }\n\n const icons = assertNotCancel(\n await p.select({\n message: \"Icon library?\",\n options: [\n { value: \"none\" satisfies IconOption, label: \"None\" },\n { value: \"lucide\" satisfies IconOption, label: \"Lucide\" },\n { value: \"tabler\" satisfies IconOption, label: \"Tabler\" },\n ],\n initialValue: base.icons,\n }),\n );\n\n const validation = assertNotCancel(\n await p.select({\n message: \"Validation library?\",\n options: [\n { value: \"zod\" satisfies ValidationOption, label: \"Zod\" },\n { value: \"yup\" satisfies ValidationOption, label: \"Yup\" },\n ],\n initialValue: base.validation,\n }),\n );\n\n const useTanstackQuery = assertNotCancel(\n await p.confirm({\n message: \"Add TanStack Query?\",\n initialValue: base.data === \"tanstack-query\",\n }),\n );\n\n const needsStore = assertNotCancel(\n await p.confirm({\n message: \"Add a client store (global UI state)?\",\n initialValue: base.store !== \"none\",\n }),\n );\n\n let store: StoreOption = \"none\";\n if (needsStore) {\n store = assertNotCancel(\n await p.select({\n message: \"Which store library?\",\n options: [\n {\n value: \"zustand\" satisfies StoreOption,\n label: \"Zustand\",\n hint: \"lightweight\",\n },\n {\n value: \"redux\" satisfies StoreOption,\n label: \"Redux Toolkit\",\n hint: \"structured slices\",\n },\n ],\n initialValue: base.store === \"redux\" ? \"redux\" : \"zustand\",\n }),\n );\n }\n\n const endpoints = assertNotCancel(\n await p.confirm({\n message: \"Add OpenAPI endpoints codegen?\",\n initialValue: base.endpoints,\n }),\n );\n\n let apiEnvelope = base.apiEnvelope;\n if (endpoints) {\n apiEnvelope = assertNotCancel(\n await p.confirm({\n message: \"Unwrap API envelopes in http/axios helpers?\",\n initialValue: true,\n }),\n );\n } else {\n apiEnvelope = assertNotCancel(\n await p.confirm({\n message: \"Unwrap API envelopes in apiFetch (lib/http.ts)?\",\n initialValue: false,\n }),\n );\n }\n\n const auth = assertNotCancel(\n await p.select({\n message: \"Auth?\",\n options: [\n { value: \"none\" satisfies AuthOption, label: \"None\" },\n {\n value: \"jwt\" satisfies AuthOption,\n label: \"JWT\",\n hint: \"Bearer + refresh\",\n },\n {\n value: \"authjs\" satisfies AuthOption,\n label: \"Auth.js\",\n hint: \"Credentials demo\",\n },\n ],\n initialValue: base.auth,\n }),\n );\n\n const seo = assertNotCancel(\n await p.confirm({\n message: \"Add SEO helpers (sitemap/robots)?\",\n initialValue: base.seo,\n }),\n );\n\n const i18n = assertNotCancel(\n await p.confirm({\n message: \"Add i18n (next-intl)?\",\n initialValue: base.i18n,\n }),\n );\n\n const testing = assertNotCancel(\n await p.confirm({\n message: \"Add Vitest?\",\n initialValue: base.testing,\n }),\n );\n\n let playwright = false;\n if (testing) {\n playwright = assertNotCancel(\n await p.confirm({\n message: \"Also add Playwright e2e?\",\n initialValue: base.playwright,\n }),\n );\n }\n\n const eslint = assertNotCancel(\n await p.confirm({\n message: \"Enhanced ESLint?\",\n initialValue: base.eslint,\n }),\n );\n\n const prettier = assertNotCancel(\n await p.confirm({\n message: \"Add Prettier?\",\n initialValue: base.prettier,\n }),\n );\n\n const husky = assertNotCancel(\n await p.confirm({\n message: \"Add Husky + lint-staged?\",\n initialValue: base.husky,\n }),\n );\n\n const deploy = assertNotCancel(\n await p.select({\n message: \"Deployment target?\",\n options: [\n {\n value: \"none\" satisfies DeployOption,\n label: \"None\",\n hint: \"no deploy files\",\n },\n {\n value: \"vercel\" satisfies DeployOption,\n label: \"Vercel\",\n hint: \"vercel.json + docs\",\n },\n {\n value: \"docker\" satisfies DeployOption,\n label: \"Docker\",\n hint: \"standalone production image\",\n },\n ],\n initialValue: base.deploy,\n }),\n );\n\n const ci = assertNotCancel(\n await p.confirm({\n message: \"Add GitHub Actions CI?\",\n initialValue: base.ci,\n }),\n );\n\n return {\n ...base,\n styling,\n ui,\n shadcnSet,\n darkMode,\n icons,\n validation,\n data: useTanstackQuery ? \"tanstack-query\" : \"rsc\",\n store,\n endpoints,\n apiEnvelope,\n auth,\n seo,\n i18n,\n testing,\n playwright,\n eslint,\n prettier,\n husky,\n deploy,\n ci,\n };\n}\n\n/** Interactive prompts for scaffold options. */\nexport async function runPrompts(\n initialName?: string,\n): Promise<ScaffoldOptions> {\n p.intro(color.bgCyan(color.black(` ${TITLE} `)));\n\n const name = assertNotCancel(\n await p.text({\n message: \"Project name?\",\n placeholder: \"my-app\",\n initialValue: initialName ?? \"my-app\",\n validate(value) {\n const next = value ?? \"\";\n if (!next.trim()) return \"Name is required.\";\n try {\n slugify(next);\n } catch (error) {\n return error instanceof Error ? error.message : \"Invalid name.\";\n }\n },\n }),\n );\n\n const slug = slugify(name);\n\n const packageManager = assertNotCancel(\n await p.select({\n message: \"Package manager?\",\n options: [\n { value: \"pnpm\" as const, label: \"pnpm\", hint: \"default\" },\n { value: \"npm\" as const, label: \"npm\" },\n { value: \"yarn\" as const, label: \"yarn\", hint: \"classic\" },\n ],\n initialValue: \"pnpm\" as const,\n }),\n ) as PackageManager;\n\n const preset = assertNotCancel(\n await p.select({\n message: \"Preset?\",\n options: [\n {\n value: \"minimal\" as const,\n label: \"Minimal\",\n hint: describePreset(\"minimal\"),\n },\n {\n value: \"api-app\" as const,\n label: \"API app\",\n hint: describePreset(\"api-app\"),\n },\n {\n value: \"marketing\" as const,\n label: \"Marketing / site\",\n hint: describePreset(\"marketing\"),\n },\n {\n value: \"dashboard\" as const,\n label: \"Dashboard\",\n hint: describePreset(\"dashboard\"),\n },\n {\n value: \"custom\" as const,\n label: \"Custom\",\n hint: \"answer every question\",\n },\n ],\n initialValue: \"custom\" as const,\n }),\n ) as PresetId;\n\n let optionSeed: Omit<ScaffoldOptions, \"name\" | \"slug\" | \"noInstall\"> =\n preset === \"custom\"\n ? { ...DEFAULT_OPTIONS, packageManager }\n : { ...PRESET_SEEDS[preset], packageManager };\n\n if (preset === \"custom\") {\n optionSeed = await promptCustomOptions(optionSeed);\n } else {\n p.note(describePreset(preset), `Preset: ${preset}`);\n const tweak = assertNotCancel(\n await p.confirm({\n message: \"Customize this preset further?\",\n initialValue: false,\n }),\n );\n if (tweak) {\n optionSeed = await promptCustomOptions(optionSeed);\n }\n }\n\n const draft = normalizeOptions({\n name: name.trim(),\n slug,\n ...optionSeed,\n packageManager,\n noInstall: false,\n });\n\n const warnings = collectOptionWarnings(draft);\n if (warnings.length) {\n p.log.warn(warnings.join(\"\\n\"));\n }\n\n const confirmed = assertNotCancel(\n await p.confirm({\n message: `Create ${color.cyan(name)} (${color.dim(slug)})?`,\n initialValue: true,\n }),\n );\n\n if (!confirmed) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n return draft;\n}\n","/**\n * Scaffold options.\n * Base ships with safe defaults; installers flip features on.\n */\nexport type AuthOption = \"none\" | \"jwt\" | \"authjs\";\n/** CSS / component system foundation */\nexport type StylingOption = \"none\" | \"tailwind\" | \"mui\";\n/** shadcn only valid when styling === \"tailwind\" */\nexport type UiOption = \"none\" | \"shadcn\";\n/** How many shadcn primitives to ship (only when ui === \"shadcn\") */\nexport type ShadcnSetOption = \"minimal\" | \"starter\";\nexport type DataOption = \"rsc\" | \"tanstack-query\";\nexport type IconOption = \"none\" | \"lucide\" | \"tabler\";\nexport type ValidationOption = \"zod\" | \"yup\";\n/** Client global state — opt-in */\nexport type StoreOption = \"none\" | \"zustand\" | \"redux\";\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\";\n/** Production deploy target */\nexport type DeployOption = \"none\" | \"vercel\" | \"docker\";\n\nexport type ScaffoldOptions = {\n /** Output directory / display name */\n name: string;\n /** package.json / folder slug */\n slug: string;\n packageManager: PackageManager;\n auth: AuthOption;\n styling: StylingOption;\n ui: UiOption;\n /** Ignored unless ui === \"shadcn\" */\n shadcnSet: ShadcnSetOption;\n data: DataOption;\n store: StoreOption;\n icons: IconOption;\n validation: ValidationOption;\n i18n: boolean;\n /** Tailwind dark mode via next-themes (requires styling=tailwind) */\n darkMode: boolean;\n /** Unwrap `{ result, status, success, messages }` API envelopes */\n apiEnvelope: boolean;\n /** OpenAPI → `src/endpoints` codegen + axios helpers */\n endpoints: boolean;\n /** SEO helpers: public-routes, sitemap, robots */\n seo: boolean;\n /** Enhanced ESLint (import sort, func-style, jsx-sort-props) */\n eslint: boolean;\n /** Prettier + format script */\n prettier: boolean;\n /** Husky + lint-staged pre-commit */\n husky: boolean;\n /** Deploy target: none | vercel | docker */\n deploy: DeployOption;\n /** GitHub Actions CI */\n ci: boolean;\n /** Vitest unit/component tests */\n testing: boolean;\n /** Playwright e2e (requires testing) */\n playwright: boolean;\n /** Skip dependency install after scaffold */\n noInstall: boolean;\n};\n\nexport const DEFAULT_OPTIONS: Omit<ScaffoldOptions, \"name\" | \"slug\"> = {\n packageManager: \"pnpm\",\n auth: \"none\",\n styling: \"none\",\n ui: \"none\",\n shadcnSet: \"minimal\",\n data: \"rsc\",\n store: \"none\",\n icons: \"none\",\n validation: \"zod\",\n i18n: false,\n darkMode: false,\n /** Neutral base — enable via preset / flags when building an API client app */\n apiEnvelope: false,\n endpoints: false,\n seo: false,\n eslint: true,\n prettier: true,\n husky: true,\n deploy: \"none\",\n ci: true,\n testing: true,\n playwright: false,\n noInstall: false,\n};\n\nexport const ICON_PACKAGES: Record<\n Exclude<IconOption, \"none\">,\n { name: string; version: string }\n> = {\n lucide: { name: \"lucide-react\", version: \"^0.469.0\" },\n tabler: { name: \"@tabler/icons-react\", version: \"^3.46.0\" },\n};\n\n/** Enforce incompatible combinations. */\nexport function normalizeOptions<T extends ScaffoldOptions>(options: T): T {\n let next = { ...options };\n\n if (next.styling !== \"tailwind\" && next.ui === \"shadcn\") {\n next = { ...next, ui: \"none\" };\n }\n if (next.ui !== \"shadcn\") {\n next = { ...next, shadcnSet: \"minimal\" };\n }\n if (next.styling !== \"tailwind\" && next.darkMode) {\n next = { ...next, darkMode: false };\n }\n if (next.playwright && !next.testing) {\n next = { ...next, testing: true };\n }\n\n return next;\n}\n\n/** @deprecated use normalizeOptions */\nexport function normalizeUiOptions<\n T extends Pick<ScaffoldOptions, \"styling\" | \"ui\">,\n>(options: T): T {\n if (options.styling !== \"tailwind\" && options.ui === \"shadcn\") {\n return { ...options, ui: \"none\" };\n }\n return options;\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\n\nimport { TEMPLATE_DIR } from \"./constants.js\";\nimport { getPackageManager } from \"./helpers/package-manager.js\";\nimport {\n runPackageInstall,\n yieldUi,\n} from \"./helpers/run-package-install.js\";\nimport { replaceTokensInTree } from \"./helpers/replace-tokens.js\";\nimport { runInstallers } from \"./installers/index.js\";\nimport type { ScaffoldOptions } from \"./types.js\";\n\nexport async function scaffold(options: ScaffoldOptions): Promise<string> {\n const projectDir = path.resolve(process.cwd(), options.name);\n const pm = getPackageManager(options.packageManager);\n\n if (await fs.pathExists(projectDir)) {\n const entries = await fs.readdir(projectDir);\n if (entries.length > 0) {\n throw new Error(\n `Target directory already exists and is not empty: ${projectDir}`,\n );\n }\n }\n\n const spin = p.spinner();\n spin.start(\"Copying template\");\n await yieldUi();\n\n if (!(await fs.pathExists(TEMPLATE_DIR))) {\n spin.stop(\"Template missing\");\n throw new Error(`Template directory not found at ${TEMPLATE_DIR}`);\n }\n\n await fs.copy(TEMPLATE_DIR, projectDir, {\n filter: (src) => {\n const base = path.basename(src);\n return base !== \"node_modules\" && base !== \".next\" && base !== \"dist\";\n },\n });\n\n // npm never packs `.gitignore`; template ships as `gitignore` and we rename here.\n const gitignoreSrc = path.join(projectDir, \"gitignore\");\n const gitignoreDest = path.join(projectDir, \".gitignore\");\n if (await fs.pathExists(gitignoreSrc)) {\n await fs.move(gitignoreSrc, gitignoreDest, { overwrite: true });\n }\n\n spin.message(\"Applying project tokens\");\n await yieldUi();\n await replaceTokensInTree(projectDir, {\n __PROJECT_NAME__: options.name,\n __PROJECT_SLUG__: options.slug,\n __PACKAGE_MANAGER__: pm.id,\n });\n\n const ran = await runInstallers({ projectDir, options }, async (step) => {\n spin.message(`Installer (${step.index}/${step.total}): ${step.id}`);\n await yieldUi();\n });\n\n spin.stop(\n ran.length\n ? `Scaffold ready · ${ran.length} installer${ran.length === 1 ? \"\" : \"s\"}`\n : \"Scaffold ready · base template\",\n );\n\n if (!options.noInstall) {\n if (options.husky) {\n try {\n execFileSync(\"git\", [\"init\"], {\n cwd: projectDir,\n stdio: \"ignore\",\n });\n } catch {\n // husky prepare is best-effort without a repo\n }\n }\n\n p.log.step(\n `Installing dependencies with ${color.cyan(pm.id)} — live output below…`,\n );\n try {\n await runPackageInstall(projectDir, pm);\n p.log.success(\"Dependencies installed\");\n } catch (error) {\n if (pm.id !== \"npm\") {\n p.log.warn(`${pm.id} failed — retrying with npm…`);\n const npm = getPackageManager(\"npm\");\n await runPackageInstall(projectDir, npm);\n p.log.success(\"Dependencies installed (npm)\");\n } else {\n const message =\n error instanceof Error ? error.message : String(error);\n throw new Error(`Dependency install failed: ${message}`);\n }\n }\n } else {\n p.log.info(\n color.dim(`Skipped install · run ${pm.id} install in the project folder`),\n );\n }\n\n if (ran.length) {\n p.log.info(`Installers: ${ran.join(\", \")}`);\n } else {\n p.log.step(color.dim(\"No optional installers (base template only).\"));\n }\n\n return projectDir;\n}\n","import { spawn } from \"node:child_process\";\n\nimport type { PackageManagerMeta } from \"./package-manager.js\";\n\n/**\n * Run package-manager install without blocking the event loop.\n * Uses inherited stdio so the user sees real progress (download bars, etc.).\n */\nexport function runPackageInstall(\n projectDir: string,\n pm: PackageManagerMeta,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(pm.id, pm.installArgs, {\n cwd: projectDir,\n stdio: \"inherit\",\n env: process.env,\n shell: process.platform === \"win32\",\n });\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(new Error(`${pm.id} ${pm.installArgs.join(\" \")} exited with ${code}`));\n });\n });\n}\n\n/** Yield so clack spinner can paint an updated message before heavy work. */\nexport function yieldUi(): Promise<void> {\n return new Promise((resolve) => setImmediate(resolve));\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nconst TEXT_EXT = new Set([\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".json\",\n \".md\",\n \".mdc\",\n \".css\",\n \".scss\",\n \".html\",\n \".svg\",\n \".yml\",\n \".yaml\",\n \".toml\",\n \".env\",\n \".example\",\n \".gitignore\",\n \".npmrc\",\n]);\n\nexport type TokenMap = Record<string, string>;\n\nfunction shouldRewrite(filePath: string): boolean {\n const base = path.basename(filePath);\n if (base === \".env.example\" || base === \"LICENSE\") return true;\n const ext = path.extname(filePath);\n return TEXT_EXT.has(ext) || base.startsWith(\".\");\n}\n\nfunction applyTokens(contents: string, tokens: TokenMap): string {\n let out = contents;\n for (const [key, value] of Object.entries(tokens)) {\n out = out.split(key).join(value);\n }\n return out;\n}\n\n/** Walk project dir and replace `__TOKEN__` placeholders in text files. */\nexport async function replaceTokensInTree(\n root: string,\n tokens: TokenMap,\n): Promise<void> {\n const entries = await fs.readdir(root, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(root, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name === \".git\") continue;\n await replaceTokensInTree(full, tokens);\n continue;\n }\n if (!shouldRewrite(full)) continue;\n const raw = await fs.readFile(full, \"utf8\");\n const next = applyTokens(raw, tokens);\n if (next !== raw) {\n await fs.writeFile(full, next, \"utf8\");\n }\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { Installer } from \"./types.js\";\n\nconst HTTP_ENVELOPE = `import { env } from \"@/lib/env\";\n\ntype ApiEnvelope<T> = {\n result?: T;\n status?: number;\n success?: boolean;\n messages?: unknown;\n};\n\nfunction unwrapEnvelope<T>(data: unknown): T {\n if (data && typeof data === \"object\" && \"result\" in data) {\n const result = (data as ApiEnvelope<T>).result;\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n return data as T;\n}\n\n/**\n * JSON fetch helper that unwraps \\`{ result, status, success, messages }\\` envelopes.\n */\nexport async function apiFetch<T>(\n path: string,\n init?: RequestInit,\n): Promise<T> {\n const url = path.startsWith(\"http\")\n ? path\n : \\`\\${env.NEXT_PUBLIC_API_URL.replace(/\\\\/$/, \"\")}/\\${path.replace(/^\\\\//, \"\")}\\`;\n\n const response = await fetch(url, {\n ...init,\n headers: {\n Accept: \"application/json\",\n ...(init?.headers ?? {}),\n },\n });\n\n if (!response.ok) {\n throw new Error(\\`API \\${response.status}: \\${response.statusText}\\`);\n }\n\n const json: unknown = await response.json();\n return unwrapEnvelope<T>(json);\n}\n`;\n\nconst RULE = `---\ndescription: API envelope unwrap for apiFetch\nglobs: src/lib/http.ts\nalwaysApply: false\n---\n\n# API envelope\n\n\\`apiFetch\\` unwraps \\`{ result, status, success, messages }\\` when present.\nPrefer generated \\`src/endpoints/*\\` + axios when endpoints codegen is enabled.\n`;\n\nexport const apiEnvelopeInstaller: Installer = {\n id: \"api-envelope\",\n active: (o) => o.apiEnvelope,\n async run({ projectDir, options }) {\n // When endpoints are on, axios path uses unwrapApiResult; still upgrade http.ts for RSC fetch.\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"http.ts\"),\n HTTP_ENVELOPE,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"api-envelope.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"http\", \"envelope.md\"),\n `# API envelope\n\n\\`src/lib/http.ts\\` → \\`apiFetch\\` unwraps \\`result\\` from standard envelopes.\n${options.endpoints ? \"Endpoints/axios: use `unwrapApiResult` from `@/utils/api-result`.\\n\" : \"\"}\n`,\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { ScaffoldOptions } from \"../types.js\";\n\nexport function needsAppProviders(options: ScaffoldOptions): boolean {\n return (\n options.data === \"tanstack-query\" ||\n options.store === \"redux\" ||\n options.styling === \"mui\" ||\n options.i18n ||\n options.darkMode\n );\n}\n\n/** Generate client `AppProviders` composing enabled providers (outer → inner). */\nexport function generateAppProvidersSource(options: ScaffoldOptions): string {\n const imports: string[] = [\n `\"use client\";`,\n ``,\n `import type { ReactNode } from \"react\";`,\n ];\n const props: string[] = [`children: ReactNode`];\n\n if (options.i18n) {\n imports.push(`import { NextIntlClientProvider } from \"next-intl\";`);\n props.push(`messages: Record<string, unknown>`);\n }\n if (options.darkMode) {\n imports.push(`import { ThemeProvider } from \"@/providers/theme-provider\";`);\n }\n if (options.styling === \"mui\") {\n imports.push(`import { MuiProvider } from \"@/providers/mui-provider\";`);\n }\n if (options.store === \"redux\") {\n imports.push(`import { StoreProvider } from \"@/providers/store-provider\";`);\n }\n if (options.data === \"tanstack-query\") {\n imports.push(`import { QueryProvider } from \"@/providers/query-provider\";`);\n }\n\n const openers: string[] = [];\n const closers: string[] = [];\n\n if (options.i18n) {\n openers.push(` <NextIntlClientProvider messages={messages}>`);\n closers.unshift(` </NextIntlClientProvider>`);\n }\n if (options.darkMode) {\n openers.push(` <ThemeProvider>`);\n closers.unshift(` </ThemeProvider>`);\n }\n if (options.styling === \"mui\") {\n openers.push(` <MuiProvider>`);\n closers.unshift(` </MuiProvider>`);\n }\n if (options.store === \"redux\") {\n openers.push(` <StoreProvider>`);\n closers.unshift(` </StoreProvider>`);\n }\n if (options.data === \"tanstack-query\") {\n openers.push(` <QueryProvider>`);\n closers.unshift(` </QueryProvider>`);\n }\n\n return `${imports.join(\"\\n\")}\n\ntype AppProvidersProps = {\n ${props.join(\";\\n \")};\n};\n\n/**\n * Single composition root for client providers.\n * Feature installers add leaf providers; this file wraps them in a stable order.\n */\nexport function AppProviders({ children${options.i18n ? \", messages\" : \"\"} }: AppProvidersProps) {\n return (\n${openers.join(\"\\n\")}\n {children}\n${closers.join(\"\\n\")}\n );\n}\n`;\n}\n\nexport async function writeAppProviders(\n projectDir: string,\n options: ScaffoldOptions,\n): Promise<void> {\n if (!needsAppProviders(options)) return;\n\n const providersDir = path.join(projectDir, \"src\", \"providers\");\n await fs.ensureDir(providersDir);\n await fs.remove(path.join(providersDir, \".gitkeep\"));\n await fs.writeFile(\n path.join(providersDir, \"app-providers.tsx\"),\n generateAppProvidersSource(options),\n \"utf8\",\n );\n}\n\n/** Rewrite root layout to use AppProviders (+ i18n locale when enabled). */\nexport async function wireRootLayout(\n projectDir: string,\n options: ScaffoldOptions,\n): Promise<void> {\n const layoutPath = path.join(projectDir, \"src\", \"app\", \"layout.tsx\");\n const useProviders = needsAppProviders(options);\n const dark = options.darkMode;\n const i18n = options.i18n;\n\n const htmlLang = i18n ? \"{locale}\" : `\"en\"`;\n const htmlExtra = dark ? \" suppressHydrationWarning\" : \"\";\n\n const imports = [\n `import type { Metadata } from \"next\";`,\n ``,\n `import \"./globals.css\";`,\n ];\n if (useProviders) {\n imports.push(\n ``,\n `import { AppProviders } from \"@/providers/app-providers\";`,\n );\n }\n if (i18n) {\n imports.push(\n `import { getLocale, getMessages } from \"next-intl/server\";`,\n );\n }\n\n const bodyInner = useProviders\n ? i18n\n ? ` <AppProviders messages={messages}>\n <main>{children}</main>\n </AppProviders>`\n : ` <AppProviders>\n <main>{children}</main>\n </AppProviders>`\n : ` <main>{children}</main>`;\n\n const fnBody = i18n\n ? ` const locale = await getLocale();\n const messages = await getMessages();\n\n return (\n <html lang=${htmlLang}${htmlExtra}>\n <body>\n${bodyInner}\n </body>\n </html>\n );`\n : ` return (\n <html lang=${htmlLang}${htmlExtra}>\n <body>\n${bodyInner}\n </body>\n </html>\n );`;\n\n const source = `${imports.join(\"\\n\")}\n\nexport const metadata: Metadata = {\n title: \"__PROJECT_NAME__\",\n description: \"Generated with next-style-guide\",\n};\n\nexport default ${i18n ? \"async \" : \"\"}function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n${fnBody}\n}\n`;\n\n // Tokens may already be replaced; if layout still has placeholder keep it —\n // replaceTokens runs before installers, so project name is already applied.\n // Read existing metadata title if present.\n let final = source;\n if (await fs.pathExists(layoutPath)) {\n const existing = await fs.readFile(layoutPath, \"utf8\");\n const titleMatch = existing.match(/title:\\s*\"([^\"]+)\"/);\n if (titleMatch?.[1] && titleMatch[1] !== \"__PROJECT_NAME__\") {\n final = final.replace(\n 'title: \"__PROJECT_NAME__\"',\n `title: \"${titleMatch[1]}\"`,\n );\n }\n }\n\n await fs.writeFile(layoutPath, final, \"utf8\");\n}\n","import type { Installer } from \"./types.js\";\nimport {\n needsAppProviders,\n wireRootLayout,\n writeAppProviders,\n} from \"../helpers/app-providers.js\";\n\n/**\n * Compose client providers into `app-providers.tsx` and wire root layout once.\n * Runs after leaf provider installers; before surface.\n */\nexport const appProvidersInstaller: Installer = {\n id: \"app-providers\",\n active: (o) => needsAppProviders(o) || o.i18n || o.darkMode,\n async run({ projectDir, options }) {\n await writeAppProviders(projectDir, options);\n await wireRootLayout(projectDir, options);\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst AUTH_TS = `import NextAuth from \"next-auth\";\nimport Credentials from \"next-auth/providers/credentials\";\n\n/**\n * Auth.js — Credentials demo provider.\n * Replace \\`authorize\\` with your API/DB lookup. Set \\`AUTH_SECRET\\` in env.\n */\nexport const { handlers, auth, signIn, signOut } = NextAuth({\n providers: [\n Credentials({\n name: \"Credentials\",\n credentials: {\n email: { label: \"Email\", type: \"email\" },\n password: { label: \"Password\", type: \"password\" },\n },\n async authorize(credentials) {\n if (!credentials?.email || !credentials?.password) {\n return null;\n }\n // Demo only — wire to your backend.\n return {\n id: \"1\",\n email: String(credentials.email),\n name: \"Demo User\",\n };\n },\n }),\n ],\n pages: {\n signIn: \"/login\",\n },\n session: { strategy: \"jwt\" },\n trustHost: true,\n});\n`;\n\nconst ROUTE = `import { handlers } from \"@/lib/auth\";\n\nexport const { GET, POST } = handlers;\n`;\n\nconst MIDDLEWARE = `import { auth } from \"@/lib/auth\";\nimport { NextResponse } from \"next/server\";\n\nconst publicPaths = [\"/login\", \"/api/auth\"];\n\nexport default auth((req) => {\n const { pathname } = req.nextUrl;\n const isPublic = publicPaths.some(\n (p) => pathname === p || pathname.startsWith(\\`\\${p}/\\`),\n );\n\n if (!req.auth && !isPublic) {\n const url = new URL(\"/login\", req.nextUrl.origin);\n url.searchParams.set(\"callbackUrl\", pathname);\n return NextResponse.redirect(url);\n }\n\n if (req.auth && pathname === \"/login\") {\n return NextResponse.redirect(new URL(\"/\", req.nextUrl.origin));\n }\n\n return NextResponse.next();\n});\n\nexport const config = {\n matcher: [\"/((?!_next/static|_next/image|favicon.ico).*)\"],\n};\n`;\n\nconst LOGIN_PAGE = `import { Suspense } from \"react\";\n\nimport { LoginForm } from \"@/app/login/_components/login-form\";\n\nexport default function LoginPage() {\n return (\n <section className=\"hero\">\n <h1>Sign in</h1>\n <p>Auth.js Credentials demo — replace authorize with your API.</p>\n <Suspense fallback={<p>Loading…</p>}>\n <LoginForm />\n </Suspense>\n </section>\n );\n}\n`;\n\nconst LOGIN_FORM = `\"use client\";\n\nimport { useState, type FormEvent } from \"react\";\nimport { signIn } from \"next-auth/react\";\nimport { useRouter, useSearchParams } from \"next/navigation\";\n\nexport function LoginForm() {\n const router = useRouter();\n const searchParams = useSearchParams();\n const callbackUrl = searchParams.get(\"callbackUrl\") ?? \"/\";\n const [error, setError] = useState<string | null>(null);\n const [pending, setPending] = useState(false);\n\n async function onSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setPending(true);\n setError(null);\n const form = new FormData(event.currentTarget);\n const result = await signIn(\"credentials\", {\n email: String(form.get(\"email\") ?? \"\"),\n password: String(form.get(\"password\") ?? \"\"),\n redirect: false,\n });\n setPending(false);\n if (result?.error) {\n setError(\"Invalid credentials\");\n return;\n }\n router.push(callbackUrl);\n router.refresh();\n }\n\n return (\n <form onSubmit={onSubmit} className=\"card\" style={{ marginTop: \"1.5rem\" }}>\n <label style={{ display: \"grid\", gap: \"0.35rem\", marginBottom: \"0.75rem\" }}>\n Email\n <input name=\"email\" type=\"email\" required autoComplete=\"email\" />\n </label>\n <label style={{ display: \"grid\", gap: \"0.35rem\", marginBottom: \"0.75rem\" }}>\n Password\n <input\n name=\"password\"\n type=\"password\"\n required\n autoComplete=\"current-password\"\n />\n </label>\n {error ? <p style={{ color: \"crimson\" }}>{error}</p> : null}\n <button type=\"submit\" disabled={pending}>\n {pending ? \"Signing in…\" : \"Sign in\"}\n </button>\n </form>\n );\n}\n`;\n\nconst RULE = `---\ndescription: Auth.js (NextAuth) conventions\nglobs: src/lib/auth.ts,src/app/api/auth/**/*,src/middleware.ts,src/app/login/**\nalwaysApply: false\n---\n\n# Auth.js\n\n- Config: \\`src/lib/auth.ts\\` (Credentials demo — replace \\`authorize\\`).\n- Route handlers: \\`src/app/api/auth/[...nextauth]/route.ts\\`.\n- Middleware: \\`src/middleware.ts\\` protects non-public routes; public: \\`/login\\`, \\`/api/auth\\`.\n- Login UI: \\`src/app/login/\\`.\n- Env: \\`AUTH_SECRET\\` (required in production).\n- Prefer \\`auth()\\` in Server Components; \\`signIn\\` / \\`signOut\\` on the client.\n`;\n\nexport const authAuthjsInstaller: Installer = {\n id: \"auth-authjs\",\n active: (o) => o.auth === \"authjs\",\n async run({ projectDir }) {\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"auth.ts\"),\n AUTH_TS,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(\n projectDir,\n \"src\",\n \"app\",\n \"api\",\n \"auth\",\n \"[...nextauth]\",\n \"route.ts\",\n ),\n ROUTE,\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"middleware.ts\"),\n MIDDLEWARE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"src\", \"app\", \"login\", \"page.tsx\"),\n LOGIN_PAGE,\n );\n await fs.outputFile(\n path.join(\n projectDir,\n \"src\",\n \"app\",\n \"login\",\n \"_components\",\n \"login-form\",\n \"index.tsx\",\n ),\n LOGIN_FORM,\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"auth.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"auth\", \"authjs.md\"),\n `# Auth.js\n\n- \\`src/lib/auth.ts\\` — Credentials demo (replace \\`authorize\\`)\n- \\`src/app/api/auth/[...nextauth]/route.ts\\`\n- \\`src/middleware.ts\\` — protect routes; public \\`/login\\` + \\`/api/auth\\`\n- \\`src/app/login/\\` — sample login page\n- Env: \\`AUTH_SECRET\\`\n`,\n );\n\n const envPath = path.join(projectDir, \".env.example\");\n if (await fs.pathExists(envPath)) {\n let env = await fs.readFile(envPath, \"utf8\");\n if (!env.includes(\"AUTH_SECRET\")) {\n env += `\\n# Auth.js — generate with: openssl rand -base64 32\\nAUTH_SECRET=\\n`;\n await fs.writeFile(envPath, env, \"utf8\");\n }\n }\n\n await addDependencies(projectDir, {\n \"next-auth\": \"^5.0.0-beta.25\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\ntype PkgJson = {\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\nasync function readPkg(projectDir: string): Promise<{ pkgPath: string; pkg: PkgJson }> {\n const pkgPath = path.join(projectDir, \"package.json\");\n const pkg = (await fs.readJson(pkgPath)) as PkgJson;\n return { pkgPath, pkg };\n}\n\nfunction sortRecord(record: Record<string, string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(record).sort(([a], [b]) => a.localeCompare(b)),\n );\n}\n\nexport async function addDependencies(\n projectDir: string,\n deps: Record<string, string>,\n kind: \"dependencies\" | \"devDependencies\" = \"dependencies\",\n): Promise<void> {\n const { pkgPath, pkg } = await readPkg(projectDir);\n pkg[kind] = sortRecord({\n ...(pkg[kind] ?? {}),\n ...deps,\n });\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n}\n\nexport async function addScripts(\n projectDir: string,\n scripts: Record<string, string>,\n): Promise<void> {\n const { pkgPath, pkg } = await readPkg(projectDir);\n pkg.scripts = {\n ...(pkg.scripts ?? {}),\n ...scripts,\n };\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n}\n\nexport async function mergePackageField(\n projectDir: string,\n field: string,\n value: unknown,\n): Promise<void> {\n const { pkgPath, pkg } = await readPkg(projectDir);\n pkg[field] = value;\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n}\n\nexport async function removeDependencies(\n projectDir: string,\n names: string[],\n kind: \"dependencies\" | \"devDependencies\" = \"dependencies\",\n): Promise<void> {\n const { pkgPath, pkg } = await readPkg(projectDir);\n if (!pkg[kind]) return;\n for (const name of names) {\n delete pkg[kind]![name];\n }\n pkg[kind] = sortRecord(pkg[kind]!);\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { Installer } from \"./types.js\";\n\nfunction tokenStorage(slug: string): string {\n const accessKey = `${slug}.accessToken`;\n const refreshKey = `${slug}.refreshToken`;\n\n return `const ACCESS_TOKEN_KEY = \"${accessKey}\";\nconst REFRESH_TOKEN_KEY = \"${refreshKey}\";\n\nexport type AuthTokens = {\n access: string;\n refresh: string;\n};\n\nexport function getAccessToken(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n return window.localStorage.getItem(ACCESS_TOKEN_KEY);\n}\n\nexport function getRefreshToken(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n return window.localStorage.getItem(REFRESH_TOKEN_KEY);\n}\n\nexport function setTokens({ access, refresh }: AuthTokens) {\n window.localStorage.setItem(ACCESS_TOKEN_KEY, access);\n window.localStorage.setItem(REFRESH_TOKEN_KEY, refresh);\n}\n\nexport function clearTokens() {\n if (typeof window === \"undefined\") {\n return;\n }\n window.localStorage.removeItem(ACCESS_TOKEN_KEY);\n window.localStorage.removeItem(REFRESH_TOKEN_KEY);\n}\n`;\n}\n\nconst AXIOS_JWT = `import axios, { type AxiosError, type InternalAxiosRequestConfig } from \"axios\";\n\nimport { unwrapApiResult } from \"@/utils/api-result\";\nimport {\n clearTokens,\n getAccessToken,\n getRefreshToken,\n setTokens,\n} from \"@/utils/token-storage\";\n\ntype RetryConfig = InternalAxiosRequestConfig & { _retry?: boolean };\n\nconst baseURL = process.env.NEXT_PUBLIC_API_URL ?? \"\";\n\n/** Shared Axios client for \\`src/endpoints/*\\`. Do not call from UI directly. */\nexport const api = axios.create({\n baseURL,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n});\n\napi.interceptors.request.use((config) => {\n const accessToken = getAccessToken();\n if (accessToken) {\n config.headers.setAuthorization(\\`Bearer \\${accessToken}\\`);\n }\n if (typeof FormData !== \"undefined\" && config.data instanceof FormData) {\n config.headers.delete(\"Content-Type\");\n }\n return config;\n});\n\nlet refreshPromise: Promise<string | null> | null = null;\n\nasync function refreshAccessToken(): Promise<string | null> {\n const refresh = getRefreshToken();\n if (!refresh || !baseURL) {\n return null;\n }\n\n try {\n const { data } = await axios.post(\\`\\${baseURL}/auth/refresh/\\`, { refresh });\n const payload = unwrapApiResult<{ access?: string; refresh?: string }>(data);\n const access = payload.access;\n if (!access) {\n clearTokens();\n return null;\n }\n setTokens({ access, refresh: payload.refresh ?? refresh });\n return access;\n } catch {\n clearTokens();\n return null;\n }\n}\n\nfunction shouldSkipRefresh(url: string | undefined) {\n if (!url) return false;\n return (\n url.includes(\"/auth/login\") ||\n url.includes(\"/auth/refresh\") ||\n url.includes(\"/auth/logout\")\n );\n}\n\napi.interceptors.response.use(\n (response) => response,\n async (error: AxiosError) => {\n const original = error.config as RetryConfig | undefined;\n\n if (\n !original ||\n error.response?.status !== 401 ||\n original._retry ||\n shouldSkipRefresh(original.url)\n ) {\n return Promise.reject(error);\n }\n\n original._retry = true;\n refreshPromise ??= refreshAccessToken().finally(() => {\n refreshPromise = null;\n });\n\n const access = await refreshPromise;\n if (!access) {\n return Promise.reject(error);\n }\n\n original.headers.setAuthorization(\\`Bearer \\${access}\\`);\n return api(original);\n },\n);\n`;\n\nconst RULE = `---\ndescription: JWT auth (Bearer + refresh) helpers\nglobs: src/utils/token-storage.ts,src/utils/axios-instance.ts,src/**/*auth*.{ts,tsx}\nalwaysApply: false\n---\n\n# Auth (JWT)\n\n- Tokens: \\`src/utils/token-storage.ts\\` (access + refresh in \\`localStorage\\`).\n- Axios: Bearer on requests; 401 → \\`/auth/refresh/\\` once, then retry.\n- Do not store tokens in cookies unless you intentionally change the strategy.\n- Login/logout UI should call \\`setTokens\\` / \\`clearTokens\\` — never invent a second storage key.\n`;\n\nexport const authJwtInstaller: Installer = {\n id: \"auth-jwt\",\n active: (o) => o.auth === \"jwt\",\n async run({ projectDir, options }) {\n await fs.ensureDir(path.join(projectDir, \"src\", \"utils\"));\n await fs.remove(path.join(projectDir, \"src\", \"utils\", \".gitkeep\"));\n await fs.writeFile(\n path.join(projectDir, \"src\", \"utils\", \"token-storage.ts\"),\n tokenStorage(options.slug),\n \"utf8\",\n );\n\n if (options.endpoints) {\n await fs.writeFile(\n path.join(projectDir, \"src\", \"utils\", \"axios-instance.ts\"),\n AXIOS_JWT,\n \"utf8\",\n );\n }\n\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"auth.mdc\"),\n RULE,\n \"utf8\",\n );\n\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"auth\", \"jwt.md\"),\n `# JWT auth\n\n- \\`src/utils/token-storage.ts\\` — access/refresh in localStorage\n- When endpoints are enabled, \\`axios-instance\\` attaches Bearer and refreshes on 401 via \\`POST /auth/refresh/\\`\n`,\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport {\n ciInstallCommand,\n getPackageManager,\n} from \"../helpers/package-manager.js\";\nimport type { ScaffoldOptions } from \"../types.js\";\nimport type { Installer } from \"./types.js\";\n\nfunction workflowYaml(options: ScaffoldOptions): string {\n const pm = getPackageManager(options.packageManager);\n const run = (script: string) => pm.runScript(script);\n\n const setupSteps: string[] = [\n ` - name: Checkout\n uses: actions/checkout@v4\n`,\n ];\n\n if (options.packageManager === \"pnpm\") {\n setupSteps.push(` - name: Setup pnpm\n uses: pnpm/action-setup@v4\n`);\n }\n\n if (options.packageManager === \"yarn\") {\n setupSteps.push(` - name: Enable Corepack\n run: corepack enable\n`);\n }\n\n setupSteps.push(` - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 22\n cache: ${options.packageManager}\n`);\n\n const steps: string[] = [\n ...setupSteps,\n ` - name: Install\n run: ${ciInstallCommand(options.packageManager)}\n\n - name: Typecheck\n run: ${run(\"typecheck\")}`,\n ];\n\n if (options.eslint) {\n steps.push(`\n - name: Lint\n run: ${run(\"lint\")}`);\n }\n\n if (options.prettier) {\n steps.push(`\n - name: Format check\n run: ${run(\"format:check\")}`);\n }\n\n if (options.testing) {\n steps.push(`\n - name: Test\n run: ${run(\"test\")}`);\n }\n\n steps.push(`\n - name: Build\n run: ${run(\"build\")}\n env:\n NEXT_PUBLIC_APP_URL: http://localhost:3000\n NEXT_PUBLIC_API_URL: http://localhost:8000`);\n\n return `name: CI\n\non:\n push:\n branches: [main, master]\n pull_request:\n\nconcurrency:\n group: ci-\\${{ github.workflow }}-\\${{ github.ref }}\n cancel-in-progress: true\n\njobs:\n checks:\n name: Checks\n runs-on: ubuntu-latest\n timeout-minutes: 20\n steps:\n${steps.join(\"\\n\")}\n`;\n}\n\nexport const ciInstaller: Installer = {\n id: \"ci\",\n active: (o) => o.ci,\n async run({ projectDir, options }) {\n const addon = path.join(ADDONS_DIR, \"ci\");\n\n await fs.outputFile(\n path.join(projectDir, \".github\", \"workflows\", \"ci.yml\"),\n workflowYaml(options),\n );\n await fs.copy(\n path.join(addon, \".cursor\", \"rules\", \"ci.mdc\"),\n path.join(projectDir, \".cursor\", \"rules\", \"ci.mdc\"),\n );\n await fs.copy(\n path.join(addon, \"docs\", \"style-guide\", \"ops\", \"ci.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"ops\", \"ci.md\"),\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst THEME_PROVIDER = `\"use client\";\n\nimport { ThemeProvider as NextThemesProvider } from \"next-themes\";\nimport type { ReactNode } from \"react\";\n\nexport function ThemeProvider({ children }: { children: ReactNode }) {\n return (\n <NextThemesProvider attribute=\"class\" defaultTheme=\"system\" enableSystem>\n {children}\n </NextThemesProvider>\n );\n}\n`;\n\nconst RULE = `---\ndescription: Dark mode (next-themes) with Tailwind\nglobs: src/providers/theme-provider.tsx,src/app/globals.css\nalwaysApply: false\n---\n\n# Dark mode\n\n- \\`ThemeProvider\\` in \\`src/providers/theme-provider.tsx\\` (composed via \\`AppProviders\\`).\n- Tailwind: use \\`dark:\\` variants; \\`html\\` gets \\`class=\"dark\"\\` from next-themes.\n- Prefer \\`defaultTheme=\"system\"\\`.\n`;\n\nexport const darkModeInstaller: Installer = {\n id: \"dark-mode\",\n active: (o) => o.darkMode && o.styling === \"tailwind\",\n async run({ projectDir }) {\n const providersDir = path.join(projectDir, \"src\", \"providers\");\n await fs.ensureDir(providersDir);\n await fs.remove(path.join(providersDir, \".gitkeep\"));\n await fs.writeFile(\n path.join(providersDir, \"theme-provider.tsx\"),\n THEME_PROVIDER,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"dark-mode.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"ui\", \"dark-mode.md\"),\n `# Dark mode\n\nnext-themes + Tailwind \\`dark:\\` variants.\nProvider: \\`src/providers/theme-provider.tsx\\` (via \\`AppProviders\\`).\n`,\n );\n\n // Ensure dark variant works with Tailwind v4 class strategy\n const globalsPath = path.join(projectDir, \"src\", \"app\", \"globals.css\");\n if (await fs.pathExists(globalsPath)) {\n let css = await fs.readFile(globalsPath, \"utf8\");\n if (!css.includes(\"@custom-variant dark\")) {\n css = css.replace(\n `@import \"tailwindcss\";\\n`,\n `@import \"tailwindcss\";\\n\\n@custom-variant dark (&:where(.dark, .dark *));\\n`,\n );\n await fs.writeFile(globalsPath, css, \"utf8\");\n }\n }\n\n await addDependencies(projectDir, {\n \"next-themes\": \"^0.4.4\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { Installer } from \"./types.js\";\n\nconst COMPOSE = `services:\n api:\n image: nginx:alpine\n ports:\n - \"8000:80\"\n volumes:\n - ./docker/api-mock:/usr/share/nginx/html:ro\n # Replace this stub with your real API image when ready.\n # JWT apps expect NEXT_PUBLIC_API_URL=http://localhost:8000\n\n # Example (uncomment when you have a backend image):\n # api:\n # image: your-org/api:latest\n # ports:\n # - \"8000:8000\"\n # environment:\n # DATABASE_URL: postgres://...\n`;\n\nconst MOCK_README = `# Local API stub\n\nPlaceholder for Docker Compose. Point \\`NEXT_PUBLIC_API_URL\\` at \\`http://localhost:8000\\`.\n\nReplace the nginx stub in \\`docker-compose.yml\\` with your real API service.\n`;\n\nconst RULE = `---\ndescription: Local API via Docker Compose (JWT + endpoints)\nglobs: docker-compose.yml,docker/api-mock/**\nalwaysApply: false\n---\n\n# Docker Compose (local API)\n\n- \\`docker-compose.yml\\` — stub API on port 8000 for JWT + endpoints apps.\n- \\`docker compose up\\` then set \\`NEXT_PUBLIC_API_URL=http://localhost:8000\\`.\n- Swap the stub service for your real backend image before production work.\n`;\n\nexport const dockerComposeInstaller: Installer = {\n id: \"docker-compose\",\n active: (o) => o.auth === \"jwt\" && o.endpoints,\n async run({ projectDir }) {\n await fs.writeFile(\n path.join(projectDir, \"docker-compose.yml\"),\n COMPOSE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docker\", \"api-mock\", \"README.md\"),\n MOCK_README,\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"docker-compose.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"ops\", \"docker-compose.md\"),\n `# Docker Compose (local API)\n\n\\`\\`\\`bash\ndocker compose up\n\\`\\`\\`\n\nStub listens on \\`http://localhost:8000\\`. Align with \\`NEXT_PUBLIC_API_URL\\`.\n`,\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport { getPackageManager } from \"../helpers/package-manager.js\";\nimport type { PackageManager } from \"../types.js\";\nimport type { Installer } from \"./types.js\";\n\nconst STANDALONE_CONFIG = `import type { NextConfig } from \"next\";\n\nconst nextConfig: NextConfig = {\n reactStrictMode: true,\n output: \"standalone\",\n};\n\nexport default nextConfig;\n`;\n\nfunction dockerfileFor(pm: PackageManager): string {\n if (pm === \"npm\") {\n return `# ---------------------------------------------------------------------------- #\n# Stage 1: Base & Dependencies #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS builder\n\nRUN apk add --no-cache libc6-compat\n\nWORKDIR /app\n\nENV HUSKY=0 \\\\\n NEXT_TELEMETRY_DISABLED=1\n\nARG NEXT_PUBLIC_APP_URL=http://localhost:3000\nARG NEXT_PUBLIC_API_URL=http://localhost:8000\n\nENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL \\\\\n NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL\n\nCOPY package.json package-lock.json .npmrc* ./\nRUN --mount=type=cache,id=npm,target=/root/.npm \\\\\n npm ci\n\nCOPY . /app/\n\nRUN npm run build\n\n# ---------------------------------------------------------------------------- #\n# Stage 2: Production Runner #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS runner\n\nRUN apk add --no-cache curl\n\nWORKDIR /app\n\nENV NODE_ENV=production \\\\\n NEXT_TELEMETRY_DISABLED=1 \\\\\n HOSTNAME=0.0.0.0 \\\\\n PORT=3000\n\nCOPY --from=builder /app/public ./public\nCOPY --from=builder --chown=node:node /app/.next/standalone ./\nCOPY --from=builder --chown=node:node /app/.next/static ./.next/static\n\nUSER node\n\nEXPOSE 3000\n\nHEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \\\\\n CMD curl -fsS http://127.0.0.1:3000/ || exit 1\n\nCMD [\"node\", \"server.js\"]\n`;\n }\n\n if (pm === \"yarn\") {\n return `# ---------------------------------------------------------------------------- #\n# Stage 1: Base & Dependencies #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS builder\n\nRUN apk add --no-cache libc6-compat\nRUN corepack enable && corepack prepare yarn@1.22.22 --activate\n\nWORKDIR /app\n\nENV HUSKY=0 \\\\\n NEXT_TELEMETRY_DISABLED=1\n\nARG NEXT_PUBLIC_APP_URL=http://localhost:3000\nARG NEXT_PUBLIC_API_URL=http://localhost:8000\n\nENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL \\\\\n NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL\n\nCOPY package.json yarn.lock .npmrc* ./\nRUN --mount=type=cache,id=yarn,target=/usr/local/share/.cache/yarn \\\\\n yarn install --frozen-lockfile\n\nCOPY . /app/\n\nRUN yarn build\n\n# ---------------------------------------------------------------------------- #\n# Stage 2: Production Runner #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS runner\n\nRUN apk add --no-cache curl\n\nWORKDIR /app\n\nENV NODE_ENV=production \\\\\n NEXT_TELEMETRY_DISABLED=1 \\\\\n HOSTNAME=0.0.0.0 \\\\\n PORT=3000\n\nCOPY --from=builder /app/public ./public\nCOPY --from=builder --chown=node:node /app/.next/standalone ./\nCOPY --from=builder --chown=node:node /app/.next/static ./.next/static\n\nUSER node\n\nEXPOSE 3000\n\nHEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \\\\\n CMD curl -fsS http://127.0.0.1:3000/ || exit 1\n\nCMD [\"node\", \"server.js\"]\n`;\n }\n\n // pnpm\n return `# ---------------------------------------------------------------------------- #\n# Stage 1: Base & Dependencies #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS builder\n\nRUN apk add --no-cache libc6-compat\nRUN corepack enable && corepack prepare pnpm@9.15.0 --activate\n\nWORKDIR /app\n\nENV HUSKY=0 \\\\\n NEXT_TELEMETRY_DISABLED=1\n\nARG NEXT_PUBLIC_APP_URL=http://localhost:3000\nARG NEXT_PUBLIC_API_URL=http://localhost:8000\n\nENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL \\\\\n NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL\n\nCOPY package.json pnpm-lock.yaml .npmrc* ./\nRUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store \\\\\n pnpm install --frozen-lockfile\n\nCOPY . /app/\n\nRUN pnpm build\n\n# ---------------------------------------------------------------------------- #\n# Stage 2: Production Runner #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS runner\n\nRUN apk add --no-cache curl\n\nWORKDIR /app\n\nENV NODE_ENV=production \\\\\n NEXT_TELEMETRY_DISABLED=1 \\\\\n HOSTNAME=0.0.0.0 \\\\\n PORT=3000\n\nCOPY --from=builder /app/public ./public\nCOPY --from=builder --chown=node:node /app/.next/standalone ./\nCOPY --from=builder --chown=node:node /app/.next/static ./.next/static\n\nUSER node\n\nEXPOSE 3000\n\nHEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \\\\\n CMD curl -fsS http://127.0.0.1:3000/ || exit 1\n\nCMD [\"node\", \"server.js\"]\n`;\n}\n\nexport const dockerInstaller: Installer = {\n id: \"docker\",\n active: (o) => o.deploy === \"docker\",\n async run({ projectDir, options }) {\n const addon = path.join(ADDONS_DIR, \"docker\");\n const pm = getPackageManager(options.packageManager);\n\n await fs.ensureDir(path.join(projectDir, \"docker\"));\n await fs.writeFile(\n path.join(projectDir, \"docker\", \"production.Dockerfile\"),\n dockerfileFor(options.packageManager),\n \"utf8\",\n );\n await fs.copy(\n path.join(addon, \".dockerignore\"),\n path.join(projectDir, \".dockerignore\"),\n );\n await fs.copy(\n path.join(addon, \".cursor\", \"rules\", \"docker.mdc\"),\n path.join(projectDir, \".cursor\", \"rules\", \"docker.mdc\"),\n );\n\n let doc = await fs.readFile(\n path.join(addon, \"docs\", \"style-guide\", \"ops\", \"docker.md\"),\n \"utf8\",\n );\n doc = doc\n .replaceAll(\"__PROJECT_SLUG__\", options.slug)\n .replaceAll(\"__PACKAGE_MANAGER__\", pm.id);\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"ops\", \"docker.md\"),\n doc,\n );\n\n await fs.writeFile(\n path.join(projectDir, \"next.config.ts\"),\n STANDALONE_CONFIG,\n \"utf8\",\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport { addDependencies, addScripts } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nexport const endpointsInstaller: Installer = {\n id: \"endpoints\",\n active: (o) => o.endpoints,\n async run({ projectDir }) {\n const addon = path.join(ADDONS_DIR, \"endpoints\");\n\n await fs.copy(\n path.join(addon, \"scripts\"),\n path.join(projectDir, \"scripts\"),\n );\n await fs.copy(\n path.join(addon, \"src\", \"endpoints\"),\n path.join(projectDir, \"src\", \"endpoints\"),\n );\n\n for (const file of [\n \"axios-instance.ts\",\n \"api-result.ts\",\n \"api-error.ts\",\n \"search-params.ts\",\n \"form-data.ts\",\n ]) {\n await fs.copy(\n path.join(addon, \"src\", \"utils\", file),\n path.join(projectDir, \"src\", \"utils\", file),\n );\n }\n await fs.remove(path.join(projectDir, \"src\", \"utils\", \".gitkeep\"));\n\n await fs.copy(\n path.join(addon, \".cursor\", \"rules\", \"endpoints.mdc\"),\n path.join(projectDir, \".cursor\", \"rules\", \"endpoints.mdc\"),\n );\n await fs.copy(\n path.join(addon, \"docs\", \"style-guide\", \"http\", \"endpoints.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"http\", \"endpoints.md\"),\n );\n\n await addDependencies(projectDir, { axios: \"^1.7.9\" });\n await addDependencies(\n projectDir,\n { tsx: \"^4.19.2\" },\n \"devDependencies\",\n );\n await addScripts(projectDir, {\n \"endpoints:generate\": \"tsx scripts/generate-endpoints.ts\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport { addDependencies, addScripts } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nexport const eslintInstaller: Installer = {\n id: \"eslint\",\n active: (o) => o.eslint,\n async run({ projectDir }) {\n const addon = path.join(ADDONS_DIR, \"eslint\");\n\n await fs.copy(\n path.join(addon, \"eslint.config.mjs\"),\n path.join(projectDir, \"eslint.config.mjs\"),\n );\n await fs.copy(\n path.join(addon, \".cursor\", \"rules\", \"eslint.mdc\"),\n path.join(projectDir, \".cursor\", \"rules\", \"eslint.mdc\"),\n );\n await fs.copy(\n path.join(addon, \"docs\", \"style-guide\", \"tooling\", \"eslint.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"tooling\", \"eslint.md\"),\n );\n\n await addDependencies(\n projectDir,\n {\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-import\": \"^2.32.0\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n },\n \"devDependencies\",\n );\n await addScripts(projectDir, {\n lint: \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport {\n addDependencies,\n addScripts,\n mergePackageField,\n} from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nexport const huskyInstaller: Installer = {\n id: \"husky\",\n active: (o) => o.husky,\n async run({ projectDir, options }) {\n const addon = path.join(ADDONS_DIR, \"husky\");\n\n await fs.copy(path.join(addon, \".husky\"), path.join(projectDir, \".husky\"));\n await fs.copy(\n path.join(addon, \"docs\", \"style-guide\", \"tooling\", \"husky.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"tooling\", \"husky.md\"),\n );\n\n try {\n await fs.chmod(path.join(projectDir, \".husky\", \"pre-commit\"), 0o755);\n } catch {\n // ignore\n }\n\n await addDependencies(\n projectDir,\n {\n husky: \"^9.1.7\",\n \"lint-staged\": \"^15.2.11\",\n },\n \"devDependencies\",\n );\n // `|| true` so install still succeeds if git isn't available\n await addScripts(projectDir, { prepare: \"husky || true\" });\n\n const tsHooks: string[] = [];\n if (options.prettier) tsHooks.push(\"prettier --write\");\n if (options.eslint) tsHooks.push(\"eslint --fix\");\n if (tsHooks.length === 0) tsHooks.push(\"echo 'husky: no lint/format tools'\");\n\n const lintStaged: Record<string, string[]> = {\n \"*.{js,jsx,ts,tsx}\": tsHooks,\n };\n if (options.prettier) {\n lintStaged[\"*.{json,css,scss,md,yaml,yml}\"] = [\"prettier --write\"];\n }\n\n await mergePackageField(projectDir, \"lint-staged\", lintStaged);\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst I18N_REQUEST = `import { getRequestConfig } from \"next-intl/server\";\n\nexport default getRequestConfig(async () => {\n const locale = \"en\";\n return {\n locale,\n messages: (await import(\\`../../messages/\\${locale}.json\\`)).default,\n };\n});\n`;\n\nconst MESSAGES_EN = `{\n \"Home\": {\n \"title\": \"Welcome\",\n \"body\": \"Scaffolded with next-style-guide.\"\n }\n}\n`;\n\nconst RULE = `---\ndescription: next-intl i18n conventions\nglobs: src/i18n/**,messages/**,src/providers/app-providers.tsx\nalwaysApply: false\n---\n\n# i18n (next-intl)\n\n- Request config: \\`src/i18n/request.ts\\`.\n- Messages: \\`messages/<locale>.json\\`.\n- Prefer \\`useTranslations\\` / \\`getTranslations\\` — avoid hardcoded copy when a key exists.\n- \\`NextIntlClientProvider\\` is composed in \\`AppProviders\\`; root layout loads locale/messages.\n`;\n\nexport const i18nInstaller: Installer = {\n id: \"i18n\",\n active: (o) => o.i18n,\n async run({ projectDir }) {\n await fs.outputFile(\n path.join(projectDir, \"src\", \"i18n\", \"request.ts\"),\n I18N_REQUEST,\n );\n await fs.outputFile(\n path.join(projectDir, \"messages\", \"en.json\"),\n MESSAGES_EN,\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"i18n.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"i18n\", \"overview.md\"),\n `# i18n\n\nnext-intl: \\`src/i18n/request.ts\\` + \\`messages/en.json\\`\nPlugin wired in \\`next.config.ts\\`. Provider via \\`AppProviders\\`.\n`,\n );\n\n const nextConfigPath = path.join(projectDir, \"next.config.ts\");\n if (await fs.pathExists(nextConfigPath)) {\n let nextConfig = await fs.readFile(nextConfigPath, \"utf8\");\n if (!nextConfig.includes(\"next-intl\")) {\n if (!nextConfig.includes(\"createNextIntlPlugin\")) {\n nextConfig = `import createNextIntlPlugin from \"next-intl/plugin\";\\n\\nconst withNextIntl = createNextIntlPlugin(\"./src/i18n/request.ts\");\\n\\n${nextConfig}`;\n }\n nextConfig = nextConfig.replace(\n \"export default nextConfig;\",\n \"export default withNextIntl(nextConfig);\",\n );\n await fs.writeFile(nextConfigPath, nextConfig, \"utf8\");\n }\n }\n\n await addDependencies(projectDir, {\n \"next-intl\": \"^3.26.3\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport { ICON_PACKAGES } from \"../types.js\";\nimport type { Installer } from \"./types.js\";\n\nconst RULE = `---\ndescription: Icon library conventions\nglobs: \"src/**/*.{ts,tsx}\"\nalwaysApply: false\n---\n\n# Icons\n\n__ICONS_BODY__\n`;\n\nconst BODIES = {\n lucide: `- Use \\`lucide-react\\` icons (\\`import { IconName } from \"lucide-react\"\\`).\n- Prefer Lucide when adding shadcn primitives later.`,\n tabler: `- Use \\`@tabler/icons-react\\` with the \\`Icon*\\` prefix (\\`import { IconHome } from \"@tabler/icons-react\"\\`).\n- Do not mix Lucide and Tabler in the same app.`,\n} as const;\n\nexport const iconsInstaller: Installer = {\n id: \"icons\",\n active: (o) => o.icons !== \"none\",\n async run({ projectDir, options }) {\n if (options.icons === \"none\") return;\n\n const pkg = ICON_PACKAGES[options.icons];\n await addDependencies(projectDir, { [pkg.name]: pkg.version });\n\n const ruleDir = path.join(projectDir, \".cursor\", \"rules\");\n await fs.ensureDir(ruleDir);\n await fs.writeFile(\n path.join(ruleDir, \"icons.mdc\"),\n RULE.replace(\"__ICONS_BODY__\", BODIES[options.icons]),\n \"utf8\",\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst THEME_PROVIDER = `\"use client\";\n\nimport { type ReactNode } from \"react\";\n\nimport { CssBaseline, ThemeProvider, createTheme } from \"@mui/material\";\nimport { AppRouterCacheProvider } from \"@mui/material-nextjs/v15-appRouter\";\n\nconst theme = createTheme({\n cssVariables: true,\n palette: {\n mode: \"light\",\n primary: { main: \"#0b5fff\" },\n },\n});\n\nexport function MuiProvider({ children }: { children: ReactNode }) {\n return (\n <AppRouterCacheProvider>\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </AppRouterCacheProvider>\n );\n}\n`;\n\nconst RULE = `---\ndescription: MUI (Material UI) conventions\nglobs: src/providers/mui-provider.tsx,src/**/*.{ts,tsx}\nalwaysApply: false\n---\n\n# MUI\n\n- Theme via \\`MuiProvider\\` (\\`src/providers/mui-provider.tsx\\`), composed in \\`AppProviders\\`.\n- Prefer MUI components (\\`Button\\`, \\`TextField\\`, \\`Stack\\`, …) over ad-hoc CSS.\n- Do not add shadcn — incompatible with this styling choice.\n- Emotion cache: \\`@mui/material-nextjs\\` App Router provider (already wired).\n`;\n\nexport const muiInstaller: Installer = {\n id: \"mui\",\n active: (o) => o.styling === \"mui\",\n async run({ projectDir }) {\n const providersDir = path.join(projectDir, \"src\", \"providers\");\n await fs.ensureDir(providersDir);\n await fs.remove(path.join(providersDir, \".gitkeep\"));\n await fs.writeFile(\n path.join(providersDir, \"mui-provider.tsx\"),\n THEME_PROVIDER,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"mui.mdc\"),\n RULE,\n \"utf8\",\n );\n\n await addDependencies(projectDir, {\n \"@mui/material\": \"^6.4.0\",\n \"@mui/material-nextjs\": \"^6.4.0\",\n \"@emotion/react\": \"^11.14.0\",\n \"@emotion/styled\": \"^11.14.0\",\n \"@emotion/cache\": \"^11.14.0\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { getPackageManager } from \"../helpers/package-manager.js\";\nimport type { Installer } from \"./types.js\";\n\n/**\n * Normalize package.json `packageManager` field for the chosen tool.\n * Runs early so later installers can assume a consistent field.\n */\nexport const packageManagerInstaller: Installer = {\n id: \"package-manager\",\n active: () => true,\n async run({ projectDir, options }) {\n const meta = getPackageManager(options.packageManager);\n const pkgPath = path.join(projectDir, \"package.json\");\n const pkg = (await fs.readJson(pkgPath)) as Record<string, unknown>;\n\n if (meta.packageManagerField) {\n pkg.packageManager = meta.packageManagerField;\n } else {\n delete pkg.packageManager;\n }\n\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport { addDependencies, addScripts } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nexport const prettierInstaller: Installer = {\n id: \"prettier\",\n active: (o) => o.prettier,\n async run({ projectDir }) {\n const addon = path.join(ADDONS_DIR, \"prettier\");\n\n await fs.copy(\n path.join(addon, \".prettierrc\"),\n path.join(projectDir, \".prettierrc\"),\n );\n await fs.copy(\n path.join(addon, \".cursor\", \"rules\", \"prettier.mdc\"),\n path.join(projectDir, \".cursor\", \"rules\", \"prettier.mdc\"),\n );\n await fs.copy(\n path.join(addon, \"docs\", \"style-guide\", \"tooling\", \"prettier.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"tooling\", \"prettier.md\"),\n );\n\n await addDependencies(\n projectDir,\n { prettier: \"^3.6.2\" },\n \"devDependencies\",\n );\n await addScripts(projectDir, {\n format: \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { Installer } from \"./types.js\";\n\nconst SEO_TS = `import type { Metadata } from \"next\";\n\nimport { env } from \"@/lib/env\";\n\nexport const SITE_NAME = process.env.NEXT_PUBLIC_SITE_NAME?.trim() || \"__PROJECT_NAME__\";\nexport const DEFAULT_DESCRIPTION =\n process.env.NEXT_PUBLIC_SITE_DESCRIPTION?.trim() ||\n \"Generated with next-style-guide\";\n\n/** Absolute public origin (no trailing slash). */\nexport function getAppUrl(): string {\n try {\n return new URL(env.NEXT_PUBLIC_APP_URL).origin;\n } catch {\n return \"http://localhost:3000\";\n }\n}\n\nexport function absoluteUrl(path: string): string {\n const base = getAppUrl();\n if (!path || path === \"/\") return base;\n return \\`\\${base}\\${path.startsWith(\"/\") ? path : \\`/\\${path}\\`}\\`;\n}\n\nexport type SitemapChangeFrequency =\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n\nexport function buildPublicMetadata(input: {\n title: string;\n description: string;\n path: string;\n absoluteTitle?: string;\n noIndex?: boolean;\n}): Metadata {\n const url = absoluteUrl(input.path);\n return {\n title: input.absoluteTitle ?? input.title,\n description: input.description,\n alternates: { canonical: url },\n openGraph: {\n title: input.absoluteTitle ?? input.title,\n description: input.description,\n url,\n siteName: SITE_NAME,\n type: \"website\",\n },\n robots: input.noIndex\n ? { index: false, follow: false }\n : { index: true, follow: true },\n };\n}\n`;\n\nconst PUBLIC_ROUTES = `import {\n buildPublicMetadata,\n DEFAULT_DESCRIPTION,\n SITE_NAME,\n type SitemapChangeFrequency,\n} from \"@/lib/seo\";\n\n/**\n * Indexable URLs — single source of truth for sitemap + page metadata.\n * Add a route under \\`src/app/\\`, then register it here.\n */\nexport type PublicRoute = {\n path: string;\n title: string;\n description: string;\n absoluteTitle?: string;\n changeFrequency: SitemapChangeFrequency;\n priority: number;\n lastModified?: string;\n noIndex?: boolean;\n};\n\nexport const STATIC_PUBLIC_ROUTES: PublicRoute[] = [\n {\n path: \"/\",\n title: SITE_NAME,\n description: DEFAULT_DESCRIPTION,\n changeFrequency: \"weekly\",\n priority: 1,\n lastModified: \"2026-01-01\",\n },\n];\n\nexport function publicPageMetadata(path: string) {\n const route = STATIC_PUBLIC_ROUTES.find((item) => item.path === path);\n if (!route) {\n throw new Error(\\`Missing public route registration for \\${path}\\`);\n }\n return buildPublicMetadata(route);\n}\n`;\n\nconst SITEMAP = `import type { MetadataRoute } from \"next\";\n\nimport { absoluteUrl } from \"@/lib/seo\";\nimport { STATIC_PUBLIC_ROUTES } from \"@/lib/public-routes\";\n\nexport default function sitemap(): MetadataRoute.Sitemap {\n return STATIC_PUBLIC_ROUTES.filter((route) => !route.noIndex).map((route) => ({\n url: absoluteUrl(route.path),\n lastModified: route.lastModified,\n changeFrequency: route.changeFrequency,\n priority: route.priority,\n }));\n}\n`;\n\nconst ROBOTS = `import type { MetadataRoute } from \"next\";\n\nimport { getAppUrl } from \"@/lib/seo\";\n\nexport default function robots(): MetadataRoute.Robots {\n const origin = getAppUrl();\n return {\n rules: {\n userAgent: \"*\",\n allow: \"/\",\n },\n sitemap: \\`\\${origin}/sitemap.xml\\`,\n };\n}\n`;\n\nconst RULE = `---\ndescription: SEO + public routes\nglobs: src/lib/public-routes.ts,src/lib/seo.ts,src/app/sitemap.ts,src/app/robots.ts,src/app/**/page.tsx\nalwaysApply: false\n---\n\n# SEO\n\n- Register every indexable path in \\`STATIC_PUBLIC_ROUTES\\` (\\`src/lib/public-routes.ts\\`).\n- Page metadata: \\`publicPageMetadata(\"/path\")\\` — keep canonical/title/description in sync.\n- \\`sitemap.ts\\` / \\`robots.ts\\` read from that registry — don't hardcode URLs twice.\n- Single \\`<main>\\` in root layout only.\n- Placeholders / thin pages: \\`noIndex: true\\` and keep them out of the sitemap.\n- Prefer static \\`lastModified\\` dates over \\`new Date()\\` for every route.\n`;\n\nexport const seoInstaller: Installer = {\n id: \"seo\",\n active: (o) => o.seo,\n async run({ projectDir, options }) {\n let seo = SEO_TS.replaceAll(\"__PROJECT_NAME__\", options.name);\n await fs.writeFile(path.join(projectDir, \"src\", \"lib\", \"seo.ts\"), seo, \"utf8\");\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"public-routes.ts\"),\n PUBLIC_ROUTES,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"app\", \"sitemap.ts\"),\n SITEMAP,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"app\", \"robots.ts\"),\n ROBOTS,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"seo.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"seo\", \"overview.md\"),\n `# SEO\n\n- Registry: \\`src/lib/public-routes.ts\\`\n- Helpers: \\`src/lib/seo.ts\\`\n- \\`sitemap.ts\\` / \\`robots.ts\\` under \\`src/app/\\`\n\nAdd a page → register the path → metadata/sitemap update automatically.\n`,\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nfunction componentsJson(iconLibrary: \"lucide\" | \"tabler\"): string {\n return `${JSON.stringify(\n {\n $schema: \"https://ui.shadcn.com/schema.json\",\n style: \"new-york\",\n rsc: true,\n tsx: true,\n tailwind: {\n config: \"\",\n css: \"src/app/globals.css\",\n baseColor: \"neutral\",\n cssVariables: true,\n prefix: \"\",\n },\n iconLibrary,\n aliases: {\n components: \"@/components\",\n utils: \"@/lib/utils\",\n ui: \"@/components/ui\",\n lib: \"@/lib\",\n hooks: \"@/hooks\",\n },\n },\n null,\n 2,\n )}\\n`;\n}\n\nconst BUTTON = `import { cva, type VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-neutral-900 text-white hover:bg-neutral-800\",\n outline: \"border border-neutral-300 bg-transparent hover:bg-neutral-100\",\n ghost: \"hover:bg-neutral-100\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport function Button({\n className,\n variant,\n size,\n ...props\n}: ComponentProps<\"button\"> & VariantProps<typeof buttonVariants>) {\n return (\n <button className={cn(buttonVariants({ variant, size, className }))} {...props} />\n );\n}\n`;\n\nconst INPUT = `import type { ComponentProps } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport function Input({ className, type, ...props }: ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-neutral-300 bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-neutral-400 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n`;\n\nconst CARD = `import type { ComponentProps } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport function Card({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"rounded-xl border border-neutral-200 bg-white text-neutral-950 shadow-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function CardHeader({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div className={cn(\"flex flex-col gap-1.5 p-6\", className)} {...props} />\n );\n}\n\nexport function CardTitle({ className, ...props }: ComponentProps<\"h3\">) {\n return (\n <h3\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n );\n}\n\nexport function CardDescription({ className, ...props }: ComponentProps<\"p\">) {\n return (\n <p className={cn(\"text-sm text-neutral-500\", className)} {...props} />\n );\n}\n\nexport function CardContent({ className, ...props }: ComponentProps<\"div\">) {\n return <div className={cn(\"p-6 pt-0\", className)} {...props} />;\n}\n\nexport function CardFooter({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div className={cn(\"flex items-center p-6 pt-0\", className)} {...props} />\n );\n}\n`;\n\nconst DIALOG = `\"use client\";\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport const Dialog = DialogPrimitive.Root;\nexport const DialogTrigger = DialogPrimitive.Trigger;\nexport const DialogClose = DialogPrimitive.Close;\nexport const DialogPortal = DialogPrimitive.Portal;\n\nexport function DialogOverlay({\n className,\n ...props\n}: ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DialogContent({\n className,\n children,\n ...props\n}: ComponentProps<typeof DialogPrimitive.Content>) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n className={cn(\n \"fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border border-neutral-200 bg-white p-6 shadow-lg duration-200 sm:rounded-xl\",\n className,\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nexport function DialogHeader({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"flex flex-col gap-1.5 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nexport function DialogTitle({\n className,\n ...props\n}: ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n className={cn(\"text-lg font-semibold leading-none\", className)}\n {...props}\n />\n );\n}\n\nexport function DialogDescription({\n className,\n ...props\n}: ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n className={cn(\"text-sm text-neutral-500\", className)}\n {...props}\n />\n );\n}\n`;\n\nfunction ruleFor(set: \"minimal\" | \"starter\"): string {\n const setLine =\n set === \"starter\"\n ? \"- Starter set: `button`, `input`, `card`, `dialog`.\"\n : \"- Minimal set: `button` only.\";\n return `---\ndescription: shadcn/ui conventions\nglobs: components.json,src/components/ui/**,src/lib/utils.ts\nalwaysApply: false\n---\n\n# shadcn\n\n- Primitives live flat in \\`src/components/ui/*\\` (CLI-compatible).\n${setLine}\n- Add more with \\`npx shadcn@latest add …\\`.\n- \\`cn()\\` from \\`@/lib/utils\\` for class merging.\n- Config: \\`components.json\\`. Requires Tailwind.\n`;\n}\n\nexport const shadcnInstaller: Installer = {\n id: \"shadcn\",\n active: (o) => o.ui === \"shadcn\" && o.styling === \"tailwind\",\n async run({ projectDir, options }) {\n const iconLibrary = options.icons === \"tabler\" ? \"tabler\" : \"lucide\";\n const set = options.shadcnSet;\n const uiDir = path.join(projectDir, \"src\", \"components\", \"ui\");\n\n await fs.writeFile(\n path.join(projectDir, \"components.json\"),\n componentsJson(iconLibrary),\n \"utf8\",\n );\n await fs.ensureDir(uiDir);\n await fs.writeFile(path.join(uiDir, \"button.tsx\"), BUTTON, \"utf8\");\n\n if (set === \"starter\") {\n await fs.writeFile(path.join(uiDir, \"input.tsx\"), INPUT, \"utf8\");\n await fs.writeFile(path.join(uiDir, \"card.tsx\"), CARD, \"utf8\");\n await fs.writeFile(path.join(uiDir, \"dialog.tsx\"), DIALOG, \"utf8\");\n }\n\n await fs.remove(path.join(uiDir, \".gitkeep\"));\n await fs.remove(path.join(projectDir, \"src\", \"components\", \".gitkeep\"));\n\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"shadcn.mdc\"),\n ruleFor(set),\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"ui\", \"shadcn.md\"),\n `# shadcn/ui\n\nSet: **${set}**\n${set === \"starter\" ? \"- `button` · `input` · `card` · `dialog`\\n\" : \"- `button`\\n\"}\nAdd more: \\`npx shadcn@latest add …\\`\n`,\n );\n\n if (options.icons === \"none\") {\n await addDependencies(projectDir, {\n \"lucide-react\": \"^0.469.0\",\n });\n }\n\n const deps: Record<string, string> = {\n \"class-variance-authority\": \"^0.7.1\",\n };\n if (set === \"starter\") {\n deps[\"@radix-ui/react-dialog\"] = \"^1.1.4\";\n }\n await addDependencies(projectDir, deps);\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst ZUSTAND_STORE = `import { create } from \"zustand\";\n\ntype AppState = {\n hydrated: boolean;\n setHydrated: (value: boolean) => void;\n};\n\n/** App-wide client store — extend slices as the product grows. */\nexport const useAppStore = create<AppState>((set) => ({\n hydrated: false,\n setHydrated: (value) => set({ hydrated: value }),\n}));\n`;\n\nconst ZUSTAND_RULE = `---\ndescription: Zustand client store conventions\nglobs: src/stores/**\nalwaysApply: false\n---\n\n# Zustand\n\n- Stores live under \\`src/stores/\\` (one file per domain slice when possible).\n- Prefer small selectors: \\`useAppStore((s) => s.hydrated)\\`.\n- Do not put server secrets or tokens in the client store.\n- Server Components stay free of store hooks — pass data down or use a client leaf.\n`;\n\nconst REDUX_STORE = `import { configureStore, createSlice, type PayloadAction } from \"@reduxjs/toolkit\";\n\ntype AppSliceState = {\n hydrated: boolean;\n};\n\nconst initialState: AppSliceState = {\n hydrated: false,\n};\n\nconst appSlice = createSlice({\n name: \"app\",\n initialState,\n reducers: {\n setHydrated(state, action: PayloadAction<boolean>) {\n state.hydrated = action.payload;\n },\n },\n});\n\nexport const { setHydrated } = appSlice.actions;\n\nexport const makeStore = () =>\n configureStore({\n reducer: {\n app: appSlice.reducer,\n },\n });\n\nexport type AppStore = ReturnType<typeof makeStore>;\nexport type RootState = ReturnType<AppStore[\"getState\"]>;\nexport type AppDispatch = AppStore[\"dispatch\"];\n`;\n\nconst REDUX_HOOKS = `import { useDispatch, useSelector, useStore } from \"react-redux\";\n\nimport type { AppDispatch, AppStore, RootState } from \"@/stores/store\";\n\nexport const useAppDispatch = useDispatch.withTypes<AppDispatch>();\nexport const useAppSelector = useSelector.withTypes<RootState>();\nexport const useAppStore = useStore.withTypes<AppStore>();\n`;\n\nconst REDUX_PROVIDER = `\"use client\";\n\nimport { type ReactNode, useRef } from \"react\";\nimport { Provider } from \"react-redux\";\n\nimport { makeStore, type AppStore } from \"@/stores/store\";\n\nexport function StoreProvider({ children }: { children: ReactNode }) {\n const storeRef = useRef<AppStore | null>(null);\n if (!storeRef.current) {\n storeRef.current = makeStore();\n }\n\n return <Provider store={storeRef.current}>{children}</Provider>;\n}\n`;\n\nconst REDUX_RULE = `---\ndescription: Redux Toolkit client store conventions\nglobs: src/stores/**,src/providers/store-provider.tsx\nalwaysApply: false\n---\n\n# Redux Toolkit\n\n- Store factory: \\`src/stores/store.ts\\` (\\`makeStore\\`).\n- Typed hooks: \\`src/stores/hooks.ts\\` (\\`useAppDispatch\\` / \\`useAppSelector\\`).\n- Provider: \\`src/providers/store-provider.tsx\\` (composed via \\`AppProviders\\`).\n- Prefer RTK slices; keep server secrets out of the client store.\n`;\n\nexport const storeInstaller: Installer = {\n id: \"store\",\n active: (o) => o.store !== \"none\",\n async run({ projectDir, options }) {\n const storesDir = path.join(projectDir, \"src\", \"stores\");\n await fs.ensureDir(storesDir);\n\n if (options.store === \"zustand\") {\n await fs.writeFile(\n path.join(storesDir, \"app-store.ts\"),\n ZUSTAND_STORE,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"store.mdc\"),\n ZUSTAND_RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"state\", \"zustand.md\"),\n `# Zustand\n\n- Store: \\`src/stores/app-store.ts\\`\n- Extend with domain slices under \\`src/stores/\\`\n`,\n );\n await addDependencies(projectDir, { zustand: \"^5.0.3\" });\n return;\n }\n\n // redux\n await fs.writeFile(path.join(storesDir, \"store.ts\"), REDUX_STORE, \"utf8\");\n await fs.writeFile(path.join(storesDir, \"hooks.ts\"), REDUX_HOOKS, \"utf8\");\n\n const providersDir = path.join(projectDir, \"src\", \"providers\");\n await fs.ensureDir(providersDir);\n await fs.remove(path.join(providersDir, \".gitkeep\"));\n await fs.writeFile(\n path.join(providersDir, \"store-provider.tsx\"),\n REDUX_PROVIDER,\n \"utf8\",\n );\n\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"store.mdc\"),\n REDUX_RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"state\", \"redux.md\"),\n `# Redux Toolkit\n\n- Store: \\`src/stores/store.ts\\`\n- Hooks: \\`src/stores/hooks.ts\\`\n- Provider: \\`src/providers/store-provider.tsx\\` (via \\`AppProviders\\`)\n`,\n );\n\n await addDependencies(projectDir, {\n \"@reduxjs/toolkit\": \"^2.5.1\",\n \"react-redux\": \"^9.2.0\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport type { ScaffoldOptions } from \"../types.js\";\nimport type { Installer } from \"./types.js\";\n\nfunction stackLines(options: ScaffoldOptions): string[] {\n const stylingLabel =\n options.styling === \"tailwind\"\n ? options.ui === \"shadcn\"\n ? \"Tailwind + shadcn/ui\"\n : \"Tailwind CSS\"\n : options.styling === \"mui\"\n ? \"MUI\"\n : \"Plain CSS\";\n\n return [\n `Package manager: ${options.packageManager}`,\n `Styling: ${stylingLabel}`,\n `Validation: ${options.validation}`,\n `Auth: ${options.auth}`,\n options.store === \"none\"\n ? \"No client store\"\n : `Client store: ${options.store}`,\n options.darkMode ? \"Dark mode (next-themes)\" : \"No dark mode\",\n options.seo ? \"SEO helpers (sitemap/robots)\" : \"No SEO helpers\",\n options.data === \"tanstack-query\"\n ? \"TanStack Query enabled\"\n : \"RSC / fetch (no TanStack Query)\",\n options.icons === \"none\" ? \"No icon library\" : `Icons: ${options.icons}`,\n options.endpoints\n ? `OpenAPI endpoints codegen (\\`${options.packageManager} endpoints:generate\\`)`\n : \"No endpoints codegen\",\n options.apiEnvelope ? \"API envelope unwrap\" : \"No envelope unwrap\",\n options.i18n ? \"i18n (next-intl)\" : \"No i18n\",\n options.testing\n ? options.playwright\n ? \"Vitest + Playwright\"\n : \"Vitest\"\n : \"No tests\",\n options.eslint ? \"Enhanced ESLint\" : \"Minimal ESLint\",\n options.prettier ? \"Prettier\" : \"No Prettier\",\n options.husky ? \"Husky + lint-staged\" : \"No git hooks\",\n options.ui === \"shadcn\"\n ? `shadcn set: ${options.shadcnSet}`\n : null,\n options.deploy === \"docker\"\n ? \"Deploy: Docker standalone image\"\n : options.deploy === \"vercel\"\n ? \"Deploy: Vercel\"\n : \"No deploy target\",\n options.ci ? \"GitHub Actions CI\" : \"No CI workflow\",\n ].filter((line): line is string => line !== null);\n}\n\nfunction welcomeCardSource(options: ScaffoldOptions): string {\n const items = stackLines(options)\n .map((line) => ` <li>${escapeJsx(line)}</li>`)\n .join(\"\\n\");\n\n return `/** Homepage sample — reflects scaffold choices; replace with real UI. */\nexport function WelcomeCard() {\n return (\n <div className=\"card\">\n <h2>Your scaffold</h2>\n <ul>\n${items}\n </ul>\n <p className=\"meta\" style={{ marginTop: \"1rem\" }}>\n Route UI → <code>src/app/<route>/_components/</code> · shared →{\" \"}\n <code>src/components/</code>\n </p>\n </div>\n );\n}\n`;\n}\n\nfunction escapeJsx(text: string): string {\n return text.replaceAll(\"`\", \"\\\\`\");\n}\n\nfunction homePageSource(options: ScaffoldOptions): string {\n const uiBit =\n options.ui === \"shadcn\" ? \" · ui=<code>shadcn</code>\" : \"\";\n\n return `import { WelcomeCard } from \"@/app/_components/welcome-card\";\n\nexport default function HomePage() {\n return (\n <>\n <section className=\"hero\">\n <h1>${options.name}</h1>\n <p>\n Scaffolded with <strong>next-style-guide</strong> (Next.js 16).\n styling=<code>${options.styling}</code>${uiBit} · validation=\n <code>${options.validation}</code> · icons=<code>${options.icons}</code> ·\n data=<code>${options.data}</code>.\n </p>\n </section>\n\n <WelcomeCard />\n\n <p className=\"meta\">\n Read <code>AGENTS.md</code> and <code>docs/style-guide/</code> before\n adding routes. Feature rules in <code>.cursor/rules/</code> load by glob.\n </p>\n </>\n );\n}\n`;\n}\n\nfunction docsIndex(options: ScaffoldOptions): string {\n const rows: Array<[string, string]> = [\n [\n \"[Architecture](overview/architecture.md)\",\n \"Layers: app / components / lib / utils\",\n ],\n [\"[Project structure](overview/project-structure.md)\", \"Folder map\"],\n [\"[Environment](ops/env.md)\", \"`.env.example` · staging · production\"],\n [\"[HTTP client](http/client.md)\", \"`apiFetch` helper\"],\n [\n `[Validation](validation/${options.validation}.md)`,\n options.validation.toUpperCase(),\n ],\n ];\n\n if (options.auth === \"jwt\") {\n rows.push([\"[JWT auth](auth/jwt.md)\", \"token-storage + Bearer refresh\"]);\n }\n if (options.auth === \"authjs\") {\n rows.push([\"[Auth.js](auth/authjs.md)\", \"NextAuth stub\"]);\n }\n if (options.store === \"zustand\") {\n rows.push([\"[Zustand](state/zustand.md)\", \"client store\"]);\n }\n if (options.store === \"redux\") {\n rows.push([\"[Redux Toolkit](state/redux.md)\", \"client store\"]);\n }\n if (options.darkMode) {\n rows.push([\"[Dark mode](ui/dark-mode.md)\", \"next-themes\"]);\n }\n if (options.auth === \"jwt\" && options.endpoints) {\n rows.push([\n \"[Docker Compose](ops/docker-compose.md)\",\n \"local API stub\",\n ]);\n }\n if (options.seo) {\n rows.push([\"[SEO](seo/overview.md)\", \"public-routes · sitemap · robots\"]);\n }\n if (options.i18n) {\n rows.push([\"[i18n](i18n/overview.md)\", \"next-intl\"]);\n }\n if (options.apiEnvelope) {\n rows.push([\"[API envelope](http/envelope.md)\", \"unwrap result\"]);\n }\n if (options.testing) {\n rows.push([\"[Testing](tooling/testing.md)\", \"Vitest\"]);\n }\n if (options.styling === \"tailwind\") {\n rows.push([\"Tailwind\", \"See `.cursor/rules/tailwind.mdc`\"]);\n }\n if (options.ui === \"shadcn\") {\n rows.push([\n \"[shadcn/ui](ui/shadcn.md)\",\n `set=${options.shadcnSet}`,\n ]);\n }\n if (options.styling === \"mui\") {\n rows.push([\"MUI\", \"See `.cursor/rules/mui.mdc`\"]);\n }\n if (options.endpoints) {\n rows.push([\n \"[OpenAPI endpoints](http/endpoints.md)\",\n `\\`${options.packageManager} endpoints:generate\\``,\n ]);\n }\n if (options.data === \"tanstack-query\") {\n rows.push([\n \"[TanStack Query](data/tanstack-query.md)\",\n \"Client cache + QueryProvider\",\n ]);\n }\n if (options.icons !== \"none\") {\n rows.push([\"[Icons](ui/icons.md)\", `Icon library (${options.icons})`]);\n }\n if (options.eslint) {\n rows.push([\"[ESLint](tooling/eslint.md)\", \"Import sort + style rules\"]);\n }\n if (options.prettier) {\n rows.push([\"[Prettier](tooling/prettier.md)\", \"Formatting\"]);\n }\n if (options.husky) {\n rows.push([\"[Husky](tooling/husky.md)\", \"Pre-commit hooks\"]);\n }\n if (options.deploy === \"docker\") {\n rows.push([\"[Docker](ops/docker.md)\", \"Standalone production image\"]);\n }\n if (options.deploy === \"vercel\") {\n rows.push([\"[Vercel](ops/vercel.md)\", \"vercel.json + env notes\"]);\n }\n if (options.ci) {\n rows.push([\"[CI](ops/ci.md)\", \"GitHub Actions\"]);\n }\n\n const table = [\n \"| Page | Topic |\",\n \"|------|--------|\",\n ...rows.map(([page, topic]) => `| ${page} | ${topic} |`),\n ].join(\"\\n\");\n\n return `# Style guide — ${options.name}\n\nLiving conventions for this app. Open one page at a time.\n\n${table}\n\nCoding agents: start at [\\`AGENTS.md\\`](../../AGENTS.md) → [\\`.cursor/rules/\\`](../../.cursor/rules/) (glob-scoped).\n`;\n}\n\nexport const surfaceInstaller: Installer = {\n id: \"surface\",\n active: () => true,\n async run({ projectDir, options }) {\n await fs.writeFile(\n path.join(\n projectDir,\n \"src\",\n \"app\",\n \"_components\",\n \"welcome-card\",\n \"index.tsx\",\n ),\n welcomeCardSource(options),\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"app\", \"page.tsx\"),\n homePageSource(options),\n \"utf8\",\n );\n\n if (options.data === \"tanstack-query\") {\n await fs.copy(\n path.join(ADDONS_DIR, \"docs\", \"data\", \"tanstack-query.md\"),\n path.join(\n projectDir,\n \"docs\",\n \"style-guide\",\n \"data\",\n \"tanstack-query.md\",\n ),\n );\n }\n if (options.icons !== \"none\") {\n await fs.copy(\n path.join(ADDONS_DIR, \"docs\", \"ui\", \"icons.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"ui\", \"icons.md\"),\n );\n }\n\n if (options.auth === \"jwt\" && options.endpoints) {\n const exampleSrc = path.join(\n ADDONS_DIR,\n \"docs\",\n \"examples\",\n \"api-app-crud.md\",\n );\n if (await fs.pathExists(exampleSrc)) {\n await fs.copy(\n exampleSrc,\n path.join(projectDir, \"docs\", \"examples\", \"api-app-crud.md\"),\n );\n }\n }\n\n await fs.writeFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"README.md\"),\n docsIndex(options),\n \"utf8\",\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst POSTCSS = `const config = {\n plugins: {\n \"@tailwindcss/postcss\": {},\n },\n};\n\nexport default config;\n`;\n\nconst GLOBALS = `@import \"tailwindcss\";\n\n:root {\n color-scheme: light;\n --background: #f6f4ef;\n --foreground: #14201b;\n --muted: #5b6b63;\n --accent: #0b5fff;\n --card: #ffffff;\n --border: #d9e0db;\n}\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-muted: var(--muted);\n --color-accent: var(--accent);\n --color-card: var(--card);\n --color-border: var(--border);\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml,\nbody {\n margin: 0;\n min-height: 100%;\n background: radial-gradient(circle at top left, #eef3ff, transparent 40%),\n var(--background);\n color: var(--foreground);\n font-family: ui-sans-serif, system-ui, sans-serif;\n}\n\na {\n color: var(--accent);\n text-decoration: none;\n}\n\na:hover {\n text-decoration: underline;\n}\n\nmain {\n width: min(720px, calc(100% - 2rem));\n margin: 0 auto;\n padding: 4rem 0 3rem;\n}\n\n.hero {\n display: grid;\n gap: 1rem;\n}\n\n.hero h1 {\n margin: 0;\n font-size: clamp(2rem, 5vw, 3rem);\n letter-spacing: -0.03em;\n}\n\n.hero p {\n margin: 0;\n color: var(--muted);\n line-height: 1.6;\n max-width: 40rem;\n}\n\n.card {\n margin-top: 2rem;\n padding: 1.25rem 1.5rem;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 12px;\n}\n\n.card h2 {\n margin: 0 0 0.5rem;\n font-size: 1rem;\n}\n\n.card ul {\n margin: 0;\n padding-left: 1.1rem;\n color: var(--muted);\n line-height: 1.7;\n}\n\n.meta {\n margin-top: 2rem;\n font-size: 0.875rem;\n color: var(--muted);\n}\n`;\n\nconst UTILS = `import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n`;\n\nconst RULE = `---\ndescription: Tailwind CSS v4 conventions\nglobs: src/app/globals.css,src/**/*.{tsx,css},postcss.config.mjs\nalwaysApply: false\n---\n\n# Tailwind\n\n- Tailwind v4 via \\`@import \"tailwindcss\"\\` in \\`globals.css\\` + \\`@tailwindcss/postcss\\`.\n- Prefer utility classes; keep semantic CSS variables in \\`:root\\` / \\`@theme\\`.\n- Class merging: \\`cn()\\` from \\`@/lib/utils\\` (clsx + tailwind-merge).\n`;\n\nexport const tailwindInstaller: Installer = {\n id: \"tailwind\",\n active: (o) => o.styling === \"tailwind\",\n async run({ projectDir }) {\n await fs.writeFile(\n path.join(projectDir, \"postcss.config.mjs\"),\n POSTCSS,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"app\", \"globals.css\"),\n GLOBALS,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"utils.ts\"),\n UTILS,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"tailwind.mdc\"),\n RULE,\n \"utf8\",\n );\n\n await addDependencies(projectDir, {\n clsx: \"^2.1.1\",\n \"tailwind-merge\": \"^3.6.0\",\n });\n await addDependencies(\n projectDir,\n {\n tailwindcss: \"^4\",\n \"@tailwindcss/postcss\": \"^4\",\n },\n \"devDependencies\",\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst PROVIDER = `\"use client\";\n\nimport { type ReactNode, useState } from \"react\";\n\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n\nfunction createQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60_000,\n refetchOnWindowFocus: false,\n retry: 1,\n },\n mutations: {\n retry: false,\n },\n },\n });\n}\n\nexport function QueryProvider({ children }: { children: ReactNode }) {\n const [client] = useState(createQueryClient);\n\n return <QueryClientProvider client={client}>{children}</QueryClientProvider>;\n}\n`;\n\nconst RULE = `---\ndescription: TanStack Query conventions\nglobs: src/providers/**,src/hooks/**,src/endpoints/**,src/**/*query*.{ts,tsx},src/**/use-*.{ts,tsx}\nalwaysApply: false\n---\n\n# TanStack Query\n\n- \\`QueryProvider\\` (\\`src/providers/query-provider.tsx\\`) is composed via \\`AppProviders\\`.\n- Client data: \\`useQuery\\` / \\`useMutation\\`; keep RSC for server-friendly fetches.\n- Query keys: use generated \\`get<EndpointName>QueryKey(...)\\` when endpoints codegen is on — never ad-hoc \\`[\"resource\"]\\` strings.\n- Default hook \\`params\\` to the matching \\`*DefaultParams\\` when present.\n- Errors: \\`getApiErrorMessage\\` / field helpers from \\`@/utils/api-error\\`.\n`;\n\nexport const tanstackQueryInstaller: Installer = {\n id: \"tanstack-query\",\n active: (o) => o.data === \"tanstack-query\",\n async run({ projectDir }) {\n await addDependencies(projectDir, {\n \"@tanstack/react-query\": \"^5.62.8\",\n });\n\n const providersDir = path.join(projectDir, \"src\", \"providers\");\n await fs.ensureDir(providersDir);\n await fs.remove(path.join(providersDir, \".gitkeep\"));\n await fs.writeFile(\n path.join(providersDir, \"query-provider.tsx\"),\n PROVIDER,\n \"utf8\",\n );\n\n const ruleDir = path.join(projectDir, \".cursor\", \"rules\");\n await fs.ensureDir(ruleDir);\n await fs.writeFile(\n path.join(ruleDir, \"tanstack-query.mdc\"),\n RULE,\n \"utf8\",\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies, addScripts } from \"../helpers/package-json.js\";\nimport { getPackageManager } from \"../helpers/package-manager.js\";\nimport type { Installer } from \"./types.js\";\n\nconst VITEST_CONFIG = `import react from \"@vitejs/plugin-react\";\nimport { resolve } from \"node:path\";\nimport { defineConfig } from \"vitest/config\";\n\nexport default defineConfig({\n plugins: [react()],\n test: {\n environment: \"jsdom\",\n globals: true,\n include: [\"tests/**/*.test.{ts,tsx}\", \"src/**/*.test.{ts,tsx}\"],\n },\n resolve: {\n alias: {\n \"@\": resolve(import.meta.dirname, \"./src\"),\n },\n },\n});\n`;\n\nconst SAMPLE_TEST = `import { renderToStaticMarkup } from \"react-dom/server\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { WelcomeCard } from \"@/app/_components/welcome-card\";\n\ndescribe(\"WelcomeCard\", () => {\n it(\"renders scaffold heading\", () => {\n const html = renderToStaticMarkup(<WelcomeCard />);\n expect(html).toContain(\"Your scaffold\");\n });\n});\n`;\n\nfunction playwrightConfig(devCommand: string): string {\n return `import { defineConfig, devices } from \"@playwright/test\";\n\nexport default defineConfig({\n testDir: \"./e2e\",\n fullyParallel: true,\n forbidOnly: !!process.env.CI,\n retries: process.env.CI ? 1 : 0,\n use: {\n baseURL: \"http://127.0.0.1:3000\",\n trace: \"on-first-retry\",\n },\n projects: [{ name: \"chromium\", use: { ...devices[\"Desktop Chrome\"] } }],\n webServer: {\n command: \"${devCommand}\",\n url: \"http://127.0.0.1:3000\",\n reuseExistingServer: !process.env.CI,\n },\n});\n`;\n}\n\nconst E2E_SMOKE = `import { expect, test } from \"@playwright/test\";\n\ntest(\"home loads\", async ({ page }) => {\n await page.goto(\"/\");\n await expect(page.getByRole(\"heading\", { level: 1 })).toBeVisible();\n});\n`;\n\nexport const testingInstaller: Installer = {\n id: \"testing\",\n active: (o) => o.testing,\n async run({ projectDir, options }) {\n const pm = getPackageManager(options.packageManager);\n const testCmd = pm.runScript(\"test\");\n const e2eCmd = pm.runScript(\"test:e2e\");\n\n const rule = `---\ndescription: Vitest (and optional Playwright) conventions\nglobs: \"**/*.test.{ts,tsx}\",vitest.config.*,e2e/**,playwright.config.*\nalwaysApply: false\n---\n\n# Testing\n\n- Vitest: colocated \\`<name>.test.tsx\\` next to components; also \\`tests/**\\`.\n- Prefer \\`renderToStaticMarkup\\` for simple server component smoke.\n- Run \\`${testCmd}\\`. Playwright (if enabled): \\`${e2eCmd}\\`.\n`;\n\n await fs.writeFile(\n path.join(projectDir, \"vitest.config.mts\"),\n VITEST_CONFIG,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(\n projectDir,\n \"src\",\n \"app\",\n \"_components\",\n \"welcome-card\",\n \"welcome-card.test.tsx\",\n ),\n SAMPLE_TEST,\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"testing.mdc\"),\n rule,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"tooling\", \"testing.md\"),\n `# Testing\n\nVitest: \\`${testCmd}\\`\nConfig: \\`vitest.config.mts\\`\nColocate \\`*.test.tsx\\` with components under \\`src/\\`.\n${options.playwright ? `\\nPlaywright: \\`${e2eCmd}\\` · config \\`playwright.config.ts\\` · specs in \\`e2e/\\`.\\n` : \"\"}\n`,\n );\n\n await addDependencies(\n projectDir,\n {\n vitest: \"^3.0.5\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n jsdom: \"^26.0.0\",\n },\n \"devDependencies\",\n );\n await addScripts(projectDir, {\n test: \"vitest run\",\n \"test:watch\": \"vitest\",\n });\n\n if (options.playwright) {\n await fs.writeFile(\n path.join(projectDir, \"playwright.config.ts\"),\n playwrightConfig(pm.runScript(\"dev\")),\n \"utf8\",\n );\n await fs.outputFile(path.join(projectDir, \"e2e\", \"home.spec.ts\"), E2E_SMOKE);\n await addDependencies(\n projectDir,\n { \"@playwright/test\": \"^1.50.1\" },\n \"devDependencies\",\n );\n await addScripts(projectDir, {\n \"test:e2e\": \"playwright test\",\n });\n }\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport {\n addDependencies,\n removeDependencies,\n} from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst ENV_ZOD = `import { z } from \"zod\";\n\n/**\n * Validated public env. Import from Client Components only for NEXT_PUBLIC_*.\n * Server-only secrets stay out of this schema until needed.\n */\nconst publicEnvSchema = z.object({\n NEXT_PUBLIC_APP_URL: z.string().url().default(\"http://localhost:3000\"),\n NEXT_PUBLIC_API_URL: z.string().url().default(\"http://localhost:8000\"),\n});\n\nexport type PublicEnv = z.infer<typeof publicEnvSchema>;\n\nexport const env: PublicEnv = publicEnvSchema.parse({\n NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL,\n NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,\n});\n`;\n\nconst ENV_YUP = `import * as yup from \"yup\";\n\n/**\n * Validated public env. Import from Client Components only for NEXT_PUBLIC_*.\n * Server-only secrets stay out of this schema until needed.\n */\nconst publicEnvSchema = yup.object({\n NEXT_PUBLIC_APP_URL: yup\n .string()\n .url()\n .default(\"http://localhost:3000\"),\n NEXT_PUBLIC_API_URL: yup\n .string()\n .url()\n .default(\"http://localhost:8000\"),\n});\n\nexport type PublicEnv = yup.InferType<typeof publicEnvSchema>;\n\nexport const env: PublicEnv = publicEnvSchema.validateSync({\n NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL,\n NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,\n});\n`;\n\nfunction formsRule(validation: \"zod\" | \"yup\"): string {\n const schemaLine =\n validation === \"zod\"\n ? \"- RHF + `Controller` + Zod `zodResolver`. Schema `satisfies z.ZodType<*Body>` when endpoints codegen exists; field names = API keys.\"\n : \"- RHF + `Controller` + Yup `yupResolver`. Schemas in `src/lib/validations/`; field names = API keys when endpoints codegen exists.\";\n\n return `---\ndescription: RHF + ${validation === \"zod\" ? \"Zod\" : \"Yup\"} forms aligned to API body types\nglobs: src/**/*form*/**,src/**/*-form*/**,src/**/*.form.tsx,src/components/forms/**,src/lib/**/*form*.ts,src/lib/validations/**\nalwaysApply: false\n---\n\n# Forms\n\n- \\`\"use client\"\\` + named exports. \\`page.tsx\\` stays server when metadata-only.\n- Placement: shared → \\`src/components/forms/<name>/\\`; one route → \\`src/app/<route>/_components/forms/<name>/\\`.\n${schemaLine}\n- Reuse shared/UI controls — no ad-hoc inputs.\n- Required: derive from schema / \\`*Body\\`; use \\`required\\` on Field/Label (no handmade \\`*\\` text).\n- Invalid: \\`data-invalid\\`, \\`aria-invalid\\`, \\`FieldError\\`.\n- Server 400 envelope: \\`getApiErrorMessage\\` / \\`extractApiFieldErrors\\` (\\`@/utils/api-error\\`); map to \\`setError\\` when using RHF.\n- Never duplicate the same form state/submit logic across pages.\n`;\n}\n\nfunction validationRule(validation: \"zod\" | \"yup\"): string {\n return `---\ndescription: ${validation === \"zod\" ? \"Zod\" : \"Yup\"} validation conventions\nglobs: src/lib/env.ts,src/lib/validations/**,src/**/*schema*.{ts,tsx}\nalwaysApply: false\n---\n\n# Validation (${validation})\n\n- Public env: \\`src/lib/env.ts\\` (${validation} schema).\n- Domain schemas: \\`src/lib/validations/<name>.ts\\`.\n- Forms: use \\`${validation === \"zod\" ? \"zodResolver\" : \"yupResolver\"}\\` from \\`@hookform/resolvers\\`.\n- Prefer one library — do not mix Zod and Yup in the same app.\n`;\n}\n\nexport const validationInstaller: Installer = {\n id: \"validation\",\n active: () => true,\n async run({ projectDir, options }) {\n const validationsDir = path.join(projectDir, \"src\", \"lib\", \"validations\");\n await fs.ensureDir(validationsDir);\n await fs.writeFile(path.join(validationsDir, \".gitkeep\"), \"\", \"utf8\");\n\n if (options.validation === \"yup\") {\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"env.ts\"),\n ENV_YUP,\n \"utf8\",\n );\n await removeDependencies(projectDir, [\"zod\"]);\n await addDependencies(projectDir, { yup: \"^1.6.1\" });\n } else {\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"env.ts\"),\n ENV_ZOD,\n \"utf8\",\n );\n await addDependencies(projectDir, { zod: \"^3.24.1\" });\n }\n\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"forms.mdc\"),\n formsRule(options.validation),\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"validation.mdc\"),\n validationRule(options.validation),\n \"utf8\",\n );\n\n await fs.outputFile(\n path.join(\n projectDir,\n \"docs\",\n \"style-guide\",\n \"validation\",\n `${options.validation}.md`,\n ),\n `# Validation — ${options.validation}\n\nEnv: \\`src/lib/env.ts\\`\nSchemas: \\`src/lib/validations/\\`\nForms: \\`@hookform/resolvers/${options.validation}\\` when using RHF.\n`,\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { Installer } from \"./types.js\";\n\nconst VERCEL_JSON = `{\n \"framework\": \"nextjs\",\n \"regions\": [\"iad1\"]\n}\n`;\n\nconst RULE = `---\ndescription: Vercel deployment conventions\nglobs: vercel.json\nalwaysApply: false\n---\n\n# Vercel\n\n- Config: \\`vercel.json\\` (framework Next.js).\n- Set \\`NEXT_PUBLIC_APP_URL\\` / \\`NEXT_PUBLIC_API_URL\\` (and \\`AUTH_SECRET\\` if Auth.js) in the Vercel project env.\n- Prefer Preview env for staging; Production for live.\n- Do not commit \\`.vercel\\` or production secrets.\n`;\n\nexport const vercelInstaller: Installer = {\n id: \"vercel\",\n active: (o) => o.deploy === \"vercel\",\n async run({ projectDir }) {\n await fs.writeFile(\n path.join(projectDir, \"vercel.json\"),\n VERCEL_JSON,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"vercel.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"ops\", \"vercel.md\"),\n `# Vercel\n\n- \\`vercel.json\\` — Next.js framework hint\n- Link the repo in the Vercel dashboard (or \\`npx vercel\\`)\n- Env: copy from \\`.env.production.example\\` into Project → Settings → Environment Variables\n`,\n );\n },\n};\n","import { apiEnvelopeInstaller } from \"./api-envelope.js\";\nimport { appProvidersInstaller } from \"./app-providers.js\";\nimport { authAuthjsInstaller } from \"./auth-authjs.js\";\nimport { authJwtInstaller } from \"./auth-jwt.js\";\nimport { ciInstaller } from \"./ci.js\";\nimport { darkModeInstaller } from \"./dark-mode.js\";\nimport { dockerComposeInstaller } from \"./docker-compose.js\";\nimport { dockerInstaller } from \"./docker.js\";\nimport { endpointsInstaller } from \"./endpoints.js\";\nimport { eslintInstaller } from \"./eslint.js\";\nimport { huskyInstaller } from \"./husky.js\";\nimport { i18nInstaller } from \"./i18n.js\";\nimport { iconsInstaller } from \"./icons.js\";\nimport { muiInstaller } from \"./mui.js\";\nimport { packageManagerInstaller } from \"./package-manager.js\";\nimport { prettierInstaller } from \"./prettier.js\";\nimport { seoInstaller } from \"./seo.js\";\nimport { shadcnInstaller } from \"./shadcn.js\";\nimport { storeInstaller } from \"./store.js\";\nimport { surfaceInstaller } from \"./surface.js\";\nimport { tailwindInstaller } from \"./tailwind.js\";\nimport { tanstackQueryInstaller } from \"./tanstack-query.js\";\nimport { testingInstaller } from \"./testing.js\";\nimport { validationInstaller } from \"./validation.js\";\nimport { vercelInstaller } from \"./vercel.js\";\nimport type { Installer, InstallerContext } from \"./types.js\";\n\nexport type { Installer, InstallerContext } from \"./types.js\";\n\nexport const installers: Installer[] = [\n packageManagerInstaller,\n iconsInstaller,\n storeInstaller,\n tanstackQueryInstaller,\n endpointsInstaller,\n apiEnvelopeInstaller,\n authJwtInstaller,\n authAuthjsInstaller,\n tailwindInstaller,\n darkModeInstaller,\n muiInstaller,\n shadcnInstaller,\n validationInstaller,\n seoInstaller,\n i18nInstaller,\n dockerComposeInstaller,\n testingInstaller,\n eslintInstaller,\n prettierInstaller,\n huskyInstaller,\n dockerInstaller,\n vercelInstaller,\n ciInstaller,\n appProvidersInstaller,\n surfaceInstaller,\n];\n\nexport type InstallerProgress = {\n id: string;\n index: number;\n total: number;\n};\n\nexport async function runInstallers(\n ctx: InstallerContext,\n onProgress?: (step: InstallerProgress) => void | Promise<void>,\n): Promise<string[]> {\n const active = installers.filter((installer) =>\n installer.active(ctx.options),\n );\n const ran: string[] = [];\n\n for (let i = 0; i < active.length; i += 1) {\n const installer = active[i]!;\n await onProgress?.({\n id: installer.id,\n index: i + 1,\n total: active.length,\n });\n await installer.run(ctx);\n ran.push(installer.id);\n }\n\n return ran;\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\n\nimport { TEMPLATE_DIR } from \"./constants.js\";\n\nconst TRACKED = [\n \"AGENTS.md\",\n \".cursor/rules/core.mdc\",\n \".cursor/rules/components.mdc\",\n \".cursor/rules/forms.mdc\",\n] as const;\n\nfunction rel(projectDir: string, file: string): string {\n return path.join(projectDir, file);\n}\n\nfunction templatePath(file: string): string {\n return path.join(TEMPLATE_DIR, file);\n}\n\n/**\n * Diff (and optionally apply) core agent surface files from the CLI template\n * into an existing generated app.\n */\nexport async function runUpgrade(options: {\n projectDir: string;\n apply: boolean;\n}): Promise<void> {\n const { projectDir, apply } = options;\n\n if (!(await fs.pathExists(path.join(projectDir, \"package.json\")))) {\n throw new Error(`Not an app directory (missing package.json): ${projectDir}`);\n }\n if (!(await fs.pathExists(TEMPLATE_DIR))) {\n throw new Error(`Template missing at ${TEMPLATE_DIR}`);\n }\n\n p.intro(color.bgCyan(color.black(\" next-style-guide upgrade \")));\n p.log.info(\n apply\n ? `Applying template agent files → ${projectDir}`\n : `Diff only (pass --apply to write). Target: ${projectDir}`,\n );\n\n let changed = 0;\n let missing = 0;\n let same = 0;\n\n for (const file of TRACKED) {\n const from = templatePath(file);\n const to = rel(projectDir, file);\n if (!(await fs.pathExists(from))) {\n p.log.warn(`Template missing ${file}`);\n continue;\n }\n\n const next = await fs.readFile(from, \"utf8\");\n // Preserve project name token already replaced in AGENTS.md\n let outgoing = next;\n if (file === \"AGENTS.md\" && (await fs.pathExists(to))) {\n const current = await fs.readFile(to, \"utf8\");\n const nameMatch = current.match(/^# Agents \\((.+)\\)$/m);\n if (nameMatch?.[1]) {\n outgoing = outgoing.replace(\"__PROJECT_NAME__\", nameMatch[1]);\n }\n const pmMatch = current.match(/· ([a-z]+)(\\.|$)/m);\n // Keep existing package manager word if present in Stack line\n if (current.includes(\"pnpm\") || current.includes(\"npm\") || current.includes(\"yarn\")) {\n const stackPm = current.match(/· (pnpm|npm|yarn)\\./);\n if (stackPm?.[1]) {\n outgoing = outgoing.replace(\"__PACKAGE_MANAGER__\", stackPm[1]);\n }\n }\n }\n outgoing = outgoing\n .replaceAll(\"__PROJECT_NAME__\", path.basename(projectDir))\n .replaceAll(\"__PACKAGE_MANAGER__\", \"pnpm\")\n .replaceAll(\"__PROJECT_SLUG__\", path.basename(projectDir));\n\n if (!(await fs.pathExists(to))) {\n missing += 1;\n p.log.warn(`missing ${file}`);\n if (apply) {\n await fs.ensureDir(path.dirname(to));\n await fs.writeFile(to, outgoing, \"utf8\");\n p.log.success(`wrote ${file}`);\n }\n continue;\n }\n\n const current = await fs.readFile(to, \"utf8\");\n if (current === outgoing) {\n same += 1;\n p.log.step(color.dim(`same ${file}`));\n continue;\n }\n\n changed += 1;\n p.log.warn(`differs ${file}`);\n if (apply) {\n await fs.writeFile(to, outgoing, \"utf8\");\n p.log.success(`updated ${file}`);\n }\n }\n\n p.note(\n [\n `same=${same} differs=${changed} missing=${missing}`,\n apply\n ? \"Applied template agent surface.\"\n : \"Re-run with --apply to write differs/missing files.\",\n \"Feature rules (.cursor/rules/* beyond core/components/forms) are not overwritten — re-scaffold options or copy manually.\",\n ].join(\"\\n\"),\n \"Summary\",\n );\n p.outro(color.green(apply ? \"Upgrade applied.\" : \"Diff complete.\"));\n}\n"],"mappings":"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","names":["p","color","path","fs","path","p","color","path","fs","path","fs","path","fs","path","fs","path","RULE","fs","path","fs","path","RULE","fs","path","path","fs","fs","path","RULE","path","fs","fs","path","RULE","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","RULE","fs","path","fs","path","RULE","path","fs","fs","path","THEME_PROVIDER","RULE","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","RULE","fs","path","path","fs","fs","path","path","fs","fs","path","text","fs","path","fs","path","RULE","fs","path","fs","path","RULE","path","fs","fs","path","fs","path","fs","path","path","fs","fs","path","RULE","path","fs","color","fs","path","p","color","path","fs","color","current","projectDir","path","color"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/helpers/package-manager.ts","../src/helpers/project-target.ts","../src/helpers/slugify.ts","../src/presets.ts","../src/prompts.ts","../src/types.ts","../src/scaffold.ts","../src/helpers/run-package-install.ts","../src/helpers/replace-tokens.ts","../src/installers/api-envelope.ts","../src/helpers/app-providers.ts","../src/installers/app-providers.ts","../src/installers/auth-authjs.ts","../src/helpers/package-json.ts","../src/installers/auth-jwt.ts","../src/installers/ci.ts","../src/installers/dark-mode.ts","../src/installers/docker-compose.ts","../src/installers/docker.ts","../src/installers/endpoints.ts","../src/installers/eslint.ts","../src/installers/husky.ts","../src/installers/i18n.ts","../src/installers/icons.ts","../src/installers/mui.ts","../src/installers/package-manager.ts","../src/installers/prettier.ts","../src/installers/seo.ts","../src/installers/shadcn.ts","../src/installers/store.ts","../src/installers/surface.ts","../src/installers/tailwind.ts","../src/installers/tanstack-query.ts","../src/installers/testing.ts","../src/installers/validation.ts","../src/installers/vercel.ts","../src/installers/index.ts","../src/upgrade.ts"],"sourcesContent":["import * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\nimport path from \"node:path\";\n\nimport { PKG_NAME, TITLE } from \"./constants.js\";\nimport { getPackageManager } from \"./helpers/package-manager.js\";\nimport { resolveProjectTarget } from \"./helpers/project-target.js\";\nimport {\n collectOptionWarnings,\n PRESET_SEEDS,\n type PresetId,\n} from \"./presets.js\";\nimport { runPrompts } from \"./prompts.js\";\nimport { scaffold } from \"./scaffold.js\";\nimport { runUpgrade } from \"./upgrade.js\";\nimport {\n DEFAULT_OPTIONS,\n normalizeOptions,\n type AuthOption,\n type DeployOption,\n type IconOption,\n type PackageManager,\n type ScaffoldOptions,\n type ShadcnSetOption,\n type StoreOption,\n type StylingOption,\n type ValidationOption,\n} from \"./types.js\";\n\nconst ICON_VALUES = new Set<IconOption>([\"none\", \"lucide\", \"tabler\"]);\nconst STYLING_VALUES = new Set<StylingOption>([\"none\", \"tailwind\", \"mui\"]);\nconst VALIDATION_VALUES = new Set<ValidationOption>([\"zod\", \"yup\"]);\nconst AUTH_VALUES = new Set<AuthOption>([\"none\", \"jwt\", \"authjs\"]);\nconst STORE_VALUES = new Set<StoreOption>([\"none\", \"zustand\", \"redux\"]);\nconst PM_VALUES = new Set<PackageManager>([\"pnpm\", \"npm\", \"yarn\"]);\nconst SHADCN_SET_VALUES = new Set<ShadcnSetOption>([\"minimal\", \"starter\"]);\nconst DEPLOY_VALUES = new Set<DeployOption>([\"none\", \"vercel\", \"docker\"]);\nconst PRESET_VALUES = new Set<PresetId>([\n \"custom\",\n \"minimal\",\n \"api-app\",\n \"marketing\",\n \"dashboard\",\n]);\n\ntype FlagBag = {\n name?: string;\n noInstall: boolean;\n yes: boolean;\n upgrade: boolean;\n apply: boolean;\n verbose: boolean;\n preset?: PresetId;\n packageManager?: PackageManager;\n icons?: IconOption;\n styling?: StylingOption;\n shadcn?: boolean;\n shadcnSet?: ShadcnSetOption;\n validation?: ValidationOption;\n auth?: AuthOption;\n store?: StoreOption;\n tanstackQuery?: boolean;\n endpoints?: boolean;\n apiEnvelope?: boolean;\n seo?: boolean;\n i18n?: boolean;\n darkMode?: boolean;\n testing?: boolean;\n playwright?: boolean;\n eslint?: boolean;\n prettier?: boolean;\n husky?: boolean;\n deploy?: DeployOption;\n ci?: boolean;\n};\n\nfunction parseBoolFlag(\n arg: string,\n positive: string,\n negative: string,\n): boolean | undefined {\n if (arg === positive) return true;\n if (arg === negative) return false;\n return undefined;\n}\n\nfunction readChoice<T extends string>(\n arg: string,\n flag: string,\n values: Set<T>,\n args: string[],\n i: number,\n): { value: T; nextIndex: number } | null {\n if (arg.startsWith(`${flag}=`)) {\n const value = arg.slice(flag.length + 1) as T;\n if (!values.has(value)) {\n throw new Error(`Invalid ${flag}=${value}.`);\n }\n return { value, nextIndex: i };\n }\n if (arg === flag) {\n const value = args[i + 1] as T | undefined;\n if (!value || !values.has(value)) {\n throw new Error(`Invalid ${flag}.`);\n }\n return { value, nextIndex: i + 1 };\n }\n return null;\n}\n\nfunction parseArgs(argv: string[]): FlagBag {\n const args = argv.slice(2);\n const out: FlagBag = {\n noInstall: false,\n yes: false,\n upgrade: false,\n apply: false,\n verbose: false,\n };\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i]!;\n\n if (arg === \"upgrade\") {\n out.upgrade = true;\n continue;\n }\n if (arg === \"--apply\") {\n out.apply = true;\n continue;\n }\n if (arg === \"--diff\") {\n out.upgrade = true;\n out.apply = false;\n continue;\n }\n if (arg === \"--verbose\" || arg === \"-V\") {\n out.verbose = true;\n continue;\n }\n if (arg === \"--no-install\") {\n out.noInstall = true;\n continue;\n }\n if (arg === \"--yes\" || arg === \"-y\") {\n out.yes = true;\n continue;\n }\n if (arg === \"--help\" || arg === \"-h\") {\n printHelp();\n process.exit(0);\n }\n\n const boolKeys = [\n [\"tanstackQuery\", \"--tanstack-query\", \"--no-tanstack-query\"],\n [\"endpoints\", \"--endpoints\", \"--no-endpoints\"],\n [\"apiEnvelope\", \"--api-envelope\", \"--no-api-envelope\"],\n [\"seo\", \"--seo\", \"--no-seo\"],\n [\"i18n\", \"--i18n\", \"--no-i18n\"],\n [\"darkMode\", \"--dark-mode\", \"--no-dark-mode\"],\n [\"testing\", \"--testing\", \"--no-testing\"],\n [\"playwright\", \"--playwright\", \"--no-playwright\"],\n [\"eslint\", \"--eslint\", \"--no-eslint\"],\n [\"prettier\", \"--prettier\", \"--no-prettier\"],\n [\"husky\", \"--husky\", \"--no-husky\"],\n [\"ci\", \"--ci\", \"--no-ci\"],\n [\"shadcn\", \"--shadcn\", \"--no-shadcn\"],\n ] as const;\n let matched = false;\n for (const [key, pos, neg] of boolKeys) {\n const v = parseBoolFlag(arg, pos, neg);\n if (v !== undefined) {\n out[key] = v;\n matched = true;\n break;\n }\n }\n if (matched) continue;\n\n const preset = readChoice(arg, \"--preset\", PRESET_VALUES, args, i);\n if (preset) {\n out.preset = preset.value;\n i = preset.nextIndex;\n continue;\n }\n const pm = readChoice(arg, \"--pm\", PM_VALUES, args, i);\n if (pm) {\n out.packageManager = pm.value;\n i = pm.nextIndex;\n continue;\n }\n const pmLong = readChoice(arg, \"--package-manager\", PM_VALUES, args, i);\n if (pmLong) {\n out.packageManager = pmLong.value;\n i = pmLong.nextIndex;\n continue;\n }\n const store = readChoice(arg, \"--store\", STORE_VALUES, args, i);\n if (store) {\n out.store = store.value;\n i = store.nextIndex;\n continue;\n }\n const styling = readChoice(arg, \"--styling\", STYLING_VALUES, args, i);\n if (styling) {\n out.styling = styling.value;\n i = styling.nextIndex;\n continue;\n }\n const validation = readChoice(\n arg,\n \"--validation\",\n VALIDATION_VALUES,\n args,\n i,\n );\n if (validation) {\n out.validation = validation.value;\n i = validation.nextIndex;\n continue;\n }\n const auth = readChoice(arg, \"--auth\", AUTH_VALUES, args, i);\n if (auth) {\n out.auth = auth.value;\n i = auth.nextIndex;\n continue;\n }\n const icons = readChoice(arg, \"--icons\", ICON_VALUES, args, i);\n if (icons) {\n out.icons = icons.value;\n i = icons.nextIndex;\n continue;\n }\n const shadcnSet = readChoice(arg, \"--shadcn-set\", SHADCN_SET_VALUES, args, i);\n if (shadcnSet) {\n out.shadcnSet = shadcnSet.value;\n out.shadcn = true;\n i = shadcnSet.nextIndex;\n continue;\n }\n const deploy = readChoice(arg, \"--deploy\", DEPLOY_VALUES, args, i);\n if (deploy) {\n out.deploy = deploy.value;\n i = deploy.nextIndex;\n continue;\n }\n // Back-compat aliases\n if (arg === \"--docker\") {\n out.deploy = \"docker\";\n continue;\n }\n if (arg === \"--no-docker\") {\n if (out.deploy === undefined || out.deploy === \"docker\") {\n out.deploy = \"none\";\n }\n continue;\n }\n\n if (!arg.startsWith(\"-\") && !out.name) {\n out.name = arg;\n }\n }\n\n return out;\n}\n\nfunction printHelp(): void {\n console.log(`\n${TITLE} — ${PKG_NAME}\n\nUsage:\n npx create-next-style-guide [name] [options]\n npx create-next-style-guide . [options] # scaffold into current directory\n npx create-next-style-guide upgrade [--apply] [dir]\n npx create-next-style-guide --diff [dir]\n\nOptions:\n --yes, -y\n --no-install\n --preset minimal|api-app|marketing|dashboard|custom\n --pm, --package-manager pnpm|npm|yarn\n --store none|zustand|redux\n --styling none|tailwind|mui\n --shadcn | --no-shadcn\n --shadcn-set minimal|starter\n --dark-mode | --no-dark-mode\n --validation zod|yup\n --auth none|jwt|authjs\n --icons none|lucide|tabler\n --tanstack-query | --no-tanstack-query\n --endpoints | --no-endpoints\n --api-envelope | --no-api-envelope\n --seo | --no-seo\n --i18n | --no-i18n\n --testing | --no-testing\n --playwright | --no-playwright\n --eslint | --no-eslint\n --prettier | --no-prettier\n --husky | --no-husky\n --deploy none|vercel|docker\n --docker | --no-docker (alias for --deploy docker / none)\n --ci | --no-ci\n --verbose, -V advisory tips (e.g. Query vs store)\n --help, -h\n\nUpgrade:\n upgrade [--apply] Diff (default) or apply AGENTS.md + core .cursor/rules\n --diff Alias for upgrade without --apply\n`);\n}\n\nfunction applyFlagOverrides(\n options: ScaffoldOptions,\n flags: FlagBag,\n): ScaffoldOptions {\n let next = { ...options };\n if (flags.packageManager !== undefined) {\n next.packageManager = flags.packageManager;\n }\n if (flags.icons !== undefined) next.icons = flags.icons;\n if (flags.styling !== undefined) next.styling = flags.styling;\n if (flags.shadcn !== undefined) next.ui = flags.shadcn ? \"shadcn\" : \"none\";\n if (flags.shadcnSet !== undefined) {\n next.shadcnSet = flags.shadcnSet;\n next.ui = \"shadcn\";\n }\n if (flags.validation !== undefined) next.validation = flags.validation;\n if (flags.auth !== undefined) next.auth = flags.auth;\n if (flags.store !== undefined) next.store = flags.store;\n if (flags.tanstackQuery !== undefined) {\n next.data = flags.tanstackQuery ? \"tanstack-query\" : \"rsc\";\n }\n if (flags.endpoints !== undefined) next.endpoints = flags.endpoints;\n if (flags.apiEnvelope !== undefined) next.apiEnvelope = flags.apiEnvelope;\n if (flags.seo !== undefined) next.seo = flags.seo;\n if (flags.i18n !== undefined) next.i18n = flags.i18n;\n if (flags.darkMode !== undefined) next.darkMode = flags.darkMode;\n if (flags.testing !== undefined) next.testing = flags.testing;\n if (flags.playwright !== undefined) next.playwright = flags.playwright;\n if (flags.eslint !== undefined) next.eslint = flags.eslint;\n if (flags.prettier !== undefined) next.prettier = flags.prettier;\n if (flags.husky !== undefined) next.husky = flags.husky;\n if (flags.deploy !== undefined) next.deploy = flags.deploy;\n if (flags.ci !== undefined) next.ci = flags.ci;\n return normalizeOptions(next);\n}\n\nasync function main(): Promise<void> {\n const flags = parseArgs(process.argv);\n\n if (flags.upgrade) {\n const projectDir = path.resolve(process.cwd(), flags.name ?? \".\");\n await runUpgrade({ projectDir, apply: flags.apply });\n return;\n }\n\n let options: ScaffoldOptions;\n\n if (flags.yes) {\n const target = resolveProjectTarget(flags.name ?? \"my-app\");\n const presetSeed =\n flags.preset && flags.preset !== \"custom\"\n ? PRESET_SEEDS[flags.preset]\n : DEFAULT_OPTIONS;\n\n options = applyFlagOverrides(\n {\n name: target.name,\n slug: target.slug,\n outDir: target.outDir,\n ...presetSeed,\n noInstall: flags.noInstall,\n },\n flags,\n );\n p.intro(color.bgCyan(color.black(` ${TITLE} `)));\n p.log.info(\n [\n `Non-interactive: ${options.name} (${options.slug})`,\n target.inPlace ? `out=. (${target.outDir})` : null,\n flags.preset ? `preset=${flags.preset}` : null,\n `pm=${options.packageManager}`,\n `styling=${options.styling} ui=${options.ui}${options.ui === \"shadcn\" ? `:${options.shadcnSet}` : \"\"} auth=${options.auth} store=${options.store}`,\n `deploy=${options.deploy} endpoints=${options.endpoints} seo=${options.seo} i18n=${options.i18n} testing=${options.testing}`,\n ]\n .filter(Boolean)\n .join(\" · \"),\n );\n } else {\n options = await runPrompts(flags.name);\n options.noInstall = flags.noInstall;\n options = applyFlagOverrides(options, flags);\n }\n\n const warnings = collectOptionWarnings(options, { verbose: flags.verbose });\n for (const warning of warnings) {\n p.log.warn(warning);\n }\n\n const projectDir = await scaffold(options);\n const pm = getPackageManager(options.packageManager);\n\n const nextSteps = [\n `cd ${path.relative(process.cwd(), projectDir) || \".\"}`,\n options.noInstall ? `${pm.id} ${pm.installArgs.filter((a) => a !== \"--ignore-workspace\").join(\" \")}`.trim() : null,\n options.ui === \"shadcn\" && options.shadcnSet === \"minimal\"\n ? \"npx shadcn@latest add input # or re-scaffold with --shadcn-set starter\"\n : null,\n options.endpoints\n ? `${pm.runScript(\"endpoints:generate\")} # when API schema is up`\n : null,\n options.testing ? pm.runScript(\"test\") : null,\n pm.runScript(\"dev\"),\n ].filter(Boolean);\n\n p.note(nextSteps.join(\"\\n\"), \"Next steps\");\n p.outro(color.green(\"Done. Happy shipping.\"));\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n p.log.error(message);\n p.cancel(\"Scaffold failed.\");\n process.exit(1);\n});\n","import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst here = path.dirname(fileURLToPath(import.meta.url));\n\n/** Resolved at runtime: dist/ → ../template, or src via tsx → ../template */\nexport const TEMPLATE_DIR = path.resolve(here, \"../template\");\n/** Optional feature file packs copied by installers */\nexport const ADDONS_DIR = path.resolve(here, \"../addons\");\n\nexport const TITLE = \"Next Style Guide\";\nexport const PKG_NAME = \"create-next-style-guide\";\n","import type { PackageManager } from \"../types.js\";\n\nexport type PackageManagerMeta = {\n id: PackageManager;\n /** Corepack `packageManager` field; omit for npm */\n packageManagerField: string | null;\n lockfile: string;\n installArgs: string[];\n /** Run a package.json script: `typecheck`, `dev`, … */\n runScript: (script: string, args?: string[]) => string;\n /** Run a binary from node_modules */\n exec: (bin: string, args?: string[]) => string;\n};\n\nfunction joinArgs(args?: string[]): string {\n return args?.length ? ` ${args.join(\" \")}` : \"\";\n}\n\nexport const PACKAGE_MANAGERS: Record<PackageManager, PackageManagerMeta> = {\n pnpm: {\n id: \"pnpm\",\n packageManagerField: \"pnpm@9.15.0\",\n lockfile: \"pnpm-lock.yaml\",\n installArgs: [\"install\", \"--ignore-workspace\"],\n runScript: (script, args) => `pnpm ${script}${joinArgs(args)}`,\n exec: (bin, args) => `pnpm exec ${bin}${joinArgs(args)}`,\n },\n npm: {\n id: \"npm\",\n packageManagerField: null,\n lockfile: \"package-lock.json\",\n // --install-strategy=hoisted keeps the app isolated if nested under another workspace tree\n installArgs: [\"install\", \"--install-strategy=hoisted\"],\n runScript: (script, args) => `npm run ${script}${joinArgs(args)}`,\n exec: (bin, args) => `npx ${bin}${joinArgs(args)}`,\n },\n yarn: {\n id: \"yarn\",\n packageManagerField: \"yarn@1.22.22\",\n lockfile: \"yarn.lock\",\n installArgs: [\"install\"],\n runScript: (script, args) => `yarn ${script}${joinArgs(args)}`,\n exec: (bin, args) => `yarn ${bin}${joinArgs(args)}`,\n },\n};\n\nexport function getPackageManager(id: PackageManager): PackageManagerMeta {\n return PACKAGE_MANAGERS[id];\n}\n\n/** CI install command (frozen lockfile when present). */\nexport function ciInstallCommand(id: PackageManager): string {\n switch (id) {\n case \"pnpm\":\n return \"pnpm install --frozen-lockfile\";\n case \"npm\":\n return \"npm ci\";\n case \"yarn\":\n return \"yarn install --frozen-lockfile\";\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { slugify } from \"./slugify.js\";\n\n/** create-next-app-style allowlist — scaffold into cwd that only has these. */\nconst IGNORABLE_ENTRIES = new Set([\n \".DS_Store\",\n \".git\",\n \".gitattributes\",\n \".gitignore\",\n \".gitlab-ci.yml\",\n \".hg\",\n \".hgcheck\",\n \".hgignore\",\n \".idea\",\n \".npmignore\",\n \".travis.yml\",\n \".vscode\",\n \"LICENSE\",\n \"LICENSE.md\",\n \"LICENSE.txt\",\n \"README.md\",\n \"Thumbs.db\",\n]);\n\nexport function isInPlaceTarget(target: string): boolean {\n const t = target.trim();\n return t === \".\" || t === \"./\";\n}\n\nexport type ProjectTarget = {\n /** Absolute output directory */\n outDir: string;\n /** Display / token name (folder basename when target is \".\") */\n name: string;\n slug: string;\n inPlace: boolean;\n};\n\nexport function resolveProjectTarget(\n target: string,\n cwd: string = process.cwd(),\n): ProjectTarget {\n const trimmed = target.trim();\n if (!trimmed) {\n throw new Error(\"Project name is required.\");\n }\n\n const inPlace = isInPlaceTarget(trimmed);\n const outDir = path.resolve(cwd, inPlace ? \".\" : trimmed);\n const base = path.basename(outDir);\n const name =\n inPlace && (!base || base === \".\" || base === path.sep)\n ? \"app\"\n : inPlace\n ? base\n : trimmed;\n\n return {\n outDir,\n name,\n slug: slugify(name),\n inPlace,\n };\n}\n\n/** True when dir is missing, empty, or only contains ignorable VCS/editor files. */\nexport async function assertDirScaffoldable(outDir: string): Promise<void> {\n if (!(await fs.pathExists(outDir))) return;\n\n const entries = await fs.readdir(outDir);\n const blockers = entries.filter((entry) => !IGNORABLE_ENTRIES.has(entry));\n if (blockers.length === 0) return;\n\n throw new Error(\n [\n `Target directory is not empty: ${outDir}`,\n `Conflicting entries: ${blockers.slice(0, 8).join(\", \")}${blockers.length > 8 ? \", …\" : \"\"}`,\n `Use an empty folder, or run with \\`.\\` only in a fresh directory (\".git\" / README / LICENSE are OK).`,\n ].join(\"\\n\"),\n );\n}\n","/** Lowercase slug: spaces / hyphens / dots → `_` */\nexport function slugify(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[\\s.-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\")\n .replace(/_+/g, \"_\")\n .replace(/^_|_$/g, \"\");\n\n if (!slug) {\n throw new Error(`Could not derive a package slug from \"${name}\".`);\n }\n if (/^[0-9]/.test(slug)) {\n return `app_${slug}`;\n }\n return slug;\n}\n","import type { ScaffoldOptions } from \"./types.js\";\n\nexport type PresetId =\n | \"custom\"\n | \"minimal\"\n | \"api-app\"\n | \"marketing\"\n | \"dashboard\";\n\ntype OptionSeed = Omit<ScaffoldOptions, \"name\" | \"slug\" | \"noInstall\">;\n\nexport const PRESET_SEEDS: Record<Exclude<PresetId, \"custom\">, OptionSeed> = {\n minimal: {\n packageManager: \"pnpm\",\n auth: \"none\",\n styling: \"none\",\n ui: \"none\",\n shadcnSet: \"minimal\",\n data: \"rsc\",\n store: \"none\",\n icons: \"none\",\n validation: \"zod\",\n i18n: false,\n darkMode: false,\n apiEnvelope: false,\n endpoints: false,\n seo: false,\n eslint: false,\n prettier: false,\n husky: false,\n deploy: \"none\",\n ci: false,\n testing: false,\n playwright: false,\n },\n \"api-app\": {\n packageManager: \"pnpm\",\n auth: \"jwt\",\n styling: \"tailwind\",\n ui: \"shadcn\",\n shadcnSet: \"starter\",\n data: \"tanstack-query\",\n store: \"zustand\",\n icons: \"lucide\",\n validation: \"zod\",\n i18n: false,\n darkMode: true,\n apiEnvelope: true,\n endpoints: true,\n seo: false,\n eslint: true,\n prettier: true,\n husky: true,\n deploy: \"none\",\n ci: true,\n testing: true,\n playwright: false,\n },\n marketing: {\n packageManager: \"pnpm\",\n auth: \"none\",\n styling: \"tailwind\",\n ui: \"shadcn\",\n shadcnSet: \"minimal\",\n data: \"rsc\",\n store: \"none\",\n icons: \"lucide\",\n validation: \"zod\",\n i18n: true,\n darkMode: true,\n apiEnvelope: false,\n endpoints: false,\n seo: true,\n eslint: true,\n prettier: true,\n husky: true,\n deploy: \"vercel\",\n ci: true,\n testing: true,\n playwright: false,\n },\n dashboard: {\n packageManager: \"pnpm\",\n auth: \"none\",\n styling: \"tailwind\",\n ui: \"shadcn\",\n shadcnSet: \"starter\",\n data: \"tanstack-query\",\n store: \"zustand\",\n icons: \"lucide\",\n validation: \"zod\",\n i18n: false,\n darkMode: true,\n apiEnvelope: false,\n endpoints: false,\n seo: false,\n eslint: true,\n prettier: true,\n husky: true,\n deploy: \"none\",\n ci: true,\n testing: true,\n playwright: false,\n },\n};\n\nexport function describePreset(id: Exclude<PresetId, \"custom\">): string {\n const seed = PRESET_SEEDS[id];\n return [\n `styling=${seed.styling}`,\n seed.ui === \"shadcn\" ? `shadcn:${seed.shadcnSet}` : null,\n `auth=${seed.auth}`,\n seed.store !== \"none\" ? `store=${seed.store}` : null,\n `validation=${seed.validation}`,\n seed.endpoints ? \"endpoints\" : null,\n seed.data === \"tanstack-query\" ? \"query\" : null,\n seed.darkMode ? \"dark\" : null,\n seed.deploy !== \"none\" ? `deploy=${seed.deploy}` : null,\n seed.seo ? \"seo\" : null,\n seed.i18n ? \"i18n\" : null,\n seed.testing ? \"vitest\" : null,\n ]\n .filter(Boolean)\n .join(\" · \");\n}\n\ntype WarningOpts = {\n /** Include advisory tips (Query vs store, etc.). Default: false. */\n verbose?: boolean;\n};\n\n/** Soft warnings for odd but allowed combinations. */\nexport function collectOptionWarnings(\n options: ScaffoldOptions,\n { verbose = false }: WarningOpts = {},\n): string[] {\n const warnings: string[] = [];\n\n if (options.auth === \"jwt\" && !options.endpoints) {\n warnings.push(\n \"JWT without endpoints: only token-storage is added (no axios refresh wiring).\",\n );\n }\n if (options.ui === \"shadcn\" && options.styling !== \"tailwind\") {\n warnings.push(\"shadcn requires Tailwind — ui forced to none.\");\n }\n if (options.darkMode && options.styling !== \"tailwind\") {\n warnings.push(\"Dark mode requires Tailwind — disabled.\");\n }\n if (options.apiEnvelope && !options.endpoints) {\n warnings.push(\n \"API envelope enabled without endpoints: unwrap applies to src/lib/http.ts apiFetch.\",\n );\n }\n if (options.playwright && !options.testing) {\n warnings.push(\"Playwright was requested without Vitest — enabling testing.\");\n }\n if (\n verbose &&\n options.store !== \"none\" &&\n options.data === \"tanstack-query\"\n ) {\n warnings.push(\n \"Tip: Query = server cache; store = UI/session only. See docs/style-guide/overview/architecture.md\",\n );\n }\n\n return warnings;\n}\n","import * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\n\nimport { TITLE } from \"./constants.js\";\nimport { resolveProjectTarget } from \"./helpers/project-target.js\";\nimport {\n collectOptionWarnings,\n describePreset,\n PRESET_SEEDS,\n type PresetId,\n} from \"./presets.js\";\nimport {\n DEFAULT_OPTIONS,\n normalizeOptions,\n type AuthOption,\n type DeployOption,\n type IconOption,\n type PackageManager,\n type ScaffoldOptions,\n type ShadcnSetOption,\n type StoreOption,\n type StylingOption,\n type ValidationOption,\n} from \"./types.js\";\n\nfunction assertNotCancel<T>(value: T): Exclude<T, symbol> {\n if (p.isCancel(value)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n return value as Exclude<T, symbol>;\n}\n\nasync function promptCustomOptions(\n base: Omit<ScaffoldOptions, \"name\" | \"slug\" | \"noInstall\">,\n): Promise<Omit<ScaffoldOptions, \"name\" | \"slug\" | \"noInstall\">> {\n const styling = assertNotCancel(\n await p.select({\n message: \"Styling system?\",\n options: [\n { value: \"none\" satisfies StylingOption, label: \"None\", hint: \"plain CSS\" },\n {\n value: \"tailwind\" satisfies StylingOption,\n label: \"Tailwind CSS\",\n hint: \"enables optional shadcn\",\n },\n {\n value: \"mui\" satisfies StylingOption,\n label: \"MUI\",\n hint: \"no shadcn\",\n },\n ],\n initialValue: base.styling,\n }),\n );\n\n let ui: ScaffoldOptions[\"ui\"] = \"none\";\n let shadcnSet: ShadcnSetOption = \"minimal\";\n let darkMode = false;\n if (styling === \"tailwind\") {\n const useShadcn = assertNotCancel(\n await p.confirm({\n message: \"Add shadcn/ui?\",\n initialValue: base.ui === \"shadcn\",\n }),\n );\n ui = useShadcn ? \"shadcn\" : \"none\";\n if (useShadcn) {\n shadcnSet = assertNotCancel(\n await p.select({\n message: \"shadcn component set?\",\n options: [\n {\n value: \"minimal\" satisfies ShadcnSetOption,\n label: \"Minimal\",\n hint: \"Button only\",\n },\n {\n value: \"starter\" satisfies ShadcnSetOption,\n label: \"Starter\",\n hint: \"Button · Input · Card · Dialog\",\n },\n ],\n initialValue: base.shadcnSet,\n }),\n );\n }\n darkMode = assertNotCancel(\n await p.confirm({\n message: \"Add dark mode (next-themes)?\",\n initialValue: base.darkMode,\n }),\n );\n }\n\n const icons = assertNotCancel(\n await p.select({\n message: \"Icon library?\",\n options: [\n { value: \"none\" satisfies IconOption, label: \"None\" },\n { value: \"lucide\" satisfies IconOption, label: \"Lucide\" },\n { value: \"tabler\" satisfies IconOption, label: \"Tabler\" },\n ],\n initialValue: base.icons,\n }),\n );\n\n const validation = assertNotCancel(\n await p.select({\n message: \"Validation library?\",\n options: [\n { value: \"zod\" satisfies ValidationOption, label: \"Zod\" },\n { value: \"yup\" satisfies ValidationOption, label: \"Yup\" },\n ],\n initialValue: base.validation,\n }),\n );\n\n const useTanstackQuery = assertNotCancel(\n await p.confirm({\n message: \"Add TanStack Query?\",\n initialValue: base.data === \"tanstack-query\",\n }),\n );\n\n const needsStore = assertNotCancel(\n await p.confirm({\n message: \"Add a client store (global UI state)?\",\n initialValue: base.store !== \"none\",\n }),\n );\n\n let store: StoreOption = \"none\";\n if (needsStore) {\n store = assertNotCancel(\n await p.select({\n message: \"Which store library?\",\n options: [\n {\n value: \"zustand\" satisfies StoreOption,\n label: \"Zustand\",\n hint: \"lightweight\",\n },\n {\n value: \"redux\" satisfies StoreOption,\n label: \"Redux Toolkit\",\n hint: \"structured slices\",\n },\n ],\n initialValue: base.store === \"redux\" ? \"redux\" : \"zustand\",\n }),\n );\n }\n\n const endpoints = assertNotCancel(\n await p.confirm({\n message: \"Add OpenAPI endpoints codegen?\",\n initialValue: base.endpoints,\n }),\n );\n\n let apiEnvelope = base.apiEnvelope;\n if (endpoints) {\n apiEnvelope = assertNotCancel(\n await p.confirm({\n message: \"Unwrap API envelopes in http/axios helpers?\",\n initialValue: true,\n }),\n );\n } else {\n apiEnvelope = assertNotCancel(\n await p.confirm({\n message: \"Unwrap API envelopes in apiFetch (lib/http.ts)?\",\n initialValue: false,\n }),\n );\n }\n\n const auth = assertNotCancel(\n await p.select({\n message: \"Auth?\",\n options: [\n { value: \"none\" satisfies AuthOption, label: \"None\" },\n {\n value: \"jwt\" satisfies AuthOption,\n label: \"JWT\",\n hint: \"Bearer + refresh\",\n },\n {\n value: \"authjs\" satisfies AuthOption,\n label: \"Auth.js\",\n hint: \"Credentials demo\",\n },\n ],\n initialValue: base.auth,\n }),\n );\n\n const seo = assertNotCancel(\n await p.confirm({\n message: \"Add SEO helpers (sitemap/robots)?\",\n initialValue: base.seo,\n }),\n );\n\n const i18n = assertNotCancel(\n await p.confirm({\n message: \"Add i18n (next-intl)?\",\n initialValue: base.i18n,\n }),\n );\n\n const testing = assertNotCancel(\n await p.confirm({\n message: \"Add Vitest?\",\n initialValue: base.testing,\n }),\n );\n\n let playwright = false;\n if (testing) {\n playwright = assertNotCancel(\n await p.confirm({\n message: \"Also add Playwright e2e?\",\n initialValue: base.playwright,\n }),\n );\n }\n\n const eslint = assertNotCancel(\n await p.confirm({\n message: \"Enhanced ESLint?\",\n initialValue: base.eslint,\n }),\n );\n\n const prettier = assertNotCancel(\n await p.confirm({\n message: \"Add Prettier?\",\n initialValue: base.prettier,\n }),\n );\n\n const husky = assertNotCancel(\n await p.confirm({\n message: \"Add Husky + lint-staged?\",\n initialValue: base.husky,\n }),\n );\n\n const deploy = assertNotCancel(\n await p.select({\n message: \"Deployment target?\",\n options: [\n {\n value: \"none\" satisfies DeployOption,\n label: \"None\",\n hint: \"no deploy files\",\n },\n {\n value: \"vercel\" satisfies DeployOption,\n label: \"Vercel\",\n hint: \"vercel.json + docs\",\n },\n {\n value: \"docker\" satisfies DeployOption,\n label: \"Docker\",\n hint: \"standalone production image\",\n },\n ],\n initialValue: base.deploy,\n }),\n );\n\n const ci = assertNotCancel(\n await p.confirm({\n message: \"Add GitHub Actions CI?\",\n initialValue: base.ci,\n }),\n );\n\n return {\n ...base,\n styling,\n ui,\n shadcnSet,\n darkMode,\n icons,\n validation,\n data: useTanstackQuery ? \"tanstack-query\" : \"rsc\",\n store,\n endpoints,\n apiEnvelope,\n auth,\n seo,\n i18n,\n testing,\n playwright,\n eslint,\n prettier,\n husky,\n deploy,\n ci,\n };\n}\n\n/** Interactive prompts for scaffold options. */\nexport async function runPrompts(\n initialName?: string,\n): Promise<ScaffoldOptions> {\n p.intro(color.bgCyan(color.black(` ${TITLE} `)));\n\n const rawName = assertNotCancel(\n await p.text({\n message: \"Project name? (use . for current directory)\",\n placeholder: \"my-app\",\n initialValue: initialName ?? \"my-app\",\n validate(value) {\n const next = value ?? \"\";\n if (!next.trim()) return \"Name is required.\";\n try {\n resolveProjectTarget(next);\n } catch (error) {\n return error instanceof Error ? error.message : \"Invalid name.\";\n }\n },\n }),\n );\n\n const target = resolveProjectTarget(rawName);\n const { name, slug, outDir } = target;\n if (target.inPlace) {\n p.log.info(`Scaffolding into current directory → ${outDir}`);\n }\n\n const packageManager = assertNotCancel(\n await p.select({\n message: \"Package manager?\",\n options: [\n { value: \"pnpm\" as const, label: \"pnpm\", hint: \"default\" },\n { value: \"npm\" as const, label: \"npm\" },\n { value: \"yarn\" as const, label: \"yarn\", hint: \"classic\" },\n ],\n initialValue: \"pnpm\" as const,\n }),\n ) as PackageManager;\n\n const preset = assertNotCancel(\n await p.select({\n message: \"Preset?\",\n options: [\n {\n value: \"minimal\" as const,\n label: \"Minimal\",\n hint: describePreset(\"minimal\"),\n },\n {\n value: \"api-app\" as const,\n label: \"API app\",\n hint: describePreset(\"api-app\"),\n },\n {\n value: \"marketing\" as const,\n label: \"Marketing / site\",\n hint: describePreset(\"marketing\"),\n },\n {\n value: \"dashboard\" as const,\n label: \"Dashboard\",\n hint: describePreset(\"dashboard\"),\n },\n {\n value: \"custom\" as const,\n label: \"Custom\",\n hint: \"answer every question\",\n },\n ],\n initialValue: \"custom\" as const,\n }),\n ) as PresetId;\n\n let optionSeed: Omit<ScaffoldOptions, \"name\" | \"slug\" | \"noInstall\"> =\n preset === \"custom\"\n ? { ...DEFAULT_OPTIONS, packageManager }\n : { ...PRESET_SEEDS[preset], packageManager };\n\n if (preset === \"custom\") {\n optionSeed = await promptCustomOptions(optionSeed);\n } else {\n p.note(describePreset(preset), `Preset: ${preset}`);\n const tweak = assertNotCancel(\n await p.confirm({\n message: \"Customize this preset further?\",\n initialValue: false,\n }),\n );\n if (tweak) {\n optionSeed = await promptCustomOptions(optionSeed);\n }\n }\n\n const draft = normalizeOptions({\n name: name.trim(),\n slug,\n outDir,\n ...optionSeed,\n packageManager,\n noInstall: false,\n });\n\n const warnings = collectOptionWarnings(draft);\n if (warnings.length) {\n p.log.warn(warnings.join(\"\\n\"));\n }\n\n const confirmed = assertNotCancel(\n await p.confirm({\n message: target.inPlace\n ? `Create ${color.cyan(name)} (${color.dim(slug)}) in ${color.dim(\".\")}?`\n : `Create ${color.cyan(name)} (${color.dim(slug)})?`,\n initialValue: true,\n }),\n );\n\n if (!confirmed) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n return draft;\n}\n","/**\n * Scaffold options.\n * Base ships with safe defaults; installers flip features on.\n */\nexport type AuthOption = \"none\" | \"jwt\" | \"authjs\";\n/** CSS / component system foundation */\nexport type StylingOption = \"none\" | \"tailwind\" | \"mui\";\n/** shadcn only valid when styling === \"tailwind\" */\nexport type UiOption = \"none\" | \"shadcn\";\n/** How many shadcn primitives to ship (only when ui === \"shadcn\") */\nexport type ShadcnSetOption = \"minimal\" | \"starter\";\nexport type DataOption = \"rsc\" | \"tanstack-query\";\nexport type IconOption = \"none\" | \"lucide\" | \"tabler\";\nexport type ValidationOption = \"zod\" | \"yup\";\n/** Client global state — opt-in */\nexport type StoreOption = \"none\" | \"zustand\" | \"redux\";\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\";\n/** Production deploy target */\nexport type DeployOption = \"none\" | \"vercel\" | \"docker\";\n\nexport type ScaffoldOptions = {\n /** Display name (UI / tokens). When scaffolding with `.`, this is the cwd basename. */\n name: string;\n /** package.json / folder slug */\n slug: string;\n /**\n * Absolute output directory. Set by the CLI from the user target\n * (`my-app` or `.`). Falls back to `resolve(cwd, name)` if omitted.\n */\n outDir?: string;\n packageManager: PackageManager;\n auth: AuthOption;\n styling: StylingOption;\n ui: UiOption;\n /** Ignored unless ui === \"shadcn\" */\n shadcnSet: ShadcnSetOption;\n data: DataOption;\n store: StoreOption;\n icons: IconOption;\n validation: ValidationOption;\n i18n: boolean;\n /** Tailwind dark mode via next-themes (requires styling=tailwind) */\n darkMode: boolean;\n /** Unwrap `{ result, status, success, messages }` API envelopes */\n apiEnvelope: boolean;\n /** OpenAPI → `src/endpoints` codegen + axios helpers */\n endpoints: boolean;\n /** SEO helpers: public-routes, sitemap, robots */\n seo: boolean;\n /** Enhanced ESLint (import sort, func-style, jsx-sort-props) */\n eslint: boolean;\n /** Prettier + format script */\n prettier: boolean;\n /** Husky + lint-staged pre-commit */\n husky: boolean;\n /** Deploy target: none | vercel | docker */\n deploy: DeployOption;\n /** GitHub Actions CI */\n ci: boolean;\n /** Vitest unit/component tests */\n testing: boolean;\n /** Playwright e2e (requires testing) */\n playwright: boolean;\n /** Skip dependency install after scaffold */\n noInstall: boolean;\n};\n\nexport const DEFAULT_OPTIONS: Omit<ScaffoldOptions, \"name\" | \"slug\"> = {\n packageManager: \"pnpm\",\n auth: \"none\",\n styling: \"none\",\n ui: \"none\",\n shadcnSet: \"minimal\",\n data: \"rsc\",\n store: \"none\",\n icons: \"none\",\n validation: \"zod\",\n i18n: false,\n darkMode: false,\n /** Neutral base — enable via preset / flags when building an API client app */\n apiEnvelope: false,\n endpoints: false,\n seo: false,\n eslint: true,\n prettier: true,\n husky: true,\n deploy: \"none\",\n ci: true,\n testing: true,\n playwright: false,\n noInstall: false,\n};\n\nexport const ICON_PACKAGES: Record<\n Exclude<IconOption, \"none\">,\n { name: string; version: string }\n> = {\n lucide: { name: \"lucide-react\", version: \"^0.469.0\" },\n tabler: { name: \"@tabler/icons-react\", version: \"^3.46.0\" },\n};\n\n/** Enforce incompatible combinations. */\nexport function normalizeOptions<T extends ScaffoldOptions>(options: T): T {\n let next = { ...options };\n\n if (next.styling !== \"tailwind\" && next.ui === \"shadcn\") {\n next = { ...next, ui: \"none\" };\n }\n if (next.ui !== \"shadcn\") {\n next = { ...next, shadcnSet: \"minimal\" };\n }\n if (next.styling !== \"tailwind\" && next.darkMode) {\n next = { ...next, darkMode: false };\n }\n if (next.playwright && !next.testing) {\n next = { ...next, testing: true };\n }\n\n return next;\n}\n\n/** @deprecated use normalizeOptions */\nexport function normalizeUiOptions<\n T extends Pick<ScaffoldOptions, \"styling\" | \"ui\">,\n>(options: T): T {\n if (options.styling !== \"tailwind\" && options.ui === \"shadcn\") {\n return { ...options, ui: \"none\" };\n }\n return options;\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\n\nimport { TEMPLATE_DIR } from \"./constants.js\";\nimport { getPackageManager } from \"./helpers/package-manager.js\";\nimport {\n assertDirScaffoldable,\n resolveProjectTarget,\n} from \"./helpers/project-target.js\";\nimport {\n runPackageInstall,\n yieldUi,\n} from \"./helpers/run-package-install.js\";\nimport { replaceTokensInTree } from \"./helpers/replace-tokens.js\";\nimport { runInstallers } from \"./installers/index.js\";\nimport type { ScaffoldOptions } from \"./types.js\";\n\nexport async function scaffold(options: ScaffoldOptions): Promise<string> {\n const projectDir =\n options.outDir ??\n resolveProjectTarget(options.name).outDir;\n const pm = getPackageManager(options.packageManager);\n\n await assertDirScaffoldable(projectDir);\n\n const spin = p.spinner();\n spin.start(\n projectDir === path.resolve(process.cwd())\n ? \"Copying template into current directory\"\n : \"Copying template\",\n );\n await yieldUi();\n\n if (!(await fs.pathExists(TEMPLATE_DIR))) {\n spin.stop(\"Template missing\");\n throw new Error(`Template directory not found at ${TEMPLATE_DIR}`);\n }\n\n await fs.ensureDir(projectDir);\n await fs.copy(TEMPLATE_DIR, projectDir, {\n filter: (src) => {\n const base = path.basename(src);\n return base !== \"node_modules\" && base !== \".next\" && base !== \"dist\";\n },\n });\n\n // npm never packs `.gitignore`; template ships as `gitignore` and we rename here.\n const gitignoreSrc = path.join(projectDir, \"gitignore\");\n const gitignoreDest = path.join(projectDir, \".gitignore\");\n if (await fs.pathExists(gitignoreSrc)) {\n await fs.move(gitignoreSrc, gitignoreDest, { overwrite: true });\n }\n\n spin.message(\"Applying project tokens\");\n await yieldUi();\n await replaceTokensInTree(projectDir, {\n __PROJECT_NAME__: options.name,\n __PROJECT_SLUG__: options.slug,\n __PACKAGE_MANAGER__: pm.id,\n });\n\n const ran = await runInstallers({ projectDir, options }, async (step) => {\n spin.message(`Installer (${step.index}/${step.total}): ${step.id}`);\n await yieldUi();\n });\n\n spin.stop(\n ran.length\n ? `Scaffold ready · ${ran.length} installer${ran.length === 1 ? \"\" : \"s\"}`\n : \"Scaffold ready · base template\",\n );\n\n if (!options.noInstall) {\n if (options.husky) {\n try {\n execFileSync(\"git\", [\"init\"], {\n cwd: projectDir,\n stdio: \"ignore\",\n });\n } catch {\n // husky prepare is best-effort without a repo\n }\n }\n\n p.log.step(\n `Installing dependencies with ${color.cyan(pm.id)} — live output below…`,\n );\n try {\n await runPackageInstall(projectDir, pm);\n p.log.success(\"Dependencies installed\");\n } catch (error) {\n if (pm.id !== \"npm\") {\n p.log.warn(`${pm.id} failed — retrying with npm…`);\n const npm = getPackageManager(\"npm\");\n await runPackageInstall(projectDir, npm);\n p.log.success(\"Dependencies installed (npm)\");\n } else {\n const message =\n error instanceof Error ? error.message : String(error);\n throw new Error(`Dependency install failed: ${message}`);\n }\n }\n } else {\n p.log.info(\n color.dim(`Skipped install · run ${pm.id} install in the project folder`),\n );\n }\n\n if (ran.length) {\n p.log.info(`Installers: ${ran.join(\", \")}`);\n } else {\n p.log.step(color.dim(\"No optional installers (base template only).\"));\n }\n\n return projectDir;\n}\n","import { spawn } from \"node:child_process\";\n\nimport type { PackageManagerMeta } from \"./package-manager.js\";\n\n/**\n * Run package-manager install without blocking the event loop.\n * Uses inherited stdio so the user sees real progress (download bars, etc.).\n */\nexport function runPackageInstall(\n projectDir: string,\n pm: PackageManagerMeta,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(pm.id, pm.installArgs, {\n cwd: projectDir,\n stdio: \"inherit\",\n env: process.env,\n shell: process.platform === \"win32\",\n });\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(new Error(`${pm.id} ${pm.installArgs.join(\" \")} exited with ${code}`));\n });\n });\n}\n\n/** Yield so clack spinner can paint an updated message before heavy work. */\nexport function yieldUi(): Promise<void> {\n return new Promise((resolve) => setImmediate(resolve));\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nconst TEXT_EXT = new Set([\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".json\",\n \".md\",\n \".mdc\",\n \".css\",\n \".scss\",\n \".html\",\n \".svg\",\n \".yml\",\n \".yaml\",\n \".toml\",\n \".env\",\n \".example\",\n \".gitignore\",\n \".npmrc\",\n]);\n\nexport type TokenMap = Record<string, string>;\n\nfunction shouldRewrite(filePath: string): boolean {\n const base = path.basename(filePath);\n if (base === \".env.example\" || base === \"LICENSE\") return true;\n const ext = path.extname(filePath);\n return TEXT_EXT.has(ext) || base.startsWith(\".\");\n}\n\nfunction applyTokens(contents: string, tokens: TokenMap): string {\n let out = contents;\n for (const [key, value] of Object.entries(tokens)) {\n out = out.split(key).join(value);\n }\n return out;\n}\n\n/** Walk project dir and replace `__TOKEN__` placeholders in text files. */\nexport async function replaceTokensInTree(\n root: string,\n tokens: TokenMap,\n): Promise<void> {\n const entries = await fs.readdir(root, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(root, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name === \".git\") continue;\n await replaceTokensInTree(full, tokens);\n continue;\n }\n if (!shouldRewrite(full)) continue;\n const raw = await fs.readFile(full, \"utf8\");\n const next = applyTokens(raw, tokens);\n if (next !== raw) {\n await fs.writeFile(full, next, \"utf8\");\n }\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { Installer } from \"./types.js\";\n\nconst HTTP_ENVELOPE = `import { env } from \"@/lib/env\";\n\ntype ApiEnvelope<T> = {\n result?: T;\n status?: number;\n success?: boolean;\n messages?: unknown;\n};\n\nfunction unwrapEnvelope<T>(data: unknown): T {\n if (data && typeof data === \"object\" && \"result\" in data) {\n const result = (data as ApiEnvelope<T>).result;\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n return data as T;\n}\n\n/**\n * JSON fetch helper that unwraps \\`{ result, status, success, messages }\\` envelopes.\n */\nexport async function apiFetch<T>(\n path: string,\n init?: RequestInit,\n): Promise<T> {\n const url = path.startsWith(\"http\")\n ? path\n : \\`\\${env.NEXT_PUBLIC_API_URL.replace(/\\\\/$/, \"\")}/\\${path.replace(/^\\\\//, \"\")}\\`;\n\n const response = await fetch(url, {\n ...init,\n headers: {\n Accept: \"application/json\",\n ...(init?.headers ?? {}),\n },\n });\n\n if (!response.ok) {\n throw new Error(\\`API \\${response.status}: \\${response.statusText}\\`);\n }\n\n const json: unknown = await response.json();\n return unwrapEnvelope<T>(json);\n}\n`;\n\nconst RULE = `---\ndescription: API envelope unwrap for apiFetch\nglobs: src/lib/http.ts\nalwaysApply: false\n---\n\n# API envelope\n\n\\`apiFetch\\` unwraps \\`{ result, status, success, messages }\\` when present.\nPrefer generated \\`src/endpoints/*\\` + axios when endpoints codegen is enabled.\n`;\n\nexport const apiEnvelopeInstaller: Installer = {\n id: \"api-envelope\",\n active: (o) => o.apiEnvelope,\n async run({ projectDir, options }) {\n // When endpoints are on, axios path uses unwrapApiResult; still upgrade http.ts for RSC fetch.\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"http.ts\"),\n HTTP_ENVELOPE,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"api-envelope.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"http\", \"envelope.md\"),\n `# API envelope\n\n\\`src/lib/http.ts\\` → \\`apiFetch\\` unwraps \\`result\\` from standard envelopes.\n${options.endpoints ? \"Endpoints/axios: use `unwrapApiResult` from `@/utils/api-result`.\\n\" : \"\"}\n`,\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { ScaffoldOptions } from \"../types.js\";\n\nexport function needsAppProviders(options: ScaffoldOptions): boolean {\n return (\n options.data === \"tanstack-query\" ||\n options.store === \"redux\" ||\n options.styling === \"mui\" ||\n options.i18n ||\n options.darkMode\n );\n}\n\n/** Generate client `AppProviders` composing enabled providers (outer → inner). */\nexport function generateAppProvidersSource(options: ScaffoldOptions): string {\n const imports: string[] = [\n `\"use client\";`,\n ``,\n `import type { ReactNode } from \"react\";`,\n ];\n const props: string[] = [`children: ReactNode`];\n\n if (options.i18n) {\n imports.push(`import { NextIntlClientProvider } from \"next-intl\";`);\n props.push(`messages: Record<string, unknown>`);\n }\n if (options.darkMode) {\n imports.push(`import { ThemeProvider } from \"@/providers/theme-provider\";`);\n }\n if (options.styling === \"mui\") {\n imports.push(`import { MuiProvider } from \"@/providers/mui-provider\";`);\n }\n if (options.store === \"redux\") {\n imports.push(`import { StoreProvider } from \"@/providers/store-provider\";`);\n }\n if (options.data === \"tanstack-query\") {\n imports.push(`import { QueryProvider } from \"@/providers/query-provider\";`);\n }\n\n const openers: string[] = [];\n const closers: string[] = [];\n\n if (options.i18n) {\n openers.push(` <NextIntlClientProvider messages={messages}>`);\n closers.unshift(` </NextIntlClientProvider>`);\n }\n if (options.darkMode) {\n openers.push(` <ThemeProvider>`);\n closers.unshift(` </ThemeProvider>`);\n }\n if (options.styling === \"mui\") {\n openers.push(` <MuiProvider>`);\n closers.unshift(` </MuiProvider>`);\n }\n if (options.store === \"redux\") {\n openers.push(` <StoreProvider>`);\n closers.unshift(` </StoreProvider>`);\n }\n if (options.data === \"tanstack-query\") {\n openers.push(` <QueryProvider>`);\n closers.unshift(` </QueryProvider>`);\n }\n\n return `${imports.join(\"\\n\")}\n\ntype AppProvidersProps = {\n ${props.join(\";\\n \")};\n};\n\n/**\n * Single composition root for client providers.\n * Feature installers add leaf providers; this file wraps them in a stable order.\n */\nexport function AppProviders({ children${options.i18n ? \", messages\" : \"\"} }: AppProvidersProps) {\n return (\n${openers.join(\"\\n\")}\n {children}\n${closers.join(\"\\n\")}\n );\n}\n`;\n}\n\nexport async function writeAppProviders(\n projectDir: string,\n options: ScaffoldOptions,\n): Promise<void> {\n if (!needsAppProviders(options)) return;\n\n const providersDir = path.join(projectDir, \"src\", \"providers\");\n await fs.ensureDir(providersDir);\n await fs.remove(path.join(providersDir, \".gitkeep\"));\n await fs.writeFile(\n path.join(providersDir, \"app-providers.tsx\"),\n generateAppProvidersSource(options),\n \"utf8\",\n );\n}\n\n/** Rewrite root layout to use AppProviders (+ i18n locale when enabled). */\nexport async function wireRootLayout(\n projectDir: string,\n options: ScaffoldOptions,\n): Promise<void> {\n const layoutPath = path.join(projectDir, \"src\", \"app\", \"layout.tsx\");\n const useProviders = needsAppProviders(options);\n const dark = options.darkMode;\n const i18n = options.i18n;\n\n const htmlLang = i18n ? \"{locale}\" : `\"en\"`;\n const htmlExtra = dark ? \" suppressHydrationWarning\" : \"\";\n\n const imports = [\n `import type { Metadata } from \"next\";`,\n ``,\n `import \"./globals.css\";`,\n ];\n if (useProviders) {\n imports.push(\n ``,\n `import { AppProviders } from \"@/providers/app-providers\";`,\n );\n }\n if (i18n) {\n imports.push(\n `import { getLocale, getMessages } from \"next-intl/server\";`,\n );\n }\n\n const bodyInner = useProviders\n ? i18n\n ? ` <AppProviders messages={messages}>\n <main>{children}</main>\n </AppProviders>`\n : ` <AppProviders>\n <main>{children}</main>\n </AppProviders>`\n : ` <main>{children}</main>`;\n\n const fnBody = i18n\n ? ` const locale = await getLocale();\n const messages = await getMessages();\n\n return (\n <html lang=${htmlLang}${htmlExtra}>\n <body>\n${bodyInner}\n </body>\n </html>\n );`\n : ` return (\n <html lang=${htmlLang}${htmlExtra}>\n <body>\n${bodyInner}\n </body>\n </html>\n );`;\n\n const source = `${imports.join(\"\\n\")}\n\nexport const metadata: Metadata = {\n title: \"__PROJECT_NAME__\",\n description: \"Generated with next-style-guide\",\n};\n\nexport default ${i18n ? \"async \" : \"\"}function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n${fnBody}\n}\n`;\n\n // Tokens may already be replaced; if layout still has placeholder keep it —\n // replaceTokens runs before installers, so project name is already applied.\n // Read existing metadata title if present.\n let final = source;\n if (await fs.pathExists(layoutPath)) {\n const existing = await fs.readFile(layoutPath, \"utf8\");\n const titleMatch = existing.match(/title:\\s*\"([^\"]+)\"/);\n if (titleMatch?.[1] && titleMatch[1] !== \"__PROJECT_NAME__\") {\n final = final.replace(\n 'title: \"__PROJECT_NAME__\"',\n `title: \"${titleMatch[1]}\"`,\n );\n }\n }\n\n await fs.writeFile(layoutPath, final, \"utf8\");\n}\n","import type { Installer } from \"./types.js\";\nimport {\n needsAppProviders,\n wireRootLayout,\n writeAppProviders,\n} from \"../helpers/app-providers.js\";\n\n/**\n * Compose client providers into `app-providers.tsx` and wire root layout once.\n * Runs after leaf provider installers; before surface.\n */\nexport const appProvidersInstaller: Installer = {\n id: \"app-providers\",\n active: (o) => needsAppProviders(o) || o.i18n || o.darkMode,\n async run({ projectDir, options }) {\n await writeAppProviders(projectDir, options);\n await wireRootLayout(projectDir, options);\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst AUTH_TS = `import NextAuth from \"next-auth\";\nimport Credentials from \"next-auth/providers/credentials\";\n\n/**\n * Auth.js — Credentials demo provider.\n * Replace \\`authorize\\` with your API/DB lookup. Set \\`AUTH_SECRET\\` in env.\n */\nexport const { handlers, auth, signIn, signOut } = NextAuth({\n providers: [\n Credentials({\n name: \"Credentials\",\n credentials: {\n email: { label: \"Email\", type: \"email\" },\n password: { label: \"Password\", type: \"password\" },\n },\n async authorize(credentials) {\n if (!credentials?.email || !credentials?.password) {\n return null;\n }\n // Demo only — wire to your backend.\n return {\n id: \"1\",\n email: String(credentials.email),\n name: \"Demo User\",\n };\n },\n }),\n ],\n pages: {\n signIn: \"/login\",\n },\n session: { strategy: \"jwt\" },\n trustHost: true,\n});\n`;\n\nconst ROUTE = `import { handlers } from \"@/lib/auth\";\n\nexport const { GET, POST } = handlers;\n`;\n\nconst MIDDLEWARE = `import { auth } from \"@/lib/auth\";\nimport { NextResponse } from \"next/server\";\n\nconst publicPaths = [\"/login\", \"/api/auth\"];\n\nexport default auth((req) => {\n const { pathname } = req.nextUrl;\n const isPublic = publicPaths.some(\n (p) => pathname === p || pathname.startsWith(\\`\\${p}/\\`),\n );\n\n if (!req.auth && !isPublic) {\n const url = new URL(\"/login\", req.nextUrl.origin);\n url.searchParams.set(\"callbackUrl\", pathname);\n return NextResponse.redirect(url);\n }\n\n if (req.auth && pathname === \"/login\") {\n return NextResponse.redirect(new URL(\"/\", req.nextUrl.origin));\n }\n\n return NextResponse.next();\n});\n\nexport const config = {\n matcher: [\"/((?!_next/static|_next/image|favicon.ico).*)\"],\n};\n`;\n\nconst LOGIN_PAGE = `import { Suspense } from \"react\";\n\nimport { LoginForm } from \"@/app/login/_components/login-form\";\n\nexport default function LoginPage() {\n return (\n <section className=\"hero\">\n <h1>Sign in</h1>\n <p>Auth.js Credentials demo — replace authorize with your API.</p>\n <Suspense fallback={<p>Loading…</p>}>\n <LoginForm />\n </Suspense>\n </section>\n );\n}\n`;\n\nconst LOGIN_FORM = `\"use client\";\n\nimport { useState, type FormEvent } from \"react\";\nimport { signIn } from \"next-auth/react\";\nimport { useRouter, useSearchParams } from \"next/navigation\";\n\nexport function LoginForm() {\n const router = useRouter();\n const searchParams = useSearchParams();\n const callbackUrl = searchParams.get(\"callbackUrl\") ?? \"/\";\n const [error, setError] = useState<string | null>(null);\n const [pending, setPending] = useState(false);\n\n async function onSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setPending(true);\n setError(null);\n const form = new FormData(event.currentTarget);\n const result = await signIn(\"credentials\", {\n email: String(form.get(\"email\") ?? \"\"),\n password: String(form.get(\"password\") ?? \"\"),\n redirect: false,\n });\n setPending(false);\n if (result?.error) {\n setError(\"Invalid credentials\");\n return;\n }\n router.push(callbackUrl);\n router.refresh();\n }\n\n return (\n <form onSubmit={onSubmit} className=\"card\" style={{ marginTop: \"1.5rem\" }}>\n <label style={{ display: \"grid\", gap: \"0.35rem\", marginBottom: \"0.75rem\" }}>\n Email\n <input name=\"email\" type=\"email\" required autoComplete=\"email\" />\n </label>\n <label style={{ display: \"grid\", gap: \"0.35rem\", marginBottom: \"0.75rem\" }}>\n Password\n <input\n name=\"password\"\n type=\"password\"\n required\n autoComplete=\"current-password\"\n />\n </label>\n {error ? <p style={{ color: \"crimson\" }}>{error}</p> : null}\n <button type=\"submit\" disabled={pending}>\n {pending ? \"Signing in…\" : \"Sign in\"}\n </button>\n </form>\n );\n}\n`;\n\nconst RULE = `---\ndescription: Auth.js (NextAuth) conventions\nglobs: src/lib/auth.ts,src/app/api/auth/**/*,src/middleware.ts,src/app/login/**\nalwaysApply: false\n---\n\n# Auth.js\n\n- Config: \\`src/lib/auth.ts\\` (Credentials demo — replace \\`authorize\\`).\n- Route handlers: \\`src/app/api/auth/[...nextauth]/route.ts\\`.\n- Middleware: \\`src/middleware.ts\\` protects non-public routes; public: \\`/login\\`, \\`/api/auth\\`.\n- Login UI: \\`src/app/login/\\`.\n- Env: \\`AUTH_SECRET\\` (required in production).\n- Prefer \\`auth()\\` in Server Components; \\`signIn\\` / \\`signOut\\` on the client.\n`;\n\nexport const authAuthjsInstaller: Installer = {\n id: \"auth-authjs\",\n active: (o) => o.auth === \"authjs\",\n async run({ projectDir }) {\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"auth.ts\"),\n AUTH_TS,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(\n projectDir,\n \"src\",\n \"app\",\n \"api\",\n \"auth\",\n \"[...nextauth]\",\n \"route.ts\",\n ),\n ROUTE,\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"middleware.ts\"),\n MIDDLEWARE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"src\", \"app\", \"login\", \"page.tsx\"),\n LOGIN_PAGE,\n );\n await fs.outputFile(\n path.join(\n projectDir,\n \"src\",\n \"app\",\n \"login\",\n \"_components\",\n \"login-form\",\n \"index.tsx\",\n ),\n LOGIN_FORM,\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"auth.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"auth\", \"authjs.md\"),\n `# Auth.js\n\n- \\`src/lib/auth.ts\\` — Credentials demo (replace \\`authorize\\`)\n- \\`src/app/api/auth/[...nextauth]/route.ts\\`\n- \\`src/middleware.ts\\` — protect routes; public \\`/login\\` + \\`/api/auth\\`\n- \\`src/app/login/\\` — sample login page\n- Env: \\`AUTH_SECRET\\`\n`,\n );\n\n const envPath = path.join(projectDir, \".env.example\");\n if (await fs.pathExists(envPath)) {\n let env = await fs.readFile(envPath, \"utf8\");\n if (!env.includes(\"AUTH_SECRET\")) {\n env += `\\n# Auth.js — generate with: openssl rand -base64 32\\nAUTH_SECRET=\\n`;\n await fs.writeFile(envPath, env, \"utf8\");\n }\n }\n\n await addDependencies(projectDir, {\n \"next-auth\": \"^5.0.0-beta.25\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\ntype PkgJson = {\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\nasync function readPkg(projectDir: string): Promise<{ pkgPath: string; pkg: PkgJson }> {\n const pkgPath = path.join(projectDir, \"package.json\");\n const pkg = (await fs.readJson(pkgPath)) as PkgJson;\n return { pkgPath, pkg };\n}\n\nfunction sortRecord(record: Record<string, string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(record).sort(([a], [b]) => a.localeCompare(b)),\n );\n}\n\nexport async function addDependencies(\n projectDir: string,\n deps: Record<string, string>,\n kind: \"dependencies\" | \"devDependencies\" = \"dependencies\",\n): Promise<void> {\n const { pkgPath, pkg } = await readPkg(projectDir);\n pkg[kind] = sortRecord({\n ...(pkg[kind] ?? {}),\n ...deps,\n });\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n}\n\nexport async function addScripts(\n projectDir: string,\n scripts: Record<string, string>,\n): Promise<void> {\n const { pkgPath, pkg } = await readPkg(projectDir);\n pkg.scripts = {\n ...(pkg.scripts ?? {}),\n ...scripts,\n };\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n}\n\nexport async function mergePackageField(\n projectDir: string,\n field: string,\n value: unknown,\n): Promise<void> {\n const { pkgPath, pkg } = await readPkg(projectDir);\n pkg[field] = value;\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n}\n\nexport async function removeDependencies(\n projectDir: string,\n names: string[],\n kind: \"dependencies\" | \"devDependencies\" = \"dependencies\",\n): Promise<void> {\n const { pkgPath, pkg } = await readPkg(projectDir);\n if (!pkg[kind]) return;\n for (const name of names) {\n delete pkg[kind]![name];\n }\n pkg[kind] = sortRecord(pkg[kind]!);\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { Installer } from \"./types.js\";\n\nfunction tokenStorage(slug: string): string {\n const accessKey = `${slug}.accessToken`;\n const refreshKey = `${slug}.refreshToken`;\n\n return `const ACCESS_TOKEN_KEY = \"${accessKey}\";\nconst REFRESH_TOKEN_KEY = \"${refreshKey}\";\n\nexport type AuthTokens = {\n access: string;\n refresh: string;\n};\n\nexport function getAccessToken(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n return window.localStorage.getItem(ACCESS_TOKEN_KEY);\n}\n\nexport function getRefreshToken(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n return window.localStorage.getItem(REFRESH_TOKEN_KEY);\n}\n\nexport function setTokens({ access, refresh }: AuthTokens) {\n window.localStorage.setItem(ACCESS_TOKEN_KEY, access);\n window.localStorage.setItem(REFRESH_TOKEN_KEY, refresh);\n}\n\nexport function clearTokens() {\n if (typeof window === \"undefined\") {\n return;\n }\n window.localStorage.removeItem(ACCESS_TOKEN_KEY);\n window.localStorage.removeItem(REFRESH_TOKEN_KEY);\n}\n`;\n}\n\nconst AXIOS_JWT = `import axios, { type AxiosError, type InternalAxiosRequestConfig } from \"axios\";\n\nimport { unwrapApiResult } from \"@/utils/api-result\";\nimport {\n clearTokens,\n getAccessToken,\n getRefreshToken,\n setTokens,\n} from \"@/utils/token-storage\";\n\ntype RetryConfig = InternalAxiosRequestConfig & { _retry?: boolean };\n\nconst baseURL = process.env.NEXT_PUBLIC_API_URL ?? \"\";\n\n/** Shared Axios client for \\`src/endpoints/*\\`. Do not call from UI directly. */\nexport const api = axios.create({\n baseURL,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n});\n\napi.interceptors.request.use((config) => {\n const accessToken = getAccessToken();\n if (accessToken) {\n config.headers.setAuthorization(\\`Bearer \\${accessToken}\\`);\n }\n if (typeof FormData !== \"undefined\" && config.data instanceof FormData) {\n config.headers.delete(\"Content-Type\");\n }\n return config;\n});\n\nlet refreshPromise: Promise<string | null> | null = null;\n\nasync function refreshAccessToken(): Promise<string | null> {\n const refresh = getRefreshToken();\n if (!refresh || !baseURL) {\n return null;\n }\n\n try {\n const { data } = await axios.post(\\`\\${baseURL}/auth/refresh/\\`, { refresh });\n const payload = unwrapApiResult<{ access?: string; refresh?: string }>(data);\n const access = payload.access;\n if (!access) {\n clearTokens();\n return null;\n }\n setTokens({ access, refresh: payload.refresh ?? refresh });\n return access;\n } catch {\n clearTokens();\n return null;\n }\n}\n\nfunction shouldSkipRefresh(url: string | undefined) {\n if (!url) return false;\n return (\n url.includes(\"/auth/login\") ||\n url.includes(\"/auth/refresh\") ||\n url.includes(\"/auth/logout\")\n );\n}\n\napi.interceptors.response.use(\n (response) => response,\n async (error: AxiosError) => {\n const original = error.config as RetryConfig | undefined;\n\n if (\n !original ||\n error.response?.status !== 401 ||\n original._retry ||\n shouldSkipRefresh(original.url)\n ) {\n return Promise.reject(error);\n }\n\n original._retry = true;\n refreshPromise ??= refreshAccessToken().finally(() => {\n refreshPromise = null;\n });\n\n const access = await refreshPromise;\n if (!access) {\n return Promise.reject(error);\n }\n\n original.headers.setAuthorization(\\`Bearer \\${access}\\`);\n return api(original);\n },\n);\n`;\n\nconst RULE = `---\ndescription: JWT auth (Bearer + refresh) helpers\nglobs: src/utils/token-storage.ts,src/utils/axios-instance.ts,src/**/*auth*.{ts,tsx}\nalwaysApply: false\n---\n\n# Auth (JWT)\n\n- Tokens: \\`src/utils/token-storage.ts\\` (access + refresh in \\`localStorage\\`).\n- Axios: Bearer on requests; 401 → \\`/auth/refresh/\\` once, then retry.\n- Do not store tokens in cookies unless you intentionally change the strategy.\n- Login/logout UI should call \\`setTokens\\` / \\`clearTokens\\` — never invent a second storage key.\n`;\n\nexport const authJwtInstaller: Installer = {\n id: \"auth-jwt\",\n active: (o) => o.auth === \"jwt\",\n async run({ projectDir, options }) {\n await fs.ensureDir(path.join(projectDir, \"src\", \"utils\"));\n await fs.remove(path.join(projectDir, \"src\", \"utils\", \".gitkeep\"));\n await fs.writeFile(\n path.join(projectDir, \"src\", \"utils\", \"token-storage.ts\"),\n tokenStorage(options.slug),\n \"utf8\",\n );\n\n if (options.endpoints) {\n await fs.writeFile(\n path.join(projectDir, \"src\", \"utils\", \"axios-instance.ts\"),\n AXIOS_JWT,\n \"utf8\",\n );\n }\n\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"auth.mdc\"),\n RULE,\n \"utf8\",\n );\n\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"auth\", \"jwt.md\"),\n `# JWT auth\n\n- \\`src/utils/token-storage.ts\\` — access/refresh in localStorage\n- When endpoints are enabled, \\`axios-instance\\` attaches Bearer and refreshes on 401 via \\`POST /auth/refresh/\\`\n`,\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport {\n ciInstallCommand,\n getPackageManager,\n} from \"../helpers/package-manager.js\";\nimport type { ScaffoldOptions } from \"../types.js\";\nimport type { Installer } from \"./types.js\";\n\nfunction workflowYaml(options: ScaffoldOptions): string {\n const pm = getPackageManager(options.packageManager);\n const run = (script: string) => pm.runScript(script);\n\n const setupSteps: string[] = [\n ` - name: Checkout\n uses: actions/checkout@v4\n`,\n ];\n\n if (options.packageManager === \"pnpm\") {\n setupSteps.push(` - name: Setup pnpm\n uses: pnpm/action-setup@v4\n`);\n }\n\n if (options.packageManager === \"yarn\") {\n setupSteps.push(` - name: Enable Corepack\n run: corepack enable\n`);\n }\n\n setupSteps.push(` - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 22\n cache: ${options.packageManager}\n`);\n\n const steps: string[] = [\n ...setupSteps,\n ` - name: Install\n run: ${ciInstallCommand(options.packageManager)}\n\n - name: Typecheck\n run: ${run(\"typecheck\")}`,\n ];\n\n if (options.eslint) {\n steps.push(`\n - name: Lint\n run: ${run(\"lint\")}`);\n }\n\n if (options.prettier) {\n steps.push(`\n - name: Format check\n run: ${run(\"format:check\")}`);\n }\n\n if (options.testing) {\n steps.push(`\n - name: Test\n run: ${run(\"test\")}`);\n }\n\n steps.push(`\n - name: Build\n run: ${run(\"build\")}\n env:\n NEXT_PUBLIC_APP_URL: http://localhost:3000\n NEXT_PUBLIC_API_URL: http://localhost:8000`);\n\n return `name: CI\n\non:\n push:\n branches: [main, master]\n pull_request:\n\nconcurrency:\n group: ci-\\${{ github.workflow }}-\\${{ github.ref }}\n cancel-in-progress: true\n\njobs:\n checks:\n name: Checks\n runs-on: ubuntu-latest\n timeout-minutes: 20\n steps:\n${steps.join(\"\\n\")}\n`;\n}\n\nexport const ciInstaller: Installer = {\n id: \"ci\",\n active: (o) => o.ci,\n async run({ projectDir, options }) {\n const addon = path.join(ADDONS_DIR, \"ci\");\n\n await fs.outputFile(\n path.join(projectDir, \".github\", \"workflows\", \"ci.yml\"),\n workflowYaml(options),\n );\n await fs.copy(\n path.join(addon, \".cursor\", \"rules\", \"ci.mdc\"),\n path.join(projectDir, \".cursor\", \"rules\", \"ci.mdc\"),\n );\n await fs.copy(\n path.join(addon, \"docs\", \"style-guide\", \"ops\", \"ci.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"ops\", \"ci.md\"),\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst THEME_PROVIDER = `\"use client\";\n\nimport { ThemeProvider as NextThemesProvider } from \"next-themes\";\nimport type { ReactNode } from \"react\";\n\nexport function ThemeProvider({ children }: { children: ReactNode }) {\n return (\n <NextThemesProvider attribute=\"class\" defaultTheme=\"system\" enableSystem>\n {children}\n </NextThemesProvider>\n );\n}\n`;\n\nconst RULE = `---\ndescription: Dark mode (next-themes) with Tailwind\nglobs: src/providers/theme-provider.tsx,src/app/globals.css\nalwaysApply: false\n---\n\n# Dark mode\n\n- \\`ThemeProvider\\` in \\`src/providers/theme-provider.tsx\\` (composed via \\`AppProviders\\`).\n- Tailwind: use \\`dark:\\` variants; \\`html\\` gets \\`class=\"dark\"\\` from next-themes.\n- Prefer \\`defaultTheme=\"system\"\\`.\n`;\n\nexport const darkModeInstaller: Installer = {\n id: \"dark-mode\",\n active: (o) => o.darkMode && o.styling === \"tailwind\",\n async run({ projectDir }) {\n const providersDir = path.join(projectDir, \"src\", \"providers\");\n await fs.ensureDir(providersDir);\n await fs.remove(path.join(providersDir, \".gitkeep\"));\n await fs.writeFile(\n path.join(providersDir, \"theme-provider.tsx\"),\n THEME_PROVIDER,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"dark-mode.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"ui\", \"dark-mode.md\"),\n `# Dark mode\n\nnext-themes + Tailwind \\`dark:\\` variants.\nProvider: \\`src/providers/theme-provider.tsx\\` (via \\`AppProviders\\`).\n`,\n );\n\n // Ensure dark variant works with Tailwind v4 class strategy\n const globalsPath = path.join(projectDir, \"src\", \"app\", \"globals.css\");\n if (await fs.pathExists(globalsPath)) {\n let css = await fs.readFile(globalsPath, \"utf8\");\n if (!css.includes(\"@custom-variant dark\")) {\n css = css.replace(\n `@import \"tailwindcss\";\\n`,\n `@import \"tailwindcss\";\\n\\n@custom-variant dark (&:where(.dark, .dark *));\\n`,\n );\n await fs.writeFile(globalsPath, css, \"utf8\");\n }\n }\n\n await addDependencies(projectDir, {\n \"next-themes\": \"^0.4.4\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { Installer } from \"./types.js\";\n\nconst COMPOSE = `services:\n api:\n image: nginx:alpine\n ports:\n - \"8000:80\"\n volumes:\n - ./docker/api-mock:/usr/share/nginx/html:ro\n # Replace this stub with your real API image when ready.\n # JWT apps expect NEXT_PUBLIC_API_URL=http://localhost:8000\n\n # Example (uncomment when you have a backend image):\n # api:\n # image: your-org/api:latest\n # ports:\n # - \"8000:8000\"\n # environment:\n # DATABASE_URL: postgres://...\n`;\n\nconst MOCK_README = `# Local API stub\n\nPlaceholder for Docker Compose. Point \\`NEXT_PUBLIC_API_URL\\` at \\`http://localhost:8000\\`.\n\nReplace the nginx stub in \\`docker-compose.yml\\` with your real API service.\n`;\n\nconst RULE = `---\ndescription: Local API via Docker Compose (JWT + endpoints)\nglobs: docker-compose.yml,docker/api-mock/**\nalwaysApply: false\n---\n\n# Docker Compose (local API)\n\n- \\`docker-compose.yml\\` — stub API on port 8000 for JWT + endpoints apps.\n- \\`docker compose up\\` then set \\`NEXT_PUBLIC_API_URL=http://localhost:8000\\`.\n- Swap the stub service for your real backend image before production work.\n`;\n\nexport const dockerComposeInstaller: Installer = {\n id: \"docker-compose\",\n active: (o) => o.auth === \"jwt\" && o.endpoints,\n async run({ projectDir }) {\n await fs.writeFile(\n path.join(projectDir, \"docker-compose.yml\"),\n COMPOSE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docker\", \"api-mock\", \"README.md\"),\n MOCK_README,\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"docker-compose.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"ops\", \"docker-compose.md\"),\n `# Docker Compose (local API)\n\n\\`\\`\\`bash\ndocker compose up\n\\`\\`\\`\n\nStub listens on \\`http://localhost:8000\\`. Align with \\`NEXT_PUBLIC_API_URL\\`.\n`,\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport { getPackageManager } from \"../helpers/package-manager.js\";\nimport type { PackageManager } from \"../types.js\";\nimport type { Installer } from \"./types.js\";\n\nconst STANDALONE_CONFIG = `import type { NextConfig } from \"next\";\n\nconst nextConfig: NextConfig = {\n reactStrictMode: true,\n output: \"standalone\",\n};\n\nexport default nextConfig;\n`;\n\nfunction dockerfileFor(pm: PackageManager): string {\n if (pm === \"npm\") {\n return `# ---------------------------------------------------------------------------- #\n# Stage 1: Base & Dependencies #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS builder\n\nRUN apk add --no-cache libc6-compat\n\nWORKDIR /app\n\nENV HUSKY=0 \\\\\n NEXT_TELEMETRY_DISABLED=1\n\nARG NEXT_PUBLIC_APP_URL=http://localhost:3000\nARG NEXT_PUBLIC_API_URL=http://localhost:8000\n\nENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL \\\\\n NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL\n\nCOPY package.json package-lock.json .npmrc* ./\nRUN --mount=type=cache,id=npm,target=/root/.npm \\\\\n npm ci\n\nCOPY . /app/\n\nRUN npm run build\n\n# ---------------------------------------------------------------------------- #\n# Stage 2: Production Runner #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS runner\n\nRUN apk add --no-cache curl\n\nWORKDIR /app\n\nENV NODE_ENV=production \\\\\n NEXT_TELEMETRY_DISABLED=1 \\\\\n HOSTNAME=0.0.0.0 \\\\\n PORT=3000\n\nCOPY --from=builder /app/public ./public\nCOPY --from=builder --chown=node:node /app/.next/standalone ./\nCOPY --from=builder --chown=node:node /app/.next/static ./.next/static\n\nUSER node\n\nEXPOSE 3000\n\nHEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \\\\\n CMD curl -fsS http://127.0.0.1:3000/ || exit 1\n\nCMD [\"node\", \"server.js\"]\n`;\n }\n\n if (pm === \"yarn\") {\n return `# ---------------------------------------------------------------------------- #\n# Stage 1: Base & Dependencies #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS builder\n\nRUN apk add --no-cache libc6-compat\nRUN corepack enable && corepack prepare yarn@1.22.22 --activate\n\nWORKDIR /app\n\nENV HUSKY=0 \\\\\n NEXT_TELEMETRY_DISABLED=1\n\nARG NEXT_PUBLIC_APP_URL=http://localhost:3000\nARG NEXT_PUBLIC_API_URL=http://localhost:8000\n\nENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL \\\\\n NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL\n\nCOPY package.json yarn.lock .npmrc* ./\nRUN --mount=type=cache,id=yarn,target=/usr/local/share/.cache/yarn \\\\\n yarn install --frozen-lockfile\n\nCOPY . /app/\n\nRUN yarn build\n\n# ---------------------------------------------------------------------------- #\n# Stage 2: Production Runner #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS runner\n\nRUN apk add --no-cache curl\n\nWORKDIR /app\n\nENV NODE_ENV=production \\\\\n NEXT_TELEMETRY_DISABLED=1 \\\\\n HOSTNAME=0.0.0.0 \\\\\n PORT=3000\n\nCOPY --from=builder /app/public ./public\nCOPY --from=builder --chown=node:node /app/.next/standalone ./\nCOPY --from=builder --chown=node:node /app/.next/static ./.next/static\n\nUSER node\n\nEXPOSE 3000\n\nHEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \\\\\n CMD curl -fsS http://127.0.0.1:3000/ || exit 1\n\nCMD [\"node\", \"server.js\"]\n`;\n }\n\n // pnpm\n return `# ---------------------------------------------------------------------------- #\n# Stage 1: Base & Dependencies #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS builder\n\nRUN apk add --no-cache libc6-compat\nRUN corepack enable && corepack prepare pnpm@9.15.0 --activate\n\nWORKDIR /app\n\nENV HUSKY=0 \\\\\n NEXT_TELEMETRY_DISABLED=1\n\nARG NEXT_PUBLIC_APP_URL=http://localhost:3000\nARG NEXT_PUBLIC_API_URL=http://localhost:8000\n\nENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL \\\\\n NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL\n\nCOPY package.json pnpm-lock.yaml .npmrc* ./\nRUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store \\\\\n pnpm install --frozen-lockfile\n\nCOPY . /app/\n\nRUN pnpm build\n\n# ---------------------------------------------------------------------------- #\n# Stage 2: Production Runner #\n# ---------------------------------------------------------------------------- #\nFROM node:22-alpine AS runner\n\nRUN apk add --no-cache curl\n\nWORKDIR /app\n\nENV NODE_ENV=production \\\\\n NEXT_TELEMETRY_DISABLED=1 \\\\\n HOSTNAME=0.0.0.0 \\\\\n PORT=3000\n\nCOPY --from=builder /app/public ./public\nCOPY --from=builder --chown=node:node /app/.next/standalone ./\nCOPY --from=builder --chown=node:node /app/.next/static ./.next/static\n\nUSER node\n\nEXPOSE 3000\n\nHEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \\\\\n CMD curl -fsS http://127.0.0.1:3000/ || exit 1\n\nCMD [\"node\", \"server.js\"]\n`;\n}\n\nexport const dockerInstaller: Installer = {\n id: \"docker\",\n active: (o) => o.deploy === \"docker\",\n async run({ projectDir, options }) {\n const addon = path.join(ADDONS_DIR, \"docker\");\n const pm = getPackageManager(options.packageManager);\n\n await fs.ensureDir(path.join(projectDir, \"docker\"));\n await fs.writeFile(\n path.join(projectDir, \"docker\", \"production.Dockerfile\"),\n dockerfileFor(options.packageManager),\n \"utf8\",\n );\n await fs.copy(\n path.join(addon, \".dockerignore\"),\n path.join(projectDir, \".dockerignore\"),\n );\n await fs.copy(\n path.join(addon, \".cursor\", \"rules\", \"docker.mdc\"),\n path.join(projectDir, \".cursor\", \"rules\", \"docker.mdc\"),\n );\n\n let doc = await fs.readFile(\n path.join(addon, \"docs\", \"style-guide\", \"ops\", \"docker.md\"),\n \"utf8\",\n );\n doc = doc\n .replaceAll(\"__PROJECT_SLUG__\", options.slug)\n .replaceAll(\"__PACKAGE_MANAGER__\", pm.id);\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"ops\", \"docker.md\"),\n doc,\n );\n\n await fs.writeFile(\n path.join(projectDir, \"next.config.ts\"),\n STANDALONE_CONFIG,\n \"utf8\",\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport { addDependencies, addScripts } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nexport const endpointsInstaller: Installer = {\n id: \"endpoints\",\n active: (o) => o.endpoints,\n async run({ projectDir }) {\n const addon = path.join(ADDONS_DIR, \"endpoints\");\n\n await fs.copy(\n path.join(addon, \"scripts\"),\n path.join(projectDir, \"scripts\"),\n );\n await fs.copy(\n path.join(addon, \"src\", \"endpoints\"),\n path.join(projectDir, \"src\", \"endpoints\"),\n );\n\n for (const file of [\n \"axios-instance.ts\",\n \"api-result.ts\",\n \"api-error.ts\",\n \"search-params.ts\",\n \"form-data.ts\",\n ]) {\n await fs.copy(\n path.join(addon, \"src\", \"utils\", file),\n path.join(projectDir, \"src\", \"utils\", file),\n );\n }\n await fs.remove(path.join(projectDir, \"src\", \"utils\", \".gitkeep\"));\n\n await fs.copy(\n path.join(addon, \".cursor\", \"rules\", \"endpoints.mdc\"),\n path.join(projectDir, \".cursor\", \"rules\", \"endpoints.mdc\"),\n );\n await fs.copy(\n path.join(addon, \"docs\", \"style-guide\", \"http\", \"endpoints.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"http\", \"endpoints.md\"),\n );\n\n await addDependencies(projectDir, { axios: \"^1.7.9\" });\n await addDependencies(\n projectDir,\n { tsx: \"^4.19.2\" },\n \"devDependencies\",\n );\n await addScripts(projectDir, {\n \"endpoints:generate\": \"tsx scripts/generate-endpoints.ts\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport { addDependencies, addScripts } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nexport const eslintInstaller: Installer = {\n id: \"eslint\",\n active: (o) => o.eslint,\n async run({ projectDir }) {\n const addon = path.join(ADDONS_DIR, \"eslint\");\n\n await fs.copy(\n path.join(addon, \"eslint.config.mjs\"),\n path.join(projectDir, \"eslint.config.mjs\"),\n );\n await fs.copy(\n path.join(addon, \".cursor\", \"rules\", \"eslint.mdc\"),\n path.join(projectDir, \".cursor\", \"rules\", \"eslint.mdc\"),\n );\n await fs.copy(\n path.join(addon, \"docs\", \"style-guide\", \"tooling\", \"eslint.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"tooling\", \"eslint.md\"),\n );\n\n await addDependencies(\n projectDir,\n {\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-import\": \"^2.32.0\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n },\n \"devDependencies\",\n );\n await addScripts(projectDir, {\n lint: \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport {\n addDependencies,\n addScripts,\n mergePackageField,\n} from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nexport const huskyInstaller: Installer = {\n id: \"husky\",\n active: (o) => o.husky,\n async run({ projectDir, options }) {\n const addon = path.join(ADDONS_DIR, \"husky\");\n\n await fs.copy(path.join(addon, \".husky\"), path.join(projectDir, \".husky\"));\n await fs.copy(\n path.join(addon, \"docs\", \"style-guide\", \"tooling\", \"husky.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"tooling\", \"husky.md\"),\n );\n\n try {\n await fs.chmod(path.join(projectDir, \".husky\", \"pre-commit\"), 0o755);\n } catch {\n // ignore\n }\n\n await addDependencies(\n projectDir,\n {\n husky: \"^9.1.7\",\n \"lint-staged\": \"^15.2.11\",\n },\n \"devDependencies\",\n );\n // `|| true` so install still succeeds if git isn't available\n await addScripts(projectDir, { prepare: \"husky || true\" });\n\n const tsHooks: string[] = [];\n if (options.prettier) tsHooks.push(\"prettier --write\");\n if (options.eslint) tsHooks.push(\"eslint --fix\");\n if (tsHooks.length === 0) tsHooks.push(\"echo 'husky: no lint/format tools'\");\n\n const lintStaged: Record<string, string[]> = {\n \"*.{js,jsx,ts,tsx}\": tsHooks,\n };\n if (options.prettier) {\n lintStaged[\"*.{json,css,scss,md,yaml,yml}\"] = [\"prettier --write\"];\n }\n\n await mergePackageField(projectDir, \"lint-staged\", lintStaged);\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst I18N_REQUEST = `import { getRequestConfig } from \"next-intl/server\";\n\nexport default getRequestConfig(async () => {\n const locale = \"en\";\n return {\n locale,\n messages: (await import(\\`../../messages/\\${locale}.json\\`)).default,\n };\n});\n`;\n\nconst MESSAGES_EN = `{\n \"Home\": {\n \"title\": \"Welcome\",\n \"body\": \"Scaffolded with next-style-guide.\"\n }\n}\n`;\n\nconst RULE = `---\ndescription: next-intl i18n conventions\nglobs: src/i18n/**,messages/**,src/providers/app-providers.tsx\nalwaysApply: false\n---\n\n# i18n (next-intl)\n\n- Request config: \\`src/i18n/request.ts\\`.\n- Messages: \\`messages/<locale>.json\\`.\n- Prefer \\`useTranslations\\` / \\`getTranslations\\` — avoid hardcoded copy when a key exists.\n- \\`NextIntlClientProvider\\` is composed in \\`AppProviders\\`; root layout loads locale/messages.\n`;\n\nexport const i18nInstaller: Installer = {\n id: \"i18n\",\n active: (o) => o.i18n,\n async run({ projectDir }) {\n await fs.outputFile(\n path.join(projectDir, \"src\", \"i18n\", \"request.ts\"),\n I18N_REQUEST,\n );\n await fs.outputFile(\n path.join(projectDir, \"messages\", \"en.json\"),\n MESSAGES_EN,\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"i18n.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"i18n\", \"overview.md\"),\n `# i18n\n\nnext-intl: \\`src/i18n/request.ts\\` + \\`messages/en.json\\`\nPlugin wired in \\`next.config.ts\\`. Provider via \\`AppProviders\\`.\n`,\n );\n\n const nextConfigPath = path.join(projectDir, \"next.config.ts\");\n if (await fs.pathExists(nextConfigPath)) {\n let nextConfig = await fs.readFile(nextConfigPath, \"utf8\");\n if (!nextConfig.includes(\"next-intl\")) {\n if (!nextConfig.includes(\"createNextIntlPlugin\")) {\n nextConfig = `import createNextIntlPlugin from \"next-intl/plugin\";\\n\\nconst withNextIntl = createNextIntlPlugin(\"./src/i18n/request.ts\");\\n\\n${nextConfig}`;\n }\n nextConfig = nextConfig.replace(\n \"export default nextConfig;\",\n \"export default withNextIntl(nextConfig);\",\n );\n await fs.writeFile(nextConfigPath, nextConfig, \"utf8\");\n }\n }\n\n await addDependencies(projectDir, {\n \"next-intl\": \"^3.26.3\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport { ICON_PACKAGES } from \"../types.js\";\nimport type { Installer } from \"./types.js\";\n\nconst RULE = `---\ndescription: Icon library conventions\nglobs: \"src/**/*.{ts,tsx}\"\nalwaysApply: false\n---\n\n# Icons\n\n__ICONS_BODY__\n`;\n\nconst BODIES = {\n lucide: `- Use \\`lucide-react\\` icons (\\`import { IconName } from \"lucide-react\"\\`).\n- Prefer Lucide when adding shadcn primitives later.`,\n tabler: `- Use \\`@tabler/icons-react\\` with the \\`Icon*\\` prefix (\\`import { IconHome } from \"@tabler/icons-react\"\\`).\n- Do not mix Lucide and Tabler in the same app.`,\n} as const;\n\nexport const iconsInstaller: Installer = {\n id: \"icons\",\n active: (o) => o.icons !== \"none\",\n async run({ projectDir, options }) {\n if (options.icons === \"none\") return;\n\n const pkg = ICON_PACKAGES[options.icons];\n await addDependencies(projectDir, { [pkg.name]: pkg.version });\n\n const ruleDir = path.join(projectDir, \".cursor\", \"rules\");\n await fs.ensureDir(ruleDir);\n await fs.writeFile(\n path.join(ruleDir, \"icons.mdc\"),\n RULE.replace(\"__ICONS_BODY__\", BODIES[options.icons]),\n \"utf8\",\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst THEME_PROVIDER = `\"use client\";\n\nimport { type ReactNode } from \"react\";\n\nimport { CssBaseline, ThemeProvider, createTheme } from \"@mui/material\";\nimport { AppRouterCacheProvider } from \"@mui/material-nextjs/v15-appRouter\";\n\nconst theme = createTheme({\n cssVariables: true,\n palette: {\n mode: \"light\",\n primary: { main: \"#0b5fff\" },\n },\n});\n\nexport function MuiProvider({ children }: { children: ReactNode }) {\n return (\n <AppRouterCacheProvider>\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </AppRouterCacheProvider>\n );\n}\n`;\n\nconst RULE = `---\ndescription: MUI (Material UI) conventions\nglobs: src/providers/mui-provider.tsx,src/**/*.{ts,tsx}\nalwaysApply: false\n---\n\n# MUI\n\n- Theme via \\`MuiProvider\\` (\\`src/providers/mui-provider.tsx\\`), composed in \\`AppProviders\\`.\n- Prefer MUI components (\\`Button\\`, \\`TextField\\`, \\`Stack\\`, …) over ad-hoc CSS.\n- Do not add shadcn — incompatible with this styling choice.\n- Emotion cache: \\`@mui/material-nextjs\\` App Router provider (already wired).\n`;\n\nexport const muiInstaller: Installer = {\n id: \"mui\",\n active: (o) => o.styling === \"mui\",\n async run({ projectDir }) {\n const providersDir = path.join(projectDir, \"src\", \"providers\");\n await fs.ensureDir(providersDir);\n await fs.remove(path.join(providersDir, \".gitkeep\"));\n await fs.writeFile(\n path.join(providersDir, \"mui-provider.tsx\"),\n THEME_PROVIDER,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"mui.mdc\"),\n RULE,\n \"utf8\",\n );\n\n await addDependencies(projectDir, {\n \"@mui/material\": \"^6.4.0\",\n \"@mui/material-nextjs\": \"^6.4.0\",\n \"@emotion/react\": \"^11.14.0\",\n \"@emotion/styled\": \"^11.14.0\",\n \"@emotion/cache\": \"^11.14.0\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { getPackageManager } from \"../helpers/package-manager.js\";\nimport type { Installer } from \"./types.js\";\n\n/**\n * Normalize package.json `packageManager` field for the chosen tool.\n * Runs early so later installers can assume a consistent field.\n */\nexport const packageManagerInstaller: Installer = {\n id: \"package-manager\",\n active: () => true,\n async run({ projectDir, options }) {\n const meta = getPackageManager(options.packageManager);\n const pkgPath = path.join(projectDir, \"package.json\");\n const pkg = (await fs.readJson(pkgPath)) as Record<string, unknown>;\n\n if (meta.packageManagerField) {\n pkg.packageManager = meta.packageManagerField;\n } else {\n delete pkg.packageManager;\n }\n\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport { addDependencies, addScripts } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nexport const prettierInstaller: Installer = {\n id: \"prettier\",\n active: (o) => o.prettier,\n async run({ projectDir }) {\n const addon = path.join(ADDONS_DIR, \"prettier\");\n\n await fs.copy(\n path.join(addon, \".prettierrc\"),\n path.join(projectDir, \".prettierrc\"),\n );\n await fs.copy(\n path.join(addon, \".cursor\", \"rules\", \"prettier.mdc\"),\n path.join(projectDir, \".cursor\", \"rules\", \"prettier.mdc\"),\n );\n await fs.copy(\n path.join(addon, \"docs\", \"style-guide\", \"tooling\", \"prettier.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"tooling\", \"prettier.md\"),\n );\n\n await addDependencies(\n projectDir,\n { prettier: \"^3.6.2\" },\n \"devDependencies\",\n );\n await addScripts(projectDir, {\n format: \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { Installer } from \"./types.js\";\n\nconst SEO_TS = `import type { Metadata } from \"next\";\n\nimport { env } from \"@/lib/env\";\n\nexport const SITE_NAME = process.env.NEXT_PUBLIC_SITE_NAME?.trim() || \"__PROJECT_NAME__\";\nexport const DEFAULT_DESCRIPTION =\n process.env.NEXT_PUBLIC_SITE_DESCRIPTION?.trim() ||\n \"Generated with next-style-guide\";\n\n/** Absolute public origin (no trailing slash). */\nexport function getAppUrl(): string {\n try {\n return new URL(env.NEXT_PUBLIC_APP_URL).origin;\n } catch {\n return \"http://localhost:3000\";\n }\n}\n\nexport function absoluteUrl(path: string): string {\n const base = getAppUrl();\n if (!path || path === \"/\") return base;\n return \\`\\${base}\\${path.startsWith(\"/\") ? path : \\`/\\${path}\\`}\\`;\n}\n\nexport type SitemapChangeFrequency =\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n\nexport function buildPublicMetadata(input: {\n title: string;\n description: string;\n path: string;\n absoluteTitle?: string;\n noIndex?: boolean;\n}): Metadata {\n const url = absoluteUrl(input.path);\n return {\n title: input.absoluteTitle ?? input.title,\n description: input.description,\n alternates: { canonical: url },\n openGraph: {\n title: input.absoluteTitle ?? input.title,\n description: input.description,\n url,\n siteName: SITE_NAME,\n type: \"website\",\n },\n robots: input.noIndex\n ? { index: false, follow: false }\n : { index: true, follow: true },\n };\n}\n`;\n\nconst PUBLIC_ROUTES = `import {\n buildPublicMetadata,\n DEFAULT_DESCRIPTION,\n SITE_NAME,\n type SitemapChangeFrequency,\n} from \"@/lib/seo\";\n\n/**\n * Indexable URLs — single source of truth for sitemap + page metadata.\n * Add a route under \\`src/app/\\`, then register it here.\n */\nexport type PublicRoute = {\n path: string;\n title: string;\n description: string;\n absoluteTitle?: string;\n changeFrequency: SitemapChangeFrequency;\n priority: number;\n lastModified?: string;\n noIndex?: boolean;\n};\n\nexport const STATIC_PUBLIC_ROUTES: PublicRoute[] = [\n {\n path: \"/\",\n title: SITE_NAME,\n description: DEFAULT_DESCRIPTION,\n changeFrequency: \"weekly\",\n priority: 1,\n lastModified: \"2026-01-01\",\n },\n];\n\nexport function publicPageMetadata(path: string) {\n const route = STATIC_PUBLIC_ROUTES.find((item) => item.path === path);\n if (!route) {\n throw new Error(\\`Missing public route registration for \\${path}\\`);\n }\n return buildPublicMetadata(route);\n}\n`;\n\nconst SITEMAP = `import type { MetadataRoute } from \"next\";\n\nimport { absoluteUrl } from \"@/lib/seo\";\nimport { STATIC_PUBLIC_ROUTES } from \"@/lib/public-routes\";\n\nexport default function sitemap(): MetadataRoute.Sitemap {\n return STATIC_PUBLIC_ROUTES.filter((route) => !route.noIndex).map((route) => ({\n url: absoluteUrl(route.path),\n lastModified: route.lastModified,\n changeFrequency: route.changeFrequency,\n priority: route.priority,\n }));\n}\n`;\n\nconst ROBOTS = `import type { MetadataRoute } from \"next\";\n\nimport { getAppUrl } from \"@/lib/seo\";\n\nexport default function robots(): MetadataRoute.Robots {\n const origin = getAppUrl();\n return {\n rules: {\n userAgent: \"*\",\n allow: \"/\",\n },\n sitemap: \\`\\${origin}/sitemap.xml\\`,\n };\n}\n`;\n\nconst RULE = `---\ndescription: SEO + public routes\nglobs: src/lib/public-routes.ts,src/lib/seo.ts,src/app/sitemap.ts,src/app/robots.ts,src/app/**/page.tsx\nalwaysApply: false\n---\n\n# SEO\n\n- Register every indexable path in \\`STATIC_PUBLIC_ROUTES\\` (\\`src/lib/public-routes.ts\\`).\n- Page metadata: \\`publicPageMetadata(\"/path\")\\` — keep canonical/title/description in sync.\n- \\`sitemap.ts\\` / \\`robots.ts\\` read from that registry — don't hardcode URLs twice.\n- Single \\`<main>\\` in root layout only.\n- Placeholders / thin pages: \\`noIndex: true\\` and keep them out of the sitemap.\n- Prefer static \\`lastModified\\` dates over \\`new Date()\\` for every route.\n`;\n\nexport const seoInstaller: Installer = {\n id: \"seo\",\n active: (o) => o.seo,\n async run({ projectDir, options }) {\n let seo = SEO_TS.replaceAll(\"__PROJECT_NAME__\", options.name);\n await fs.writeFile(path.join(projectDir, \"src\", \"lib\", \"seo.ts\"), seo, \"utf8\");\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"public-routes.ts\"),\n PUBLIC_ROUTES,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"app\", \"sitemap.ts\"),\n SITEMAP,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"app\", \"robots.ts\"),\n ROBOTS,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"seo.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"seo\", \"overview.md\"),\n `# SEO\n\n- Registry: \\`src/lib/public-routes.ts\\`\n- Helpers: \\`src/lib/seo.ts\\`\n- \\`sitemap.ts\\` / \\`robots.ts\\` under \\`src/app/\\`\n\nAdd a page → register the path → metadata/sitemap update automatically.\n`,\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nfunction componentsJson(iconLibrary: \"lucide\" | \"tabler\"): string {\n return `${JSON.stringify(\n {\n $schema: \"https://ui.shadcn.com/schema.json\",\n style: \"new-york\",\n rsc: true,\n tsx: true,\n tailwind: {\n config: \"\",\n css: \"src/app/globals.css\",\n baseColor: \"neutral\",\n cssVariables: true,\n prefix: \"\",\n },\n iconLibrary,\n aliases: {\n components: \"@/components\",\n utils: \"@/lib/utils\",\n ui: \"@/components/ui\",\n lib: \"@/lib\",\n hooks: \"@/hooks\",\n },\n },\n null,\n 2,\n )}\\n`;\n}\n\nconst BUTTON = `import { cva, type VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-neutral-900 text-white hover:bg-neutral-800\",\n outline: \"border border-neutral-300 bg-transparent hover:bg-neutral-100\",\n ghost: \"hover:bg-neutral-100\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport function Button({\n className,\n variant,\n size,\n ...props\n}: ComponentProps<\"button\"> & VariantProps<typeof buttonVariants>) {\n return (\n <button className={cn(buttonVariants({ variant, size, className }))} {...props} />\n );\n}\n`;\n\nconst INPUT = `import type { ComponentProps } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport function Input({ className, type, ...props }: ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-neutral-300 bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-neutral-400 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n`;\n\nconst CARD = `import type { ComponentProps } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport function Card({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"rounded-xl border border-neutral-200 bg-white text-neutral-950 shadow-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function CardHeader({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div className={cn(\"flex flex-col gap-1.5 p-6\", className)} {...props} />\n );\n}\n\nexport function CardTitle({ className, ...props }: ComponentProps<\"h3\">) {\n return (\n <h3\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n );\n}\n\nexport function CardDescription({ className, ...props }: ComponentProps<\"p\">) {\n return (\n <p className={cn(\"text-sm text-neutral-500\", className)} {...props} />\n );\n}\n\nexport function CardContent({ className, ...props }: ComponentProps<\"div\">) {\n return <div className={cn(\"p-6 pt-0\", className)} {...props} />;\n}\n\nexport function CardFooter({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div className={cn(\"flex items-center p-6 pt-0\", className)} {...props} />\n );\n}\n`;\n\nconst DIALOG = `\"use client\";\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport const Dialog = DialogPrimitive.Root;\nexport const DialogTrigger = DialogPrimitive.Trigger;\nexport const DialogClose = DialogPrimitive.Close;\nexport const DialogPortal = DialogPrimitive.Portal;\n\nexport function DialogOverlay({\n className,\n ...props\n}: ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DialogContent({\n className,\n children,\n ...props\n}: ComponentProps<typeof DialogPrimitive.Content>) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n className={cn(\n \"fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border border-neutral-200 bg-white p-6 shadow-lg duration-200 sm:rounded-xl\",\n className,\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nexport function DialogHeader({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"flex flex-col gap-1.5 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nexport function DialogTitle({\n className,\n ...props\n}: ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n className={cn(\"text-lg font-semibold leading-none\", className)}\n {...props}\n />\n );\n}\n\nexport function DialogDescription({\n className,\n ...props\n}: ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n className={cn(\"text-sm text-neutral-500\", className)}\n {...props}\n />\n );\n}\n`;\n\nfunction ruleFor(set: \"minimal\" | \"starter\"): string {\n const setLine =\n set === \"starter\"\n ? \"- Starter set: `button`, `input`, `card`, `dialog`.\"\n : \"- Minimal set: `button` only.\";\n return `---\ndescription: shadcn/ui conventions\nglobs: components.json,src/components/ui/**,src/lib/utils.ts\nalwaysApply: false\n---\n\n# shadcn\n\n- Primitives live flat in \\`src/components/ui/*\\` (CLI-compatible).\n${setLine}\n- Add more with \\`npx shadcn@latest add …\\`.\n- \\`cn()\\` from \\`@/lib/utils\\` for class merging.\n- Config: \\`components.json\\`. Requires Tailwind.\n`;\n}\n\nexport const shadcnInstaller: Installer = {\n id: \"shadcn\",\n active: (o) => o.ui === \"shadcn\" && o.styling === \"tailwind\",\n async run({ projectDir, options }) {\n const iconLibrary = options.icons === \"tabler\" ? \"tabler\" : \"lucide\";\n const set = options.shadcnSet;\n const uiDir = path.join(projectDir, \"src\", \"components\", \"ui\");\n\n await fs.writeFile(\n path.join(projectDir, \"components.json\"),\n componentsJson(iconLibrary),\n \"utf8\",\n );\n await fs.ensureDir(uiDir);\n await fs.writeFile(path.join(uiDir, \"button.tsx\"), BUTTON, \"utf8\");\n\n if (set === \"starter\") {\n await fs.writeFile(path.join(uiDir, \"input.tsx\"), INPUT, \"utf8\");\n await fs.writeFile(path.join(uiDir, \"card.tsx\"), CARD, \"utf8\");\n await fs.writeFile(path.join(uiDir, \"dialog.tsx\"), DIALOG, \"utf8\");\n }\n\n await fs.remove(path.join(uiDir, \".gitkeep\"));\n await fs.remove(path.join(projectDir, \"src\", \"components\", \".gitkeep\"));\n\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"shadcn.mdc\"),\n ruleFor(set),\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"ui\", \"shadcn.md\"),\n `# shadcn/ui\n\nSet: **${set}**\n${set === \"starter\" ? \"- `button` · `input` · `card` · `dialog`\\n\" : \"- `button`\\n\"}\nAdd more: \\`npx shadcn@latest add …\\`\n`,\n );\n\n if (options.icons === \"none\") {\n await addDependencies(projectDir, {\n \"lucide-react\": \"^0.469.0\",\n });\n }\n\n const deps: Record<string, string> = {\n \"class-variance-authority\": \"^0.7.1\",\n };\n if (set === \"starter\") {\n deps[\"@radix-ui/react-dialog\"] = \"^1.1.4\";\n }\n await addDependencies(projectDir, deps);\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst ZUSTAND_STORE = `import { create } from \"zustand\";\n\ntype AppState = {\n hydrated: boolean;\n setHydrated: (value: boolean) => void;\n};\n\n/** App-wide client store — extend slices as the product grows. */\nexport const useAppStore = create<AppState>((set) => ({\n hydrated: false,\n setHydrated: (value) => set({ hydrated: value }),\n}));\n`;\n\nconst ZUSTAND_RULE = `---\ndescription: Zustand client store conventions\nglobs: src/stores/**\nalwaysApply: false\n---\n\n# Zustand\n\n- Stores live under \\`src/stores/\\` (one file per domain slice when possible).\n- Prefer small selectors: \\`useAppStore((s) => s.hydrated)\\`.\n- Do not put server secrets or tokens in the client store.\n- Server Components stay free of store hooks — pass data down or use a client leaf.\n`;\n\nconst REDUX_STORE = `import { configureStore, createSlice, type PayloadAction } from \"@reduxjs/toolkit\";\n\ntype AppSliceState = {\n hydrated: boolean;\n};\n\nconst initialState: AppSliceState = {\n hydrated: false,\n};\n\nconst appSlice = createSlice({\n name: \"app\",\n initialState,\n reducers: {\n setHydrated(state, action: PayloadAction<boolean>) {\n state.hydrated = action.payload;\n },\n },\n});\n\nexport const { setHydrated } = appSlice.actions;\n\nexport const makeStore = () =>\n configureStore({\n reducer: {\n app: appSlice.reducer,\n },\n });\n\nexport type AppStore = ReturnType<typeof makeStore>;\nexport type RootState = ReturnType<AppStore[\"getState\"]>;\nexport type AppDispatch = AppStore[\"dispatch\"];\n`;\n\nconst REDUX_HOOKS = `import { useDispatch, useSelector, useStore } from \"react-redux\";\n\nimport type { AppDispatch, AppStore, RootState } from \"@/stores/store\";\n\nexport const useAppDispatch = useDispatch.withTypes<AppDispatch>();\nexport const useAppSelector = useSelector.withTypes<RootState>();\nexport const useAppStore = useStore.withTypes<AppStore>();\n`;\n\nconst REDUX_PROVIDER = `\"use client\";\n\nimport { type ReactNode, useRef } from \"react\";\nimport { Provider } from \"react-redux\";\n\nimport { makeStore, type AppStore } from \"@/stores/store\";\n\nexport function StoreProvider({ children }: { children: ReactNode }) {\n const storeRef = useRef<AppStore | null>(null);\n if (!storeRef.current) {\n storeRef.current = makeStore();\n }\n\n return <Provider store={storeRef.current}>{children}</Provider>;\n}\n`;\n\nconst REDUX_RULE = `---\ndescription: Redux Toolkit client store conventions\nglobs: src/stores/**,src/providers/store-provider.tsx\nalwaysApply: false\n---\n\n# Redux Toolkit\n\n- Store factory: \\`src/stores/store.ts\\` (\\`makeStore\\`).\n- Typed hooks: \\`src/stores/hooks.ts\\` (\\`useAppDispatch\\` / \\`useAppSelector\\`).\n- Provider: \\`src/providers/store-provider.tsx\\` (composed via \\`AppProviders\\`).\n- Prefer RTK slices; keep server secrets out of the client store.\n`;\n\nexport const storeInstaller: Installer = {\n id: \"store\",\n active: (o) => o.store !== \"none\",\n async run({ projectDir, options }) {\n const storesDir = path.join(projectDir, \"src\", \"stores\");\n await fs.ensureDir(storesDir);\n\n if (options.store === \"zustand\") {\n await fs.writeFile(\n path.join(storesDir, \"app-store.ts\"),\n ZUSTAND_STORE,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"store.mdc\"),\n ZUSTAND_RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"state\", \"zustand.md\"),\n `# Zustand\n\n- Store: \\`src/stores/app-store.ts\\`\n- Extend with domain slices under \\`src/stores/\\`\n`,\n );\n await addDependencies(projectDir, { zustand: \"^5.0.3\" });\n return;\n }\n\n // redux\n await fs.writeFile(path.join(storesDir, \"store.ts\"), REDUX_STORE, \"utf8\");\n await fs.writeFile(path.join(storesDir, \"hooks.ts\"), REDUX_HOOKS, \"utf8\");\n\n const providersDir = path.join(projectDir, \"src\", \"providers\");\n await fs.ensureDir(providersDir);\n await fs.remove(path.join(providersDir, \".gitkeep\"));\n await fs.writeFile(\n path.join(providersDir, \"store-provider.tsx\"),\n REDUX_PROVIDER,\n \"utf8\",\n );\n\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"store.mdc\"),\n REDUX_RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"state\", \"redux.md\"),\n `# Redux Toolkit\n\n- Store: \\`src/stores/store.ts\\`\n- Hooks: \\`src/stores/hooks.ts\\`\n- Provider: \\`src/providers/store-provider.tsx\\` (via \\`AppProviders\\`)\n`,\n );\n\n await addDependencies(projectDir, {\n \"@reduxjs/toolkit\": \"^2.5.1\",\n \"react-redux\": \"^9.2.0\",\n });\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { ADDONS_DIR } from \"../constants.js\";\nimport type { ScaffoldOptions } from \"../types.js\";\nimport type { Installer } from \"./types.js\";\n\nfunction stackLines(options: ScaffoldOptions): string[] {\n const stylingLabel =\n options.styling === \"tailwind\"\n ? options.ui === \"shadcn\"\n ? \"Tailwind + shadcn/ui\"\n : \"Tailwind CSS\"\n : options.styling === \"mui\"\n ? \"MUI\"\n : \"Plain CSS\";\n\n return [\n `Package manager: ${options.packageManager}`,\n `Styling: ${stylingLabel}`,\n `Validation: ${options.validation}`,\n `Auth: ${options.auth}`,\n options.store === \"none\"\n ? \"No client store\"\n : `Client store: ${options.store}`,\n options.darkMode ? \"Dark mode (next-themes)\" : \"No dark mode\",\n options.seo ? \"SEO helpers (sitemap/robots)\" : \"No SEO helpers\",\n options.data === \"tanstack-query\"\n ? \"TanStack Query enabled\"\n : \"RSC / fetch (no TanStack Query)\",\n options.icons === \"none\" ? \"No icon library\" : `Icons: ${options.icons}`,\n options.endpoints\n ? `OpenAPI endpoints codegen (\\`${options.packageManager} endpoints:generate\\`)`\n : \"No endpoints codegen\",\n options.apiEnvelope ? \"API envelope unwrap\" : \"No envelope unwrap\",\n options.i18n ? \"i18n (next-intl)\" : \"No i18n\",\n options.testing\n ? options.playwright\n ? \"Vitest + Playwright\"\n : \"Vitest\"\n : \"No tests\",\n options.eslint ? \"Enhanced ESLint\" : \"Minimal ESLint\",\n options.prettier ? \"Prettier\" : \"No Prettier\",\n options.husky ? \"Husky + lint-staged\" : \"No git hooks\",\n options.ui === \"shadcn\"\n ? `shadcn set: ${options.shadcnSet}`\n : null,\n options.deploy === \"docker\"\n ? \"Deploy: Docker standalone image\"\n : options.deploy === \"vercel\"\n ? \"Deploy: Vercel\"\n : \"No deploy target\",\n options.ci ? \"GitHub Actions CI\" : \"No CI workflow\",\n ].filter((line): line is string => line !== null);\n}\n\nfunction welcomeCardSource(options: ScaffoldOptions): string {\n const items = stackLines(options)\n .map((line) => ` <li>${escapeJsx(line)}</li>`)\n .join(\"\\n\");\n\n return `/** Homepage sample — reflects scaffold choices; replace with real UI. */\nexport function WelcomeCard() {\n return (\n <div className=\"card\">\n <h2>Your scaffold</h2>\n <ul>\n${items}\n </ul>\n <p className=\"meta\" style={{ marginTop: \"1rem\" }}>\n Route UI → <code>src/app/<route>/_components/</code> · shared →{\" \"}\n <code>src/components/</code>\n </p>\n </div>\n );\n}\n`;\n}\n\nfunction escapeJsx(text: string): string {\n return text.replaceAll(\"`\", \"\\\\`\");\n}\n\nfunction homePageSource(options: ScaffoldOptions): string {\n const uiBit =\n options.ui === \"shadcn\" ? \" · ui=<code>shadcn</code>\" : \"\";\n\n return `import { WelcomeCard } from \"@/app/_components/welcome-card\";\n\nexport default function HomePage() {\n return (\n <>\n <section className=\"hero\">\n <h1>${options.name}</h1>\n <p>\n Scaffolded with <strong>next-style-guide</strong> (Next.js 16).\n styling=<code>${options.styling}</code>${uiBit} · validation=\n <code>${options.validation}</code> · icons=<code>${options.icons}</code> ·\n data=<code>${options.data}</code>.\n </p>\n </section>\n\n <WelcomeCard />\n\n <p className=\"meta\">\n Read <code>AGENTS.md</code> and <code>docs/style-guide/</code> before\n adding routes. Feature rules in <code>.cursor/rules/</code> load by glob.\n </p>\n </>\n );\n}\n`;\n}\n\nfunction docsIndex(options: ScaffoldOptions): string {\n const rows: Array<[string, string]> = [\n [\n \"[Architecture](overview/architecture.md)\",\n \"Layers: app / components / lib / utils\",\n ],\n [\"[Project structure](overview/project-structure.md)\", \"Folder map\"],\n [\"[Environment](ops/env.md)\", \"`.env.example` · staging · production\"],\n [\"[HTTP client](http/client.md)\", \"`apiFetch` helper\"],\n [\n `[Validation](validation/${options.validation}.md)`,\n options.validation.toUpperCase(),\n ],\n ];\n\n if (options.auth === \"jwt\") {\n rows.push([\"[JWT auth](auth/jwt.md)\", \"token-storage + Bearer refresh\"]);\n }\n if (options.auth === \"authjs\") {\n rows.push([\"[Auth.js](auth/authjs.md)\", \"NextAuth stub\"]);\n }\n if (options.store === \"zustand\") {\n rows.push([\"[Zustand](state/zustand.md)\", \"client store\"]);\n }\n if (options.store === \"redux\") {\n rows.push([\"[Redux Toolkit](state/redux.md)\", \"client store\"]);\n }\n if (options.darkMode) {\n rows.push([\"[Dark mode](ui/dark-mode.md)\", \"next-themes\"]);\n }\n if (options.auth === \"jwt\" && options.endpoints) {\n rows.push([\n \"[Docker Compose](ops/docker-compose.md)\",\n \"local API stub\",\n ]);\n }\n if (options.seo) {\n rows.push([\"[SEO](seo/overview.md)\", \"public-routes · sitemap · robots\"]);\n }\n if (options.i18n) {\n rows.push([\"[i18n](i18n/overview.md)\", \"next-intl\"]);\n }\n if (options.apiEnvelope) {\n rows.push([\"[API envelope](http/envelope.md)\", \"unwrap result\"]);\n }\n if (options.testing) {\n rows.push([\"[Testing](tooling/testing.md)\", \"Vitest\"]);\n }\n if (options.styling === \"tailwind\") {\n rows.push([\"Tailwind\", \"See `.cursor/rules/tailwind.mdc`\"]);\n }\n if (options.ui === \"shadcn\") {\n rows.push([\n \"[shadcn/ui](ui/shadcn.md)\",\n `set=${options.shadcnSet}`,\n ]);\n }\n if (options.styling === \"mui\") {\n rows.push([\"MUI\", \"See `.cursor/rules/mui.mdc`\"]);\n }\n if (options.endpoints) {\n rows.push([\n \"[OpenAPI endpoints](http/endpoints.md)\",\n `\\`${options.packageManager} endpoints:generate\\``,\n ]);\n }\n if (options.data === \"tanstack-query\") {\n rows.push([\n \"[TanStack Query](data/tanstack-query.md)\",\n \"Client cache + QueryProvider\",\n ]);\n }\n if (options.icons !== \"none\") {\n rows.push([\"[Icons](ui/icons.md)\", `Icon library (${options.icons})`]);\n }\n if (options.eslint) {\n rows.push([\"[ESLint](tooling/eslint.md)\", \"Import sort + style rules\"]);\n }\n if (options.prettier) {\n rows.push([\"[Prettier](tooling/prettier.md)\", \"Formatting\"]);\n }\n if (options.husky) {\n rows.push([\"[Husky](tooling/husky.md)\", \"Pre-commit hooks\"]);\n }\n if (options.deploy === \"docker\") {\n rows.push([\"[Docker](ops/docker.md)\", \"Standalone production image\"]);\n }\n if (options.deploy === \"vercel\") {\n rows.push([\"[Vercel](ops/vercel.md)\", \"vercel.json + env notes\"]);\n }\n if (options.ci) {\n rows.push([\"[CI](ops/ci.md)\", \"GitHub Actions\"]);\n }\n\n const table = [\n \"| Page | Topic |\",\n \"|------|--------|\",\n ...rows.map(([page, topic]) => `| ${page} | ${topic} |`),\n ].join(\"\\n\");\n\n return `# Style guide — ${options.name}\n\nLiving conventions for this app. Open one page at a time.\n\n${table}\n\nCoding agents: start at [\\`AGENTS.md\\`](../../AGENTS.md) → [\\`.cursor/rules/\\`](../../.cursor/rules/) (glob-scoped).\n`;\n}\n\nexport const surfaceInstaller: Installer = {\n id: \"surface\",\n active: () => true,\n async run({ projectDir, options }) {\n await fs.writeFile(\n path.join(\n projectDir,\n \"src\",\n \"app\",\n \"_components\",\n \"welcome-card\",\n \"index.tsx\",\n ),\n welcomeCardSource(options),\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"app\", \"page.tsx\"),\n homePageSource(options),\n \"utf8\",\n );\n\n if (options.data === \"tanstack-query\") {\n await fs.copy(\n path.join(ADDONS_DIR, \"docs\", \"data\", \"tanstack-query.md\"),\n path.join(\n projectDir,\n \"docs\",\n \"style-guide\",\n \"data\",\n \"tanstack-query.md\",\n ),\n );\n }\n if (options.icons !== \"none\") {\n await fs.copy(\n path.join(ADDONS_DIR, \"docs\", \"ui\", \"icons.md\"),\n path.join(projectDir, \"docs\", \"style-guide\", \"ui\", \"icons.md\"),\n );\n }\n\n if (options.auth === \"jwt\" && options.endpoints) {\n const exampleSrc = path.join(\n ADDONS_DIR,\n \"docs\",\n \"examples\",\n \"api-app-crud.md\",\n );\n if (await fs.pathExists(exampleSrc)) {\n await fs.copy(\n exampleSrc,\n path.join(projectDir, \"docs\", \"examples\", \"api-app-crud.md\"),\n );\n }\n }\n\n await fs.writeFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"README.md\"),\n docsIndex(options),\n \"utf8\",\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst POSTCSS = `const config = {\n plugins: {\n \"@tailwindcss/postcss\": {},\n },\n};\n\nexport default config;\n`;\n\nconst GLOBALS = `@import \"tailwindcss\";\n\n:root {\n color-scheme: light;\n --background: #f6f4ef;\n --foreground: #14201b;\n --muted: #5b6b63;\n --accent: #0b5fff;\n --card: #ffffff;\n --border: #d9e0db;\n}\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-muted: var(--muted);\n --color-accent: var(--accent);\n --color-card: var(--card);\n --color-border: var(--border);\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml,\nbody {\n margin: 0;\n min-height: 100%;\n background: radial-gradient(circle at top left, #eef3ff, transparent 40%),\n var(--background);\n color: var(--foreground);\n font-family: ui-sans-serif, system-ui, sans-serif;\n}\n\na {\n color: var(--accent);\n text-decoration: none;\n}\n\na:hover {\n text-decoration: underline;\n}\n\nmain {\n width: min(720px, calc(100% - 2rem));\n margin: 0 auto;\n padding: 4rem 0 3rem;\n}\n\n.hero {\n display: grid;\n gap: 1rem;\n}\n\n.hero h1 {\n margin: 0;\n font-size: clamp(2rem, 5vw, 3rem);\n letter-spacing: -0.03em;\n}\n\n.hero p {\n margin: 0;\n color: var(--muted);\n line-height: 1.6;\n max-width: 40rem;\n}\n\n.card {\n margin-top: 2rem;\n padding: 1.25rem 1.5rem;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 12px;\n}\n\n.card h2 {\n margin: 0 0 0.5rem;\n font-size: 1rem;\n}\n\n.card ul {\n margin: 0;\n padding-left: 1.1rem;\n color: var(--muted);\n line-height: 1.7;\n}\n\n.meta {\n margin-top: 2rem;\n font-size: 0.875rem;\n color: var(--muted);\n}\n`;\n\nconst UTILS = `import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n`;\n\nconst RULE = `---\ndescription: Tailwind CSS v4 conventions\nglobs: src/app/globals.css,src/**/*.{tsx,css},postcss.config.mjs\nalwaysApply: false\n---\n\n# Tailwind\n\n- Tailwind v4 via \\`@import \"tailwindcss\"\\` in \\`globals.css\\` + \\`@tailwindcss/postcss\\`.\n- Prefer utility classes; keep semantic CSS variables in \\`:root\\` / \\`@theme\\`.\n- Class merging: \\`cn()\\` from \\`@/lib/utils\\` (clsx + tailwind-merge).\n`;\n\nexport const tailwindInstaller: Installer = {\n id: \"tailwind\",\n active: (o) => o.styling === \"tailwind\",\n async run({ projectDir }) {\n await fs.writeFile(\n path.join(projectDir, \"postcss.config.mjs\"),\n POSTCSS,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"app\", \"globals.css\"),\n GLOBALS,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"utils.ts\"),\n UTILS,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"tailwind.mdc\"),\n RULE,\n \"utf8\",\n );\n\n await addDependencies(projectDir, {\n clsx: \"^2.1.1\",\n \"tailwind-merge\": \"^3.6.0\",\n });\n await addDependencies(\n projectDir,\n {\n tailwindcss: \"^4\",\n \"@tailwindcss/postcss\": \"^4\",\n },\n \"devDependencies\",\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies } from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst PROVIDER = `\"use client\";\n\nimport { type ReactNode, useState } from \"react\";\n\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n\nfunction createQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60_000,\n refetchOnWindowFocus: false,\n retry: 1,\n },\n mutations: {\n retry: false,\n },\n },\n });\n}\n\nexport function QueryProvider({ children }: { children: ReactNode }) {\n const [client] = useState(createQueryClient);\n\n return <QueryClientProvider client={client}>{children}</QueryClientProvider>;\n}\n`;\n\nconst RULE = `---\ndescription: TanStack Query conventions\nglobs: src/providers/**,src/hooks/**,src/endpoints/**,src/**/*query*.{ts,tsx},src/**/use-*.{ts,tsx}\nalwaysApply: false\n---\n\n# TanStack Query\n\n- \\`QueryProvider\\` (\\`src/providers/query-provider.tsx\\`) is composed via \\`AppProviders\\`.\n- Client data: \\`useQuery\\` / \\`useMutation\\`; keep RSC for server-friendly fetches.\n- Query keys: use generated \\`get<EndpointName>QueryKey(...)\\` when endpoints codegen is on — never ad-hoc \\`[\"resource\"]\\` strings.\n- Default hook \\`params\\` to the matching \\`*DefaultParams\\` when present.\n- Errors: \\`getApiErrorMessage\\` / field helpers from \\`@/utils/api-error\\`.\n`;\n\nexport const tanstackQueryInstaller: Installer = {\n id: \"tanstack-query\",\n active: (o) => o.data === \"tanstack-query\",\n async run({ projectDir }) {\n await addDependencies(projectDir, {\n \"@tanstack/react-query\": \"^5.62.8\",\n });\n\n const providersDir = path.join(projectDir, \"src\", \"providers\");\n await fs.ensureDir(providersDir);\n await fs.remove(path.join(providersDir, \".gitkeep\"));\n await fs.writeFile(\n path.join(providersDir, \"query-provider.tsx\"),\n PROVIDER,\n \"utf8\",\n );\n\n const ruleDir = path.join(projectDir, \".cursor\", \"rules\");\n await fs.ensureDir(ruleDir);\n await fs.writeFile(\n path.join(ruleDir, \"tanstack-query.mdc\"),\n RULE,\n \"utf8\",\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport { addDependencies, addScripts } from \"../helpers/package-json.js\";\nimport { getPackageManager } from \"../helpers/package-manager.js\";\nimport type { Installer } from \"./types.js\";\n\nconst VITEST_CONFIG = `import react from \"@vitejs/plugin-react\";\nimport { resolve } from \"node:path\";\nimport { defineConfig } from \"vitest/config\";\n\nexport default defineConfig({\n plugins: [react()],\n test: {\n environment: \"jsdom\",\n globals: true,\n include: [\"tests/**/*.test.{ts,tsx}\", \"src/**/*.test.{ts,tsx}\"],\n },\n resolve: {\n alias: {\n \"@\": resolve(import.meta.dirname, \"./src\"),\n },\n },\n});\n`;\n\nconst SAMPLE_TEST = `import { renderToStaticMarkup } from \"react-dom/server\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { WelcomeCard } from \"@/app/_components/welcome-card\";\n\ndescribe(\"WelcomeCard\", () => {\n it(\"renders scaffold heading\", () => {\n const html = renderToStaticMarkup(<WelcomeCard />);\n expect(html).toContain(\"Your scaffold\");\n });\n});\n`;\n\nfunction playwrightConfig(devCommand: string): string {\n return `import { defineConfig, devices } from \"@playwright/test\";\n\nexport default defineConfig({\n testDir: \"./e2e\",\n fullyParallel: true,\n forbidOnly: !!process.env.CI,\n retries: process.env.CI ? 1 : 0,\n use: {\n baseURL: \"http://127.0.0.1:3000\",\n trace: \"on-first-retry\",\n },\n projects: [{ name: \"chromium\", use: { ...devices[\"Desktop Chrome\"] } }],\n webServer: {\n command: \"${devCommand}\",\n url: \"http://127.0.0.1:3000\",\n reuseExistingServer: !process.env.CI,\n },\n});\n`;\n}\n\nconst E2E_SMOKE = `import { expect, test } from \"@playwright/test\";\n\ntest(\"home loads\", async ({ page }) => {\n await page.goto(\"/\");\n await expect(page.getByRole(\"heading\", { level: 1 })).toBeVisible();\n});\n`;\n\nexport const testingInstaller: Installer = {\n id: \"testing\",\n active: (o) => o.testing,\n async run({ projectDir, options }) {\n const pm = getPackageManager(options.packageManager);\n const testCmd = pm.runScript(\"test\");\n const e2eCmd = pm.runScript(\"test:e2e\");\n\n const rule = `---\ndescription: Vitest (and optional Playwright) conventions\nglobs: \"**/*.test.{ts,tsx}\",vitest.config.*,e2e/**,playwright.config.*\nalwaysApply: false\n---\n\n# Testing\n\n- Vitest: colocated \\`<name>.test.tsx\\` next to components; also \\`tests/**\\`.\n- Prefer \\`renderToStaticMarkup\\` for simple server component smoke.\n- Run \\`${testCmd}\\`. Playwright (if enabled): \\`${e2eCmd}\\`.\n`;\n\n await fs.writeFile(\n path.join(projectDir, \"vitest.config.mts\"),\n VITEST_CONFIG,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(\n projectDir,\n \"src\",\n \"app\",\n \"_components\",\n \"welcome-card\",\n \"welcome-card.test.tsx\",\n ),\n SAMPLE_TEST,\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"testing.mdc\"),\n rule,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"tooling\", \"testing.md\"),\n `# Testing\n\nVitest: \\`${testCmd}\\`\nConfig: \\`vitest.config.mts\\`\nColocate \\`*.test.tsx\\` with components under \\`src/\\`.\n${options.playwright ? `\\nPlaywright: \\`${e2eCmd}\\` · config \\`playwright.config.ts\\` · specs in \\`e2e/\\`.\\n` : \"\"}\n`,\n );\n\n await addDependencies(\n projectDir,\n {\n vitest: \"^3.0.5\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n jsdom: \"^26.0.0\",\n },\n \"devDependencies\",\n );\n await addScripts(projectDir, {\n test: \"vitest run\",\n \"test:watch\": \"vitest\",\n });\n\n if (options.playwright) {\n await fs.writeFile(\n path.join(projectDir, \"playwright.config.ts\"),\n playwrightConfig(pm.runScript(\"dev\")),\n \"utf8\",\n );\n await fs.outputFile(path.join(projectDir, \"e2e\", \"home.spec.ts\"), E2E_SMOKE);\n await addDependencies(\n projectDir,\n { \"@playwright/test\": \"^1.50.1\" },\n \"devDependencies\",\n );\n await addScripts(projectDir, {\n \"test:e2e\": \"playwright test\",\n });\n }\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport {\n addDependencies,\n removeDependencies,\n} from \"../helpers/package-json.js\";\nimport type { Installer } from \"./types.js\";\n\nconst ENV_ZOD = `import { z } from \"zod\";\n\n/**\n * Validated public env. Import from Client Components only for NEXT_PUBLIC_*.\n * Server-only secrets stay out of this schema until needed.\n */\nconst publicEnvSchema = z.object({\n NEXT_PUBLIC_APP_URL: z.string().url().default(\"http://localhost:3000\"),\n NEXT_PUBLIC_API_URL: z.string().url().default(\"http://localhost:8000\"),\n});\n\nexport type PublicEnv = z.infer<typeof publicEnvSchema>;\n\nexport const env: PublicEnv = publicEnvSchema.parse({\n NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL,\n NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,\n});\n`;\n\nconst ENV_YUP = `import * as yup from \"yup\";\n\n/**\n * Validated public env. Import from Client Components only for NEXT_PUBLIC_*.\n * Server-only secrets stay out of this schema until needed.\n */\nconst publicEnvSchema = yup.object({\n NEXT_PUBLIC_APP_URL: yup\n .string()\n .url()\n .default(\"http://localhost:3000\"),\n NEXT_PUBLIC_API_URL: yup\n .string()\n .url()\n .default(\"http://localhost:8000\"),\n});\n\nexport type PublicEnv = yup.InferType<typeof publicEnvSchema>;\n\nexport const env: PublicEnv = publicEnvSchema.validateSync({\n NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL,\n NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,\n});\n`;\n\nfunction formsRule(validation: \"zod\" | \"yup\"): string {\n const schemaLine =\n validation === \"zod\"\n ? \"- RHF + `Controller` + Zod `zodResolver`. Schema `satisfies z.ZodType<*Body>` when endpoints codegen exists; field names = API keys.\"\n : \"- RHF + `Controller` + Yup `yupResolver`. Schemas in `src/lib/validations/`; field names = API keys when endpoints codegen exists.\";\n\n return `---\ndescription: RHF + ${validation === \"zod\" ? \"Zod\" : \"Yup\"} forms aligned to API body types\nglobs: src/**/*form*/**,src/**/*-form*/**,src/**/*.form.tsx,src/components/forms/**,src/lib/**/*form*.ts,src/lib/validations/**\nalwaysApply: false\n---\n\n# Forms\n\n- \\`\"use client\"\\` + named exports. \\`page.tsx\\` stays server when metadata-only.\n- Placement: shared → \\`src/components/forms/<name>/\\`; one route → \\`src/app/<route>/_components/forms/<name>/\\`.\n${schemaLine}\n- Reuse shared/UI controls — no ad-hoc inputs.\n- Required: derive from schema / \\`*Body\\`; use \\`required\\` on Field/Label (no handmade \\`*\\` text).\n- Invalid: \\`data-invalid\\`, \\`aria-invalid\\`, \\`FieldError\\`.\n- Server 400 envelope: \\`getApiErrorMessage\\` / \\`extractApiFieldErrors\\` (\\`@/utils/api-error\\`); map to \\`setError\\` when using RHF.\n- Never duplicate the same form state/submit logic across pages.\n`;\n}\n\nfunction validationRule(validation: \"zod\" | \"yup\"): string {\n return `---\ndescription: ${validation === \"zod\" ? \"Zod\" : \"Yup\"} validation conventions\nglobs: src/lib/env.ts,src/lib/validations/**,src/**/*schema*.{ts,tsx}\nalwaysApply: false\n---\n\n# Validation (${validation})\n\n- Public env: \\`src/lib/env.ts\\` (${validation} schema).\n- Domain schemas: \\`src/lib/validations/<name>.ts\\`.\n- Forms: use \\`${validation === \"zod\" ? \"zodResolver\" : \"yupResolver\"}\\` from \\`@hookform/resolvers\\`.\n- Prefer one library — do not mix Zod and Yup in the same app.\n`;\n}\n\nexport const validationInstaller: Installer = {\n id: \"validation\",\n active: () => true,\n async run({ projectDir, options }) {\n const validationsDir = path.join(projectDir, \"src\", \"lib\", \"validations\");\n await fs.ensureDir(validationsDir);\n await fs.writeFile(path.join(validationsDir, \".gitkeep\"), \"\", \"utf8\");\n\n if (options.validation === \"yup\") {\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"env.ts\"),\n ENV_YUP,\n \"utf8\",\n );\n await removeDependencies(projectDir, [\"zod\"]);\n await addDependencies(projectDir, { yup: \"^1.6.1\" });\n } else {\n await fs.writeFile(\n path.join(projectDir, \"src\", \"lib\", \"env.ts\"),\n ENV_ZOD,\n \"utf8\",\n );\n await addDependencies(projectDir, { zod: \"^3.24.1\" });\n }\n\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"forms.mdc\"),\n formsRule(options.validation),\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"validation.mdc\"),\n validationRule(options.validation),\n \"utf8\",\n );\n\n await fs.outputFile(\n path.join(\n projectDir,\n \"docs\",\n \"style-guide\",\n \"validation\",\n `${options.validation}.md`,\n ),\n `# Validation — ${options.validation}\n\nEnv: \\`src/lib/env.ts\\`\nSchemas: \\`src/lib/validations/\\`\nForms: \\`@hookform/resolvers/${options.validation}\\` when using RHF.\n`,\n );\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\n\nimport type { Installer } from \"./types.js\";\n\nconst VERCEL_JSON = `{\n \"framework\": \"nextjs\",\n \"regions\": [\"iad1\"]\n}\n`;\n\nconst RULE = `---\ndescription: Vercel deployment conventions\nglobs: vercel.json\nalwaysApply: false\n---\n\n# Vercel\n\n- Config: \\`vercel.json\\` (framework Next.js).\n- Set \\`NEXT_PUBLIC_APP_URL\\` / \\`NEXT_PUBLIC_API_URL\\` (and \\`AUTH_SECRET\\` if Auth.js) in the Vercel project env.\n- Prefer Preview env for staging; Production for live.\n- Do not commit \\`.vercel\\` or production secrets.\n`;\n\nexport const vercelInstaller: Installer = {\n id: \"vercel\",\n active: (o) => o.deploy === \"vercel\",\n async run({ projectDir }) {\n await fs.writeFile(\n path.join(projectDir, \"vercel.json\"),\n VERCEL_JSON,\n \"utf8\",\n );\n await fs.writeFile(\n path.join(projectDir, \".cursor\", \"rules\", \"vercel.mdc\"),\n RULE,\n \"utf8\",\n );\n await fs.outputFile(\n path.join(projectDir, \"docs\", \"style-guide\", \"ops\", \"vercel.md\"),\n `# Vercel\n\n- \\`vercel.json\\` — Next.js framework hint\n- Link the repo in the Vercel dashboard (or \\`npx vercel\\`)\n- Env: copy from \\`.env.production.example\\` into Project → Settings → Environment Variables\n`,\n );\n },\n};\n","import { apiEnvelopeInstaller } from \"./api-envelope.js\";\nimport { appProvidersInstaller } from \"./app-providers.js\";\nimport { authAuthjsInstaller } from \"./auth-authjs.js\";\nimport { authJwtInstaller } from \"./auth-jwt.js\";\nimport { ciInstaller } from \"./ci.js\";\nimport { darkModeInstaller } from \"./dark-mode.js\";\nimport { dockerComposeInstaller } from \"./docker-compose.js\";\nimport { dockerInstaller } from \"./docker.js\";\nimport { endpointsInstaller } from \"./endpoints.js\";\nimport { eslintInstaller } from \"./eslint.js\";\nimport { huskyInstaller } from \"./husky.js\";\nimport { i18nInstaller } from \"./i18n.js\";\nimport { iconsInstaller } from \"./icons.js\";\nimport { muiInstaller } from \"./mui.js\";\nimport { packageManagerInstaller } from \"./package-manager.js\";\nimport { prettierInstaller } from \"./prettier.js\";\nimport { seoInstaller } from \"./seo.js\";\nimport { shadcnInstaller } from \"./shadcn.js\";\nimport { storeInstaller } from \"./store.js\";\nimport { surfaceInstaller } from \"./surface.js\";\nimport { tailwindInstaller } from \"./tailwind.js\";\nimport { tanstackQueryInstaller } from \"./tanstack-query.js\";\nimport { testingInstaller } from \"./testing.js\";\nimport { validationInstaller } from \"./validation.js\";\nimport { vercelInstaller } from \"./vercel.js\";\nimport type { Installer, InstallerContext } from \"./types.js\";\n\nexport type { Installer, InstallerContext } from \"./types.js\";\n\nexport const installers: Installer[] = [\n packageManagerInstaller,\n iconsInstaller,\n storeInstaller,\n tanstackQueryInstaller,\n endpointsInstaller,\n apiEnvelopeInstaller,\n authJwtInstaller,\n authAuthjsInstaller,\n tailwindInstaller,\n darkModeInstaller,\n muiInstaller,\n shadcnInstaller,\n validationInstaller,\n seoInstaller,\n i18nInstaller,\n dockerComposeInstaller,\n testingInstaller,\n eslintInstaller,\n prettierInstaller,\n huskyInstaller,\n dockerInstaller,\n vercelInstaller,\n ciInstaller,\n appProvidersInstaller,\n surfaceInstaller,\n];\n\nexport type InstallerProgress = {\n id: string;\n index: number;\n total: number;\n};\n\nexport async function runInstallers(\n ctx: InstallerContext,\n onProgress?: (step: InstallerProgress) => void | Promise<void>,\n): Promise<string[]> {\n const active = installers.filter((installer) =>\n installer.active(ctx.options),\n );\n const ran: string[] = [];\n\n for (let i = 0; i < active.length; i += 1) {\n const installer = active[i]!;\n await onProgress?.({\n id: installer.id,\n index: i + 1,\n total: active.length,\n });\n await installer.run(ctx);\n ran.push(installer.id);\n }\n\n return ran;\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\n\nimport { TEMPLATE_DIR } from \"./constants.js\";\n\nconst TRACKED = [\n \"AGENTS.md\",\n \".cursor/rules/core.mdc\",\n \".cursor/rules/components.mdc\",\n \".cursor/rules/forms.mdc\",\n] as const;\n\nfunction rel(projectDir: string, file: string): string {\n return path.join(projectDir, file);\n}\n\nfunction templatePath(file: string): string {\n return path.join(TEMPLATE_DIR, file);\n}\n\n/**\n * Diff (and optionally apply) core agent surface files from the CLI template\n * into an existing generated app.\n */\nexport async function runUpgrade(options: {\n projectDir: string;\n apply: boolean;\n}): Promise<void> {\n const { projectDir, apply } = options;\n\n if (!(await fs.pathExists(path.join(projectDir, \"package.json\")))) {\n throw new Error(`Not an app directory (missing package.json): ${projectDir}`);\n }\n if (!(await fs.pathExists(TEMPLATE_DIR))) {\n throw new Error(`Template missing at ${TEMPLATE_DIR}`);\n }\n\n p.intro(color.bgCyan(color.black(\" next-style-guide upgrade \")));\n p.log.info(\n apply\n ? `Applying template agent files → ${projectDir}`\n : `Diff only (pass --apply to write). Target: ${projectDir}`,\n );\n\n let changed = 0;\n let missing = 0;\n let same = 0;\n\n for (const file of TRACKED) {\n const from = templatePath(file);\n const to = rel(projectDir, file);\n if (!(await fs.pathExists(from))) {\n p.log.warn(`Template missing ${file}`);\n continue;\n }\n\n const next = await fs.readFile(from, \"utf8\");\n // Preserve project name token already replaced in AGENTS.md\n let outgoing = next;\n if (file === \"AGENTS.md\" && (await fs.pathExists(to))) {\n const current = await fs.readFile(to, \"utf8\");\n const nameMatch = current.match(/^# Agents \\((.+)\\)$/m);\n if (nameMatch?.[1]) {\n outgoing = outgoing.replace(\"__PROJECT_NAME__\", nameMatch[1]);\n }\n const pmMatch = current.match(/· ([a-z]+)(\\.|$)/m);\n // Keep existing package manager word if present in Stack line\n if (current.includes(\"pnpm\") || current.includes(\"npm\") || current.includes(\"yarn\")) {\n const stackPm = current.match(/· (pnpm|npm|yarn)\\./);\n if (stackPm?.[1]) {\n outgoing = outgoing.replace(\"__PACKAGE_MANAGER__\", stackPm[1]);\n }\n }\n }\n outgoing = outgoing\n .replaceAll(\"__PROJECT_NAME__\", path.basename(projectDir))\n .replaceAll(\"__PACKAGE_MANAGER__\", \"pnpm\")\n .replaceAll(\"__PROJECT_SLUG__\", path.basename(projectDir));\n\n if (!(await fs.pathExists(to))) {\n missing += 1;\n p.log.warn(`missing ${file}`);\n if (apply) {\n await fs.ensureDir(path.dirname(to));\n await fs.writeFile(to, outgoing, \"utf8\");\n p.log.success(`wrote ${file}`);\n }\n continue;\n }\n\n const current = await fs.readFile(to, \"utf8\");\n if (current === outgoing) {\n same += 1;\n p.log.step(color.dim(`same ${file}`));\n continue;\n }\n\n changed += 1;\n p.log.warn(`differs ${file}`);\n if (apply) {\n await fs.writeFile(to, outgoing, \"utf8\");\n p.log.success(`updated ${file}`);\n }\n }\n\n p.note(\n [\n `same=${same} differs=${changed} missing=${missing}`,\n apply\n ? \"Applied template agent surface.\"\n : \"Re-run with --apply to write differs/missing files.\",\n \"Feature rules (.cursor/rules/* beyond core/components/forms) are not overwritten — re-scaffold options or copy manually.\",\n ].join(\"\\n\"),\n \"Summary\",\n );\n p.outro(color.green(apply ? \"Upgrade applied.\" : \"Diff complete.\"));\n}\n"],"mappings":"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","names":["p","color","path","path","path","fs","path","p","color","fs","path","fs","path","fs","path","fs","path","fs","path","RULE","fs","path","fs","path","RULE","fs","path","path","fs","fs","path","RULE","path","fs","fs","path","RULE","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","RULE","fs","path","fs","path","RULE","path","fs","fs","path","THEME_PROVIDER","RULE","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","RULE","fs","path","path","fs","fs","path","path","fs","fs","path","text","fs","path","fs","path","RULE","fs","path","fs","path","RULE","path","fs","fs","path","fs","path","fs","path","path","fs","fs","path","RULE","path","fs","color","fs","path","p","color","path","fs","color","current","projectDir","path","color"]}
|