@makerkit/cli 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +34 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +34 -1
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -382,6 +382,39 @@ var DEFAULT_PLUGINS = {
|
|
|
382
382
|
}
|
|
383
383
|
],
|
|
384
384
|
path: "packages/plugins/honeybadger"
|
|
385
|
+
},
|
|
386
|
+
"next-drizzle": {
|
|
387
|
+
envVars: [
|
|
388
|
+
{
|
|
389
|
+
key: "HONEYBADGER_API_KEY",
|
|
390
|
+
description: "Honeybadger private API key"
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
key: "NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT",
|
|
394
|
+
description: "Honeybadger environment"
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
key: "NEXT_PUBLIC_HONEYBADGER_REVISION",
|
|
398
|
+
description: "Honeybadger log revision"
|
|
399
|
+
}
|
|
400
|
+
],
|
|
401
|
+
path: "packages/plugins/honeybadger"
|
|
402
|
+
},
|
|
403
|
+
"next-prisma": {
|
|
404
|
+
envVars: [
|
|
405
|
+
{
|
|
406
|
+
key: "HONEYBADGER_API_KEY",
|
|
407
|
+
description: "Honeybadger private API key"
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
key: "NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT",
|
|
411
|
+
description: "Honeybadger environment"
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
key: "NEXT_PUBLIC_HONEYBADGER_REVISION",
|
|
415
|
+
description: "Honeybadger log revision"
|
|
416
|
+
}
|
|
417
|
+
]
|
|
385
418
|
}
|
|
386
419
|
}
|
|
387
420
|
},
|
|
@@ -568,7 +601,7 @@ var DEFAULT_PLUGINS = {
|
|
|
568
601
|
},
|
|
569
602
|
directus: {
|
|
570
603
|
name: "Directus CMS",
|
|
571
|
-
id: "directus
|
|
604
|
+
id: "directus",
|
|
572
605
|
description: "Add Directus as your CMS.",
|
|
573
606
|
variants: {
|
|
574
607
|
"next-supabase": {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/new/new.command.ts","../src/utils/create-project.ts","../src/utils/marker-file.ts","../src/version.ts","../src/utils/upstream.ts","../src/utils/list-variants.ts","../src/plugins-model.ts","../src/utils/plugins-cache.ts","../src/utils/base-store.ts","../src/utils/git.ts","../src/utils/install-registry-files.ts","../src/utils/run-codemod.ts","../src/utils/username-cache.ts","../src/utils/workspace.ts","../src/utils/add-plugin.ts","../src/utils/list-plugins.ts","../src/commands/plugins/add/add.command.ts","../src/commands/plugins/diff/diff.command.ts","../src/utils/init-registry.ts","../src/commands/plugins/init/init.command.ts","../src/commands/plugins/list/list-plugins.command.ts","../src/commands/plugins/outdated/outdated.command.ts","../src/commands/plugins/update/update.command.ts","../src/commands/plugins/plugins.command.ts","../src/utils/project-pull.ts","../src/commands/project/update/update.command.ts","../src/commands/project/project.command.ts","../src/index.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport prompts from 'prompts';\n\nimport { createProject } from '@/src/utils/create-project';\nimport { VARIANT_CATALOG } from '@/src/utils/list-variants';\n\nexport const newCommand = new Command()\n .name('new')\n .description('Initialize a new Makerkit project')\n .action(async () => {\n const choices = VARIANT_CATALOG.map((v) => ({\n title: v.name,\n value: v.id,\n }));\n\n const { kit, name: projectName } = await prompts([\n {\n type: 'select',\n name: 'kit',\n message: `Select the ${chalk.cyan(`SaaS Kit`)} you want to clone`,\n choices,\n },\n {\n type: 'text',\n name: 'name',\n message: `Enter your ${chalk.cyan('Project Name')}.`,\n },\n ]);\n\n const selected = VARIANT_CATALOG.find((v) => v.id === kit);\n\n if (!selected) {\n console.log('Invalid kit selection. Aborting...');\n process.exit(1);\n }\n\n const { confirm } = await prompts([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Are you sure you want to clone ${chalk.cyan(\n selected.name\n )} to ${chalk.cyan(projectName)}?`,\n },\n ]);\n\n if (!confirm) {\n console.log('Aborting...');\n process.exit(0);\n }\n\n const spinner = ora(`Cloning ${selected.name}...`).start();\n\n try {\n const result = await createProject({\n variant: selected.id,\n name: projectName,\n directory: process.cwd(),\n });\n\n spinner.succeed(`${result.message}`);\n\n console.log(\n `You can now get started. Open the project in your IDE and read the README.md file for more information.`\n );\n } catch (e) {\n console.error(e);\n spinner.fail(`Failed to create project`);\n process.exit(1);\n }\n });\n","import { join } from 'path';\n\nimport { execa } from 'execa';\nimport fs from 'fs-extra';\n\nimport { writeMarkerFile } from '@/src/utils/marker-file';\nimport { VARIANT_REPO_MAP, hasSshAccess } from '@/src/utils/upstream';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface CreateProjectOptions {\n variant: Variant;\n name: string;\n directory: string;\n githubToken?: string;\n}\n\nexport interface CreateProjectResult {\n success: boolean;\n projectPath: string;\n variant: Variant;\n kitRepo: string;\n message: string;\n}\n\nexport async function createProject(\n options: CreateProjectOptions,\n): Promise<CreateProjectResult> {\n const { variant, name, directory, githubToken } = options;\n const projectPath = join(directory, name);\n const repo = VARIANT_REPO_MAP[variant];\n\n // 1. Validate target dir doesn't already exist\n if (await fs.pathExists(projectPath)) {\n throw new Error(\n `Target directory \"${projectPath}\" already exists. Choose a different name or remove it first.`,\n );\n }\n\n // 2. Validate parent dir exists\n if (!(await fs.pathExists(directory))) {\n throw new Error(\n `Parent directory \"${directory}\" does not exist.`,\n );\n }\n\n // 3. Resolve clone URL\n let cloneUrl: string;\n\n if (githubToken) {\n cloneUrl = `https://${githubToken}@github.com/${repo}`;\n } else {\n const useSsh = await hasSshAccess();\n cloneUrl = useSsh\n ? `git@github.com:${repo}`\n : `https://github.com/${repo}`;\n }\n\n // 4. Clone\n await execa('git', ['clone', cloneUrl, name], { cwd: directory });\n\n // 5. Strip token from remote if needed\n if (githubToken) {\n await execa(\n 'git',\n ['remote', 'set-url', 'origin', `https://github.com/${repo}`],\n { cwd: projectPath },\n );\n }\n\n // 6. Install dependencies\n await execa('pnpm', ['install'], { cwd: projectPath });\n\n // 7. Write marker file\n await writeMarkerFile(projectPath, variant, repo);\n\n return {\n success: true,\n projectPath,\n variant,\n kitRepo: repo,\n message: `Project \"${name}\" created successfully with variant \"${variant}\".`,\n };\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport { CLI_VERSION } from '@/src/version';\n\nexport interface MakerkitProjectConfig {\n version: number;\n variant: string;\n kit_repo: string;\n created_at: string;\n cli_version: string;\n}\n\nexport async function writeMarkerFile(\n projectPath: string,\n variant: string,\n kitRepo: string,\n): Promise<void> {\n const dir = join(projectPath, '.makerkit');\n\n await fs.ensureDir(dir);\n\n const config: MakerkitProjectConfig = {\n version: 1,\n variant,\n kit_repo: kitRepo,\n created_at: new Date().toISOString(),\n cli_version: CLI_VERSION,\n };\n\n await fs.writeJson(join(dir, 'config.json'), config, { spaces: 2 });\n}\n\nexport async function readMarkerFile(\n projectPath: string,\n): Promise<MakerkitProjectConfig | null> {\n const filePath = join(projectPath, '.makerkit', 'config.json');\n\n if (!(await fs.pathExists(filePath))) {\n return null;\n }\n\n return fs.readJson(filePath);\n}\n","export const CLI_VERSION = '2.0.0-beta.1';\n","import type { Variant } from '@/src/utils/workspace';\n\nimport { execaCommand } from 'execa';\n\nexport const VARIANT_REPO_MAP: Record<Variant, string> = {\n 'next-supabase': 'makerkit/next-supabase-saas-kit-turbo',\n 'next-drizzle': 'makerkit/next-drizzle-saas-kit-turbo',\n 'next-prisma': 'makerkit/next-prisma-saas-kit-turbo',\n 'react-router-supabase': 'makerkit/react-router-supabase-saas-kit-turbo',\n};\n\nfunction sshUrl(repo: string): string {\n return `git@github.com:${repo}`;\n}\n\nfunction httpsUrl(repo: string): string {\n return `https://github.com/${repo}`;\n}\n\nexport async function hasSshAccess(): Promise<boolean> {\n try {\n await execaCommand('ssh -T git@github.com -o StrictHostKeyChecking=no', {\n timeout: 10_000,\n });\n\n return true;\n } catch (error) {\n // ssh -T git@github.com exits with code 1 even on success,\n // but prints \"successfully authenticated\" in stderr\n const stderr =\n error instanceof Error && 'stderr' in error\n ? String((error as { stderr: unknown }).stderr)\n : '';\n\n return stderr.includes('successfully authenticated');\n }\n}\n\nexport function getUpstreamUrl(variant: Variant, useSsh: boolean): string {\n const repo = VARIANT_REPO_MAP[variant];\n\n return useSsh ? sshUrl(repo) : httpsUrl(repo);\n}\n\n/**\n * Check if a remote URL points to the correct repo for the given variant,\n * regardless of whether it uses SSH or HTTPS.\n * Handles trailing `.git` and `/` in URLs.\n */\nexport function isUpstreamUrlValid(\n url: string,\n variant: Variant,\n): boolean {\n const normalized = url.replace(/\\/+$/, '').replace(/\\.git$/, '');\n const repo = VARIANT_REPO_MAP[variant];\n\n return normalized === sshUrl(repo) || normalized === httpsUrl(repo);\n}\n\nexport async function getUpstreamRemoteUrl(): Promise<string | undefined> {\n try {\n const { stdout } = await execaCommand('git remote get-url upstream');\n return stdout.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function setUpstreamRemote(url: string): Promise<void> {\n const currentUrl = await getUpstreamRemoteUrl();\n\n if (currentUrl) {\n await execaCommand(`git remote set-url upstream ${url}`);\n } else {\n await execaCommand(`git remote add upstream ${url}`);\n }\n}\n","import { VARIANT_REPO_MAP } from '@/src/utils/upstream';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface VariantInfo {\n id: Variant;\n name: string;\n description: string;\n repo: string;\n tech: string[];\n database: string;\n auth: string;\n status: 'stable' | 'beta' | 'deprecated';\n}\n\nexport const VARIANT_CATALOG: VariantInfo[] = [\n {\n id: 'next-supabase',\n name: 'Next.js + Supabase',\n description: 'Full-stack SaaS kit with Next.js App Router and Supabase',\n repo: VARIANT_REPO_MAP['next-supabase'],\n tech: ['Next.js', 'Supabase', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL (Supabase)',\n auth: 'Supabase Auth',\n status: 'stable',\n },\n {\n id: 'next-drizzle',\n name: 'Next.js + Drizzle',\n description: 'Full-stack SaaS kit with Next.js and Drizzle ORM',\n repo: VARIANT_REPO_MAP['next-drizzle'],\n tech: ['Next.js', 'Drizzle', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL',\n auth: 'Better Auth',\n status: 'stable',\n },\n {\n id: 'next-prisma',\n name: 'Next.js + Prisma',\n description: 'Full-stack SaaS kit with Next.js and Prisma ORM',\n repo: VARIANT_REPO_MAP['next-prisma'],\n tech: ['Next.js', 'Prisma', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL',\n auth: 'Better Auth',\n status: 'stable',\n },\n {\n id: 'react-router-supabase',\n name: 'React Router + Supabase',\n description: 'Full-stack SaaS kit with React Router and Supabase',\n repo: VARIANT_REPO_MAP['react-router-supabase'],\n tech: ['React Router', 'Supabase', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL (Supabase)',\n auth: 'Supabase Auth',\n status: 'stable',\n },\n];\n\nexport interface ListVariantsResult {\n variants: VariantInfo[];\n}\n\nexport function listVariants(): ListVariantsResult {\n return { variants: VARIANT_CATALOG };\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\nimport invariant from 'tiny-invariant';\n\nimport { fetchPluginRegistry } from '@/src/utils/plugins-cache';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface EnvVar {\n key: string;\n description: string;\n defaultValue?: string;\n}\n\nexport interface VariantConfig {\n envVars: EnvVar[];\n path?: string;\n}\n\nexport interface PluginDefinition {\n name: string;\n id: string;\n description: string;\n variants: Partial<Record<Variant, VariantConfig>>;\n postInstallMessage?: string;\n}\n\nconst DEFAULT_PLUGINS: Record<string, PluginDefinition> = {\n feedback: {\n name: 'Feedback',\n id: 'feedback',\n description: 'Add a feedback popup to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/feedback',\n },\n },\n },\n waitlist: {\n name: 'Waitlist',\n id: 'waitlist',\n description: 'Add a waitlist to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/waitlist',\n },\n },\n },\n testimonial: {\n name: 'Testimonial',\n id: 'testimonial',\n description: 'Add a testimonial widget to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/testimonial',\n },\n },\n },\n roadmap: {\n name: 'Roadmap',\n id: 'roadmap',\n description: 'Add a roadmap to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/roadmap',\n },\n },\n },\n 'google-analytics': {\n name: 'Google Analytics',\n id: 'google-analytics',\n description: 'Add Google Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n }\n },\n },\n honeybadger: {\n name: 'Honeybadger',\n id: 'honeybadger',\n description: 'Add Honeybadger Error Tracking to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'HONEYBADGER_API_KEY',\n description: 'Honeybadger private API key',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT',\n description: 'Honeybadger environment',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_REVISION',\n description: 'Honeybadger log revision',\n }\n ],\n path: 'packages/plugins/honeybadger',\n },\n }\n },\n posthog: {\n name: 'PostHog',\n id: 'posthog',\n description: 'Add PostHog Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n },\n },\n umami: {\n name: 'Umami',\n id: 'umami',\n description: 'Add Umami Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n },\n },\n signoz: {\n name: 'SigNoz',\n id: 'signoz',\n description: 'Add SigNoz Monitoring to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n },\n },\n paddle: {\n name: 'Paddle',\n id: 'paddle',\n description: 'Add Paddle Billing to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_PADDLE_CLIENT_TOKEN',\n description: 'Paddle client-side token',\n },\n {\n key: 'PADDLE_API_KEY',\n description: 'Paddle API key',\n },\n {\n key: 'PADDLE_WEBHOOK_SECRET',\n description: 'Paddle webhook secret',\n },\n ],\n path: 'packages/plugins/paddle',\n },\n },\n },\n 'supabase-cms': {\n name: 'Supabase CMS',\n id: 'supabase-cms',\n description: 'Add Supabase CMS provider to your app.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/supabase-cms',\n },\n },\n },\n 'meshes-analytics': {\n name: 'Meshes Analytics',\n id: 'meshes-analytics',\n description: 'Add Meshes Analytics to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_MESHES_PUBLISHABLE_KEY',\n description: 'The Meshes publishable key'\n }\n ],\n path: 'packages/plugins/meshes-analytics',\n },\n },\n },\n directus: {\n name: 'Directus CMS',\n id: 'directus-cms',\n description: 'Add Directus as your CMS.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n },\n }\n};\n\nexport class PluginRegistry {\n private constructor(\n private plugins: Record<string, PluginDefinition>,\n ) {}\n\n static async load(): Promise<PluginRegistry> {\n const registryUrl = process.env.MAKERKIT_PLUGINS_REGISTRY_URL;\n const plugins = await fetchPluginRegistry(registryUrl, DEFAULT_PLUGINS);\n\n return new PluginRegistry(plugins);\n }\n\n getPluginById(id: string): PluginDefinition | undefined {\n return this.plugins[id];\n }\n\n getPluginsForVariant(variant: Variant): PluginDefinition[] {\n return Object.values(this.plugins).filter((p) => variant in p.variants);\n }\n\n validatePlugin(pluginId: string, variant: Variant): PluginDefinition {\n const plugin = this.getPluginById(pluginId);\n\n invariant(plugin, `Plugin \"${pluginId}\" not found`);\n\n invariant(\n plugin.variants[variant],\n `Plugin \"${pluginId}\" is not available for the ${variant} variant`,\n );\n\n return plugin;\n }\n}\n\nexport function getEnvVars(\n plugin: PluginDefinition,\n variant: Variant,\n): EnvVar[] {\n return plugin.variants[variant]?.envVars ?? [];\n}\n\nexport function getPath(\n plugin: PluginDefinition,\n variant: Variant,\n): string | undefined {\n return plugin.variants[variant]?.path;\n}\n\nexport async function isInstalled(\n plugin: PluginDefinition,\n variant: Variant,\n): Promise<boolean> {\n const pluginPath = getPath(plugin, variant);\n\n if (!pluginPath) {\n return false;\n }\n\n const pkgJsonPath = join(process.cwd(), pluginPath, 'package.json');\n\n if (!(await fs.pathExists(pkgJsonPath))) {\n return false;\n }\n\n try {\n const pkg = await fs.readJson(pkgJsonPath);\n\n return !!pkg.name && !!pkg.exports;\n } catch {\n return false;\n }\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\n\nimport fs from 'fs-extra';\n\nimport type { PluginDefinition } from '@/src/plugins-model';\n\nconst CACHE_DIR = join(homedir(), '.makerkit');\nconst CACHE_FILE = join(CACHE_DIR, 'plugins.json');\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\ninterface CacheEntry {\n fetchedAt: number;\n plugins: Record<string, PluginDefinition>;\n}\n\nasync function readCache(): Promise<CacheEntry | null> {\n try {\n if (!(await fs.pathExists(CACHE_FILE))) {\n return null;\n }\n\n return await fs.readJson(CACHE_FILE);\n } catch {\n return null;\n }\n}\n\nasync function writeCache(\n plugins: Record<string, PluginDefinition>,\n): Promise<void> {\n try {\n await fs.ensureDir(CACHE_DIR);\n\n await fs.writeJson(\n CACHE_FILE,\n { fetchedAt: Date.now(), plugins },\n { spaces: 2 },\n );\n } catch {\n // Ignore cache write failures\n }\n}\n\nexport async function fetchPluginRegistry(\n registryUrl: string | undefined,\n fallback: Record<string, PluginDefinition>,\n): Promise<Record<string, PluginDefinition>> {\n if (!registryUrl) {\n return fallback;\n }\n\n // Check cache first\n const cached = await readCache();\n\n if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {\n return cached.plugins;\n }\n\n // Fetch from remote\n try {\n const response = await fetch(registryUrl);\n\n if (response.ok) {\n const data = await response.json();\n const plugins = data.plugins as Record<string, PluginDefinition>;\n\n await writeCache(plugins);\n\n return plugins;\n }\n } catch {\n // Network error — fall through\n }\n\n // Return stale cache if available, otherwise bundled fallback\n return cached?.plugins ?? fallback;\n}\n","import { dirname, join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport type { RegistryFile } from '@/src/utils/install-registry-files';\n\nexport type FileStatus =\n | 'unchanged'\n | 'updated'\n | 'conflict'\n | 'added'\n | 'deleted_locally'\n | 'no_base';\n\nfunction basesDir(pluginId: string): string {\n return join(process.cwd(), 'node_modules', '.cache', 'makerkit', 'bases', pluginId);\n}\n\nexport async function saveBaseVersions(\n pluginId: string,\n files: RegistryFile[],\n): Promise<void> {\n const dir = basesDir(pluginId);\n\n for (const file of files) {\n const targetPath = join(dir, file.target);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n}\n\nexport async function readBaseVersion(\n pluginId: string,\n fileTarget: string,\n): Promise<string | undefined> {\n const filePath = join(basesDir(pluginId), fileTarget);\n\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch {\n return undefined;\n }\n}\n\nexport async function hasBaseVersions(pluginId: string): Promise<boolean> {\n return fs.pathExists(basesDir(pluginId));\n}\n\nexport function computeFileStatus(params: {\n base?: string;\n local?: string;\n remote: string;\n}): FileStatus {\n const { base, local, remote } = params;\n\n // Local matches remote — nothing to do regardless of base\n if (local !== undefined && local === remote) {\n return 'unchanged';\n }\n\n // No base version (legacy install or new file)\n if (base === undefined) {\n if (local === undefined) {\n return 'added';\n }\n\n return 'no_base';\n }\n\n // Has base version\n if (local === undefined) {\n return 'deleted_locally';\n }\n\n if (base === local) {\n // User hasn't touched the file — safe auto-apply\n return 'updated';\n }\n\n if (base === remote) {\n // Remote hasn't changed — local edits are fine\n return 'unchanged';\n }\n\n // Both sides changed\n return 'conflict';\n}\n","import { execaCommand } from 'execa';\n\nexport function getErrorOutput(error: unknown): string {\n if (error instanceof Error && 'stderr' in error) {\n const stderr = String((error as { stderr: unknown }).stderr);\n\n if (stderr) return stderr;\n }\n\n if (error instanceof Error && 'stdout' in error) {\n const stdout = String((error as { stdout: unknown }).stdout);\n\n if (stdout) return stdout;\n }\n\n return error instanceof Error ? error.message : String(error);\n}\n\nexport async function isGitClean(): Promise<boolean> {\n const { stdout } = await execaCommand('git status --porcelain');\n\n return stdout.trim() === '';\n}\n\nexport async function getGitRoot(): Promise<string> {\n const { stdout } = await execaCommand('git rev-parse --show-toplevel');\n\n return stdout.trim();\n}\n\nexport async function getGitUsername(): Promise<string | undefined> {\n try {\n const { stdout } = await execaCommand('git config --get user.username');\n const username = stdout.trim();\n\n return username.length > 0 ? username : undefined;\n } catch {\n return undefined;\n }\n}\n","import { dirname, join } from 'path';\nimport fs from 'fs-extra';\n\nexport interface RegistryFile {\n path: string;\n content: string;\n type: string;\n target: string;\n}\n\nexport interface RegistryItem {\n name: string;\n files: RegistryFile[];\n dependencies?: Record<string, string>;\n}\n\nexport async function fetchRegistryItem(\n variant: string,\n pluginId: string,\n username: string,\n): Promise<RegistryItem> {\n const url = `https://makerkit.dev/r/${variant}/${pluginId}.json?username=${username}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch plugin registry for \"${pluginId}\" (${response.status}): ${response.statusText}`,\n );\n }\n\n const item: RegistryItem = await response.json();\n\n if (!item.files || item.files.length === 0) {\n throw new Error(`Plugin \"${pluginId}\" has no files in the registry.`);\n }\n\n return item;\n}\n\nexport async function installRegistryFiles(\n variant: string,\n pluginId: string,\n username: string,\n): Promise<RegistryItem> {\n const item = await fetchRegistryItem(variant, pluginId, username);\n const cwd = process.cwd();\n\n for (const file of item.files) {\n const targetPath = join(cwd, file.target);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n\n return item;\n}\n","import { execaCommand } from 'execa';\n\nconst CODEMOD_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\nexport async function runCodemod(\n variant: string,\n pluginId: string,\n options?: { captureOutput?: boolean },\n): Promise<{ success: boolean; output: string }> {\n try {\n const localPath = process.env.MAKERKIT_CODEMODS_PATH;\n const runner = process.env.MAKERKIT_PACKAGE_RUNNER ?? 'npx --yes';\n\n const command = localPath\n ? `${runner} codemod workflow run --allow-dirty -w ${localPath}/codemods/${variant}/${pluginId}`\n : `${runner} codemod --allow-dirty @makerkit/${variant}-${pluginId}`;\n\n const { stdout, stderr } = await execaCommand(command, {\n stdio: options?.captureOutput ? 'pipe' : 'inherit',\n timeout: CODEMOD_TIMEOUT_MS,\n });\n\n return {\n success: true,\n output: stdout || stderr || '',\n };\n } catch (error) {\n let message = 'Unknown error during codemod';\n\n if (error instanceof Error) {\n message = error.message;\n\n if ('stderr' in error && error.stderr) {\n message += `\\n${error.stderr}`;\n }\n\n if ('timedOut' in error && error.timedOut) {\n message = `Codemod timed out after ${CODEMOD_TIMEOUT_MS / 1000}s (the workflow engine may have stalled after an error)`;\n }\n }\n\n return {\n success: false,\n output: message,\n };\n }\n}\n","import { join } from 'path';\nimport { tmpdir } from 'os';\n\nimport fs from 'fs-extra';\nimport prompts from 'prompts';\n\nimport { getGitUsername } from '@/src/utils/git';\n\nconst USERNAME_FILE = join(tmpdir(), 'makerkit-username');\n\nexport function getCachedUsername(): string | undefined {\n try {\n const username = fs.readFileSync(USERNAME_FILE, 'utf-8').trim();\n\n return username.length > 0 ? username : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function cacheUsername(username: string): void {\n fs.writeFileSync(USERNAME_FILE, username, 'utf-8');\n}\n\nexport function clearCachedUsername(): void {\n try {\n fs.removeSync(USERNAME_FILE);\n } catch {\n // ignore\n }\n}\n\nexport async function promptForUsername(): Promise<string> {\n const gitUsername = await getGitUsername();\n\n const response = await prompts({\n type: 'text',\n name: 'githubUsername',\n message:\n 'Enter the GitHub username registered with your Makerkit account',\n initial: gitUsername,\n validate: (value) => {\n return value.trim().length > 0 ? true : 'GitHub username is required';\n },\n });\n\n const username = (response.githubUsername as string | undefined)?.trim();\n\n if (!username) {\n throw new Error('Setup cancelled. GitHub username is required.');\n }\n\n cacheUsername(username);\n\n return username;\n}\n\nexport async function getOrPromptUsername(\n providedUsername?: string,\n): Promise<string> {\n if (providedUsername?.trim()) {\n const username = providedUsername.trim();\n\n cacheUsername(username);\n\n return username;\n }\n\n const cached = getCachedUsername();\n\n if (cached) {\n return cached;\n }\n\n return promptForUsername();\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\n\nexport type Variant =\n | 'next-supabase'\n | 'next-drizzle'\n | 'next-prisma'\n | 'react-router-supabase';\n\nasync function readDeps(\n pkgPath: string,\n): Promise<Record<string, string>> {\n if (!(await fs.pathExists(pkgPath))) {\n return {};\n }\n\n const pkg = await fs.readJson(pkgPath);\n\n return {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n}\n\nexport async function detectVariant(): Promise<Variant> {\n const cwd = process.cwd();\n\n const rootPkgPath = join(cwd, 'package.json');\n\n if (!(await fs.pathExists(rootPkgPath))) {\n throw new Error(\n 'No package.json found. Please run this command from a MakerKit project root.',\n );\n }\n\n const rootDeps = await readDeps(rootPkgPath);\n\n if (!rootDeps['turbo']) {\n throw new Error(\n 'This does not appear to be a MakerKit Turbo monorepo. The \"turbo\" dependency was not found in package.json.',\n );\n }\n\n const webDeps = await readDeps(join(cwd, 'apps', 'web', 'package.json'));\n const dbDeps = await readDeps(\n join(cwd, 'packages', 'database', 'package.json'),\n );\n\n const hasSupabase = !!webDeps['@supabase/supabase-js'];\n const hasReactRouter = !!webDeps['@react-router/node'];\n const hasDrizzle = !!webDeps['drizzle-orm'] || !!dbDeps['drizzle-orm'];\n const hasPrisma = !!webDeps['@prisma/client'] || !!dbDeps['@prisma/client'];\n\n if (hasReactRouter && hasSupabase) {\n return 'react-router-supabase';\n }\n\n if (hasSupabase) {\n return 'next-supabase';\n }\n\n if (hasDrizzle) {\n return 'next-drizzle';\n }\n\n if (hasPrisma) {\n return 'next-prisma';\n }\n\n throw new Error(\n 'Unrecognized MakerKit project. Could not detect variant from dependencies.',\n );\n}\n\nexport async function validateProject(): Promise<{\n variant: Variant;\n version: string;\n}> {\n const variant = await detectVariant();\n const rootPkg = await fs.readJson(join(process.cwd(), 'package.json'));\n\n return {\n variant,\n version: rootPkg.version ?? 'unknown',\n };\n}\n","import {\n PluginRegistry,\n getEnvVars,\n isInstalled,\n} from '@/src/plugins-model';\nimport { saveBaseVersions } from '@/src/utils/base-store';\nimport { isGitClean } from '@/src/utils/git';\nimport { installRegistryFiles } from '@/src/utils/install-registry-files';\nimport { runCodemod } from '@/src/utils/run-codemod';\nimport {\n cacheUsername,\n getCachedUsername,\n} from '@/src/utils/username-cache';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface AddPluginOptions {\n projectPath: string;\n pluginId: string;\n githubUsername?: string;\n skipGitCheck?: boolean;\n captureCodemodOutput?: boolean;\n}\n\nexport type AddPluginResult =\n | {\n success: true;\n pluginName: string;\n pluginId: string;\n variant: string;\n envVars: { key: string; description: string }[];\n postInstallMessage: string | null;\n codemodOutput: string;\n codemodWarning?: string;\n }\n | { success: false; reason: string };\n\nexport async function addPlugin(\n options: AddPluginOptions,\n): Promise<AddPluginResult> {\n if (!options.skipGitCheck) {\n const gitClean = await isGitClean();\n\n if (!gitClean) {\n return {\n success: false,\n reason:\n 'Git working directory has uncommitted changes. Please commit or stash them before adding a plugin.',\n };\n }\n }\n\n const { variant } = await validateProject();\n\n const username = options.githubUsername?.trim() || getCachedUsername();\n\n if (!username) {\n return {\n success: false,\n reason:\n 'No GitHub username cached and none provided. Call makerkit_init_registry first or pass githubUsername.',\n };\n }\n\n cacheUsername(username);\n\n const registry = await PluginRegistry.load();\n const plugin = registry.validatePlugin(options.pluginId, variant);\n\n if (await isInstalled(plugin, variant)) {\n return {\n success: false,\n reason: `Plugin \"${plugin.name}\" is already installed.`,\n };\n }\n\n const item = await installRegistryFiles(variant, options.pluginId, username);\n await saveBaseVersions(options.pluginId, item.files);\n\n const codemodResult = await runCodemod(variant, options.pluginId, {\n captureOutput: options.captureCodemodOutput ?? true,\n });\n\n const envVars = getEnvVars(plugin, variant);\n\n return {\n success: true,\n pluginName: plugin.name,\n pluginId: plugin.id,\n variant,\n envVars: envVars.map((e) => ({ key: e.key, description: e.description })),\n postInstallMessage: plugin.postInstallMessage ?? null,\n codemodOutput: codemodResult.output,\n codemodWarning: codemodResult.success\n ? undefined\n : `The automated codemod did not complete successfully. Plugin files were installed but some wiring steps may have failed.\\n${codemodResult.output}`,\n };\n}\n","import {\n PluginRegistry,\n getEnvVars,\n isInstalled,\n} from '@/src/plugins-model';\nimport { detectVariant } from '@/src/utils/workspace';\n\nexport interface ListPluginsOptions {\n projectPath: string;\n}\n\nexport interface ListPluginsResult {\n variant: string;\n plugins: {\n id: string;\n name: string;\n description: string;\n installed: boolean;\n envVars: string[];\n postInstallMessage: string | null;\n }[];\n}\n\nexport async function listPlugins(\n options: ListPluginsOptions,\n): Promise<ListPluginsResult> {\n const variant = await detectVariant();\n const registry = await PluginRegistry.load();\n const plugins = registry.getPluginsForVariant(variant);\n\n const pluginList = await Promise.all(\n plugins.map(async (p) => ({\n id: p.id,\n name: p.name,\n description: p.description,\n installed: await isInstalled(p, variant),\n envVars: getEnvVars(p, variant).map((e) => e.key),\n postInstallMessage: p.postInstallMessage ?? null,\n })),\n );\n\n return { variant, plugins: pluginList };\n}\n","import { addPlugin } from '@/src/utils/add-plugin';\nimport { isGitClean } from '@/src/utils/git';\nimport { listPlugins } from '@/src/utils/list-plugins';\nimport {\n clearCachedUsername,\n getOrPromptUsername,\n} from '@/src/utils/username-cache';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport prompts from 'prompts';\n\nexport function createAddCommand(parentCommand: Command) {\n return parentCommand\n .command('add')\n .argument('[plugin-id...]', 'Plugins to install (e.g. feedback waitlist)')\n .description('Install one or more MakerKit plugins.')\n .action(async (pluginIds: string[]) => {\n try {\n // 1. Validate git is clean once upfront\n const gitClean = await isGitClean();\n\n if (!gitClean) {\n console.error(\n chalk.red(\n 'Your git working directory has uncommitted changes. Please commit or stash them before adding a plugin.',\n ),\n );\n\n process.exit(1);\n }\n\n // 2. If no plugin IDs provided, show interactive selection\n if (!pluginIds || pluginIds.length === 0) {\n const pluginsResult = await listPlugins({ projectPath: process.cwd() });\n const available = pluginsResult.plugins.filter((p) => !p.installed);\n\n if (available.length === 0) {\n console.log(chalk.green('All plugins are already installed.'));\n return;\n }\n\n const response = await prompts({\n type: 'multiselect',\n name: 'pluginIds',\n message: 'Select plugins to install',\n choices: available.map((p) => ({\n title: `${p.name} ${chalk.gray(`(${p.id})`)}`,\n value: p.id,\n })),\n });\n\n pluginIds = response.pluginIds as string[] | undefined ?? [];\n\n if (pluginIds.length === 0) {\n return;\n }\n }\n\n // 3. Prompt for username once\n let username = await getOrPromptUsername();\n\n // 4. Install each plugin\n for (const pluginId of pluginIds) {\n console.log(\n `\\nInstalling ${chalk.cyan(pluginId)}...\\n`,\n );\n\n const filesSpinner = ora('Installing plugin...').start();\n\n let result;\n\n try {\n result = await addPlugin({\n projectPath: process.cwd(),\n pluginId,\n githubUsername: username,\n skipGitCheck: true,\n captureCodemodOutput: false,\n });\n } catch (error) {\n // Auth failure — clear username, re-prompt, retry once\n filesSpinner.fail('Failed to install plugin.');\n\n clearCachedUsername();\n\n console.log(\n chalk.yellow('\\nRetrying with a different username...\\n'),\n );\n\n username = await getOrPromptUsername();\n\n const retrySpinner = ora('Installing plugin...').start();\n\n try {\n result = await addPlugin({\n projectPath: process.cwd(),\n pluginId,\n githubUsername: username,\n skipGitCheck: true,\n captureCodemodOutput: false,\n });\n } catch (retryError) {\n retrySpinner.fail('Failed to install plugin.');\n\n const message =\n retryError instanceof Error ? retryError.message : 'Unknown error';\n\n console.error(chalk.red(`\\nError installing \"${pluginId}\": ${message}`));\n console.log(\n chalk.yellow(\n '\\nTo revert changes, run: git checkout . && git clean -fd',\n ),\n );\n\n process.exit(1);\n }\n\n if (result.success) {\n retrySpinner.succeed('Plugin installed.');\n } else {\n retrySpinner.stop();\n }\n }\n\n if (!result.success) {\n if (result.reason.includes('already installed')) {\n filesSpinner.warn(result.reason + ' Skipping.');\n continue;\n }\n\n filesSpinner.fail('Failed to install plugin.');\n console.error(chalk.red(`\\n${result.reason}`));\n console.log(\n chalk.yellow(\n '\\nTo revert changes, run: git checkout . && git clean -fd',\n ),\n );\n\n process.exit(1);\n }\n\n if (result.codemodWarning) {\n filesSpinner.warn(\n `${result.pluginName} installed with warnings — some automated steps may not have completed.`,\n );\n console.log(chalk.yellow(`\\n${result.codemodWarning}`));\n console.log(\n chalk.yellow(\n '\\nPlugin files were written successfully. Review the changes with `git diff` and complete any missing steps manually.',\n ),\n );\n } else if (filesSpinner.isSpinning) {\n filesSpinner.succeed(`${result.pluginName} installed successfully!`);\n }\n\n if (result.envVars.length > 0) {\n console.log(chalk.white('\\nEnvironment variables to configure:'));\n\n for (const envVar of result.envVars) {\n console.log(\n ` ${chalk.cyan(envVar.key)} - ${envVar.description}`,\n );\n }\n }\n\n if (result.postInstallMessage) {\n console.log(chalk.white('\\nNext steps:'));\n console.log(` ${chalk.cyan(result.postInstallMessage)}`);\n }\n }\n\n // 5. Post-install warnings\n console.log('');\n console.log(chalk.yellow('Important:'));\n console.log(\n chalk.yellow(\n ' This plugin was installed using an automated migration.',\n ),\n );\n console.log(\n chalk.yellow(\n ' Please review the changes manually and test thoroughly before committing.',\n ),\n );\n console.log('');\n console.log(chalk.white('Tips:'));\n console.log(\n ` ${chalk.gray('-')} Run ${chalk.cyan('git diff')} to review all changes made by the migration.`,\n );\n console.log(\n ` ${chalk.gray('-')} Use an AI assistant (e.g. Claude) as a first pass to review the diff for issues.`,\n );\n console.log(\n ` ${chalk.gray('-')} Run your test suite and verify the app builds before committing.`,\n );\n console.log(\n ` ${chalk.gray('-')} To undo all changes: ${chalk.cyan('git checkout . && git clean -fd')}`,\n );\n console.log('');\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n console.log(\n chalk.yellow(\n '\\nTo revert changes, run: git checkout . && git clean -fd',\n ),\n );\n\n process.exit(1);\n }\n });\n}\n","import { dirname, join } from 'path';\nimport { tmpdir } from 'os';\n\nimport {\n PluginRegistry,\n isInstalled,\n} from '@/src/plugins-model';\nimport { getOrPromptUsername } from '@/src/utils/username-cache';\nimport { fetchRegistryItem } from '@/src/utils/install-registry-files';\nimport { validateProject } from '@/src/utils/workspace';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { execa } from 'execa';\nimport fs from 'fs-extra';\nimport ora from 'ora';\nimport prompts from 'prompts';\n\nexport function createDiffCommand(parentCommand: Command) {\n return parentCommand\n .command('diff')\n .argument('[plugin-id]', 'Plugin to diff (e.g. feedback, waitlist)')\n .description('Show differences between installed plugin files and the latest registry version.')\n .action(async (pluginId?: string) => {\n try {\n const { variant } = await validateProject();\n const registry = await PluginRegistry.load();\n\n if (!pluginId) {\n const plugins = registry.getPluginsForVariant(variant);\n\n const installed = [];\n\n for (const p of plugins) {\n if (await isInstalled(p, variant)) {\n installed.push(p);\n }\n }\n\n if (installed.length === 0) {\n console.log(chalk.yellow('No plugins installed.'));\n return;\n }\n\n const response = await prompts({\n type: 'select',\n name: 'pluginId',\n message: 'Select a plugin to diff',\n choices: installed.map((p) => ({\n title: `${p.name} ${chalk.gray(`(${p.id})`)}`,\n value: p.id,\n })),\n });\n\n pluginId = response.pluginId as string | undefined;\n\n if (!pluginId) {\n return;\n }\n }\n\n const plugin = registry.validatePlugin(pluginId, variant);\n\n if (!(await isInstalled(plugin, variant))) {\n console.error(\n chalk.yellow(`Plugin \"${plugin.name}\" is not installed.`),\n );\n\n return;\n }\n\n const username = await getOrPromptUsername();\n\n const spinner = ora('Fetching latest plugin files...').start();\n const item = await fetchRegistryItem(variant, pluginId, username);\n spinner.succeed('Fetched latest plugin files.');\n\n const tempDir = join(tmpdir(), `makerkit-diff-${pluginId}`);\n await fs.ensureDir(tempDir);\n\n try {\n const cwd = process.cwd();\n let hasDiff = false;\n\n for (const file of item.files) {\n const localPath = join(cwd, file.target);\n const remotePath = join(tempDir, file.target);\n\n await fs.ensureDir(dirname(join(tempDir, file.target)));\n await fs.writeFile(remotePath, file.content);\n\n if (!(await fs.pathExists(localPath))) {\n console.log(chalk.green(`\\nNew file: ${file.target}`));\n hasDiff = true;\n\n continue;\n }\n\n const localContent = await fs.readFile(localPath, 'utf-8');\n\n if (localContent !== file.content) {\n hasDiff = true;\n\n console.log(chalk.white(`\\n--- ${file.target}`));\n\n await execa('git', ['diff', '--no-index', '--color', '--', localPath, remotePath], {\n stdio: 'inherit',\n reject: false,\n });\n }\n }\n\n if (!hasDiff) {\n console.log(\n chalk.green(`\\n${plugin.name} is up to date.`),\n );\n }\n } finally {\n await fs.remove(tempDir);\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n }\n });\n}\n","import { cacheUsername } from '@/src/utils/username-cache';\nimport { detectVariant } from '@/src/utils/workspace';\n\nexport interface InitRegistryOptions {\n projectPath: string;\n githubUsername: string;\n}\n\nexport interface InitRegistryResult {\n success: true;\n variant: string;\n username: string;\n}\n\nexport async function initRegistry(\n options: InitRegistryOptions,\n): Promise<InitRegistryResult> {\n const variant = await detectVariant();\n\n cacheUsername(options.githubUsername);\n\n return {\n success: true,\n variant,\n username: options.githubUsername,\n };\n}\n","import { initRegistry } from '@/src/utils/init-registry';\nimport { listPlugins } from '@/src/utils/list-plugins';\nimport { getOrPromptUsername } from '@/src/utils/username-cache';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nexport function createInitCommand(parentCommand: Command) {\n return parentCommand\n .command('init')\n .description(\n 'Initialize MakerKit plugin registry in your project (one-time setup).',\n )\n .action(async () => {\n try {\n const username = await getOrPromptUsername();\n\n const initResult = await initRegistry({\n projectPath: process.cwd(),\n githubUsername: username,\n });\n\n console.log(\n `Detected project variant: ${chalk.cyan(initResult.variant)}\\n`,\n );\n\n console.log(chalk.green('Registry configured.\\n'));\n\n const pluginsResult = await listPlugins({ projectPath: process.cwd() });\n\n console.log(chalk.white('Available plugins:\\n'));\n\n for (const plugin of pluginsResult.plugins) {\n console.log(\n ` ${chalk.green(plugin.name)} ${chalk.gray(`(${plugin.id})`)}`,\n );\n }\n\n console.log(\n `\\nRun ${chalk.cyan('makerkit plugins add <plugin-id>')} to install a plugin.`,\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n }\n });\n}\n","import { listPlugins } from '@/src/utils/list-plugins';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nexport function createListPluginsCommand(parentCommand: Command) {\n return parentCommand\n .command('list')\n .description('List available and installed plugins.')\n .action(async () => {\n const result = await listPlugins({ projectPath: process.cwd() });\n\n console.log(\n chalk.white(`MakerKit Plugins ${chalk.gray(`(${result.variant})`)}\\n`),\n );\n\n console.log(\n ` ${chalk.green('Plugin Name')} ${chalk.gray('(plugin-id)')} — Status\\n`,\n );\n\n let installedCount = 0;\n\n for (const plugin of result.plugins) {\n if (plugin.installed) {\n installedCount++;\n }\n\n const status = plugin.installed\n ? chalk.green('installed')\n : chalk.gray('available');\n\n console.log(\n ` ${chalk.cyan(plugin.name)} ${chalk.gray(`(${plugin.id})`)} — ${status}`,\n );\n }\n\n console.log(\n `\\n ${chalk.white(`${installedCount} installed`)} / ${chalk.gray(`${result.plugins.length} available`)}\\n`,\n );\n\n if (installedCount === 0) {\n console.log(\n `Run ${chalk.cyan('makerkit plugins init')} to set up the registry, then ${chalk.cyan('makerkit plugins add <plugin-id>')} to install.`,\n );\n }\n });\n}\n","import { join } from 'path';\n\nimport {\n PluginRegistry,\n type PluginDefinition,\n getPath,\n isInstalled,\n} from '@/src/plugins-model';\nimport { getOrPromptUsername } from '@/src/utils/username-cache';\nimport { fetchRegistryItem } from '@/src/utils/install-registry-files';\nimport { type Variant, validateProject } from '@/src/utils/workspace';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport ora from 'ora';\n\nasync function isOutdated(\n plugin: PluginDefinition,\n variant: Variant,\n username: string,\n): Promise<boolean> {\n const item = await fetchRegistryItem(variant, plugin.id, username);\n const cwd = process.cwd();\n\n for (const file of item.files) {\n const localPath = join(cwd, file.target);\n\n if (!(await fs.pathExists(localPath))) {\n return true;\n }\n\n const localContent = await fs.readFile(localPath, 'utf-8');\n\n if (localContent !== file.content) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function createOutdatedCommand(parentCommand: Command) {\n return parentCommand\n .command('outdated')\n .description('Check installed plugins for updates.')\n .action(async () => {\n try {\n const { variant } = await validateProject();\n const registry = await PluginRegistry.load();\n const plugins = registry.getPluginsForVariant(variant);\n\n const installed = [];\n\n for (const p of plugins) {\n if (await isInstalled(p, variant)) {\n installed.push(p);\n }\n }\n\n if (installed.length === 0) {\n console.log(chalk.yellow('No plugins installed.'));\n return;\n }\n\n const username = await getOrPromptUsername();\n\n const spinner = ora(\n `Checking ${installed.length} plugin${installed.length > 1 ? 's' : ''} for updates...`,\n ).start();\n\n const outdated: PluginDefinition[] = [];\n\n for (const plugin of installed) {\n try {\n if (await isOutdated(plugin, variant, username)) {\n outdated.push(plugin);\n }\n } catch {\n // skip plugins that fail to fetch\n }\n }\n\n spinner.stop();\n\n if (outdated.length === 0) {\n console.log(chalk.green('All plugins are up to date.'));\n return;\n }\n\n console.log(\n chalk.yellow(\n `\\n${outdated.length} plugin${outdated.length > 1 ? 's have' : ' has'} updates available:\\n`,\n ),\n );\n\n for (const plugin of outdated) {\n const pluginPath = getPath(plugin, variant);\n\n console.log(\n ` ${chalk.cyan(plugin.name)} ${chalk.gray(`(${plugin.id})`)}${pluginPath ? chalk.gray(` — ${pluginPath}`) : ''}`,\n );\n }\n\n console.log(\n `\\nRun ${chalk.cyan('makerkit plugins diff <plugin-id>')} to see what changed.`,\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n }\n });\n}\n","import { dirname, join } from 'path';\n\nimport {\n PluginRegistry,\n isInstalled,\n} from '@/src/plugins-model';\nimport { saveBaseVersions } from '@/src/utils/base-store';\nimport { getOrPromptUsername } from '@/src/utils/username-cache';\nimport { fetchRegistryItem } from '@/src/utils/install-registry-files';\nimport { validateProject } from '@/src/utils/workspace';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport ora from 'ora';\nimport prompts from 'prompts';\n\nexport function createUpdateCommand(parentCommand: Command) {\n return parentCommand\n .command('update')\n .argument('[plugin-id...]', 'Plugins to update (e.g. feedback waitlist)')\n .description('Update installed plugins to the latest registry version.')\n .action(async (pluginIds?: string[]) => {\n try {\n const { variant } = await validateProject();\n const registry = await PluginRegistry.load();\n\n if (!pluginIds || pluginIds.length === 0) {\n const plugins = registry.getPluginsForVariant(variant);\n\n const installed = [];\n\n for (const p of plugins) {\n if (await isInstalled(p, variant)) {\n installed.push(p);\n }\n }\n\n if (installed.length === 0) {\n console.log(chalk.yellow('No plugins installed.'));\n return;\n }\n\n const response = await prompts({\n type: 'multiselect',\n name: 'pluginIds',\n message: 'Select plugins to update',\n choices: installed.map((p) => ({\n title: `${p.name} ${chalk.gray(`(${p.id})`)}`,\n value: p.id,\n })),\n });\n\n pluginIds = response.pluginIds as string[] | undefined ?? [];\n\n if (pluginIds.length === 0) {\n return;\n }\n }\n\n const username = await getOrPromptUsername();\n\n for (const pluginId of pluginIds) {\n const plugin = registry.validatePlugin(pluginId, variant);\n\n if (!(await isInstalled(plugin, variant))) {\n console.log(\n chalk.yellow(\n `Plugin \"${plugin.name}\" is not installed. Use \"plugins add ${pluginId}\" to install it.`,\n ),\n );\n\n continue;\n }\n\n const spinner = ora(`Fetching latest ${plugin.name} files...`).start();\n const item = await fetchRegistryItem(variant, pluginId, username);\n spinner.succeed(`Fetched latest ${plugin.name} files.`);\n\n const cwd = process.cwd();\n const modifiedFiles: string[] = [];\n\n for (const file of item.files) {\n const localPath = join(cwd, file.target);\n\n if (await fs.pathExists(localPath)) {\n const localContent = await fs.readFile(localPath, 'utf-8');\n\n if (localContent !== file.content) {\n modifiedFiles.push(file.target);\n }\n }\n }\n\n if (modifiedFiles.length === 0) {\n console.log(chalk.green(`${plugin.name} is already up to date.`));\n continue;\n }\n\n console.log(\n chalk.yellow(\n `\\n${modifiedFiles.length} file${modifiedFiles.length > 1 ? 's' : ''} will be overwritten:`,\n ),\n );\n\n for (const file of modifiedFiles) {\n console.log(` ${chalk.gray(file)}`);\n }\n\n const { confirm } = await prompts({\n type: 'confirm',\n name: 'confirm',\n message: `Update ${plugin.name}? Local changes will be lost.`,\n initial: false,\n });\n\n if (!confirm) {\n console.log(chalk.gray(`Skipped ${plugin.name}.`));\n continue;\n }\n\n const writeSpinner = ora(`Updating ${plugin.name}...`).start();\n\n for (const file of item.files) {\n const targetPath = join(cwd, file.target);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n\n await saveBaseVersions(pluginId, item.files);\n\n writeSpinner.succeed(`${plugin.name} updated.`);\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n }\n });\n}\n","import { createAddCommand } from '@/src/commands/plugins/add/add.command';\nimport { createDiffCommand } from '@/src/commands/plugins/diff/diff.command';\nimport { createInitCommand } from '@/src/commands/plugins/init/init.command';\nimport { createListPluginsCommand } from '@/src/commands/plugins/list/list-plugins.command';\nimport { createOutdatedCommand } from '@/src/commands/plugins/outdated/outdated.command';\nimport { createUpdateCommand } from '@/src/commands/plugins/update/update.command';\nimport { Command } from 'commander';\n\nexport const pluginsCommand = new Command()\n .name('plugins')\n .description('Manage MakerKit plugins.');\n\ncreateInitCommand(pluginsCommand);\ncreateAddCommand(pluginsCommand);\ncreateUpdateCommand(pluginsCommand);\ncreateDiffCommand(pluginsCommand);\ncreateOutdatedCommand(pluginsCommand);\ncreateListPluginsCommand(pluginsCommand);\n","import { join } from 'path';\n\nimport { execa, execaCommand } from 'execa';\nimport fs from 'fs-extra';\n\nimport { getErrorOutput, isGitClean } from '@/src/utils/git';\nimport {\n getUpstreamRemoteUrl,\n getUpstreamUrl,\n hasSshAccess,\n isUpstreamUrlValid,\n setUpstreamRemote,\n} from '@/src/utils/upstream';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface ProjectPullOptions {\n projectPath: string;\n}\n\nexport type ProjectPullResult =\n | {\n success: true;\n variant: string;\n upstreamUrl: string;\n alreadyUpToDate: boolean;\n message: string;\n }\n | {\n success: false;\n variant: string;\n upstreamUrl: string;\n hasConflicts: true;\n conflictCount: number;\n conflicts: {\n path: string;\n conflicted?: string;\n base?: string;\n ours?: string;\n theirs?: string;\n }[];\n instructions: string;\n }\n | { success: false; reason: string };\n\nexport async function projectPull(\n options: ProjectPullOptions,\n): Promise<ProjectPullResult> {\n const { variant } = await validateProject();\n\n const gitClean = await isGitClean();\n\n if (!gitClean) {\n return {\n success: false,\n reason:\n 'Git working directory has uncommitted changes. Please commit or stash them before pulling upstream updates.',\n };\n }\n\n let currentUrl = await getUpstreamRemoteUrl();\n\n if (!currentUrl) {\n const useSsh = await hasSshAccess();\n const url = getUpstreamUrl(variant, useSsh);\n\n await setUpstreamRemote(url);\n currentUrl = url;\n } else if (!isUpstreamUrlValid(currentUrl, variant)) {\n const useSsh = currentUrl.startsWith('git@');\n const expectedUrl = getUpstreamUrl(variant, useSsh);\n\n return {\n success: false,\n reason:\n `Upstream remote points to \"${currentUrl}\" but expected \"${expectedUrl}\" for variant \"${variant}\". ` +\n 'Please ask the user whether to update the upstream URL, then run: git remote set-url upstream <correct-url>',\n };\n }\n\n await execaCommand('git fetch upstream');\n\n try {\n const { stdout } = await execaCommand(\n 'git merge upstream/main --no-edit',\n );\n\n const alreadyUpToDate = stdout.includes('Already up to date');\n\n return {\n success: true,\n variant,\n upstreamUrl: currentUrl,\n alreadyUpToDate,\n message: alreadyUpToDate\n ? 'Already up to date.'\n : 'Successfully merged upstream changes.',\n };\n } catch (mergeError) {\n const output = getErrorOutput(mergeError);\n const isConflict =\n output.includes('CONFLICT') ||\n output.includes('Automatic merge failed');\n\n if (!isConflict) {\n throw new Error(`Merge failed: ${output}`);\n }\n\n const { stdout: statusOutput } = await execaCommand(\n 'git diff --name-only --diff-filter=U',\n );\n\n const conflictPaths = statusOutput\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n const cwd = process.cwd();\n\n const conflicts = await Promise.all(\n conflictPaths.map(async (filePath) => {\n let conflicted: string | undefined;\n\n try {\n conflicted = await fs.readFile(join(cwd, filePath), 'utf-8');\n } catch {\n conflicted = undefined;\n }\n\n let base: string | undefined;\n let ours: string | undefined;\n let theirs: string | undefined;\n\n try {\n const { stdout: b } = await execa('git', [\n 'show',\n `:1:${filePath}`,\n ]);\n base = b;\n } catch {\n base = undefined;\n }\n\n try {\n const { stdout: o } = await execa('git', [\n 'show',\n `:2:${filePath}`,\n ]);\n ours = o;\n } catch {\n ours = undefined;\n }\n\n try {\n const { stdout: t } = await execa('git', [\n 'show',\n `:3:${filePath}`,\n ]);\n theirs = t;\n } catch {\n theirs = undefined;\n }\n\n return { path: filePath, conflicted, base, ours, theirs };\n }),\n );\n\n return {\n success: false,\n variant,\n upstreamUrl: currentUrl,\n hasConflicts: true,\n conflictCount: conflicts.length,\n conflicts,\n instructions:\n 'Merge conflicts detected. For each conflict: review base, ours (local), and theirs (upstream) versions. ' +\n 'Produce resolved content and call makerkit_project_resolve_conflicts. ' +\n 'Ask the user for guidance when the intent behind local changes is unclear.',\n };\n }\n}\n","import { VARIANT_CATALOG } from '@/src/utils/list-variants';\nimport { projectPull } from '@/src/utils/project-pull';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport ora from 'ora';\n\nexport function createProjectUpdateCommand(parentCommand: Command) {\n return parentCommand\n .command('update')\n .description(\n 'Pull the latest changes from the upstream MakerKit repository.',\n )\n .action(async () => {\n try {\n const spinner = ora('Pulling latest changes from upstream...').start();\n\n const result = await projectPull({ projectPath: process.cwd() });\n\n if (result.success) {\n const displayName =\n VARIANT_CATALOG.find((v) => v.id === result.variant)?.name ??\n result.variant;\n\n if (result.alreadyUpToDate) {\n spinner.succeed(\n `Already up to date. (${chalk.cyan(displayName)})`,\n );\n } else {\n spinner.succeed(\n `Successfully pulled latest changes from upstream. (${chalk.cyan(displayName)})`,\n );\n }\n } else if ('hasConflicts' in result) {\n spinner.fail('Merge conflicts detected.');\n\n console.log(\n chalk.yellow(\n `\\n${result.conflictCount} conflicting file(s):`,\n ),\n );\n\n for (const conflict of result.conflicts) {\n console.log(` ${chalk.gray('-')} ${conflict.path}`);\n }\n\n console.log(\n chalk.yellow('\\nPlease resolve them manually:'),\n );\n\n console.log(chalk.gray(' 1. Fix the conflicting files'));\n console.log(chalk.gray(' 2. Run: git add .'));\n console.log(chalk.gray(' 3. Run: git commit'));\n\n process.exit(1);\n } else {\n spinner.fail('Failed to pull from upstream.');\n console.error(chalk.red(`\\n${result.reason}`));\n process.exit(1);\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n }\n });\n}\n","import { createProjectUpdateCommand } from '@/src/commands/project/update/update.command';\nimport { Command } from 'commander';\n\nexport const projectCommand = new Command()\n .name('project')\n .description('Manage your MakerKit project.');\n\ncreateProjectUpdateCommand(projectCommand);\n","#!/usr/bin/env node\nimport { newCommand } from '@/src/commands/new/new.command';\nimport { pluginsCommand } from '@/src/commands/plugins/plugins.command';\nimport { projectCommand } from '@/src/commands/project/project.command';\nimport { Command } from 'commander';\nimport { config } from 'dotenv';\n\nimport { CLI_VERSION } from '@/src/version';\n\nconfig({\n path: '.env.local',\n});\n\nprocess.on('SIGINT', () => process.exit(0));\nprocess.on('SIGTERM', () => process.exit(0));\n\nasync function main() {\n const program = new Command()\n .name('makerkit')\n .description(\n 'Your SaaS Kit companion. Add plugins, manage migrations, and more.'\n )\n .version(CLI_VERSION, '-v, --version', 'display the version number');\n\n program.addCommand(newCommand).addCommand(pluginsCommand).addCommand(projectCommand);\n\n program.parse();\n}\n\nvoid main();\n"],"mappings":"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","names":["join","fs","config","join","fs","join","fs","join","fs","join","fs","join","fs","execaCommand","execaCommand","dirname","join","fs","execaCommand","join","fs","prompts","join","fs","prompts","join","fs","chalk","ora","prompts","dirname","join","tmpdir","chalk","execa","fs","ora","prompts","join","tmpdir","dirname","chalk","chalk","join","chalk","fs","ora","join","dirname","join","chalk","fs","ora","prompts","join","dirname","Command","join","execa","execaCommand","fs","execaCommand","fs","join","execa","chalk","ora","Command","Command","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/new/new.command.ts","../src/utils/create-project.ts","../src/utils/marker-file.ts","../src/version.ts","../src/utils/upstream.ts","../src/utils/list-variants.ts","../src/plugins-model.ts","../src/utils/plugins-cache.ts","../src/utils/base-store.ts","../src/utils/git.ts","../src/utils/install-registry-files.ts","../src/utils/run-codemod.ts","../src/utils/username-cache.ts","../src/utils/workspace.ts","../src/utils/add-plugin.ts","../src/utils/list-plugins.ts","../src/commands/plugins/add/add.command.ts","../src/commands/plugins/diff/diff.command.ts","../src/utils/init-registry.ts","../src/commands/plugins/init/init.command.ts","../src/commands/plugins/list/list-plugins.command.ts","../src/commands/plugins/outdated/outdated.command.ts","../src/commands/plugins/update/update.command.ts","../src/commands/plugins/plugins.command.ts","../src/utils/project-pull.ts","../src/commands/project/update/update.command.ts","../src/commands/project/project.command.ts","../src/index.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport prompts from 'prompts';\n\nimport { createProject } from '@/src/utils/create-project';\nimport { VARIANT_CATALOG } from '@/src/utils/list-variants';\n\nexport const newCommand = new Command()\n .name('new')\n .description('Initialize a new Makerkit project')\n .action(async () => {\n const choices = VARIANT_CATALOG.map((v) => ({\n title: v.name,\n value: v.id,\n }));\n\n const { kit, name: projectName } = await prompts([\n {\n type: 'select',\n name: 'kit',\n message: `Select the ${chalk.cyan(`SaaS Kit`)} you want to clone`,\n choices,\n },\n {\n type: 'text',\n name: 'name',\n message: `Enter your ${chalk.cyan('Project Name')}.`,\n },\n ]);\n\n const selected = VARIANT_CATALOG.find((v) => v.id === kit);\n\n if (!selected) {\n console.log('Invalid kit selection. Aborting...');\n process.exit(1);\n }\n\n const { confirm } = await prompts([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Are you sure you want to clone ${chalk.cyan(\n selected.name\n )} to ${chalk.cyan(projectName)}?`,\n },\n ]);\n\n if (!confirm) {\n console.log('Aborting...');\n process.exit(0);\n }\n\n const spinner = ora(`Cloning ${selected.name}...`).start();\n\n try {\n const result = await createProject({\n variant: selected.id,\n name: projectName,\n directory: process.cwd(),\n });\n\n spinner.succeed(`${result.message}`);\n\n console.log(\n `You can now get started. Open the project in your IDE and read the README.md file for more information.`\n );\n } catch (e) {\n console.error(e);\n spinner.fail(`Failed to create project`);\n process.exit(1);\n }\n });\n","import { join } from 'path';\n\nimport { execa } from 'execa';\nimport fs from 'fs-extra';\n\nimport { writeMarkerFile } from '@/src/utils/marker-file';\nimport { VARIANT_REPO_MAP, hasSshAccess } from '@/src/utils/upstream';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface CreateProjectOptions {\n variant: Variant;\n name: string;\n directory: string;\n githubToken?: string;\n}\n\nexport interface CreateProjectResult {\n success: boolean;\n projectPath: string;\n variant: Variant;\n kitRepo: string;\n message: string;\n}\n\nexport async function createProject(\n options: CreateProjectOptions,\n): Promise<CreateProjectResult> {\n const { variant, name, directory, githubToken } = options;\n const projectPath = join(directory, name);\n const repo = VARIANT_REPO_MAP[variant];\n\n // 1. Validate target dir doesn't already exist\n if (await fs.pathExists(projectPath)) {\n throw new Error(\n `Target directory \"${projectPath}\" already exists. Choose a different name or remove it first.`,\n );\n }\n\n // 2. Validate parent dir exists\n if (!(await fs.pathExists(directory))) {\n throw new Error(\n `Parent directory \"${directory}\" does not exist.`,\n );\n }\n\n // 3. Resolve clone URL\n let cloneUrl: string;\n\n if (githubToken) {\n cloneUrl = `https://${githubToken}@github.com/${repo}`;\n } else {\n const useSsh = await hasSshAccess();\n cloneUrl = useSsh\n ? `git@github.com:${repo}`\n : `https://github.com/${repo}`;\n }\n\n // 4. Clone\n await execa('git', ['clone', cloneUrl, name], { cwd: directory });\n\n // 5. Strip token from remote if needed\n if (githubToken) {\n await execa(\n 'git',\n ['remote', 'set-url', 'origin', `https://github.com/${repo}`],\n { cwd: projectPath },\n );\n }\n\n // 6. Install dependencies\n await execa('pnpm', ['install'], { cwd: projectPath });\n\n // 7. Write marker file\n await writeMarkerFile(projectPath, variant, repo);\n\n return {\n success: true,\n projectPath,\n variant,\n kitRepo: repo,\n message: `Project \"${name}\" created successfully with variant \"${variant}\".`,\n };\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport { CLI_VERSION } from '@/src/version';\n\nexport interface MakerkitProjectConfig {\n version: number;\n variant: string;\n kit_repo: string;\n created_at: string;\n cli_version: string;\n}\n\nexport async function writeMarkerFile(\n projectPath: string,\n variant: string,\n kitRepo: string,\n): Promise<void> {\n const dir = join(projectPath, '.makerkit');\n\n await fs.ensureDir(dir);\n\n const config: MakerkitProjectConfig = {\n version: 1,\n variant,\n kit_repo: kitRepo,\n created_at: new Date().toISOString(),\n cli_version: CLI_VERSION,\n };\n\n await fs.writeJson(join(dir, 'config.json'), config, { spaces: 2 });\n}\n\nexport async function readMarkerFile(\n projectPath: string,\n): Promise<MakerkitProjectConfig | null> {\n const filePath = join(projectPath, '.makerkit', 'config.json');\n\n if (!(await fs.pathExists(filePath))) {\n return null;\n }\n\n return fs.readJson(filePath);\n}\n","export const CLI_VERSION = '2.0.0-beta.1';\n","import type { Variant } from '@/src/utils/workspace';\n\nimport { execaCommand } from 'execa';\n\nexport const VARIANT_REPO_MAP: Record<Variant, string> = {\n 'next-supabase': 'makerkit/next-supabase-saas-kit-turbo',\n 'next-drizzle': 'makerkit/next-drizzle-saas-kit-turbo',\n 'next-prisma': 'makerkit/next-prisma-saas-kit-turbo',\n 'react-router-supabase': 'makerkit/react-router-supabase-saas-kit-turbo',\n};\n\nfunction sshUrl(repo: string): string {\n return `git@github.com:${repo}`;\n}\n\nfunction httpsUrl(repo: string): string {\n return `https://github.com/${repo}`;\n}\n\nexport async function hasSshAccess(): Promise<boolean> {\n try {\n await execaCommand('ssh -T git@github.com -o StrictHostKeyChecking=no', {\n timeout: 10_000,\n });\n\n return true;\n } catch (error) {\n // ssh -T git@github.com exits with code 1 even on success,\n // but prints \"successfully authenticated\" in stderr\n const stderr =\n error instanceof Error && 'stderr' in error\n ? String((error as { stderr: unknown }).stderr)\n : '';\n\n return stderr.includes('successfully authenticated');\n }\n}\n\nexport function getUpstreamUrl(variant: Variant, useSsh: boolean): string {\n const repo = VARIANT_REPO_MAP[variant];\n\n return useSsh ? sshUrl(repo) : httpsUrl(repo);\n}\n\n/**\n * Check if a remote URL points to the correct repo for the given variant,\n * regardless of whether it uses SSH or HTTPS.\n * Handles trailing `.git` and `/` in URLs.\n */\nexport function isUpstreamUrlValid(\n url: string,\n variant: Variant,\n): boolean {\n const normalized = url.replace(/\\/+$/, '').replace(/\\.git$/, '');\n const repo = VARIANT_REPO_MAP[variant];\n\n return normalized === sshUrl(repo) || normalized === httpsUrl(repo);\n}\n\nexport async function getUpstreamRemoteUrl(): Promise<string | undefined> {\n try {\n const { stdout } = await execaCommand('git remote get-url upstream');\n return stdout.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function setUpstreamRemote(url: string): Promise<void> {\n const currentUrl = await getUpstreamRemoteUrl();\n\n if (currentUrl) {\n await execaCommand(`git remote set-url upstream ${url}`);\n } else {\n await execaCommand(`git remote add upstream ${url}`);\n }\n}\n","import { VARIANT_REPO_MAP } from '@/src/utils/upstream';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface VariantInfo {\n id: Variant;\n name: string;\n description: string;\n repo: string;\n tech: string[];\n database: string;\n auth: string;\n status: 'stable' | 'beta' | 'deprecated';\n}\n\nexport const VARIANT_CATALOG: VariantInfo[] = [\n {\n id: 'next-supabase',\n name: 'Next.js + Supabase',\n description: 'Full-stack SaaS kit with Next.js App Router and Supabase',\n repo: VARIANT_REPO_MAP['next-supabase'],\n tech: ['Next.js', 'Supabase', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL (Supabase)',\n auth: 'Supabase Auth',\n status: 'stable',\n },\n {\n id: 'next-drizzle',\n name: 'Next.js + Drizzle',\n description: 'Full-stack SaaS kit with Next.js and Drizzle ORM',\n repo: VARIANT_REPO_MAP['next-drizzle'],\n tech: ['Next.js', 'Drizzle', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL',\n auth: 'Better Auth',\n status: 'stable',\n },\n {\n id: 'next-prisma',\n name: 'Next.js + Prisma',\n description: 'Full-stack SaaS kit with Next.js and Prisma ORM',\n repo: VARIANT_REPO_MAP['next-prisma'],\n tech: ['Next.js', 'Prisma', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL',\n auth: 'Better Auth',\n status: 'stable',\n },\n {\n id: 'react-router-supabase',\n name: 'React Router + Supabase',\n description: 'Full-stack SaaS kit with React Router and Supabase',\n repo: VARIANT_REPO_MAP['react-router-supabase'],\n tech: ['React Router', 'Supabase', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL (Supabase)',\n auth: 'Supabase Auth',\n status: 'stable',\n },\n];\n\nexport interface ListVariantsResult {\n variants: VariantInfo[];\n}\n\nexport function listVariants(): ListVariantsResult {\n return { variants: VARIANT_CATALOG };\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\nimport invariant from 'tiny-invariant';\n\nimport { fetchPluginRegistry } from '@/src/utils/plugins-cache';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface EnvVar {\n key: string;\n description: string;\n defaultValue?: string;\n}\n\nexport interface VariantConfig {\n envVars: EnvVar[];\n path?: string;\n}\n\nexport interface PluginDefinition {\n name: string;\n id: string;\n description: string;\n variants: Partial<Record<Variant, VariantConfig>>;\n postInstallMessage?: string;\n}\n\nconst DEFAULT_PLUGINS: Record<string, PluginDefinition> = {\n feedback: {\n name: 'Feedback',\n id: 'feedback',\n description: 'Add a feedback popup to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/feedback',\n },\n },\n },\n waitlist: {\n name: 'Waitlist',\n id: 'waitlist',\n description: 'Add a waitlist to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/waitlist',\n },\n },\n },\n testimonial: {\n name: 'Testimonial',\n id: 'testimonial',\n description: 'Add a testimonial widget to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/testimonial',\n },\n },\n },\n roadmap: {\n name: 'Roadmap',\n id: 'roadmap',\n description: 'Add a roadmap to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/roadmap',\n },\n },\n },\n 'google-analytics': {\n name: 'Google Analytics',\n id: 'google-analytics',\n description: 'Add Google Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n }\n },\n },\n honeybadger: {\n name: 'Honeybadger',\n id: 'honeybadger',\n description: 'Add Honeybadger Error Tracking to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'HONEYBADGER_API_KEY',\n description: 'Honeybadger private API key',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT',\n description: 'Honeybadger environment',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_REVISION',\n description: 'Honeybadger log revision',\n }\n ],\n path: 'packages/plugins/honeybadger',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'HONEYBADGER_API_KEY',\n description: 'Honeybadger private API key',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT',\n description: 'Honeybadger environment',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_REVISION',\n description: 'Honeybadger log revision',\n }\n ],\n path: 'packages/plugins/honeybadger',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'HONEYBADGER_API_KEY',\n description: 'Honeybadger private API key',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT',\n description: 'Honeybadger environment',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_REVISION',\n description: 'Honeybadger log revision',\n }\n ],\n },\n }\n },\n posthog: {\n name: 'PostHog',\n id: 'posthog',\n description: 'Add PostHog Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n },\n },\n umami: {\n name: 'Umami',\n id: 'umami',\n description: 'Add Umami Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n },\n },\n signoz: {\n name: 'SigNoz',\n id: 'signoz',\n description: 'Add SigNoz Monitoring to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n },\n },\n paddle: {\n name: 'Paddle',\n id: 'paddle',\n description: 'Add Paddle Billing to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_PADDLE_CLIENT_TOKEN',\n description: 'Paddle client-side token',\n },\n {\n key: 'PADDLE_API_KEY',\n description: 'Paddle API key',\n },\n {\n key: 'PADDLE_WEBHOOK_SECRET',\n description: 'Paddle webhook secret',\n },\n ],\n path: 'packages/plugins/paddle',\n },\n },\n },\n 'supabase-cms': {\n name: 'Supabase CMS',\n id: 'supabase-cms',\n description: 'Add Supabase CMS provider to your app.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/supabase-cms',\n },\n },\n },\n 'meshes-analytics': {\n name: 'Meshes Analytics',\n id: 'meshes-analytics',\n description: 'Add Meshes Analytics to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_MESHES_PUBLISHABLE_KEY',\n description: 'The Meshes publishable key'\n }\n ],\n path: 'packages/plugins/meshes-analytics',\n },\n },\n },\n directus: {\n name: 'Directus CMS',\n id: 'directus',\n description: 'Add Directus as your CMS.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n },\n }\n};\n\nexport class PluginRegistry {\n private constructor(\n private plugins: Record<string, PluginDefinition>,\n ) {}\n\n static async load(): Promise<PluginRegistry> {\n const registryUrl = process.env.MAKERKIT_PLUGINS_REGISTRY_URL;\n const plugins = await fetchPluginRegistry(registryUrl, DEFAULT_PLUGINS);\n\n return new PluginRegistry(plugins);\n }\n\n getPluginById(id: string): PluginDefinition | undefined {\n return this.plugins[id];\n }\n\n getPluginsForVariant(variant: Variant): PluginDefinition[] {\n return Object.values(this.plugins).filter((p) => variant in p.variants);\n }\n\n validatePlugin(pluginId: string, variant: Variant): PluginDefinition {\n const plugin = this.getPluginById(pluginId);\n\n invariant(plugin, `Plugin \"${pluginId}\" not found`);\n\n invariant(\n plugin.variants[variant],\n `Plugin \"${pluginId}\" is not available for the ${variant} variant`,\n );\n\n return plugin;\n }\n}\n\nexport function getEnvVars(\n plugin: PluginDefinition,\n variant: Variant,\n): EnvVar[] {\n return plugin.variants[variant]?.envVars ?? [];\n}\n\nexport function getPath(\n plugin: PluginDefinition,\n variant: Variant,\n): string | undefined {\n return plugin.variants[variant]?.path;\n}\n\nexport async function isInstalled(\n plugin: PluginDefinition,\n variant: Variant,\n): Promise<boolean> {\n const pluginPath = getPath(plugin, variant);\n\n if (!pluginPath) {\n return false;\n }\n\n const pkgJsonPath = join(process.cwd(), pluginPath, 'package.json');\n\n if (!(await fs.pathExists(pkgJsonPath))) {\n return false;\n }\n\n try {\n const pkg = await fs.readJson(pkgJsonPath);\n\n return !!pkg.name && !!pkg.exports;\n } catch {\n return false;\n }\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\n\nimport fs from 'fs-extra';\n\nimport type { PluginDefinition } from '@/src/plugins-model';\n\nconst CACHE_DIR = join(homedir(), '.makerkit');\nconst CACHE_FILE = join(CACHE_DIR, 'plugins.json');\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\ninterface CacheEntry {\n fetchedAt: number;\n plugins: Record<string, PluginDefinition>;\n}\n\nasync function readCache(): Promise<CacheEntry | null> {\n try {\n if (!(await fs.pathExists(CACHE_FILE))) {\n return null;\n }\n\n return await fs.readJson(CACHE_FILE);\n } catch {\n return null;\n }\n}\n\nasync function writeCache(\n plugins: Record<string, PluginDefinition>,\n): Promise<void> {\n try {\n await fs.ensureDir(CACHE_DIR);\n\n await fs.writeJson(\n CACHE_FILE,\n { fetchedAt: Date.now(), plugins },\n { spaces: 2 },\n );\n } catch {\n // Ignore cache write failures\n }\n}\n\nexport async function fetchPluginRegistry(\n registryUrl: string | undefined,\n fallback: Record<string, PluginDefinition>,\n): Promise<Record<string, PluginDefinition>> {\n if (!registryUrl) {\n return fallback;\n }\n\n // Check cache first\n const cached = await readCache();\n\n if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {\n return cached.plugins;\n }\n\n // Fetch from remote\n try {\n const response = await fetch(registryUrl);\n\n if (response.ok) {\n const data = await response.json();\n const plugins = data.plugins as Record<string, PluginDefinition>;\n\n await writeCache(plugins);\n\n return plugins;\n }\n } catch {\n // Network error — fall through\n }\n\n // Return stale cache if available, otherwise bundled fallback\n return cached?.plugins ?? fallback;\n}\n","import { dirname, join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport type { RegistryFile } from '@/src/utils/install-registry-files';\n\nexport type FileStatus =\n | 'unchanged'\n | 'updated'\n | 'conflict'\n | 'added'\n | 'deleted_locally'\n | 'no_base';\n\nfunction basesDir(pluginId: string): string {\n return join(process.cwd(), 'node_modules', '.cache', 'makerkit', 'bases', pluginId);\n}\n\nexport async function saveBaseVersions(\n pluginId: string,\n files: RegistryFile[],\n): Promise<void> {\n const dir = basesDir(pluginId);\n\n for (const file of files) {\n const targetPath = join(dir, file.target);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n}\n\nexport async function readBaseVersion(\n pluginId: string,\n fileTarget: string,\n): Promise<string | undefined> {\n const filePath = join(basesDir(pluginId), fileTarget);\n\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch {\n return undefined;\n }\n}\n\nexport async function hasBaseVersions(pluginId: string): Promise<boolean> {\n return fs.pathExists(basesDir(pluginId));\n}\n\nexport function computeFileStatus(params: {\n base?: string;\n local?: string;\n remote: string;\n}): FileStatus {\n const { base, local, remote } = params;\n\n // Local matches remote — nothing to do regardless of base\n if (local !== undefined && local === remote) {\n return 'unchanged';\n }\n\n // No base version (legacy install or new file)\n if (base === undefined) {\n if (local === undefined) {\n return 'added';\n }\n\n return 'no_base';\n }\n\n // Has base version\n if (local === undefined) {\n return 'deleted_locally';\n }\n\n if (base === local) {\n // User hasn't touched the file — safe auto-apply\n return 'updated';\n }\n\n if (base === remote) {\n // Remote hasn't changed — local edits are fine\n return 'unchanged';\n }\n\n // Both sides changed\n return 'conflict';\n}\n","import { execaCommand } from 'execa';\n\nexport function getErrorOutput(error: unknown): string {\n if (error instanceof Error && 'stderr' in error) {\n const stderr = String((error as { stderr: unknown }).stderr);\n\n if (stderr) return stderr;\n }\n\n if (error instanceof Error && 'stdout' in error) {\n const stdout = String((error as { stdout: unknown }).stdout);\n\n if (stdout) return stdout;\n }\n\n return error instanceof Error ? error.message : String(error);\n}\n\nexport async function isGitClean(): Promise<boolean> {\n const { stdout } = await execaCommand('git status --porcelain');\n\n return stdout.trim() === '';\n}\n\nexport async function getGitRoot(): Promise<string> {\n const { stdout } = await execaCommand('git rev-parse --show-toplevel');\n\n return stdout.trim();\n}\n\nexport async function getGitUsername(): Promise<string | undefined> {\n try {\n const { stdout } = await execaCommand('git config --get user.username');\n const username = stdout.trim();\n\n return username.length > 0 ? username : undefined;\n } catch {\n return undefined;\n }\n}\n","import { dirname, join } from 'path';\nimport fs from 'fs-extra';\n\nexport interface RegistryFile {\n path: string;\n content: string;\n type: string;\n target: string;\n}\n\nexport interface RegistryItem {\n name: string;\n files: RegistryFile[];\n dependencies?: Record<string, string>;\n}\n\nexport async function fetchRegistryItem(\n variant: string,\n pluginId: string,\n username: string,\n): Promise<RegistryItem> {\n const url = `https://makerkit.dev/r/${variant}/${pluginId}.json?username=${username}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch plugin registry for \"${pluginId}\" (${response.status}): ${response.statusText}`,\n );\n }\n\n const item: RegistryItem = await response.json();\n\n if (!item.files || item.files.length === 0) {\n throw new Error(`Plugin \"${pluginId}\" has no files in the registry.`);\n }\n\n return item;\n}\n\nexport async function installRegistryFiles(\n variant: string,\n pluginId: string,\n username: string,\n): Promise<RegistryItem> {\n const item = await fetchRegistryItem(variant, pluginId, username);\n const cwd = process.cwd();\n\n for (const file of item.files) {\n const targetPath = join(cwd, file.target);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n\n return item;\n}\n","import { execaCommand } from 'execa';\n\nconst CODEMOD_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\nexport async function runCodemod(\n variant: string,\n pluginId: string,\n options?: { captureOutput?: boolean },\n): Promise<{ success: boolean; output: string }> {\n try {\n const localPath = process.env.MAKERKIT_CODEMODS_PATH;\n const runner = process.env.MAKERKIT_PACKAGE_RUNNER ?? 'npx --yes';\n\n const command = localPath\n ? `${runner} codemod workflow run --allow-dirty -w ${localPath}/codemods/${variant}/${pluginId}`\n : `${runner} codemod --allow-dirty @makerkit/${variant}-${pluginId}`;\n\n const { stdout, stderr } = await execaCommand(command, {\n stdio: options?.captureOutput ? 'pipe' : 'inherit',\n timeout: CODEMOD_TIMEOUT_MS,\n });\n\n return {\n success: true,\n output: stdout || stderr || '',\n };\n } catch (error) {\n let message = 'Unknown error during codemod';\n\n if (error instanceof Error) {\n message = error.message;\n\n if ('stderr' in error && error.stderr) {\n message += `\\n${error.stderr}`;\n }\n\n if ('timedOut' in error && error.timedOut) {\n message = `Codemod timed out after ${CODEMOD_TIMEOUT_MS / 1000}s (the workflow engine may have stalled after an error)`;\n }\n }\n\n return {\n success: false,\n output: message,\n };\n }\n}\n","import { join } from 'path';\nimport { tmpdir } from 'os';\n\nimport fs from 'fs-extra';\nimport prompts from 'prompts';\n\nimport { getGitUsername } from '@/src/utils/git';\n\nconst USERNAME_FILE = join(tmpdir(), 'makerkit-username');\n\nexport function getCachedUsername(): string | undefined {\n try {\n const username = fs.readFileSync(USERNAME_FILE, 'utf-8').trim();\n\n return username.length > 0 ? username : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function cacheUsername(username: string): void {\n fs.writeFileSync(USERNAME_FILE, username, 'utf-8');\n}\n\nexport function clearCachedUsername(): void {\n try {\n fs.removeSync(USERNAME_FILE);\n } catch {\n // ignore\n }\n}\n\nexport async function promptForUsername(): Promise<string> {\n const gitUsername = await getGitUsername();\n\n const response = await prompts({\n type: 'text',\n name: 'githubUsername',\n message:\n 'Enter the GitHub username registered with your Makerkit account',\n initial: gitUsername,\n validate: (value) => {\n return value.trim().length > 0 ? true : 'GitHub username is required';\n },\n });\n\n const username = (response.githubUsername as string | undefined)?.trim();\n\n if (!username) {\n throw new Error('Setup cancelled. GitHub username is required.');\n }\n\n cacheUsername(username);\n\n return username;\n}\n\nexport async function getOrPromptUsername(\n providedUsername?: string,\n): Promise<string> {\n if (providedUsername?.trim()) {\n const username = providedUsername.trim();\n\n cacheUsername(username);\n\n return username;\n }\n\n const cached = getCachedUsername();\n\n if (cached) {\n return cached;\n }\n\n return promptForUsername();\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\n\nexport type Variant =\n | 'next-supabase'\n | 'next-drizzle'\n | 'next-prisma'\n | 'react-router-supabase';\n\nasync function readDeps(\n pkgPath: string,\n): Promise<Record<string, string>> {\n if (!(await fs.pathExists(pkgPath))) {\n return {};\n }\n\n const pkg = await fs.readJson(pkgPath);\n\n return {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n}\n\nexport async function detectVariant(): Promise<Variant> {\n const cwd = process.cwd();\n\n const rootPkgPath = join(cwd, 'package.json');\n\n if (!(await fs.pathExists(rootPkgPath))) {\n throw new Error(\n 'No package.json found. Please run this command from a MakerKit project root.',\n );\n }\n\n const rootDeps = await readDeps(rootPkgPath);\n\n if (!rootDeps['turbo']) {\n throw new Error(\n 'This does not appear to be a MakerKit Turbo monorepo. The \"turbo\" dependency was not found in package.json.',\n );\n }\n\n const webDeps = await readDeps(join(cwd, 'apps', 'web', 'package.json'));\n const dbDeps = await readDeps(\n join(cwd, 'packages', 'database', 'package.json'),\n );\n\n const hasSupabase = !!webDeps['@supabase/supabase-js'];\n const hasReactRouter = !!webDeps['@react-router/node'];\n const hasDrizzle = !!webDeps['drizzle-orm'] || !!dbDeps['drizzle-orm'];\n const hasPrisma = !!webDeps['@prisma/client'] || !!dbDeps['@prisma/client'];\n\n if (hasReactRouter && hasSupabase) {\n return 'react-router-supabase';\n }\n\n if (hasSupabase) {\n return 'next-supabase';\n }\n\n if (hasDrizzle) {\n return 'next-drizzle';\n }\n\n if (hasPrisma) {\n return 'next-prisma';\n }\n\n throw new Error(\n 'Unrecognized MakerKit project. Could not detect variant from dependencies.',\n );\n}\n\nexport async function validateProject(): Promise<{\n variant: Variant;\n version: string;\n}> {\n const variant = await detectVariant();\n const rootPkg = await fs.readJson(join(process.cwd(), 'package.json'));\n\n return {\n variant,\n version: rootPkg.version ?? 'unknown',\n };\n}\n","import {\n PluginRegistry,\n getEnvVars,\n isInstalled,\n} from '@/src/plugins-model';\nimport { saveBaseVersions } from '@/src/utils/base-store';\nimport { isGitClean } from '@/src/utils/git';\nimport { installRegistryFiles } from '@/src/utils/install-registry-files';\nimport { runCodemod } from '@/src/utils/run-codemod';\nimport {\n cacheUsername,\n getCachedUsername,\n} from '@/src/utils/username-cache';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface AddPluginOptions {\n projectPath: string;\n pluginId: string;\n githubUsername?: string;\n skipGitCheck?: boolean;\n captureCodemodOutput?: boolean;\n}\n\nexport type AddPluginResult =\n | {\n success: true;\n pluginName: string;\n pluginId: string;\n variant: string;\n envVars: { key: string; description: string }[];\n postInstallMessage: string | null;\n codemodOutput: string;\n codemodWarning?: string;\n }\n | { success: false; reason: string };\n\nexport async function addPlugin(\n options: AddPluginOptions,\n): Promise<AddPluginResult> {\n if (!options.skipGitCheck) {\n const gitClean = await isGitClean();\n\n if (!gitClean) {\n return {\n success: false,\n reason:\n 'Git working directory has uncommitted changes. Please commit or stash them before adding a plugin.',\n };\n }\n }\n\n const { variant } = await validateProject();\n\n const username = options.githubUsername?.trim() || getCachedUsername();\n\n if (!username) {\n return {\n success: false,\n reason:\n 'No GitHub username cached and none provided. Call makerkit_init_registry first or pass githubUsername.',\n };\n }\n\n cacheUsername(username);\n\n const registry = await PluginRegistry.load();\n const plugin = registry.validatePlugin(options.pluginId, variant);\n\n if (await isInstalled(plugin, variant)) {\n return {\n success: false,\n reason: `Plugin \"${plugin.name}\" is already installed.`,\n };\n }\n\n const item = await installRegistryFiles(variant, options.pluginId, username);\n await saveBaseVersions(options.pluginId, item.files);\n\n const codemodResult = await runCodemod(variant, options.pluginId, {\n captureOutput: options.captureCodemodOutput ?? true,\n });\n\n const envVars = getEnvVars(plugin, variant);\n\n return {\n success: true,\n pluginName: plugin.name,\n pluginId: plugin.id,\n variant,\n envVars: envVars.map((e) => ({ key: e.key, description: e.description })),\n postInstallMessage: plugin.postInstallMessage ?? null,\n codemodOutput: codemodResult.output,\n codemodWarning: codemodResult.success\n ? undefined\n : `The automated codemod did not complete successfully. Plugin files were installed but some wiring steps may have failed.\\n${codemodResult.output}`,\n };\n}\n","import {\n PluginRegistry,\n getEnvVars,\n isInstalled,\n} from '@/src/plugins-model';\nimport { detectVariant } from '@/src/utils/workspace';\n\nexport interface ListPluginsOptions {\n projectPath: string;\n}\n\nexport interface ListPluginsResult {\n variant: string;\n plugins: {\n id: string;\n name: string;\n description: string;\n installed: boolean;\n envVars: string[];\n postInstallMessage: string | null;\n }[];\n}\n\nexport async function listPlugins(\n options: ListPluginsOptions,\n): Promise<ListPluginsResult> {\n const variant = await detectVariant();\n const registry = await PluginRegistry.load();\n const plugins = registry.getPluginsForVariant(variant);\n\n const pluginList = await Promise.all(\n plugins.map(async (p) => ({\n id: p.id,\n name: p.name,\n description: p.description,\n installed: await isInstalled(p, variant),\n envVars: getEnvVars(p, variant).map((e) => e.key),\n postInstallMessage: p.postInstallMessage ?? null,\n })),\n );\n\n return { variant, plugins: pluginList };\n}\n","import { addPlugin } from '@/src/utils/add-plugin';\nimport { isGitClean } from '@/src/utils/git';\nimport { listPlugins } from '@/src/utils/list-plugins';\nimport {\n clearCachedUsername,\n getOrPromptUsername,\n} from '@/src/utils/username-cache';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport prompts from 'prompts';\n\nexport function createAddCommand(parentCommand: Command) {\n return parentCommand\n .command('add')\n .argument('[plugin-id...]', 'Plugins to install (e.g. feedback waitlist)')\n .description('Install one or more MakerKit plugins.')\n .action(async (pluginIds: string[]) => {\n try {\n // 1. Validate git is clean once upfront\n const gitClean = await isGitClean();\n\n if (!gitClean) {\n console.error(\n chalk.red(\n 'Your git working directory has uncommitted changes. Please commit or stash them before adding a plugin.',\n ),\n );\n\n process.exit(1);\n }\n\n // 2. If no plugin IDs provided, show interactive selection\n if (!pluginIds || pluginIds.length === 0) {\n const pluginsResult = await listPlugins({ projectPath: process.cwd() });\n const available = pluginsResult.plugins.filter((p) => !p.installed);\n\n if (available.length === 0) {\n console.log(chalk.green('All plugins are already installed.'));\n return;\n }\n\n const response = await prompts({\n type: 'multiselect',\n name: 'pluginIds',\n message: 'Select plugins to install',\n choices: available.map((p) => ({\n title: `${p.name} ${chalk.gray(`(${p.id})`)}`,\n value: p.id,\n })),\n });\n\n pluginIds = response.pluginIds as string[] | undefined ?? [];\n\n if (pluginIds.length === 0) {\n return;\n }\n }\n\n // 3. Prompt for username once\n let username = await getOrPromptUsername();\n\n // 4. Install each plugin\n for (const pluginId of pluginIds) {\n console.log(\n `\\nInstalling ${chalk.cyan(pluginId)}...\\n`,\n );\n\n const filesSpinner = ora('Installing plugin...').start();\n\n let result;\n\n try {\n result = await addPlugin({\n projectPath: process.cwd(),\n pluginId,\n githubUsername: username,\n skipGitCheck: true,\n captureCodemodOutput: false,\n });\n } catch (error) {\n // Auth failure — clear username, re-prompt, retry once\n filesSpinner.fail('Failed to install plugin.');\n\n clearCachedUsername();\n\n console.log(\n chalk.yellow('\\nRetrying with a different username...\\n'),\n );\n\n username = await getOrPromptUsername();\n\n const retrySpinner = ora('Installing plugin...').start();\n\n try {\n result = await addPlugin({\n projectPath: process.cwd(),\n pluginId,\n githubUsername: username,\n skipGitCheck: true,\n captureCodemodOutput: false,\n });\n } catch (retryError) {\n retrySpinner.fail('Failed to install plugin.');\n\n const message =\n retryError instanceof Error ? retryError.message : 'Unknown error';\n\n console.error(chalk.red(`\\nError installing \"${pluginId}\": ${message}`));\n console.log(\n chalk.yellow(\n '\\nTo revert changes, run: git checkout . && git clean -fd',\n ),\n );\n\n process.exit(1);\n }\n\n if (result.success) {\n retrySpinner.succeed('Plugin installed.');\n } else {\n retrySpinner.stop();\n }\n }\n\n if (!result.success) {\n if (result.reason.includes('already installed')) {\n filesSpinner.warn(result.reason + ' Skipping.');\n continue;\n }\n\n filesSpinner.fail('Failed to install plugin.');\n console.error(chalk.red(`\\n${result.reason}`));\n console.log(\n chalk.yellow(\n '\\nTo revert changes, run: git checkout . && git clean -fd',\n ),\n );\n\n process.exit(1);\n }\n\n if (result.codemodWarning) {\n filesSpinner.warn(\n `${result.pluginName} installed with warnings — some automated steps may not have completed.`,\n );\n console.log(chalk.yellow(`\\n${result.codemodWarning}`));\n console.log(\n chalk.yellow(\n '\\nPlugin files were written successfully. Review the changes with `git diff` and complete any missing steps manually.',\n ),\n );\n } else if (filesSpinner.isSpinning) {\n filesSpinner.succeed(`${result.pluginName} installed successfully!`);\n }\n\n if (result.envVars.length > 0) {\n console.log(chalk.white('\\nEnvironment variables to configure:'));\n\n for (const envVar of result.envVars) {\n console.log(\n ` ${chalk.cyan(envVar.key)} - ${envVar.description}`,\n );\n }\n }\n\n if (result.postInstallMessage) {\n console.log(chalk.white('\\nNext steps:'));\n console.log(` ${chalk.cyan(result.postInstallMessage)}`);\n }\n }\n\n // 5. Post-install warnings\n console.log('');\n console.log(chalk.yellow('Important:'));\n console.log(\n chalk.yellow(\n ' This plugin was installed using an automated migration.',\n ),\n );\n console.log(\n chalk.yellow(\n ' Please review the changes manually and test thoroughly before committing.',\n ),\n );\n console.log('');\n console.log(chalk.white('Tips:'));\n console.log(\n ` ${chalk.gray('-')} Run ${chalk.cyan('git diff')} to review all changes made by the migration.`,\n );\n console.log(\n ` ${chalk.gray('-')} Use an AI assistant (e.g. Claude) as a first pass to review the diff for issues.`,\n );\n console.log(\n ` ${chalk.gray('-')} Run your test suite and verify the app builds before committing.`,\n );\n console.log(\n ` ${chalk.gray('-')} To undo all changes: ${chalk.cyan('git checkout . && git clean -fd')}`,\n );\n console.log('');\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n console.log(\n chalk.yellow(\n '\\nTo revert changes, run: git checkout . && git clean -fd',\n ),\n );\n\n process.exit(1);\n }\n });\n}\n","import { dirname, join } from 'path';\nimport { tmpdir } from 'os';\n\nimport {\n PluginRegistry,\n isInstalled,\n} from '@/src/plugins-model';\nimport { getOrPromptUsername } from '@/src/utils/username-cache';\nimport { fetchRegistryItem } from '@/src/utils/install-registry-files';\nimport { validateProject } from '@/src/utils/workspace';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { execa } from 'execa';\nimport fs from 'fs-extra';\nimport ora from 'ora';\nimport prompts from 'prompts';\n\nexport function createDiffCommand(parentCommand: Command) {\n return parentCommand\n .command('diff')\n .argument('[plugin-id]', 'Plugin to diff (e.g. feedback, waitlist)')\n .description('Show differences between installed plugin files and the latest registry version.')\n .action(async (pluginId?: string) => {\n try {\n const { variant } = await validateProject();\n const registry = await PluginRegistry.load();\n\n if (!pluginId) {\n const plugins = registry.getPluginsForVariant(variant);\n\n const installed = [];\n\n for (const p of plugins) {\n if (await isInstalled(p, variant)) {\n installed.push(p);\n }\n }\n\n if (installed.length === 0) {\n console.log(chalk.yellow('No plugins installed.'));\n return;\n }\n\n const response = await prompts({\n type: 'select',\n name: 'pluginId',\n message: 'Select a plugin to diff',\n choices: installed.map((p) => ({\n title: `${p.name} ${chalk.gray(`(${p.id})`)}`,\n value: p.id,\n })),\n });\n\n pluginId = response.pluginId as string | undefined;\n\n if (!pluginId) {\n return;\n }\n }\n\n const plugin = registry.validatePlugin(pluginId, variant);\n\n if (!(await isInstalled(plugin, variant))) {\n console.error(\n chalk.yellow(`Plugin \"${plugin.name}\" is not installed.`),\n );\n\n return;\n }\n\n const username = await getOrPromptUsername();\n\n const spinner = ora('Fetching latest plugin files...').start();\n const item = await fetchRegistryItem(variant, pluginId, username);\n spinner.succeed('Fetched latest plugin files.');\n\n const tempDir = join(tmpdir(), `makerkit-diff-${pluginId}`);\n await fs.ensureDir(tempDir);\n\n try {\n const cwd = process.cwd();\n let hasDiff = false;\n\n for (const file of item.files) {\n const localPath = join(cwd, file.target);\n const remotePath = join(tempDir, file.target);\n\n await fs.ensureDir(dirname(join(tempDir, file.target)));\n await fs.writeFile(remotePath, file.content);\n\n if (!(await fs.pathExists(localPath))) {\n console.log(chalk.green(`\\nNew file: ${file.target}`));\n hasDiff = true;\n\n continue;\n }\n\n const localContent = await fs.readFile(localPath, 'utf-8');\n\n if (localContent !== file.content) {\n hasDiff = true;\n\n console.log(chalk.white(`\\n--- ${file.target}`));\n\n await execa('git', ['diff', '--no-index', '--color', '--', localPath, remotePath], {\n stdio: 'inherit',\n reject: false,\n });\n }\n }\n\n if (!hasDiff) {\n console.log(\n chalk.green(`\\n${plugin.name} is up to date.`),\n );\n }\n } finally {\n await fs.remove(tempDir);\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n }\n });\n}\n","import { cacheUsername } from '@/src/utils/username-cache';\nimport { detectVariant } from '@/src/utils/workspace';\n\nexport interface InitRegistryOptions {\n projectPath: string;\n githubUsername: string;\n}\n\nexport interface InitRegistryResult {\n success: true;\n variant: string;\n username: string;\n}\n\nexport async function initRegistry(\n options: InitRegistryOptions,\n): Promise<InitRegistryResult> {\n const variant = await detectVariant();\n\n cacheUsername(options.githubUsername);\n\n return {\n success: true,\n variant,\n username: options.githubUsername,\n };\n}\n","import { initRegistry } from '@/src/utils/init-registry';\nimport { listPlugins } from '@/src/utils/list-plugins';\nimport { getOrPromptUsername } from '@/src/utils/username-cache';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nexport function createInitCommand(parentCommand: Command) {\n return parentCommand\n .command('init')\n .description(\n 'Initialize MakerKit plugin registry in your project (one-time setup).',\n )\n .action(async () => {\n try {\n const username = await getOrPromptUsername();\n\n const initResult = await initRegistry({\n projectPath: process.cwd(),\n githubUsername: username,\n });\n\n console.log(\n `Detected project variant: ${chalk.cyan(initResult.variant)}\\n`,\n );\n\n console.log(chalk.green('Registry configured.\\n'));\n\n const pluginsResult = await listPlugins({ projectPath: process.cwd() });\n\n console.log(chalk.white('Available plugins:\\n'));\n\n for (const plugin of pluginsResult.plugins) {\n console.log(\n ` ${chalk.green(plugin.name)} ${chalk.gray(`(${plugin.id})`)}`,\n );\n }\n\n console.log(\n `\\nRun ${chalk.cyan('makerkit plugins add <plugin-id>')} to install a plugin.`,\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n }\n });\n}\n","import { listPlugins } from '@/src/utils/list-plugins';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nexport function createListPluginsCommand(parentCommand: Command) {\n return parentCommand\n .command('list')\n .description('List available and installed plugins.')\n .action(async () => {\n const result = await listPlugins({ projectPath: process.cwd() });\n\n console.log(\n chalk.white(`MakerKit Plugins ${chalk.gray(`(${result.variant})`)}\\n`),\n );\n\n console.log(\n ` ${chalk.green('Plugin Name')} ${chalk.gray('(plugin-id)')} — Status\\n`,\n );\n\n let installedCount = 0;\n\n for (const plugin of result.plugins) {\n if (plugin.installed) {\n installedCount++;\n }\n\n const status = plugin.installed\n ? chalk.green('installed')\n : chalk.gray('available');\n\n console.log(\n ` ${chalk.cyan(plugin.name)} ${chalk.gray(`(${plugin.id})`)} — ${status}`,\n );\n }\n\n console.log(\n `\\n ${chalk.white(`${installedCount} installed`)} / ${chalk.gray(`${result.plugins.length} available`)}\\n`,\n );\n\n if (installedCount === 0) {\n console.log(\n `Run ${chalk.cyan('makerkit plugins init')} to set up the registry, then ${chalk.cyan('makerkit plugins add <plugin-id>')} to install.`,\n );\n }\n });\n}\n","import { join } from 'path';\n\nimport {\n PluginRegistry,\n type PluginDefinition,\n getPath,\n isInstalled,\n} from '@/src/plugins-model';\nimport { getOrPromptUsername } from '@/src/utils/username-cache';\nimport { fetchRegistryItem } from '@/src/utils/install-registry-files';\nimport { type Variant, validateProject } from '@/src/utils/workspace';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport ora from 'ora';\n\nasync function isOutdated(\n plugin: PluginDefinition,\n variant: Variant,\n username: string,\n): Promise<boolean> {\n const item = await fetchRegistryItem(variant, plugin.id, username);\n const cwd = process.cwd();\n\n for (const file of item.files) {\n const localPath = join(cwd, file.target);\n\n if (!(await fs.pathExists(localPath))) {\n return true;\n }\n\n const localContent = await fs.readFile(localPath, 'utf-8');\n\n if (localContent !== file.content) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function createOutdatedCommand(parentCommand: Command) {\n return parentCommand\n .command('outdated')\n .description('Check installed plugins for updates.')\n .action(async () => {\n try {\n const { variant } = await validateProject();\n const registry = await PluginRegistry.load();\n const plugins = registry.getPluginsForVariant(variant);\n\n const installed = [];\n\n for (const p of plugins) {\n if (await isInstalled(p, variant)) {\n installed.push(p);\n }\n }\n\n if (installed.length === 0) {\n console.log(chalk.yellow('No plugins installed.'));\n return;\n }\n\n const username = await getOrPromptUsername();\n\n const spinner = ora(\n `Checking ${installed.length} plugin${installed.length > 1 ? 's' : ''} for updates...`,\n ).start();\n\n const outdated: PluginDefinition[] = [];\n\n for (const plugin of installed) {\n try {\n if (await isOutdated(plugin, variant, username)) {\n outdated.push(plugin);\n }\n } catch {\n // skip plugins that fail to fetch\n }\n }\n\n spinner.stop();\n\n if (outdated.length === 0) {\n console.log(chalk.green('All plugins are up to date.'));\n return;\n }\n\n console.log(\n chalk.yellow(\n `\\n${outdated.length} plugin${outdated.length > 1 ? 's have' : ' has'} updates available:\\n`,\n ),\n );\n\n for (const plugin of outdated) {\n const pluginPath = getPath(plugin, variant);\n\n console.log(\n ` ${chalk.cyan(plugin.name)} ${chalk.gray(`(${plugin.id})`)}${pluginPath ? chalk.gray(` — ${pluginPath}`) : ''}`,\n );\n }\n\n console.log(\n `\\nRun ${chalk.cyan('makerkit plugins diff <plugin-id>')} to see what changed.`,\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n }\n });\n}\n","import { dirname, join } from 'path';\n\nimport {\n PluginRegistry,\n isInstalled,\n} from '@/src/plugins-model';\nimport { saveBaseVersions } from '@/src/utils/base-store';\nimport { getOrPromptUsername } from '@/src/utils/username-cache';\nimport { fetchRegistryItem } from '@/src/utils/install-registry-files';\nimport { validateProject } from '@/src/utils/workspace';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport ora from 'ora';\nimport prompts from 'prompts';\n\nexport function createUpdateCommand(parentCommand: Command) {\n return parentCommand\n .command('update')\n .argument('[plugin-id...]', 'Plugins to update (e.g. feedback waitlist)')\n .description('Update installed plugins to the latest registry version.')\n .action(async (pluginIds?: string[]) => {\n try {\n const { variant } = await validateProject();\n const registry = await PluginRegistry.load();\n\n if (!pluginIds || pluginIds.length === 0) {\n const plugins = registry.getPluginsForVariant(variant);\n\n const installed = [];\n\n for (const p of plugins) {\n if (await isInstalled(p, variant)) {\n installed.push(p);\n }\n }\n\n if (installed.length === 0) {\n console.log(chalk.yellow('No plugins installed.'));\n return;\n }\n\n const response = await prompts({\n type: 'multiselect',\n name: 'pluginIds',\n message: 'Select plugins to update',\n choices: installed.map((p) => ({\n title: `${p.name} ${chalk.gray(`(${p.id})`)}`,\n value: p.id,\n })),\n });\n\n pluginIds = response.pluginIds as string[] | undefined ?? [];\n\n if (pluginIds.length === 0) {\n return;\n }\n }\n\n const username = await getOrPromptUsername();\n\n for (const pluginId of pluginIds) {\n const plugin = registry.validatePlugin(pluginId, variant);\n\n if (!(await isInstalled(plugin, variant))) {\n console.log(\n chalk.yellow(\n `Plugin \"${plugin.name}\" is not installed. Use \"plugins add ${pluginId}\" to install it.`,\n ),\n );\n\n continue;\n }\n\n const spinner = ora(`Fetching latest ${plugin.name} files...`).start();\n const item = await fetchRegistryItem(variant, pluginId, username);\n spinner.succeed(`Fetched latest ${plugin.name} files.`);\n\n const cwd = process.cwd();\n const modifiedFiles: string[] = [];\n\n for (const file of item.files) {\n const localPath = join(cwd, file.target);\n\n if (await fs.pathExists(localPath)) {\n const localContent = await fs.readFile(localPath, 'utf-8');\n\n if (localContent !== file.content) {\n modifiedFiles.push(file.target);\n }\n }\n }\n\n if (modifiedFiles.length === 0) {\n console.log(chalk.green(`${plugin.name} is already up to date.`));\n continue;\n }\n\n console.log(\n chalk.yellow(\n `\\n${modifiedFiles.length} file${modifiedFiles.length > 1 ? 's' : ''} will be overwritten:`,\n ),\n );\n\n for (const file of modifiedFiles) {\n console.log(` ${chalk.gray(file)}`);\n }\n\n const { confirm } = await prompts({\n type: 'confirm',\n name: 'confirm',\n message: `Update ${plugin.name}? Local changes will be lost.`,\n initial: false,\n });\n\n if (!confirm) {\n console.log(chalk.gray(`Skipped ${plugin.name}.`));\n continue;\n }\n\n const writeSpinner = ora(`Updating ${plugin.name}...`).start();\n\n for (const file of item.files) {\n const targetPath = join(cwd, file.target);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n\n await saveBaseVersions(pluginId, item.files);\n\n writeSpinner.succeed(`${plugin.name} updated.`);\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n }\n });\n}\n","import { createAddCommand } from '@/src/commands/plugins/add/add.command';\nimport { createDiffCommand } from '@/src/commands/plugins/diff/diff.command';\nimport { createInitCommand } from '@/src/commands/plugins/init/init.command';\nimport { createListPluginsCommand } from '@/src/commands/plugins/list/list-plugins.command';\nimport { createOutdatedCommand } from '@/src/commands/plugins/outdated/outdated.command';\nimport { createUpdateCommand } from '@/src/commands/plugins/update/update.command';\nimport { Command } from 'commander';\n\nexport const pluginsCommand = new Command()\n .name('plugins')\n .description('Manage MakerKit plugins.');\n\ncreateInitCommand(pluginsCommand);\ncreateAddCommand(pluginsCommand);\ncreateUpdateCommand(pluginsCommand);\ncreateDiffCommand(pluginsCommand);\ncreateOutdatedCommand(pluginsCommand);\ncreateListPluginsCommand(pluginsCommand);\n","import { join } from 'path';\n\nimport { execa, execaCommand } from 'execa';\nimport fs from 'fs-extra';\n\nimport { getErrorOutput, isGitClean } from '@/src/utils/git';\nimport {\n getUpstreamRemoteUrl,\n getUpstreamUrl,\n hasSshAccess,\n isUpstreamUrlValid,\n setUpstreamRemote,\n} from '@/src/utils/upstream';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface ProjectPullOptions {\n projectPath: string;\n}\n\nexport type ProjectPullResult =\n | {\n success: true;\n variant: string;\n upstreamUrl: string;\n alreadyUpToDate: boolean;\n message: string;\n }\n | {\n success: false;\n variant: string;\n upstreamUrl: string;\n hasConflicts: true;\n conflictCount: number;\n conflicts: {\n path: string;\n conflicted?: string;\n base?: string;\n ours?: string;\n theirs?: string;\n }[];\n instructions: string;\n }\n | { success: false; reason: string };\n\nexport async function projectPull(\n options: ProjectPullOptions,\n): Promise<ProjectPullResult> {\n const { variant } = await validateProject();\n\n const gitClean = await isGitClean();\n\n if (!gitClean) {\n return {\n success: false,\n reason:\n 'Git working directory has uncommitted changes. Please commit or stash them before pulling upstream updates.',\n };\n }\n\n let currentUrl = await getUpstreamRemoteUrl();\n\n if (!currentUrl) {\n const useSsh = await hasSshAccess();\n const url = getUpstreamUrl(variant, useSsh);\n\n await setUpstreamRemote(url);\n currentUrl = url;\n } else if (!isUpstreamUrlValid(currentUrl, variant)) {\n const useSsh = currentUrl.startsWith('git@');\n const expectedUrl = getUpstreamUrl(variant, useSsh);\n\n return {\n success: false,\n reason:\n `Upstream remote points to \"${currentUrl}\" but expected \"${expectedUrl}\" for variant \"${variant}\". ` +\n 'Please ask the user whether to update the upstream URL, then run: git remote set-url upstream <correct-url>',\n };\n }\n\n await execaCommand('git fetch upstream');\n\n try {\n const { stdout } = await execaCommand(\n 'git merge upstream/main --no-edit',\n );\n\n const alreadyUpToDate = stdout.includes('Already up to date');\n\n return {\n success: true,\n variant,\n upstreamUrl: currentUrl,\n alreadyUpToDate,\n message: alreadyUpToDate\n ? 'Already up to date.'\n : 'Successfully merged upstream changes.',\n };\n } catch (mergeError) {\n const output = getErrorOutput(mergeError);\n const isConflict =\n output.includes('CONFLICT') ||\n output.includes('Automatic merge failed');\n\n if (!isConflict) {\n throw new Error(`Merge failed: ${output}`);\n }\n\n const { stdout: statusOutput } = await execaCommand(\n 'git diff --name-only --diff-filter=U',\n );\n\n const conflictPaths = statusOutput\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n const cwd = process.cwd();\n\n const conflicts = await Promise.all(\n conflictPaths.map(async (filePath) => {\n let conflicted: string | undefined;\n\n try {\n conflicted = await fs.readFile(join(cwd, filePath), 'utf-8');\n } catch {\n conflicted = undefined;\n }\n\n let base: string | undefined;\n let ours: string | undefined;\n let theirs: string | undefined;\n\n try {\n const { stdout: b } = await execa('git', [\n 'show',\n `:1:${filePath}`,\n ]);\n base = b;\n } catch {\n base = undefined;\n }\n\n try {\n const { stdout: o } = await execa('git', [\n 'show',\n `:2:${filePath}`,\n ]);\n ours = o;\n } catch {\n ours = undefined;\n }\n\n try {\n const { stdout: t } = await execa('git', [\n 'show',\n `:3:${filePath}`,\n ]);\n theirs = t;\n } catch {\n theirs = undefined;\n }\n\n return { path: filePath, conflicted, base, ours, theirs };\n }),\n );\n\n return {\n success: false,\n variant,\n upstreamUrl: currentUrl,\n hasConflicts: true,\n conflictCount: conflicts.length,\n conflicts,\n instructions:\n 'Merge conflicts detected. For each conflict: review base, ours (local), and theirs (upstream) versions. ' +\n 'Produce resolved content and call makerkit_project_resolve_conflicts. ' +\n 'Ask the user for guidance when the intent behind local changes is unclear.',\n };\n }\n}\n","import { VARIANT_CATALOG } from '@/src/utils/list-variants';\nimport { projectPull } from '@/src/utils/project-pull';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport ora from 'ora';\n\nexport function createProjectUpdateCommand(parentCommand: Command) {\n return parentCommand\n .command('update')\n .description(\n 'Pull the latest changes from the upstream MakerKit repository.',\n )\n .action(async () => {\n try {\n const spinner = ora('Pulling latest changes from upstream...').start();\n\n const result = await projectPull({ projectPath: process.cwd() });\n\n if (result.success) {\n const displayName =\n VARIANT_CATALOG.find((v) => v.id === result.variant)?.name ??\n result.variant;\n\n if (result.alreadyUpToDate) {\n spinner.succeed(\n `Already up to date. (${chalk.cyan(displayName)})`,\n );\n } else {\n spinner.succeed(\n `Successfully pulled latest changes from upstream. (${chalk.cyan(displayName)})`,\n );\n }\n } else if ('hasConflicts' in result) {\n spinner.fail('Merge conflicts detected.');\n\n console.log(\n chalk.yellow(\n `\\n${result.conflictCount} conflicting file(s):`,\n ),\n );\n\n for (const conflict of result.conflicts) {\n console.log(` ${chalk.gray('-')} ${conflict.path}`);\n }\n\n console.log(\n chalk.yellow('\\nPlease resolve them manually:'),\n );\n\n console.log(chalk.gray(' 1. Fix the conflicting files'));\n console.log(chalk.gray(' 2. Run: git add .'));\n console.log(chalk.gray(' 3. Run: git commit'));\n\n process.exit(1);\n } else {\n spinner.fail('Failed to pull from upstream.');\n console.error(chalk.red(`\\n${result.reason}`));\n process.exit(1);\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n }\n });\n}\n","import { createProjectUpdateCommand } from '@/src/commands/project/update/update.command';\nimport { Command } from 'commander';\n\nexport const projectCommand = new Command()\n .name('project')\n .description('Manage your MakerKit project.');\n\ncreateProjectUpdateCommand(projectCommand);\n","#!/usr/bin/env node\nimport { newCommand } from '@/src/commands/new/new.command';\nimport { pluginsCommand } from '@/src/commands/plugins/plugins.command';\nimport { projectCommand } from '@/src/commands/project/project.command';\nimport { Command } from 'commander';\nimport { config } from 'dotenv';\n\nimport { CLI_VERSION } from '@/src/version';\n\nconfig({\n path: '.env.local',\n});\n\nprocess.on('SIGINT', () => process.exit(0));\nprocess.on('SIGTERM', () => process.exit(0));\n\nasync function main() {\n const program = new Command()\n .name('makerkit')\n .description(\n 'Your SaaS Kit companion. Add plugins, manage migrations, and more.'\n )\n .version(CLI_VERSION, '-v, --version', 'display the version number');\n\n program.addCommand(newCommand).addCommand(pluginsCommand).addCommand(projectCommand);\n\n program.parse();\n}\n\nvoid main();\n"],"mappings":"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","names":["join","fs","config","join","fs","join","fs","join","fs","join","fs","join","fs","execaCommand","execaCommand","dirname","join","fs","execaCommand","join","fs","prompts","join","fs","prompts","join","fs","chalk","ora","prompts","dirname","join","tmpdir","chalk","execa","fs","ora","prompts","join","tmpdir","dirname","chalk","chalk","join","chalk","fs","ora","join","dirname","join","chalk","fs","ora","prompts","join","dirname","Command","join","execa","execaCommand","fs","execaCommand","fs","join","execa","chalk","ora","Command","Command","Command"]}
|
package/dist/mcp.js
CHANGED
|
@@ -166,6 +166,39 @@ var DEFAULT_PLUGINS = {
|
|
|
166
166
|
}
|
|
167
167
|
],
|
|
168
168
|
path: "packages/plugins/honeybadger"
|
|
169
|
+
},
|
|
170
|
+
"next-drizzle": {
|
|
171
|
+
envVars: [
|
|
172
|
+
{
|
|
173
|
+
key: "HONEYBADGER_API_KEY",
|
|
174
|
+
description: "Honeybadger private API key"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
key: "NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT",
|
|
178
|
+
description: "Honeybadger environment"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
key: "NEXT_PUBLIC_HONEYBADGER_REVISION",
|
|
182
|
+
description: "Honeybadger log revision"
|
|
183
|
+
}
|
|
184
|
+
],
|
|
185
|
+
path: "packages/plugins/honeybadger"
|
|
186
|
+
},
|
|
187
|
+
"next-prisma": {
|
|
188
|
+
envVars: [
|
|
189
|
+
{
|
|
190
|
+
key: "HONEYBADGER_API_KEY",
|
|
191
|
+
description: "Honeybadger private API key"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
key: "NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT",
|
|
195
|
+
description: "Honeybadger environment"
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
key: "NEXT_PUBLIC_HONEYBADGER_REVISION",
|
|
199
|
+
description: "Honeybadger log revision"
|
|
200
|
+
}
|
|
201
|
+
]
|
|
169
202
|
}
|
|
170
203
|
}
|
|
171
204
|
},
|
|
@@ -352,7 +385,7 @@ var DEFAULT_PLUGINS = {
|
|
|
352
385
|
},
|
|
353
386
|
directus: {
|
|
354
387
|
name: "Directus CMS",
|
|
355
|
-
id: "directus
|
|
388
|
+
id: "directus",
|
|
356
389
|
description: "Add Directus as your CMS.",
|
|
357
390
|
variants: {
|
|
358
391
|
"next-supabase": {
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp.ts","../src/plugins-model.ts","../src/utils/plugins-cache.ts","../src/utils/base-store.ts","../src/utils/git.ts","../src/utils/install-registry-files.ts","../src/utils/run-codemod.ts","../src/utils/username-cache.ts","../src/utils/workspace.ts","../src/utils/add-plugin.ts","../src/utils/apply-plugin-update.ts","../src/utils/check-plugin-update.ts","../src/utils/create-project.ts","../src/utils/marker-file.ts","../src/version.ts","../src/utils/upstream.ts","../src/utils/get-project-status.ts","../src/utils/init-registry.ts","../src/utils/list-plugins.ts","../src/utils/list-variants.ts","../src/utils/project-pull.ts","../src/utils/resolve-conflicts.ts","../src/utils/with-project-dir.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from 'path';\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { config } from 'dotenv';\nimport { z } from 'zod/v3';\n\nimport { addPlugin } from '@/src/utils/add-plugin';\nimport { applyPluginUpdate } from '@/src/utils/apply-plugin-update';\nimport { checkPluginUpdate } from '@/src/utils/check-plugin-update';\nimport { createProject } from '@/src/utils/create-project';\nimport { getProjectStatus } from '@/src/utils/get-project-status';\nimport { initRegistry } from '@/src/utils/init-registry';\nimport { listPlugins } from '@/src/utils/list-plugins';\nimport { listVariants, VARIANT_CATALOG } from '@/src/utils/list-variants';\nimport { projectPull } from '@/src/utils/project-pull';\nimport { resolveConflicts } from '@/src/utils/resolve-conflicts';\nimport { withProjectDir } from '@/src/utils/with-project-dir';\nimport type { Variant } from '@/src/utils/workspace';\nimport { CLI_VERSION } from '@/src/version';\n\nconfig({ path: '.env.local' });\n\nfunction textContent(text: string) {\n return { content: [{ type: 'text' as const, text }] };\n}\n\nfunction errorContent(message: string) {\n return { content: [{ type: 'text' as const, text: message }], isError: true };\n}\n\nconst server = new McpServer({\n name: 'makerkit-cli',\n version: CLI_VERSION,\n});\n\nserver.registerTool(\n 'makerkit_status',\n {\n description: 'Project introspection: detect variant, git status, registry config, and plugin install status',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n },\n },\n async ({ projectPath }) => {\n try {\n const result = await withProjectDir(projectPath, () => getProjectStatus({ projectPath }));\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_list_variants',\n {\n description: 'List available MakerKit kit variants with metadata for the project creation wizard',\n inputSchema: {},\n },\n async () => {\n try {\n return textContent(JSON.stringify(listVariants(), null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_create_project',\n {\n description:\n 'Create a new MakerKit project: clones the selected kit variant, installs dependencies, and writes a .makerkit/config.json marker file.',\n inputSchema: {\n variant: z\n .enum(VARIANT_CATALOG.map((v) => v.id) as [Variant, ...Variant[]])\n .describe('Kit variant to create'),\n name: z.string().min(1).describe('Project directory name'),\n directory: z\n .string()\n .describe('Absolute path to the parent directory where the project will be created'),\n github_token: z\n .string()\n .optional()\n .describe('Optional GitHub PAT for HTTPS cloning (token is stripped from remote after clone)'),\n },\n },\n async ({ variant, name, directory, github_token }) => {\n try {\n if (!path.isAbsolute(directory)) {\n return errorContent(\n `\"directory\" must be an absolute path. Received: \"${directory}\"`,\n );\n }\n\n const result = await createProject({\n variant,\n name,\n directory,\n githubToken: github_token,\n });\n\n return textContent(\n JSON.stringify(\n {\n success: result.success,\n project_path: result.projectPath,\n variant: result.variant,\n message: result.message,\n },\n null,\n 2,\n ),\n );\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_list_plugins',\n {\n description: 'List all available plugins for the detected project variant with install status and metadata',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n },\n },\n async ({ projectPath }) => {\n try {\n const result = await withProjectDir(projectPath, () => listPlugins({ projectPath }));\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_add_plugin',\n {\n description: 'Install a MakerKit plugin: runs codemod, adds env vars, and returns structured result',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n pluginId: z.string().describe('Plugin identifier (e.g. feedback, waitlist, posthog)'),\n githubUsername: z.string().optional().describe('GitHub username for registry auth (skips interactive prompt)'),\n skipGitCheck: z.boolean().optional().describe('Skip git clean check (useful when installing multiple plugins in sequence)'),\n },\n },\n async ({ projectPath, pluginId, githubUsername, skipGitCheck }) => {\n try {\n const result = await withProjectDir(projectPath, () =>\n addPlugin({ projectPath, pluginId, githubUsername, skipGitCheck }),\n );\n\n if (!result.success) {\n return errorContent(result.reason);\n }\n\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_init_registry',\n {\n description: 'Cache the GitHub username used for MakerKit plugin registry authentication',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n githubUsername: z.string().describe('GitHub username registered with your MakerKit account'),\n },\n },\n async ({ projectPath, githubUsername }) => {\n try {\n const result = await withProjectDir(projectPath, () =>\n initRegistry({ projectPath, githubUsername }),\n );\n\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_check_update',\n {\n description:\n 'Analyze a plugin update using three-way diff (base/local/remote). Returns per-file status and content for AI-powered merge resolution.',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n pluginId: z.string().describe('Plugin identifier (e.g. feedback, waitlist)'),\n githubUsername: z\n .string()\n .optional()\n .describe('GitHub username for registry auth (uses cached if omitted)'),\n },\n },\n async ({ projectPath, pluginId, githubUsername }) => {\n try {\n const result = await withProjectDir(projectPath, () =>\n checkPluginUpdate({ projectPath, pluginId, githubUsername }),\n );\n\n if (!result.success) {\n return errorContent(result.reason);\n }\n\n return textContent(\n JSON.stringify(\n {\n ...result,\n note: 'For conflict files, produce a merged version and pass it to makerkit_apply_update.',\n },\n null,\n 2,\n ),\n );\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_apply_update',\n {\n description:\n 'Apply AI-resolved plugin update files. Writes merged content to disk and updates base versions for future three-way merges.',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n pluginId: z.string().describe('Plugin identifier'),\n files: z\n .array(\n z.object({\n path: z.string().describe('File path relative to project root (from check_update)'),\n content: z.string().optional().describe('Resolved file content (required for write action)'),\n action: z\n .enum(['write', 'skip', 'delete'])\n .describe(\n 'write: write content to disk, skip: keep local version, delete: remove file from disk',\n ),\n }),\n )\n .describe('Array of file resolutions'),\n installDependencies: z\n .boolean()\n .optional()\n .describe('Whether to install plugin dependencies (default true)'),\n githubUsername: z\n .string()\n .optional()\n .describe('GitHub username for registry auth (uses cached if omitted)'),\n },\n },\n async ({ projectPath, pluginId, files, installDependencies, githubUsername }) => {\n try {\n const result = await withProjectDir(projectPath, () =>\n applyPluginUpdate({ projectPath, pluginId, files, installDependencies, githubUsername }),\n );\n\n if (!result.success) {\n return errorContent(result.reason);\n }\n\n return textContent(\n JSON.stringify(\n {\n ...result,\n note: 'Base versions updated. Run makerkit_check_update again to verify all files show as unchanged.',\n },\n null,\n 2,\n ),\n );\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_project_pull',\n {\n description:\n 'Pull latest upstream changes into a MakerKit project. Auto-detects kit variant, configures the upstream remote (SSH or HTTPS), fetches, and merges. Returns conflict details with base/local/remote content when merge conflicts occur so the AI can resolve them. After resolving, call makerkit_project_resolve_conflicts.',\n inputSchema: {\n projectPath: z\n .string()\n .describe('Absolute path to the MakerKit project root'),\n },\n },\n async ({ projectPath }) => {\n try {\n const result = await withProjectDir(projectPath, () => projectPull({ projectPath }));\n\n if (!result.success) {\n if ('hasConflicts' in result) {\n return textContent(JSON.stringify(result, null, 2));\n }\n\n return errorContent(result.reason);\n }\n\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_project_resolve_conflicts',\n {\n description:\n 'Resolve merge conflicts from makerkit_project_pull. Write resolved file contents, stage them, and complete the merge commit.',\n inputSchema: {\n projectPath: z\n .string()\n .describe('Absolute path to the MakerKit project root'),\n files: z\n .array(\n z.object({\n path: z\n .string()\n .describe('File path relative to project root'),\n content: z\n .string()\n .describe('Resolved file content'),\n }),\n )\n .describe('Array of resolved files'),\n commitMessage: z\n .string()\n .optional()\n .describe(\n 'Custom merge commit message (defaults to auto-generated merge message)',\n ),\n },\n },\n async ({ projectPath, files, commitMessage }) => {\n try {\n const result = await withProjectDir(projectPath, () =>\n resolveConflicts({ projectPath, files, commitMessage }),\n );\n\n if (!result.success) {\n return textContent(JSON.stringify(result, null, 2));\n }\n\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nasync function main() {\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n}\n\nvoid main();\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\nimport invariant from 'tiny-invariant';\n\nimport { fetchPluginRegistry } from '@/src/utils/plugins-cache';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface EnvVar {\n key: string;\n description: string;\n defaultValue?: string;\n}\n\nexport interface VariantConfig {\n envVars: EnvVar[];\n path?: string;\n}\n\nexport interface PluginDefinition {\n name: string;\n id: string;\n description: string;\n variants: Partial<Record<Variant, VariantConfig>>;\n postInstallMessage?: string;\n}\n\nconst DEFAULT_PLUGINS: Record<string, PluginDefinition> = {\n feedback: {\n name: 'Feedback',\n id: 'feedback',\n description: 'Add a feedback popup to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/feedback',\n },\n },\n },\n waitlist: {\n name: 'Waitlist',\n id: 'waitlist',\n description: 'Add a waitlist to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/waitlist',\n },\n },\n },\n testimonial: {\n name: 'Testimonial',\n id: 'testimonial',\n description: 'Add a testimonial widget to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/testimonial',\n },\n },\n },\n roadmap: {\n name: 'Roadmap',\n id: 'roadmap',\n description: 'Add a roadmap to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/roadmap',\n },\n },\n },\n 'google-analytics': {\n name: 'Google Analytics',\n id: 'google-analytics',\n description: 'Add Google Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n }\n },\n },\n honeybadger: {\n name: 'Honeybadger',\n id: 'honeybadger',\n description: 'Add Honeybadger Error Tracking to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'HONEYBADGER_API_KEY',\n description: 'Honeybadger private API key',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT',\n description: 'Honeybadger environment',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_REVISION',\n description: 'Honeybadger log revision',\n }\n ],\n path: 'packages/plugins/honeybadger',\n },\n }\n },\n posthog: {\n name: 'PostHog',\n id: 'posthog',\n description: 'Add PostHog Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n },\n },\n umami: {\n name: 'Umami',\n id: 'umami',\n description: 'Add Umami Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n },\n },\n signoz: {\n name: 'SigNoz',\n id: 'signoz',\n description: 'Add SigNoz Monitoring to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n },\n },\n paddle: {\n name: 'Paddle',\n id: 'paddle',\n description: 'Add Paddle Billing to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_PADDLE_CLIENT_TOKEN',\n description: 'Paddle client-side token',\n },\n {\n key: 'PADDLE_API_KEY',\n description: 'Paddle API key',\n },\n {\n key: 'PADDLE_WEBHOOK_SECRET',\n description: 'Paddle webhook secret',\n },\n ],\n path: 'packages/plugins/paddle',\n },\n },\n },\n 'supabase-cms': {\n name: 'Supabase CMS',\n id: 'supabase-cms',\n description: 'Add Supabase CMS provider to your app.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/supabase-cms',\n },\n },\n },\n 'meshes-analytics': {\n name: 'Meshes Analytics',\n id: 'meshes-analytics',\n description: 'Add Meshes Analytics to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_MESHES_PUBLISHABLE_KEY',\n description: 'The Meshes publishable key'\n }\n ],\n path: 'packages/plugins/meshes-analytics',\n },\n },\n },\n directus: {\n name: 'Directus CMS',\n id: 'directus-cms',\n description: 'Add Directus as your CMS.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n },\n }\n};\n\nexport class PluginRegistry {\n private constructor(\n private plugins: Record<string, PluginDefinition>,\n ) {}\n\n static async load(): Promise<PluginRegistry> {\n const registryUrl = process.env.MAKERKIT_PLUGINS_REGISTRY_URL;\n const plugins = await fetchPluginRegistry(registryUrl, DEFAULT_PLUGINS);\n\n return new PluginRegistry(plugins);\n }\n\n getPluginById(id: string): PluginDefinition | undefined {\n return this.plugins[id];\n }\n\n getPluginsForVariant(variant: Variant): PluginDefinition[] {\n return Object.values(this.plugins).filter((p) => variant in p.variants);\n }\n\n validatePlugin(pluginId: string, variant: Variant): PluginDefinition {\n const plugin = this.getPluginById(pluginId);\n\n invariant(plugin, `Plugin \"${pluginId}\" not found`);\n\n invariant(\n plugin.variants[variant],\n `Plugin \"${pluginId}\" is not available for the ${variant} variant`,\n );\n\n return plugin;\n }\n}\n\nexport function getEnvVars(\n plugin: PluginDefinition,\n variant: Variant,\n): EnvVar[] {\n return plugin.variants[variant]?.envVars ?? [];\n}\n\nexport function getPath(\n plugin: PluginDefinition,\n variant: Variant,\n): string | undefined {\n return plugin.variants[variant]?.path;\n}\n\nexport async function isInstalled(\n plugin: PluginDefinition,\n variant: Variant,\n): Promise<boolean> {\n const pluginPath = getPath(plugin, variant);\n\n if (!pluginPath) {\n return false;\n }\n\n const pkgJsonPath = join(process.cwd(), pluginPath, 'package.json');\n\n if (!(await fs.pathExists(pkgJsonPath))) {\n return false;\n }\n\n try {\n const pkg = await fs.readJson(pkgJsonPath);\n\n return !!pkg.name && !!pkg.exports;\n } catch {\n return false;\n }\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\n\nimport fs from 'fs-extra';\n\nimport type { PluginDefinition } from '@/src/plugins-model';\n\nconst CACHE_DIR = join(homedir(), '.makerkit');\nconst CACHE_FILE = join(CACHE_DIR, 'plugins.json');\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\ninterface CacheEntry {\n fetchedAt: number;\n plugins: Record<string, PluginDefinition>;\n}\n\nasync function readCache(): Promise<CacheEntry | null> {\n try {\n if (!(await fs.pathExists(CACHE_FILE))) {\n return null;\n }\n\n return await fs.readJson(CACHE_FILE);\n } catch {\n return null;\n }\n}\n\nasync function writeCache(\n plugins: Record<string, PluginDefinition>,\n): Promise<void> {\n try {\n await fs.ensureDir(CACHE_DIR);\n\n await fs.writeJson(\n CACHE_FILE,\n { fetchedAt: Date.now(), plugins },\n { spaces: 2 },\n );\n } catch {\n // Ignore cache write failures\n }\n}\n\nexport async function fetchPluginRegistry(\n registryUrl: string | undefined,\n fallback: Record<string, PluginDefinition>,\n): Promise<Record<string, PluginDefinition>> {\n if (!registryUrl) {\n return fallback;\n }\n\n // Check cache first\n const cached = await readCache();\n\n if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {\n return cached.plugins;\n }\n\n // Fetch from remote\n try {\n const response = await fetch(registryUrl);\n\n if (response.ok) {\n const data = await response.json();\n const plugins = data.plugins as Record<string, PluginDefinition>;\n\n await writeCache(plugins);\n\n return plugins;\n }\n } catch {\n // Network error — fall through\n }\n\n // Return stale cache if available, otherwise bundled fallback\n return cached?.plugins ?? fallback;\n}\n","import { dirname, join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport type { RegistryFile } from '@/src/utils/install-registry-files';\n\nexport type FileStatus =\n | 'unchanged'\n | 'updated'\n | 'conflict'\n | 'added'\n | 'deleted_locally'\n | 'no_base';\n\nfunction basesDir(pluginId: string): string {\n return join(process.cwd(), 'node_modules', '.cache', 'makerkit', 'bases', pluginId);\n}\n\nexport async function saveBaseVersions(\n pluginId: string,\n files: RegistryFile[],\n): Promise<void> {\n const dir = basesDir(pluginId);\n\n for (const file of files) {\n const targetPath = join(dir, file.target);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n}\n\nexport async function readBaseVersion(\n pluginId: string,\n fileTarget: string,\n): Promise<string | undefined> {\n const filePath = join(basesDir(pluginId), fileTarget);\n\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch {\n return undefined;\n }\n}\n\nexport async function hasBaseVersions(pluginId: string): Promise<boolean> {\n return fs.pathExists(basesDir(pluginId));\n}\n\nexport function computeFileStatus(params: {\n base?: string;\n local?: string;\n remote: string;\n}): FileStatus {\n const { base, local, remote } = params;\n\n // Local matches remote — nothing to do regardless of base\n if (local !== undefined && local === remote) {\n return 'unchanged';\n }\n\n // No base version (legacy install or new file)\n if (base === undefined) {\n if (local === undefined) {\n return 'added';\n }\n\n return 'no_base';\n }\n\n // Has base version\n if (local === undefined) {\n return 'deleted_locally';\n }\n\n if (base === local) {\n // User hasn't touched the file — safe auto-apply\n return 'updated';\n }\n\n if (base === remote) {\n // Remote hasn't changed — local edits are fine\n return 'unchanged';\n }\n\n // Both sides changed\n return 'conflict';\n}\n","import { execaCommand } from 'execa';\n\nexport function getErrorOutput(error: unknown): string {\n if (error instanceof Error && 'stderr' in error) {\n const stderr = String((error as { stderr: unknown }).stderr);\n\n if (stderr) return stderr;\n }\n\n if (error instanceof Error && 'stdout' in error) {\n const stdout = String((error as { stdout: unknown }).stdout);\n\n if (stdout) return stdout;\n }\n\n return error instanceof Error ? error.message : String(error);\n}\n\nexport async function isGitClean(): Promise<boolean> {\n const { stdout } = await execaCommand('git status --porcelain');\n\n return stdout.trim() === '';\n}\n\nexport async function getGitRoot(): Promise<string> {\n const { stdout } = await execaCommand('git rev-parse --show-toplevel');\n\n return stdout.trim();\n}\n\nexport async function getGitUsername(): Promise<string | undefined> {\n try {\n const { stdout } = await execaCommand('git config --get user.username');\n const username = stdout.trim();\n\n return username.length > 0 ? username : undefined;\n } catch {\n return undefined;\n }\n}\n","import { dirname, join } from 'path';\nimport fs from 'fs-extra';\n\nexport interface RegistryFile {\n path: string;\n content: string;\n type: string;\n target: string;\n}\n\nexport interface RegistryItem {\n name: string;\n files: RegistryFile[];\n dependencies?: Record<string, string>;\n}\n\nexport async function fetchRegistryItem(\n variant: string,\n pluginId: string,\n username: string,\n): Promise<RegistryItem> {\n const url = `https://makerkit.dev/r/${variant}/${pluginId}.json?username=${username}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch plugin registry for \"${pluginId}\" (${response.status}): ${response.statusText}`,\n );\n }\n\n const item: RegistryItem = await response.json();\n\n if (!item.files || item.files.length === 0) {\n throw new Error(`Plugin \"${pluginId}\" has no files in the registry.`);\n }\n\n return item;\n}\n\nexport async function installRegistryFiles(\n variant: string,\n pluginId: string,\n username: string,\n): Promise<RegistryItem> {\n const item = await fetchRegistryItem(variant, pluginId, username);\n const cwd = process.cwd();\n\n for (const file of item.files) {\n const targetPath = join(cwd, file.target);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n\n return item;\n}\n","import { execaCommand } from 'execa';\n\nconst CODEMOD_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\nexport async function runCodemod(\n variant: string,\n pluginId: string,\n options?: { captureOutput?: boolean },\n): Promise<{ success: boolean; output: string }> {\n try {\n const localPath = process.env.MAKERKIT_CODEMODS_PATH;\n const runner = process.env.MAKERKIT_PACKAGE_RUNNER ?? 'npx --yes';\n\n const command = localPath\n ? `${runner} codemod workflow run --allow-dirty -w ${localPath}/codemods/${variant}/${pluginId}`\n : `${runner} codemod --allow-dirty @makerkit/${variant}-${pluginId}`;\n\n const { stdout, stderr } = await execaCommand(command, {\n stdio: options?.captureOutput ? 'pipe' : 'inherit',\n timeout: CODEMOD_TIMEOUT_MS,\n });\n\n return {\n success: true,\n output: stdout || stderr || '',\n };\n } catch (error) {\n let message = 'Unknown error during codemod';\n\n if (error instanceof Error) {\n message = error.message;\n\n if ('stderr' in error && error.stderr) {\n message += `\\n${error.stderr}`;\n }\n\n if ('timedOut' in error && error.timedOut) {\n message = `Codemod timed out after ${CODEMOD_TIMEOUT_MS / 1000}s (the workflow engine may have stalled after an error)`;\n }\n }\n\n return {\n success: false,\n output: message,\n };\n }\n}\n","import { join } from 'path';\nimport { tmpdir } from 'os';\n\nimport fs from 'fs-extra';\nimport prompts from 'prompts';\n\nimport { getGitUsername } from '@/src/utils/git';\n\nconst USERNAME_FILE = join(tmpdir(), 'makerkit-username');\n\nexport function getCachedUsername(): string | undefined {\n try {\n const username = fs.readFileSync(USERNAME_FILE, 'utf-8').trim();\n\n return username.length > 0 ? username : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function cacheUsername(username: string): void {\n fs.writeFileSync(USERNAME_FILE, username, 'utf-8');\n}\n\nexport function clearCachedUsername(): void {\n try {\n fs.removeSync(USERNAME_FILE);\n } catch {\n // ignore\n }\n}\n\nexport async function promptForUsername(): Promise<string> {\n const gitUsername = await getGitUsername();\n\n const response = await prompts({\n type: 'text',\n name: 'githubUsername',\n message:\n 'Enter the GitHub username registered with your Makerkit account',\n initial: gitUsername,\n validate: (value) => {\n return value.trim().length > 0 ? true : 'GitHub username is required';\n },\n });\n\n const username = (response.githubUsername as string | undefined)?.trim();\n\n if (!username) {\n throw new Error('Setup cancelled. GitHub username is required.');\n }\n\n cacheUsername(username);\n\n return username;\n}\n\nexport async function getOrPromptUsername(\n providedUsername?: string,\n): Promise<string> {\n if (providedUsername?.trim()) {\n const username = providedUsername.trim();\n\n cacheUsername(username);\n\n return username;\n }\n\n const cached = getCachedUsername();\n\n if (cached) {\n return cached;\n }\n\n return promptForUsername();\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\n\nexport type Variant =\n | 'next-supabase'\n | 'next-drizzle'\n | 'next-prisma'\n | 'react-router-supabase';\n\nasync function readDeps(\n pkgPath: string,\n): Promise<Record<string, string>> {\n if (!(await fs.pathExists(pkgPath))) {\n return {};\n }\n\n const pkg = await fs.readJson(pkgPath);\n\n return {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n}\n\nexport async function detectVariant(): Promise<Variant> {\n const cwd = process.cwd();\n\n const rootPkgPath = join(cwd, 'package.json');\n\n if (!(await fs.pathExists(rootPkgPath))) {\n throw new Error(\n 'No package.json found. Please run this command from a MakerKit project root.',\n );\n }\n\n const rootDeps = await readDeps(rootPkgPath);\n\n if (!rootDeps['turbo']) {\n throw new Error(\n 'This does not appear to be a MakerKit Turbo monorepo. The \"turbo\" dependency was not found in package.json.',\n );\n }\n\n const webDeps = await readDeps(join(cwd, 'apps', 'web', 'package.json'));\n const dbDeps = await readDeps(\n join(cwd, 'packages', 'database', 'package.json'),\n );\n\n const hasSupabase = !!webDeps['@supabase/supabase-js'];\n const hasReactRouter = !!webDeps['@react-router/node'];\n const hasDrizzle = !!webDeps['drizzle-orm'] || !!dbDeps['drizzle-orm'];\n const hasPrisma = !!webDeps['@prisma/client'] || !!dbDeps['@prisma/client'];\n\n if (hasReactRouter && hasSupabase) {\n return 'react-router-supabase';\n }\n\n if (hasSupabase) {\n return 'next-supabase';\n }\n\n if (hasDrizzle) {\n return 'next-drizzle';\n }\n\n if (hasPrisma) {\n return 'next-prisma';\n }\n\n throw new Error(\n 'Unrecognized MakerKit project. Could not detect variant from dependencies.',\n );\n}\n\nexport async function validateProject(): Promise<{\n variant: Variant;\n version: string;\n}> {\n const variant = await detectVariant();\n const rootPkg = await fs.readJson(join(process.cwd(), 'package.json'));\n\n return {\n variant,\n version: rootPkg.version ?? 'unknown',\n };\n}\n","import {\n PluginRegistry,\n getEnvVars,\n isInstalled,\n} from '@/src/plugins-model';\nimport { saveBaseVersions } from '@/src/utils/base-store';\nimport { isGitClean } from '@/src/utils/git';\nimport { installRegistryFiles } from '@/src/utils/install-registry-files';\nimport { runCodemod } from '@/src/utils/run-codemod';\nimport {\n cacheUsername,\n getCachedUsername,\n} from '@/src/utils/username-cache';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface AddPluginOptions {\n projectPath: string;\n pluginId: string;\n githubUsername?: string;\n skipGitCheck?: boolean;\n captureCodemodOutput?: boolean;\n}\n\nexport type AddPluginResult =\n | {\n success: true;\n pluginName: string;\n pluginId: string;\n variant: string;\n envVars: { key: string; description: string }[];\n postInstallMessage: string | null;\n codemodOutput: string;\n codemodWarning?: string;\n }\n | { success: false; reason: string };\n\nexport async function addPlugin(\n options: AddPluginOptions,\n): Promise<AddPluginResult> {\n if (!options.skipGitCheck) {\n const gitClean = await isGitClean();\n\n if (!gitClean) {\n return {\n success: false,\n reason:\n 'Git working directory has uncommitted changes. Please commit or stash them before adding a plugin.',\n };\n }\n }\n\n const { variant } = await validateProject();\n\n const username = options.githubUsername?.trim() || getCachedUsername();\n\n if (!username) {\n return {\n success: false,\n reason:\n 'No GitHub username cached and none provided. Call makerkit_init_registry first or pass githubUsername.',\n };\n }\n\n cacheUsername(username);\n\n const registry = await PluginRegistry.load();\n const plugin = registry.validatePlugin(options.pluginId, variant);\n\n if (await isInstalled(plugin, variant)) {\n return {\n success: false,\n reason: `Plugin \"${plugin.name}\" is already installed.`,\n };\n }\n\n const item = await installRegistryFiles(variant, options.pluginId, username);\n await saveBaseVersions(options.pluginId, item.files);\n\n const codemodResult = await runCodemod(variant, options.pluginId, {\n captureOutput: options.captureCodemodOutput ?? true,\n });\n\n const envVars = getEnvVars(plugin, variant);\n\n return {\n success: true,\n pluginName: plugin.name,\n pluginId: plugin.id,\n variant,\n envVars: envVars.map((e) => ({ key: e.key, description: e.description })),\n postInstallMessage: plugin.postInstallMessage ?? null,\n codemodOutput: codemodResult.output,\n codemodWarning: codemodResult.success\n ? undefined\n : `The automated codemod did not complete successfully. Plugin files were installed but some wiring steps may have failed.\\n${codemodResult.output}`,\n };\n}\n","import { dirname, join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport { PluginRegistry } from '@/src/plugins-model';\nimport { saveBaseVersions } from '@/src/utils/base-store';\nimport { fetchRegistryItem } from '@/src/utils/install-registry-files';\nimport {\n cacheUsername,\n getCachedUsername,\n} from '@/src/utils/username-cache';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface ApplyPluginUpdateOptions {\n projectPath: string;\n pluginId: string;\n files: {\n path: string;\n content?: string;\n action: 'write' | 'skip' | 'delete';\n }[];\n installDependencies?: boolean;\n githubUsername?: string;\n}\n\nexport type ApplyPluginUpdateResult =\n | {\n success: true;\n pluginId: string;\n variant: string;\n written: string[];\n skipped: string[];\n deleted: string[];\n }\n | { success: false; reason: string };\n\nexport async function applyPluginUpdate(\n options: ApplyPluginUpdateOptions,\n): Promise<ApplyPluginUpdateResult> {\n const { variant } = await validateProject();\n\n const username = options.githubUsername?.trim() || getCachedUsername();\n\n if (!username) {\n return {\n success: false,\n reason:\n 'No GitHub username cached and none provided. Call makerkit_init_registry first or pass githubUsername.',\n };\n }\n\n cacheUsername(username);\n\n const registry = await PluginRegistry.load();\n registry.validatePlugin(options.pluginId, variant);\n\n const item = await fetchRegistryItem(variant, options.pluginId, username);\n const remoteByPath = new Map(item.files.map((f) => [f.target, f.content]));\n\n const cwd = process.cwd();\n const written: string[] = [];\n const skipped: string[] = [];\n const deleted: string[] = [];\n\n for (const file of options.files) {\n const targetPath = join(cwd, file.path);\n\n switch (file.action) {\n case 'write': {\n if (file.content === undefined) {\n return {\n success: false,\n reason: `File \"${file.path}\" has action \"write\" but no content provided.`,\n };\n }\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n written.push(file.path);\n break;\n }\n case 'skip': {\n skipped.push(file.path);\n break;\n }\n case 'delete': {\n if (await fs.pathExists(targetPath)) {\n await fs.remove(targetPath);\n }\n\n deleted.push(file.path);\n break;\n }\n }\n\n if (file.action !== 'delete') {\n const remoteContent = remoteByPath.get(file.path);\n\n if (remoteContent !== undefined) {\n await saveBaseVersions(options.pluginId, [\n { path: '', content: remoteContent, type: '', target: file.path },\n ]);\n }\n }\n }\n\n return {\n success: true,\n pluginId: options.pluginId,\n variant,\n written,\n skipped,\n deleted,\n };\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport { PluginRegistry } from '@/src/plugins-model';\nimport {\n computeFileStatus,\n hasBaseVersions,\n readBaseVersion,\n} from '@/src/utils/base-store';\nimport { fetchRegistryItem } from '@/src/utils/install-registry-files';\nimport {\n cacheUsername,\n getCachedUsername,\n} from '@/src/utils/username-cache';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface CheckPluginUpdateOptions {\n projectPath: string;\n pluginId: string;\n githubUsername?: string;\n}\n\nexport type CheckPluginUpdateResult =\n | {\n success: true;\n pluginId: string;\n variant: string;\n hasBaseVersions: boolean;\n counts: Record<string, number>;\n files: {\n path: string;\n status: string;\n base?: string;\n local?: string;\n remote?: string;\n }[];\n }\n | { success: false; reason: string };\n\nexport async function checkPluginUpdate(\n options: CheckPluginUpdateOptions,\n): Promise<CheckPluginUpdateResult> {\n const { variant } = await validateProject();\n\n const username = options.githubUsername?.trim() || getCachedUsername();\n\n if (!username) {\n return {\n success: false,\n reason:\n 'No GitHub username cached and none provided. Call makerkit_init_registry first or pass githubUsername.',\n };\n }\n\n cacheUsername(username);\n\n const registry = await PluginRegistry.load();\n registry.validatePlugin(options.pluginId, variant);\n\n const item = await fetchRegistryItem(variant, options.pluginId, username);\n const cwd = process.cwd();\n const hasBase = await hasBaseVersions(options.pluginId);\n\n const counts: Record<string, number> = {\n unchanged: 0,\n updated: 0,\n conflict: 0,\n added: 0,\n deleted_locally: 0,\n no_base: 0,\n };\n\n const files = await Promise.all(\n item.files.map(async (file) => {\n const localPath = join(cwd, file.target);\n\n let local: string | undefined;\n\n try {\n local = await fs.readFile(localPath, 'utf-8');\n } catch {\n local = undefined;\n }\n\n const base = await readBaseVersion(options.pluginId, file.target);\n const remote = file.content;\n\n const status = computeFileStatus({ base, local, remote });\n counts[status]++;\n\n const result: {\n path: string;\n status: string;\n base?: string;\n local?: string;\n remote?: string;\n } = {\n path: file.target,\n status,\n };\n\n switch (status) {\n case 'unchanged':\n break;\n case 'updated':\n result.remote = remote;\n break;\n case 'conflict':\n result.base = base;\n result.local = local;\n result.remote = remote;\n break;\n case 'no_base':\n result.local = local;\n result.remote = remote;\n break;\n case 'added':\n result.remote = remote;\n break;\n case 'deleted_locally':\n result.base = base;\n result.remote = remote;\n break;\n }\n\n return result;\n }),\n );\n\n return {\n success: true,\n pluginId: options.pluginId,\n variant,\n hasBaseVersions: hasBase,\n counts,\n files,\n };\n}\n","import { join } from 'path';\n\nimport { execa } from 'execa';\nimport fs from 'fs-extra';\n\nimport { writeMarkerFile } from '@/src/utils/marker-file';\nimport { VARIANT_REPO_MAP, hasSshAccess } from '@/src/utils/upstream';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface CreateProjectOptions {\n variant: Variant;\n name: string;\n directory: string;\n githubToken?: string;\n}\n\nexport interface CreateProjectResult {\n success: boolean;\n projectPath: string;\n variant: Variant;\n kitRepo: string;\n message: string;\n}\n\nexport async function createProject(\n options: CreateProjectOptions,\n): Promise<CreateProjectResult> {\n const { variant, name, directory, githubToken } = options;\n const projectPath = join(directory, name);\n const repo = VARIANT_REPO_MAP[variant];\n\n // 1. Validate target dir doesn't already exist\n if (await fs.pathExists(projectPath)) {\n throw new Error(\n `Target directory \"${projectPath}\" already exists. Choose a different name or remove it first.`,\n );\n }\n\n // 2. Validate parent dir exists\n if (!(await fs.pathExists(directory))) {\n throw new Error(\n `Parent directory \"${directory}\" does not exist.`,\n );\n }\n\n // 3. Resolve clone URL\n let cloneUrl: string;\n\n if (githubToken) {\n cloneUrl = `https://${githubToken}@github.com/${repo}`;\n } else {\n const useSsh = await hasSshAccess();\n cloneUrl = useSsh\n ? `git@github.com:${repo}`\n : `https://github.com/${repo}`;\n }\n\n // 4. Clone\n await execa('git', ['clone', cloneUrl, name], { cwd: directory });\n\n // 5. Strip token from remote if needed\n if (githubToken) {\n await execa(\n 'git',\n ['remote', 'set-url', 'origin', `https://github.com/${repo}`],\n { cwd: projectPath },\n );\n }\n\n // 6. Install dependencies\n await execa('pnpm', ['install'], { cwd: projectPath });\n\n // 7. Write marker file\n await writeMarkerFile(projectPath, variant, repo);\n\n return {\n success: true,\n projectPath,\n variant,\n kitRepo: repo,\n message: `Project \"${name}\" created successfully with variant \"${variant}\".`,\n };\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport { CLI_VERSION } from '@/src/version';\n\nexport interface MakerkitProjectConfig {\n version: number;\n variant: string;\n kit_repo: string;\n created_at: string;\n cli_version: string;\n}\n\nexport async function writeMarkerFile(\n projectPath: string,\n variant: string,\n kitRepo: string,\n): Promise<void> {\n const dir = join(projectPath, '.makerkit');\n\n await fs.ensureDir(dir);\n\n const config: MakerkitProjectConfig = {\n version: 1,\n variant,\n kit_repo: kitRepo,\n created_at: new Date().toISOString(),\n cli_version: CLI_VERSION,\n };\n\n await fs.writeJson(join(dir, 'config.json'), config, { spaces: 2 });\n}\n\nexport async function readMarkerFile(\n projectPath: string,\n): Promise<MakerkitProjectConfig | null> {\n const filePath = join(projectPath, '.makerkit', 'config.json');\n\n if (!(await fs.pathExists(filePath))) {\n return null;\n }\n\n return fs.readJson(filePath);\n}\n","export const CLI_VERSION = '2.0.0-beta.1';\n","import type { Variant } from '@/src/utils/workspace';\n\nimport { execaCommand } from 'execa';\n\nexport const VARIANT_REPO_MAP: Record<Variant, string> = {\n 'next-supabase': 'makerkit/next-supabase-saas-kit-turbo',\n 'next-drizzle': 'makerkit/next-drizzle-saas-kit-turbo',\n 'next-prisma': 'makerkit/next-prisma-saas-kit-turbo',\n 'react-router-supabase': 'makerkit/react-router-supabase-saas-kit-turbo',\n};\n\nfunction sshUrl(repo: string): string {\n return `git@github.com:${repo}`;\n}\n\nfunction httpsUrl(repo: string): string {\n return `https://github.com/${repo}`;\n}\n\nexport async function hasSshAccess(): Promise<boolean> {\n try {\n await execaCommand('ssh -T git@github.com -o StrictHostKeyChecking=no', {\n timeout: 10_000,\n });\n\n return true;\n } catch (error) {\n // ssh -T git@github.com exits with code 1 even on success,\n // but prints \"successfully authenticated\" in stderr\n const stderr =\n error instanceof Error && 'stderr' in error\n ? String((error as { stderr: unknown }).stderr)\n : '';\n\n return stderr.includes('successfully authenticated');\n }\n}\n\nexport function getUpstreamUrl(variant: Variant, useSsh: boolean): string {\n const repo = VARIANT_REPO_MAP[variant];\n\n return useSsh ? sshUrl(repo) : httpsUrl(repo);\n}\n\n/**\n * Check if a remote URL points to the correct repo for the given variant,\n * regardless of whether it uses SSH or HTTPS.\n * Handles trailing `.git` and `/` in URLs.\n */\nexport function isUpstreamUrlValid(\n url: string,\n variant: Variant,\n): boolean {\n const normalized = url.replace(/\\/+$/, '').replace(/\\.git$/, '');\n const repo = VARIANT_REPO_MAP[variant];\n\n return normalized === sshUrl(repo) || normalized === httpsUrl(repo);\n}\n\nexport async function getUpstreamRemoteUrl(): Promise<string | undefined> {\n try {\n const { stdout } = await execaCommand('git remote get-url upstream');\n return stdout.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function setUpstreamRemote(url: string): Promise<void> {\n const currentUrl = await getUpstreamRemoteUrl();\n\n if (currentUrl) {\n await execaCommand(`git remote set-url upstream ${url}`);\n } else {\n await execaCommand(`git remote add upstream ${url}`);\n }\n}\n","import {\n PluginRegistry,\n isInstalled,\n} from '@/src/plugins-model';\nimport { isGitClean } from '@/src/utils/git';\nimport { getCachedUsername } from '@/src/utils/username-cache';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface GetProjectStatusOptions {\n projectPath: string;\n}\n\nexport interface GetProjectStatusResult {\n variant: string;\n version: string;\n gitClean: boolean;\n registryConfigured: boolean;\n plugins: { id: string; name: string; installed: boolean }[];\n}\n\nexport async function getProjectStatus(\n options: GetProjectStatusOptions,\n): Promise<GetProjectStatusResult> {\n const { variant, version } = await validateProject();\n const gitClean = await isGitClean();\n const registryConfigured = !!getCachedUsername();\n const registry = await PluginRegistry.load();\n const plugins = registry.getPluginsForVariant(variant);\n\n const pluginStatuses = await Promise.all(\n plugins.map(async (p) => ({\n id: p.id,\n name: p.name,\n installed: await isInstalled(p, variant),\n })),\n );\n\n return {\n variant,\n version,\n gitClean,\n registryConfigured,\n plugins: pluginStatuses,\n };\n}\n","import { cacheUsername } from '@/src/utils/username-cache';\nimport { detectVariant } from '@/src/utils/workspace';\n\nexport interface InitRegistryOptions {\n projectPath: string;\n githubUsername: string;\n}\n\nexport interface InitRegistryResult {\n success: true;\n variant: string;\n username: string;\n}\n\nexport async function initRegistry(\n options: InitRegistryOptions,\n): Promise<InitRegistryResult> {\n const variant = await detectVariant();\n\n cacheUsername(options.githubUsername);\n\n return {\n success: true,\n variant,\n username: options.githubUsername,\n };\n}\n","import {\n PluginRegistry,\n getEnvVars,\n isInstalled,\n} from '@/src/plugins-model';\nimport { detectVariant } from '@/src/utils/workspace';\n\nexport interface ListPluginsOptions {\n projectPath: string;\n}\n\nexport interface ListPluginsResult {\n variant: string;\n plugins: {\n id: string;\n name: string;\n description: string;\n installed: boolean;\n envVars: string[];\n postInstallMessage: string | null;\n }[];\n}\n\nexport async function listPlugins(\n options: ListPluginsOptions,\n): Promise<ListPluginsResult> {\n const variant = await detectVariant();\n const registry = await PluginRegistry.load();\n const plugins = registry.getPluginsForVariant(variant);\n\n const pluginList = await Promise.all(\n plugins.map(async (p) => ({\n id: p.id,\n name: p.name,\n description: p.description,\n installed: await isInstalled(p, variant),\n envVars: getEnvVars(p, variant).map((e) => e.key),\n postInstallMessage: p.postInstallMessage ?? null,\n })),\n );\n\n return { variant, plugins: pluginList };\n}\n","import { VARIANT_REPO_MAP } from '@/src/utils/upstream';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface VariantInfo {\n id: Variant;\n name: string;\n description: string;\n repo: string;\n tech: string[];\n database: string;\n auth: string;\n status: 'stable' | 'beta' | 'deprecated';\n}\n\nexport const VARIANT_CATALOG: VariantInfo[] = [\n {\n id: 'next-supabase',\n name: 'Next.js + Supabase',\n description: 'Full-stack SaaS kit with Next.js App Router and Supabase',\n repo: VARIANT_REPO_MAP['next-supabase'],\n tech: ['Next.js', 'Supabase', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL (Supabase)',\n auth: 'Supabase Auth',\n status: 'stable',\n },\n {\n id: 'next-drizzle',\n name: 'Next.js + Drizzle',\n description: 'Full-stack SaaS kit with Next.js and Drizzle ORM',\n repo: VARIANT_REPO_MAP['next-drizzle'],\n tech: ['Next.js', 'Drizzle', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL',\n auth: 'Better Auth',\n status: 'stable',\n },\n {\n id: 'next-prisma',\n name: 'Next.js + Prisma',\n description: 'Full-stack SaaS kit with Next.js and Prisma ORM',\n repo: VARIANT_REPO_MAP['next-prisma'],\n tech: ['Next.js', 'Prisma', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL',\n auth: 'Better Auth',\n status: 'stable',\n },\n {\n id: 'react-router-supabase',\n name: 'React Router + Supabase',\n description: 'Full-stack SaaS kit with React Router and Supabase',\n repo: VARIANT_REPO_MAP['react-router-supabase'],\n tech: ['React Router', 'Supabase', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL (Supabase)',\n auth: 'Supabase Auth',\n status: 'stable',\n },\n];\n\nexport interface ListVariantsResult {\n variants: VariantInfo[];\n}\n\nexport function listVariants(): ListVariantsResult {\n return { variants: VARIANT_CATALOG };\n}\n","import { join } from 'path';\n\nimport { execa, execaCommand } from 'execa';\nimport fs from 'fs-extra';\n\nimport { getErrorOutput, isGitClean } from '@/src/utils/git';\nimport {\n getUpstreamRemoteUrl,\n getUpstreamUrl,\n hasSshAccess,\n isUpstreamUrlValid,\n setUpstreamRemote,\n} from '@/src/utils/upstream';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface ProjectPullOptions {\n projectPath: string;\n}\n\nexport type ProjectPullResult =\n | {\n success: true;\n variant: string;\n upstreamUrl: string;\n alreadyUpToDate: boolean;\n message: string;\n }\n | {\n success: false;\n variant: string;\n upstreamUrl: string;\n hasConflicts: true;\n conflictCount: number;\n conflicts: {\n path: string;\n conflicted?: string;\n base?: string;\n ours?: string;\n theirs?: string;\n }[];\n instructions: string;\n }\n | { success: false; reason: string };\n\nexport async function projectPull(\n options: ProjectPullOptions,\n): Promise<ProjectPullResult> {\n const { variant } = await validateProject();\n\n const gitClean = await isGitClean();\n\n if (!gitClean) {\n return {\n success: false,\n reason:\n 'Git working directory has uncommitted changes. Please commit or stash them before pulling upstream updates.',\n };\n }\n\n let currentUrl = await getUpstreamRemoteUrl();\n\n if (!currentUrl) {\n const useSsh = await hasSshAccess();\n const url = getUpstreamUrl(variant, useSsh);\n\n await setUpstreamRemote(url);\n currentUrl = url;\n } else if (!isUpstreamUrlValid(currentUrl, variant)) {\n const useSsh = currentUrl.startsWith('git@');\n const expectedUrl = getUpstreamUrl(variant, useSsh);\n\n return {\n success: false,\n reason:\n `Upstream remote points to \"${currentUrl}\" but expected \"${expectedUrl}\" for variant \"${variant}\". ` +\n 'Please ask the user whether to update the upstream URL, then run: git remote set-url upstream <correct-url>',\n };\n }\n\n await execaCommand('git fetch upstream');\n\n try {\n const { stdout } = await execaCommand(\n 'git merge upstream/main --no-edit',\n );\n\n const alreadyUpToDate = stdout.includes('Already up to date');\n\n return {\n success: true,\n variant,\n upstreamUrl: currentUrl,\n alreadyUpToDate,\n message: alreadyUpToDate\n ? 'Already up to date.'\n : 'Successfully merged upstream changes.',\n };\n } catch (mergeError) {\n const output = getErrorOutput(mergeError);\n const isConflict =\n output.includes('CONFLICT') ||\n output.includes('Automatic merge failed');\n\n if (!isConflict) {\n throw new Error(`Merge failed: ${output}`);\n }\n\n const { stdout: statusOutput } = await execaCommand(\n 'git diff --name-only --diff-filter=U',\n );\n\n const conflictPaths = statusOutput\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n const cwd = process.cwd();\n\n const conflicts = await Promise.all(\n conflictPaths.map(async (filePath) => {\n let conflicted: string | undefined;\n\n try {\n conflicted = await fs.readFile(join(cwd, filePath), 'utf-8');\n } catch {\n conflicted = undefined;\n }\n\n let base: string | undefined;\n let ours: string | undefined;\n let theirs: string | undefined;\n\n try {\n const { stdout: b } = await execa('git', [\n 'show',\n `:1:${filePath}`,\n ]);\n base = b;\n } catch {\n base = undefined;\n }\n\n try {\n const { stdout: o } = await execa('git', [\n 'show',\n `:2:${filePath}`,\n ]);\n ours = o;\n } catch {\n ours = undefined;\n }\n\n try {\n const { stdout: t } = await execa('git', [\n 'show',\n `:3:${filePath}`,\n ]);\n theirs = t;\n } catch {\n theirs = undefined;\n }\n\n return { path: filePath, conflicted, base, ours, theirs };\n }),\n );\n\n return {\n success: false,\n variant,\n upstreamUrl: currentUrl,\n hasConflicts: true,\n conflictCount: conflicts.length,\n conflicts,\n instructions:\n 'Merge conflicts detected. For each conflict: review base, ours (local), and theirs (upstream) versions. ' +\n 'Produce resolved content and call makerkit_project_resolve_conflicts. ' +\n 'Ask the user for guidance when the intent behind local changes is unclear.',\n };\n }\n}\n","import { dirname, join } from 'path';\n\nimport { execa, execaCommand } from 'execa';\nimport fs from 'fs-extra';\n\nexport interface ResolveConflictsOptions {\n projectPath: string;\n files: { path: string; content: string }[];\n commitMessage?: string;\n}\n\nexport type ResolveConflictsResult =\n | { success: true; resolved: string[]; message: string }\n | {\n success: false;\n resolved: string[];\n remaining: string[];\n message: string;\n };\n\nexport async function resolveConflicts(\n options: ResolveConflictsOptions,\n): Promise<ResolveConflictsResult> {\n const cwd = process.cwd();\n\n for (const file of options.files) {\n const targetPath = join(cwd, file.path);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n\n const paths = options.files.map((f) => f.path);\n\n await execa('git', ['add', ...paths]);\n\n let remainingConflicts: string[] = [];\n\n try {\n const { stdout } = await execaCommand(\n 'git diff --name-only --diff-filter=U',\n );\n\n remainingConflicts = stdout.trim().split('\\n').filter(Boolean);\n } catch {\n remainingConflicts = [];\n }\n\n if (remainingConflicts.length > 0) {\n return {\n success: false,\n resolved: paths,\n remaining: remainingConflicts,\n message: `${paths.length} file(s) resolved, but ${remainingConflicts.length} conflict(s) remain. Resolve the remaining files and call makerkit_project_resolve_conflicts again.`,\n };\n }\n\n if (options.commitMessage) {\n await execa('git', ['commit', '-m', options.commitMessage]);\n } else {\n await execaCommand('git commit --no-edit');\n }\n\n return {\n success: true,\n resolved: paths,\n message: 'All conflicts resolved and merge commit created.',\n };\n}\n","export async function withProjectDir<T>(\n projectPath: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const original = process.cwd();\n\n try {\n process.chdir(projectPath);\n return await fn();\n } finally {\n process.chdir(original);\n }\n}\n"],"mappings":"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","names":["join","fs","join","fs","join","fs","dirname","join","fs","execaCommand","join","fs","join","fs","join","fs","dirname","join","fs","join","fs","dirname","join","fs","join","fs","join","fs","join","fs","join","fs","config","execaCommand","join","fs","join","execa","execaCommand","fs","execaCommand","fs","join","execa","dirname","join","execa","execaCommand","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/mcp.ts","../src/plugins-model.ts","../src/utils/plugins-cache.ts","../src/utils/base-store.ts","../src/utils/git.ts","../src/utils/install-registry-files.ts","../src/utils/run-codemod.ts","../src/utils/username-cache.ts","../src/utils/workspace.ts","../src/utils/add-plugin.ts","../src/utils/apply-plugin-update.ts","../src/utils/check-plugin-update.ts","../src/utils/create-project.ts","../src/utils/marker-file.ts","../src/version.ts","../src/utils/upstream.ts","../src/utils/get-project-status.ts","../src/utils/init-registry.ts","../src/utils/list-plugins.ts","../src/utils/list-variants.ts","../src/utils/project-pull.ts","../src/utils/resolve-conflicts.ts","../src/utils/with-project-dir.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from 'path';\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { config } from 'dotenv';\nimport { z } from 'zod/v3';\n\nimport { addPlugin } from '@/src/utils/add-plugin';\nimport { applyPluginUpdate } from '@/src/utils/apply-plugin-update';\nimport { checkPluginUpdate } from '@/src/utils/check-plugin-update';\nimport { createProject } from '@/src/utils/create-project';\nimport { getProjectStatus } from '@/src/utils/get-project-status';\nimport { initRegistry } from '@/src/utils/init-registry';\nimport { listPlugins } from '@/src/utils/list-plugins';\nimport { listVariants, VARIANT_CATALOG } from '@/src/utils/list-variants';\nimport { projectPull } from '@/src/utils/project-pull';\nimport { resolveConflicts } from '@/src/utils/resolve-conflicts';\nimport { withProjectDir } from '@/src/utils/with-project-dir';\nimport type { Variant } from '@/src/utils/workspace';\nimport { CLI_VERSION } from '@/src/version';\n\nconfig({ path: '.env.local' });\n\nfunction textContent(text: string) {\n return { content: [{ type: 'text' as const, text }] };\n}\n\nfunction errorContent(message: string) {\n return { content: [{ type: 'text' as const, text: message }], isError: true };\n}\n\nconst server = new McpServer({\n name: 'makerkit-cli',\n version: CLI_VERSION,\n});\n\nserver.registerTool(\n 'makerkit_status',\n {\n description: 'Project introspection: detect variant, git status, registry config, and plugin install status',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n },\n },\n async ({ projectPath }) => {\n try {\n const result = await withProjectDir(projectPath, () => getProjectStatus({ projectPath }));\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_list_variants',\n {\n description: 'List available MakerKit kit variants with metadata for the project creation wizard',\n inputSchema: {},\n },\n async () => {\n try {\n return textContent(JSON.stringify(listVariants(), null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_create_project',\n {\n description:\n 'Create a new MakerKit project: clones the selected kit variant, installs dependencies, and writes a .makerkit/config.json marker file.',\n inputSchema: {\n variant: z\n .enum(VARIANT_CATALOG.map((v) => v.id) as [Variant, ...Variant[]])\n .describe('Kit variant to create'),\n name: z.string().min(1).describe('Project directory name'),\n directory: z\n .string()\n .describe('Absolute path to the parent directory where the project will be created'),\n github_token: z\n .string()\n .optional()\n .describe('Optional GitHub PAT for HTTPS cloning (token is stripped from remote after clone)'),\n },\n },\n async ({ variant, name, directory, github_token }) => {\n try {\n if (!path.isAbsolute(directory)) {\n return errorContent(\n `\"directory\" must be an absolute path. Received: \"${directory}\"`,\n );\n }\n\n const result = await createProject({\n variant,\n name,\n directory,\n githubToken: github_token,\n });\n\n return textContent(\n JSON.stringify(\n {\n success: result.success,\n project_path: result.projectPath,\n variant: result.variant,\n message: result.message,\n },\n null,\n 2,\n ),\n );\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_list_plugins',\n {\n description: 'List all available plugins for the detected project variant with install status and metadata',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n },\n },\n async ({ projectPath }) => {\n try {\n const result = await withProjectDir(projectPath, () => listPlugins({ projectPath }));\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_add_plugin',\n {\n description: 'Install a MakerKit plugin: runs codemod, adds env vars, and returns structured result',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n pluginId: z.string().describe('Plugin identifier (e.g. feedback, waitlist, posthog)'),\n githubUsername: z.string().optional().describe('GitHub username for registry auth (skips interactive prompt)'),\n skipGitCheck: z.boolean().optional().describe('Skip git clean check (useful when installing multiple plugins in sequence)'),\n },\n },\n async ({ projectPath, pluginId, githubUsername, skipGitCheck }) => {\n try {\n const result = await withProjectDir(projectPath, () =>\n addPlugin({ projectPath, pluginId, githubUsername, skipGitCheck }),\n );\n\n if (!result.success) {\n return errorContent(result.reason);\n }\n\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_init_registry',\n {\n description: 'Cache the GitHub username used for MakerKit plugin registry authentication',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n githubUsername: z.string().describe('GitHub username registered with your MakerKit account'),\n },\n },\n async ({ projectPath, githubUsername }) => {\n try {\n const result = await withProjectDir(projectPath, () =>\n initRegistry({ projectPath, githubUsername }),\n );\n\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_check_update',\n {\n description:\n 'Analyze a plugin update using three-way diff (base/local/remote). Returns per-file status and content for AI-powered merge resolution.',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n pluginId: z.string().describe('Plugin identifier (e.g. feedback, waitlist)'),\n githubUsername: z\n .string()\n .optional()\n .describe('GitHub username for registry auth (uses cached if omitted)'),\n },\n },\n async ({ projectPath, pluginId, githubUsername }) => {\n try {\n const result = await withProjectDir(projectPath, () =>\n checkPluginUpdate({ projectPath, pluginId, githubUsername }),\n );\n\n if (!result.success) {\n return errorContent(result.reason);\n }\n\n return textContent(\n JSON.stringify(\n {\n ...result,\n note: 'For conflict files, produce a merged version and pass it to makerkit_apply_update.',\n },\n null,\n 2,\n ),\n );\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_apply_update',\n {\n description:\n 'Apply AI-resolved plugin update files. Writes merged content to disk and updates base versions for future three-way merges.',\n inputSchema: {\n projectPath: z.string().describe('Absolute path to the MakerKit project root'),\n pluginId: z.string().describe('Plugin identifier'),\n files: z\n .array(\n z.object({\n path: z.string().describe('File path relative to project root (from check_update)'),\n content: z.string().optional().describe('Resolved file content (required for write action)'),\n action: z\n .enum(['write', 'skip', 'delete'])\n .describe(\n 'write: write content to disk, skip: keep local version, delete: remove file from disk',\n ),\n }),\n )\n .describe('Array of file resolutions'),\n installDependencies: z\n .boolean()\n .optional()\n .describe('Whether to install plugin dependencies (default true)'),\n githubUsername: z\n .string()\n .optional()\n .describe('GitHub username for registry auth (uses cached if omitted)'),\n },\n },\n async ({ projectPath, pluginId, files, installDependencies, githubUsername }) => {\n try {\n const result = await withProjectDir(projectPath, () =>\n applyPluginUpdate({ projectPath, pluginId, files, installDependencies, githubUsername }),\n );\n\n if (!result.success) {\n return errorContent(result.reason);\n }\n\n return textContent(\n JSON.stringify(\n {\n ...result,\n note: 'Base versions updated. Run makerkit_check_update again to verify all files show as unchanged.',\n },\n null,\n 2,\n ),\n );\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_project_pull',\n {\n description:\n 'Pull latest upstream changes into a MakerKit project. Auto-detects kit variant, configures the upstream remote (SSH or HTTPS), fetches, and merges. Returns conflict details with base/local/remote content when merge conflicts occur so the AI can resolve them. After resolving, call makerkit_project_resolve_conflicts.',\n inputSchema: {\n projectPath: z\n .string()\n .describe('Absolute path to the MakerKit project root'),\n },\n },\n async ({ projectPath }) => {\n try {\n const result = await withProjectDir(projectPath, () => projectPull({ projectPath }));\n\n if (!result.success) {\n if ('hasConflicts' in result) {\n return textContent(JSON.stringify(result, null, 2));\n }\n\n return errorContent(result.reason);\n }\n\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nserver.registerTool(\n 'makerkit_project_resolve_conflicts',\n {\n description:\n 'Resolve merge conflicts from makerkit_project_pull. Write resolved file contents, stage them, and complete the merge commit.',\n inputSchema: {\n projectPath: z\n .string()\n .describe('Absolute path to the MakerKit project root'),\n files: z\n .array(\n z.object({\n path: z\n .string()\n .describe('File path relative to project root'),\n content: z\n .string()\n .describe('Resolved file content'),\n }),\n )\n .describe('Array of resolved files'),\n commitMessage: z\n .string()\n .optional()\n .describe(\n 'Custom merge commit message (defaults to auto-generated merge message)',\n ),\n },\n },\n async ({ projectPath, files, commitMessage }) => {\n try {\n const result = await withProjectDir(projectPath, () =>\n resolveConflicts({ projectPath, files, commitMessage }),\n );\n\n if (!result.success) {\n return textContent(JSON.stringify(result, null, 2));\n }\n\n return textContent(JSON.stringify(result, null, 2));\n } catch (error) {\n return errorContent(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n);\n\nasync function main() {\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n}\n\nvoid main();\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\nimport invariant from 'tiny-invariant';\n\nimport { fetchPluginRegistry } from '@/src/utils/plugins-cache';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface EnvVar {\n key: string;\n description: string;\n defaultValue?: string;\n}\n\nexport interface VariantConfig {\n envVars: EnvVar[];\n path?: string;\n}\n\nexport interface PluginDefinition {\n name: string;\n id: string;\n description: string;\n variants: Partial<Record<Variant, VariantConfig>>;\n postInstallMessage?: string;\n}\n\nconst DEFAULT_PLUGINS: Record<string, PluginDefinition> = {\n feedback: {\n name: 'Feedback',\n id: 'feedback',\n description: 'Add a feedback popup to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/feedback',\n },\n },\n },\n waitlist: {\n name: 'Waitlist',\n id: 'waitlist',\n description: 'Add a waitlist to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/waitlist',\n },\n },\n },\n testimonial: {\n name: 'Testimonial',\n id: 'testimonial',\n description: 'Add a testimonial widget to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/testimonial',\n },\n },\n },\n roadmap: {\n name: 'Roadmap',\n id: 'roadmap',\n description: 'Add a roadmap to your site.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/roadmap',\n },\n },\n },\n 'google-analytics': {\n name: 'Google Analytics',\n id: 'google-analytics',\n description: 'Add Google Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_GOOGLE_ANALYTICS_ID',\n description: 'Google Analytics Measurement ID',\n },\n ],\n path: 'packages/plugins/analytics/google-analytics',\n }\n },\n },\n honeybadger: {\n name: 'Honeybadger',\n id: 'honeybadger',\n description: 'Add Honeybadger Error Tracking to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'HONEYBADGER_API_KEY',\n description: 'Honeybadger private API key',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT',\n description: 'Honeybadger environment',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_REVISION',\n description: 'Honeybadger log revision',\n }\n ],\n path: 'packages/plugins/honeybadger',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'HONEYBADGER_API_KEY',\n description: 'Honeybadger private API key',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT',\n description: 'Honeybadger environment',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_REVISION',\n description: 'Honeybadger log revision',\n }\n ],\n path: 'packages/plugins/honeybadger',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'HONEYBADGER_API_KEY',\n description: 'Honeybadger private API key',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_ENVIRONMENT',\n description: 'Honeybadger environment',\n },\n {\n key: 'NEXT_PUBLIC_HONEYBADGER_REVISION',\n description: 'Honeybadger log revision',\n }\n ],\n },\n }\n },\n posthog: {\n name: 'PostHog',\n id: 'posthog',\n description: 'Add PostHog Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_POSTHOG_KEY',\n description: 'PostHog project API key',\n },\n {\n key: 'NEXT_PUBLIC_POSTHOG_HOST',\n description: 'PostHog host URL',\n defaultValue: 'https://app.posthog.com',\n },\n ],\n path: 'packages/plugins/analytics/posthog',\n },\n },\n },\n umami: {\n name: 'Umami',\n id: 'umami',\n description: 'Add Umami Analytics to your site.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_UMAMI_WEBSITE_ID',\n description: 'Umami website ID',\n },\n {\n key: 'NEXT_PUBLIC_UMAMI_HOST',\n description: 'Umami host URL',\n },\n ],\n path: 'packages/plugins/analytics/umami',\n },\n },\n },\n signoz: {\n name: 'SigNoz',\n id: 'signoz',\n description: 'Add SigNoz Monitoring to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'OTEL_EXPORTER_OTLP_ENDPOINT',\n description: 'SigNoz OTLP endpoint URL',\n },\n ],\n path: 'packages/plugins/signoz',\n },\n },\n },\n paddle: {\n name: 'Paddle',\n id: 'paddle',\n description: 'Add Paddle Billing to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_PADDLE_CLIENT_TOKEN',\n description: 'Paddle client-side token',\n },\n {\n key: 'PADDLE_API_KEY',\n description: 'Paddle API key',\n },\n {\n key: 'PADDLE_WEBHOOK_SECRET',\n description: 'Paddle webhook secret',\n },\n ],\n path: 'packages/plugins/paddle',\n },\n },\n },\n 'supabase-cms': {\n name: 'Supabase CMS',\n id: 'supabase-cms',\n description: 'Add Supabase CMS provider to your app.',\n postInstallMessage: 'Run database migrations: pnpm db:migrate',\n variants: {\n 'next-supabase': {\n envVars: [],\n path: 'packages/plugins/supabase-cms',\n },\n },\n },\n 'meshes-analytics': {\n name: 'Meshes Analytics',\n id: 'meshes-analytics',\n description: 'Add Meshes Analytics to your app.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_MESHES_PUBLISHABLE_KEY',\n description: 'The Meshes publishable key'\n }\n ],\n path: 'packages/plugins/meshes-analytics',\n },\n },\n },\n directus: {\n name: 'Directus CMS',\n id: 'directus',\n description: 'Add Directus as your CMS.',\n variants: {\n 'next-supabase': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n 'next-drizzle': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n 'next-prisma': {\n envVars: [\n {\n key: 'NEXT_PUBLIC_DIRECTUS_URL',\n description: 'The Directus URL'\n },\n {\n key: 'DIRECTUS_ACCESS_TOKEN',\n description: 'The Directus access token'\n }\n ],\n path: 'packages/plugins/directus',\n },\n },\n }\n};\n\nexport class PluginRegistry {\n private constructor(\n private plugins: Record<string, PluginDefinition>,\n ) {}\n\n static async load(): Promise<PluginRegistry> {\n const registryUrl = process.env.MAKERKIT_PLUGINS_REGISTRY_URL;\n const plugins = await fetchPluginRegistry(registryUrl, DEFAULT_PLUGINS);\n\n return new PluginRegistry(plugins);\n }\n\n getPluginById(id: string): PluginDefinition | undefined {\n return this.plugins[id];\n }\n\n getPluginsForVariant(variant: Variant): PluginDefinition[] {\n return Object.values(this.plugins).filter((p) => variant in p.variants);\n }\n\n validatePlugin(pluginId: string, variant: Variant): PluginDefinition {\n const plugin = this.getPluginById(pluginId);\n\n invariant(plugin, `Plugin \"${pluginId}\" not found`);\n\n invariant(\n plugin.variants[variant],\n `Plugin \"${pluginId}\" is not available for the ${variant} variant`,\n );\n\n return plugin;\n }\n}\n\nexport function getEnvVars(\n plugin: PluginDefinition,\n variant: Variant,\n): EnvVar[] {\n return plugin.variants[variant]?.envVars ?? [];\n}\n\nexport function getPath(\n plugin: PluginDefinition,\n variant: Variant,\n): string | undefined {\n return plugin.variants[variant]?.path;\n}\n\nexport async function isInstalled(\n plugin: PluginDefinition,\n variant: Variant,\n): Promise<boolean> {\n const pluginPath = getPath(plugin, variant);\n\n if (!pluginPath) {\n return false;\n }\n\n const pkgJsonPath = join(process.cwd(), pluginPath, 'package.json');\n\n if (!(await fs.pathExists(pkgJsonPath))) {\n return false;\n }\n\n try {\n const pkg = await fs.readJson(pkgJsonPath);\n\n return !!pkg.name && !!pkg.exports;\n } catch {\n return false;\n }\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\n\nimport fs from 'fs-extra';\n\nimport type { PluginDefinition } from '@/src/plugins-model';\n\nconst CACHE_DIR = join(homedir(), '.makerkit');\nconst CACHE_FILE = join(CACHE_DIR, 'plugins.json');\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\ninterface CacheEntry {\n fetchedAt: number;\n plugins: Record<string, PluginDefinition>;\n}\n\nasync function readCache(): Promise<CacheEntry | null> {\n try {\n if (!(await fs.pathExists(CACHE_FILE))) {\n return null;\n }\n\n return await fs.readJson(CACHE_FILE);\n } catch {\n return null;\n }\n}\n\nasync function writeCache(\n plugins: Record<string, PluginDefinition>,\n): Promise<void> {\n try {\n await fs.ensureDir(CACHE_DIR);\n\n await fs.writeJson(\n CACHE_FILE,\n { fetchedAt: Date.now(), plugins },\n { spaces: 2 },\n );\n } catch {\n // Ignore cache write failures\n }\n}\n\nexport async function fetchPluginRegistry(\n registryUrl: string | undefined,\n fallback: Record<string, PluginDefinition>,\n): Promise<Record<string, PluginDefinition>> {\n if (!registryUrl) {\n return fallback;\n }\n\n // Check cache first\n const cached = await readCache();\n\n if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {\n return cached.plugins;\n }\n\n // Fetch from remote\n try {\n const response = await fetch(registryUrl);\n\n if (response.ok) {\n const data = await response.json();\n const plugins = data.plugins as Record<string, PluginDefinition>;\n\n await writeCache(plugins);\n\n return plugins;\n }\n } catch {\n // Network error — fall through\n }\n\n // Return stale cache if available, otherwise bundled fallback\n return cached?.plugins ?? fallback;\n}\n","import { dirname, join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport type { RegistryFile } from '@/src/utils/install-registry-files';\n\nexport type FileStatus =\n | 'unchanged'\n | 'updated'\n | 'conflict'\n | 'added'\n | 'deleted_locally'\n | 'no_base';\n\nfunction basesDir(pluginId: string): string {\n return join(process.cwd(), 'node_modules', '.cache', 'makerkit', 'bases', pluginId);\n}\n\nexport async function saveBaseVersions(\n pluginId: string,\n files: RegistryFile[],\n): Promise<void> {\n const dir = basesDir(pluginId);\n\n for (const file of files) {\n const targetPath = join(dir, file.target);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n}\n\nexport async function readBaseVersion(\n pluginId: string,\n fileTarget: string,\n): Promise<string | undefined> {\n const filePath = join(basesDir(pluginId), fileTarget);\n\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch {\n return undefined;\n }\n}\n\nexport async function hasBaseVersions(pluginId: string): Promise<boolean> {\n return fs.pathExists(basesDir(pluginId));\n}\n\nexport function computeFileStatus(params: {\n base?: string;\n local?: string;\n remote: string;\n}): FileStatus {\n const { base, local, remote } = params;\n\n // Local matches remote — nothing to do regardless of base\n if (local !== undefined && local === remote) {\n return 'unchanged';\n }\n\n // No base version (legacy install or new file)\n if (base === undefined) {\n if (local === undefined) {\n return 'added';\n }\n\n return 'no_base';\n }\n\n // Has base version\n if (local === undefined) {\n return 'deleted_locally';\n }\n\n if (base === local) {\n // User hasn't touched the file — safe auto-apply\n return 'updated';\n }\n\n if (base === remote) {\n // Remote hasn't changed — local edits are fine\n return 'unchanged';\n }\n\n // Both sides changed\n return 'conflict';\n}\n","import { execaCommand } from 'execa';\n\nexport function getErrorOutput(error: unknown): string {\n if (error instanceof Error && 'stderr' in error) {\n const stderr = String((error as { stderr: unknown }).stderr);\n\n if (stderr) return stderr;\n }\n\n if (error instanceof Error && 'stdout' in error) {\n const stdout = String((error as { stdout: unknown }).stdout);\n\n if (stdout) return stdout;\n }\n\n return error instanceof Error ? error.message : String(error);\n}\n\nexport async function isGitClean(): Promise<boolean> {\n const { stdout } = await execaCommand('git status --porcelain');\n\n return stdout.trim() === '';\n}\n\nexport async function getGitRoot(): Promise<string> {\n const { stdout } = await execaCommand('git rev-parse --show-toplevel');\n\n return stdout.trim();\n}\n\nexport async function getGitUsername(): Promise<string | undefined> {\n try {\n const { stdout } = await execaCommand('git config --get user.username');\n const username = stdout.trim();\n\n return username.length > 0 ? username : undefined;\n } catch {\n return undefined;\n }\n}\n","import { dirname, join } from 'path';\nimport fs from 'fs-extra';\n\nexport interface RegistryFile {\n path: string;\n content: string;\n type: string;\n target: string;\n}\n\nexport interface RegistryItem {\n name: string;\n files: RegistryFile[];\n dependencies?: Record<string, string>;\n}\n\nexport async function fetchRegistryItem(\n variant: string,\n pluginId: string,\n username: string,\n): Promise<RegistryItem> {\n const url = `https://makerkit.dev/r/${variant}/${pluginId}.json?username=${username}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch plugin registry for \"${pluginId}\" (${response.status}): ${response.statusText}`,\n );\n }\n\n const item: RegistryItem = await response.json();\n\n if (!item.files || item.files.length === 0) {\n throw new Error(`Plugin \"${pluginId}\" has no files in the registry.`);\n }\n\n return item;\n}\n\nexport async function installRegistryFiles(\n variant: string,\n pluginId: string,\n username: string,\n): Promise<RegistryItem> {\n const item = await fetchRegistryItem(variant, pluginId, username);\n const cwd = process.cwd();\n\n for (const file of item.files) {\n const targetPath = join(cwd, file.target);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n\n return item;\n}\n","import { execaCommand } from 'execa';\n\nconst CODEMOD_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\nexport async function runCodemod(\n variant: string,\n pluginId: string,\n options?: { captureOutput?: boolean },\n): Promise<{ success: boolean; output: string }> {\n try {\n const localPath = process.env.MAKERKIT_CODEMODS_PATH;\n const runner = process.env.MAKERKIT_PACKAGE_RUNNER ?? 'npx --yes';\n\n const command = localPath\n ? `${runner} codemod workflow run --allow-dirty -w ${localPath}/codemods/${variant}/${pluginId}`\n : `${runner} codemod --allow-dirty @makerkit/${variant}-${pluginId}`;\n\n const { stdout, stderr } = await execaCommand(command, {\n stdio: options?.captureOutput ? 'pipe' : 'inherit',\n timeout: CODEMOD_TIMEOUT_MS,\n });\n\n return {\n success: true,\n output: stdout || stderr || '',\n };\n } catch (error) {\n let message = 'Unknown error during codemod';\n\n if (error instanceof Error) {\n message = error.message;\n\n if ('stderr' in error && error.stderr) {\n message += `\\n${error.stderr}`;\n }\n\n if ('timedOut' in error && error.timedOut) {\n message = `Codemod timed out after ${CODEMOD_TIMEOUT_MS / 1000}s (the workflow engine may have stalled after an error)`;\n }\n }\n\n return {\n success: false,\n output: message,\n };\n }\n}\n","import { join } from 'path';\nimport { tmpdir } from 'os';\n\nimport fs from 'fs-extra';\nimport prompts from 'prompts';\n\nimport { getGitUsername } from '@/src/utils/git';\n\nconst USERNAME_FILE = join(tmpdir(), 'makerkit-username');\n\nexport function getCachedUsername(): string | undefined {\n try {\n const username = fs.readFileSync(USERNAME_FILE, 'utf-8').trim();\n\n return username.length > 0 ? username : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function cacheUsername(username: string): void {\n fs.writeFileSync(USERNAME_FILE, username, 'utf-8');\n}\n\nexport function clearCachedUsername(): void {\n try {\n fs.removeSync(USERNAME_FILE);\n } catch {\n // ignore\n }\n}\n\nexport async function promptForUsername(): Promise<string> {\n const gitUsername = await getGitUsername();\n\n const response = await prompts({\n type: 'text',\n name: 'githubUsername',\n message:\n 'Enter the GitHub username registered with your Makerkit account',\n initial: gitUsername,\n validate: (value) => {\n return value.trim().length > 0 ? true : 'GitHub username is required';\n },\n });\n\n const username = (response.githubUsername as string | undefined)?.trim();\n\n if (!username) {\n throw new Error('Setup cancelled. GitHub username is required.');\n }\n\n cacheUsername(username);\n\n return username;\n}\n\nexport async function getOrPromptUsername(\n providedUsername?: string,\n): Promise<string> {\n if (providedUsername?.trim()) {\n const username = providedUsername.trim();\n\n cacheUsername(username);\n\n return username;\n }\n\n const cached = getCachedUsername();\n\n if (cached) {\n return cached;\n }\n\n return promptForUsername();\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\n\nexport type Variant =\n | 'next-supabase'\n | 'next-drizzle'\n | 'next-prisma'\n | 'react-router-supabase';\n\nasync function readDeps(\n pkgPath: string,\n): Promise<Record<string, string>> {\n if (!(await fs.pathExists(pkgPath))) {\n return {};\n }\n\n const pkg = await fs.readJson(pkgPath);\n\n return {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n}\n\nexport async function detectVariant(): Promise<Variant> {\n const cwd = process.cwd();\n\n const rootPkgPath = join(cwd, 'package.json');\n\n if (!(await fs.pathExists(rootPkgPath))) {\n throw new Error(\n 'No package.json found. Please run this command from a MakerKit project root.',\n );\n }\n\n const rootDeps = await readDeps(rootPkgPath);\n\n if (!rootDeps['turbo']) {\n throw new Error(\n 'This does not appear to be a MakerKit Turbo monorepo. The \"turbo\" dependency was not found in package.json.',\n );\n }\n\n const webDeps = await readDeps(join(cwd, 'apps', 'web', 'package.json'));\n const dbDeps = await readDeps(\n join(cwd, 'packages', 'database', 'package.json'),\n );\n\n const hasSupabase = !!webDeps['@supabase/supabase-js'];\n const hasReactRouter = !!webDeps['@react-router/node'];\n const hasDrizzle = !!webDeps['drizzle-orm'] || !!dbDeps['drizzle-orm'];\n const hasPrisma = !!webDeps['@prisma/client'] || !!dbDeps['@prisma/client'];\n\n if (hasReactRouter && hasSupabase) {\n return 'react-router-supabase';\n }\n\n if (hasSupabase) {\n return 'next-supabase';\n }\n\n if (hasDrizzle) {\n return 'next-drizzle';\n }\n\n if (hasPrisma) {\n return 'next-prisma';\n }\n\n throw new Error(\n 'Unrecognized MakerKit project. Could not detect variant from dependencies.',\n );\n}\n\nexport async function validateProject(): Promise<{\n variant: Variant;\n version: string;\n}> {\n const variant = await detectVariant();\n const rootPkg = await fs.readJson(join(process.cwd(), 'package.json'));\n\n return {\n variant,\n version: rootPkg.version ?? 'unknown',\n };\n}\n","import {\n PluginRegistry,\n getEnvVars,\n isInstalled,\n} from '@/src/plugins-model';\nimport { saveBaseVersions } from '@/src/utils/base-store';\nimport { isGitClean } from '@/src/utils/git';\nimport { installRegistryFiles } from '@/src/utils/install-registry-files';\nimport { runCodemod } from '@/src/utils/run-codemod';\nimport {\n cacheUsername,\n getCachedUsername,\n} from '@/src/utils/username-cache';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface AddPluginOptions {\n projectPath: string;\n pluginId: string;\n githubUsername?: string;\n skipGitCheck?: boolean;\n captureCodemodOutput?: boolean;\n}\n\nexport type AddPluginResult =\n | {\n success: true;\n pluginName: string;\n pluginId: string;\n variant: string;\n envVars: { key: string; description: string }[];\n postInstallMessage: string | null;\n codemodOutput: string;\n codemodWarning?: string;\n }\n | { success: false; reason: string };\n\nexport async function addPlugin(\n options: AddPluginOptions,\n): Promise<AddPluginResult> {\n if (!options.skipGitCheck) {\n const gitClean = await isGitClean();\n\n if (!gitClean) {\n return {\n success: false,\n reason:\n 'Git working directory has uncommitted changes. Please commit or stash them before adding a plugin.',\n };\n }\n }\n\n const { variant } = await validateProject();\n\n const username = options.githubUsername?.trim() || getCachedUsername();\n\n if (!username) {\n return {\n success: false,\n reason:\n 'No GitHub username cached and none provided. Call makerkit_init_registry first or pass githubUsername.',\n };\n }\n\n cacheUsername(username);\n\n const registry = await PluginRegistry.load();\n const plugin = registry.validatePlugin(options.pluginId, variant);\n\n if (await isInstalled(plugin, variant)) {\n return {\n success: false,\n reason: `Plugin \"${plugin.name}\" is already installed.`,\n };\n }\n\n const item = await installRegistryFiles(variant, options.pluginId, username);\n await saveBaseVersions(options.pluginId, item.files);\n\n const codemodResult = await runCodemod(variant, options.pluginId, {\n captureOutput: options.captureCodemodOutput ?? true,\n });\n\n const envVars = getEnvVars(plugin, variant);\n\n return {\n success: true,\n pluginName: plugin.name,\n pluginId: plugin.id,\n variant,\n envVars: envVars.map((e) => ({ key: e.key, description: e.description })),\n postInstallMessage: plugin.postInstallMessage ?? null,\n codemodOutput: codemodResult.output,\n codemodWarning: codemodResult.success\n ? undefined\n : `The automated codemod did not complete successfully. Plugin files were installed but some wiring steps may have failed.\\n${codemodResult.output}`,\n };\n}\n","import { dirname, join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport { PluginRegistry } from '@/src/plugins-model';\nimport { saveBaseVersions } from '@/src/utils/base-store';\nimport { fetchRegistryItem } from '@/src/utils/install-registry-files';\nimport {\n cacheUsername,\n getCachedUsername,\n} from '@/src/utils/username-cache';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface ApplyPluginUpdateOptions {\n projectPath: string;\n pluginId: string;\n files: {\n path: string;\n content?: string;\n action: 'write' | 'skip' | 'delete';\n }[];\n installDependencies?: boolean;\n githubUsername?: string;\n}\n\nexport type ApplyPluginUpdateResult =\n | {\n success: true;\n pluginId: string;\n variant: string;\n written: string[];\n skipped: string[];\n deleted: string[];\n }\n | { success: false; reason: string };\n\nexport async function applyPluginUpdate(\n options: ApplyPluginUpdateOptions,\n): Promise<ApplyPluginUpdateResult> {\n const { variant } = await validateProject();\n\n const username = options.githubUsername?.trim() || getCachedUsername();\n\n if (!username) {\n return {\n success: false,\n reason:\n 'No GitHub username cached and none provided. Call makerkit_init_registry first or pass githubUsername.',\n };\n }\n\n cacheUsername(username);\n\n const registry = await PluginRegistry.load();\n registry.validatePlugin(options.pluginId, variant);\n\n const item = await fetchRegistryItem(variant, options.pluginId, username);\n const remoteByPath = new Map(item.files.map((f) => [f.target, f.content]));\n\n const cwd = process.cwd();\n const written: string[] = [];\n const skipped: string[] = [];\n const deleted: string[] = [];\n\n for (const file of options.files) {\n const targetPath = join(cwd, file.path);\n\n switch (file.action) {\n case 'write': {\n if (file.content === undefined) {\n return {\n success: false,\n reason: `File \"${file.path}\" has action \"write\" but no content provided.`,\n };\n }\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n written.push(file.path);\n break;\n }\n case 'skip': {\n skipped.push(file.path);\n break;\n }\n case 'delete': {\n if (await fs.pathExists(targetPath)) {\n await fs.remove(targetPath);\n }\n\n deleted.push(file.path);\n break;\n }\n }\n\n if (file.action !== 'delete') {\n const remoteContent = remoteByPath.get(file.path);\n\n if (remoteContent !== undefined) {\n await saveBaseVersions(options.pluginId, [\n { path: '', content: remoteContent, type: '', target: file.path },\n ]);\n }\n }\n }\n\n return {\n success: true,\n pluginId: options.pluginId,\n variant,\n written,\n skipped,\n deleted,\n };\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport { PluginRegistry } from '@/src/plugins-model';\nimport {\n computeFileStatus,\n hasBaseVersions,\n readBaseVersion,\n} from '@/src/utils/base-store';\nimport { fetchRegistryItem } from '@/src/utils/install-registry-files';\nimport {\n cacheUsername,\n getCachedUsername,\n} from '@/src/utils/username-cache';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface CheckPluginUpdateOptions {\n projectPath: string;\n pluginId: string;\n githubUsername?: string;\n}\n\nexport type CheckPluginUpdateResult =\n | {\n success: true;\n pluginId: string;\n variant: string;\n hasBaseVersions: boolean;\n counts: Record<string, number>;\n files: {\n path: string;\n status: string;\n base?: string;\n local?: string;\n remote?: string;\n }[];\n }\n | { success: false; reason: string };\n\nexport async function checkPluginUpdate(\n options: CheckPluginUpdateOptions,\n): Promise<CheckPluginUpdateResult> {\n const { variant } = await validateProject();\n\n const username = options.githubUsername?.trim() || getCachedUsername();\n\n if (!username) {\n return {\n success: false,\n reason:\n 'No GitHub username cached and none provided. Call makerkit_init_registry first or pass githubUsername.',\n };\n }\n\n cacheUsername(username);\n\n const registry = await PluginRegistry.load();\n registry.validatePlugin(options.pluginId, variant);\n\n const item = await fetchRegistryItem(variant, options.pluginId, username);\n const cwd = process.cwd();\n const hasBase = await hasBaseVersions(options.pluginId);\n\n const counts: Record<string, number> = {\n unchanged: 0,\n updated: 0,\n conflict: 0,\n added: 0,\n deleted_locally: 0,\n no_base: 0,\n };\n\n const files = await Promise.all(\n item.files.map(async (file) => {\n const localPath = join(cwd, file.target);\n\n let local: string | undefined;\n\n try {\n local = await fs.readFile(localPath, 'utf-8');\n } catch {\n local = undefined;\n }\n\n const base = await readBaseVersion(options.pluginId, file.target);\n const remote = file.content;\n\n const status = computeFileStatus({ base, local, remote });\n counts[status]++;\n\n const result: {\n path: string;\n status: string;\n base?: string;\n local?: string;\n remote?: string;\n } = {\n path: file.target,\n status,\n };\n\n switch (status) {\n case 'unchanged':\n break;\n case 'updated':\n result.remote = remote;\n break;\n case 'conflict':\n result.base = base;\n result.local = local;\n result.remote = remote;\n break;\n case 'no_base':\n result.local = local;\n result.remote = remote;\n break;\n case 'added':\n result.remote = remote;\n break;\n case 'deleted_locally':\n result.base = base;\n result.remote = remote;\n break;\n }\n\n return result;\n }),\n );\n\n return {\n success: true,\n pluginId: options.pluginId,\n variant,\n hasBaseVersions: hasBase,\n counts,\n files,\n };\n}\n","import { join } from 'path';\n\nimport { execa } from 'execa';\nimport fs from 'fs-extra';\n\nimport { writeMarkerFile } from '@/src/utils/marker-file';\nimport { VARIANT_REPO_MAP, hasSshAccess } from '@/src/utils/upstream';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface CreateProjectOptions {\n variant: Variant;\n name: string;\n directory: string;\n githubToken?: string;\n}\n\nexport interface CreateProjectResult {\n success: boolean;\n projectPath: string;\n variant: Variant;\n kitRepo: string;\n message: string;\n}\n\nexport async function createProject(\n options: CreateProjectOptions,\n): Promise<CreateProjectResult> {\n const { variant, name, directory, githubToken } = options;\n const projectPath = join(directory, name);\n const repo = VARIANT_REPO_MAP[variant];\n\n // 1. Validate target dir doesn't already exist\n if (await fs.pathExists(projectPath)) {\n throw new Error(\n `Target directory \"${projectPath}\" already exists. Choose a different name or remove it first.`,\n );\n }\n\n // 2. Validate parent dir exists\n if (!(await fs.pathExists(directory))) {\n throw new Error(\n `Parent directory \"${directory}\" does not exist.`,\n );\n }\n\n // 3. Resolve clone URL\n let cloneUrl: string;\n\n if (githubToken) {\n cloneUrl = `https://${githubToken}@github.com/${repo}`;\n } else {\n const useSsh = await hasSshAccess();\n cloneUrl = useSsh\n ? `git@github.com:${repo}`\n : `https://github.com/${repo}`;\n }\n\n // 4. Clone\n await execa('git', ['clone', cloneUrl, name], { cwd: directory });\n\n // 5. Strip token from remote if needed\n if (githubToken) {\n await execa(\n 'git',\n ['remote', 'set-url', 'origin', `https://github.com/${repo}`],\n { cwd: projectPath },\n );\n }\n\n // 6. Install dependencies\n await execa('pnpm', ['install'], { cwd: projectPath });\n\n // 7. Write marker file\n await writeMarkerFile(projectPath, variant, repo);\n\n return {\n success: true,\n projectPath,\n variant,\n kitRepo: repo,\n message: `Project \"${name}\" created successfully with variant \"${variant}\".`,\n };\n}\n","import { join } from 'path';\n\nimport fs from 'fs-extra';\n\nimport { CLI_VERSION } from '@/src/version';\n\nexport interface MakerkitProjectConfig {\n version: number;\n variant: string;\n kit_repo: string;\n created_at: string;\n cli_version: string;\n}\n\nexport async function writeMarkerFile(\n projectPath: string,\n variant: string,\n kitRepo: string,\n): Promise<void> {\n const dir = join(projectPath, '.makerkit');\n\n await fs.ensureDir(dir);\n\n const config: MakerkitProjectConfig = {\n version: 1,\n variant,\n kit_repo: kitRepo,\n created_at: new Date().toISOString(),\n cli_version: CLI_VERSION,\n };\n\n await fs.writeJson(join(dir, 'config.json'), config, { spaces: 2 });\n}\n\nexport async function readMarkerFile(\n projectPath: string,\n): Promise<MakerkitProjectConfig | null> {\n const filePath = join(projectPath, '.makerkit', 'config.json');\n\n if (!(await fs.pathExists(filePath))) {\n return null;\n }\n\n return fs.readJson(filePath);\n}\n","export const CLI_VERSION = '2.0.0-beta.1';\n","import type { Variant } from '@/src/utils/workspace';\n\nimport { execaCommand } from 'execa';\n\nexport const VARIANT_REPO_MAP: Record<Variant, string> = {\n 'next-supabase': 'makerkit/next-supabase-saas-kit-turbo',\n 'next-drizzle': 'makerkit/next-drizzle-saas-kit-turbo',\n 'next-prisma': 'makerkit/next-prisma-saas-kit-turbo',\n 'react-router-supabase': 'makerkit/react-router-supabase-saas-kit-turbo',\n};\n\nfunction sshUrl(repo: string): string {\n return `git@github.com:${repo}`;\n}\n\nfunction httpsUrl(repo: string): string {\n return `https://github.com/${repo}`;\n}\n\nexport async function hasSshAccess(): Promise<boolean> {\n try {\n await execaCommand('ssh -T git@github.com -o StrictHostKeyChecking=no', {\n timeout: 10_000,\n });\n\n return true;\n } catch (error) {\n // ssh -T git@github.com exits with code 1 even on success,\n // but prints \"successfully authenticated\" in stderr\n const stderr =\n error instanceof Error && 'stderr' in error\n ? String((error as { stderr: unknown }).stderr)\n : '';\n\n return stderr.includes('successfully authenticated');\n }\n}\n\nexport function getUpstreamUrl(variant: Variant, useSsh: boolean): string {\n const repo = VARIANT_REPO_MAP[variant];\n\n return useSsh ? sshUrl(repo) : httpsUrl(repo);\n}\n\n/**\n * Check if a remote URL points to the correct repo for the given variant,\n * regardless of whether it uses SSH or HTTPS.\n * Handles trailing `.git` and `/` in URLs.\n */\nexport function isUpstreamUrlValid(\n url: string,\n variant: Variant,\n): boolean {\n const normalized = url.replace(/\\/+$/, '').replace(/\\.git$/, '');\n const repo = VARIANT_REPO_MAP[variant];\n\n return normalized === sshUrl(repo) || normalized === httpsUrl(repo);\n}\n\nexport async function getUpstreamRemoteUrl(): Promise<string | undefined> {\n try {\n const { stdout } = await execaCommand('git remote get-url upstream');\n return stdout.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function setUpstreamRemote(url: string): Promise<void> {\n const currentUrl = await getUpstreamRemoteUrl();\n\n if (currentUrl) {\n await execaCommand(`git remote set-url upstream ${url}`);\n } else {\n await execaCommand(`git remote add upstream ${url}`);\n }\n}\n","import {\n PluginRegistry,\n isInstalled,\n} from '@/src/plugins-model';\nimport { isGitClean } from '@/src/utils/git';\nimport { getCachedUsername } from '@/src/utils/username-cache';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface GetProjectStatusOptions {\n projectPath: string;\n}\n\nexport interface GetProjectStatusResult {\n variant: string;\n version: string;\n gitClean: boolean;\n registryConfigured: boolean;\n plugins: { id: string; name: string; installed: boolean }[];\n}\n\nexport async function getProjectStatus(\n options: GetProjectStatusOptions,\n): Promise<GetProjectStatusResult> {\n const { variant, version } = await validateProject();\n const gitClean = await isGitClean();\n const registryConfigured = !!getCachedUsername();\n const registry = await PluginRegistry.load();\n const plugins = registry.getPluginsForVariant(variant);\n\n const pluginStatuses = await Promise.all(\n plugins.map(async (p) => ({\n id: p.id,\n name: p.name,\n installed: await isInstalled(p, variant),\n })),\n );\n\n return {\n variant,\n version,\n gitClean,\n registryConfigured,\n plugins: pluginStatuses,\n };\n}\n","import { cacheUsername } from '@/src/utils/username-cache';\nimport { detectVariant } from '@/src/utils/workspace';\n\nexport interface InitRegistryOptions {\n projectPath: string;\n githubUsername: string;\n}\n\nexport interface InitRegistryResult {\n success: true;\n variant: string;\n username: string;\n}\n\nexport async function initRegistry(\n options: InitRegistryOptions,\n): Promise<InitRegistryResult> {\n const variant = await detectVariant();\n\n cacheUsername(options.githubUsername);\n\n return {\n success: true,\n variant,\n username: options.githubUsername,\n };\n}\n","import {\n PluginRegistry,\n getEnvVars,\n isInstalled,\n} from '@/src/plugins-model';\nimport { detectVariant } from '@/src/utils/workspace';\n\nexport interface ListPluginsOptions {\n projectPath: string;\n}\n\nexport interface ListPluginsResult {\n variant: string;\n plugins: {\n id: string;\n name: string;\n description: string;\n installed: boolean;\n envVars: string[];\n postInstallMessage: string | null;\n }[];\n}\n\nexport async function listPlugins(\n options: ListPluginsOptions,\n): Promise<ListPluginsResult> {\n const variant = await detectVariant();\n const registry = await PluginRegistry.load();\n const plugins = registry.getPluginsForVariant(variant);\n\n const pluginList = await Promise.all(\n plugins.map(async (p) => ({\n id: p.id,\n name: p.name,\n description: p.description,\n installed: await isInstalled(p, variant),\n envVars: getEnvVars(p, variant).map((e) => e.key),\n postInstallMessage: p.postInstallMessage ?? null,\n })),\n );\n\n return { variant, plugins: pluginList };\n}\n","import { VARIANT_REPO_MAP } from '@/src/utils/upstream';\nimport type { Variant } from '@/src/utils/workspace';\n\nexport interface VariantInfo {\n id: Variant;\n name: string;\n description: string;\n repo: string;\n tech: string[];\n database: string;\n auth: string;\n status: 'stable' | 'beta' | 'deprecated';\n}\n\nexport const VARIANT_CATALOG: VariantInfo[] = [\n {\n id: 'next-supabase',\n name: 'Next.js + Supabase',\n description: 'Full-stack SaaS kit with Next.js App Router and Supabase',\n repo: VARIANT_REPO_MAP['next-supabase'],\n tech: ['Next.js', 'Supabase', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL (Supabase)',\n auth: 'Supabase Auth',\n status: 'stable',\n },\n {\n id: 'next-drizzle',\n name: 'Next.js + Drizzle',\n description: 'Full-stack SaaS kit with Next.js and Drizzle ORM',\n repo: VARIANT_REPO_MAP['next-drizzle'],\n tech: ['Next.js', 'Drizzle', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL',\n auth: 'Better Auth',\n status: 'stable',\n },\n {\n id: 'next-prisma',\n name: 'Next.js + Prisma',\n description: 'Full-stack SaaS kit with Next.js and Prisma ORM',\n repo: VARIANT_REPO_MAP['next-prisma'],\n tech: ['Next.js', 'Prisma', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL',\n auth: 'Better Auth',\n status: 'stable',\n },\n {\n id: 'react-router-supabase',\n name: 'React Router + Supabase',\n description: 'Full-stack SaaS kit with React Router and Supabase',\n repo: VARIANT_REPO_MAP['react-router-supabase'],\n tech: ['React Router', 'Supabase', 'Tailwind CSS', 'shadcn/ui'],\n database: 'PostgreSQL (Supabase)',\n auth: 'Supabase Auth',\n status: 'stable',\n },\n];\n\nexport interface ListVariantsResult {\n variants: VariantInfo[];\n}\n\nexport function listVariants(): ListVariantsResult {\n return { variants: VARIANT_CATALOG };\n}\n","import { join } from 'path';\n\nimport { execa, execaCommand } from 'execa';\nimport fs from 'fs-extra';\n\nimport { getErrorOutput, isGitClean } from '@/src/utils/git';\nimport {\n getUpstreamRemoteUrl,\n getUpstreamUrl,\n hasSshAccess,\n isUpstreamUrlValid,\n setUpstreamRemote,\n} from '@/src/utils/upstream';\nimport { validateProject } from '@/src/utils/workspace';\n\nexport interface ProjectPullOptions {\n projectPath: string;\n}\n\nexport type ProjectPullResult =\n | {\n success: true;\n variant: string;\n upstreamUrl: string;\n alreadyUpToDate: boolean;\n message: string;\n }\n | {\n success: false;\n variant: string;\n upstreamUrl: string;\n hasConflicts: true;\n conflictCount: number;\n conflicts: {\n path: string;\n conflicted?: string;\n base?: string;\n ours?: string;\n theirs?: string;\n }[];\n instructions: string;\n }\n | { success: false; reason: string };\n\nexport async function projectPull(\n options: ProjectPullOptions,\n): Promise<ProjectPullResult> {\n const { variant } = await validateProject();\n\n const gitClean = await isGitClean();\n\n if (!gitClean) {\n return {\n success: false,\n reason:\n 'Git working directory has uncommitted changes. Please commit or stash them before pulling upstream updates.',\n };\n }\n\n let currentUrl = await getUpstreamRemoteUrl();\n\n if (!currentUrl) {\n const useSsh = await hasSshAccess();\n const url = getUpstreamUrl(variant, useSsh);\n\n await setUpstreamRemote(url);\n currentUrl = url;\n } else if (!isUpstreamUrlValid(currentUrl, variant)) {\n const useSsh = currentUrl.startsWith('git@');\n const expectedUrl = getUpstreamUrl(variant, useSsh);\n\n return {\n success: false,\n reason:\n `Upstream remote points to \"${currentUrl}\" but expected \"${expectedUrl}\" for variant \"${variant}\". ` +\n 'Please ask the user whether to update the upstream URL, then run: git remote set-url upstream <correct-url>',\n };\n }\n\n await execaCommand('git fetch upstream');\n\n try {\n const { stdout } = await execaCommand(\n 'git merge upstream/main --no-edit',\n );\n\n const alreadyUpToDate = stdout.includes('Already up to date');\n\n return {\n success: true,\n variant,\n upstreamUrl: currentUrl,\n alreadyUpToDate,\n message: alreadyUpToDate\n ? 'Already up to date.'\n : 'Successfully merged upstream changes.',\n };\n } catch (mergeError) {\n const output = getErrorOutput(mergeError);\n const isConflict =\n output.includes('CONFLICT') ||\n output.includes('Automatic merge failed');\n\n if (!isConflict) {\n throw new Error(`Merge failed: ${output}`);\n }\n\n const { stdout: statusOutput } = await execaCommand(\n 'git diff --name-only --diff-filter=U',\n );\n\n const conflictPaths = statusOutput\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n const cwd = process.cwd();\n\n const conflicts = await Promise.all(\n conflictPaths.map(async (filePath) => {\n let conflicted: string | undefined;\n\n try {\n conflicted = await fs.readFile(join(cwd, filePath), 'utf-8');\n } catch {\n conflicted = undefined;\n }\n\n let base: string | undefined;\n let ours: string | undefined;\n let theirs: string | undefined;\n\n try {\n const { stdout: b } = await execa('git', [\n 'show',\n `:1:${filePath}`,\n ]);\n base = b;\n } catch {\n base = undefined;\n }\n\n try {\n const { stdout: o } = await execa('git', [\n 'show',\n `:2:${filePath}`,\n ]);\n ours = o;\n } catch {\n ours = undefined;\n }\n\n try {\n const { stdout: t } = await execa('git', [\n 'show',\n `:3:${filePath}`,\n ]);\n theirs = t;\n } catch {\n theirs = undefined;\n }\n\n return { path: filePath, conflicted, base, ours, theirs };\n }),\n );\n\n return {\n success: false,\n variant,\n upstreamUrl: currentUrl,\n hasConflicts: true,\n conflictCount: conflicts.length,\n conflicts,\n instructions:\n 'Merge conflicts detected. For each conflict: review base, ours (local), and theirs (upstream) versions. ' +\n 'Produce resolved content and call makerkit_project_resolve_conflicts. ' +\n 'Ask the user for guidance when the intent behind local changes is unclear.',\n };\n }\n}\n","import { dirname, join } from 'path';\n\nimport { execa, execaCommand } from 'execa';\nimport fs from 'fs-extra';\n\nexport interface ResolveConflictsOptions {\n projectPath: string;\n files: { path: string; content: string }[];\n commitMessage?: string;\n}\n\nexport type ResolveConflictsResult =\n | { success: true; resolved: string[]; message: string }\n | {\n success: false;\n resolved: string[];\n remaining: string[];\n message: string;\n };\n\nexport async function resolveConflicts(\n options: ResolveConflictsOptions,\n): Promise<ResolveConflictsResult> {\n const cwd = process.cwd();\n\n for (const file of options.files) {\n const targetPath = join(cwd, file.path);\n\n await fs.ensureDir(dirname(targetPath));\n await fs.writeFile(targetPath, file.content);\n }\n\n const paths = options.files.map((f) => f.path);\n\n await execa('git', ['add', ...paths]);\n\n let remainingConflicts: string[] = [];\n\n try {\n const { stdout } = await execaCommand(\n 'git diff --name-only --diff-filter=U',\n );\n\n remainingConflicts = stdout.trim().split('\\n').filter(Boolean);\n } catch {\n remainingConflicts = [];\n }\n\n if (remainingConflicts.length > 0) {\n return {\n success: false,\n resolved: paths,\n remaining: remainingConflicts,\n message: `${paths.length} file(s) resolved, but ${remainingConflicts.length} conflict(s) remain. Resolve the remaining files and call makerkit_project_resolve_conflicts again.`,\n };\n }\n\n if (options.commitMessage) {\n await execa('git', ['commit', '-m', options.commitMessage]);\n } else {\n await execaCommand('git commit --no-edit');\n }\n\n return {\n success: true,\n resolved: paths,\n message: 'All conflicts resolved and merge commit created.',\n };\n}\n","export async function withProjectDir<T>(\n projectPath: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const original = process.cwd();\n\n try {\n process.chdir(projectPath);\n return await fn();\n } finally {\n process.chdir(original);\n }\n}\n"],"mappings":"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","names":["join","fs","join","fs","join","fs","dirname","join","fs","execaCommand","join","fs","join","fs","join","fs","dirname","join","fs","join","fs","dirname","join","fs","join","fs","join","fs","join","fs","join","fs","config","execaCommand","join","fs","join","execa","execaCommand","fs","execaCommand","fs","join","execa","dirname","join","execa","execaCommand","fs"]}
|