create-next-pro-cli 0.1.30 → 0.1.32

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.
Files changed (29) hide show
  1. package/README.md +16 -6
  2. package/create-next-pro-completion.sh +4 -3
  3. package/create-next-pro-completion.zsh +3 -3
  4. package/dist/bin.bun.js +514 -118
  5. package/dist/bin.node.js +579 -135
  6. package/dist/bin.node.js.map +1 -1
  7. package/package.json +6 -5
  8. package/templates/Page/page-ui.tsx +2 -2
  9. package/templates/Page/page-ui.user.tsx +17 -0
  10. package/templates/Projects/default/.agents/skills/create-next-pro-addapi/SKILL.md +61 -0
  11. package/templates/Projects/default/.agents/skills/create-next-pro-addcomponent/SKILL.md +67 -0
  12. package/templates/Projects/default/.agents/skills/create-next-pro-addlanguage/SKILL.md +68 -0
  13. package/templates/Projects/default/.agents/skills/create-next-pro-addlib/SKILL.md +65 -0
  14. package/templates/Projects/default/.agents/skills/create-next-pro-addpage/SKILL.md +89 -0
  15. package/templates/Projects/default/.agents/skills/create-next-pro-addtext/SKILL.md +63 -0
  16. package/templates/Projects/default/.agents/skills/create-next-pro-create-project/SKILL.md +76 -0
  17. package/templates/Projects/default/.agents/skills/create-next-pro-rmpage/SKILL.md +67 -0
  18. package/templates/Projects/default/.github/workflows/quality.yml +2 -1
  19. package/templates/Projects/default/AGENTS.md +91 -0
  20. package/templates/Projects/default/README.md +29 -9
  21. package/templates/Projects/default/bun.lock +114 -106
  22. package/templates/Projects/default/package.json +7 -5
  23. package/templates/Projects/default/pnpm-workspace.yaml +2 -1
  24. package/templates/Projects/default/scripts/audit-policy.ts +376 -0
  25. package/templates/Projects/default/scripts/audit.ts +72 -3
  26. package/templates/Projects/default/scripts/package-manager.ts +37 -0
  27. package/templates/Projects/default/tests/consumer/validate-template.ts +2 -0
  28. package/templates/Projects/default/tests/unit/audit-policy.test.ts +152 -0
  29. package/templates/Projects/default/tests/unit/template-baseline.test.ts +9 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/cli/completion.ts","../src/core/page-catalog.ts","../src/cli/onboarding.ts","../src/core/operations.ts","../src/core/contracts.ts","../src/cli/output.ts","../src/lib/addApi.ts","../src/lib/utils.ts","../src/core/project-paths.ts","../src/lib/addComponent.ts","../src/lib/addLanguage.ts","../src/lib/addLib.ts","../src/lib/addPage.ts","../src/lib/addText.ts","../src/lib/rmPage.ts","../src/cli/registry.ts","../src/scaffold.ts","../src/core/template-manifest.ts","../src/lib/createProject.ts","../src/lib/createProjectWithPrompt.ts","../src/runtime/node-context.ts","../bin.node.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport { completionCandidates } from \"./cli/completion\";\nimport { configDirectory, onboarding, readConfig } from \"./cli/onboarding\";\nimport { renderResult } from \"./cli/output\";\nimport { createCommandRegistry } from \"./cli/registry\";\nimport {\n CliError,\n type CliContext,\n type CommandResult,\n type ExitCode,\n} from \"./core/contracts\";\nimport { commandResult, failedResult } from \"./core/operations\";\nimport { createProject } from \"./lib/createProject\";\nimport { createProjectWithPrompt } from \"./lib/createProjectWithPrompt\";\nimport { createNodeContext } from \"./runtime/node-context\";\n\nexport const HELP_TEXT = `create-next-pro\n\nUsage:\n create-next-pro <project-name> [--force] [--json]\n create-next-pro addpage [options] [--json]\n create-next-pro addcomponent [options] [--json]\n create-next-pro addlib [name] [--json]\n create-next-pro addapi [name] [--json]\n create-next-pro addlanguage [locale] [--json]\n create-next-pro addtext <path> [text] [--json]\n create-next-pro rmpage [options] [--json]\n\nOptions:\n --help Show this help message\n --version Show the CLI version\n --json Emit one deterministic JSON document\n --reconfigure Run the configuration assistant again\n`;\n\nexport function parseOptions(args: string[]) {\n return {\n force: args.includes(\"--force\"),\n help: args.includes(\"--help\"),\n version: args.includes(\"--version\") || args.includes(\"-v\"),\n reconfigure: args.includes(\"--reconfigure\"),\n json: args.includes(\"--json\"),\n };\n}\n\nfunction withoutGlobalOptions(args: string[]): string[] {\n return args.filter((argument) => argument !== \"--json\");\n}\n\nasync function packageVersion(context: CliContext): Promise<string> {\n const packageJson = JSON.parse(\n await context.fs.readText(path.join(context.packageRoot, \"package.json\")),\n ) as { version: string };\n return packageJson.version;\n}\n\nfunction interactiveInputError(message: string, hint: string): never {\n throw new CliError(message, {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint,\n });\n}\n\nexport async function executeCli(context: CliContext): Promise<CommandResult> {\n const options = parseOptions(context.argv);\n context.outputMode = options.json ? \"json\" : \"human\";\n const args = withoutGlobalOptions(context.argv);\n const version = await packageVersion(context);\n\n if (options.help) {\n return commandResult(context, {\n command: \"help\",\n summary: \"Displayed create-next-pro help.\",\n projectRoot: context.cwd,\n status: \"success\",\n data: { help: HELP_TEXT },\n });\n }\n if (options.version) {\n return commandResult(context, {\n command: \"version\",\n summary: `create-next-pro version ${version}.`,\n projectRoot: context.cwd,\n status: \"success\",\n data: { version },\n });\n }\n\n const config = await readConfig(context);\n if (options.reconfigure) {\n if (options.json) {\n interactiveInputError(\n \"Reconfiguration is interactive and unavailable in JSON mode.\",\n \"Run create-next-pro --reconfigure without --json.\",\n );\n }\n return onboarding(context, version);\n }\n if (!config) {\n if (options.json) {\n throw new CliError(\"Initial configuration is required.\", {\n code: \"ONBOARDING_REQUIRED\",\n scope: \"config\",\n path: \"config.json\",\n hint: \"Run create-next-pro once without --json, then rerun the command.\",\n });\n }\n return onboarding(context, version);\n }\n\n const command = args[0];\n const handler = command ? createCommandRegistry().get(command) : undefined;\n if (handler) return handler(args, context);\n\n const nameArg = args.find(\n (argument) => !argument.startsWith(\"--\") && argument !== \"-v\",\n );\n if (nameArg) return createProject(nameArg, options.force, context);\n if (options.json) {\n interactiveInputError(\n \"A project name is required in JSON mode.\",\n \"Pass the project name as a positional argument.\",\n );\n }\n return createProjectWithPrompt(context);\n}\n\nasync function runCompletion(\n context: CliContext,\n args: string[],\n): Promise<ExitCode> {\n try {\n for (const candidate of await completionCandidates(args[1], context)) {\n context.terminal.log(candidate);\n }\n return 0;\n } catch {\n return 1;\n }\n}\n\nexport async function main(\n context: CliContext = createNodeContext(),\n): Promise<ExitCode> {\n const completionArgs = withoutGlobalOptions(context.argv);\n if (completionArgs[0] === \"__complete\") {\n return runCompletion(context, completionArgs);\n }\n\n context.operations.reset();\n context.outputMode = parseOptions(context.argv).json ? \"json\" : \"human\";\n let result: CommandResult;\n try {\n result = await executeCli(context);\n } catch (error) {\n const command = completionArgs[0] ?? \"create\";\n result = failedResult(context, command, error, {\n projectRoot: context.cwd,\n configRoot: configDirectory(context),\n homeRoot: context.homeDir,\n });\n }\n renderResult(result, context, context.outputMode);\n return result.exitCode;\n}\n","import path from \"node:path\";\n\nimport type { CliContext } from \"../core/contracts\";\nimport { discoverPages } from \"../core/page-catalog\";\n\nexport const PUBLIC_COMMANDS = [\n \"addpage\",\n \"addcomponent\",\n \"addlib\",\n \"addapi\",\n \"addlanguage\",\n \"addtext\",\n \"rmpage\",\n \"--help\",\n \"--version\",\n \"--json\",\n \"--reconfigure\",\n] as const;\n\nconst OPTIONS: Record<string, string[]> = {\n addpage: [\n \"--layout\",\n \"--page\",\n \"--loading\",\n \"--not-found\",\n \"--error\",\n \"--global-error\",\n \"--route\",\n \"--template\",\n \"--default\",\n ],\n addcomponent: [\"--page\", \"-P\"],\n};\n\nasync function directories(\n root: string,\n context: CliContext,\n): Promise<string[]> {\n try {\n return (await context.fs.list(root))\n .filter((entry) => entry.isDirectory && !entry.name.startsWith(\"_\"))\n .map((entry) => entry.name)\n .sort();\n } catch {\n return [];\n }\n}\n\nexport async function completionCandidates(\n command: string | undefined,\n context: CliContext,\n): Promise<string[]> {\n if (!command) return [...PUBLIC_COMMANDS];\n if (command === \"rmpage\") {\n return (await discoverPages(context.cwd, context.fs)).map(\n (candidate) => candidate.logicalName,\n );\n }\n if (command === \"addcomponent\" || command === \"addpage\") {\n return [\n ...(OPTIONS[command] ?? []),\n ...(await directories(path.join(context.cwd, \"src\", \"ui\"), context)),\n ];\n }\n if (command === \"addlanguage\")\n return [\"de\", \"en\", \"es\", \"fr\", \"it\", \"ja\", \"pt\"];\n return OPTIONS[command] ?? [];\n}\n\nexport async function printCompletions(\n args: string[],\n context: CliContext,\n): Promise<void> {\n for (const candidate of await completionCandidates(args[1], context)) {\n context.terminal.log(candidate);\n }\n}\n","import path from \"node:path\";\nimport type { CliFileSystem } from \"./contracts\";\n\nexport type PageCandidate = {\n logicalName: string;\n routeSegments: string[];\n routeDirectory: string;\n uiDirectory: string;\n messageFile: string;\n messageKey?: string;\n};\n\nfunction isRouteGroup(segment: string): boolean {\n return segment.startsWith(\"(\") && segment.endsWith(\")\");\n}\n\nexport async function discoverPages(\n projectRoot: string,\n fs: CliFileSystem,\n): Promise<PageCandidate[]> {\n const appRoot = path.join(projectRoot, \"src\", \"app\", \"[locale]\");\n const candidates: PageCandidate[] = [];\n\n async function visit(directory: string, relative: string[] = []) {\n let entries;\n try {\n entries = await fs.list(directory);\n } catch {\n return;\n }\n if (entries.some((entry) => entry.isFile && entry.name === \"page.tsx\")) {\n const routeSegments = relative.filter(\n (segment) => !isRouteGroup(segment),\n );\n if (\n routeSegments.length > 0 &&\n !routeSegments.some(\n (segment) => segment.startsWith(\"_\") || segment.startsWith(\"[\"),\n )\n ) {\n const logicalName = routeSegments.join(\".\");\n candidates.push({\n logicalName,\n routeSegments,\n routeDirectory: directory,\n uiDirectory: path.join(projectRoot, \"src\", \"ui\", ...routeSegments),\n messageFile: path.join(\n projectRoot,\n \"messages\",\n \"{locale}\",\n `${routeSegments[0]}.json`,\n ),\n messageKey:\n routeSegments.length > 1 ? routeSegments.at(-1) : undefined,\n });\n }\n }\n for (const entry of entries) {\n if (entry.isDirectory && !entry.name.startsWith(\".\")) {\n await visit(path.join(directory, entry.name), [\n ...relative,\n entry.name,\n ]);\n }\n }\n }\n\n await visit(appRoot);\n return candidates.sort((left, right) =>\n left.logicalName.localeCompare(right.logicalName),\n );\n}\n","import path from \"node:path\";\n\nimport type { CliContext, CommandResult } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\n\nexport type UserConfig = {\n version: 1;\n shell: \"bash\" | \"zsh\";\n completionInstalled: boolean;\n createdAt: string;\n updatedAt: string;\n};\n\nexport function configDirectory(context: CliContext): string {\n return context.env.XDG_CONFIG_HOME\n ? path.join(context.env.XDG_CONFIG_HOME, \"create-next-pro\")\n : path.join(context.homeDir, \".config\", \"create-next-pro\");\n}\n\nexport function configFile(context: CliContext): string {\n return path.join(configDirectory(context), \"config.json\");\n}\n\nexport async function readConfig(\n context: CliContext,\n): Promise<UserConfig | null> {\n try {\n const config = JSON.parse(\n await context.fs.readText(configFile(context)),\n ) as UserConfig;\n if (\n config.version !== 1 ||\n (config.shell !== \"bash\" && config.shell !== \"zsh\") ||\n typeof config.completionInstalled !== \"boolean\" ||\n typeof config.createdAt !== \"string\" ||\n typeof config.updatedAt !== \"string\"\n ) {\n return null;\n }\n return config;\n } catch {\n return null;\n }\n}\n\nasync function ensureLineInRc(\n context: CliContext,\n target: string,\n line: string,\n): Promise<\"created\" | \"updated\" | \"unchanged\"> {\n const current = context.fs.exists(target)\n ? await context.fs.readText(target)\n : \"\";\n const gateway = new MutationGateway(context, context.homeDir, \"home\");\n return gateway.write(\n target,\n current.includes(line) ? current : `${current}\\n${line}\\n`,\n { role: \"shell-profile\", resource: \"shell-profile\" },\n );\n}\n\nasync function installCompletion(\n context: CliContext,\n shell: UserConfig[\"shell\"],\n): Promise<void> {\n const directory = configDirectory(context);\n const source = path.join(\n context.packageRoot,\n shell === \"zsh\"\n ? \"create-next-pro-completion.zsh\"\n : \"create-next-pro-completion.sh\",\n );\n const target = path.join(\n directory,\n `completion.${shell === \"zsh\" ? \"zsh\" : \"sh\"}`,\n );\n const gateway = new MutationGateway(context, directory, \"config\");\n await gateway.write(target, await context.fs.readText(source), {\n role: \"completion-script\",\n source: { scope: \"package\", path: path.basename(source) },\n });\n const rcFile = path.join(\n context.homeDir,\n shell === \"zsh\" ? \".zshrc\" : \".bashrc\",\n );\n await ensureLineInRc(context, rcFile, `source \"${target}\"`);\n}\n\nexport async function onboarding(\n context: CliContext,\n version: string,\n): Promise<CommandResult> {\n const response = await context.prompt<\"shell\" | \"completion\">(\n [\n {\n type: \"select\",\n name: \"shell\",\n message: \"Which shell do you use?\",\n choices: [\n { title: \"zsh\", value: \"zsh\" },\n { title: \"bash\", value: \"bash\" },\n ],\n initial: context.env.SHELL?.includes(\"zsh\") ? 0 : 1,\n },\n {\n type: \"toggle\",\n name: \"completion\",\n message: \"Install autocompletion?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n ],\n { onCancel: () => false },\n );\n\n if (response.shell !== \"bash\" && response.shell !== \"zsh\") {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"onboarding\",\n scope: \"config\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"onboarding\",\n summary: \"Configuration was cancelled.\",\n configRoot: configDirectory(context),\n homeRoot: context.homeDir,\n status: \"cancelled\",\n });\n }\n\n const previous = await readConfig(context);\n const now = new Date().toISOString();\n const config: UserConfig = {\n version: 1,\n shell: response.shell,\n completionInstalled: Boolean(response.completion),\n createdAt: previous?.createdAt ?? now,\n updatedAt: now,\n };\n if (config.completionInstalled) {\n try {\n await installCompletion(context, config.shell);\n } catch (error) {\n context.operations.record({\n action: \"skipped\",\n resource: \"file\",\n role: \"completion-installation\",\n scope: \"config\",\n path: `completion.${config.shell === \"zsh\" ? \"zsh\" : \"sh\"}`,\n detail: {\n reason: error instanceof Error ? error.message : String(error),\n },\n });\n config.completionInstalled = false;\n }\n }\n\n const semanticallyUnchanged =\n previous?.shell === config.shell &&\n previous.completionInstalled === config.completionInstalled;\n if (semanticallyUnchanged && previous) config.updatedAt = previous.updatedAt;\n\n const gateway = new MutationGateway(\n context,\n configDirectory(context),\n \"config\",\n );\n await gateway.write(\n configFile(context),\n `${JSON.stringify(config, null, 2)}\\n`,\n { role: \"user-configuration\", resource: \"configuration\" },\n );\n\n return commandResult(context, {\n command: \"onboarding\",\n summary: `Configuration for create-next-pro v${version} is ready.`,\n configRoot: configDirectory(context),\n homeRoot: context.homeDir,\n nextSteps: [\n {\n kind: \"rerun\",\n required: true,\n message: \"Run the original create-next-pro command again.\",\n paths: [],\n },\n ],\n });\n}\n","import path from \"node:path\";\n\nimport type {\n CliContext,\n CommandError,\n CommandResult,\n CommandStatus,\n NextStep,\n OperationEvent,\n OperationRecorder,\n ResourceScope,\n ResourceType,\n} from \"./contracts\";\nimport { CliError } from \"./contracts\";\n\nexport class OperationJournal implements OperationRecorder {\n readonly #events: OperationEvent[] = [];\n\n record(event: Omit<OperationEvent, \"sequence\">): OperationEvent {\n const detail = event.detail\n ? Object.fromEntries(\n Object.entries(event.detail).map(([key, value]) => [\n key,\n /(content|credential|env|password|secret|token|value)/i.test(key)\n ? \"[REDACTED]\"\n : value,\n ]),\n )\n : undefined;\n const recorded = {\n ...event,\n detail,\n sequence: this.#events.length + 1,\n };\n this.#events.push(recorded);\n return recorded;\n }\n\n snapshot(): OperationEvent[] {\n return this.#events.map((event) => ({ ...event }));\n }\n\n reset(): void {\n this.#events.length = 0;\n }\n}\n\nconst MUTATIONS = new Set([\"created\", \"copied\", \"updated\", \"deleted\"]);\n\nexport function statusFromEvents(events: OperationEvent[]): CommandStatus {\n if (events.some((event) => event.action === \"cancelled\")) return \"cancelled\";\n return events.some((event) => MUTATIONS.has(event.action))\n ? \"success\"\n : \"unchanged\";\n}\n\nexport function commandResult(\n context: CliContext,\n input: {\n command: string;\n summary: string;\n projectRoot?: string;\n configRoot?: string;\n homeRoot?: string;\n nextSteps?: NextStep[];\n data?: Record<string, unknown>;\n status?: CommandStatus;\n },\n): CommandResult {\n const events = context.operations.snapshot();\n const status = input.status ?? statusFromEvents(events);\n return {\n exitCode: status === \"failed\" ? 1 : 0,\n status,\n command: input.command,\n summary: input.summary,\n projectRoot: input.projectRoot,\n configRoot: input.configRoot,\n homeRoot: input.homeRoot,\n events,\n nextSteps: input.nextSteps ?? [],\n error: null,\n data: input.data,\n };\n}\n\nexport function failedResult(\n context: CliContext,\n command: string,\n error: unknown,\n roots: {\n projectRoot?: string;\n configRoot?: string;\n homeRoot?: string;\n } = {},\n): CommandResult {\n const cliError = error instanceof CliError ? error : undefined;\n const normalized: CommandError = {\n code: cliError?.code ?? \"FILESYSTEM_ERROR\",\n message: error instanceof Error ? error.message : String(error),\n hint: cliError?.hint,\n scope: cliError?.scope,\n path: cliError?.path,\n };\n const nextSteps: NextStep[] =\n normalized.code === \"ONBOARDING_REQUIRED\"\n ? [\n {\n kind: \"rerun\",\n required: true,\n message:\n \"Run create-next-pro once in human mode, then rerun the JSON command.\",\n paths: [{ scope: \"config\", path: \"config.json\" }],\n commands: [\"create-next-pro\"],\n },\n ]\n : [];\n context.operations.record({\n action: \"failed\",\n resource: \"command\",\n role: command,\n scope: normalized.scope ?? \"project\",\n path: normalized.path ?? \".\",\n detail: { code: normalized.code },\n });\n return {\n exitCode: cliError?.exitCode ?? 1,\n status: \"failed\",\n command,\n summary: normalized.message,\n ...roots,\n events: context.operations.snapshot(),\n nextSteps,\n error: normalized,\n };\n}\n\nexport function relativeResource(root: string, target: string): string {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative || \".\";\n}\n\ntype MutationMetadata = {\n role: string;\n resource?: ResourceType;\n scope?: ResourceScope;\n source?: OperationEvent[\"source\"];\n detail?: OperationEvent[\"detail\"];\n};\n\nexport class MutationGateway {\n constructor(\n private readonly context: CliContext,\n private readonly root: string,\n private readonly defaultScope: ResourceScope = \"project\",\n ) {}\n\n path(target: string): string {\n return relativeResource(this.root, target);\n }\n\n async mkdir(\n target: string,\n metadata: MutationMetadata,\n record = true,\n ): Promise<\"created\" | \"unchanged\"> {\n if (this.context.fs.exists(target)) {\n if (record) this.record(\"unchanged\", target, metadata);\n return \"unchanged\";\n }\n await this.context.fs.mkdir(target);\n if (record) this.record(\"created\", target, metadata);\n return \"created\";\n }\n\n async write(\n target: string,\n content: string,\n metadata: MutationMetadata & { preserveExisting?: boolean },\n ): Promise<\"created\" | \"updated\" | \"unchanged\"> {\n const exists = this.context.fs.exists(target);\n if (exists && metadata.preserveExisting) {\n this.record(\"unchanged\", target, metadata);\n return \"unchanged\";\n }\n if (exists && (await this.context.fs.readText(target)) === content) {\n this.record(\"unchanged\", target, metadata);\n return \"unchanged\";\n }\n await this.context.fs.mkdir(path.dirname(target));\n await this.context.fs.writeText(target, content);\n const action = exists ? \"updated\" : \"created\";\n this.record(action, target, metadata);\n return action;\n }\n\n async copy(\n source: string,\n target: string,\n metadata: MutationMetadata & { preserveExisting?: boolean },\n ): Promise<\"copied\" | \"unchanged\"> {\n if (this.context.fs.exists(target) && metadata.preserveExisting) {\n this.record(\"unchanged\", target, metadata);\n return \"unchanged\";\n }\n await this.context.fs.mkdir(path.dirname(target));\n await this.context.fs.copyFile(source, target);\n this.record(\"copied\", target, {\n ...metadata,\n source: metadata.source ?? { path: source },\n });\n return \"copied\";\n }\n\n async remove(\n target: string,\n metadata: MutationMetadata,\n options: { recursive?: boolean; force?: boolean } = {},\n ): Promise<\"deleted\" | \"unchanged\"> {\n if (!this.context.fs.exists(target)) {\n this.record(\"unchanged\", target, metadata);\n return \"unchanged\";\n }\n await this.context.fs.remove(target, options);\n this.record(\"deleted\", target, metadata);\n return \"deleted\";\n }\n\n unchanged(target: string, metadata: MutationMetadata): void {\n this.record(\"unchanged\", target, metadata);\n }\n\n skipped(target: string, metadata: MutationMetadata): void {\n this.record(\"skipped\", target, metadata);\n }\n\n private record(\n action: OperationEvent[\"action\"],\n target: string,\n metadata: MutationMetadata,\n ): void {\n this.context.operations.record({\n action,\n resource: metadata.resource ?? \"file\",\n role: metadata.role,\n scope: metadata.scope ?? this.defaultScope,\n path: this.path(target),\n source: metadata.source,\n detail: metadata.detail,\n });\n }\n}\n","export type ExitCode = 0 | 1;\n\nexport type CommandStatus = \"success\" | \"unchanged\" | \"cancelled\" | \"failed\";\n\nexport type OperationAction =\n | \"created\"\n | \"copied\"\n | \"updated\"\n | \"deleted\"\n | \"unchanged\"\n | \"skipped\"\n | \"cancelled\"\n | \"failed\";\n\nexport type ResourceType =\n | \"file\"\n | \"directory\"\n | \"project\"\n | \"configuration\"\n | \"shell-profile\"\n | \"command\";\n\nexport type ResourceScope = \"project\" | \"config\" | \"home\" | \"package\";\n\nexport type ResourcePath = {\n scope: ResourceScope;\n path: string;\n};\n\nexport type OperationEvent = ResourcePath & {\n sequence: number;\n action: OperationAction;\n resource: ResourceType;\n role: string;\n source?: Partial<ResourcePath> & { template?: string };\n detail?: Record<string, string | number | boolean | null>;\n};\n\nexport type NextStep = {\n kind: \"translate\" | \"review\" | \"install\" | \"run-checks\" | \"run\" | \"rerun\";\n required: boolean;\n message: string;\n paths: ResourcePath[];\n commands?: string[];\n};\n\nexport type CommandError = Partial<ResourcePath> & {\n code: string;\n message: string;\n hint?: string;\n};\n\nexport type CommandResult = {\n exitCode: ExitCode;\n status: CommandStatus;\n command: string;\n summary: string;\n projectRoot?: string;\n configRoot?: string;\n homeRoot?: string;\n events: OperationEvent[];\n nextSteps: NextStep[];\n error: CommandError | null;\n data?: Record<string, unknown>;\n};\n\nexport type Terminal = {\n log: (...values: unknown[]) => void;\n warn: (...values: unknown[]) => void;\n error: (...values: unknown[]) => void;\n};\n\nexport type PromptQuestion<T extends string = string> = {\n type: unknown;\n name?: T;\n message?: string;\n [key: string]: unknown;\n};\n\nexport type PromptRunner = <T extends string = string>(\n questions: PromptQuestion<T> | PromptQuestion<T>[],\n options?: { onCancel?: () => boolean | void },\n) => Promise<Record<T, unknown>>;\n\nexport type CliFileSystem = {\n exists: (path: string) => boolean;\n readText: (path: string) => Promise<string>;\n writeText: (path: string, content: string) => Promise<void>;\n mkdir: (path: string) => Promise<void>;\n copyFile: (source: string, target: string) => Promise<void>;\n appendText: (path: string, content: string) => Promise<void>;\n remove: (\n path: string,\n options?: { recursive?: boolean; force?: boolean },\n ) => Promise<void>;\n inspect: (path: string) => Promise<DirectoryEntry | null>;\n list: (path: string) => Promise<DirectoryEntry[]>;\n};\n\nexport type DirectoryEntry = {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n};\n\nexport type OperationRecorder = {\n record: (event: Omit<OperationEvent, \"sequence\">) => OperationEvent;\n snapshot: () => OperationEvent[];\n reset: () => void;\n};\n\nexport type CliContext = {\n argv: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n homeDir: string;\n packageRoot: string;\n terminal: Terminal;\n prompt: PromptRunner;\n fs: CliFileSystem;\n operations: OperationRecorder;\n outputMode: \"human\" | \"json\";\n};\n\nexport type CommandHandler = (\n args: string[],\n context: CliContext,\n) => Promise<CommandResult>;\n\nexport type CliErrorOptions = Partial<ResourcePath> & {\n exitCode?: ExitCode;\n code?: string;\n hint?: string;\n};\n\nexport class CliError extends Error {\n readonly exitCode: ExitCode;\n readonly code: string;\n readonly hint?: string;\n readonly scope?: ResourceScope;\n readonly path?: string;\n\n constructor(message: string, options: ExitCode | CliErrorOptions = {}) {\n super(message);\n this.name = \"CliError\";\n if (typeof options === \"number\") {\n this.exitCode = options;\n this.code = \"FILESYSTEM_ERROR\";\n } else {\n this.exitCode = options.exitCode ?? 1;\n this.code = options.code ?? \"FILESYSTEM_ERROR\";\n this.hint = options.hint;\n this.scope = options.scope;\n this.path = options.path;\n }\n }\n}\n","import path from \"node:path\";\n\nimport type {\n CliContext,\n CommandResult,\n OperationEvent,\n ResourceScope,\n} from \"../core/contracts\";\n\nexport type OutputMode = \"human\" | \"json\";\n\nfunction rootFor(\n result: CommandResult,\n context: CliContext,\n scope: ResourceScope,\n): string | undefined {\n if (scope === \"project\") return result.projectRoot;\n if (scope === \"config\") return result.configRoot;\n if (scope === \"home\") return result.homeRoot;\n return context.packageRoot;\n}\n\nfunction displayPath(\n result: CommandResult,\n context: CliContext,\n scope: ResourceScope,\n target: string,\n): string {\n const root = rootFor(result, context, scope);\n return root ? path.resolve(root, target) : target;\n}\n\nfunction renderEvent(\n result: CommandResult,\n context: CliContext,\n event: OperationEvent,\n): string {\n const source = event.source?.template\n ? ` from template ${event.source.template}`\n : event.source?.path\n ? ` from ${displayPath(\n result,\n context,\n event.source.scope ?? event.scope,\n event.source.path,\n )}`\n : \"\";\n const detail = event.detail\n ? ` (${Object.entries(event.detail)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => `${key}=${JSON.stringify(value)}`)\n .join(\", \")})`\n : \"\";\n return `${event.action.toUpperCase()} ${event.role}: ${displayPath(\n result,\n context,\n event.scope,\n event.path,\n )}${source}${detail}`;\n}\n\nexport function renderResult(\n result: CommandResult,\n context: CliContext,\n mode: OutputMode,\n): void {\n if (mode === \"json\") {\n context.terminal.log(JSON.stringify({ schemaVersion: 1, ...result }));\n return;\n }\n\n if (result.command === \"help\" && typeof result.data?.help === \"string\") {\n context.terminal.log(result.data.help);\n return;\n }\n if (\n result.command === \"version\" &&\n typeof result.data?.version === \"string\"\n ) {\n context.terminal.log(`v${result.data.version}`);\n return;\n }\n\n const copiedTemplateFiles = result.events.filter(\n (event) => event.action === \"copied\" && event.role === \"template-file\",\n );\n if (copiedTemplateFiles.length > 0) {\n context.terminal.log(\n `COPIED ${copiedTemplateFiles.length} template files to ${result.projectRoot}.`,\n );\n }\n\n for (const event of result.events) {\n if (event.action === \"copied\" && event.role === \"template-file\") continue;\n const line = renderEvent(result, context, event);\n if (event.action === \"failed\") context.terminal.error(line);\n else if (event.action === \"skipped\") context.terminal.warn(line);\n else context.terminal.log(line);\n }\n\n if (result.error) {\n context.terminal.error(\n `ERROR [${result.error.code}]: ${result.error.message}`,\n );\n if (result.error.hint) context.terminal.error(`HINT: ${result.error.hint}`);\n } else if (result.status === \"success\") {\n context.terminal.log(`SUCCESS: ${result.summary}`);\n } else if (result.status === \"unchanged\") {\n context.terminal.log(`NO CHANGES: ${result.summary}`);\n } else if (result.status === \"cancelled\") {\n context.terminal.log(`CANCELLED: ${result.summary}`);\n }\n\n for (const step of result.nextSteps) {\n context.terminal.log(`NEXT [${step.kind}]: ${step.message}`);\n for (const target of step.paths) {\n context.terminal.log(\n ` ${displayPath(result, context, target.scope, target.path)}`,\n );\n }\n for (const command of step.commands ?? []) {\n context.terminal.log(` ${command}`);\n }\n }\n}\n","import { join } from \"node:path\";\n\nimport { loadConfig } from \"./utils\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\n\nexport const addApi: CommandHandler = async (args, context) => {\n let apiName = args[1];\n if (!apiName || apiName.startsWith(\"-\")) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"API route name is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass the API route name after addapi.\",\n });\n }\n const response = await context.prompt<\"apiName\">({\n type: \"text\",\n name: \"apiName\",\n message: \"API route name to add:\",\n validate: (name: string) => (name ? true : \"API route name is required\"),\n });\n apiName = String(response.apiName ?? \"\");\n if (!apiName) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"api-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"addapi\",\n summary: \"API route creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n }\n const apiSegments = parseLogicalName(apiName, \"API route name\");\n\n const config = await loadConfig(context);\n if (!config) {\n throw new CliError(\"Configuration file cnp.config.json was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n hint: \"Run this command from the generated project root.\",\n });\n }\n\n const apiDir = join(context.cwd, \"src\", \"app\", \"api\", ...apiSegments);\n await assertSafeTarget(context.cwd, apiDir, context.fs);\n const gateway = new MutationGateway(context, context.cwd);\n\n const templateDir = join(context.packageRoot, \"templates\", \"Api\");\n const routeTemplate = join(templateDir, \"route.ts\");\n const routePath = join(apiDir, \"route.ts\");\n if (!context.fs.exists(routeTemplate)) {\n throw new CliError(\"API template route.ts was not found.\", {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: \"templates/Api/route.ts\",\n });\n }\n\n await gateway.mkdir(apiDir, {\n role: \"api-directory\",\n resource: \"directory\",\n });\n const content = (await context.fs.readText(routeTemplate)).replace(\n /template/g,\n apiName,\n );\n const action = await gateway.write(routePath, content, {\n role: \"api-route\",\n preserveExisting: true,\n });\n\n return commandResult(context, {\n command: \"addapi\",\n summary:\n action === \"unchanged\"\n ? `API route \"${apiName}\" already exists and was preserved.`\n : `Added API route \"${apiName}\".`,\n projectRoot: context.cwd,\n nextSteps:\n action === \"unchanged\"\n ? []\n : [\n {\n kind: \"review\",\n required: true,\n message:\n \"Replace the example response and review validation and authentication.\",\n paths: [{ scope: \"project\", path: gateway.path(routePath) }],\n },\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ],\n });\n};\n","import { join } from \"node:path\";\nimport type { CliContext } from \"../core/contracts\";\n\n/**\n * Capitalize the first letter of a string.\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function toIdentifier(value: string): string {\n return value.replace(/[-_]+([A-Za-z0-9])/g, (_, character: string) =>\n character.toUpperCase(),\n );\n}\n\nexport interface CNPConfig {\n useI18n?: boolean;\n importAlias?: string;\n [key: string]: any;\n}\n\nexport function configuredAliasPrefix(config: CNPConfig): string {\n const alias = config.importAlias ?? \"@/*\";\n return alias.endsWith(\"/*\") ? alias.slice(0, -2) : \"@\";\n}\n\n/**\n * Load CLI configuration from the project root.\n * Returns null if the configuration file is missing or invalid.\n */\nexport async function loadConfig(\n context: Pick<CliContext, \"cwd\" | \"fs\">,\n): Promise<CNPConfig | null> {\n const configPath = join(context.cwd, \"cnp.config.json\");\n if (!context.fs.exists(configPath)) return null;\n try {\n const raw = await context.fs.readText(configPath);\n return JSON.parse(raw) as CNPConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Map a key to its corresponding file name for page/component templates.\n * @param key string\n * @returns file name string\n */\nexport function toFileName(key: string): string {\n switch (key) {\n case \"layout\":\n return \"layout.tsx\";\n case \"page\":\n return \"page.tsx\";\n case \"loading\":\n return \"loading.tsx\";\n case \"not-found\":\n return \"not-found.tsx\";\n case \"error\":\n return \"error.tsx\";\n case \"global-error\":\n return \"global-error.tsx\";\n case \"route\":\n return \"route.ts\";\n case \"template\":\n return \"template.tsx\";\n case \"default\":\n return \"default.tsx\";\n default:\n return `${key}.tsx`;\n }\n}\n","import path from \"node:path\";\n\nimport { CliError, type CliFileSystem } from \"./contracts\";\n\nconst SAFE_SEGMENT = /^[A-Za-z][A-Za-z0-9_-]*$/;\n\nfunction hasControlCharacters(value: string): boolean {\n return [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || code === 127;\n });\n}\n\nexport function parseLogicalName(value: string, label = \"name\"): string[] {\n if (!value || hasControlCharacters(value)) {\n throw new CliError(\n `Invalid ${label}: a non-empty printable value is required.`,\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n if (path.isAbsolute(value) || value.includes(\"/\") || value.includes(\"\\\\\")) {\n throw new CliError(\n `Invalid ${label}: paths and separators are not allowed.`,\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n const segments = value.split(\".\");\n if (segments.some((segment) => !SAFE_SEGMENT.test(segment))) {\n throw new CliError(\n `Invalid ${label}: use dot-separated alphanumeric segments beginning with a letter.`,\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n return segments;\n}\n\nexport function validateProjectName(value: string): string {\n if (\n !value ||\n hasControlCharacters(value) ||\n path.isAbsolute(value) ||\n value === \".\" ||\n value === \"..\" ||\n value.includes(\"/\") ||\n value.includes(\"\\\\\") ||\n !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)\n ) {\n throw new CliError(\n \"Invalid project name: use letters, numbers, dots, dashes or underscores without path separators.\",\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n return value;\n}\n\nexport function resolveInside(root: string, ...segments: string[]): string {\n const absoluteRoot = path.resolve(root);\n const target = path.resolve(absoluteRoot, ...segments);\n if (\n target !== absoluteRoot &&\n !target.startsWith(`${absoluteRoot}${path.sep}`)\n ) {\n throw new CliError(\n `Refusing to access a path outside the project: ${target}`,\n { code: \"UNSAFE_PATH\" },\n );\n }\n return target;\n}\n\nexport async function assertSafeTarget(\n root: string,\n target: string,\n fs: CliFileSystem,\n): Promise<string> {\n const safeTarget = resolveInside(root, path.relative(root, target));\n const relativeSegments = path\n .relative(path.resolve(root), safeTarget)\n .split(path.sep);\n let current = path.resolve(root);\n for (const segment of relativeSegments) {\n if (!segment) continue;\n current = path.join(current, segment);\n const entry = await fs.inspect(current);\n if (entry?.isSymbolicLink) {\n throw new CliError(\n `Symbolic links are forbidden in project paths: ${current}`,\n { code: \"UNSAFE_PATH\" },\n );\n }\n }\n return safeTarget;\n}\n\nexport function normalizeImportAlias(value: string): string {\n if (!/^[A-Za-z@~][A-Za-z0-9@~_-]*\\/\\*$/.test(value)) {\n throw new CliError(\n 'Invalid import alias: expected a prefix followed by \"/*\" (for example \"@/*\" or \"@core/*\").',\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n return value;\n}\n\nexport function importAliasPrefix(value = \"@/*\"): string {\n return normalizeImportAlias(value).slice(0, -2);\n}\n","import { join } from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport { capitalize, loadConfig, toIdentifier } from \"./utils\";\n\ntype PreparedMessages = {\n locale: string;\n target: string;\n content?: string;\n exists: boolean;\n};\n\nexport const addComponent: CommandHandler = async (args, context) => {\n let componentName = args[1];\n const pageIndex = args.findIndex(\n (argument) => argument === \"-P\" || argument === \"--page\",\n );\n const pageScope = pageIndex >= 0 ? args[pageIndex + 1] : undefined;\n if (pageIndex >= 0 && !pageScope) {\n throw new CliError(\"The --page option requires a page name.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n if (!componentName || componentName.startsWith(\"-\")) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"Component name is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass the component name after addcomponent.\",\n });\n }\n const response = await context.prompt<\"componentName\">({\n type: \"text\",\n name: \"componentName\",\n message: \"Component name to add:\",\n validate: (name: string) => (name ? true : \"Component name is required\"),\n });\n componentName = String(response.componentName ?? \"\");\n if (!componentName) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"component-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"addcomponent\",\n summary: \"Component creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n }\n const componentSegments = parseLogicalName(componentName, \"component name\");\n if (componentSegments.length !== 1) {\n throw new CliError(\"Component names must contain exactly one segment.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n const pageSegments = pageScope\n ? parseLogicalName(pageScope, \"page name\")\n : [];\n const config = await loadConfig(context);\n if (!config) {\n throw new CliError(\"Configuration file cnp.config.json was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n hint: \"Run this command from the generated project root.\",\n });\n }\n\n const componentNameUpper = capitalize(toIdentifier(componentName));\n const templateRoot = join(context.packageRoot, \"templates\", \"Component\");\n const componentTemplate = join(templateRoot, \"Component.tsx\");\n const messagesTemplate = join(templateRoot, \"component.json\");\n if (\n !context.fs.exists(componentTemplate) ||\n (config.useI18n && !context.fs.exists(messagesTemplate))\n ) {\n throw new CliError(\"Required component template files were not found.\", {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: \"templates/Component\",\n });\n }\n\n const targetDirectory = pageScope\n ? join(context.cwd, \"src\", \"ui\", ...pageSegments)\n : join(context.cwd, \"src\", \"ui\", \"_global\");\n await assertSafeTarget(context.cwd, targetDirectory, context.fs);\n const componentFile = join(targetDirectory, `${componentNameUpper}.tsx`);\n const translationNamespace = pageScope ?? \"_global_ui\";\n const componentContent = (await context.fs.readText(componentTemplate))\n .replace(/Component/g, componentNameUpper)\n .replace(/componentPage/g, translationNamespace);\n\n const preparedMessages: PreparedMessages[] = [];\n if (config.useI18n) {\n const messagesRoot = join(context.cwd, \"messages\");\n if (!context.fs.exists(messagesRoot)) {\n throw new CliError(\"The messages directory was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n const templateMessages = JSON.parse(\n await context.fs.readText(messagesTemplate),\n ) as Record<string, unknown>;\n const locales = (await context.fs.list(messagesRoot))\n .filter((entry) => entry.isDirectory)\n .map((entry) => entry.name)\n .sort();\n if (locales.length === 0) {\n throw new CliError(\"No locale directories were found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n for (const locale of locales) {\n const messageFile = pageScope ? pageSegments[0] : \"_global_ui\";\n const target = join(messagesRoot, locale, `${messageFile}.json`);\n let data: Record<string, unknown> = {};\n if (context.fs.exists(target)) {\n try {\n data = JSON.parse(await context.fs.readText(target)) as Record<\n string,\n unknown\n >;\n } catch {\n throw new CliError(\n `Invalid JSON in messages/${locale}/${messageFile}.json.`,\n {\n code: \"FILESYSTEM_ERROR\",\n scope: \"project\",\n path: `messages/${locale}/${messageFile}.json`,\n },\n );\n }\n }\n let container = data;\n if (pageSegments.length > 1) {\n const child = pageSegments[1];\n const current = data[child];\n if (\n current !== undefined &&\n (!current || typeof current !== \"object\" || Array.isArray(current))\n ) {\n throw new CliError(\n `Translation namespace ${pageScope} is not an object in ${locale}.`,\n {\n code: \"INVALID_ARGUMENT\",\n scope: \"project\",\n path: `messages/${locale}/${messageFile}.json`,\n },\n );\n }\n if (!current) data[child] = {};\n container = data[child] as Record<string, unknown>;\n }\n const exists = Object.hasOwn(container, componentNameUpper);\n if (!exists) container[componentNameUpper] = templateMessages;\n preparedMessages.push({\n locale,\n target,\n exists,\n content: exists ? undefined : `${JSON.stringify(data, null, 2)}\\n`,\n });\n }\n }\n\n const gateway = new MutationGateway(context, context.cwd);\n await gateway.mkdir(targetDirectory, {\n role: \"component-directory\",\n resource: \"directory\",\n });\n await gateway.write(componentFile, componentContent, {\n role: \"ui-component\",\n preserveExisting: true,\n });\n for (const item of preparedMessages) {\n if (item.exists) {\n gateway.unchanged(item.target, {\n role: \"translation-messages\",\n detail: {\n locale: item.locale,\n key: `${translationNamespace}.${componentNameUpper}`,\n },\n });\n } else {\n await gateway.write(item.target, item.content!, {\n role: \"translation-messages\",\n detail: {\n locale: item.locale,\n key: `${translationNamespace}.${componentNameUpper}`,\n },\n });\n }\n }\n\n const mutated = context.operations\n .snapshot()\n .some((event) => event.action === \"created\" || event.action === \"updated\");\n return commandResult(context, {\n command: \"addcomponent\",\n summary: mutated\n ? `Added component \"${componentNameUpper}\" ${pageScope ? `to page \"${pageScope}\"` : \"globally\"}.`\n : `Component \"${componentNameUpper}\" already exists and was preserved.`,\n projectRoot: context.cwd,\n nextSteps: mutated\n ? [\n {\n kind: \"review\",\n required: true,\n message:\n \"Review the generated component and its localized messages.\",\n paths: [\n { scope: \"project\", path: gateway.path(componentFile) },\n ...preparedMessages.map((item) => ({\n scope: \"project\" as const,\n path: gateway.path(item.target),\n })),\n ],\n },\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ]\n : [],\n });\n};\n","import { join } from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport { loadConfig } from \"./utils\";\n\nfunction generateLocales(): string[] {\n const names = new Intl.DisplayNames([\"en\"], { type: \"language\" });\n const locales: string[] = [];\n for (let first = 0; first < 26; first++) {\n for (let second = 0; second < 26; second++) {\n const code = String.fromCharCode(97 + first, 97 + second);\n try {\n const name = names.of(code);\n if (name && name.toLowerCase() !== code) locales.push(code);\n } catch {\n // Unknown ISO-like codes are not offered.\n }\n }\n }\n return locales.sort();\n}\n\nasync function listFiles(\n context: Parameters<CommandHandler>[1],\n root: string,\n): Promise<string[]> {\n const files: string[] = [];\n async function visit(directory: string, relative = \"\"): Promise<void> {\n for (const entry of await context.fs.list(directory)) {\n const next = relative ? `${relative}/${entry.name}` : entry.name;\n if (entry.isSymbolicLink) {\n throw new CliError(`Symbolic link found in locale source: ${next}`, {\n code: \"UNSAFE_PATH\",\n scope: \"project\",\n path: next,\n });\n }\n if (entry.isDirectory) await visit(join(directory, entry.name), next);\n else if (entry.isFile) files.push(next);\n }\n }\n await visit(root);\n return files.sort();\n}\n\nexport const addLanguage: CommandHandler = async (args, context) => {\n const config = await loadConfig(context);\n if (!config?.useI18n) {\n throw new CliError(\"Internationalization is not enabled in this project.\", {\n code: \"I18N_DISABLED\",\n });\n }\n const messagesRoot = join(context.cwd, \"messages\");\n if (!context.fs.exists(messagesRoot)) {\n throw new CliError(\"The messages directory was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n\n const available = generateLocales();\n let locale = args[1];\n if (!locale) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"Locale is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass a two-letter locale after addlanguage.\",\n });\n }\n const response = await context.prompt<\"locale\">({\n type: \"autocomplete\",\n name: \"locale\",\n message: \"Locale to add:\",\n choices: available.map((value) => ({ title: value, value })),\n });\n locale = String(response.locale ?? \"\");\n if (!locale) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"locale-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"addlanguage\",\n summary: \"Locale creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n }\n parseLogicalName(locale, \"locale\");\n if (!available.includes(locale)) {\n throw new CliError(`Unsupported locale code: ${locale}.`, {\n code: \"INVALID_ARGUMENT\",\n hint: \"Use a recognized two-letter language code.\",\n });\n }\n\n const routingFile = join(context.cwd, \"src\", \"lib\", \"i18n\", \"routing.ts\");\n const registryFile = join(context.cwd, \"src\", \"lib\", \"i18n\", \"messages.ts\");\n if (!context.fs.exists(routingFile) || !context.fs.exists(registryFile)) {\n throw new CliError(\n \"Required i18n routing or registry file was not found.\",\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"src/lib/i18n\",\n },\n );\n }\n\n const routing = await context.fs.readText(routingFile);\n const defaultLocale = routing.match(/defaultLocale:\\s*[\"']([^\"']+)[\"']/)?.[1];\n if (!defaultLocale) {\n throw new CliError(\n \"The default locale could not be resolved from routing.ts.\",\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"src/lib/i18n/routing.ts\",\n },\n );\n }\n const sourceDirectory = join(messagesRoot, defaultLocale);\n const sourceAggregator = join(messagesRoot, `${defaultLocale}.ts`);\n if (!context.fs.exists(sourceDirectory)) {\n throw new CliError(\n `Default locale directory ${defaultLocale} was not found.`,\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${defaultLocale}`,\n },\n );\n }\n if (!context.fs.exists(sourceAggregator)) {\n throw new CliError(\"Default locale aggregator not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${defaultLocale}.ts`,\n });\n }\n const sourceFiles = await listFiles(context, sourceDirectory);\n if (sourceFiles.length === 0) {\n throw new CliError(`Default locale ${defaultLocale} contains no files.`, {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${defaultLocale}`,\n });\n }\n const defaultAggregator = await context.fs.readText(sourceAggregator);\n const importPrefix = `./${defaultLocale}/`;\n if (!defaultAggregator.includes(importPrefix)) {\n throw new CliError(\n `Default aggregator does not import from ${importPrefix}.`,\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${defaultLocale}.ts`,\n },\n );\n }\n\n const localesMatch = routing.match(/locales:\\s*\\[([^\\]]*)\\]/);\n if (!localesMatch) {\n throw new CliError(\"Unable to locate routing locales.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"src/lib/i18n/routing.ts\",\n });\n }\n const routingLocales = localesMatch[1]\n .split(\",\")\n .map((value) => value.trim().replace(/[\"']/g, \"\"))\n .filter(Boolean);\n const registry = await context.fs.readText(registryFile);\n const registryMatch = registry.match(\n /const messages = \\{([^}]*)\\} as const;/,\n );\n if (!registryMatch) {\n throw new CliError(\"Unable to locate the typed messages registry.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"src/lib/i18n/messages.ts\",\n });\n }\n const registeredLocales = registryMatch[1]\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n\n const targetDirectory = join(messagesRoot, locale);\n const targetAggregator = join(messagesRoot, `${locale}.ts`);\n const targetAggregatorExists = context.fs.exists(targetAggregator);\n const targetAggregatorContent = targetAggregatorExists\n ? await context.fs.readText(targetAggregator)\n : \"\";\n const state = {\n directory: context.fs.exists(targetDirectory),\n aggregator: targetAggregatorExists,\n aggregatorImportsLocale: targetAggregatorContent.includes(`./${locale}/`),\n routing: routingLocales.includes(locale),\n registry: registeredLocales.includes(locale),\n registryImport: new RegExp(\n `import\\\\s+${locale}\\\\s+from\\\\s+[\"']\\\\.\\\\.\\\\/\\\\.\\\\.\\\\/\\\\.\\\\.\\\\/messages\\\\/${locale}[\"'];`,\n ).test(registry),\n };\n const present = Object.values(state).filter(Boolean).length;\n const gateway = new MutationGateway(context, context.cwd);\n const missingLocaleFiles = state.directory\n ? sourceFiles.filter(\n (relative) => !context.fs.exists(join(targetDirectory, relative)),\n )\n : sourceFiles;\n if (\n present === Object.keys(state).length &&\n missingLocaleFiles.length === 0\n ) {\n gateway.unchanged(targetDirectory, {\n role: \"locale-directory\",\n resource: \"directory\",\n });\n for (const relative of sourceFiles) {\n gateway.unchanged(join(targetDirectory, relative), {\n role: relative.endsWith(\".json\")\n ? \"translation-messages\"\n : \"locale-file\",\n detail: { locale, sourceLocale: defaultLocale },\n });\n }\n gateway.unchanged(targetAggregator, { role: \"locale-aggregator\" });\n gateway.unchanged(routingFile, { role: \"i18n-routing\" });\n gateway.unchanged(registryFile, { role: \"messages-registry\" });\n return commandResult(context, {\n command: \"addlanguage\",\n summary: `Locale \"${locale}\" is already fully configured.`,\n projectRoot: context.cwd,\n });\n }\n if (present > 0 || missingLocaleFiles.length < sourceFiles.length) {\n throw new CliError(`Locale ${locale} is only partially configured.`, {\n code: \"INCONSISTENT_LOCALE\",\n scope: \"project\",\n path: `messages/${locale}`,\n hint: `Observed state: ${JSON.stringify({ ...state, missingLocaleFiles })}.`,\n });\n }\n\n const nextAggregator = defaultAggregator.replaceAll(\n importPrefix,\n `./${locale}/`,\n );\n const nextRouting = routing.replace(\n /locales:\\s*\\[[^\\]]*\\]/,\n `locales: [${[...routingLocales, locale].map((value) => `\"${value}\"`).join(\", \")}]`,\n );\n const declarationIndex = registry.indexOf(\"const messages =\");\n const nextRegistry =\n registry.slice(0, declarationIndex) +\n `import ${locale} from \"../../../messages/${locale}\";\\n\\n` +\n registry\n .slice(declarationIndex)\n .replace(\n /const messages = \\{[^}]*\\} as const;/,\n `const messages = { ${[...registeredLocales, locale].join(\", \")} } as const;`,\n );\n\n await assertSafeTarget(context.cwd, targetDirectory, context.fs);\n await gateway.mkdir(targetDirectory, {\n role: \"locale-directory\",\n resource: \"directory\",\n detail: { locale, sourceLocale: defaultLocale },\n });\n for (const relative of sourceFiles) {\n const source = join(sourceDirectory, relative);\n const target = join(targetDirectory, relative);\n await gateway.copy(source, target, {\n role: relative.endsWith(\".json\") ? \"translation-messages\" : \"locale-file\",\n source: { scope: \"project\", path: gateway.path(source) },\n detail: { locale, sourceLocale: defaultLocale },\n });\n }\n await gateway.write(targetAggregator, nextAggregator, {\n role: \"locale-aggregator\",\n });\n await gateway.write(registryFile, nextRegistry, {\n role: \"messages-registry\",\n });\n await gateway.write(routingFile, nextRouting, { role: \"i18n-routing\" });\n\n const translationPaths = sourceFiles\n .filter((relative) => relative.endsWith(\".json\"))\n .map((relative) => ({\n scope: \"project\" as const,\n path: gateway.path(join(targetDirectory, relative)),\n }));\n return commandResult(context, {\n command: \"addlanguage\",\n summary: `Added locale \"${locale}\" by copying ${sourceFiles.length} files from \"${defaultLocale}\".`,\n projectRoot: context.cwd,\n nextSteps: [\n {\n kind: \"translate\",\n required: true,\n message: `Translate every copied message from ${defaultLocale} to ${locale}; the copied text is not ready for delivery.`,\n paths: translationPaths,\n },\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ],\n });\n};\n","import { join } from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport { capitalize, loadConfig, toIdentifier } from \"./utils\";\n\nexport const addLib: CommandHandler = async (args, context) => {\n let libArg = args[1];\n if (!libArg || libArg.startsWith(\"-\")) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"Library name is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass library or library.module after addlib.\",\n });\n }\n const response = await context.prompt<\"libArg\">({\n type: \"text\",\n name: \"libArg\",\n message: \"Library name to add:\",\n validate: (name: string) => (name ? true : \"Library name is required\"),\n });\n libArg = String(response.libArg ?? \"\");\n if (!libArg) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"library-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"addlib\",\n summary: \"Library creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n }\n const segments = parseLogicalName(libArg, \"library name\");\n if (segments.length > 2) {\n throw new CliError(\"Libraries support exactly library or library.module.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n const [libName, fileName] = segments;\n if (!(await loadConfig(context))) {\n throw new CliError(\"Configuration file cnp.config.json was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n hint: \"Run this command from the generated project root.\",\n });\n }\n\n const libDir = join(context.cwd, \"src\", \"lib\", libName);\n await assertSafeTarget(context.cwd, libDir, context.fs);\n const gateway = new MutationGateway(context, context.cwd);\n const templateDir = join(context.packageRoot, \"templates\", \"Lib\");\n const indexTemplate = join(templateDir, \"index.ts\");\n const itemTemplate = join(templateDir, \"item.ts\");\n if (\n !context.fs.exists(indexTemplate) ||\n (fileName && !context.fs.exists(itemTemplate))\n ) {\n throw new CliError(\"Required library template files were not found.\", {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: \"templates/Lib\",\n });\n }\n\n await gateway.mkdir(libDir, {\n role: \"library-directory\",\n resource: \"directory\",\n });\n const indexPath = join(libDir, \"index.ts\");\n if (!context.fs.exists(indexPath)) {\n await gateway.write(indexPath, await context.fs.readText(indexTemplate), {\n role: \"library-index\",\n });\n }\n\n let moduleAction: \"created\" | \"updated\" | \"unchanged\" | undefined;\n if (fileName) {\n const moduleIdentifier = toIdentifier(fileName);\n const modulePath = join(libDir, `${fileName}.ts`);\n const moduleContent = (await context.fs.readText(itemTemplate))\n .replace(/template/g, moduleIdentifier)\n .replace(/Template/g, capitalize(moduleIdentifier));\n moduleAction = await gateway.write(modulePath, moduleContent, {\n role: \"library-module\",\n preserveExisting: true,\n });\n\n const currentIndex = await context.fs.readText(indexPath);\n const importLine = `import { ${moduleIdentifier} } from \"./${fileName}\";`;\n const importRegex = new RegExp(\n `import\\\\s*{\\\\s*${moduleIdentifier}\\\\s*}\\\\s*from\\\\s*[\"']\\\\./${fileName}[\"'];`,\n );\n const exportRegex = /export\\s*{([^}]*)}/m;\n const imports = currentIndex\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"import\"));\n const exportMatch = currentIndex.match(exportRegex);\n const exportsSet = (exportMatch?.[1] ?? \"\")\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n if (!imports.some((line) => importRegex.test(line)))\n imports.push(importLine);\n if (!exportsSet.includes(moduleIdentifier))\n exportsSet.push(moduleIdentifier);\n const nextIndex = `${imports.join(\"\\n\")}\\n\\nexport { ${exportsSet.join(\", \")} };\\n`;\n await gateway.write(indexPath, nextIndex, { role: \"library-index\" });\n } else if (context.fs.exists(indexPath)) {\n gateway.unchanged(indexPath, { role: \"library-index\" });\n }\n\n const mutated = context.operations\n .snapshot()\n .some((event) =>\n [\"created\", \"updated\", \"copied\", \"deleted\"].includes(event.action),\n );\n const nextSteps = [];\n if (fileName && moduleAction !== \"unchanged\") {\n nextSteps.push({\n kind: \"review\" as const,\n required: true,\n message: \"Implement and review the generated library module.\",\n paths: [\n {\n scope: \"project\" as const,\n path: gateway.path(join(libDir, `${fileName}.ts`)),\n },\n ],\n });\n }\n if (mutated) {\n nextSteps.push({\n kind: \"run-checks\" as const,\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n });\n }\n return commandResult(context, {\n command: \"addlib\",\n summary: mutated\n ? `Added library \"${libName}\"${fileName ? ` with module \"${fileName}\"` : \"\"}.`\n : `Library \"${libName}\"${fileName ? ` and module \"${fileName}\"` : \"\"} already exist and were preserved.`,\n projectRoot: context.cwd,\n nextSteps,\n });\n};\n","import { join } from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport {\n capitalize,\n configuredAliasPrefix,\n loadConfig,\n toFileName,\n toIdentifier,\n} from \"./utils\";\n\nconst LONG_FLAGS = [\n \"layout\",\n \"page\",\n \"loading\",\n \"not-found\",\n \"error\",\n \"global-error\",\n \"route\",\n \"template\",\n \"default\",\n] as const;\n\nconst SHORT_FLAGS: Record<string, (typeof LONG_FLAGS)[number]> = {\n L: \"layout\",\n P: \"page\",\n l: \"loading\",\n n: \"not-found\",\n e: \"error\",\n g: \"global-error\",\n r: \"route\",\n t: \"template\",\n d: \"default\",\n};\n\nfunction registerMessagesFile(\n content: string,\n locale: string,\n fileName: string,\n): string {\n const importPath = `./${locale}/${fileName}.json`;\n if (content.includes(importPath)) return content;\n const declarationIndex = content.indexOf(\"const messages =\");\n const registryMatch = content.match(/const messages = \\{([\\s\\S]*?)\\n\\};/);\n if (declarationIndex < 0 || !registryMatch) {\n throw new CliError(\n `Unable to register ${fileName}.json in messages/${locale}.ts.`,\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${locale}.ts`,\n },\n );\n }\n const identifier = toIdentifier(fileName);\n const importStatement = `import ${identifier} from \"${importPath}\";\\n`;\n const nextRegistry = registryMatch[0].replace(\n /\\n\\};$/,\n `\\n ${identifier},\\n};`,\n );\n return (\n content.slice(0, declarationIndex) +\n importStatement +\n content.slice(declarationIndex).replace(registryMatch[0], nextRegistry)\n );\n}\n\nfunction selectedFlags(args: string[]): Set<string> {\n const selected = new Set<string>();\n const optionArguments = args\n .slice(2)\n .filter((argument) => argument.startsWith(\"-\"));\n if (optionArguments.length === 0)\n return new Set([\"layout\", \"page\", \"loading\"]);\n for (const argument of optionArguments) {\n if (argument.startsWith(\"--\")) {\n const flag = argument.slice(2);\n if (!(LONG_FLAGS as readonly string[]).includes(flag)) {\n throw new CliError(`Unknown addpage option: ${argument}.`, {\n code: \"INVALID_ARGUMENT\",\n });\n }\n selected.add(flag);\n continue;\n }\n for (const character of argument.slice(1)) {\n const flag = SHORT_FLAGS[character];\n if (!flag) {\n throw new CliError(`Unknown addpage short option: -${character}.`, {\n code: \"INVALID_ARGUMENT\",\n });\n }\n selected.add(flag);\n }\n }\n return selected;\n}\n\ntype PreparedLocale = {\n locale: string;\n target: string;\n targetContent?: string;\n messageExists: boolean;\n aggregator: string;\n aggregatorContent: string;\n};\n\nexport const addPage: CommandHandler = async (args, context) => {\n let logicalName = args[1];\n if (!logicalName || logicalName.startsWith(\"-\")) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"Page name is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass a simple or Parent.Child page name after addpage.\",\n });\n }\n const response = await context.prompt<\"pageName\">({\n type: \"text\",\n name: \"pageName\",\n message: \"Page name to add:\",\n validate: (name: string) => (name ? true : \"Page name is required\"),\n });\n logicalName = String(response.pageName ?? \"\");\n if (!logicalName) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"page-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"addpage\",\n summary: \"Page creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n }\n const pageSegments = parseLogicalName(logicalName, \"page name\");\n if (pageSegments.length > 2) {\n throw new CliError(\"Nested pages support exactly Parent.Child.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n const flags = selectedFlags(args);\n const config = await loadConfig(context);\n if (!config) {\n throw new CliError(\"Configuration file cnp.config.json was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n hint: \"Run this command from the generated project root.\",\n });\n }\n\n const useI18n = Boolean(config.useI18n);\n const aliasPrefix = configuredAliasPrefix(config);\n const appRoot = join(\n context.cwd,\n \"src\",\n \"app\",\n ...(useI18n ? [\"[locale]\"] : []),\n );\n if (!context.fs.exists(appRoot)) {\n throw new CliError(\"The expected App Router directory was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: useI18n ? \"src/app/[locale]\" : \"src/app\",\n });\n }\n\n const [parentName, childName] =\n pageSegments.length === 2 ? pageSegments : [undefined, undefined];\n const leafName = childName ?? pageSegments[0];\n const pageIdentifier = capitalize(toIdentifier(leafName));\n const jsonFileName = parentName ?? leafName;\n const uiDirectory = join(context.cwd, \"src\", \"ui\", ...pageSegments);\n const routeDirectory = join(appRoot, ...pageSegments);\n await assertSafeTarget(context.cwd, uiDirectory, context.fs);\n await assertSafeTarget(context.cwd, routeDirectory, context.fs);\n\n const templateRoot = join(context.packageRoot, \"templates\", \"Page\");\n const uiTemplate = join(templateRoot, \"page-ui.tsx\");\n const routeTemplates = [...flags].map((flag) => ({\n flag,\n source: join(templateRoot, toFileName(flag)),\n }));\n const messagesTemplate = join(templateRoot, \"page.json\");\n const requiredTemplates = [\n uiTemplate,\n ...routeTemplates.map((entry) => entry.source),\n ];\n if (useI18n) requiredTemplates.push(messagesTemplate);\n const missing = requiredTemplates.find(\n (target) => !context.fs.exists(target),\n );\n if (missing) {\n throw new CliError(`Required page template was not found: ${missing}.`, {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: missing.replace(`${context.packageRoot}/`, \"\"),\n });\n }\n\n const translationNamespace = parentName\n ? `${parentName}.${childName}`\n : leafName;\n const templateJson = useI18n\n ? JSON.parse(\n (await context.fs.readText(messagesTemplate))\n .replace(/template/g, leafName)\n .replace(/Template/g, capitalize(leafName)),\n )\n : undefined;\n const preparedLocales: PreparedLocale[] = [];\n if (useI18n) {\n const messagesRoot = join(context.cwd, \"messages\");\n if (!context.fs.exists(messagesRoot)) {\n throw new CliError(\"The messages directory was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n const locales = (await context.fs.list(messagesRoot))\n .filter((entry) => entry.isDirectory)\n .map((entry) => entry.name)\n .sort();\n if (locales.length === 0) {\n throw new CliError(\"No locale directories were found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n for (const locale of locales) {\n const target = join(messagesRoot, locale, `${jsonFileName}.json`);\n const aggregator = join(messagesRoot, `${locale}.ts`);\n if (!context.fs.exists(aggregator)) {\n throw new CliError(\n `Locale aggregator messages/${locale}.ts was not found.`,\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${locale}.ts`,\n },\n );\n }\n let data: Record<string, unknown> = {};\n const targetExists = context.fs.exists(target);\n if (targetExists) {\n try {\n data = JSON.parse(await context.fs.readText(target)) as Record<\n string,\n unknown\n >;\n } catch {\n throw new CliError(\n `Invalid JSON in messages/${locale}/${jsonFileName}.json.`,\n {\n code: \"FILESYSTEM_ERROR\",\n scope: \"project\",\n path: `messages/${locale}/${jsonFileName}.json`,\n },\n );\n }\n }\n const messageExists = parentName\n ? Object.hasOwn(data, childName!)\n : targetExists;\n if (!messageExists) {\n if (parentName) data[childName!] = templateJson;\n else data = templateJson as Record<string, unknown>;\n }\n const aggregatorCurrent = await context.fs.readText(aggregator);\n preparedLocales.push({\n locale,\n target,\n targetContent: messageExists\n ? undefined\n : `${JSON.stringify(data, null, 2)}\\n`,\n messageExists,\n aggregator,\n aggregatorContent: registerMessagesFile(\n aggregatorCurrent,\n locale,\n jsonFileName,\n ),\n });\n }\n }\n\n const gateway = new MutationGateway(context, context.cwd);\n await gateway.mkdir(uiDirectory, {\n role: \"page-ui-directory\",\n resource: \"directory\",\n });\n const uiFile = join(uiDirectory, \"page-ui.tsx\");\n const uiContent = (await context.fs.readText(uiTemplate))\n .replace(\n 'useTranslations(\"template\")',\n `useTranslations(\"${translationNamespace}\")`,\n )\n .replaceAll('from \"@/', `from \"${aliasPrefix}/`)\n .replace(/template/g, pageIdentifier)\n .replace(/Template/g, pageIdentifier);\n await gateway.write(uiFile, uiContent, {\n role: \"page-ui\",\n preserveExisting: true,\n });\n\n await gateway.mkdir(routeDirectory, {\n role: \"page-route-directory\",\n resource: \"directory\",\n });\n for (const template of routeTemplates) {\n const filename = toFileName(template.flag);\n const target = join(routeDirectory, filename);\n const uiImportPath = pageSegments.join(\"/\");\n const content = (await context.fs.readText(template.source))\n .replace(\"@/ui/template/\", `@/ui/${uiImportPath}/`)\n .replaceAll('from \"@/', `from \"${aliasPrefix}/`)\n .replace(/template/g, pageIdentifier)\n .replace(/Template/g, pageIdentifier);\n await gateway.write(target, content, {\n role: `page-${template.flag}`,\n preserveExisting: true,\n });\n }\n\n if (useI18n) {\n for (const item of preparedLocales) {\n if (item.messageExists) {\n gateway.unchanged(item.target, {\n role: \"translation-messages\",\n detail: { locale: item.locale, namespace: translationNamespace },\n });\n } else {\n await gateway.write(item.target, item.targetContent!, {\n role: \"translation-messages\",\n detail: { locale: item.locale, namespace: translationNamespace },\n });\n }\n await gateway.write(item.aggregator, item.aggregatorContent, {\n role: \"locale-aggregator\",\n });\n }\n } else {\n gateway.skipped(join(context.cwd, \"messages\"), {\n role: \"translation-messages\",\n resource: \"directory\",\n detail: { reason: \"Internationalization is disabled.\" },\n });\n }\n\n const mutated = context.operations\n .snapshot()\n .some((event) =>\n [\"created\", \"updated\", \"copied\", \"deleted\"].includes(event.action),\n );\n const reviewPaths = [\n { scope: \"project\" as const, path: gateway.path(uiFile) },\n ...routeTemplates.map((template) => ({\n scope: \"project\" as const,\n path: gateway.path(join(routeDirectory, toFileName(template.flag))),\n })),\n ...preparedLocales.map((item) => ({\n scope: \"project\" as const,\n path: gateway.path(item.target),\n })),\n ];\n return commandResult(context, {\n command: \"addpage\",\n summary: mutated\n ? `Added page \"${logicalName}\" and its missing resources.`\n : `Page \"${logicalName}\" already exists and was preserved.`,\n projectRoot: context.cwd,\n nextSteps: mutated\n ? [\n {\n kind: \"review\",\n required: true,\n message:\n \"Review the generated page UI, route files and localized messages.\",\n paths: reviewPaths,\n },\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ]\n : [],\n });\n};\n","import { join } from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport { loadConfig } from \"./utils\";\n\nfunction defaultText(key: string): string {\n return key\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (character) => character.toUpperCase());\n}\n\ntype PreparedTextFile = {\n locale: string;\n file: string;\n data: Record<string, unknown>;\n replaced: boolean;\n};\n\nexport const addText: CommandHandler = async (args, context) => {\n const pathArg = args[1];\n if (!pathArg) {\n throw new CliError(\"Translation dot path is required.\", {\n code: \"INVALID_ARGUMENT\",\n hint: \"Use addtext domain.key followed by an optional value.\",\n });\n }\n const segments = parseLogicalName(pathArg, \"translation path\");\n if (segments.length < 2) {\n throw new CliError(\"Translation path must contain a file and a key.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n const providedText = args.slice(2).join(\" \");\n const finalKey = segments.at(-1)!;\n const text = providedText || defaultText(finalKey);\n\n const config = await loadConfig(context);\n if (!config?.useI18n) {\n throw new CliError(\"Internationalization is not enabled in this project.\", {\n code: \"I18N_DISABLED\",\n });\n }\n const messagesRoot = join(context.cwd, \"messages\");\n if (!context.fs.exists(messagesRoot)) {\n throw new CliError(\"The messages directory was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n const locales = (await context.fs.list(messagesRoot))\n .filter((entry) => entry.isDirectory)\n .map((entry) => entry.name)\n .sort();\n if (locales.length === 0) {\n throw new CliError(\"No locale directories were found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n\n const [fileName, ...keySegments] = segments;\n const prepared: PreparedTextFile[] = [];\n for (const locale of locales) {\n const file = join(messagesRoot, locale, `${fileName}.json`);\n await assertSafeTarget(context.cwd, file, context.fs);\n const existed = context.fs.exists(file);\n let data: Record<string, unknown> = {};\n if (existed) {\n try {\n const parsed = JSON.parse(await context.fs.readText(file)) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"root value is not an object\");\n }\n data = parsed as Record<string, unknown>;\n } catch (error) {\n throw new CliError(\n `Invalid JSON in messages/${locale}/${fileName}.json.`,\n {\n code: \"FILESYSTEM_ERROR\",\n scope: \"project\",\n path: `messages/${locale}/${fileName}.json`,\n hint: error instanceof Error ? error.message : undefined,\n },\n );\n }\n }\n let cursor = data;\n for (const segment of keySegments.slice(0, -1)) {\n const current = cursor[segment];\n if (current === undefined) cursor[segment] = {};\n else if (\n !current ||\n typeof current !== \"object\" ||\n Array.isArray(current)\n ) {\n throw new CliError(\n `Translation segment \"${segment}\" is not an object in ${locale}.`,\n {\n code: \"INVALID_ARGUMENT\",\n scope: \"project\",\n path: `messages/${locale}/${fileName}.json`,\n },\n );\n }\n cursor = cursor[segment] as Record<string, unknown>;\n }\n const previous = cursor[finalKey];\n cursor[finalKey] = text;\n prepared.push({\n locale,\n file,\n data,\n replaced: previous !== undefined && previous !== text,\n });\n }\n\n const gateway = new MutationGateway(context, context.cwd);\n for (const item of prepared) {\n await gateway.write(item.file, `${JSON.stringify(item.data, null, 2)}\\n`, {\n role: \"translation-messages\",\n detail: {\n locale: item.locale,\n key: pathArg,\n replaced: item.replaced,\n },\n });\n }\n const mutated = context.operations\n .snapshot()\n .some((event) => event.action === \"created\" || event.action === \"updated\");\n const nextSteps = mutated\n ? [\n ...(locales.length > 1\n ? [\n {\n kind: \"translate\" as const,\n required: true,\n message:\n \"Review the value in every locale; the same text was written to all locale files.\",\n paths: prepared.map((item) => ({\n scope: \"project\" as const,\n path: gateway.path(item.file),\n })),\n },\n ]\n : []),\n {\n kind: \"run-checks\" as const,\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ]\n : [];\n return commandResult(context, {\n command: \"addtext\",\n summary: mutated\n ? `Set translation \"${pathArg}\" to \"${text}\" in ${locales.length} locale files.`\n : `Translation \"${pathArg}\" already has value \"${text}\" in every locale.`,\n projectRoot: context.cwd,\n nextSteps,\n });\n};\n","import path from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport { discoverPages } from \"../core/page-catalog\";\nimport { parseLogicalName, resolveInside } from \"../core/project-paths\";\nimport { toIdentifier } from \"./utils\";\n\ntype PreparedMessageRemoval = {\n target: string;\n content?: string;\n keyPresent: boolean;\n};\n\ntype PreparedAggregatorUpdate = {\n target: string;\n content: string;\n changed: boolean;\n};\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction unregisterMessagesFile(\n content: string,\n locale: string,\n fileName: string,\n): { content: string; changed: boolean } {\n const identifier = toIdentifier(fileName);\n const escapedIdentifier = escapeRegExp(identifier);\n const escapedPath = escapeRegExp(`./${locale}/${fileName}.json`);\n const importPattern = new RegExp(\n `^import\\\\s+${escapedIdentifier}\\\\s+from\\\\s+[\"']${escapedPath}[\"'];?\\\\r?\\\\n?`,\n \"m\",\n );\n const propertyPattern = new RegExp(\n `^\\\\s*${escapedIdentifier},\\\\s*\\\\r?\\\\n?`,\n \"m\",\n );\n const hasImport = importPattern.test(content);\n const hasProperty = propertyPattern.test(content);\n if (hasImport !== hasProperty) {\n throw new CliError(\n `Locale aggregator messages/${locale}.ts is inconsistent for ${fileName}.json.`,\n {\n code: \"INCONSISTENT_LOCALE\",\n scope: \"project\",\n path: `messages/${locale}.ts`,\n },\n );\n }\n if (!hasImport) return { content, changed: false };\n return {\n content: content.replace(importPattern, \"\").replace(propertyPattern, \"\"),\n changed: true,\n };\n}\n\nexport const rmPage: CommandHandler = async (args, context) => {\n const candidates = await discoverPages(context.cwd, context.fs);\n let logicalName = args[1];\n if (!logicalName || logicalName.startsWith(\"-\")) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"Page name is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass a page name returned by completion after rmpage.\",\n });\n }\n const selected = await context.prompt<\"page\" | \"confirm\">([\n {\n type: \"autocomplete\",\n name: \"page\",\n message: \"Page to remove:\",\n choices: candidates.map((candidate) => ({\n title: candidate.logicalName.replaceAll(\".\", \" > \"),\n value: candidate.logicalName,\n })),\n },\n {\n type: (value: string) => (value ? \"confirm\" : null),\n name: \"confirm\",\n message: \"Confirm page deletion?\",\n initial: false,\n },\n ]);\n if (!selected.confirm) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"page-removal\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"rmpage\",\n summary: \"Page deletion was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n logicalName = String(selected.page ?? \"\");\n }\n\n parseLogicalName(logicalName, \"page name\");\n const candidate = candidates.find(\n (entry) => entry.logicalName === logicalName,\n );\n if (!candidate) {\n throw new CliError(`Page not found: ${logicalName}.`, {\n code: \"TARGET_NOT_FOUND\",\n scope: \"project\",\n path: logicalName.replaceAll(\".\", \"/\"),\n });\n }\n\n const messagesRoot = resolveInside(context.cwd, \"messages\");\n const preparedMessages: PreparedMessageRemoval[] = [];\n const preparedAggregators: PreparedAggregatorUpdate[] = [];\n if (context.fs.exists(messagesRoot)) {\n const locales = (await context.fs.list(messagesRoot))\n .filter((entry) => entry.isDirectory)\n .map((entry) => entry.name)\n .sort();\n for (const locale of locales) {\n const target = resolveInside(\n context.cwd,\n \"messages\",\n locale,\n `${candidate.routeSegments[0]}.json`,\n );\n if (!candidate.messageKey) {\n const aggregator = resolveInside(\n context.cwd,\n \"messages\",\n `${locale}.ts`,\n );\n if (!context.fs.exists(aggregator)) {\n throw new CliError(\n `Locale aggregator messages/${locale}.ts was not found.`,\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${locale}.ts`,\n },\n );\n }\n const nextAggregator = unregisterMessagesFile(\n await context.fs.readText(aggregator),\n locale,\n candidate.routeSegments[0],\n );\n preparedMessages.push({\n target,\n keyPresent: context.fs.exists(target),\n });\n preparedAggregators.push({\n target: aggregator,\n ...nextAggregator,\n });\n continue;\n }\n if (!context.fs.exists(target)) continue;\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(await context.fs.readText(target)) as Record<\n string,\n unknown\n >;\n } catch {\n throw new CliError(\n `Invalid JSON prevents removal from ${path.relative(context.cwd, target)}.`,\n {\n code: \"FILESYSTEM_ERROR\",\n scope: \"project\",\n path: path.relative(context.cwd, target),\n },\n );\n }\n const keyPresent = Object.hasOwn(data, candidate.messageKey);\n if (keyPresent) delete data[candidate.messageKey];\n preparedMessages.push({\n target,\n keyPresent,\n content: `${JSON.stringify(data, null, 2)}\\n`,\n });\n }\n }\n\n const gateway = new MutationGateway(context, context.cwd);\n for (const prepared of preparedMessages) {\n if (!candidate.messageKey) {\n await gateway.remove(prepared.target, { role: \"translation-messages\" });\n } else if (prepared.keyPresent) {\n await gateway.write(prepared.target, prepared.content!, {\n role: \"translation-messages\",\n detail: { removedKey: candidate.messageKey },\n });\n } else {\n gateway.unchanged(prepared.target, {\n role: \"translation-messages\",\n detail: { missingKey: candidate.messageKey },\n });\n }\n }\n for (const prepared of preparedAggregators) {\n if (prepared.changed) {\n await gateway.write(prepared.target, prepared.content, {\n role: \"locale-aggregator\",\n });\n } else {\n gateway.unchanged(prepared.target, { role: \"locale-aggregator\" });\n }\n }\n await gateway.remove(\n candidate.uiDirectory,\n {\n role: \"page-ui\",\n resource: \"directory\",\n },\n { recursive: true, force: false },\n );\n await gateway.remove(\n candidate.routeDirectory,\n {\n role: \"page-route\",\n resource: \"directory\",\n },\n { recursive: true, force: false },\n );\n\n const mutated = context.operations\n .snapshot()\n .some((event) => event.action === \"deleted\" || event.action === \"updated\");\n return commandResult(context, {\n command: \"rmpage\",\n summary: mutated\n ? `Deleted page \"${logicalName}\" and its associated resources.`\n : `No resources remained for page \"${logicalName}\".`,\n projectRoot: context.cwd,\n nextSteps: mutated\n ? [\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the project checks after removing the page.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ]\n : [],\n });\n};\n","import type { CommandHandler } from \"../core/contracts\";\nimport { addApi } from \"../lib/addApi\";\nimport { addComponent } from \"../lib/addComponent\";\nimport { addLanguage } from \"../lib/addLanguage\";\nimport { addLib } from \"../lib/addLib\";\nimport { addPage } from \"../lib/addPage\";\nimport { addText } from \"../lib/addText\";\nimport { rmPage } from \"../lib/rmPage\";\n\nexport function createCommandRegistry(): ReadonlyMap<string, CommandHandler> {\n return new Map<string, CommandHandler>([\n [\"addcomponent\", addComponent],\n [\"addpage\", addPage],\n [\"addlib\", addLib],\n [\"addapi\", addApi],\n [\"addlanguage\", addLanguage],\n [\"addtext\", addText],\n [\"rmpage\", rmPage],\n ]);\n}\n","import { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { CliError } from \"./core/contracts\";\nimport type { CliContext } from \"./core/contracts\";\nimport { MutationGateway } from \"./core/operations\";\nimport {\n normalizeImportAlias,\n validateProjectName,\n} from \"./core/project-paths\";\nimport {\n copyTemplate,\n customizeGeneratedProject,\n validateScaffoldTemplate,\n} from \"./core/template-manifest\";\n\n/**\n * Options for scaffolding a Next.js project.\n */\nexport interface ScaffoldOptions {\n projectName: string;\n useTypescript: boolean;\n useEslint: boolean;\n useTailwind: boolean;\n useSrcDir: boolean;\n useTurbopack: boolean;\n useI18n: boolean;\n customAlias: boolean;\n importAlias: string;\n force?: boolean;\n}\n\ninterface ScaffoldRuntimeOptions {\n context: CliContext;\n templatePath?: string;\n}\n\n/**\n * Scaffold a new Next.js project based on provided options.\n *\n * - Copies the default template to the target directory\n * - Removes the target directory if it exists and --force is set\n * - Optionally customizes the structure in future (e.g. remove unused files)\n *\n * @param options ScaffoldOptions for the project\n */\nexport async function scaffoldProject(\n options: ScaffoldOptions,\n runtime: ScaffoldRuntimeOptions,\n): Promise<{ projectRoot: string; copiedFiles: number; importAlias: string }> {\n const requiredFeatures: Array<keyof ScaffoldOptions> = [\n \"useTypescript\",\n \"useEslint\",\n \"useTailwind\",\n \"useSrcDir\",\n \"useTurbopack\",\n \"useI18n\",\n ];\n const unsupported = requiredFeatures.filter(\n (feature) => options[feature] !== true,\n );\n if (unsupported.length > 0) {\n throw new CliError(\n `The default Next.js 16 template requires: ${unsupported.join(\", \")}.`,\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n const { context } = runtime;\n const cwd = context.cwd;\n const projectName = validateProjectName(options.projectName);\n const importAlias = normalizeImportAlias(\n options.customAlias === false ? \"@/*\" : options.importAlias || \"@/*\",\n );\n const targetPath = join(cwd, projectName);\n\n const __dirname = new URL(\".\", import.meta.url);\n const templatePath =\n runtime.templatePath ??\n join(fileURLToPath(__dirname), \"..\", \"templates\", \"Projects\", \"default\");\n const resolvedCwd = resolve(cwd);\n const resolvedTarget = resolve(targetPath);\n if (!resolvedTarget.startsWith(`${resolvedCwd}/`)) {\n throw new CliError(\n \"The project destination must be a child of the current directory.\",\n { code: \"UNSAFE_PATH\" },\n );\n }\n\n const gateway = new MutationGateway(context, targetPath);\n const manifest = await validateScaffoldTemplate(templatePath, context.fs);\n\n // Check if target directory exists\n if (context.fs.exists(targetPath)) {\n if (options.force) {\n if (context.outputMode === \"human\") {\n context.terminal.warn(\n `WARNING: --force will remove the existing project at ${targetPath}.`,\n );\n }\n await gateway.remove(\n targetPath,\n {\n role: \"existing-project\",\n resource: \"project\",\n },\n { recursive: true, force: true },\n );\n } else {\n throw new CliError(\n \"Target directory already exists. Use --force to overwrite it.\",\n {\n code: \"TARGET_EXISTS\",\n scope: \"project\",\n path: \".\",\n },\n );\n }\n }\n\n await gateway.mkdir(targetPath, {\n resource: \"project\",\n role: \"project-root\",\n });\n\n await copyTemplate(templatePath, targetPath, context, gateway, manifest);\n await customizeGeneratedProject(\n targetPath,\n projectName,\n importAlias,\n context,\n gateway,\n );\n\n await gateway.write(\n join(targetPath, \"cnp.config.json\"),\n `${JSON.stringify({ ...options, projectName, importAlias }, null, 2)}\\n`,\n {\n role: \"project-configuration\",\n resource: \"configuration\",\n detail: { importAlias, packageManager: \"user-selected\" },\n },\n );\n return { projectRoot: targetPath, copiedFiles: manifest.length, importAlias };\n}\n","import path from \"node:path\";\n\nimport { CliError } from \"./contracts\";\nimport type { CliContext, CliFileSystem } from \"./contracts\";\nimport { MutationGateway } from \"./operations\";\n\nexport const TEMPLATE_DENY_NAMES = new Set([\n \".env\",\n \".git\",\n \".gitignore\",\n \".agent\",\n \".cursor\",\n \".next\",\n \"node_modules\",\n \"artifacts\",\n \"coverage\",\n \"playwright-report\",\n \"test-results\",\n]);\n\nexport function isDistributableTemplatePath(relativePath: string): boolean {\n const segments = relativePath.split(path.sep);\n return !segments.some(\n (segment) =>\n TEMPLATE_DENY_NAMES.has(segment) ||\n (segment.startsWith(\".env\") && segment !== \".env.example\") ||\n segment.endsWith(\".tsbuildinfo\") ||\n segment === \".DS_Store\",\n );\n}\n\nexport async function templateManifest(\n root: string,\n fs: CliFileSystem,\n): Promise<string[]> {\n const files: string[] = [];\n async function visit(directory: string, relativeDirectory = \"\") {\n const entries = await fs.list(directory);\n for (const entry of entries) {\n const relative = path.join(relativeDirectory, entry.name);\n if (!isDistributableTemplatePath(relative)) continue;\n const source = path.join(directory, entry.name);\n if (entry.isSymbolicLink) {\n throw new CliError(\n `Symbolic links are forbidden in templates: ${relative}`,\n { code: \"UNSAFE_PATH\", scope: \"package\", path: relative },\n );\n }\n if (entry.isDirectory) await visit(source, relative);\n else if (entry.isFile) files.push(relative);\n else\n throw new CliError(`Unsupported template entry: ${relative}`, {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: relative,\n });\n }\n }\n await visit(root);\n return files;\n}\n\nexport async function validateScaffoldTemplate(\n root: string,\n fs: CliFileSystem,\n): Promise<string[]> {\n const manifest = await templateManifest(root, fs);\n for (const required of [\n \"package.json\",\n \"tsconfig.json\",\n \".env.example\",\n \".gitignore.template\",\n \".prettierignore\",\n \"bun.lock\",\n \"pnpm-workspace.yaml\",\n \"vitest.config.ts\",\n path.join(\"scripts\", \"audit.ts\"),\n path.join(\"scripts\", \"package-manager.ts\"),\n path.join(\"tests\", \"consumer\", \"validate-template.ts\"),\n path.join(\".github\", \"workflows\", \"quality.yml\"),\n ]) {\n if (!manifest.includes(required)) {\n throw new CliError(`Required template file was not found: ${required}.`, {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: `templates/Projects/default/${required}`,\n });\n }\n }\n try {\n JSON.parse(await fs.readText(path.join(root, \"package.json\")));\n const tsconfig = JSON.parse(\n await fs.readText(path.join(root, \"tsconfig.json\")),\n ) as { compilerOptions?: { paths?: Record<string, string[]> } };\n if (!tsconfig.compilerOptions?.paths?.[\"@/*\"]) throw new Error(\"alias\");\n } catch {\n throw new CliError(\n 'The template manifests must be valid JSON and define the default \"@/*\" alias.',\n {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: \"templates/Projects/default\",\n },\n );\n }\n return manifest;\n}\n\nexport async function copyTemplate(\n root: string,\n target: string,\n context: CliContext,\n gateway: MutationGateway,\n manifest?: string[],\n): Promise<string[]> {\n const files = manifest ?? (await templateManifest(root, context.fs));\n for (const relative of files) {\n const destination = path.join(\n target,\n relative === \".gitignore.template\" ? \".gitignore\" : relative,\n );\n const source = path.join(root, relative);\n await gateway.copy(source, destination, {\n role: \"template-file\",\n source: { template: `Projects/default/${relative}` },\n });\n }\n return files;\n}\n\nexport async function customizeGeneratedProject(\n target: string,\n projectName: string,\n importAlias: string,\n context: CliContext,\n gateway: MutationGateway,\n): Promise<void> {\n const packagePath = path.join(target, \"package.json\");\n const packageJson = JSON.parse(\n await context.fs.readText(packagePath),\n ) as Record<string, unknown>;\n packageJson.name = projectName.toLowerCase();\n delete packageJson.packageManager;\n await gateway.write(\n packagePath,\n `${JSON.stringify(packageJson, null, 2)}\\n`,\n { role: \"package-manifest\" },\n );\n\n const tsconfigPath = path.join(target, \"tsconfig.json\");\n const tsconfigContent = await context.fs.readText(tsconfigPath);\n const tsconfig = JSON.parse(tsconfigContent) as {\n compilerOptions?: { paths?: Record<string, string[]> };\n };\n if (!tsconfig.compilerOptions?.paths?.[\"@/*\"]) {\n throw new CliError(\n 'The template tsconfig must define the default \"@/*\" alias.',\n {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: \"templates/Projects/default/tsconfig.json\",\n },\n );\n }\n await gateway.write(\n tsconfigPath,\n tsconfigContent.replace('\"@/*\"', `\"${importAlias}\"`),\n { role: \"typescript-configuration\" },\n );\n\n if (importAlias !== \"@/*\") {\n const prefix = importAlias.slice(0, -2);\n for (const relative of await templateManifest(target, context.fs)) {\n if (!/\\.[cm]?[jt]sx?$/.test(relative)) continue;\n const file = path.join(target, relative);\n const content = await context.fs.readText(file);\n const next = content\n .replaceAll('from \"@/', `from \"${prefix}/`)\n .replaceAll(\"from '@/\", `from '${prefix}/`);\n if (next !== content) {\n await gateway.write(file, next, { role: \"import-alias-reference\" });\n }\n }\n }\n}\n","import { scaffoldProject } from \"../scaffold\";\nimport type { ScaffoldOptions } from \"../scaffold\";\nimport type { CliContext, CommandResult } from \"../core/contracts\";\nimport { commandResult } from \"../core/operations\";\n\nexport async function createProjectFromOptions(\n options: ScaffoldOptions,\n context: CliContext,\n): Promise<CommandResult> {\n const { projectRoot, copiedFiles, importAlias } = await scaffoldProject(\n options,\n {\n context,\n },\n );\n return commandResult(context, {\n command: \"create\",\n summary: `Created project \"${options.projectName}\" with ${copiedFiles} template files and import alias ${importAlias}; no package manager was pinned.`,\n projectRoot,\n nextSteps: [\n {\n kind: \"install\",\n required: true,\n message: \"Install dependencies with your preferred package manager.\",\n paths: [],\n commands: [\n `cd ${options.projectName} && bun install`,\n `cd ${options.projectName} && npm install`,\n `cd ${options.projectName} && pnpm install`,\n ],\n },\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the generated project checks before development.\",\n paths: [{ scope: \"project\", path: \"package.json\" }],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n {\n kind: \"run\",\n required: false,\n message:\n \"To run the project locally, copy the development environment example and start the development server.\",\n paths: [{ scope: \"project\", path: \".env.example\" }],\n commands: [\n `cd ${options.projectName} && cp .env.example .env && bun run dev`,\n `cd ${options.projectName} && cp .env.example .env && npm run dev`,\n `cd ${options.projectName} && cp .env.example .env && pnpm run dev`,\n ],\n },\n ],\n data: {\n projectName: options.projectName,\n importAlias,\n packageManager: null,\n copiedFiles,\n },\n });\n}\n\nexport async function createProject(\n nameArg: string,\n force: boolean,\n context: CliContext,\n): Promise<CommandResult> {\n const response: ScaffoldOptions = {\n projectName: nameArg,\n useTypescript: true,\n useEslint: true,\n useTailwind: true,\n useSrcDir: true,\n useTurbopack: true,\n useI18n: true,\n customAlias: true,\n importAlias: \"@/*\",\n force,\n };\n\n return createProjectFromOptions(response, context);\n}\n","import type { ScaffoldOptions } from \"../scaffold\";\nimport type { CliContext, CommandResult } from \"../core/contracts\";\nimport { commandResult } from \"../core/operations\";\nimport { createProjectFromOptions } from \"./createProject\";\n\nexport async function createProjectWithPrompt(\n context: CliContext,\n): Promise<CommandResult> {\n const response = await context.prompt<keyof ScaffoldOptions>([\n {\n type: \"text\",\n name: \"projectName\",\n message: \"Project name:\",\n initial: \"my-next-app\",\n },\n {\n type: \"toggle\",\n name: \"useTypescript\",\n message: \"✔ Use TypeScript?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useEslint\",\n message: \"✔ Use ESLint?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTailwind\",\n message: \"✔ Use Tailwind CSS?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useSrcDir\",\n message: \"✔ Use `src/` directory?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTurbopack\",\n message: \"✔ Use Turbopack for `next dev`?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useI18n\",\n message: \"✔ Use i18n with next-intl for translations?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"customAlias\",\n message: \"✔ Customize import alias (`@/*` by default)?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: (prev: boolean) => (prev ? \"text\" : null),\n name: \"importAlias\",\n message: \"✔ What import alias would you like?\",\n initial: \"@core/*\",\n },\n ]);\n\n if (!response.projectName) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"project-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"create\",\n summary: \"Project creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n\n const options = response as unknown as ScaffoldOptions;\n return createProjectFromOptions(options, context);\n}\n","import { existsSync } from \"node:fs\";\nimport {\n appendFile,\n copyFile,\n lstat,\n mkdir,\n readdir,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport prompts from \"prompts\";\n\nimport type { CliContext, PromptRunner } from \"../core/contracts\";\nimport { OperationJournal } from \"../core/operations\";\n\nfunction findPackageRoot(start: string): string {\n let current = start;\n while (true) {\n const packagePath = path.join(current, \"package.json\");\n if (existsSync(packagePath)) return current;\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(`Unable to locate package.json from ${start}`);\n }\n current = parent;\n }\n}\n\nexport function resolvePackageRoot(metaUrl = import.meta.url): string {\n return findPackageRoot(path.dirname(fileURLToPath(metaUrl)));\n}\n\ntype ContextOverrides = Partial<\n Pick<\n CliContext,\n | \"argv\"\n | \"cwd\"\n | \"env\"\n | \"homeDir\"\n | \"packageRoot\"\n | \"terminal\"\n | \"prompt\"\n | \"fs\"\n | \"outputMode\"\n >\n>;\n\nexport function createNodeContext(\n overrides: ContextOverrides = {},\n): CliContext {\n return {\n argv: process.argv.slice(2),\n cwd: process.cwd(),\n env: process.env,\n homeDir: os.homedir(),\n packageRoot: resolvePackageRoot(),\n terminal: console,\n prompt: prompts as PromptRunner,\n fs: {\n exists: existsSync,\n readText: (target) => readFile(target, \"utf8\"),\n writeText: async (target, content) => {\n await writeFile(target, content);\n },\n mkdir: async (target) => {\n await mkdir(target, { recursive: true });\n },\n copyFile: async (source, target) => {\n await copyFile(source, target);\n },\n appendText: async (target, content) => {\n await appendFile(target, content);\n },\n remove: async (target, options) => {\n await rm(target, options);\n },\n inspect: async (target) => {\n try {\n const stats = await lstat(target);\n return {\n name: target,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n isSymbolicLink: stats.isSymbolicLink(),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n },\n list: async (target) => {\n const entries = await readdir(target, { withFileTypes: true });\n return Promise.all(\n entries\n .sort((left, right) => left.name.localeCompare(right.name))\n .map(async (entry) => {\n const stats = await lstat(path.join(target, entry.name));\n return {\n name: entry.name,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n isSymbolicLink: stats.isSymbolicLink(),\n };\n }),\n );\n },\n },\n operations: new OperationJournal(),\n outputMode: \"human\",\n ...overrides,\n };\n}\n","#!/usr/bin/env node\nimport { main } from \"./src/index\";\nprocess.exitCode = await main();\n"],"mappings":"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","names":["path","path","path","path","path","path","path","path","join","path","path","join","join","join","join","join","join","join","join","join","join","join","path","candidate","path","join","path","path","join","path","fileURLToPath","path","fileURLToPath","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/cli/completion.ts","../src/core/contracts.ts","../src/core/page-area.ts","../src/core/page-catalog.ts","../src/cli/onboarding.ts","../src/core/operations.ts","../src/cli/output.ts","../src/lib/addApi.ts","../src/lib/utils.ts","../src/core/project-paths.ts","../src/lib/addComponent.ts","../src/lib/addLanguage.ts","../src/lib/addLib.ts","../src/lib/addPage.ts","../src/lib/addText.ts","../src/lib/rmPage.ts","../src/cli/registry.ts","../src/scaffold.ts","../src/core/template-manifest.ts","../src/core/agent-guidance.ts","../src/lib/createProject.ts","../src/lib/createProjectWithPrompt.ts","../src/runtime/node-context.ts","../bin.node.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport { completionCandidates } from \"./cli/completion\";\nimport { configDirectory, onboarding, readConfig } from \"./cli/onboarding\";\nimport { renderResult } from \"./cli/output\";\nimport { createCommandRegistry } from \"./cli/registry\";\nimport {\n CliError,\n type CliContext,\n type CommandResult,\n type ExitCode,\n} from \"./core/contracts\";\nimport { commandResult, failedResult } from \"./core/operations\";\nimport { createProject } from \"./lib/createProject\";\nimport { createProjectWithPrompt } from \"./lib/createProjectWithPrompt\";\nimport { createNodeContext } from \"./runtime/node-context\";\n\nexport const HELP_TEXT = `create-next-pro\n\nUsage:\n create-next-pro <project-name> [--force] [--json]\n create-next-pro addpage [name] --area <public|user> [options] [--json]\n create-next-pro addcomponent [name] [--page <page> --area <public|user>] [--json]\n create-next-pro addlib [name] [--json]\n create-next-pro addapi [name] [--json]\n create-next-pro addlanguage [locale] [--json]\n create-next-pro addtext <path> [text] [--json]\n create-next-pro rmpage [name] [--area <public|user>] [--json]\n\nOptions:\n --help Show this help message\n --version Show the CLI version\n --json Emit one deterministic JSON document\n --area Select the public or user area for page operations\n --reconfigure Run the configuration assistant again\n`;\n\nexport function parseOptions(args: string[]) {\n return {\n force: args.includes(\"--force\"),\n help: args.includes(\"--help\"),\n version: args.includes(\"--version\") || args.includes(\"-v\"),\n reconfigure: args.includes(\"--reconfigure\"),\n json: args.includes(\"--json\"),\n };\n}\n\nfunction withoutGlobalOptions(args: string[]): string[] {\n return args.filter((argument) => argument !== \"--json\");\n}\n\nasync function packageVersion(context: CliContext): Promise<string> {\n const packageJson = JSON.parse(\n await context.fs.readText(path.join(context.packageRoot, \"package.json\")),\n ) as { version: string };\n return packageJson.version;\n}\n\nfunction interactiveInputError(message: string, hint: string): never {\n throw new CliError(message, {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint,\n });\n}\n\nexport async function executeCli(context: CliContext): Promise<CommandResult> {\n const options = parseOptions(context.argv);\n context.outputMode = options.json ? \"json\" : \"human\";\n const args = withoutGlobalOptions(context.argv);\n const version = await packageVersion(context);\n\n if (options.help) {\n return commandResult(context, {\n command: \"help\",\n summary: \"Displayed create-next-pro help.\",\n projectRoot: context.cwd,\n status: \"success\",\n data: { help: HELP_TEXT },\n });\n }\n if (options.version) {\n return commandResult(context, {\n command: \"version\",\n summary: `create-next-pro version ${version}.`,\n projectRoot: context.cwd,\n status: \"success\",\n data: { version },\n });\n }\n\n const config = await readConfig(context);\n if (options.reconfigure) {\n if (options.json) {\n interactiveInputError(\n \"Reconfiguration is interactive and unavailable in JSON mode.\",\n \"Run create-next-pro --reconfigure without --json.\",\n );\n }\n return onboarding(context, version);\n }\n if (!config) {\n if (options.json) {\n throw new CliError(\"Initial configuration is required.\", {\n code: \"ONBOARDING_REQUIRED\",\n scope: \"config\",\n path: \"config.json\",\n hint: \"Run create-next-pro once without --json, then rerun the command.\",\n });\n }\n return onboarding(context, version);\n }\n\n const command = args[0];\n const handler = command ? createCommandRegistry().get(command) : undefined;\n if (handler) return handler(args, context);\n\n const nameArg = args.find(\n (argument) => !argument.startsWith(\"--\") && argument !== \"-v\",\n );\n if (nameArg) return createProject(nameArg, options.force, context);\n if (options.json) {\n interactiveInputError(\n \"A project name is required in JSON mode.\",\n \"Pass the project name as a positional argument.\",\n );\n }\n return createProjectWithPrompt(context);\n}\n\nasync function runCompletion(\n context: CliContext,\n args: string[],\n): Promise<ExitCode> {\n try {\n for (const candidate of await completionCandidates(\n args.slice(1),\n context,\n )) {\n context.terminal.log(candidate);\n }\n return 0;\n } catch {\n return 1;\n }\n}\n\nexport async function main(\n context: CliContext = createNodeContext(),\n): Promise<ExitCode> {\n const completionArgs = withoutGlobalOptions(context.argv);\n if (completionArgs[0] === \"__complete\") {\n return runCompletion(context, completionArgs);\n }\n\n context.operations.reset();\n context.outputMode = parseOptions(context.argv).json ? \"json\" : \"human\";\n let result: CommandResult;\n try {\n result = await executeCli(context);\n } catch (error) {\n const command = completionArgs[0] ?? \"create\";\n result = failedResult(context, command, error, {\n projectRoot: context.cwd,\n configRoot: configDirectory(context),\n homeRoot: context.homeDir,\n });\n }\n renderResult(result, context, context.outputMode);\n return result.exitCode;\n}\n","import path from \"node:path\";\n\nimport type { CliContext } from \"../core/contracts\";\nimport { PAGE_AREAS, isPageArea, type PageArea } from \"../core/page-area\";\nimport { discoverPageCatalog } from \"../core/page-catalog\";\n\nexport const PUBLIC_COMMANDS = [\n \"addpage\",\n \"addcomponent\",\n \"addlib\",\n \"addapi\",\n \"addlanguage\",\n \"addtext\",\n \"rmpage\",\n \"--help\",\n \"--version\",\n \"--json\",\n \"--reconfigure\",\n] as const;\n\nconst OPTIONS: Record<string, string[]> = {\n addpage: [\n \"--area\",\n \"--layout\",\n \"--page\",\n \"--loading\",\n \"--not-found\",\n \"--error\",\n \"--global-error\",\n \"--route\",\n \"--template\",\n \"--default\",\n ],\n addcomponent: [\"--page\", \"-P\"],\n};\n\nasync function directories(\n root: string,\n context: CliContext,\n): Promise<string[]> {\n try {\n return (await context.fs.list(root))\n .filter((entry) => entry.isDirectory && !entry.name.startsWith(\"_\"))\n .map((entry) => entry.name)\n .sort();\n } catch {\n return [];\n }\n}\n\nfunction selectedArea(args: string[]): PageArea | undefined {\n const index = args.lastIndexOf(\"--area\");\n if (index < 0) return undefined;\n const value = args[index + 1];\n return value && isPageArea(value) ? value : undefined;\n}\n\nfunction uniqueSorted(candidates: string[]): string[] {\n return [...new Set(candidates)].sort((left, right) =>\n left.localeCompare(right),\n );\n}\n\nexport async function completionCandidates(\n words: string[],\n context: CliContext,\n): Promise<string[]> {\n if (words.length === 0) return [...PUBLIC_COMMANDS];\n const [command, ...args] = words;\n const previous = args.at(-1);\n if (previous === \"--area\") return [...PAGE_AREAS];\n\n const area = selectedArea(args);\n const hasArea = args.includes(\"--area\");\n if (command === \"rmpage\") {\n if (!area) return hasArea ? [] : [\"--area\"];\n const catalog = await discoverPageCatalog(context.cwd, context.fs);\n return uniqueSorted(\n catalog.candidates\n .filter((candidate) => candidate.area === area)\n .map((candidate) => candidate.logicalName),\n );\n }\n\n if (command === \"addcomponent\") {\n const pageOptionIndex = args.findIndex(\n (argument) => argument === \"--page\" || argument === \"-P\",\n );\n if (previous === \"--page\" || previous === \"-P\") {\n const catalog = await discoverPageCatalog(context.cwd, context.fs);\n return uniqueSorted(\n catalog.candidates\n .filter((candidate) => !area || candidate.area === area)\n .map((candidate) => candidate.logicalName),\n );\n }\n return uniqueSorted([\n ...(OPTIONS.addcomponent ?? []),\n ...(pageOptionIndex >= 0 && !hasArea ? [\"--area\"] : []),\n ]);\n }\n\n if (command === \"addpage\") {\n return uniqueSorted([\n ...(OPTIONS.addpage ?? []).filter(\n (candidate) => candidate !== \"--area\" || !hasArea,\n ),\n ...(await directories(path.join(context.cwd, \"src\", \"ui\"), context)),\n ]);\n }\n\n if (command === \"addlanguage\")\n return [\"de\", \"en\", \"es\", \"fr\", \"it\", \"ja\", \"pt\"];\n return uniqueSorted(OPTIONS[command] ?? []);\n}\n\nexport async function printCompletions(\n args: string[],\n context: CliContext,\n): Promise<void> {\n for (const candidate of await completionCandidates(args.slice(1), context)) {\n context.terminal.log(candidate);\n }\n}\n","export type ExitCode = 0 | 1;\n\nexport type CommandStatus = \"success\" | \"unchanged\" | \"cancelled\" | \"failed\";\n\nexport type OperationAction =\n | \"created\"\n | \"copied\"\n | \"updated\"\n | \"deleted\"\n | \"unchanged\"\n | \"skipped\"\n | \"cancelled\"\n | \"failed\";\n\nexport type ResourceType =\n | \"file\"\n | \"directory\"\n | \"project\"\n | \"configuration\"\n | \"shell-profile\"\n | \"command\";\n\nexport type ResourceScope = \"project\" | \"config\" | \"home\" | \"package\";\n\nexport type ResourcePath = {\n scope: ResourceScope;\n path: string;\n};\n\nexport type OperationEvent = ResourcePath & {\n sequence: number;\n action: OperationAction;\n resource: ResourceType;\n role: string;\n source?: Partial<ResourcePath> & { template?: string };\n detail?: Record<string, string | number | boolean | null>;\n};\n\nexport type NextStep = {\n kind: \"translate\" | \"review\" | \"install\" | \"run-checks\" | \"run\" | \"rerun\";\n required: boolean;\n message: string;\n paths: ResourcePath[];\n commands?: string[];\n};\n\nexport type CommandError = Partial<ResourcePath> & {\n code: string;\n message: string;\n hint?: string;\n};\n\nexport type CommandResult = {\n exitCode: ExitCode;\n status: CommandStatus;\n command: string;\n summary: string;\n projectRoot?: string;\n configRoot?: string;\n homeRoot?: string;\n events: OperationEvent[];\n nextSteps: NextStep[];\n error: CommandError | null;\n data?: Record<string, unknown>;\n};\n\nexport type Terminal = {\n log: (...values: unknown[]) => void;\n warn: (...values: unknown[]) => void;\n error: (...values: unknown[]) => void;\n};\n\nexport type PromptQuestion<T extends string = string> = {\n type: unknown;\n name?: T;\n message?: string;\n [key: string]: unknown;\n};\n\nexport type PromptRunner = <T extends string = string>(\n questions: PromptQuestion<T> | PromptQuestion<T>[],\n options?: { onCancel?: () => boolean | void },\n) => Promise<Record<T, unknown>>;\n\nexport type CliFileSystem = {\n exists: (path: string) => boolean;\n readText: (path: string) => Promise<string>;\n writeText: (path: string, content: string) => Promise<void>;\n mkdir: (path: string) => Promise<void>;\n copyFile: (source: string, target: string) => Promise<void>;\n appendText: (path: string, content: string) => Promise<void>;\n remove: (\n path: string,\n options?: { recursive?: boolean; force?: boolean },\n ) => Promise<void>;\n inspect: (path: string) => Promise<DirectoryEntry | null>;\n list: (path: string) => Promise<DirectoryEntry[]>;\n};\n\nexport type DirectoryEntry = {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n};\n\nexport type OperationRecorder = {\n record: (event: Omit<OperationEvent, \"sequence\">) => OperationEvent;\n snapshot: () => OperationEvent[];\n reset: () => void;\n};\n\nexport type CliContext = {\n argv: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n homeDir: string;\n packageRoot: string;\n terminal: Terminal;\n prompt: PromptRunner;\n fs: CliFileSystem;\n operations: OperationRecorder;\n outputMode: \"human\" | \"json\";\n};\n\nexport type CommandHandler = (\n args: string[],\n context: CliContext,\n) => Promise<CommandResult>;\n\nexport type CliErrorOptions = Partial<ResourcePath> & {\n exitCode?: ExitCode;\n code?: string;\n hint?: string;\n};\n\nexport class CliError extends Error {\n readonly exitCode: ExitCode;\n readonly code: string;\n readonly hint?: string;\n readonly scope?: ResourceScope;\n readonly path?: string;\n\n constructor(message: string, options: ExitCode | CliErrorOptions = {}) {\n super(message);\n this.name = \"CliError\";\n if (typeof options === \"number\") {\n this.exitCode = options;\n this.code = \"FILESYSTEM_ERROR\";\n } else {\n this.exitCode = options.exitCode ?? 1;\n this.code = options.code ?? \"FILESYSTEM_ERROR\";\n this.hint = options.hint;\n this.scope = options.scope;\n this.path = options.path;\n }\n }\n}\n","import { CliError } from \"./contracts\";\n\nexport const PAGE_AREAS = [\"public\", \"user\"] as const;\n\nexport type PageArea = (typeof PAGE_AREAS)[number];\n\nexport type ParsedAreaArguments = {\n area?: PageArea;\n args: string[];\n};\n\nexport function isPageArea(value: string): value is PageArea {\n return (PAGE_AREAS as readonly string[]).includes(value);\n}\n\nexport function parseAreaOption(args: string[]): ParsedAreaArguments {\n const remaining = args.length > 0 ? [args[0]] : [];\n let area: PageArea | undefined;\n\n for (let index = 1; index < args.length; index += 1) {\n const argument = args[index];\n if (argument.startsWith(\"--area=\")) {\n throw new CliError(\n \"The --area option must use a separate public or user value.\",\n {\n code: \"INVALID_ARGUMENT\",\n hint: \"Use --area public or --area user.\",\n },\n );\n }\n if (argument !== \"--area\") {\n remaining.push(argument);\n continue;\n }\n if (area) {\n throw new CliError(\"The --area option can only be provided once.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n const value = args[index + 1];\n if (!value || value.startsWith(\"-\")) {\n throw new CliError(\"The --area option requires public or user.\", {\n code: \"INVALID_ARGUMENT\",\n hint: \"Use --area public or --area user.\",\n });\n }\n if (!isPageArea(value)) {\n throw new CliError(`Unsupported page area: ${value}.`, {\n code: \"INVALID_ARGUMENT\",\n hint: \"Use --area public or --area user.\",\n });\n }\n area = value;\n index += 1;\n }\n\n return { area, args: remaining };\n}\n\nexport function requirePageArea(\n area: PageArea | undefined,\n command: string,\n): PageArea {\n if (area) return area;\n throw new CliError(`The ${command} command requires --area public or user.`, {\n code: \"INVALID_ARGUMENT\",\n hint: `Run ${command} with --area public or --area user.`,\n });\n}\n\nexport function areaRouteGroup(area: PageArea): `(${PageArea})` {\n return `(${area})`;\n}\n","import path from \"node:path\";\n\nimport { CliError, type CliFileSystem } from \"./contracts\";\nimport { isPageArea, type PageArea } from \"./page-area\";\n\nexport type PageCandidate = {\n id: `${PageArea}:${string}`;\n area: PageArea;\n logicalName: string;\n routeSegments: string[];\n routeDirectory: string;\n uiDirectory: string;\n messageFile: string;\n messageKey?: string;\n};\n\nexport type PageCatalogIssue = {\n logicalName: string;\n reason: \"ungrouped\" | \"unsupported-route-group\" | \"duplicate-logical-route\";\n routeDirectories: string[];\n};\n\nexport type PageCatalog = {\n candidates: PageCandidate[];\n issues: PageCatalogIssue[];\n};\n\nfunction isRouteGroup(segment: string): boolean {\n return segment.startsWith(\"(\") && segment.endsWith(\")\");\n}\n\nfunction logicalSegments(relative: string[]): string[] {\n return relative.filter((segment) => !isRouteGroup(segment));\n}\n\nfunction issueForRoute(\n projectRoot: string,\n directory: string,\n relative: string[],\n): PageCatalogIssue | undefined {\n const segments = logicalSegments(relative);\n if (\n segments.length === 0 ||\n segments.some(\n (segment) => segment.startsWith(\"_\") || segment.startsWith(\"[\"),\n )\n ) {\n return undefined;\n }\n const first = relative[0];\n if (!first || !isRouteGroup(first)) {\n return {\n logicalName: segments.join(\".\"),\n reason: \"ungrouped\",\n routeDirectories: [path.relative(projectRoot, directory)],\n };\n }\n const groupName = first.slice(1, -1);\n if (!isPageArea(groupName) || relative.slice(1).some(isRouteGroup)) {\n return {\n logicalName: segments.join(\".\"),\n reason: \"unsupported-route-group\",\n routeDirectories: [path.relative(projectRoot, directory)],\n };\n }\n return undefined;\n}\n\nexport async function discoverPageCatalog(\n projectRoot: string,\n fs: CliFileSystem,\n): Promise<PageCatalog> {\n const localizedRoot = path.join(projectRoot, \"src\", \"app\", \"[locale]\");\n const appRoot = fs.exists(localizedRoot)\n ? localizedRoot\n : path.join(projectRoot, \"src\", \"app\");\n const rawCandidates: PageCandidate[] = [];\n const issues: PageCatalogIssue[] = [];\n\n async function visit(directory: string, relative: string[] = []) {\n let entries;\n try {\n entries = await fs.list(directory);\n } catch {\n return;\n }\n if (entries.some((entry) => entry.isFile && entry.name === \"page.tsx\")) {\n const issue = issueForRoute(projectRoot, directory, relative);\n if (issue) {\n issues.push(issue);\n } else if (relative.length > 1) {\n const area = relative[0].slice(1, -1) as PageArea;\n const routeSegments = relative.slice(1);\n if (\n routeSegments.length > 0 &&\n !routeSegments.some(\n (segment) => segment.startsWith(\"_\") || segment.startsWith(\"[\"),\n )\n ) {\n const logicalName = routeSegments.join(\".\");\n rawCandidates.push({\n id: `${area}:${logicalName}`,\n area,\n logicalName,\n routeSegments,\n routeDirectory: directory,\n uiDirectory: path.join(projectRoot, \"src\", \"ui\", ...routeSegments),\n messageFile: path.join(\n projectRoot,\n \"messages\",\n \"{locale}\",\n `${routeSegments[0]}.json`,\n ),\n messageKey:\n routeSegments.length > 1 ? routeSegments.at(-1) : undefined,\n });\n }\n }\n }\n for (const entry of entries) {\n if (entry.isDirectory && !entry.name.startsWith(\".\")) {\n await visit(path.join(directory, entry.name), [\n ...relative,\n entry.name,\n ]);\n }\n }\n }\n\n await visit(appRoot);\n\n const candidatesByName = new Map<string, PageCandidate[]>();\n for (const candidate of rawCandidates) {\n const entries = candidatesByName.get(candidate.logicalName) ?? [];\n entries.push(candidate);\n candidatesByName.set(candidate.logicalName, entries);\n }\n for (const [logicalName, candidates] of candidatesByName) {\n if (candidates.length < 2) continue;\n issues.push({\n logicalName,\n reason: \"duplicate-logical-route\",\n routeDirectories: candidates.map((candidate) =>\n path.relative(projectRoot, candidate.routeDirectory),\n ),\n });\n }\n\n const invalidNames = new Set(issues.map((issue) => issue.logicalName));\n const candidates = rawCandidates\n .filter((candidate) => !invalidNames.has(candidate.logicalName))\n .sort(\n (left, right) =>\n left.area.localeCompare(right.area) ||\n left.logicalName.localeCompare(right.logicalName),\n );\n issues.sort((left, right) =>\n left.logicalName.localeCompare(right.logicalName),\n );\n return { candidates, issues };\n}\n\nexport function routeIssue(\n catalog: PageCatalog,\n logicalName: string,\n): PageCatalogIssue | undefined {\n return catalog.issues.find((issue) => issue.logicalName === logicalName);\n}\n\nexport function assertConsistentLogicalRoute(\n catalog: PageCatalog,\n logicalName: string,\n): void {\n const issue = routeIssue(catalog, logicalName);\n if (!issue) return;\n throw new CliError(`Page route \"${logicalName}\" is inconsistent.`, {\n code: \"INCONSISTENT_ROUTE\",\n scope: \"project\",\n path: issue.routeDirectories.join(\", \"),\n hint: \"Move the route into exactly one of the (public) or (user) areas before retrying.\",\n });\n}\n\nexport function resolvePageCandidate(\n catalog: PageCatalog,\n logicalName: string,\n area: PageArea,\n): PageCandidate {\n assertConsistentLogicalRoute(catalog, logicalName);\n const candidate = catalog.candidates.find(\n (entry) => entry.logicalName === logicalName && entry.area === area,\n );\n if (candidate) return candidate;\n const otherArea = catalog.candidates.find(\n (entry) => entry.logicalName === logicalName,\n );\n throw new CliError(`Page not found in the ${area} area: ${logicalName}.`, {\n code: \"TARGET_NOT_FOUND\",\n scope: \"project\",\n path: logicalName.replaceAll(\".\", \"/\"),\n hint: otherArea\n ? `The page exists in the ${otherArea.area} area.`\n : undefined,\n });\n}\n","import path from \"node:path\";\n\nimport type { CliContext, CommandResult } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\n\nexport type UserConfig = {\n version: 1;\n shell: \"bash\" | \"zsh\";\n completionInstalled: boolean;\n createdAt: string;\n updatedAt: string;\n};\n\nexport function configDirectory(context: CliContext): string {\n return context.env.XDG_CONFIG_HOME\n ? path.join(context.env.XDG_CONFIG_HOME, \"create-next-pro\")\n : path.join(context.homeDir, \".config\", \"create-next-pro\");\n}\n\nexport function configFile(context: CliContext): string {\n return path.join(configDirectory(context), \"config.json\");\n}\n\nexport async function readConfig(\n context: CliContext,\n): Promise<UserConfig | null> {\n try {\n const config = JSON.parse(\n await context.fs.readText(configFile(context)),\n ) as UserConfig;\n if (\n config.version !== 1 ||\n (config.shell !== \"bash\" && config.shell !== \"zsh\") ||\n typeof config.completionInstalled !== \"boolean\" ||\n typeof config.createdAt !== \"string\" ||\n typeof config.updatedAt !== \"string\"\n ) {\n return null;\n }\n return config;\n } catch {\n return null;\n }\n}\n\nasync function ensureLineInRc(\n context: CliContext,\n target: string,\n line: string,\n): Promise<\"created\" | \"updated\" | \"unchanged\"> {\n const current = context.fs.exists(target)\n ? await context.fs.readText(target)\n : \"\";\n const gateway = new MutationGateway(context, context.homeDir, \"home\");\n return gateway.write(\n target,\n current.includes(line) ? current : `${current}\\n${line}\\n`,\n { role: \"shell-profile\", resource: \"shell-profile\" },\n );\n}\n\nasync function installCompletion(\n context: CliContext,\n shell: UserConfig[\"shell\"],\n): Promise<void> {\n const directory = configDirectory(context);\n const source = path.join(\n context.packageRoot,\n shell === \"zsh\"\n ? \"create-next-pro-completion.zsh\"\n : \"create-next-pro-completion.sh\",\n );\n const target = path.join(\n directory,\n `completion.${shell === \"zsh\" ? \"zsh\" : \"sh\"}`,\n );\n const gateway = new MutationGateway(context, directory, \"config\");\n await gateway.write(target, await context.fs.readText(source), {\n role: \"completion-script\",\n source: { scope: \"package\", path: path.basename(source) },\n });\n const rcFile = path.join(\n context.homeDir,\n shell === \"zsh\" ? \".zshrc\" : \".bashrc\",\n );\n await ensureLineInRc(context, rcFile, `source \"${target}\"`);\n}\n\nexport async function onboarding(\n context: CliContext,\n version: string,\n): Promise<CommandResult> {\n const response = await context.prompt<\"shell\" | \"completion\">(\n [\n {\n type: \"select\",\n name: \"shell\",\n message: \"Which shell do you use?\",\n choices: [\n { title: \"zsh\", value: \"zsh\" },\n { title: \"bash\", value: \"bash\" },\n ],\n initial: context.env.SHELL?.includes(\"zsh\") ? 0 : 1,\n },\n {\n type: \"toggle\",\n name: \"completion\",\n message: \"Install autocompletion?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n ],\n { onCancel: () => false },\n );\n\n if (response.shell !== \"bash\" && response.shell !== \"zsh\") {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"onboarding\",\n scope: \"config\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"onboarding\",\n summary: \"Configuration was cancelled.\",\n configRoot: configDirectory(context),\n homeRoot: context.homeDir,\n status: \"cancelled\",\n });\n }\n\n const previous = await readConfig(context);\n const now = new Date().toISOString();\n const config: UserConfig = {\n version: 1,\n shell: response.shell,\n completionInstalled: Boolean(response.completion),\n createdAt: previous?.createdAt ?? now,\n updatedAt: now,\n };\n if (config.completionInstalled) {\n try {\n await installCompletion(context, config.shell);\n } catch (error) {\n context.operations.record({\n action: \"skipped\",\n resource: \"file\",\n role: \"completion-installation\",\n scope: \"config\",\n path: `completion.${config.shell === \"zsh\" ? \"zsh\" : \"sh\"}`,\n detail: {\n reason: error instanceof Error ? error.message : String(error),\n },\n });\n config.completionInstalled = false;\n }\n }\n\n const semanticallyUnchanged =\n previous?.shell === config.shell &&\n previous.completionInstalled === config.completionInstalled;\n if (semanticallyUnchanged && previous) config.updatedAt = previous.updatedAt;\n\n const gateway = new MutationGateway(\n context,\n configDirectory(context),\n \"config\",\n );\n await gateway.write(\n configFile(context),\n `${JSON.stringify(config, null, 2)}\\n`,\n { role: \"user-configuration\", resource: \"configuration\" },\n );\n\n return commandResult(context, {\n command: \"onboarding\",\n summary: `Configuration for create-next-pro v${version} is ready.`,\n configRoot: configDirectory(context),\n homeRoot: context.homeDir,\n nextSteps: [\n {\n kind: \"rerun\",\n required: true,\n message: \"Run the original create-next-pro command again.\",\n paths: [],\n },\n ],\n });\n}\n","import path from \"node:path\";\n\nimport type {\n CliContext,\n CommandError,\n CommandResult,\n CommandStatus,\n NextStep,\n OperationEvent,\n OperationRecorder,\n ResourceScope,\n ResourceType,\n} from \"./contracts\";\nimport { CliError } from \"./contracts\";\n\nexport class OperationJournal implements OperationRecorder {\n readonly #events: OperationEvent[] = [];\n\n record(event: Omit<OperationEvent, \"sequence\">): OperationEvent {\n const detail = event.detail\n ? Object.fromEntries(\n Object.entries(event.detail).map(([key, value]) => [\n key,\n /(content|credential|env|password|secret|token|value)/i.test(key)\n ? \"[REDACTED]\"\n : value,\n ]),\n )\n : undefined;\n const recorded = {\n ...event,\n detail,\n sequence: this.#events.length + 1,\n };\n this.#events.push(recorded);\n return recorded;\n }\n\n snapshot(): OperationEvent[] {\n return this.#events.map((event) => ({ ...event }));\n }\n\n reset(): void {\n this.#events.length = 0;\n }\n}\n\nconst MUTATIONS = new Set([\"created\", \"copied\", \"updated\", \"deleted\"]);\n\nexport function statusFromEvents(events: OperationEvent[]): CommandStatus {\n if (events.some((event) => event.action === \"cancelled\")) return \"cancelled\";\n return events.some((event) => MUTATIONS.has(event.action))\n ? \"success\"\n : \"unchanged\";\n}\n\nexport function commandResult(\n context: CliContext,\n input: {\n command: string;\n summary: string;\n projectRoot?: string;\n configRoot?: string;\n homeRoot?: string;\n nextSteps?: NextStep[];\n data?: Record<string, unknown>;\n status?: CommandStatus;\n },\n): CommandResult {\n const events = context.operations.snapshot();\n const status = input.status ?? statusFromEvents(events);\n return {\n exitCode: status === \"failed\" ? 1 : 0,\n status,\n command: input.command,\n summary: input.summary,\n projectRoot: input.projectRoot,\n configRoot: input.configRoot,\n homeRoot: input.homeRoot,\n events,\n nextSteps: input.nextSteps ?? [],\n error: null,\n data: input.data,\n };\n}\n\nexport function failedResult(\n context: CliContext,\n command: string,\n error: unknown,\n roots: {\n projectRoot?: string;\n configRoot?: string;\n homeRoot?: string;\n } = {},\n): CommandResult {\n const cliError = error instanceof CliError ? error : undefined;\n const normalized: CommandError = {\n code: cliError?.code ?? \"FILESYSTEM_ERROR\",\n message: error instanceof Error ? error.message : String(error),\n hint: cliError?.hint,\n scope: cliError?.scope,\n path: cliError?.path,\n };\n const nextSteps: NextStep[] =\n normalized.code === \"ONBOARDING_REQUIRED\"\n ? [\n {\n kind: \"rerun\",\n required: true,\n message:\n \"Run create-next-pro once in human mode, then rerun the JSON command.\",\n paths: [{ scope: \"config\", path: \"config.json\" }],\n commands: [\"create-next-pro\"],\n },\n ]\n : [];\n context.operations.record({\n action: \"failed\",\n resource: \"command\",\n role: command,\n scope: normalized.scope ?? \"project\",\n path: normalized.path ?? \".\",\n detail: { code: normalized.code },\n });\n return {\n exitCode: cliError?.exitCode ?? 1,\n status: \"failed\",\n command,\n summary: normalized.message,\n ...roots,\n events: context.operations.snapshot(),\n nextSteps,\n error: normalized,\n };\n}\n\nexport function relativeResource(root: string, target: string): string {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative || \".\";\n}\n\ntype MutationMetadata = {\n role: string;\n resource?: ResourceType;\n scope?: ResourceScope;\n source?: OperationEvent[\"source\"];\n detail?: OperationEvent[\"detail\"];\n};\n\nexport class MutationGateway {\n constructor(\n private readonly context: CliContext,\n private readonly root: string,\n private readonly defaultScope: ResourceScope = \"project\",\n ) {}\n\n path(target: string): string {\n return relativeResource(this.root, target);\n }\n\n async mkdir(\n target: string,\n metadata: MutationMetadata,\n record = true,\n ): Promise<\"created\" | \"unchanged\"> {\n if (this.context.fs.exists(target)) {\n if (record) this.record(\"unchanged\", target, metadata);\n return \"unchanged\";\n }\n await this.context.fs.mkdir(target);\n if (record) this.record(\"created\", target, metadata);\n return \"created\";\n }\n\n async write(\n target: string,\n content: string,\n metadata: MutationMetadata & { preserveExisting?: boolean },\n ): Promise<\"created\" | \"updated\" | \"unchanged\"> {\n const exists = this.context.fs.exists(target);\n if (exists && metadata.preserveExisting) {\n this.record(\"unchanged\", target, metadata);\n return \"unchanged\";\n }\n if (exists && (await this.context.fs.readText(target)) === content) {\n this.record(\"unchanged\", target, metadata);\n return \"unchanged\";\n }\n await this.context.fs.mkdir(path.dirname(target));\n await this.context.fs.writeText(target, content);\n const action = exists ? \"updated\" : \"created\";\n this.record(action, target, metadata);\n return action;\n }\n\n async copy(\n source: string,\n target: string,\n metadata: MutationMetadata & { preserveExisting?: boolean },\n ): Promise<\"copied\" | \"unchanged\"> {\n if (this.context.fs.exists(target) && metadata.preserveExisting) {\n this.record(\"unchanged\", target, metadata);\n return \"unchanged\";\n }\n await this.context.fs.mkdir(path.dirname(target));\n await this.context.fs.copyFile(source, target);\n this.record(\"copied\", target, {\n ...metadata,\n source: metadata.source ?? { path: source },\n });\n return \"copied\";\n }\n\n async remove(\n target: string,\n metadata: MutationMetadata,\n options: { recursive?: boolean; force?: boolean } = {},\n ): Promise<\"deleted\" | \"unchanged\"> {\n if (!this.context.fs.exists(target)) {\n this.record(\"unchanged\", target, metadata);\n return \"unchanged\";\n }\n await this.context.fs.remove(target, options);\n this.record(\"deleted\", target, metadata);\n return \"deleted\";\n }\n\n unchanged(target: string, metadata: MutationMetadata): void {\n this.record(\"unchanged\", target, metadata);\n }\n\n skipped(target: string, metadata: MutationMetadata): void {\n this.record(\"skipped\", target, metadata);\n }\n\n private record(\n action: OperationEvent[\"action\"],\n target: string,\n metadata: MutationMetadata,\n ): void {\n this.context.operations.record({\n action,\n resource: metadata.resource ?? \"file\",\n role: metadata.role,\n scope: metadata.scope ?? this.defaultScope,\n path: this.path(target),\n source: metadata.source,\n detail: metadata.detail,\n });\n }\n}\n","import path from \"node:path\";\n\nimport type {\n CliContext,\n CommandResult,\n OperationEvent,\n ResourceScope,\n} from \"../core/contracts\";\n\nexport type OutputMode = \"human\" | \"json\";\n\nfunction rootFor(\n result: CommandResult,\n context: CliContext,\n scope: ResourceScope,\n): string | undefined {\n if (scope === \"project\") return result.projectRoot;\n if (scope === \"config\") return result.configRoot;\n if (scope === \"home\") return result.homeRoot;\n return context.packageRoot;\n}\n\nfunction displayPath(\n result: CommandResult,\n context: CliContext,\n scope: ResourceScope,\n target: string,\n): string {\n const root = rootFor(result, context, scope);\n return root ? path.resolve(root, target) : target;\n}\n\nfunction renderEvent(\n result: CommandResult,\n context: CliContext,\n event: OperationEvent,\n): string {\n const source = event.source?.template\n ? ` from template ${event.source.template}`\n : event.source?.path\n ? ` from ${displayPath(\n result,\n context,\n event.source.scope ?? event.scope,\n event.source.path,\n )}`\n : \"\";\n const detail = event.detail\n ? ` (${Object.entries(event.detail)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => `${key}=${JSON.stringify(value)}`)\n .join(\", \")})`\n : \"\";\n return `${event.action.toUpperCase()} ${event.role}: ${displayPath(\n result,\n context,\n event.scope,\n event.path,\n )}${source}${detail}`;\n}\n\nexport function renderResult(\n result: CommandResult,\n context: CliContext,\n mode: OutputMode,\n): void {\n if (mode === \"json\") {\n context.terminal.log(JSON.stringify({ schemaVersion: 1, ...result }));\n return;\n }\n\n if (result.command === \"help\" && typeof result.data?.help === \"string\") {\n context.terminal.log(result.data.help);\n return;\n }\n if (\n result.command === \"version\" &&\n typeof result.data?.version === \"string\"\n ) {\n context.terminal.log(`v${result.data.version}`);\n return;\n }\n\n const copiedTemplateFiles = result.events.filter(\n (event) => event.action === \"copied\" && event.role === \"template-file\",\n );\n if (copiedTemplateFiles.length > 0) {\n context.terminal.log(\n `COPIED ${copiedTemplateFiles.length} template files to ${result.projectRoot}.`,\n );\n }\n\n for (const event of result.events) {\n if (event.action === \"copied\" && event.role === \"template-file\") continue;\n const line = renderEvent(result, context, event);\n if (event.action === \"failed\") context.terminal.error(line);\n else if (event.action === \"skipped\") context.terminal.warn(line);\n else context.terminal.log(line);\n }\n\n if (result.error) {\n context.terminal.error(\n `ERROR [${result.error.code}]: ${result.error.message}`,\n );\n if (result.error.hint) context.terminal.error(`HINT: ${result.error.hint}`);\n } else if (result.status === \"success\") {\n context.terminal.log(`SUCCESS: ${result.summary}`);\n } else if (result.status === \"unchanged\") {\n context.terminal.log(`NO CHANGES: ${result.summary}`);\n } else if (result.status === \"cancelled\") {\n context.terminal.log(`CANCELLED: ${result.summary}`);\n }\n\n for (const step of result.nextSteps) {\n context.terminal.log(`NEXT [${step.kind}]: ${step.message}`);\n for (const target of step.paths) {\n context.terminal.log(\n ` ${displayPath(result, context, target.scope, target.path)}`,\n );\n }\n for (const command of step.commands ?? []) {\n context.terminal.log(` ${command}`);\n }\n }\n}\n","import { join } from \"node:path\";\n\nimport { loadConfig } from \"./utils\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\n\nexport const addApi: CommandHandler = async (args, context) => {\n let apiName = args[1];\n if (!apiName || apiName.startsWith(\"-\")) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"API route name is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass the API route name after addapi.\",\n });\n }\n const response = await context.prompt<\"apiName\">({\n type: \"text\",\n name: \"apiName\",\n message: \"API route name to add:\",\n validate: (name: string) => (name ? true : \"API route name is required\"),\n });\n apiName = String(response.apiName ?? \"\");\n if (!apiName) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"api-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"addapi\",\n summary: \"API route creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n }\n const apiSegments = parseLogicalName(apiName, \"API route name\");\n\n const config = await loadConfig(context);\n if (!config) {\n throw new CliError(\"Configuration file cnp.config.json was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n hint: \"Run this command from the generated project root.\",\n });\n }\n\n const apiDir = join(context.cwd, \"src\", \"app\", \"api\", ...apiSegments);\n await assertSafeTarget(context.cwd, apiDir, context.fs);\n const gateway = new MutationGateway(context, context.cwd);\n\n const templateDir = join(context.packageRoot, \"templates\", \"Api\");\n const routeTemplate = join(templateDir, \"route.ts\");\n const routePath = join(apiDir, \"route.ts\");\n if (!context.fs.exists(routeTemplate)) {\n throw new CliError(\"API template route.ts was not found.\", {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: \"templates/Api/route.ts\",\n });\n }\n\n await gateway.mkdir(apiDir, {\n role: \"api-directory\",\n resource: \"directory\",\n });\n const content = (await context.fs.readText(routeTemplate)).replace(\n /template/g,\n apiName,\n );\n const action = await gateway.write(routePath, content, {\n role: \"api-route\",\n preserveExisting: true,\n });\n\n return commandResult(context, {\n command: \"addapi\",\n summary:\n action === \"unchanged\"\n ? `API route \"${apiName}\" already exists and was preserved.`\n : `Added API route \"${apiName}\".`,\n projectRoot: context.cwd,\n nextSteps:\n action === \"unchanged\"\n ? []\n : [\n {\n kind: \"review\",\n required: true,\n message:\n \"Replace the example response and review validation and authentication.\",\n paths: [{ scope: \"project\", path: gateway.path(routePath) }],\n },\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ],\n });\n};\n","import { join } from \"node:path\";\nimport type { CliContext } from \"../core/contracts\";\n\n/**\n * Capitalize the first letter of a string.\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function toIdentifier(value: string): string {\n return value.replace(/[-_]+([A-Za-z0-9])/g, (_, character: string) =>\n character.toUpperCase(),\n );\n}\n\nexport interface CNPConfig {\n useI18n?: boolean;\n importAlias?: string;\n [key: string]: any;\n}\n\nexport function configuredAliasPrefix(config: CNPConfig): string {\n const alias = config.importAlias ?? \"@/*\";\n return alias.endsWith(\"/*\") ? alias.slice(0, -2) : \"@\";\n}\n\n/**\n * Load CLI configuration from the project root.\n * Returns null if the configuration file is missing or invalid.\n */\nexport async function loadConfig(\n context: Pick<CliContext, \"cwd\" | \"fs\">,\n): Promise<CNPConfig | null> {\n const configPath = join(context.cwd, \"cnp.config.json\");\n if (!context.fs.exists(configPath)) return null;\n try {\n const raw = await context.fs.readText(configPath);\n return JSON.parse(raw) as CNPConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Map a key to its corresponding file name for page/component templates.\n * @param key string\n * @returns file name string\n */\nexport function toFileName(key: string): string {\n switch (key) {\n case \"layout\":\n return \"layout.tsx\";\n case \"page\":\n return \"page.tsx\";\n case \"loading\":\n return \"loading.tsx\";\n case \"not-found\":\n return \"not-found.tsx\";\n case \"error\":\n return \"error.tsx\";\n case \"global-error\":\n return \"global-error.tsx\";\n case \"route\":\n return \"route.ts\";\n case \"template\":\n return \"template.tsx\";\n case \"default\":\n return \"default.tsx\";\n default:\n return `${key}.tsx`;\n }\n}\n","import path from \"node:path\";\n\nimport { CliError, type CliFileSystem } from \"./contracts\";\n\nconst SAFE_SEGMENT = /^[A-Za-z][A-Za-z0-9_-]*$/;\n\nfunction hasControlCharacters(value: string): boolean {\n return [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || code === 127;\n });\n}\n\nexport function parseLogicalName(value: string, label = \"name\"): string[] {\n if (!value || hasControlCharacters(value)) {\n throw new CliError(\n `Invalid ${label}: a non-empty printable value is required.`,\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n if (path.isAbsolute(value) || value.includes(\"/\") || value.includes(\"\\\\\")) {\n throw new CliError(\n `Invalid ${label}: paths and separators are not allowed.`,\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n const segments = value.split(\".\");\n if (segments.some((segment) => !SAFE_SEGMENT.test(segment))) {\n throw new CliError(\n `Invalid ${label}: use dot-separated alphanumeric segments beginning with a letter.`,\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n return segments;\n}\n\nexport function validateProjectName(value: string): string {\n if (\n !value ||\n hasControlCharacters(value) ||\n path.isAbsolute(value) ||\n value === \".\" ||\n value === \"..\" ||\n value.includes(\"/\") ||\n value.includes(\"\\\\\") ||\n !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)\n ) {\n throw new CliError(\n \"Invalid project name: use letters, numbers, dots, dashes or underscores without path separators.\",\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n return value;\n}\n\nexport function resolveInside(root: string, ...segments: string[]): string {\n const absoluteRoot = path.resolve(root);\n const target = path.resolve(absoluteRoot, ...segments);\n if (\n target !== absoluteRoot &&\n !target.startsWith(`${absoluteRoot}${path.sep}`)\n ) {\n throw new CliError(\n `Refusing to access a path outside the project: ${target}`,\n { code: \"UNSAFE_PATH\" },\n );\n }\n return target;\n}\n\nexport async function assertSafeTarget(\n root: string,\n target: string,\n fs: CliFileSystem,\n): Promise<string> {\n const safeTarget = resolveInside(root, path.relative(root, target));\n const relativeSegments = path\n .relative(path.resolve(root), safeTarget)\n .split(path.sep);\n let current = path.resolve(root);\n for (const segment of relativeSegments) {\n if (!segment) continue;\n current = path.join(current, segment);\n const entry = await fs.inspect(current);\n if (entry?.isSymbolicLink) {\n throw new CliError(\n `Symbolic links are forbidden in project paths: ${current}`,\n { code: \"UNSAFE_PATH\" },\n );\n }\n }\n return safeTarget;\n}\n\nexport function normalizeImportAlias(value: string): string {\n if (!/^[A-Za-z@~][A-Za-z0-9@~_-]*\\/\\*$/.test(value)) {\n throw new CliError(\n 'Invalid import alias: expected a prefix followed by \"/*\" (for example \"@/*\" or \"@core/*\").',\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n return value;\n}\n\nexport function importAliasPrefix(value = \"@/*\"): string {\n return normalizeImportAlias(value).slice(0, -2);\n}\n","import { join } from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport {\n discoverPageCatalog,\n resolvePageCandidate,\n} from \"../core/page-catalog\";\nimport {\n parseAreaOption,\n requirePageArea,\n type PageArea,\n} from \"../core/page-area\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport { capitalize, loadConfig, toIdentifier } from \"./utils\";\n\ntype PreparedMessages = {\n locale: string;\n target: string;\n content?: string;\n exists: boolean;\n};\n\ntype ParsedAddComponentArguments = {\n area?: PageArea;\n componentName?: string;\n pageScope?: string;\n};\n\nfunction formatGeneratedTranslations(content: string): string {\n return content.replace(\n /^(\\s*)(<(?:h2|p)\\b[^>]*>)\\{t\\(\"([^\"]+)\"\\)\\}(<\\/(?:h2|p)>)$/gm,\n (line, indent: string, opening: string, key: string, closing: string) =>\n line.length <= 80\n ? line\n : `${indent}${opening}\\n${indent} {t(\"${key}\")}\\n${indent}${closing}`,\n );\n}\n\nfunction parseAddComponentArguments(\n args: string[],\n): ParsedAddComponentArguments {\n const parsedArea = parseAreaOption(args);\n let componentName: string | undefined;\n let pageScope: string | undefined;\n for (let index = 1; index < parsedArea.args.length; index += 1) {\n const argument = parsedArea.args[index];\n if (argument === \"-P\" || argument === \"--page\") {\n if (pageScope) {\n throw new CliError(\"The --page option can only be provided once.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n const value = parsedArea.args[index + 1];\n if (!value || value.startsWith(\"-\")) {\n throw new CliError(\"The --page option requires a page name.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n pageScope = value;\n index += 1;\n continue;\n }\n if (argument.startsWith(\"-\")) {\n throw new CliError(`Unknown addcomponent option: ${argument}.`, {\n code: \"INVALID_ARGUMENT\",\n });\n }\n if (componentName) {\n throw new CliError(`Unexpected addcomponent argument: ${argument}.`, {\n code: \"INVALID_ARGUMENT\",\n });\n }\n componentName = argument;\n }\n if (pageScope && !parsedArea.area) {\n requirePageArea(parsedArea.area, \"addcomponent --page\");\n }\n if (!pageScope && parsedArea.area) {\n throw new CliError(\n \"The --area option is only valid with addcomponent --page.\",\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n return { area: parsedArea.area, componentName, pageScope };\n}\n\nexport const addComponent: CommandHandler = async (args, context) => {\n const parsed = parseAddComponentArguments(args);\n let { componentName } = parsed;\n const { area, pageScope } = parsed;\n if (!componentName) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"Component name is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass the component name after addcomponent.\",\n });\n }\n const response = await context.prompt<\"componentName\">({\n type: \"text\",\n name: \"componentName\",\n message: \"Component name to add:\",\n validate: (name: string) => (name ? true : \"Component name is required\"),\n });\n componentName = String(response.componentName ?? \"\");\n if (!componentName) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"component-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"addcomponent\",\n summary: \"Component creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n }\n const componentSegments = parseLogicalName(componentName, \"component name\");\n if (componentSegments.length !== 1) {\n throw new CliError(\"Component names must contain exactly one segment.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n const pageSegments = pageScope\n ? parseLogicalName(pageScope, \"page name\")\n : [];\n const config = await loadConfig(context);\n if (!config) {\n throw new CliError(\"Configuration file cnp.config.json was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n hint: \"Run this command from the generated project root.\",\n });\n }\n if (pageScope) {\n const catalog = await discoverPageCatalog(context.cwd, context.fs);\n resolvePageCandidate(catalog, pageScope, area!);\n }\n\n const componentNameUpper = capitalize(toIdentifier(componentName));\n const templateRoot = join(context.packageRoot, \"templates\", \"Component\");\n const componentTemplate = join(templateRoot, \"Component.tsx\");\n const messagesTemplate = join(templateRoot, \"component.json\");\n if (\n !context.fs.exists(componentTemplate) ||\n (config.useI18n && !context.fs.exists(messagesTemplate))\n ) {\n throw new CliError(\"Required component template files were not found.\", {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: \"templates/Component\",\n });\n }\n\n const targetDirectory = pageScope\n ? join(context.cwd, \"src\", \"ui\", ...pageSegments)\n : join(context.cwd, \"src\", \"ui\", \"_global\");\n await assertSafeTarget(context.cwd, targetDirectory, context.fs);\n const componentFile = join(targetDirectory, `${componentNameUpper}.tsx`);\n const translationNamespace = pageScope ?? \"_global_ui\";\n const componentContent = formatGeneratedTranslations(\n (await context.fs.readText(componentTemplate))\n .replace(/Component/g, componentNameUpper)\n .replace(/componentPage/g, translationNamespace),\n );\n\n const preparedMessages: PreparedMessages[] = [];\n if (config.useI18n) {\n const messagesRoot = join(context.cwd, \"messages\");\n if (!context.fs.exists(messagesRoot)) {\n throw new CliError(\"The messages directory was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n await assertSafeTarget(context.cwd, messagesRoot, context.fs);\n const templateMessages = JSON.parse(\n await context.fs.readText(messagesTemplate),\n ) as Record<string, unknown>;\n const locales = (await context.fs.list(messagesRoot))\n .filter((entry) => entry.isDirectory)\n .map((entry) => entry.name)\n .sort();\n if (locales.length === 0) {\n throw new CliError(\"No locale directories were found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n for (const locale of locales) {\n const messageFile = pageScope ? pageSegments[0] : \"_global_ui\";\n const target = join(messagesRoot, locale, `${messageFile}.json`);\n await assertSafeTarget(context.cwd, target, context.fs);\n let data: Record<string, unknown> = {};\n if (context.fs.exists(target)) {\n try {\n data = JSON.parse(await context.fs.readText(target)) as Record<\n string,\n unknown\n >;\n } catch {\n throw new CliError(\n `Invalid JSON in messages/${locale}/${messageFile}.json.`,\n {\n code: \"FILESYSTEM_ERROR\",\n scope: \"project\",\n path: `messages/${locale}/${messageFile}.json`,\n },\n );\n }\n }\n let container = data;\n if (pageSegments.length > 1) {\n const child = pageSegments[1];\n const current = data[child];\n if (\n current !== undefined &&\n (!current || typeof current !== \"object\" || Array.isArray(current))\n ) {\n throw new CliError(\n `Translation namespace ${pageScope} is not an object in ${locale}.`,\n {\n code: \"INVALID_ARGUMENT\",\n scope: \"project\",\n path: `messages/${locale}/${messageFile}.json`,\n },\n );\n }\n if (!current) data[child] = {};\n container = data[child] as Record<string, unknown>;\n }\n const exists = Object.hasOwn(container, componentNameUpper);\n if (!exists) container[componentNameUpper] = templateMessages;\n preparedMessages.push({\n locale,\n target,\n exists,\n content: exists ? undefined : `${JSON.stringify(data, null, 2)}\\n`,\n });\n }\n }\n\n const gateway = new MutationGateway(context, context.cwd);\n await gateway.mkdir(targetDirectory, {\n role: \"component-directory\",\n resource: \"directory\",\n detail: area ? { area } : undefined,\n });\n await gateway.write(componentFile, componentContent, {\n role: \"ui-component\",\n preserveExisting: true,\n detail: area ? { area } : undefined,\n });\n for (const item of preparedMessages) {\n if (item.exists) {\n gateway.unchanged(item.target, {\n role: \"translation-messages\",\n detail: {\n ...(area ? { area } : {}),\n locale: item.locale,\n key: `${translationNamespace}.${componentNameUpper}`,\n },\n });\n } else {\n await gateway.write(item.target, item.content!, {\n role: \"translation-messages\",\n detail: {\n ...(area ? { area } : {}),\n locale: item.locale,\n key: `${translationNamespace}.${componentNameUpper}`,\n },\n });\n }\n }\n\n const mutated = context.operations\n .snapshot()\n .some((event) => event.action === \"created\" || event.action === \"updated\");\n return commandResult(context, {\n command: \"addcomponent\",\n summary: mutated\n ? `Added component \"${componentNameUpper}\" ${pageScope ? `to ${area} page \"${pageScope}\"` : \"globally\"}.`\n : pageScope\n ? `Component \"${componentNameUpper}\" already exists on ${area} page \"${pageScope}\" and was preserved.`\n : `Component \"${componentNameUpper}\" already exists and was preserved.`,\n projectRoot: context.cwd,\n data: pageScope\n ? { area, componentName: componentNameUpper, page: pageScope }\n : { componentName: componentNameUpper },\n nextSteps: mutated\n ? [\n {\n kind: \"review\",\n required: true,\n message:\n \"Review the generated component and its localized messages.\",\n paths: [\n { scope: \"project\", path: gateway.path(componentFile) },\n ...preparedMessages.map((item) => ({\n scope: \"project\" as const,\n path: gateway.path(item.target),\n })),\n ],\n },\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ]\n : [],\n });\n};\n","import { join } from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport { loadConfig } from \"./utils\";\n\nfunction generateLocales(): string[] {\n const names = new Intl.DisplayNames([\"en\"], { type: \"language\" });\n const locales: string[] = [];\n for (let first = 0; first < 26; first++) {\n for (let second = 0; second < 26; second++) {\n const code = String.fromCharCode(97 + first, 97 + second);\n try {\n const name = names.of(code);\n if (name && name.toLowerCase() !== code) locales.push(code);\n } catch {\n // Unknown ISO-like codes are not offered.\n }\n }\n }\n return locales.sort();\n}\n\nasync function listFiles(\n context: Parameters<CommandHandler>[1],\n root: string,\n): Promise<string[]> {\n const files: string[] = [];\n async function visit(directory: string, relative = \"\"): Promise<void> {\n for (const entry of await context.fs.list(directory)) {\n const next = relative ? `${relative}/${entry.name}` : entry.name;\n if (entry.isSymbolicLink) {\n throw new CliError(`Symbolic link found in locale source: ${next}`, {\n code: \"UNSAFE_PATH\",\n scope: \"project\",\n path: next,\n });\n }\n if (entry.isDirectory) await visit(join(directory, entry.name), next);\n else if (entry.isFile) files.push(next);\n }\n }\n await visit(root);\n return files.sort();\n}\n\nexport const addLanguage: CommandHandler = async (args, context) => {\n const config = await loadConfig(context);\n if (!config?.useI18n) {\n throw new CliError(\"Internationalization is not enabled in this project.\", {\n code: \"I18N_DISABLED\",\n });\n }\n const messagesRoot = join(context.cwd, \"messages\");\n if (!context.fs.exists(messagesRoot)) {\n throw new CliError(\"The messages directory was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n\n const available = generateLocales();\n let locale = args[1];\n if (!locale) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"Locale is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass a two-letter locale after addlanguage.\",\n });\n }\n const response = await context.prompt<\"locale\">({\n type: \"autocomplete\",\n name: \"locale\",\n message: \"Locale to add:\",\n choices: available.map((value) => ({ title: value, value })),\n });\n locale = String(response.locale ?? \"\");\n if (!locale) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"locale-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"addlanguage\",\n summary: \"Locale creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n }\n parseLogicalName(locale, \"locale\");\n if (!available.includes(locale)) {\n throw new CliError(`Unsupported locale code: ${locale}.`, {\n code: \"INVALID_ARGUMENT\",\n hint: \"Use a recognized two-letter language code.\",\n });\n }\n\n const routingFile = join(context.cwd, \"src\", \"lib\", \"i18n\", \"routing.ts\");\n const registryFile = join(context.cwd, \"src\", \"lib\", \"i18n\", \"messages.ts\");\n if (!context.fs.exists(routingFile) || !context.fs.exists(registryFile)) {\n throw new CliError(\n \"Required i18n routing or registry file was not found.\",\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"src/lib/i18n\",\n },\n );\n }\n\n const routing = await context.fs.readText(routingFile);\n const defaultLocale = routing.match(/defaultLocale:\\s*[\"']([^\"']+)[\"']/)?.[1];\n if (!defaultLocale) {\n throw new CliError(\n \"The default locale could not be resolved from routing.ts.\",\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"src/lib/i18n/routing.ts\",\n },\n );\n }\n const sourceDirectory = join(messagesRoot, defaultLocale);\n const sourceAggregator = join(messagesRoot, `${defaultLocale}.ts`);\n if (!context.fs.exists(sourceDirectory)) {\n throw new CliError(\n `Default locale directory ${defaultLocale} was not found.`,\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${defaultLocale}`,\n },\n );\n }\n if (!context.fs.exists(sourceAggregator)) {\n throw new CliError(\"Default locale aggregator not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${defaultLocale}.ts`,\n });\n }\n const sourceFiles = await listFiles(context, sourceDirectory);\n if (sourceFiles.length === 0) {\n throw new CliError(`Default locale ${defaultLocale} contains no files.`, {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${defaultLocale}`,\n });\n }\n const defaultAggregator = await context.fs.readText(sourceAggregator);\n const importPrefix = `./${defaultLocale}/`;\n if (!defaultAggregator.includes(importPrefix)) {\n throw new CliError(\n `Default aggregator does not import from ${importPrefix}.`,\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${defaultLocale}.ts`,\n },\n );\n }\n\n const localesMatch = routing.match(/locales:\\s*\\[([^\\]]*)\\]/);\n if (!localesMatch) {\n throw new CliError(\"Unable to locate routing locales.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"src/lib/i18n/routing.ts\",\n });\n }\n const routingLocales = localesMatch[1]\n .split(\",\")\n .map((value) => value.trim().replace(/[\"']/g, \"\"))\n .filter(Boolean);\n const registry = await context.fs.readText(registryFile);\n const registryMatch = registry.match(\n /const messages = \\{([^}]*)\\} as const;/,\n );\n if (!registryMatch) {\n throw new CliError(\"Unable to locate the typed messages registry.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"src/lib/i18n/messages.ts\",\n });\n }\n const registeredLocales = registryMatch[1]\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n\n const targetDirectory = join(messagesRoot, locale);\n const targetAggregator = join(messagesRoot, `${locale}.ts`);\n const targetAggregatorExists = context.fs.exists(targetAggregator);\n const targetAggregatorContent = targetAggregatorExists\n ? await context.fs.readText(targetAggregator)\n : \"\";\n const state = {\n directory: context.fs.exists(targetDirectory),\n aggregator: targetAggregatorExists,\n aggregatorImportsLocale: targetAggregatorContent.includes(`./${locale}/`),\n routing: routingLocales.includes(locale),\n registry: registeredLocales.includes(locale),\n registryImport: new RegExp(\n `import\\\\s+${locale}\\\\s+from\\\\s+[\"']\\\\.\\\\.\\\\/\\\\.\\\\.\\\\/\\\\.\\\\.\\\\/messages\\\\/${locale}[\"'];`,\n ).test(registry),\n };\n const present = Object.values(state).filter(Boolean).length;\n const gateway = new MutationGateway(context, context.cwd);\n const missingLocaleFiles = state.directory\n ? sourceFiles.filter(\n (relative) => !context.fs.exists(join(targetDirectory, relative)),\n )\n : sourceFiles;\n if (\n present === Object.keys(state).length &&\n missingLocaleFiles.length === 0\n ) {\n gateway.unchanged(targetDirectory, {\n role: \"locale-directory\",\n resource: \"directory\",\n });\n for (const relative of sourceFiles) {\n gateway.unchanged(join(targetDirectory, relative), {\n role: relative.endsWith(\".json\")\n ? \"translation-messages\"\n : \"locale-file\",\n detail: { locale, sourceLocale: defaultLocale },\n });\n }\n gateway.unchanged(targetAggregator, { role: \"locale-aggregator\" });\n gateway.unchanged(routingFile, { role: \"i18n-routing\" });\n gateway.unchanged(registryFile, { role: \"messages-registry\" });\n return commandResult(context, {\n command: \"addlanguage\",\n summary: `Locale \"${locale}\" is already fully configured.`,\n projectRoot: context.cwd,\n });\n }\n if (present > 0 || missingLocaleFiles.length < sourceFiles.length) {\n throw new CliError(`Locale ${locale} is only partially configured.`, {\n code: \"INCONSISTENT_LOCALE\",\n scope: \"project\",\n path: `messages/${locale}`,\n hint: `Observed state: ${JSON.stringify({ ...state, missingLocaleFiles })}.`,\n });\n }\n\n const nextAggregator = defaultAggregator.replaceAll(\n importPrefix,\n `./${locale}/`,\n );\n const nextRouting = routing.replace(\n /locales:\\s*\\[[^\\]]*\\]/,\n `locales: [${[...routingLocales, locale].map((value) => `\"${value}\"`).join(\", \")}]`,\n );\n const declarationIndex = registry.indexOf(\"const messages =\");\n const nextRegistry =\n registry.slice(0, declarationIndex) +\n `import ${locale} from \"../../../messages/${locale}\";\\n\\n` +\n registry\n .slice(declarationIndex)\n .replace(\n /const messages = \\{[^}]*\\} as const;/,\n `const messages = { ${[...registeredLocales, locale].join(\", \")} } as const;`,\n );\n\n await assertSafeTarget(context.cwd, targetDirectory, context.fs);\n await gateway.mkdir(targetDirectory, {\n role: \"locale-directory\",\n resource: \"directory\",\n detail: { locale, sourceLocale: defaultLocale },\n });\n for (const relative of sourceFiles) {\n const source = join(sourceDirectory, relative);\n const target = join(targetDirectory, relative);\n await gateway.copy(source, target, {\n role: relative.endsWith(\".json\") ? \"translation-messages\" : \"locale-file\",\n source: { scope: \"project\", path: gateway.path(source) },\n detail: { locale, sourceLocale: defaultLocale },\n });\n }\n await gateway.write(targetAggregator, nextAggregator, {\n role: \"locale-aggregator\",\n });\n await gateway.write(registryFile, nextRegistry, {\n role: \"messages-registry\",\n });\n await gateway.write(routingFile, nextRouting, { role: \"i18n-routing\" });\n\n const translationPaths = sourceFiles\n .filter((relative) => relative.endsWith(\".json\"))\n .map((relative) => ({\n scope: \"project\" as const,\n path: gateway.path(join(targetDirectory, relative)),\n }));\n return commandResult(context, {\n command: \"addlanguage\",\n summary: `Added locale \"${locale}\" by copying ${sourceFiles.length} files from \"${defaultLocale}\".`,\n projectRoot: context.cwd,\n nextSteps: [\n {\n kind: \"translate\",\n required: true,\n message: `Translate every copied message from ${defaultLocale} to ${locale}; the copied text is not ready for delivery.`,\n paths: translationPaths,\n },\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ],\n });\n};\n","import { join } from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport { capitalize, loadConfig, toIdentifier } from \"./utils\";\n\nexport const addLib: CommandHandler = async (args, context) => {\n let libArg = args[1];\n if (!libArg || libArg.startsWith(\"-\")) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"Library name is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass library or library.module after addlib.\",\n });\n }\n const response = await context.prompt<\"libArg\">({\n type: \"text\",\n name: \"libArg\",\n message: \"Library name to add:\",\n validate: (name: string) => (name ? true : \"Library name is required\"),\n });\n libArg = String(response.libArg ?? \"\");\n if (!libArg) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"library-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"addlib\",\n summary: \"Library creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n }\n const segments = parseLogicalName(libArg, \"library name\");\n if (segments.length > 2) {\n throw new CliError(\"Libraries support exactly library or library.module.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n const [libName, fileName] = segments;\n if (!(await loadConfig(context))) {\n throw new CliError(\"Configuration file cnp.config.json was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n hint: \"Run this command from the generated project root.\",\n });\n }\n\n const libDir = join(context.cwd, \"src\", \"lib\", libName);\n await assertSafeTarget(context.cwd, libDir, context.fs);\n const gateway = new MutationGateway(context, context.cwd);\n const templateDir = join(context.packageRoot, \"templates\", \"Lib\");\n const indexTemplate = join(templateDir, \"index.ts\");\n const itemTemplate = join(templateDir, \"item.ts\");\n if (\n !context.fs.exists(indexTemplate) ||\n (fileName && !context.fs.exists(itemTemplate))\n ) {\n throw new CliError(\"Required library template files were not found.\", {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: \"templates/Lib\",\n });\n }\n\n await gateway.mkdir(libDir, {\n role: \"library-directory\",\n resource: \"directory\",\n });\n const indexPath = join(libDir, \"index.ts\");\n if (!context.fs.exists(indexPath)) {\n await gateway.write(indexPath, await context.fs.readText(indexTemplate), {\n role: \"library-index\",\n });\n }\n\n let moduleAction: \"created\" | \"updated\" | \"unchanged\" | undefined;\n if (fileName) {\n const moduleIdentifier = toIdentifier(fileName);\n const modulePath = join(libDir, `${fileName}.ts`);\n const moduleContent = (await context.fs.readText(itemTemplate))\n .replace(/template/g, moduleIdentifier)\n .replace(/Template/g, capitalize(moduleIdentifier));\n moduleAction = await gateway.write(modulePath, moduleContent, {\n role: \"library-module\",\n preserveExisting: true,\n });\n\n const currentIndex = await context.fs.readText(indexPath);\n const importLine = `import { ${moduleIdentifier} } from \"./${fileName}\";`;\n const importRegex = new RegExp(\n `import\\\\s*{\\\\s*${moduleIdentifier}\\\\s*}\\\\s*from\\\\s*[\"']\\\\./${fileName}[\"'];`,\n );\n const exportRegex = /export\\s*{([^}]*)}/m;\n const imports = currentIndex\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"import\"));\n const exportMatch = currentIndex.match(exportRegex);\n const exportsSet = (exportMatch?.[1] ?? \"\")\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n if (!imports.some((line) => importRegex.test(line)))\n imports.push(importLine);\n if (!exportsSet.includes(moduleIdentifier))\n exportsSet.push(moduleIdentifier);\n const nextIndex = `${imports.join(\"\\n\")}\\n\\nexport { ${exportsSet.join(\", \")} };\\n`;\n await gateway.write(indexPath, nextIndex, { role: \"library-index\" });\n } else if (context.fs.exists(indexPath)) {\n gateway.unchanged(indexPath, { role: \"library-index\" });\n }\n\n const mutated = context.operations\n .snapshot()\n .some((event) =>\n [\"created\", \"updated\", \"copied\", \"deleted\"].includes(event.action),\n );\n const nextSteps = [];\n if (fileName && moduleAction !== \"unchanged\") {\n nextSteps.push({\n kind: \"review\" as const,\n required: true,\n message: \"Implement and review the generated library module.\",\n paths: [\n {\n scope: \"project\" as const,\n path: gateway.path(join(libDir, `${fileName}.ts`)),\n },\n ],\n });\n }\n if (mutated) {\n nextSteps.push({\n kind: \"run-checks\" as const,\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n });\n }\n return commandResult(context, {\n command: \"addlib\",\n summary: mutated\n ? `Added library \"${libName}\"${fileName ? ` with module \"${fileName}\"` : \"\"}.`\n : `Library \"${libName}\"${fileName ? ` and module \"${fileName}\"` : \"\"} already exist and were preserved.`,\n projectRoot: context.cwd,\n nextSteps,\n });\n};\n","import { join } from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport {\n assertConsistentLogicalRoute,\n discoverPageCatalog,\n} from \"../core/page-catalog\";\nimport {\n areaRouteGroup,\n parseAreaOption,\n requirePageArea,\n type PageArea,\n} from \"../core/page-area\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport {\n capitalize,\n configuredAliasPrefix,\n loadConfig,\n toFileName,\n toIdentifier,\n} from \"./utils\";\n\nconst LONG_FLAGS = [\n \"layout\",\n \"page\",\n \"loading\",\n \"not-found\",\n \"error\",\n \"global-error\",\n \"route\",\n \"template\",\n \"default\",\n] as const;\n\nconst SHORT_FLAGS: Record<string, (typeof LONG_FLAGS)[number]> = {\n L: \"layout\",\n P: \"page\",\n l: \"loading\",\n n: \"not-found\",\n e: \"error\",\n g: \"global-error\",\n r: \"route\",\n t: \"template\",\n d: \"default\",\n};\n\nfunction registerMessagesFile(\n content: string,\n locale: string,\n fileName: string,\n): string {\n const importPath = `./${locale}/${fileName}.json`;\n const declarationIndex = content.indexOf(\"const messages =\");\n const registryMatch = content.match(/const messages = \\{([\\s\\S]*?)\\n\\};/);\n if (declarationIndex < 0 || !registryMatch) {\n throw new CliError(\n `Unable to register ${fileName}.json in messages/${locale}.ts.`,\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${locale}.ts`,\n },\n );\n }\n const identifier = toIdentifier(fileName);\n const property =\n identifier === fileName\n ? ` ${identifier},`\n : ` ${JSON.stringify(fileName)}: ${identifier},`;\n if (content.includes(importPath)) {\n if (registryMatch[1].split(/\\r?\\n/).includes(property)) return content;\n const legacyProperty = new RegExp(`^\\\\s*${identifier},\\\\s*$`, \"m\");\n if (legacyProperty.test(registryMatch[1])) {\n return content.replace(legacyProperty, property);\n }\n const nextRegistry = registryMatch[0].replace(\n /\\n\\};$/,\n `\\n${property}\\n};`,\n );\n return content.replace(registryMatch[0], nextRegistry);\n }\n const importStatement = `import ${identifier} from \"${importPath}\";\\n`;\n const nextRegistry = registryMatch[0].replace(/\\n\\};$/, `\\n${property}\\n};`);\n return (\n content.slice(0, declarationIndex) +\n importStatement +\n content.slice(declarationIndex).replace(registryMatch[0], nextRegistry)\n );\n}\n\nfunction selectedFlags(optionArguments: string[]): Set<string> {\n const selected = new Set<string>();\n if (optionArguments.length === 0)\n return new Set([\"layout\", \"page\", \"loading\"]);\n for (const argument of optionArguments) {\n if (argument.startsWith(\"--\")) {\n const flag = argument.slice(2);\n if (!(LONG_FLAGS as readonly string[]).includes(flag)) {\n throw new CliError(`Unknown addpage option: ${argument}.`, {\n code: \"INVALID_ARGUMENT\",\n });\n }\n selected.add(flag);\n continue;\n }\n for (const character of argument.slice(1)) {\n const flag = SHORT_FLAGS[character];\n if (!flag) {\n throw new CliError(`Unknown addpage short option: -${character}.`, {\n code: \"INVALID_ARGUMENT\",\n });\n }\n selected.add(flag);\n }\n }\n return selected;\n}\n\ntype ParsedAddPageArguments = {\n area?: PageArea;\n logicalName?: string;\n flags: Set<string>;\n};\n\nfunction parseAddPageArguments(args: string[]): ParsedAddPageArguments {\n const parsedArea = parseAreaOption(args);\n let logicalName: string | undefined;\n const optionArguments: string[] = [];\n for (const argument of parsedArea.args.slice(1)) {\n if (argument.startsWith(\"-\")) {\n optionArguments.push(argument);\n continue;\n }\n if (logicalName) {\n throw new CliError(`Unexpected addpage argument: ${argument}.`, {\n code: \"INVALID_ARGUMENT\",\n });\n }\n logicalName = argument;\n }\n return {\n area: parsedArea.area,\n logicalName,\n flags: selectedFlags(optionArguments),\n };\n}\n\ntype PreparedLocale = {\n locale: string;\n target: string;\n targetContent?: string;\n messageExists: boolean;\n aggregator: string;\n aggregatorContent: string;\n};\n\nexport const addPage: CommandHandler = async (args, context) => {\n const parsed = parseAddPageArguments(args);\n let { area, logicalName } = parsed;\n if (!logicalName) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"Page name is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass a simple or Parent.Child page name after addpage.\",\n });\n }\n const questions = [\n {\n type: \"text\",\n name: \"pageName\" as const,\n message: \"Page name to add:\",\n validate: (name: string) => (name ? true : \"Page name is required\"),\n },\n ...(!area\n ? [\n {\n type: \"select\",\n name: \"area\" as const,\n message: \"Page area:\",\n choices: [\n { title: \"public\", value: \"public\" },\n { title: \"user\", value: \"user\" },\n ],\n },\n ]\n : []),\n ];\n const response = await context.prompt<\"pageName\" | \"area\">(questions);\n logicalName = String(response.pageName ?? \"\");\n area = area ?? (response.area as PageArea | undefined);\n if (!logicalName || !area) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"page-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"addpage\",\n summary: \"Page creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n } else {\n area = requirePageArea(area, \"addpage\");\n }\n area = requirePageArea(area, \"addpage\");\n const pageSegments = parseLogicalName(logicalName, \"page name\");\n if (pageSegments.length > 2) {\n throw new CliError(\"Nested pages support exactly Parent.Child.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n const flags = parsed.flags;\n const config = await loadConfig(context);\n if (!config) {\n throw new CliError(\"Configuration file cnp.config.json was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n hint: \"Run this command from the generated project root.\",\n });\n }\n\n const useI18n = Boolean(config.useI18n);\n const aliasPrefix = configuredAliasPrefix(config);\n const appRoot = join(\n context.cwd,\n \"src\",\n \"app\",\n ...(useI18n ? [\"[locale]\"] : []),\n );\n if (!context.fs.exists(appRoot)) {\n throw new CliError(\"The expected App Router directory was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: useI18n ? \"src/app/[locale]\" : \"src/app\",\n });\n }\n const areaRoot = join(appRoot, areaRouteGroup(area));\n if (!context.fs.exists(areaRoot)) {\n throw new CliError(`The ${area} page area was not found.`, {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: join(\n useI18n ? \"src/app/[locale]\" : \"src/app\",\n areaRouteGroup(area),\n ),\n });\n }\n\n const [parentName, childName] =\n pageSegments.length === 2 ? pageSegments : [undefined, undefined];\n const leafName = childName ?? pageSegments[0];\n const pageIdentifier = capitalize(toIdentifier(leafName));\n const jsonFileName = parentName ?? leafName;\n const uiDirectory = join(context.cwd, \"src\", \"ui\", ...pageSegments);\n const routeDirectory = join(areaRoot, ...pageSegments);\n const catalog = await discoverPageCatalog(context.cwd, context.fs);\n assertConsistentLogicalRoute(catalog, logicalName);\n const existingOtherArea = catalog.candidates.find(\n (candidate) =>\n candidate.logicalName === logicalName && candidate.area !== area,\n );\n const otherArea: PageArea = area === \"public\" ? \"user\" : \"public\";\n const otherAreaDirectory = join(\n appRoot,\n areaRouteGroup(otherArea),\n ...pageSegments,\n );\n if (existingOtherArea || context.fs.exists(otherAreaDirectory)) {\n throw new CliError(\n `Page \"${logicalName}\" already belongs to the ${otherArea} area.`,\n {\n code: \"TARGET_EXISTS\",\n scope: \"project\",\n path: join(\n useI18n ? \"src/app/[locale]\" : \"src/app\",\n areaRouteGroup(otherArea),\n ...pageSegments,\n ),\n },\n );\n }\n const legacyDirectory = join(appRoot, ...pageSegments);\n if (context.fs.exists(legacyDirectory)) {\n throw new CliError(`Page route \"${logicalName}\" is ungrouped.`, {\n code: \"INCONSISTENT_ROUTE\",\n scope: \"project\",\n path: join(useI18n ? \"src/app/[locale]\" : \"src/app\", ...pageSegments),\n hint: \"Move the route into exactly one of the (public) or (user) areas before retrying.\",\n });\n }\n await assertSafeTarget(context.cwd, uiDirectory, context.fs);\n await assertSafeTarget(context.cwd, routeDirectory, context.fs);\n\n const templateRoot = join(context.packageRoot, \"templates\", \"Page\");\n const uiTemplate = join(\n templateRoot,\n area === \"user\" ? \"page-ui.user.tsx\" : \"page-ui.tsx\",\n );\n const routeTemplates = [...flags].map((flag) => ({\n flag,\n source: join(templateRoot, toFileName(flag)),\n }));\n const messagesTemplate = join(templateRoot, \"page.json\");\n const requiredTemplates = [\n uiTemplate,\n ...routeTemplates.map((entry) => entry.source),\n ];\n if (useI18n) requiredTemplates.push(messagesTemplate);\n const missing = requiredTemplates.find(\n (target) => !context.fs.exists(target),\n );\n if (missing) {\n throw new CliError(`Required page template was not found: ${missing}.`, {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: missing.replace(`${context.packageRoot}/`, \"\"),\n });\n }\n\n const translationNamespace = parentName\n ? `${parentName}.${childName}`\n : leafName;\n const templateJson = useI18n\n ? JSON.parse(\n (await context.fs.readText(messagesTemplate))\n .replace(/template/g, leafName)\n .replace(/Template/g, capitalize(leafName)),\n )\n : undefined;\n const preparedLocales: PreparedLocale[] = [];\n if (useI18n) {\n const messagesRoot = join(context.cwd, \"messages\");\n if (!context.fs.exists(messagesRoot)) {\n throw new CliError(\"The messages directory was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n await assertSafeTarget(context.cwd, messagesRoot, context.fs);\n const locales = (await context.fs.list(messagesRoot))\n .filter((entry) => entry.isDirectory)\n .map((entry) => entry.name)\n .sort();\n if (locales.length === 0) {\n throw new CliError(\"No locale directories were found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n for (const locale of locales) {\n const target = join(messagesRoot, locale, `${jsonFileName}.json`);\n const aggregator = join(messagesRoot, `${locale}.ts`);\n await assertSafeTarget(context.cwd, target, context.fs);\n await assertSafeTarget(context.cwd, aggregator, context.fs);\n if (!context.fs.exists(aggregator)) {\n throw new CliError(\n `Locale aggregator messages/${locale}.ts was not found.`,\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${locale}.ts`,\n },\n );\n }\n let data: Record<string, unknown> = {};\n const targetExists = context.fs.exists(target);\n if (targetExists) {\n try {\n data = JSON.parse(await context.fs.readText(target)) as Record<\n string,\n unknown\n >;\n } catch {\n throw new CliError(\n `Invalid JSON in messages/${locale}/${jsonFileName}.json.`,\n {\n code: \"FILESYSTEM_ERROR\",\n scope: \"project\",\n path: `messages/${locale}/${jsonFileName}.json`,\n },\n );\n }\n }\n const messageExists = parentName\n ? Object.hasOwn(data, childName!)\n : targetExists;\n if (!messageExists) {\n if (parentName) data[childName!] = templateJson;\n else data = templateJson as Record<string, unknown>;\n }\n const aggregatorCurrent = await context.fs.readText(aggregator);\n preparedLocales.push({\n locale,\n target,\n targetContent: messageExists\n ? undefined\n : `${JSON.stringify(data, null, 2)}\\n`,\n messageExists,\n aggregator,\n aggregatorContent: registerMessagesFile(\n aggregatorCurrent,\n locale,\n jsonFileName,\n ),\n });\n }\n }\n\n const gateway = new MutationGateway(context, context.cwd);\n await gateway.mkdir(uiDirectory, {\n role: \"page-ui-directory\",\n resource: \"directory\",\n detail: { area },\n });\n const uiFile = join(uiDirectory, \"page-ui.tsx\");\n const uiContent = (await context.fs.readText(uiTemplate))\n .replace(\n 'useTranslations(\"template\")',\n `useTranslations(\"${translationNamespace}\")`,\n )\n .replaceAll('from \"@/', `from \"${aliasPrefix}/`)\n .replace(/template/g, pageIdentifier)\n .replace(/Template/g, pageIdentifier);\n await gateway.write(uiFile, uiContent, {\n role: \"page-ui\",\n preserveExisting: true,\n detail: { area },\n });\n\n await gateway.mkdir(routeDirectory, {\n role: \"page-route-directory\",\n resource: \"directory\",\n detail: { area },\n });\n for (const template of routeTemplates) {\n const filename = toFileName(template.flag);\n const target = join(routeDirectory, filename);\n const uiImportPath = pageSegments.join(\"/\");\n const content = (await context.fs.readText(template.source))\n .replace(\"@/ui/template/\", `@/ui/${uiImportPath}/`)\n .replaceAll('from \"@/', `from \"${aliasPrefix}/`)\n .replace(/template/g, pageIdentifier)\n .replace(/Template/g, pageIdentifier);\n await gateway.write(target, content, {\n role: `page-${template.flag}`,\n preserveExisting: true,\n detail: { area },\n });\n }\n\n if (useI18n) {\n for (const item of preparedLocales) {\n if (item.messageExists) {\n gateway.unchanged(item.target, {\n role: \"translation-messages\",\n detail: {\n area,\n locale: item.locale,\n namespace: translationNamespace,\n },\n });\n } else {\n await gateway.write(item.target, item.targetContent!, {\n role: \"translation-messages\",\n detail: {\n area,\n locale: item.locale,\n namespace: translationNamespace,\n },\n });\n }\n await gateway.write(item.aggregator, item.aggregatorContent, {\n role: \"locale-aggregator\",\n detail: { area },\n });\n }\n } else {\n gateway.skipped(join(context.cwd, \"messages\"), {\n role: \"translation-messages\",\n resource: \"directory\",\n detail: { area, reason: \"Internationalization is disabled.\" },\n });\n }\n\n const mutated = context.operations\n .snapshot()\n .some((event) =>\n [\"created\", \"updated\", \"copied\", \"deleted\"].includes(event.action),\n );\n const reviewPaths = [\n { scope: \"project\" as const, path: gateway.path(uiFile) },\n ...routeTemplates.map((template) => ({\n scope: \"project\" as const,\n path: gateway.path(join(routeDirectory, toFileName(template.flag))),\n })),\n ...preparedLocales.map((item) => ({\n scope: \"project\" as const,\n path: gateway.path(item.target),\n })),\n ];\n return commandResult(context, {\n command: \"addpage\",\n summary: mutated\n ? `Added ${area} page \"${logicalName}\" and its missing resources.`\n : `${area[0].toUpperCase()}${area.slice(1)} page \"${logicalName}\" already exists and was preserved.`,\n projectRoot: context.cwd,\n data: { area, logicalName },\n nextSteps: mutated\n ? [\n {\n kind: \"review\",\n required: true,\n message:\n \"Review the generated page UI, route files and localized messages.\",\n paths: reviewPaths,\n },\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ]\n : [],\n });\n};\n","import { join } from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\nimport { loadConfig } from \"./utils\";\n\nfunction defaultText(key: string): string {\n return key\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (character) => character.toUpperCase());\n}\n\ntype PreparedTextFile = {\n locale: string;\n file: string;\n data: Record<string, unknown>;\n replaced: boolean;\n};\n\nexport const addText: CommandHandler = async (args, context) => {\n const pathArg = args[1];\n if (!pathArg) {\n throw new CliError(\"Translation dot path is required.\", {\n code: \"INVALID_ARGUMENT\",\n hint: \"Use addtext domain.key followed by an optional value.\",\n });\n }\n const segments = parseLogicalName(pathArg, \"translation path\");\n if (segments.length < 2) {\n throw new CliError(\"Translation path must contain a file and a key.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n const providedText = args.slice(2).join(\" \");\n const finalKey = segments.at(-1)!;\n const text = providedText || defaultText(finalKey);\n\n const config = await loadConfig(context);\n if (!config?.useI18n) {\n throw new CliError(\"Internationalization is not enabled in this project.\", {\n code: \"I18N_DISABLED\",\n });\n }\n const messagesRoot = join(context.cwd, \"messages\");\n if (!context.fs.exists(messagesRoot)) {\n throw new CliError(\"The messages directory was not found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n const locales = (await context.fs.list(messagesRoot))\n .filter((entry) => entry.isDirectory)\n .map((entry) => entry.name)\n .sort();\n if (locales.length === 0) {\n throw new CliError(\"No locale directories were found.\", {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: \"messages\",\n });\n }\n\n const [fileName, ...keySegments] = segments;\n const prepared: PreparedTextFile[] = [];\n for (const locale of locales) {\n const file = join(messagesRoot, locale, `${fileName}.json`);\n await assertSafeTarget(context.cwd, file, context.fs);\n const existed = context.fs.exists(file);\n let data: Record<string, unknown> = {};\n if (existed) {\n try {\n const parsed = JSON.parse(await context.fs.readText(file)) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"root value is not an object\");\n }\n data = parsed as Record<string, unknown>;\n } catch (error) {\n throw new CliError(\n `Invalid JSON in messages/${locale}/${fileName}.json.`,\n {\n code: \"FILESYSTEM_ERROR\",\n scope: \"project\",\n path: `messages/${locale}/${fileName}.json`,\n hint: error instanceof Error ? error.message : undefined,\n },\n );\n }\n }\n let cursor = data;\n for (const segment of keySegments.slice(0, -1)) {\n const current = cursor[segment];\n if (current === undefined) cursor[segment] = {};\n else if (\n !current ||\n typeof current !== \"object\" ||\n Array.isArray(current)\n ) {\n throw new CliError(\n `Translation segment \"${segment}\" is not an object in ${locale}.`,\n {\n code: \"INVALID_ARGUMENT\",\n scope: \"project\",\n path: `messages/${locale}/${fileName}.json`,\n },\n );\n }\n cursor = cursor[segment] as Record<string, unknown>;\n }\n const previous = cursor[finalKey];\n cursor[finalKey] = text;\n prepared.push({\n locale,\n file,\n data,\n replaced: previous !== undefined && previous !== text,\n });\n }\n\n const gateway = new MutationGateway(context, context.cwd);\n for (const item of prepared) {\n await gateway.write(item.file, `${JSON.stringify(item.data, null, 2)}\\n`, {\n role: \"translation-messages\",\n detail: {\n locale: item.locale,\n key: pathArg,\n replaced: item.replaced,\n },\n });\n }\n const mutated = context.operations\n .snapshot()\n .some((event) => event.action === \"created\" || event.action === \"updated\");\n const nextSteps = mutated\n ? [\n ...(locales.length > 1\n ? [\n {\n kind: \"translate\" as const,\n required: true,\n message:\n \"Review the value in every locale; the same text was written to all locale files.\",\n paths: prepared.map((item) => ({\n scope: \"project\" as const,\n path: gateway.path(item.file),\n })),\n },\n ]\n : []),\n {\n kind: \"run-checks\" as const,\n required: true,\n message: \"Run the project checks.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ]\n : [];\n return commandResult(context, {\n command: \"addtext\",\n summary: mutated\n ? `Set translation \"${pathArg}\" to \"${text}\" in ${locales.length} locale files.`\n : `Translation \"${pathArg}\" already has value \"${text}\" in every locale.`,\n projectRoot: context.cwd,\n nextSteps,\n });\n};\n","import path from \"node:path\";\n\nimport { CliError, type CommandHandler } from \"../core/contracts\";\nimport { commandResult, MutationGateway } from \"../core/operations\";\nimport {\n discoverPageCatalog,\n resolvePageCandidate,\n type PageCandidate,\n} from \"../core/page-catalog\";\nimport {\n parseAreaOption,\n requirePageArea,\n type PageArea,\n} from \"../core/page-area\";\nimport {\n assertSafeTarget,\n parseLogicalName,\n resolveInside,\n} from \"../core/project-paths\";\nimport { toIdentifier } from \"./utils\";\n\ntype PreparedMessageRemoval = {\n target: string;\n content?: string;\n keyPresent: boolean;\n};\n\ntype PreparedAggregatorUpdate = {\n target: string;\n content: string;\n changed: boolean;\n};\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction unregisterMessagesFile(\n content: string,\n locale: string,\n fileName: string,\n): { content: string; changed: boolean } {\n const identifier = toIdentifier(fileName);\n const escapedIdentifier = escapeRegExp(identifier);\n const escapedFileName = escapeRegExp(fileName);\n const escapedPath = escapeRegExp(`./${locale}/${fileName}.json`);\n const importPattern = new RegExp(\n `^import\\\\s+${escapedIdentifier}\\\\s+from\\\\s+[\"']${escapedPath}[\"'];?\\\\r?\\\\n?`,\n \"m\",\n );\n const propertyExpression =\n identifier === fileName\n ? escapedIdentifier\n : `(?:[\"']${escapedFileName}[\"']\\\\s*:\\\\s*)?${escapedIdentifier}`;\n const propertyPattern = new RegExp(\n `^\\\\s*${propertyExpression},\\\\s*\\\\r?\\\\n?`,\n \"m\",\n );\n const hasImport = importPattern.test(content);\n const hasProperty = propertyPattern.test(content);\n if (hasImport !== hasProperty) {\n throw new CliError(\n `Locale aggregator messages/${locale}.ts is inconsistent for ${fileName}.json.`,\n {\n code: \"INCONSISTENT_LOCALE\",\n scope: \"project\",\n path: `messages/${locale}.ts`,\n },\n );\n }\n if (!hasImport) return { content, changed: false };\n return {\n content: content.replace(importPattern, \"\").replace(propertyPattern, \"\"),\n changed: true,\n };\n}\n\nfunction parseRmPageArguments(args: string[]): {\n area?: PageArea;\n logicalName?: string;\n} {\n const parsedArea = parseAreaOption(args);\n let logicalName: string | undefined;\n for (const argument of parsedArea.args.slice(1)) {\n if (argument.startsWith(\"-\")) {\n throw new CliError(`Unknown rmpage option: ${argument}.`, {\n code: \"INVALID_ARGUMENT\",\n });\n }\n if (logicalName) {\n throw new CliError(`Unexpected rmpage argument: ${argument}.`, {\n code: \"INVALID_ARGUMENT\",\n });\n }\n logicalName = argument;\n }\n return { area: parsedArea.area, logicalName };\n}\n\nexport const rmPage: CommandHandler = async (args, context) => {\n const parsed = parseRmPageArguments(args);\n const catalog = await discoverPageCatalog(context.cwd, context.fs);\n let { area, logicalName } = parsed;\n let candidate: PageCandidate;\n if (!logicalName) {\n if (context.outputMode === \"json\") {\n throw new CliError(\"Page name is required in JSON mode.\", {\n code: \"INTERACTIVE_INPUT_REQUIRED\",\n hint: \"Pass a page name returned by completion after rmpage.\",\n });\n }\n const candidates = area\n ? catalog.candidates.filter((entry) => entry.area === area)\n : catalog.candidates;\n if (candidates.length === 0) {\n const issue = catalog.issues[0];\n if (issue) {\n throw new CliError(\n `Page route \"${issue.logicalName}\" is inconsistent.`,\n {\n code: \"INCONSISTENT_ROUTE\",\n scope: \"project\",\n path: issue.routeDirectories.join(\", \"),\n hint: \"Move the route into exactly one of the (public) or (user) areas before retrying.\",\n },\n );\n }\n throw new CliError(\n area\n ? `No pages were found in the ${area} area.`\n : \"No removable pages were found.\",\n { code: \"TARGET_NOT_FOUND\", scope: \"project\", path: \".\" },\n );\n }\n const selected = await context.prompt<\"page\" | \"confirm\">([\n {\n type: \"autocomplete\",\n name: \"page\",\n message: \"Page to remove:\",\n choices: candidates.map((candidate) => ({\n title: `${candidate.area[0].toUpperCase()}${candidate.area.slice(1)} > ${candidate.logicalName.replaceAll(\".\", \" > \")}`,\n value: candidate.id,\n })),\n },\n {\n type: (value: string) => (value ? \"confirm\" : null),\n name: \"confirm\",\n message: \"Confirm page deletion?\",\n initial: false,\n },\n ]);\n const selectedId = String(selected.page ?? \"\");\n const selectedCandidate = candidates.find(\n (entry) => entry.id === selectedId,\n );\n if (!selected.confirm) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"page-removal\",\n scope: \"project\",\n path: \".\",\n detail: selectedCandidate\n ? { area: selectedCandidate.area }\n : area\n ? { area }\n : undefined,\n });\n return commandResult(context, {\n command: \"rmpage\",\n summary: selectedCandidate\n ? `Deletion of ${selectedCandidate.area} page \"${selectedCandidate.logicalName}\" was cancelled.`\n : area\n ? `Page deletion in the ${area} area was cancelled.`\n : \"Page deletion was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n data: selectedCandidate\n ? {\n area: selectedCandidate.area,\n logicalName: selectedCandidate.logicalName,\n }\n : area\n ? { area }\n : undefined,\n });\n }\n if (!selectedCandidate) {\n throw new CliError(\"The selected page is not in the page catalog.\", {\n code: \"INVALID_ARGUMENT\",\n });\n }\n candidate = selectedCandidate;\n logicalName = candidate.logicalName;\n area = candidate.area;\n } else {\n area = requirePageArea(area, \"rmpage\");\n parseLogicalName(logicalName, \"page name\");\n candidate = resolvePageCandidate(catalog, logicalName, area);\n }\n\n area = requirePageArea(area, \"rmpage\");\n\n const messagesRoot = resolveInside(context.cwd, \"messages\");\n await assertSafeTarget(context.cwd, candidate.uiDirectory, context.fs);\n await assertSafeTarget(context.cwd, candidate.routeDirectory, context.fs);\n const preparedMessages: PreparedMessageRemoval[] = [];\n const preparedAggregators: PreparedAggregatorUpdate[] = [];\n if (context.fs.exists(messagesRoot)) {\n await assertSafeTarget(context.cwd, messagesRoot, context.fs);\n const locales = (await context.fs.list(messagesRoot))\n .filter((entry) => entry.isDirectory)\n .map((entry) => entry.name)\n .sort();\n for (const locale of locales) {\n const target = resolveInside(\n context.cwd,\n \"messages\",\n locale,\n `${candidate.routeSegments[0]}.json`,\n );\n await assertSafeTarget(context.cwd, target, context.fs);\n if (!candidate.messageKey) {\n const aggregator = resolveInside(\n context.cwd,\n \"messages\",\n `${locale}.ts`,\n );\n await assertSafeTarget(context.cwd, aggregator, context.fs);\n if (!context.fs.exists(aggregator)) {\n throw new CliError(\n `Locale aggregator messages/${locale}.ts was not found.`,\n {\n code: \"CONFIG_NOT_FOUND\",\n scope: \"project\",\n path: `messages/${locale}.ts`,\n },\n );\n }\n const nextAggregator = unregisterMessagesFile(\n await context.fs.readText(aggregator),\n locale,\n candidate.routeSegments[0],\n );\n preparedMessages.push({\n target,\n keyPresent: context.fs.exists(target),\n });\n preparedAggregators.push({\n target: aggregator,\n ...nextAggregator,\n });\n continue;\n }\n if (!context.fs.exists(target)) continue;\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(await context.fs.readText(target)) as Record<\n string,\n unknown\n >;\n } catch {\n throw new CliError(\n `Invalid JSON prevents removal from ${path.relative(context.cwd, target)}.`,\n {\n code: \"FILESYSTEM_ERROR\",\n scope: \"project\",\n path: path.relative(context.cwd, target),\n },\n );\n }\n const keyPresent = Object.hasOwn(data, candidate.messageKey);\n if (keyPresent) delete data[candidate.messageKey];\n preparedMessages.push({\n target,\n keyPresent,\n content: `${JSON.stringify(data, null, 2)}\\n`,\n });\n }\n }\n\n const gateway = new MutationGateway(context, context.cwd);\n for (const prepared of preparedMessages) {\n if (!candidate.messageKey) {\n await gateway.remove(prepared.target, {\n role: \"translation-messages\",\n detail: { area },\n });\n } else if (prepared.keyPresent) {\n await gateway.write(prepared.target, prepared.content!, {\n role: \"translation-messages\",\n detail: { area, removedKey: candidate.messageKey },\n });\n } else {\n gateway.unchanged(prepared.target, {\n role: \"translation-messages\",\n detail: { area, missingKey: candidate.messageKey },\n });\n }\n }\n for (const prepared of preparedAggregators) {\n if (prepared.changed) {\n await gateway.write(prepared.target, prepared.content, {\n role: \"locale-aggregator\",\n detail: { area },\n });\n } else {\n gateway.unchanged(prepared.target, {\n role: \"locale-aggregator\",\n detail: { area },\n });\n }\n }\n await gateway.remove(\n candidate.uiDirectory,\n {\n role: \"page-ui\",\n resource: \"directory\",\n detail: { area },\n },\n { recursive: true, force: false },\n );\n await gateway.remove(\n candidate.routeDirectory,\n {\n role: \"page-route\",\n resource: \"directory\",\n detail: { area },\n },\n { recursive: true, force: false },\n );\n\n const mutated = context.operations\n .snapshot()\n .some((event) => event.action === \"deleted\" || event.action === \"updated\");\n return commandResult(context, {\n command: \"rmpage\",\n summary: mutated\n ? `Deleted ${area} page \"${logicalName}\" and its associated resources.`\n : `No resources remained for ${area} page \"${logicalName}\".`,\n projectRoot: context.cwd,\n data: { area, logicalName },\n nextSteps: mutated\n ? [\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the project checks after removing the page.\",\n paths: [],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n ]\n : [],\n });\n};\n","import type { CommandHandler } from \"../core/contracts\";\nimport { addApi } from \"../lib/addApi\";\nimport { addComponent } from \"../lib/addComponent\";\nimport { addLanguage } from \"../lib/addLanguage\";\nimport { addLib } from \"../lib/addLib\";\nimport { addPage } from \"../lib/addPage\";\nimport { addText } from \"../lib/addText\";\nimport { rmPage } from \"../lib/rmPage\";\n\nexport function createCommandRegistry(): ReadonlyMap<string, CommandHandler> {\n return new Map<string, CommandHandler>([\n [\"addcomponent\", addComponent],\n [\"addpage\", addPage],\n [\"addlib\", addLib],\n [\"addapi\", addApi],\n [\"addlanguage\", addLanguage],\n [\"addtext\", addText],\n [\"rmpage\", rmPage],\n ]);\n}\n","import { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { CliError } from \"./core/contracts\";\nimport type { CliContext } from \"./core/contracts\";\nimport { MutationGateway } from \"./core/operations\";\nimport {\n normalizeImportAlias,\n validateProjectName,\n} from \"./core/project-paths\";\nimport {\n copyTemplate,\n customizeGeneratedProject,\n validateScaffoldTemplate,\n} from \"./core/template-manifest\";\n\n/**\n * Options for scaffolding a Next.js project.\n */\nexport interface ScaffoldOptions {\n projectName: string;\n useTypescript: boolean;\n useEslint: boolean;\n useTailwind: boolean;\n useSrcDir: boolean;\n useTurbopack: boolean;\n useI18n: boolean;\n customAlias: boolean;\n importAlias: string;\n force?: boolean;\n}\n\ninterface ScaffoldRuntimeOptions {\n context: CliContext;\n templatePath?: string;\n}\n\n/**\n * Scaffold a new Next.js project based on provided options.\n *\n * - Copies the default template to the target directory\n * - Removes the target directory if it exists and --force is set\n * - Optionally customizes the structure in future (e.g. remove unused files)\n *\n * @param options ScaffoldOptions for the project\n */\nexport async function scaffoldProject(\n options: ScaffoldOptions,\n runtime: ScaffoldRuntimeOptions,\n): Promise<{ projectRoot: string; copiedFiles: number; importAlias: string }> {\n const requiredFeatures: Array<keyof ScaffoldOptions> = [\n \"useTypescript\",\n \"useEslint\",\n \"useTailwind\",\n \"useSrcDir\",\n \"useTurbopack\",\n \"useI18n\",\n ];\n const unsupported = requiredFeatures.filter(\n (feature) => options[feature] !== true,\n );\n if (unsupported.length > 0) {\n throw new CliError(\n `The default Next.js 16 template requires: ${unsupported.join(\", \")}.`,\n { code: \"INVALID_ARGUMENT\" },\n );\n }\n const { context } = runtime;\n const cwd = context.cwd;\n const projectName = validateProjectName(options.projectName);\n const importAlias = normalizeImportAlias(\n options.customAlias === false ? \"@/*\" : options.importAlias || \"@/*\",\n );\n const targetPath = join(cwd, projectName);\n\n const __dirname = new URL(\".\", import.meta.url);\n const templatePath =\n runtime.templatePath ??\n join(fileURLToPath(__dirname), \"..\", \"templates\", \"Projects\", \"default\");\n const resolvedCwd = resolve(cwd);\n const resolvedTarget = resolve(targetPath);\n if (!resolvedTarget.startsWith(`${resolvedCwd}/`)) {\n throw new CliError(\n \"The project destination must be a child of the current directory.\",\n { code: \"UNSAFE_PATH\" },\n );\n }\n\n const gateway = new MutationGateway(context, targetPath);\n const manifest = await validateScaffoldTemplate(templatePath, context.fs);\n\n // Check if target directory exists\n if (context.fs.exists(targetPath)) {\n if (options.force) {\n if (context.outputMode === \"human\") {\n context.terminal.warn(\n `WARNING: --force will remove the existing project at ${targetPath}.`,\n );\n }\n await gateway.remove(\n targetPath,\n {\n role: \"existing-project\",\n resource: \"project\",\n },\n { recursive: true, force: true },\n );\n } else {\n throw new CliError(\n \"Target directory already exists. Use --force to overwrite it.\",\n {\n code: \"TARGET_EXISTS\",\n scope: \"project\",\n path: \".\",\n },\n );\n }\n }\n\n await gateway.mkdir(targetPath, {\n resource: \"project\",\n role: \"project-root\",\n });\n\n await copyTemplate(templatePath, targetPath, context, gateway, manifest);\n await customizeGeneratedProject(\n targetPath,\n projectName,\n importAlias,\n context,\n gateway,\n );\n\n await gateway.write(\n join(targetPath, \"cnp.config.json\"),\n `${JSON.stringify({ ...options, projectName, importAlias }, null, 2)}\\n`,\n {\n role: \"project-configuration\",\n resource: \"configuration\",\n detail: { importAlias, packageManager: \"user-selected\" },\n },\n );\n return { projectRoot: targetPath, copiedFiles: manifest.length, importAlias };\n}\n","import path from \"node:path\";\n\nimport { PROJECT_AGENT_GUIDANCE_FILES } from \"./agent-guidance\";\nimport { CliError } from \"./contracts\";\nimport type { CliContext, CliFileSystem } from \"./contracts\";\nimport { MutationGateway } from \"./operations\";\n\nexport const TEMPLATE_DENY_NAMES = new Set([\n \".env\",\n \".git\",\n \".gitignore\",\n \".agent\",\n \".cursor\",\n \".next\",\n \"node_modules\",\n \"artifacts\",\n \"coverage\",\n \"playwright-report\",\n \"test-results\",\n]);\n\nexport function isDistributableTemplatePath(relativePath: string): boolean {\n const segments = relativePath.split(path.sep);\n return !segments.some(\n (segment) =>\n TEMPLATE_DENY_NAMES.has(segment) ||\n (segment.startsWith(\".env\") && segment !== \".env.example\") ||\n segment.endsWith(\".tsbuildinfo\") ||\n segment === \".DS_Store\",\n );\n}\n\nexport async function templateManifest(\n root: string,\n fs: CliFileSystem,\n): Promise<string[]> {\n const files: string[] = [];\n async function visit(directory: string, relativeDirectory = \"\") {\n const entries = await fs.list(directory);\n for (const entry of entries) {\n const relative = path.join(relativeDirectory, entry.name);\n if (!isDistributableTemplatePath(relative)) continue;\n const source = path.join(directory, entry.name);\n if (entry.isSymbolicLink) {\n throw new CliError(\n `Symbolic links are forbidden in templates: ${relative}`,\n { code: \"UNSAFE_PATH\", scope: \"package\", path: relative },\n );\n }\n if (entry.isDirectory) await visit(source, relative);\n else if (entry.isFile) files.push(relative);\n else\n throw new CliError(`Unsupported template entry: ${relative}`, {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: relative,\n });\n }\n }\n await visit(root);\n return files;\n}\n\nexport async function validateScaffoldTemplate(\n root: string,\n fs: CliFileSystem,\n): Promise<string[]> {\n const manifest = await templateManifest(root, fs);\n for (const required of [\n ...PROJECT_AGENT_GUIDANCE_FILES.map((relative) =>\n relative.split(\"/\").join(path.sep),\n ),\n \"package.json\",\n \"tsconfig.json\",\n \".env.example\",\n \".gitignore.template\",\n \".prettierignore\",\n \"bun.lock\",\n \"pnpm-workspace.yaml\",\n \"vitest.config.ts\",\n path.join(\"scripts\", \"audit-policy.ts\"),\n path.join(\"scripts\", \"audit.ts\"),\n path.join(\"scripts\", \"package-manager.ts\"),\n path.join(\"tests\", \"consumer\", \"validate-template.ts\"),\n path.join(\".github\", \"workflows\", \"quality.yml\"),\n ]) {\n if (!manifest.includes(required)) {\n throw new CliError(`Required template file was not found: ${required}.`, {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: `templates/Projects/default/${required}`,\n });\n }\n }\n try {\n JSON.parse(await fs.readText(path.join(root, \"package.json\")));\n const tsconfig = JSON.parse(\n await fs.readText(path.join(root, \"tsconfig.json\")),\n ) as { compilerOptions?: { paths?: Record<string, string[]> } };\n if (!tsconfig.compilerOptions?.paths?.[\"@/*\"]) throw new Error(\"alias\");\n } catch {\n throw new CliError(\n 'The template manifests must be valid JSON and define the default \"@/*\" alias.',\n {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: \"templates/Projects/default\",\n },\n );\n }\n return manifest;\n}\n\nexport async function copyTemplate(\n root: string,\n target: string,\n context: CliContext,\n gateway: MutationGateway,\n manifest?: string[],\n): Promise<string[]> {\n const files = manifest ?? (await templateManifest(root, context.fs));\n for (const relative of files) {\n const destination = path.join(\n target,\n relative === \".gitignore.template\" ? \".gitignore\" : relative,\n );\n const source = path.join(root, relative);\n await gateway.copy(source, destination, {\n role: \"template-file\",\n source: { template: `Projects/default/${relative}` },\n });\n }\n return files;\n}\n\nexport async function customizeGeneratedProject(\n target: string,\n projectName: string,\n importAlias: string,\n context: CliContext,\n gateway: MutationGateway,\n): Promise<void> {\n const packagePath = path.join(target, \"package.json\");\n const packageJson = JSON.parse(\n await context.fs.readText(packagePath),\n ) as Record<string, unknown>;\n packageJson.name = projectName.toLowerCase();\n delete packageJson.packageManager;\n await gateway.write(\n packagePath,\n `${JSON.stringify(packageJson, null, 2)}\\n`,\n { role: \"package-manifest\" },\n );\n\n const tsconfigPath = path.join(target, \"tsconfig.json\");\n const tsconfigContent = await context.fs.readText(tsconfigPath);\n const tsconfig = JSON.parse(tsconfigContent) as {\n compilerOptions?: { paths?: Record<string, string[]> };\n };\n if (!tsconfig.compilerOptions?.paths?.[\"@/*\"]) {\n throw new CliError(\n 'The template tsconfig must define the default \"@/*\" alias.',\n {\n code: \"TEMPLATE_MISSING\",\n scope: \"package\",\n path: \"templates/Projects/default/tsconfig.json\",\n },\n );\n }\n await gateway.write(\n tsconfigPath,\n tsconfigContent.replace('\"@/*\"', `\"${importAlias}\"`),\n { role: \"typescript-configuration\" },\n );\n\n if (importAlias !== \"@/*\") {\n const prefix = importAlias.slice(0, -2);\n for (const relative of await templateManifest(target, context.fs)) {\n if (!/\\.[cm]?[jt]sx?$/.test(relative)) continue;\n const file = path.join(target, relative);\n const content = await context.fs.readText(file);\n const next = content\n .replaceAll('from \"@/', `from \"${prefix}/`)\n .replaceAll(\"from '@/\", `from '${prefix}/`);\n if (next !== content) {\n await gateway.write(file, next, { role: \"import-alias-reference\" });\n }\n }\n }\n}\n","export const PROJECT_SKILL_NAMES = [\n \"create-next-pro-create-project\",\n \"create-next-pro-addcomponent\",\n \"create-next-pro-addpage\",\n \"create-next-pro-addlib\",\n \"create-next-pro-addapi\",\n \"create-next-pro-addlanguage\",\n \"create-next-pro-addtext\",\n \"create-next-pro-rmpage\",\n] as const;\n\nexport const PROJECT_AGENT_GUIDANCE_FILES = [\n \"AGENTS.md\",\n ...PROJECT_SKILL_NAMES.map((name) => `.agents/skills/${name}/SKILL.md`),\n] as const;\n","import { scaffoldProject } from \"../scaffold\";\nimport type { ScaffoldOptions } from \"../scaffold\";\nimport type { CliContext, CommandResult } from \"../core/contracts\";\nimport { commandResult } from \"../core/operations\";\n\nexport async function createProjectFromOptions(\n options: ScaffoldOptions,\n context: CliContext,\n): Promise<CommandResult> {\n const { projectRoot, copiedFiles, importAlias } = await scaffoldProject(\n options,\n {\n context,\n },\n );\n return commandResult(context, {\n command: \"create\",\n summary: `Created project \"${options.projectName}\" with ${copiedFiles} template files and import alias ${importAlias}; no package manager was pinned.`,\n projectRoot,\n nextSteps: [\n {\n kind: \"install\",\n required: true,\n message: \"Install dependencies with your preferred package manager.\",\n paths: [],\n commands: [\n `cd ${options.projectName} && bun install`,\n `cd ${options.projectName} && npm install`,\n `cd ${options.projectName} && pnpm install`,\n ],\n },\n {\n kind: \"run-checks\",\n required: true,\n message: \"Run the generated project checks before development.\",\n paths: [{ scope: \"project\", path: \"package.json\" }],\n commands: [\"bun run check\", \"npm run check\", \"pnpm run check\"],\n },\n {\n kind: \"run\",\n required: false,\n message:\n \"To run the project locally, copy the development environment example and start the development server.\",\n paths: [{ scope: \"project\", path: \".env.example\" }],\n commands: [\n `cd ${options.projectName} && cp .env.example .env && bun run dev`,\n `cd ${options.projectName} && cp .env.example .env && npm run dev`,\n `cd ${options.projectName} && cp .env.example .env && pnpm run dev`,\n ],\n },\n ],\n data: {\n projectName: options.projectName,\n importAlias,\n packageManager: null,\n copiedFiles,\n },\n });\n}\n\nexport async function createProject(\n nameArg: string,\n force: boolean,\n context: CliContext,\n): Promise<CommandResult> {\n const response: ScaffoldOptions = {\n projectName: nameArg,\n useTypescript: true,\n useEslint: true,\n useTailwind: true,\n useSrcDir: true,\n useTurbopack: true,\n useI18n: true,\n customAlias: true,\n importAlias: \"@/*\",\n force,\n };\n\n return createProjectFromOptions(response, context);\n}\n","import type { ScaffoldOptions } from \"../scaffold\";\nimport type { CliContext, CommandResult } from \"../core/contracts\";\nimport { commandResult } from \"../core/operations\";\nimport { createProjectFromOptions } from \"./createProject\";\n\nexport async function createProjectWithPrompt(\n context: CliContext,\n): Promise<CommandResult> {\n const response = await context.prompt<keyof ScaffoldOptions>([\n {\n type: \"text\",\n name: \"projectName\",\n message: \"Project name:\",\n initial: \"my-next-app\",\n },\n {\n type: \"toggle\",\n name: \"useTypescript\",\n message: \"✔ Use TypeScript?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useEslint\",\n message: \"✔ Use ESLint?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTailwind\",\n message: \"✔ Use Tailwind CSS?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useSrcDir\",\n message: \"✔ Use `src/` directory?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTurbopack\",\n message: \"✔ Use Turbopack for `next dev`?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useI18n\",\n message: \"✔ Use i18n with next-intl for translations?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"customAlias\",\n message: \"✔ Customize import alias (`@/*` by default)?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: (prev: boolean) => (prev ? \"text\" : null),\n name: \"importAlias\",\n message: \"✔ What import alias would you like?\",\n initial: \"@core/*\",\n },\n ]);\n\n if (!response.projectName) {\n context.operations.record({\n action: \"cancelled\",\n resource: \"command\",\n role: \"project-creation\",\n scope: \"project\",\n path: \".\",\n });\n return commandResult(context, {\n command: \"create\",\n summary: \"Project creation was cancelled.\",\n projectRoot: context.cwd,\n status: \"cancelled\",\n });\n }\n\n const options = response as unknown as ScaffoldOptions;\n return createProjectFromOptions(options, context);\n}\n","import { existsSync } from \"node:fs\";\nimport {\n appendFile,\n copyFile,\n lstat,\n mkdir,\n readdir,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport prompts from \"prompts\";\n\nimport type { CliContext, PromptRunner } from \"../core/contracts\";\nimport { OperationJournal } from \"../core/operations\";\n\nfunction findPackageRoot(start: string): string {\n let current = start;\n while (true) {\n const packagePath = path.join(current, \"package.json\");\n if (existsSync(packagePath)) return current;\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(`Unable to locate package.json from ${start}`);\n }\n current = parent;\n }\n}\n\nexport function resolvePackageRoot(metaUrl = import.meta.url): string {\n return findPackageRoot(path.dirname(fileURLToPath(metaUrl)));\n}\n\ntype ContextOverrides = Partial<\n Pick<\n CliContext,\n | \"argv\"\n | \"cwd\"\n | \"env\"\n | \"homeDir\"\n | \"packageRoot\"\n | \"terminal\"\n | \"prompt\"\n | \"fs\"\n | \"outputMode\"\n >\n>;\n\nexport function createNodeContext(\n overrides: ContextOverrides = {},\n): CliContext {\n return {\n argv: process.argv.slice(2),\n cwd: process.cwd(),\n env: process.env,\n homeDir: os.homedir(),\n packageRoot: resolvePackageRoot(),\n terminal: console,\n prompt: prompts as PromptRunner,\n fs: {\n exists: existsSync,\n readText: (target) => readFile(target, \"utf8\"),\n writeText: async (target, content) => {\n await writeFile(target, content);\n },\n mkdir: async (target) => {\n await mkdir(target, { recursive: true });\n },\n copyFile: async (source, target) => {\n await copyFile(source, target);\n },\n appendText: async (target, content) => {\n await appendFile(target, content);\n },\n remove: async (target, options) => {\n await rm(target, options);\n },\n inspect: async (target) => {\n try {\n const stats = await lstat(target);\n return {\n name: target,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n isSymbolicLink: stats.isSymbolicLink(),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n },\n list: async (target) => {\n const entries = await readdir(target, { withFileTypes: true });\n return Promise.all(\n entries\n .sort((left, right) => left.name.localeCompare(right.name))\n .map(async (entry) => {\n const stats = await lstat(path.join(target, entry.name));\n return {\n name: entry.name,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n isSymbolicLink: stats.isSymbolicLink(),\n };\n }),\n );\n },\n },\n operations: new OperationJournal(),\n outputMode: \"human\",\n ...overrides,\n };\n}\n","#!/usr/bin/env node\nimport { main } from \"./src/index\";\nprocess.exitCode = await main();\n"],"mappings":"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","names":["path","path","candidates","path","path","path","path","path","path","join","path","path","join","join","join","join","join","join","join","join","nextRegistry","join","join","join","path","candidate","path","join","path","path","join","path","fileURLToPath","path","fileURLToPath","path"]}