{"version":3,"sources":["/home/pitok/Projects/framework-bun/packages/buntok-core/dist/cli/index.cjs","../../src/cli/commands/build.ts","../../src/cli/commands/check.ts","../../src/cli/commands/create.ts","../../src/cli/generators/controller.ts","../../src/cli/generators/repository.ts","../../src/cli/generators/service.ts","../../src/cli/commands/db.ts","../../src/cli/commands/init.ts","../../src/cli/commands/make-docs.ts","../../src/cli/index.ts"],"names":["join","existsSync"],"mappings":"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","file":"/home/pitok/Projects/framework-bun/packages/buntok-core/dist/cli/index.cjs","sourcesContent":[null,"import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport async function buildCommand() {\n\tconst projectRoot = process.cwd();\n\tconst entryPoint = join(projectRoot, \"server.ts\");\n\tconst outDir = join(projectRoot, \".buntok\");\n\n\tif (!existsSync(entryPoint)) {\n\t\tconsole.error(\"\\x1b[31m❌ server.ts not found\\x1b[0m\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Read user's package.json to know their dependencies\n\tlet userDeps: string[] = [];\n\tconst pkgPath = join(projectRoot, \"package.json\");\n\tif (existsSync(pkgPath)) {\n\t\tconst pkg = await Bun.file(pkgPath).json();\n\t\tuserDeps = [\n\t\t\t...Object.keys(pkg.dependencies || {}),\n\t\t\t...Object.keys(pkg.devDependencies || {}),\n\t\t];\n\t}\n\n\t// BunTok peer deps (optional, user installs these)\n\tconst peerDeps = [\n\t\t\"@apollo/server\",\n\t\t\"graphql\",\n\t\t\"graphql-yoga\",\n\t\t\"@opentelemetry/api\",\n\t\t\"@opentelemetry/sdk-node\",\n\t\t\"@opentelemetry/resources\",\n\t\t\"@opentelemetry/semantic-conventions\",\n\t\t\"@opentelemetry/sdk-trace-node\",\n\t\t\"@opentelemetry/exporter-trace-otlp-http\",\n\t\t\"ioredis\",\n\t\t\"bullmq\",\n\t\t\"amqplib\",\n\t];\n\n\tconst external = [...new Set([...peerDeps, ...userDeps])];\n\n\tconsole.log(\"\\x1b[36m🔨 Building project...\\x1b[0m\");\n\n\tconst result = await Bun.build({\n\t\tentrypoints: [entryPoint],\n\t\toutdir: outDir,\n\t\ttarget: \"bun\",\n\t\ttsconfig: join(projectRoot, \"tsconfig.json\"),\n\t\texternal,\n\t});\n\n\tif (!result.success) {\n\t\tconsole.error(\"\\x1b[31m❌ Build failed:\\x1b[0m\");\n\t\tfor (const log of result.logs) {\n\t\t\tconsole.error(log);\n\t\t}\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconsole.log(\"\\x1b[32m✅ Build successful → .buntok/server.js\\x1b[0m\");\n\tconsole.log(\"\\x1b[90m  Deploy: copy .buntok/ + node_modules/ + package.json to server\\x1b[0m\");\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport async function checkCommand(): Promise<void> {\n\tconst cwd = process.cwd();\n\tconst tsconfigPath = join(cwd, \"tsconfig.json\");\n\n\tif (!existsSync(tsconfigPath)) {\n\t\tconsole.error(\n\t\t\t\"\\x1b[31mError: tsconfig.json not found. Run `buntok init` first.\\x1b[0m\",\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconsole.log(\"\\x1b[36m  Running type check...\\x1b[0m\\n\");\n\n\tconst proc = Bun.spawnSync(\n\t\t[\"bunx\", \"tsc\", \"--noEmit\", \"--project\", tsconfigPath],\n\t\t{ cwd },\n\t);\n\n\tif (proc.exitCode === 0) {\n\t\tconsole.log(\"\\n\\x1b[32m  ✓ Type check passed\\x1b[0m\\n\");\n\t} else {\n\t\tconsole.log(\"\\n\\x1b[31m  ✗ Type check failed\\x1b[0m\\n\");\n\t}\n\n\tprocess.exitCode = proc.exitCode ?? 1;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { generateController } from \"../generators/controller.js\";\nimport { generateRepository } from \"../generators/repository.js\";\nimport { generateService } from \"../generators/service.js\";\n\ninterface CreateOptions {\n\trepo: boolean;\n\tservice: boolean;\n\tcontroller: boolean;\n\tall: boolean;\n\tdryRun: boolean;\n}\n\nfunction parseOptions(args: string[]): CreateOptions {\n\tconst options: CreateOptions = {\n\t\trepo: false,\n\t\tservice: false,\n\t\tcontroller: false,\n\t\tall: true,\n\t\tdryRun: false,\n\t};\n\n\tfor (const arg of args) {\n\t\tswitch (arg) {\n\t\t\tcase \"--repo\":\n\t\t\t\toptions.repo = true;\n\t\t\t\toptions.all = false;\n\t\t\t\tbreak;\n\t\t\tcase \"--service\":\n\t\t\t\toptions.service = true;\n\t\t\t\toptions.all = false;\n\t\t\t\tbreak;\n\t\t\tcase \"--controller\":\n\t\t\t\toptions.controller = true;\n\t\t\t\toptions.all = false;\n\t\t\t\tbreak;\n\t\t\tcase \"--dry-run\":\n\t\t\t\toptions.dryRun = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// If any specific option is set, don't generate all\n\tif (!options.all) {\n\t\treturn options;\n\t}\n\n\t// Generate all by default\n\treturn {\n\t\trepo: true,\n\t\tservice: true,\n\t\tcontroller: true,\n\t\tall: false,\n\t\tdryRun: options.dryRun,\n\t};\n}\n\nasync function ensureDirectories(_entityName: string) {\n\tconst dirs = [\"src/repositories\", \"src/services\", \"src/controllers\"];\n\n\tawait Promise.all(\n\t\tdirs.map(async (dir) => {\n\t\t\tif (!existsSync(dir)) {\n\t\t\t\tawait fs.mkdir(dir, { recursive: true });\n\t\t\t}\n\t\t}),\n\t);\n}\n\nfunction toPascalCase(str: string): string {\n\treturn str\n\t\t.split(/[-_]/)\n\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n\t\t.join(\"\");\n}\n\nexport async function createCommand(entityName: string, args: string[]) {\n\tconst options = parseOptions(args);\n\tconst pascalName = toPascalCase(entityName);\n\n\tconst prefix = options.dryRun ? \"\\x1b[33m[DRY RUN]\\x1b[0m \" : \"\";\n\tconsole.log(`\\n${prefix}\\x1b[36mCreating ${pascalName} entity...\\x1b[0m\\n`);\n\n\t// Ensure directories exist (skip in dry-run)\n\tif (!options.dryRun) {\n\t\tawait ensureDirectories(entityName);\n\t}\n\n\tconst results: string[] = [];\n\tconst generatedFiles: string[] = [];\n\tconst tasks: Promise<void>[] = [];\n\n\t// Helper to generate file asynchronously\n\tconst generateFile = async (\n\t\tpath: string,\n\t\tcontentGenerator: () => string,\n\t\ttype: string,\n\t) => {\n\t\tif (options.dryRun) {\n\t\t\tconst content = contentGenerator();\n\t\t\tresults.push(`[DRY RUN] ${type}: ${path}`);\n\t\t\tconsole.log(`\\n\\x1b[90m--- ${path} ---\\x1b[0m`);\n\t\t\tconsole.log(content);\n\t\t\tconsole.log(`\\x1b[90m--- end ---\\x1b[0m\\n`);\n\t\t\treturn;\n\t\t}\n\t\tif (!existsSync(path)) {\n\t\t\tawait fs.writeFile(path, contentGenerator());\n\t\t\tresults.push(`✓ ${type}: ${path}`);\n\t\t\tgeneratedFiles.push(path);\n\t\t} else {\n\t\t\tresults.push(`• ${type}: ${path} (already exists)`);\n\t\t}\n\t};\n\n\tif (options.repo) {\n\t\ttasks.push(\n\t\t\tgenerateFile(\n\t\t\t\tjoin(\"src/repositories\", `${entityName}.repository.ts`),\n\t\t\t\t() => generateRepository(entityName, pascalName),\n\t\t\t\t\"Repository\",\n\t\t\t),\n\t\t);\n\t}\n\n\tif (options.service) {\n\t\ttasks.push(\n\t\t\tgenerateFile(\n\t\t\t\tjoin(\"src/services\", `${entityName}.service.ts`),\n\t\t\t\t() => generateService(entityName, pascalName, options.repo),\n\t\t\t\t\"Service\",\n\t\t\t),\n\t\t);\n\t}\n\n\tif (options.controller) {\n\t\ttasks.push(\n\t\t\tgenerateFile(\n\t\t\t\tjoin(\"src/controllers\", `${entityName}.controller.ts`),\n\t\t\t\t() => generateController(entityName, pascalName, options.service),\n\t\t\t\t\"Controller\",\n\t\t\t),\n\t\t);\n\t}\n\n\t// Execute all file generations concurrently\n\tawait Promise.all(tasks);\n\n\t// Auto-format generated files with Biome if available (skip in dry-run)\n\tif (generatedFiles.length > 0 && !options.dryRun) {\n\t\tconst biomeProc = Bun.spawnSync(\n\t\t\t[\"bunx\", \"biome\", \"format\", \"--write\", ...generatedFiles],\n\t\t\t{\n\t\t\t\tstdio: [\"ignore\", \"ignore\", \"ignore\"],\n\t\t\t},\n\t\t);\n\t\tif (biomeProc.exitCode === 0) {\n\t\t\tconsole.log(\n\t\t\t\t\"\\x1b[90m✨ Auto-formatted generated files with Biome\\x1b[0m\\n\",\n\t\t\t);\n\t\t}\n\t}\n\n\t// Auto-register in src/index.ts (skip in dry-run)\n\tconst indexPath = join(\"src\", \"index.ts\");\n\tif (existsSync(indexPath) && !options.dryRun) {\n\t\tconst indexContent = readFileSync(indexPath, \"utf-8\");\n\n\t\t// Build imports\n\t\tconst imports: string[] = [];\n\t\tconst instantiations: string[] = [];\n\n\t\t// Only register repo + service if full chain (they're needed by controller)\n\t\tif (options.repo && options.service) {\n\t\t\timports.push(`import { ${pascalName}Repository } from \"@/repositories/${entityName}.repository\";`);\n\t\t\tinstantiations.push(`const ${entityName}Repository = new ${pascalName}Repository();`);\n\t\t}\n\n\t\tif (options.service) {\n\t\t\tconst repoArg = options.repo ? `(${entityName}Repository)` : \"\";\n\t\t\tinstantiations.push(`const ${entityName}Service = new ${pascalName}Service${repoArg};`);\n\t\t\tif (!options.repo) {\n\t\t\t\timports.push(`import { ${pascalName}Service } from \"@/services/${entityName}.service\";`);\n\t\t\t}\n\t\t}\n\n\t\t// Always register controller\n\t\t{\n\t\t\timports.push(`import { ${pascalName}Controller } from \"@/controllers/${entityName}.controller\";`);\n\t\t\tconst serviceArg = options.service ? `(${entityName}Service)` : \"\";\n\t\t\tinstantiations.push(`app.registerController(new ${pascalName}Controller${serviceArg});`);\n\t\t}\n\n\t\tconst importBlock = imports.join(\"\\n\");\n\t\tconst instantiationBlock = instantiations.join(\"\\n\");\n\n\t\tif (!indexContent.includes(importBlock)) {\n\t\t\tconst lines = indexContent.split(\"\\n\");\n\n\t\t\t// Find the last import line and insert after it\n\t\t\tlet lastImportIndex = -1;\n\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\tif (lines[i]?.startsWith(\"import \")) {\n\t\t\t\t\tlastImportIndex = i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (lastImportIndex !== -1) {\n\t\t\t\tlines.splice(lastImportIndex + 1, 0, importBlock);\n\t\t\t} else {\n\t\t\t\tlines.unshift(importBlock);\n\t\t\t}\n\n\t\t\t// Find app.registerController or app.listen and insert before it\n\t\t\tconst content = lines.join(\"\\n\");\n\t\t\tconst updatedContent = content.replace(\n\t\t\t\t/(app\\.(registerController|listen)\\s*\\()/,\n\t\t\t\t`${instantiationBlock}\\n\\n$1`,\n\t\t\t);\n\n\t\t\tawait fs.writeFile(indexPath, updatedContent);\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[32m✔ Registered ${pascalName} in src/index.ts\\x1b[0m`,\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[90m• src/index.ts: ${pascalName} already registered\\x1b[0m`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Print results\n\tconsole.log(options.dryRun ? \"\\x1b[33mWould generate:\\x1b[0m\" : \"\\x1b[32mGenerated files:\\x1b[0m\");\n\tfor (const result of results.sort()) {\n\t\tconsole.log(`  ${result}`);\n\t}\n\n\tif (options.dryRun) {\n\t\tconsole.log(`\\n\\x1b[33mRun without --dry-run to create these files.\\x1b[0m\\n`);\n\t} else {\n\t\tconsole.log(`\n\\x1b[36mNext steps:\\x1b[0m\n  1. Start dev server: \\x1b[33mbun run dev\\x1b[0m\n`);\n\t}\n}\n","export function generateController(\n\tentityName: string,\n\tpascalName: string,\n\twithService: boolean = true,\n): string {\n\tif (withService) {\n\t\treturn `import { Controller, BaseController } from \"@buntok/core\";\nimport { ${pascalName}Service } from \"@/services/${entityName}.service\";\n\n@Controller(\"/${entityName}s\")\nexport class ${pascalName}Controller extends BaseController<${pascalName}> {\n  constructor(private readonly ${entityName}Service: ${pascalName}Service) {\n    super(${entityName}Service);\n  }\n}\n`;\n\t}\n\n\treturn `import { Controller, Get, Post, Put, Delete } from \"@buntok/core\";\nimport type { Context } from \"@buntok/core\";\n\n@Controller(\"/${entityName}s\")\nexport class ${pascalName}Controller {\n  @Get(\"/\")\n  async getAll(ctx: Context) {\n    return ctx.success([], \"Records retrieved successfully\");\n  }\n\n  @Get(\"/:id\")\n  async getById(ctx: Context) {\n    return ctx.success({ id: ctx.params.id }, \"Record retrieved successfully\");\n  }\n\n  @Post(\"/\")\n  async create(ctx: Context) {\n    const data = await ctx.body<any>();\n    return ctx.success(data, \"Record created successfully\", 201);\n  }\n\n  @Put(\"/:id\")\n  async update(ctx: Context) {\n    const data = await ctx.body<any>();\n    return ctx.success({ id: ctx.params.id, ...data }, \"Record updated successfully\");\n  }\n\n  @Delete(\"/:id\")\n  async delete(ctx: Context) {\n    return ctx.success(null, \"Record deleted successfully\");\n  }\n}\n`;\n}\n","export function generateRepository(\n\tentityName: string,\n\tpascalName: string,\n): string {\n\treturn `import { BaseRepository } from \"@buntok/prisma\";\n// Replace with your own Prisma client instance\nimport { prisma } from \"@/lib/prisma\";\nimport type { ${pascalName}, PrismaClient, Prisma } from \"@prisma/client\";\n\nexport class ${pascalName}Repository extends BaseRepository<\n  ${pascalName},\n  PrismaClient,\n  Prisma.${pascalName}CreateInput,\n  Prisma.${pascalName}UpdateInput\n> {\n  constructor() {\n    super(prisma, \"${entityName}\");\n  }\n}\n`;\n}\n","export function generateService(\n\tentityName: string,\n\tpascalName: string,\n\twithRepo: boolean = true,\n): string {\n\tif (withRepo) {\n\t\treturn `import { BaseService } from \"@buntok/core\";\nimport { ${pascalName}Repository } from \"@/repositories/${entityName}.repository\";\nimport type { ${pascalName} } from \"@prisma/client\";\n\nexport class ${pascalName}Service extends BaseService<${pascalName}> {\n  constructor(private readonly ${entityName}Repository: ${pascalName}Repository) {\n    super(${entityName}Repository);\n  }\n}\n`;\n\t}\n\n\treturn `export class ${pascalName}Service {\n  async getAll(): Promise<any[]> {\n    return [];\n  }\n\n  async getById(id: string): Promise<any> {\n    return { id };\n  }\n\n  async create(data: any): Promise<any> {\n    return data;\n  }\n\n  async update(id: string, data: any): Promise<any> {\n    return { id, ...data };\n  }\n\n  async delete(id: string): Promise<boolean> {\n    return true;\n  }\n}\n`;\n}\n","import { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\n\ntype DbCommand = \"migrate\" | \"seed\" | \"reset\" | \"generate\" | \"studio\" | \"status\";\n\nfunction detectOrm(): \"prisma\" | \"drizzle\" | \"typeorm\" | null {\n\t// Check for Prisma\n\tif (existsSync(\"prisma/schema.prisma\") || existsSync(\"prisma/schema.ts\")) {\n\t\treturn \"prisma\";\n\t}\n\n\t// Check for Drizzle\n\tif (existsSync(\"drizzle.config.ts\") || existsSync(\"drizzle.config.js\")) {\n\t\treturn \"drizzle\";\n\t}\n\n\t// Check for TypeORM\n\tif (existsSync(\"ormconfig.json\") || existsSync(\"ormconfig.ts\") || existsSync(\"ormconfig.js\")) {\n\t\treturn \"typeorm\";\n\t}\n\n\t// Check package.json dependencies\n\tif (existsSync(\"package.json\")) {\n\t\tconst pkg = JSON.parse(readFileSync(\"package.json\", \"utf-8\"));\n\t\tconst allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n\t\tif (allDeps[\"@prisma/client\"] || allDeps[\"prisma\"]) return \"prisma\";\n\t\tif (allDeps[\"drizzle-orm\"] || allDeps[\"drizzle-kit\"]) return \"drizzle\";\n\t\tif (allDeps[\"typeorm\"]) return \"typeorm\";\n\t}\n\n\treturn null;\n}\n\nfunction runCommand(cmd: string): void {\n\tconsole.log(`\\x1b[90m$ ${cmd}\\x1b[0m`);\n\ttry {\n\t\texecSync(cmd, { stdio: \"inherit\", cwd: process.cwd() });\n\t} catch {\n\t\t// Command already printed its error\n\t\tprocess.exitCode = 1;\n\t}\n}\n\nfunction prismaCommand(subcommand: string, args: string[]): void {\n\tconst cmd = `npx prisma ${subcommand} ${args.join(\" \")}`.trim();\n\trunCommand(cmd);\n}\n\nfunction drizzleCommand(subcommand: string, args: string[]): void {\n\tconst commands: Record<string, string> = {\n\t\tmigrate: \"drizzle-kit generate\",\n\t\tseed: \"drizzle-kit seed\",\n\t\treset: \"drizzle-kit drop\",\n\t\tstatus: \"drizzle-kit check\",\n\t\tgenerate: \"drizzle-kit generate\",\n\t\tstudio: \"drizzle-kit studio\",\n\t};\n\tconst cmd = `${commands[subcommand] ?? subcommand} ${args.join(\" \")}`.trim();\n\trunCommand(cmd);\n}\n\nfunction typeormCommand(subcommand: string, args: string[]): void {\n\tconst commands: Record<string, string> = {\n\t\tmigrate: \"typeorm migration:run\",\n\t\tseed: \"typeorm seed\",\n\t\treset: \"typeorm migration:revert\",\n\t\tgenerate: \"typeorm migration:generate\",\n\t\tstatus: \"typeorm migration:show\",\n\t\tstudio: \"echo 'TypeORM does not have a built-in studio command'\",\n\t};\n\tconst cmd = `${commands[subcommand] ?? subcommand} ${args.join(\" \")}`.trim();\n\trunCommand(cmd);\n}\n\nfunction printUsage(): void {\n\tconsole.log(`\n\\x1b[36mUsage:\\x1b[0m\n  buntok db <command> [args]\n\n\\x1b[36mCommands:\\x1b[0m\n  migrate [name]      Run pending migrations\n  seed                Seed database\n  reset               Reset database (drop & recreate)\n  generate            Generate migration from schema changes\n  studio              Open database GUI\n  status              Show migration status\n\n\\x1b[36mSupported ORMs:\\x1b[0m\n  Prisma, Drizzle, TypeORM (auto-detected)\n\n\\x1b[36mExamples:\\x1b[0m\n  buntok db migrate                    # Run pending migrations\n  buntok db migrate add user_table     # Create new migration\n  buntok db seed                       # Seed database\n  buntok db studio                     # Open Prisma Studio / etc\n`);\n}\n\nexport async function dbCommand(args: string[]): Promise<void> {\n\tconst subcommand = args[0] as DbCommand | undefined;\n\n\tif (!subcommand) {\n\t\tprintUsage();\n\t\treturn;\n\t}\n\n\tconst validCommands: DbCommand[] = [\"migrate\", \"seed\", \"reset\", \"generate\", \"studio\", \"status\"];\n\tif (!validCommands.includes(subcommand)) {\n\t\tconsole.error(`\\x1b[31mUnknown command: ${subcommand}\\x1b[0m`);\n\t\tprintUsage();\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst orm = detectOrm();\n\tif (!orm) {\n\t\tconsole.error(\"\\x1b[31mCould not detect ORM.\\x1b[0m\");\n\t\tconsole.error(\"Supported: Prisma, Drizzle, TypeORM\");\n\t\tconsole.error(\"Make sure you have one installed in package.json.\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconsole.log(`\\x1b[36mDetected ORM: ${orm}\\x1b[0m`);\n\n\tconst subArgs = args.slice(1);\n\tswitch (orm) {\n\t\tcase \"prisma\":\n\t\t\tprismaCommand(subcommand, subArgs);\n\t\t\tbreak;\n\t\tcase \"drizzle\":\n\t\t\tdrizzleCommand(subcommand, subArgs);\n\t\t\tbreak;\n\t\tcase \"typeorm\":\n\t\t\ttypeormCommand(subcommand, subArgs);\n\t\t\tbreak;\n\t}\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\n\nconst __dirname = import.meta.dir;\n\nfunction askQuestion(question: string, defaultValue = true): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createInterface({\n\t\t\tinput: process.stdin,\n\t\t\toutput: process.stdout,\n\t\t});\n\n\t\trl.question(question, (answer) => {\n\t\t\trl.close();\n\t\t\tconst normalized = answer.trim().toLowerCase();\n\t\t\tif (normalized === \"\") return resolve(defaultValue);\n\t\t\tresolve(normalized === \"y\" || normalized === \"yes\");\n\t\t});\n\t});\n}\n\nconst REQUIRED_SCRIPTS: Record<string, string> = {\n\tdev: \"bun --watch server.ts\",\n\tbuild: \"bunx buntok build\",\n\tstart: \"bun .buntok/server.js\",\n\tcheck: \"bunx @biomejs/biome check --write .\",\n\tformat: \"bunx @biomejs/biome format --write .\",\n\tlint: \"bunx @biomejs/biome lint .\",\n};\n\nconst BIOME_CONFIG = {\n\tvcs: {\n\t\tenabled: true,\n\t\tclientKind: \"git\",\n\t\tuseIgnoreFile: true,\n\t},\n\tfiles: {\n\t\tignoreUnknown: true,\n\t\tincludes: [\"**\", \"!**/node_modules\", \"!**/dist\", \"!**/.buntok\", \"!**/coverage\"],\n\t},\n\tformatter: {\n\t\tenabled: true,\n\t\tindentStyle: \"tab\",\n\t\tindentWidth: 2,\n\t\tlineWidth: 100,\n\t\tlineEnding: \"lf\",\n\t},\n\tlinter: {\n\t\tenabled: true,\n\t\trules: {\n\t\t\tpreset: \"recommended\",\n\t\t\tsuspicious: {\n\t\t\t\tnoExplicitAny: \"off\",\n\t\t\t},\n\t\t},\n\t},\n\tjavascript: {\n\t\tformatter: {\n\t\t\tquoteStyle: \"double\",\n\t\t\ttrailingCommas: \"all\",\n\t\t},\n\t},\n};\n\n\nconst TSCONFIG_TEMPLATE = {\n\tcompilerOptions: {\n\t\t// Environment setup & latest features\n\t\tlib: [\"ESNext\"],\n\t\ttarget: \"ESNext\",\n\t\tmodule: \"Preserve\",\n\t\tmoduleDetection: \"force\",\n\t\tjsx: \"react-jsx\",\n\t\tallowJs: true,\n\t\ttypes: [\"bun\", \"node\"],\n\n\t\t// Bundler mode\n\t\tmoduleResolution: \"bundler\",\n\t\tallowImportingTsExtensions: true,\n\t\tverbatimModuleSyntax: true,\n\t\tnoEmit: true,\n\n\t\t// Strictness Options for TS 7+\n\t\tstrict: true,\n\t\tnoUncheckedIndexedAccess: true,\n\t\texactOptionalPropertyTypes: true,\n\t\tnoImplicitOverride: true,\n\t\tnoFallthroughCasesInSwitch: true,\n\t\tisolatedModules: true,\n\t\tskipLibCheck: true,\n\n\t\t// Path alias\n\t\tpaths: {\n\t\t\t\"@/*\": [\"./src/*\"],\n\t\t},\n\t},\n\tinclude: [\"src/**/*\"],\n\texclude: [\"node_modules\", \".buntok\"],\n};\n\nconst VSCODE_SETTINGS = {\n\t\"editor.formatOnSave\": true,\n\t\"editor.defaultFormatter\": \"biomejs.biome\",\n\t\"editor.codeActionsOnSave\": {\n\t\t\"source.fixAll.biome\": \"explicit\",\n\t\t\"source.organizeImports.biome\": \"explicit\",\n\t},\n};\n\nconst INDEX_TEMPLATE = `import { App } from \"@buntok/core\";\n\nexport const app = new App();\n\napp.get(\"/\", (ctx) => {\n  return ctx.json({ message: \"Hello from Buntok!\" });\n});\n\nexport default app;\n`;\n\nconst ENV_TS_TEMPLATE = `import { App, z } from \"@buntok/core\";\n\nexport const env = App.validateEnv({\n\tPORT: z.coerce.number().default(1212),\n\tAUTH_STORE: z.enum([\"header\", \"cookie\"]).default(\"header\"),\n\tAUTH_COOKIE: z.string().default(\"session\"),\n\tNODE_ENV: z.enum([\"development\", \"production\", \"test\"]).default(\"development\"),\n});\n`;\n\nfunction findSkillMdSource(): string | null {\n\t// 1. Relative path (works when running from @buntok/core package)\n\tconst relativePath = join(\n\t\t__dirname,\n\t\t\"..\",\n\t\t\"..\",\n\t\t\"scripts\",\n\t\t\"buntok-skill\",\n\t\t\"SKILL.md\",\n\t);\n\tif (existsSync(relativePath)) return relativePath;\n\n\t// 2. Resolve from @buntok/core package (works when running from buntok CLI)\n\ttry {\n\t\t// biome-ignore lint: dynamic import for package resolution\n\t\tconst pkgJson = require.resolve(\"@buntok/core/package.json\");\n\t\tconst pkgDir = dirname(pkgJson);\n\t\tconst skillPath = join(pkgDir, \"scripts\", \"buntok-skill\", \"SKILL.md\");\n\t\tif (existsSync(skillPath)) return skillPath;\n\t} catch {\n\t\t// package not found\n\t}\n\n\treturn null;\n}\n\nfunction copySkillMd(projectRoot: string): boolean {\n\tconst sourceSkill = findSkillMdSource();\n\n\tif (!sourceSkill) {\n\t\tconsole.warn(\n\t\t\t\"\\x1b[33m⚠ SKILL.md not found in @buntok/core, skipping.\\x1b[0m\",\n\t\t);\n\t\treturn false;\n\t}\n\n\tconst skillDir = join(projectRoot, \".agents\", \"skills\", \"buntok-skill\");\n\tconst destSkill = join(skillDir, \"SKILL.md\");\n\n\tif (!existsSync(skillDir)) {\n\t\tmkdirSync(skillDir, { recursive: true });\n\t}\n\n\twriteFileSync(destSkill, readFileSync(sourceSkill, \"utf-8\"), \"utf-8\");\n\tconsole.log(`\\x1b[32m✓ Created\\x1b[0m .agents/skills/buntok-skill/SKILL.md`);\n\treturn true;\n}\n\nfunction updatePackageJson(projectRoot: string): boolean {\n\tconst pkgPath = join(projectRoot, \"package.json\");\n\n\tlet pkg: { name?: string; scripts?: Record<string, string>; devDependencies?: Record<string, string> };\n\tif (existsSync(pkgPath)) {\n\t\tpkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\t} else {\n\t\tconst folderName = projectRoot.split(\"/\").pop() || \"my-app\";\n\t\tpkg = { name: folderName, scripts: {}, devDependencies: {} };\n\t}\n\n\tif (!pkg.scripts) pkg.scripts = {};\n\n\tlet added = 0;\n\tfor (const [key, value] of Object.entries(REQUIRED_SCRIPTS)) {\n\t\tif (!pkg.scripts[key]) {\n\t\t\tpkg.scripts[key] = value;\n\t\t\tadded++;\n\t\t}\n\t}\n\n\tif (added === 0) {\n\t\tconsole.log(\"\\x1b[90m• package.json: all scripts already present\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\twriteFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\", \"utf-8\");\n\tconsole.log(`\\x1b[32m✓ Updated\\x1b[0m package.json (added ${added} scripts)`);\n\treturn true;\n}\n\nfunction stripJsonComments(text: string): string {\n\t// Remove single-line comments (// ...) but not inside strings\n\treturn text.replace(/(?<![\"':].*)\\/\\/.*$/gm, \"\");\n}\n\nfunction setupTsconfig(projectRoot: string): boolean {\n\tconst tsconfigPath = join(projectRoot, \"tsconfig.json\");\n\n\tif (existsSync(tsconfigPath)) {\n\t\t// Merge paths into existing tsconfig\n\t\tconst raw = readFileSync(tsconfigPath, \"utf-8\");\n\t\tconst existing = JSON.parse(stripJsonComments(raw));\n\t\tif (!existing.compilerOptions) existing.compilerOptions = {};\n\t\tif (!existing.compilerOptions.paths) {\n\t\t\texisting.compilerOptions.paths = { \"@/*\": [\"./src/*\"] };\n\t\t\twriteFileSync(tsconfigPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n\t\t\tconsole.log(\"\\x1b[32m✓ Updated\\x1b[0m tsconfig.json (added path alias)\");\n\t\t\treturn true;\n\t\t}\n\t\tif (!existing.compilerOptions.paths[\"@/*\"]) {\n\t\t\texisting.compilerOptions.paths[\"@/*\"] = [\"./src/*\"];\n\t\t\twriteFileSync(tsconfigPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n\t\t\tconsole.log(\"\\x1b[32m✓ Updated\\x1b[0m tsconfig.json (added path alias)\");\n\t\t\treturn true;\n\t\t}\n\t\tconsole.log(\"\\x1b[90m• tsconfig.json: path alias already present\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\t// Create new tsconfig\n\twriteFileSync(tsconfigPath, JSON.stringify(TSCONFIG_TEMPLATE, null, 2) + \"\\n\", \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m tsconfig.json\");\n\treturn true;\n}\n\nfunction setupBiome(projectRoot: string): boolean {\n\tconst biomePath = join(projectRoot, \"biome.json\");\n\n\tif (existsSync(biomePath)) {\n\t\tconsole.log(\"\\x1b[90m• biome.json: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\t// Check if @biomejs/biome is installed\n\tconst pkgPath = join(projectRoot, \"package.json\");\n\tlet needsInstall = false;\n\tif (existsSync(pkgPath)) {\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\t\tconst allDeps = {\n\t\t\t...pkg.dependencies,\n\t\t\t...pkg.devDependencies,\n\t\t};\n\t\tneedsInstall = !allDeps[\"@biomejs/biome\"];\n\t}\n\n\tif (needsInstall) {\n\t\tconsole.log(\"\\x1b[90m• Installing @biomejs/biome...\\x1b[0m\");\n\t\ttry {\n\t\t\texecSync(\"bun add -d @biomejs/biome\", {\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tstdio: \"ignore\",\n\t\t\t});\n\t\t\tconsole.log(\"\\x1b[32m✓ Installed\\x1b[0m @biomejs/biome\");\n\t\t} catch {\n\t\t\tconsole.warn(\n\t\t\t\t\"\\x1b[33m⚠ Failed to install @biomejs/biome, please install manually\\x1b[0m\",\n\t\t\t);\n\t\t}\n\t}\n\n\twriteFileSync(biomePath, JSON.stringify(BIOME_CONFIG, null, 2) + \"\\n\", \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m biome.json\");\n\treturn true;\n}\n\nfunction createIndexFile(projectRoot: string): boolean {\n\tconst srcDir = join(projectRoot, \"src\");\n\tconst indexPath = join(srcDir, \"index.ts\");\n\n\tif (existsSync(indexPath)) {\n\t\tconsole.log(\"\\x1b[90m• src/index.ts: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\tif (!existsSync(srcDir)) {\n\t\tmkdirSync(srcDir, { recursive: true });\n\t}\n\n\twriteFileSync(indexPath, INDEX_TEMPLATE, \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m src/index.ts\");\n\treturn true;\n}\n\nfunction createEnvTsFile(projectRoot: string): boolean {\n\tconst srcDir = join(projectRoot, \"src\");\n\tconst envTsPath = join(srcDir, \"env.ts\");\n\n\tif (existsSync(envTsPath)) {\n\t\tconsole.log(\"\\x1b[90m• src/env.ts: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\tif (!existsSync(srcDir)) {\n\t\tmkdirSync(srcDir, { recursive: true });\n\t}\n\n\twriteFileSync(envTsPath, ENV_TS_TEMPLATE, \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m src/env.ts\");\n\treturn true;\n}\n\nfunction setupVscode(projectRoot: string): boolean {\n\tconst vscodeDir = join(projectRoot, \".vscode\");\n\tconst settingsPath = join(vscodeDir, \"settings.json\");\n\n\tif (existsSync(settingsPath)) {\n\t\tconsole.log(\"\\x1b[90m• .vscode/settings.json: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\tif (!existsSync(vscodeDir)) {\n\t\tmkdirSync(vscodeDir, { recursive: true });\n\t}\n\n\twriteFileSync(settingsPath, JSON.stringify(VSCODE_SETTINGS, null, 2) + \"\\n\", \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m .vscode/settings.json\");\n\treturn true;\n}\n\nconst ENV_CONTENT = `# Buntok Configuration\nPORT=1212\nAUTH_STORE=header\nAUTH_COOKIE=session\n`;\n\nconst ENV_EXAMPLE_CONTENT = `# Buntok Configuration\n#\n# PORT: port is using for the app\n# AUTH_STORE: Where to store/read JWT tokens\n#   - \"header\" (default): Read from Authorization: Bearer <token> header\n#   - \"cookie\": Read from HttpOnly cookie (set AUTH_COOKIE for cookie name)\n#\n# AUTH_COOKIE: Cookie name for JWT storage (only used when AUTH_STORE=cookie)\n#\nPORT=1212\nAUTH_STORE=header\nAUTH_COOKIE=session\n`;\n\nconst VERCEL_JSON_TEMPLATE = {\n\t$schema: \"https://openapi.vercel.sh/vercel.json\",\n\tframework: \"bun\",\n\tbunVersion: \"1.4.x\",\n};\n\nconst SERVER_TS_TEMPLATE = `import { app } from \"./src/index\";\nimport { env } from \"./src/env\";\n\napp.listen(env.PORT);\n`;\n\nconst GITIGNORE_CONTENT = `# Dependencies\nnode_modules/\n\n# Build output\n.buntok/\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.vscode/\n.idea/\n*.swp\n*.swo\n*~\n\n# OS\n.DS_Store\nThumbs.db\n\n# Buntok\n.buntok/\n\n# Logs\n*.log\nnpm-debug.log*\n\n# Coverage\ncoverage/\n`;\n\nconst DOCKERFILE_TEMPLATE = `# Builder\nFROM oven/bun:1-alpine AS builder\nWORKDIR /app\n\nCOPY package.json bun.lock* ./\nRUN bun install --frozen-lockfile --production\n\nCOPY src/ src/\nCOPY server.ts ./\nCOPY tsconfig.json ./\nCOPY package.json ./\n\nRUN bunx buntok build\n\n# Production\nFROM oven/bun:1-alpine\nWORKDIR /app\n\nCOPY --from=builder /app/.buntok .buntok\nCOPY --from=builder /app/node_modules node_modules\nCOPY --from=builder /app/package.json ./\n\nEXPOSE 1212\n\nENV NODE_ENV=production\nENV PORT=1212\n\nCMD [\"bun\", \".buntok/server.js\"]\n`;\n\nconst DOCKERIGNORE_CONTENT = `node_modules\ndist\n.buntok\n*.log\n.env\n.env.*\ncoverage\n`;\n\nfunction createEnvFiles(projectRoot: string): boolean {\n\tconst envPath = join(projectRoot, \".env\");\n\tconst envExamplePath = join(projectRoot, \".env.example\");\n\tlet created = false;\n\n\tif (!existsSync(envPath)) {\n\t\twriteFileSync(envPath, ENV_CONTENT, \"utf-8\");\n\t\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m .env\");\n\t\tcreated = true;\n\t} else {\n\t\tconsole.log(\"\\x1b[90m• .env: already exists, skipping\\x1b[0m\");\n\t}\n\n\tif (!existsSync(envExamplePath)) {\n\t\twriteFileSync(envExamplePath, ENV_EXAMPLE_CONTENT, \"utf-8\");\n\t\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m .env.example\");\n\t\tcreated = true;\n\t} else {\n\t\tconsole.log(\"\\x1b[90m• .env.example: already exists, skipping\\x1b[0m\");\n\t}\n\n\treturn created;\n}\n\nfunction createGitignore(projectRoot: string): boolean {\n\tconst gitignorePath = join(projectRoot, \".gitignore\");\n\n\tif (existsSync(gitignorePath)) {\n\t\tconsole.log(\"\\x1b[90m• .gitignore: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\twriteFileSync(gitignorePath, GITIGNORE_CONTENT, \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m .gitignore\");\n\treturn true;\n}\n\nfunction createVercelJson(projectRoot: string): boolean {\n\tconst vercelPath = join(projectRoot, \"vercel.json\");\n\n\tif (existsSync(vercelPath)) {\n\t\tconsole.log(\"\\x1b[90m• vercel.json: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\twriteFileSync(vercelPath, JSON.stringify(VERCEL_JSON_TEMPLATE, null, 2) + \"\\n\", \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m vercel.json\");\n\n\t// Create empty public/ directory (Vercel requires it for static files)\n\tconst publicDir = join(projectRoot, \"public\");\n\tif (!existsSync(publicDir)) {\n\t\tmkdirSync(publicDir, { recursive: true });\n\t\twriteFileSync(join(publicDir, \".gitkeep\"), \"\");\n\t}\n\n\treturn true;\n}\n\nfunction createServerTsFile(projectRoot: string): boolean {\n\tconst serverPath = join(projectRoot, \"server.ts\");\n\n\tif (existsSync(serverPath)) {\n\t\tconsole.log(\"\\x1b[90m• server.ts: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\twriteFileSync(serverPath, SERVER_TS_TEMPLATE, \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m server.ts\");\n\treturn true;\n}\n\nfunction updateDevScript(projectRoot: string): boolean {\n\tconst pkgPath = join(projectRoot, \"package.json\");\n\tif (!existsSync(pkgPath)) return false;\n\n\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\tif (!pkg.scripts) return false;\n\n\tif (pkg.scripts.dev === \"bun --watch src/index.ts\") {\n\t\tpkg.scripts.dev = \"bun --watch server.ts\";\n\t\twriteFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\", \"utf-8\");\n\t\tconsole.log(\"\\x1b[32m✓ Updated\\x1b[0m package.json (dev → server.ts)\");\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction createDockerfile(projectRoot: string): boolean {\n\tconst dockerfilePath = join(projectRoot, \"Dockerfile\");\n\tconst dockerignorePath = join(projectRoot, \".dockerignore\");\n\n\tlet created = false;\n\n\tif (!existsSync(dockerfilePath)) {\n\t\twriteFileSync(dockerfilePath, DOCKERFILE_TEMPLATE, \"utf-8\");\n\t\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m Dockerfile\");\n\t\tcreated = true;\n\t} else {\n\t\tconsole.log(\"\\x1b[90m• Dockerfile: already exists, skipping\\x1b[0m\");\n\t}\n\n\tif (!existsSync(dockerignorePath)) {\n\t\twriteFileSync(dockerignorePath, DOCKERIGNORE_CONTENT, \"utf-8\");\n\t\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m .dockerignore\");\n\t\tcreated = true;\n\t} else {\n\t\tconsole.log(\"\\x1b[90m• .dockerignore: already exists, skipping\\x1b[0m\");\n\t}\n\n\treturn created;\n}\n\nexport async function initCommand() {\n\tconst projectRoot = process.cwd();\n\n\tcopySkillMd(projectRoot);\n\tupdatePackageJson(projectRoot);\n\tsetupTsconfig(projectRoot);\n\tsetupBiome(projectRoot);\n\tsetupVscode(projectRoot);\n\tcreateEnvTsFile(projectRoot);\n\tcreateIndexFile(projectRoot);\n\tcreateEnvFiles(projectRoot);\n\tcreateGitignore(projectRoot);\n\tupdateDevScript(projectRoot);\n\n\tconst vercelPath = join(projectRoot, \"vercel.json\");\n\tif (!existsSync(vercelPath)) {\n\t\tconsole.log(\"\");\n\t\tconst useVercel = await askQuestion(\n\t\t\t\"\\x1b[36mDo you want to deploy to Vercel? (y/N): \\x1b[0m\",\n\t\t\tfalse,\n\t\t);\n\t\tif (useVercel) {\n\t\t\tcreateVercelJson(projectRoot);\n\t\t}\n\t} else {\n\t\tconsole.log(\"\\x1b[90m• vercel.json: already exists, skipping\\x1b[0m\");\n\t}\n\n\tcreateServerTsFile(projectRoot);\n\n\tconst dockerfilePath = join(projectRoot, \"Dockerfile\");\n\tif (!existsSync(dockerfilePath)) {\n\t\tconsole.log(\"\");\n\t\tconst useDocker = await askQuestion(\n\t\t\t\"\\x1b[36mDo you want to add Docker support? (Y/n): \\x1b[0m\",\n\t\t\ttrue,\n\t\t);\n\t\tif (useDocker) {\n\t\t\tcreateDockerfile(projectRoot);\n\t\t}\n\t} else {\n\t\tconsole.log(\"\\x1b[90m• Dockerfile: already exists, skipping\\x1b[0m\");\n\t}\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { generateOpenApiDocument } from \"../../helpers/openapi\";\n\nexport async function makeDocsCommand() {\n\tconsole.log(\"\\x1b[36mGenerating OpenAPI documentation...\\x1b[0m\");\n\n\t// Prevent the user's app from starting its HTTP server during import\n\tprocess.env.BUNTOK_DOCS_BUILD = \"1\";\n\n\tconst entryPath = resolve(process.cwd(), \"src/index.ts\");\n\n\ttry {\n\t\tconsole.log(`\\x1b[90mLoading app from ${entryPath}...\\x1b[0m`);\n\n\t\tconst userApp = await import(entryPath);\n\t\tconst appInstance = userApp.app || userApp.default;\n\n\t\tif (!appInstance?.openApiDocs) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Could not find an exported 'app' instance in src/index.ts. Make sure you export your app: `export const app = new App();`\",\n\t\t\t);\n\t\t}\n\n\t\tconst docsConfig = appInstance._apiDocsConfig;\n\n\t\tconst document = generateOpenApiDocument({\n\t\t\topenApiDocs: appInstance.openApiDocs,\n\t\t\ttitle: docsConfig?.title,\n\t\t\tversion: docsConfig?.version,\n\t\t\tdescription: docsConfig?.description,\n\t\t});\n\n\t\tif (!document) {\n\t\t\tconsole.warn(\n\t\t\t\t\"\\x1b[33m  ⚠ No routes with OpenAPI metadata found. Add zValidator() or zResponse() to your routes.\\x1b[0m\",\n\t\t\t);\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\t// Output directory: public/docs/\n\t\tconst docsDir = resolve(process.cwd(), \"public/docs\");\n\t\tmkdirSync(docsDir, { recursive: true });\n\n\t\tconst swaggerPath = resolve(docsDir, \"swagger.json\");\n\t\twriteFileSync(swaggerPath, JSON.stringify(document, null, 2));\n\t\tconsole.log(\n\t\t\t`\\x1b[32m✔ swagger.json generated at public/docs/swagger.json\\x1b[0m`,\n\t\t);\n\n\t\tprocess.exit(0);\n\t} catch (error) {\n\t\tconsole.error(\"\\x1b[31mFailed to generate docs:\\x1b[0m\");\n\t\tconsole.error(error);\n\t\tprocess.exit(1);\n\t}\n}\n","#!/usr/bin/env bun\n\nimport { buildCommand } from \"./commands/build.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { createCommand } from \"./commands/create.js\";\nimport { dbCommand } from \"./commands/db.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { makeDocsCommand } from \"./commands/make-docs.js\";\nimport { VERSION } from \"../core-exports.js\";\n\nfunction printBanner() {\n\tconsole.log(`\n\\x1b[36m  Buntok CLI v${VERSION}\\x1b[0m\n`);\n}\n\nfunction printUsage() {\n\tconsole.log(`\n\\x1b[36mUsage:\\x1b[0m\n  buntok <command> [arguments] [options]\n\n\\x1b[36mCommands:\\x1b[0m\n  init                   Setup project: copy SKILL.md + configure package.json + generate env.ts\n  build                  Build project for production (output → .buntok/)\n  check                  Run TypeScript type check\n  create <entity>        Generate all files for entity (repo, service, controller)\n  db <command>           Database operations (migrate, seed, reset, generate, studio, status)\n  make:docs              Generate OpenAPI documentation automatically\n\n\\x1b[36mOptions (for create command):\\x1b[0m\n  --repo                 Generate only repository\n  --service              Generate only service\n  --controller           Generate only controller\n  --dry-run              Preview files without writing\n\n\\x1b[36mAliases:\\x1b[0m\n  g, gen, generate       Shortcut for create\n\n\\x1b[36mExamples:\\x1b[0m\n  buntok init                             # Initialize project setup\n  buntok build                            # Build project for production\n  buntok check                            # Run TypeScript type check\n  buntok create user                      # Generate all files for user entity\n  buntok g user --repo --service          # Generate repository and service only\n  buntok g user --dry-run                 # Preview what would be generated\n  buntok db migrate                       # Run pending migrations\n  buntok db seed                          # Seed database\n  buntok make:docs                        # Generate OpenAPI documentation\n`);\n}\n\nexport async function main() {\n\tconst args = process.argv.slice(2);\n\tconst command = args[0];\n\tconst arg1 = args[1];\n\n\tif (!command) {\n\t\tprintBanner();\n\t\tprintUsage();\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tswitch (command) {\n\t\tcase \"init\":\n\t\t\tawait initCommand();\n\t\t\tbreak;\n\t\tcase \"build\":\n\t\t\tawait buildCommand();\n\t\t\tbreak;\n\t\tcase \"check\":\n\t\t\tawait checkCommand();\n\t\t\tbreak;\n\t\tcase \"g\":\n\t\tcase \"gen\":\n\t\tcase \"generate\":\n\t\tcase \"create\":\n\t\t\tif (!arg1) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"\\x1b[31mError: entity name is required for create command\\x1b[0m\",\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait createCommand(arg1, args.slice(2));\n\t\t\tbreak;\n\t\tcase \"db\":\n\t\t\tawait dbCommand(args.slice(1));\n\t\t\tbreak;\n\t\tcase \"make:docs\":\n\t\t\tawait makeDocsCommand();\n\t\t\tbreak;\n\t\tdefault: {\n\t\t\tconst commands = [\n\t\t\t\t\"init\",\n\t\t\t\t\"build\",\n\t\t\t\t\"check\",\n\t\t\t\t\"create\",\n\t\t\t\t\"g\",\n\t\t\t\t\"db\",\n\t\t\t\t\"make:docs\",\n\t\t\t];\n\t\t\t// Simple fuzzy match: prefix or contains\n\t\t\tconst closest = commands.find(\n\t\t\t\t(c) =>\n\t\t\t\t\tc.startsWith(command) ||\n\t\t\t\t\tcommand.startsWith(c) ||\n\t\t\t\t\tc.includes(command) ||\n\t\t\t\t\tcommand.includes(c),\n\t\t\t);\n\t\t\tconst hint = closest ? `\\n  Did you mean: buntok ${closest}?` : \"\";\n\t\t\tconsole.error(`\\x1b[31mUnknown command: ${command}\\x1b[0m${hint}`);\n\t\t\tprintUsage();\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nmain();\n"]}