@kubb/cli 4.26.0 → 4.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/{agent-CUCCncEE.cjs → agent-BFRqrVF_.cjs} +2 -2
  2. package/dist/{agent-CUCCncEE.cjs.map → agent-BFRqrVF_.cjs.map} +1 -1
  3. package/dist/{agent-C1v0TR8w.js → agent-_H9DOOPd.js} +2 -2
  4. package/dist/{agent-C1v0TR8w.js.map → agent-_H9DOOPd.js.map} +1 -1
  5. package/dist/{generate-DCjbbjow.cjs → generate-10eNJXJo.cjs} +2 -2
  6. package/dist/{generate-DCjbbjow.cjs.map → generate-10eNJXJo.cjs.map} +1 -1
  7. package/dist/{generate-BvCWlGBa.js → generate-sTQnT8vH.js} +2 -2
  8. package/dist/{generate-BvCWlGBa.js.map → generate-sTQnT8vH.js.map} +1 -1
  9. package/dist/index.cjs +5 -5
  10. package/dist/index.js +5 -5
  11. package/dist/{init-C1htp7-A.js → init-BwzStiaK.js} +2 -2
  12. package/dist/{init-C1htp7-A.js.map → init-BwzStiaK.js.map} +1 -1
  13. package/dist/{init-SjjDNE_W.cjs → init-DOhq5sjS.cjs} +2 -2
  14. package/dist/{init-SjjDNE_W.cjs.map → init-DOhq5sjS.cjs.map} +1 -1
  15. package/dist/package-C3VLYHj-.js +6 -0
  16. package/dist/package-C3VLYHj-.js.map +1 -0
  17. package/dist/{package-BYUts0Ye.cjs → package-DcbrXbFT.cjs} +2 -2
  18. package/dist/package-DcbrXbFT.cjs.map +1 -0
  19. package/dist/{start-3QvnMf49.js → start-D9LsCoNJ.js} +24 -5
  20. package/dist/start-D9LsCoNJ.js.map +1 -0
  21. package/dist/{start-CktvgGht.cjs → start-Dp1iN5KU.cjs} +24 -5
  22. package/dist/start-Dp1iN5KU.cjs.map +1 -0
  23. package/package.json +6 -6
  24. package/src/commands/agent/start.ts +26 -3
  25. package/dist/package-BYUts0Ye.cjs.map +0 -1
  26. package/dist/package-YJwLry7P.js +0 -6
  27. package/dist/package-YJwLry7P.js.map +0 -1
  28. package/dist/start-3QvnMf49.js.map +0 -1
  29. package/dist/start-CktvgGht.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"init-C1htp7-A.js","names":["process","spinner"],"sources":["../src/utils/packageManager.ts","../src/commands/init.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { execa } from 'execa'\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n name: PackageManager\n lockFile: string\n installCommand: string[]\n}\n\nconst packageManagers: Record<PackageManager, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCommand: ['install', '--save-dev'],\n },\n}\n\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n // Check for packageManager field in package.json\n const packageJsonPath = path.join(cwd, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n if (packageJson.packageManager) {\n const [name] = packageJson.packageManager.split('@')\n if (name in packageManagers) {\n return packageManagers[name as PackageManager]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n // Check for lock files\n for (const pm of Object.values(packageManagers)) {\n if (fs.existsSync(path.join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n // Default to npm\n return packageManagers.npm\n}\n\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManager, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await execa(packageManager.name, commands[packageManager.name], {\n cwd,\n stdio: 'inherit',\n })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await execa(packageManager.name, [...packageManager.installCommand, ...packages], {\n cwd,\n stdio: 'inherit',\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport * as clack from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport pc from 'picocolors'\nimport { version } from '../../package.json'\nimport { detectPackageManager, hasPackageJson, initPackageJson, installPackages, type PackageManagerInfo } from '../utils/packageManager.ts'\n\ntype PluginOption = {\n value: string\n label: string\n hint?: string\n packageName: string\n importName: string\n category: 'core' | 'typescript' | 'query' | 'validation' | 'testing' | 'mocking' | 'docs'\n}\n\nconst plugins: PluginOption[] = [\n {\n value: 'plugin-oas',\n label: 'OpenAPI Parser',\n hint: 'Required',\n packageName: '@kubb/plugin-oas',\n importName: 'pluginOas',\n category: 'core',\n },\n {\n value: 'plugin-ts',\n label: 'TypeScript',\n hint: 'Recommended',\n packageName: '@kubb/plugin-ts',\n importName: 'pluginTs',\n category: 'typescript',\n },\n {\n value: 'plugin-client',\n label: 'Client (Fetch/Axios)',\n packageName: '@kubb/plugin-client',\n importName: 'pluginClient',\n category: 'typescript',\n },\n {\n value: 'plugin-react-query',\n label: 'React Query / TanStack Query',\n packageName: '@kubb/plugin-react-query',\n importName: 'pluginReactQuery',\n category: 'query',\n },\n {\n value: 'plugin-solid-query',\n label: 'Solid Query',\n packageName: '@kubb/plugin-solid-query',\n importName: 'pluginSolidQuery',\n category: 'query',\n },\n {\n value: 'plugin-svelte-query',\n label: 'Svelte Query',\n packageName: '@kubb/plugin-svelte-query',\n importName: 'pluginSvelteQuery',\n category: 'query',\n },\n {\n value: 'plugin-vue-query',\n label: 'Vue Query',\n packageName: '@kubb/plugin-vue-query',\n importName: 'pluginVueQuery',\n category: 'query',\n },\n {\n value: 'plugin-swr',\n label: 'SWR',\n packageName: '@kubb/plugin-swr',\n importName: 'pluginSwr',\n category: 'query',\n },\n {\n value: 'plugin-zod',\n label: 'Zod Schemas',\n packageName: '@kubb/plugin-zod',\n importName: 'pluginZod',\n category: 'validation',\n },\n {\n value: 'plugin-faker',\n label: 'Faker.js Mocks',\n packageName: '@kubb/plugin-faker',\n importName: 'pluginFaker',\n category: 'mocking',\n },\n {\n value: 'plugin-msw',\n label: 'MSW Handlers',\n packageName: '@kubb/plugin-msw',\n importName: 'pluginMsw',\n category: 'mocking',\n },\n {\n value: 'plugin-cypress',\n label: 'Cypress Tests',\n packageName: '@kubb/plugin-cypress',\n importName: 'pluginCypress',\n category: 'testing',\n },\n {\n value: 'plugin-redoc',\n label: 'ReDoc Documentation',\n packageName: '@kubb/plugin-redoc',\n importName: 'pluginRedoc',\n category: 'docs',\n },\n]\n\nfunction generateConfigFile(selectedPlugins: PluginOption[], inputPath: string, outputPath: string): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins\n .map((plugin) => {\n if (plugin.value === 'plugin-oas') {\n return ' pluginOas(),'\n }\n if (plugin.value === 'plugin-ts') {\n return ` pluginTs({\\n output: {\\n path: 'models',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-client') {\n return ` pluginClient({\\n output: {\\n path: 'clients',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-react-query') {\n return ` pluginReactQuery({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-zod') {\n return ` pluginZod({\\n output: {\\n path: 'zod',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-faker') {\n return ` pluginFaker({\\n output: {\\n path: 'mocks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-msw') {\n return ` pluginMsw({\\n output: {\\n path: 'msw',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-swr') {\n return ` pluginSwr({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n // Default config for other plugins\n return ` ${plugin.importName}(),`\n })\n .join('\\n')\n\n return `import { defineConfig } from '@kubb/core'\n${imports}\n\nexport default defineConfig({\n root: '.',\n input: {\n path: '${inputPath}',\n },\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\nconst command = defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n },\n async run() {\n const cwd = process.cwd()\n\n clack.intro(pc.bgCyan(pc.black(' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Detect package manager before initializing\n packageManager = detectPackageManager(cwd)\n\n const spinner = clack.spinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n\n await initPackageJson(cwd, packageManager)\n\n spinner.stop(`Created package.json with ${packageManager.name}`)\n } else {\n packageManager = detectPackageManager(cwd)\n clack.log.info(`Detected package manager: ${pc.cyan(packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n const inputPath = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: './openapi.yaml',\n defaultValue: './openapi.yaml',\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Prompt for output directory\n const outputPath = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: './src/gen',\n defaultValue: './src/gen',\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Plugin selection\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: plugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: ['plugin-oas', 'plugin-ts'],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n const selectedPlugins = plugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(plugins.find((p) => p.value === 'plugin-oas')!)\n }\n\n // Install packages\n const packagesToInstall = ['@kubb/core', '@kubb/cli', '@kubb/agent', ...selectedPlugins.map((p) => p.packageName)]\n\n const spinner = clack.spinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await installPackages(packagesToInstall, packageManager, cwd)\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = clack.spinner()\n configSpinner.start('Creating kubb.config.ts')\n\n const configContent = generateConfigFile(selectedPlugins, inputPath as string, outputPath as string)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n // Check if config already exists\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\n const shouldOverwrite = await clack.confirm({\n message: 'kubb.config.ts already exists. Overwrite?',\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n clack.cancel('Keeping existing configuration. Packages have been installed.')\n process.exit(0)\n }\n\n configSpinner.start('Overwriting kubb.config.ts')\n }\n\n fs.writeFileSync(configPath, configContent, 'utf-8')\n\n configSpinner.stop('Created kubb.config.ts')\n\n // Success message\n clack.outro(\n pc.green('✓ All set!') +\n '\\n\\n' +\n pc.dim('Next steps:') +\n '\\n' +\n pc.cyan(` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n pc.cyan(' 2. Generate code with: npx kubb generate') +\n '\\n' +\n pc.cyan(' Or start a stream server with: npx kubb start') +\n '\\n' +\n pc.cyan(` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n pc.dim(`Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(pc.red('An error occurred during initialization'))\n if (error instanceof Error) {\n clack.log.error(error.message)\n }\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":"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"}
1
+ {"version":3,"file":"init-BwzStiaK.js","names":["process","spinner"],"sources":["../src/utils/packageManager.ts","../src/commands/init.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { execa } from 'execa'\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n name: PackageManager\n lockFile: string\n installCommand: string[]\n}\n\nconst packageManagers: Record<PackageManager, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCommand: ['install', '--save-dev'],\n },\n}\n\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n // Check for packageManager field in package.json\n const packageJsonPath = path.join(cwd, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n if (packageJson.packageManager) {\n const [name] = packageJson.packageManager.split('@')\n if (name in packageManagers) {\n return packageManagers[name as PackageManager]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n // Check for lock files\n for (const pm of Object.values(packageManagers)) {\n if (fs.existsSync(path.join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n // Default to npm\n return packageManagers.npm\n}\n\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManager, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await execa(packageManager.name, commands[packageManager.name], {\n cwd,\n stdio: 'inherit',\n })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await execa(packageManager.name, [...packageManager.installCommand, ...packages], {\n cwd,\n stdio: 'inherit',\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport * as clack from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport pc from 'picocolors'\nimport { version } from '../../package.json'\nimport { detectPackageManager, hasPackageJson, initPackageJson, installPackages, type PackageManagerInfo } from '../utils/packageManager.ts'\n\ntype PluginOption = {\n value: string\n label: string\n hint?: string\n packageName: string\n importName: string\n category: 'core' | 'typescript' | 'query' | 'validation' | 'testing' | 'mocking' | 'docs'\n}\n\nconst plugins: PluginOption[] = [\n {\n value: 'plugin-oas',\n label: 'OpenAPI Parser',\n hint: 'Required',\n packageName: '@kubb/plugin-oas',\n importName: 'pluginOas',\n category: 'core',\n },\n {\n value: 'plugin-ts',\n label: 'TypeScript',\n hint: 'Recommended',\n packageName: '@kubb/plugin-ts',\n importName: 'pluginTs',\n category: 'typescript',\n },\n {\n value: 'plugin-client',\n label: 'Client (Fetch/Axios)',\n packageName: '@kubb/plugin-client',\n importName: 'pluginClient',\n category: 'typescript',\n },\n {\n value: 'plugin-react-query',\n label: 'React Query / TanStack Query',\n packageName: '@kubb/plugin-react-query',\n importName: 'pluginReactQuery',\n category: 'query',\n },\n {\n value: 'plugin-solid-query',\n label: 'Solid Query',\n packageName: '@kubb/plugin-solid-query',\n importName: 'pluginSolidQuery',\n category: 'query',\n },\n {\n value: 'plugin-svelte-query',\n label: 'Svelte Query',\n packageName: '@kubb/plugin-svelte-query',\n importName: 'pluginSvelteQuery',\n category: 'query',\n },\n {\n value: 'plugin-vue-query',\n label: 'Vue Query',\n packageName: '@kubb/plugin-vue-query',\n importName: 'pluginVueQuery',\n category: 'query',\n },\n {\n value: 'plugin-swr',\n label: 'SWR',\n packageName: '@kubb/plugin-swr',\n importName: 'pluginSwr',\n category: 'query',\n },\n {\n value: 'plugin-zod',\n label: 'Zod Schemas',\n packageName: '@kubb/plugin-zod',\n importName: 'pluginZod',\n category: 'validation',\n },\n {\n value: 'plugin-faker',\n label: 'Faker.js Mocks',\n packageName: '@kubb/plugin-faker',\n importName: 'pluginFaker',\n category: 'mocking',\n },\n {\n value: 'plugin-msw',\n label: 'MSW Handlers',\n packageName: '@kubb/plugin-msw',\n importName: 'pluginMsw',\n category: 'mocking',\n },\n {\n value: 'plugin-cypress',\n label: 'Cypress Tests',\n packageName: '@kubb/plugin-cypress',\n importName: 'pluginCypress',\n category: 'testing',\n },\n {\n value: 'plugin-redoc',\n label: 'ReDoc Documentation',\n packageName: '@kubb/plugin-redoc',\n importName: 'pluginRedoc',\n category: 'docs',\n },\n]\n\nfunction generateConfigFile(selectedPlugins: PluginOption[], inputPath: string, outputPath: string): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins\n .map((plugin) => {\n if (plugin.value === 'plugin-oas') {\n return ' pluginOas(),'\n }\n if (plugin.value === 'plugin-ts') {\n return ` pluginTs({\\n output: {\\n path: 'models',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-client') {\n return ` pluginClient({\\n output: {\\n path: 'clients',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-react-query') {\n return ` pluginReactQuery({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-zod') {\n return ` pluginZod({\\n output: {\\n path: 'zod',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-faker') {\n return ` pluginFaker({\\n output: {\\n path: 'mocks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-msw') {\n return ` pluginMsw({\\n output: {\\n path: 'msw',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-swr') {\n return ` pluginSwr({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n // Default config for other plugins\n return ` ${plugin.importName}(),`\n })\n .join('\\n')\n\n return `import { defineConfig } from '@kubb/core'\n${imports}\n\nexport default defineConfig({\n root: '.',\n input: {\n path: '${inputPath}',\n },\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\nconst command = defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n },\n async run() {\n const cwd = process.cwd()\n\n clack.intro(pc.bgCyan(pc.black(' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Detect package manager before initializing\n packageManager = detectPackageManager(cwd)\n\n const spinner = clack.spinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n\n await initPackageJson(cwd, packageManager)\n\n spinner.stop(`Created package.json with ${packageManager.name}`)\n } else {\n packageManager = detectPackageManager(cwd)\n clack.log.info(`Detected package manager: ${pc.cyan(packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n const inputPath = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: './openapi.yaml',\n defaultValue: './openapi.yaml',\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Prompt for output directory\n const outputPath = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: './src/gen',\n defaultValue: './src/gen',\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Plugin selection\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: plugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: ['plugin-oas', 'plugin-ts'],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n const selectedPlugins = plugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(plugins.find((p) => p.value === 'plugin-oas')!)\n }\n\n // Install packages\n const packagesToInstall = ['@kubb/core', '@kubb/cli', '@kubb/agent', ...selectedPlugins.map((p) => p.packageName)]\n\n const spinner = clack.spinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await installPackages(packagesToInstall, packageManager, cwd)\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = clack.spinner()\n configSpinner.start('Creating kubb.config.ts')\n\n const configContent = generateConfigFile(selectedPlugins, inputPath as string, outputPath as string)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n // Check if config already exists\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\n const shouldOverwrite = await clack.confirm({\n message: 'kubb.config.ts already exists. Overwrite?',\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n clack.cancel('Keeping existing configuration. Packages have been installed.')\n process.exit(0)\n }\n\n configSpinner.start('Overwriting kubb.config.ts')\n }\n\n fs.writeFileSync(configPath, configContent, 'utf-8')\n\n configSpinner.stop('Created kubb.config.ts')\n\n // Success message\n clack.outro(\n pc.green('✓ All set!') +\n '\\n\\n' +\n pc.dim('Next steps:') +\n '\\n' +\n pc.cyan(` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n pc.cyan(' 2. Generate code with: npx kubb generate') +\n '\\n' +\n pc.cyan(' Or start a stream server with: npx kubb start') +\n '\\n' +\n pc.cyan(` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n pc.dim(`Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(pc.red('An error occurred during initialization'))\n if (error instanceof Error) {\n clack.log.error(error.message)\n }\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require('./chunk-C1_xRkKa.cjs');
2
- const require_package = require('./package-BYUts0Ye.cjs');
2
+ const require_package = require('./package-DcbrXbFT.cjs');
3
3
  let citty = require("citty");
4
4
  let node_path = require("node:path");
5
5
  node_path = require_chunk.__toESM(node_path);
@@ -308,4 +308,4 @@ var init_default = command;
308
308
 
309
309
  //#endregion
310
310
  exports.default = init_default;
311
- //# sourceMappingURL=init-SjjDNE_W.cjs.map
311
+ //# sourceMappingURL=init-DOhq5sjS.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-SjjDNE_W.cjs","names":["path","fs","process","pc","clack","spinner","path","fs","version"],"sources":["../src/utils/packageManager.ts","../src/commands/init.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { execa } from 'execa'\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n name: PackageManager\n lockFile: string\n installCommand: string[]\n}\n\nconst packageManagers: Record<PackageManager, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCommand: ['install', '--save-dev'],\n },\n}\n\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n // Check for packageManager field in package.json\n const packageJsonPath = path.join(cwd, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n if (packageJson.packageManager) {\n const [name] = packageJson.packageManager.split('@')\n if (name in packageManagers) {\n return packageManagers[name as PackageManager]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n // Check for lock files\n for (const pm of Object.values(packageManagers)) {\n if (fs.existsSync(path.join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n // Default to npm\n return packageManagers.npm\n}\n\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManager, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await execa(packageManager.name, commands[packageManager.name], {\n cwd,\n stdio: 'inherit',\n })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await execa(packageManager.name, [...packageManager.installCommand, ...packages], {\n cwd,\n stdio: 'inherit',\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport * as clack from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport pc from 'picocolors'\nimport { version } from '../../package.json'\nimport { detectPackageManager, hasPackageJson, initPackageJson, installPackages, type PackageManagerInfo } from '../utils/packageManager.ts'\n\ntype PluginOption = {\n value: string\n label: string\n hint?: string\n packageName: string\n importName: string\n category: 'core' | 'typescript' | 'query' | 'validation' | 'testing' | 'mocking' | 'docs'\n}\n\nconst plugins: PluginOption[] = [\n {\n value: 'plugin-oas',\n label: 'OpenAPI Parser',\n hint: 'Required',\n packageName: '@kubb/plugin-oas',\n importName: 'pluginOas',\n category: 'core',\n },\n {\n value: 'plugin-ts',\n label: 'TypeScript',\n hint: 'Recommended',\n packageName: '@kubb/plugin-ts',\n importName: 'pluginTs',\n category: 'typescript',\n },\n {\n value: 'plugin-client',\n label: 'Client (Fetch/Axios)',\n packageName: '@kubb/plugin-client',\n importName: 'pluginClient',\n category: 'typescript',\n },\n {\n value: 'plugin-react-query',\n label: 'React Query / TanStack Query',\n packageName: '@kubb/plugin-react-query',\n importName: 'pluginReactQuery',\n category: 'query',\n },\n {\n value: 'plugin-solid-query',\n label: 'Solid Query',\n packageName: '@kubb/plugin-solid-query',\n importName: 'pluginSolidQuery',\n category: 'query',\n },\n {\n value: 'plugin-svelte-query',\n label: 'Svelte Query',\n packageName: '@kubb/plugin-svelte-query',\n importName: 'pluginSvelteQuery',\n category: 'query',\n },\n {\n value: 'plugin-vue-query',\n label: 'Vue Query',\n packageName: '@kubb/plugin-vue-query',\n importName: 'pluginVueQuery',\n category: 'query',\n },\n {\n value: 'plugin-swr',\n label: 'SWR',\n packageName: '@kubb/plugin-swr',\n importName: 'pluginSwr',\n category: 'query',\n },\n {\n value: 'plugin-zod',\n label: 'Zod Schemas',\n packageName: '@kubb/plugin-zod',\n importName: 'pluginZod',\n category: 'validation',\n },\n {\n value: 'plugin-faker',\n label: 'Faker.js Mocks',\n packageName: '@kubb/plugin-faker',\n importName: 'pluginFaker',\n category: 'mocking',\n },\n {\n value: 'plugin-msw',\n label: 'MSW Handlers',\n packageName: '@kubb/plugin-msw',\n importName: 'pluginMsw',\n category: 'mocking',\n },\n {\n value: 'plugin-cypress',\n label: 'Cypress Tests',\n packageName: '@kubb/plugin-cypress',\n importName: 'pluginCypress',\n category: 'testing',\n },\n {\n value: 'plugin-redoc',\n label: 'ReDoc Documentation',\n packageName: '@kubb/plugin-redoc',\n importName: 'pluginRedoc',\n category: 'docs',\n },\n]\n\nfunction generateConfigFile(selectedPlugins: PluginOption[], inputPath: string, outputPath: string): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins\n .map((plugin) => {\n if (plugin.value === 'plugin-oas') {\n return ' pluginOas(),'\n }\n if (plugin.value === 'plugin-ts') {\n return ` pluginTs({\\n output: {\\n path: 'models',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-client') {\n return ` pluginClient({\\n output: {\\n path: 'clients',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-react-query') {\n return ` pluginReactQuery({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-zod') {\n return ` pluginZod({\\n output: {\\n path: 'zod',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-faker') {\n return ` pluginFaker({\\n output: {\\n path: 'mocks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-msw') {\n return ` pluginMsw({\\n output: {\\n path: 'msw',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-swr') {\n return ` pluginSwr({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n // Default config for other plugins\n return ` ${plugin.importName}(),`\n })\n .join('\\n')\n\n return `import { defineConfig } from '@kubb/core'\n${imports}\n\nexport default defineConfig({\n root: '.',\n input: {\n path: '${inputPath}',\n },\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\nconst command = defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n },\n async run() {\n const cwd = process.cwd()\n\n clack.intro(pc.bgCyan(pc.black(' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Detect package manager before initializing\n packageManager = detectPackageManager(cwd)\n\n const spinner = clack.spinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n\n await initPackageJson(cwd, packageManager)\n\n spinner.stop(`Created package.json with ${packageManager.name}`)\n } else {\n packageManager = detectPackageManager(cwd)\n clack.log.info(`Detected package manager: ${pc.cyan(packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n const inputPath = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: './openapi.yaml',\n defaultValue: './openapi.yaml',\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Prompt for output directory\n const outputPath = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: './src/gen',\n defaultValue: './src/gen',\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Plugin selection\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: plugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: ['plugin-oas', 'plugin-ts'],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n const selectedPlugins = plugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(plugins.find((p) => p.value === 'plugin-oas')!)\n }\n\n // Install packages\n const packagesToInstall = ['@kubb/core', '@kubb/cli', '@kubb/agent', ...selectedPlugins.map((p) => p.packageName)]\n\n const spinner = clack.spinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await installPackages(packagesToInstall, packageManager, cwd)\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = clack.spinner()\n configSpinner.start('Creating kubb.config.ts')\n\n const configContent = generateConfigFile(selectedPlugins, inputPath as string, outputPath as string)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n // Check if config already exists\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\n const shouldOverwrite = await clack.confirm({\n message: 'kubb.config.ts already exists. Overwrite?',\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n clack.cancel('Keeping existing configuration. Packages have been installed.')\n process.exit(0)\n }\n\n configSpinner.start('Overwriting kubb.config.ts')\n }\n\n fs.writeFileSync(configPath, configContent, 'utf-8')\n\n configSpinner.stop('Created kubb.config.ts')\n\n // Success message\n clack.outro(\n pc.green('✓ All set!') +\n '\\n\\n' +\n pc.dim('Next steps:') +\n '\\n' +\n pc.cyan(` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n pc.cyan(' 2. Generate code with: npx kubb generate') +\n '\\n' +\n pc.cyan(' Or start a stream server with: npx kubb start') +\n '\\n' +\n pc.cyan(` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n pc.dim(`Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(pc.red('An error occurred during initialization'))\n if (error instanceof Error) {\n clack.log.error(error.message)\n }\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":"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"}
1
+ {"version":3,"file":"init-DOhq5sjS.cjs","names":["path","fs","process","pc","clack","spinner","path","fs","version"],"sources":["../src/utils/packageManager.ts","../src/commands/init.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { execa } from 'execa'\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n name: PackageManager\n lockFile: string\n installCommand: string[]\n}\n\nconst packageManagers: Record<PackageManager, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCommand: ['install', '--save-dev'],\n },\n}\n\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n // Check for packageManager field in package.json\n const packageJsonPath = path.join(cwd, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n if (packageJson.packageManager) {\n const [name] = packageJson.packageManager.split('@')\n if (name in packageManagers) {\n return packageManagers[name as PackageManager]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n // Check for lock files\n for (const pm of Object.values(packageManagers)) {\n if (fs.existsSync(path.join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n // Default to npm\n return packageManagers.npm\n}\n\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManager, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await execa(packageManager.name, commands[packageManager.name], {\n cwd,\n stdio: 'inherit',\n })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await execa(packageManager.name, [...packageManager.installCommand, ...packages], {\n cwd,\n stdio: 'inherit',\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport * as clack from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport pc from 'picocolors'\nimport { version } from '../../package.json'\nimport { detectPackageManager, hasPackageJson, initPackageJson, installPackages, type PackageManagerInfo } from '../utils/packageManager.ts'\n\ntype PluginOption = {\n value: string\n label: string\n hint?: string\n packageName: string\n importName: string\n category: 'core' | 'typescript' | 'query' | 'validation' | 'testing' | 'mocking' | 'docs'\n}\n\nconst plugins: PluginOption[] = [\n {\n value: 'plugin-oas',\n label: 'OpenAPI Parser',\n hint: 'Required',\n packageName: '@kubb/plugin-oas',\n importName: 'pluginOas',\n category: 'core',\n },\n {\n value: 'plugin-ts',\n label: 'TypeScript',\n hint: 'Recommended',\n packageName: '@kubb/plugin-ts',\n importName: 'pluginTs',\n category: 'typescript',\n },\n {\n value: 'plugin-client',\n label: 'Client (Fetch/Axios)',\n packageName: '@kubb/plugin-client',\n importName: 'pluginClient',\n category: 'typescript',\n },\n {\n value: 'plugin-react-query',\n label: 'React Query / TanStack Query',\n packageName: '@kubb/plugin-react-query',\n importName: 'pluginReactQuery',\n category: 'query',\n },\n {\n value: 'plugin-solid-query',\n label: 'Solid Query',\n packageName: '@kubb/plugin-solid-query',\n importName: 'pluginSolidQuery',\n category: 'query',\n },\n {\n value: 'plugin-svelte-query',\n label: 'Svelte Query',\n packageName: '@kubb/plugin-svelte-query',\n importName: 'pluginSvelteQuery',\n category: 'query',\n },\n {\n value: 'plugin-vue-query',\n label: 'Vue Query',\n packageName: '@kubb/plugin-vue-query',\n importName: 'pluginVueQuery',\n category: 'query',\n },\n {\n value: 'plugin-swr',\n label: 'SWR',\n packageName: '@kubb/plugin-swr',\n importName: 'pluginSwr',\n category: 'query',\n },\n {\n value: 'plugin-zod',\n label: 'Zod Schemas',\n packageName: '@kubb/plugin-zod',\n importName: 'pluginZod',\n category: 'validation',\n },\n {\n value: 'plugin-faker',\n label: 'Faker.js Mocks',\n packageName: '@kubb/plugin-faker',\n importName: 'pluginFaker',\n category: 'mocking',\n },\n {\n value: 'plugin-msw',\n label: 'MSW Handlers',\n packageName: '@kubb/plugin-msw',\n importName: 'pluginMsw',\n category: 'mocking',\n },\n {\n value: 'plugin-cypress',\n label: 'Cypress Tests',\n packageName: '@kubb/plugin-cypress',\n importName: 'pluginCypress',\n category: 'testing',\n },\n {\n value: 'plugin-redoc',\n label: 'ReDoc Documentation',\n packageName: '@kubb/plugin-redoc',\n importName: 'pluginRedoc',\n category: 'docs',\n },\n]\n\nfunction generateConfigFile(selectedPlugins: PluginOption[], inputPath: string, outputPath: string): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins\n .map((plugin) => {\n if (plugin.value === 'plugin-oas') {\n return ' pluginOas(),'\n }\n if (plugin.value === 'plugin-ts') {\n return ` pluginTs({\\n output: {\\n path: 'models',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-client') {\n return ` pluginClient({\\n output: {\\n path: 'clients',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-react-query') {\n return ` pluginReactQuery({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-zod') {\n return ` pluginZod({\\n output: {\\n path: 'zod',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-faker') {\n return ` pluginFaker({\\n output: {\\n path: 'mocks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-msw') {\n return ` pluginMsw({\\n output: {\\n path: 'msw',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-swr') {\n return ` pluginSwr({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n // Default config for other plugins\n return ` ${plugin.importName}(),`\n })\n .join('\\n')\n\n return `import { defineConfig } from '@kubb/core'\n${imports}\n\nexport default defineConfig({\n root: '.',\n input: {\n path: '${inputPath}',\n },\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\nconst command = defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n },\n async run() {\n const cwd = process.cwd()\n\n clack.intro(pc.bgCyan(pc.black(' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Detect package manager before initializing\n packageManager = detectPackageManager(cwd)\n\n const spinner = clack.spinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n\n await initPackageJson(cwd, packageManager)\n\n spinner.stop(`Created package.json with ${packageManager.name}`)\n } else {\n packageManager = detectPackageManager(cwd)\n clack.log.info(`Detected package manager: ${pc.cyan(packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n const inputPath = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: './openapi.yaml',\n defaultValue: './openapi.yaml',\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Prompt for output directory\n const outputPath = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: './src/gen',\n defaultValue: './src/gen',\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Plugin selection\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: plugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: ['plugin-oas', 'plugin-ts'],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n const selectedPlugins = plugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(plugins.find((p) => p.value === 'plugin-oas')!)\n }\n\n // Install packages\n const packagesToInstall = ['@kubb/core', '@kubb/cli', '@kubb/agent', ...selectedPlugins.map((p) => p.packageName)]\n\n const spinner = clack.spinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await installPackages(packagesToInstall, packageManager, cwd)\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = clack.spinner()\n configSpinner.start('Creating kubb.config.ts')\n\n const configContent = generateConfigFile(selectedPlugins, inputPath as string, outputPath as string)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n // Check if config already exists\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\n const shouldOverwrite = await clack.confirm({\n message: 'kubb.config.ts already exists. Overwrite?',\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n clack.cancel('Keeping existing configuration. Packages have been installed.')\n process.exit(0)\n }\n\n configSpinner.start('Overwriting kubb.config.ts')\n }\n\n fs.writeFileSync(configPath, configContent, 'utf-8')\n\n configSpinner.stop('Created kubb.config.ts')\n\n // Success message\n clack.outro(\n pc.green('✓ All set!') +\n '\\n\\n' +\n pc.dim('Next steps:') +\n '\\n' +\n pc.cyan(` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n pc.cyan(' 2. Generate code with: npx kubb generate') +\n '\\n' +\n pc.cyan(' Or start a stream server with: npx kubb start') +\n '\\n' +\n pc.cyan(` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n pc.dim(`Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(pc.red('An error occurred during initialization'))\n if (error instanceof Error) {\n clack.log.error(error.message)\n }\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;;;;;;;;;;AAYA,MAAM,kBAA8D;CAClE,MAAM;EACJ,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,OAAO,KAAK;EAC9B;CACD,MAAM;EACJ,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,OAAO,KAAK;EAC9B;CACD,KAAK;EACH,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,OAAO,KAAK;EAC9B;CACD,KAAK;EACH,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,WAAW,aAAa;EAC1C;CACF;AAED,SAAgB,qBAAqB,MAAc,QAAQ,KAAK,EAAsB;CAEpF,MAAM,kBAAkBA,kBAAK,KAAK,KAAK,eAAe;AACtD,KAAIC,gBAAG,WAAW,gBAAgB,CAChC,KAAI;EACF,MAAM,cAAc,KAAK,MAAMA,gBAAG,aAAa,iBAAiB,QAAQ,CAAC;AACzE,MAAI,YAAY,gBAAgB;GAC9B,MAAM,CAAC,QAAQ,YAAY,eAAe,MAAM,IAAI;AACpD,OAAI,QAAQ,gBACV,QAAO,gBAAgB;;SAGrB;AAMV,MAAK,MAAM,MAAM,OAAO,OAAO,gBAAgB,CAC7C,KAAIA,gBAAG,WAAWD,kBAAK,KAAK,KAAK,GAAG,SAAS,CAAC,CAC5C,QAAO;AAKX,QAAO,gBAAgB;;AAGzB,SAAgB,eAAe,MAAc,QAAQ,KAAK,EAAW;AACnE,QAAOC,gBAAG,WAAWD,kBAAK,KAAK,KAAK,eAAe,CAAC;;AAGtD,eAAsB,gBAAgB,KAAa,gBAAmD;AAQpG,wBAAY,eAAe,MAPwB;EACjD,KAAK,CAAC,QAAQ,KAAK;EACnB,MAAM,CAAC,OAAO;EACd,MAAM,CAAC,QAAQ,KAAK;EACpB,KAAK,CAAC,QAAQ,KAAK;EACpB,CAEyC,eAAe,OAAO;EAC9D;EACA,OAAO;EACR,CAAC;;AAGJ,eAAsB,gBAAgB,UAAoB,gBAAoC,MAAc,QAAQ,KAAK,EAAiB;AACxI,wBAAY,eAAe,MAAM,CAAC,GAAG,eAAe,gBAAgB,GAAG,SAAS,EAAE;EAChF;EACA,OAAO;EACR,CAAC;;;;;ACnEJ,MAAM,UAA0B;CAC9B;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACF;AAED,SAAS,mBAAmB,iBAAiC,WAAmB,YAA4B;AAkC1G,QAAO;EAjCS,gBAAgB,KAAK,WAAW,YAAY,OAAO,WAAW,WAAW,OAAO,YAAY,GAAG,CAAC,KAAK,KAAK,CAkClH;;;;;aAKG,UAAU;;;aAGV,WAAW;;;;EAxCA,gBACnB,KAAK,WAAW;AACf,MAAI,OAAO,UAAU,aACnB,QAAO;AAET,MAAI,OAAO,UAAU,YACnB,QAAO;AAET,MAAI,OAAO,UAAU,gBACnB,QAAO;AAET,MAAI,OAAO,UAAU,qBACnB,QAAO;AAET,MAAI,OAAO,UAAU,aACnB,QAAO;AAET,MAAI,OAAO,UAAU,eACnB,QAAO;AAET,MAAI,OAAO,UAAU,aACnB,QAAO;AAET,MAAI,OAAO,UAAU,aACnB,QAAO;AAGT,SAAO,OAAO,OAAO,WAAW;GAChC,CACD,KAAK,KAAK,CAeC;;;;;AAMhB,MAAM,mCAAwB;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM,MAAM;EACV,MAAM,MAAME,qBAAQ,KAAK;AAEzB,iBAAM,MAAMC,mBAAG,OAAOA,mBAAG,MAAM,cAAc,CAAC,CAAC;AAE/C,MAAI;GAEF,IAAI;AACJ,OAAI,CAAC,eAAe,IAAI,EAAE;IACxB,MAAM,aAAa,MAAMC,eAAM,QAAQ;KACrC,SAAS;KACT,cAAc;KACf,CAAC;AAEF,QAAIA,eAAM,SAAS,WAAW,IAAI,CAAC,YAAY;AAC7C,oBAAM,OAAO,uBAAuB;AACpC,0BAAQ,KAAK,EAAE;;AAIjB,qBAAiB,qBAAqB,IAAI;IAE1C,MAAMC,YAAUD,eAAM,SAAS;AAC/B,cAAQ,MAAM,kCAAkC,eAAe,OAAO;AAEtE,UAAM,gBAAgB,KAAK,eAAe;AAE1C,cAAQ,KAAK,6BAA6B,eAAe,OAAO;UAC3D;AACL,qBAAiB,qBAAqB,IAAI;AAC1C,mBAAM,IAAI,KAAK,6BAA6BD,mBAAG,KAAK,eAAe,KAAK,GAAG;;GAI7E,MAAM,YAAY,MAAMC,eAAM,KAAK;IACjC,SAAS;IACT,aAAa;IACb,cAAc;IACd,WAAW,UAAU;AACnB,SAAI,CAAC,MAAO,QAAO;;IAEtB,CAAC;AAEF,OAAIA,eAAM,SAAS,UAAU,EAAE;AAC7B,mBAAM,OAAO,uBAAuB;AACpC,yBAAQ,KAAK,EAAE;;GAIjB,MAAM,aAAa,MAAMA,eAAM,KAAK;IAClC,SAAS;IACT,aAAa;IACb,cAAc;IACd,WAAW,UAAU;AACnB,SAAI,CAAC,MAAO,QAAO;;IAEtB,CAAC;AAEF,OAAIA,eAAM,SAAS,WAAW,EAAE;AAC9B,mBAAM,OAAO,uBAAuB;AACpC,yBAAQ,KAAK,EAAE;;GAIjB,MAAM,uBAAuB,MAAMA,eAAM,YAAY;IACnD,SAAS;IACT,SAAS,QAAQ,KAAK,YAAY;KAChC,OAAO,OAAO;KACd,OAAO,OAAO;KACd,MAAM,OAAO;KACd,EAAE;IACH,eAAe,CAAC,cAAc,YAAY;IAC1C,UAAU;IACX,CAAC;AAEF,OAAIA,eAAM,SAAS,qBAAqB,EAAE;AACxC,mBAAM,OAAO,uBAAuB;AACpC,yBAAQ,KAAK,EAAE;;GAGjB,MAAM,kBAAkB,QAAQ,QAAQ,WAAY,qBAAkC,SAAS,OAAO,MAAM,CAAC;AAG7G,OAAI,CAAC,gBAAgB,MAAM,MAAM,EAAE,UAAU,aAAa,CACxD,iBAAgB,QAAQ,QAAQ,MAAM,MAAM,EAAE,UAAU,aAAa,CAAE;GAIzE,MAAM,oBAAoB;IAAC;IAAc;IAAa;IAAe,GAAG,gBAAgB,KAAK,MAAM,EAAE,YAAY;IAAC;GAElH,MAAM,UAAUA,eAAM,SAAS;AAC/B,WAAQ,MAAM,cAAc,kBAAkB,OAAO,iBAAiB,eAAe,OAAO;AAE5F,OAAI;AACF,UAAM,gBAAgB,mBAAmB,gBAAgB,IAAI;AAC7D,YAAQ,KAAK,aAAa,kBAAkB,OAAO,WAAW;YACvD,OAAO;AACd,YAAQ,KAAK,sBAAsB;AACnC,UAAM;;GAIR,MAAM,gBAAgBA,eAAM,SAAS;AACrC,iBAAc,MAAM,0BAA0B;GAE9C,MAAM,gBAAgB,mBAAmB,iBAAiB,WAAqB,WAAqB;GACpG,MAAM,aAAaE,kBAAK,KAAK,KAAK,iBAAiB;AAGnD,OAAIC,gBAAG,WAAW,WAAW,EAAE;AAC7B,kBAAc,KAAK,gCAAgC;IAEnD,MAAM,kBAAkB,MAAMH,eAAM,QAAQ;KAC1C,SAAS;KACT,cAAc;KACf,CAAC;AAEF,QAAIA,eAAM,SAAS,gBAAgB,IAAI,CAAC,iBAAiB;AACvD,oBAAM,OAAO,gEAAgE;AAC7E,0BAAQ,KAAK,EAAE;;AAGjB,kBAAc,MAAM,6BAA6B;;AAGnD,mBAAG,cAAc,YAAY,eAAe,QAAQ;AAEpD,iBAAc,KAAK,yBAAyB;AAG5C,kBAAM,MACJD,mBAAG,MAAM,aAAa,GACpB,SACAA,mBAAG,IAAI,cAAc,GACrB,OACAA,mBAAG,KAAK,2CAA2C,YAAY,GAC/D,OACAA,mBAAG,KAAK,6CAA6C,GACrD,OACAA,mBAAG,KAAK,qDAAqD,GAC7D,OACAA,mBAAG,KAAK,iCAAiC,aAAa,GACtD,SACAA,mBAAG,IAAI,SAAS,eAAe,KAAK,WAAWK,0BAAU,CAC5D;WACM,OAAO;AACd,kBAAM,IAAI,MAAML,mBAAG,IAAI,0CAA0C,CAAC;AAClE,OAAI,iBAAiB,MACnB,gBAAM,IAAI,MAAM,MAAM,QAAQ;AAEhC,wBAAQ,KAAK,EAAE;;;CAGpB,CAAC;AAEF,mBAAe"}
@@ -0,0 +1,6 @@
1
+ //#region package.json
2
+ var version = "4.27.0";
3
+
4
+ //#endregion
5
+ export { version as t };
6
+ //# sourceMappingURL=package-C3VLYHj-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-C3VLYHj-.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -1,6 +1,6 @@
1
1
 
2
2
  //#region package.json
3
- var version = "4.26.0";
3
+ var version = "4.27.0";
4
4
 
5
5
  //#endregion
6
6
  Object.defineProperty(exports, 'version', {
@@ -9,4 +9,4 @@ Object.defineProperty(exports, 'version', {
9
9
  return version;
10
10
  }
11
11
  });
12
- //# sourceMappingURL=package-BYUts0Ye.cjs.map
12
+ //# sourceMappingURL=package-DcbrXbFT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-DcbrXbFT.cjs","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -29,9 +29,19 @@ const args = {
29
29
  type: "boolean",
30
30
  description: "Disable session caching",
31
31
  default: false
32
+ },
33
+ "allow-write": {
34
+ type: "boolean",
35
+ description: "Allow writing generated files to the filesystem. When not set, no files are written and the config patch is not persisted.",
36
+ default: false
37
+ },
38
+ "allow-all": {
39
+ type: "boolean",
40
+ description: "Grant all permissions (implies --allow-write).",
41
+ default: false
32
42
  }
33
43
  };
34
- async function startServer({ port, host, configPath, noCache }) {
44
+ async function startServer({ port, host, configPath, noCache, allowWrite, allowAll }) {
35
45
  try {
36
46
  config();
37
47
  const agentPkgPath = fileURLToPath(import.meta.resolve("@kubb/agent/package.json"));
@@ -39,9 +49,11 @@ async function startServer({ port, host, configPath, noCache }) {
39
49
  const serverPath = path.join(agentDir, ".output", "server", "index.mjs");
40
50
  const PORT = process$1.env.PORT || (port === 0 ? "3000" : String(port));
41
51
  const HOST = process$1.env.HOST || host || "0.0.0.0";
42
- const KUBB_ROOT = process$1.env.KUBB_ROOT;
52
+ const KUBB_ROOT = process$1.env.KUBB_ROOT || process$1.cwd();
43
53
  const KUBB_CONFIG = process$1.env.KUBB_CONFIG || configPath || "kubb.config.ts";
44
54
  const KUBB_AGENT_NO_CACHE = noCache ? "true" : "false";
55
+ const KUBB_ALLOW_WRITE = allowAll || allowWrite ? "true" : process$1.env.KUBB_ALLOW_WRITE ?? "false";
56
+ const KUBB_ALLOW_ALL = allowAll ? "true" : process$1.env.KUBB_ALLOW_ALL ?? "false";
45
57
  const KUBB_STUDIO_URL = process$1.env.KUBB_STUDIO_URL || "https://studio.kubb.dev";
46
58
  const KUBB_AGENT_TOKEN = process$1.env.KUBB_AGENT_TOKEN;
47
59
  const env = {
@@ -52,13 +64,16 @@ async function startServer({ port, host, configPath, noCache }) {
52
64
  KUBB_STUDIO_URL,
53
65
  KUBB_RETRY_TIMEOUT: process$1.env.KUBB_RETRY_TIMEOUT || "30000",
54
66
  KUBB_AGENT_NO_CACHE,
55
- KUBB_AGENT_TOKEN
67
+ KUBB_AGENT_TOKEN,
68
+ KUBB_ALLOW_WRITE,
69
+ KUBB_ALLOW_ALL
56
70
  };
57
71
  clack.log.step(pc.cyan("Starting agent server..."));
58
72
  clack.log.info(pc.dim(`Config: ${KUBB_CONFIG}`));
59
73
  clack.log.info(pc.dim(`Host: ${HOST}`));
60
74
  clack.log.info(pc.dim(`Port: ${PORT}`));
61
75
  if (noCache) clack.log.info(pc.dim("Session caching: disabled"));
76
+ if (!allowWrite && !allowAll) clack.log.warn(pc.yellow("Filesystem writes disabled. Use --allow-write or --allow-all to enable."));
62
77
  await execa("node", [serverPath], {
63
78
  env,
64
79
  stdio: "inherit",
@@ -82,11 +97,15 @@ const command = defineCommand({
82
97
  const port = args$1.port ? Number.parseInt(args$1.port, 10) : 0;
83
98
  const host = args$1.host;
84
99
  const noCache = args$1["no-cache"];
100
+ const allowWrite = args$1["allow-write"];
101
+ const allowAll = args$1["allow-all"];
85
102
  await startServer({
86
103
  port,
87
104
  host,
88
105
  configPath,
89
- noCache
106
+ noCache,
107
+ allowWrite,
108
+ allowAll
90
109
  });
91
110
  } catch (error) {
92
111
  clack.log.error(pc.red("Failed to start agent server"));
@@ -99,4 +118,4 @@ var start_default = command;
99
118
 
100
119
  //#endregion
101
120
  export { start_default as default };
102
- //# sourceMappingURL=start-3QvnMf49.js.map
121
+ //# sourceMappingURL=start-D9LsCoNJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-D9LsCoNJ.js","names":["process","args"],"sources":["../src/commands/agent/start.ts"],"sourcesContent":["import path from 'node:path'\nimport * as process from 'node:process'\nimport { fileURLToPath } from 'node:url'\n\nimport * as clack from '@clack/prompts'\nimport type { ArgsDef } from 'citty'\nimport { defineCommand } from 'citty'\nimport { config as loadEnv } from 'dotenv'\nimport { execa } from 'execa'\nimport pc from 'picocolors'\n\ndeclare global {\n namespace NodeJS {\n interface ProcessEnv {\n PORT: string\n KUBB_ROOT: string\n KUBB_STUDIO_URL: string\n KUBB_AGENT_TOKEN: string\n KUBB_CONFIG: string\n KUBB_AGENT_NO_CACHE: string\n KUBB_RETRY_TIMEOUT: string\n KUBB_ALLOW_WRITE: string\n KUBB_ALLOW_ALL: string\n }\n }\n}\n\nconst args = {\n config: {\n type: 'string',\n description: 'Path to the Kubb config',\n alias: 'c',\n },\n port: {\n type: 'string',\n description: 'Port for the server. If not specified, an available port is automatically selected.',\n alias: 'p',\n },\n host: {\n type: 'string',\n description: 'Host for the server',\n default: 'localhost',\n },\n 'no-cache': {\n type: 'boolean',\n description: 'Disable session caching',\n default: false,\n },\n 'allow-write': {\n type: 'boolean',\n description: 'Allow writing generated files to the filesystem. When not set, no files are written and the config patch is not persisted.',\n default: false,\n },\n 'allow-all': {\n type: 'boolean',\n description: 'Grant all permissions (implies --allow-write).',\n default: false,\n },\n} as const satisfies ArgsDef\n\ntype StartServerProps = {\n port: number\n host: string\n configPath: string\n noCache: boolean\n allowWrite: boolean\n allowAll: boolean\n}\n\nasync function startServer({ port, host, configPath, noCache, allowWrite, allowAll }: StartServerProps): Promise<void> {\n try {\n // Load .env files into process.env (supports .env, .env.local, .env.*.local)\n loadEnv() // .env\n\n // Resolve the @kubb/agent package path\n const agentPkgUrl = import.meta.resolve('@kubb/agent/package.json')\n const agentPkgPath = fileURLToPath(agentPkgUrl)\n const agentDir = path.dirname(agentPkgPath)\n const serverPath = path.join(agentDir, '.output', 'server', 'index.mjs')\n\n // nitro env\n const PORT = process.env.PORT || (port === 0 ? '3000' : String(port))\n const HOST = process.env.HOST || host || '0.0.0.0'\n\n // kubb env\n const KUBB_ROOT = process.env.KUBB_ROOT || process.cwd()\n const KUBB_CONFIG = process.env.KUBB_CONFIG || configPath || 'kubb.config.ts'\n const KUBB_AGENT_NO_CACHE = noCache ? 'true' : 'false'\n const KUBB_ALLOW_WRITE = allowAll || allowWrite ? 'true' : (process.env.KUBB_ALLOW_WRITE ?? 'false')\n const KUBB_ALLOW_ALL = allowAll ? 'true' : (process.env.KUBB_ALLOW_ALL ?? 'false')\n const KUBB_STUDIO_URL = process.env.KUBB_STUDIO_URL || 'https://studio.kubb.dev'\n const KUBB_AGENT_TOKEN = process.env.KUBB_AGENT_TOKEN\n const KUBB_RETRY_TIMEOUT = process.env.KUBB_RETRY_TIMEOUT || '30000'\n\n // Set environment variables\n const env = {\n KUBB_ROOT,\n KUBB_CONFIG,\n PORT,\n HOST,\n KUBB_STUDIO_URL,\n KUBB_RETRY_TIMEOUT,\n KUBB_AGENT_NO_CACHE,\n KUBB_AGENT_TOKEN,\n KUBB_ALLOW_WRITE,\n KUBB_ALLOW_ALL,\n }\n\n clack.log.step(pc.cyan('Starting agent server...'))\n clack.log.info(pc.dim(`Config: ${KUBB_CONFIG}`))\n clack.log.info(pc.dim(`Host: ${HOST}`))\n clack.log.info(pc.dim(`Port: ${PORT}`))\n if (noCache) {\n clack.log.info(pc.dim('Session caching: disabled'))\n }\n if (!allowWrite && !allowAll) {\n clack.log.warn(pc.yellow('Filesystem writes disabled. Use --allow-write or --allow-all to enable.'))\n }\n\n // Use execa to spawn the server process\n await execa('node', [serverPath], {\n env,\n stdio: 'inherit',\n cwd: process.cwd(),\n })\n } catch (error) {\n console.error('Failed to start agent server:', error)\n process.exit(1)\n }\n}\n\nconst command = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the Agent server',\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n\n try {\n const configPath = path.resolve(process.cwd(), args.config || 'kubb.config.ts')\n const port = args.port ? Number.parseInt(args.port, 10) : 0\n const host = args.host\n const noCache = args['no-cache']\n const allowWrite = args['allow-write']\n const allowAll = args['allow-all']\n\n await startServer({ port, host, configPath, noCache, allowWrite, allowAll })\n } catch (error) {\n clack.log.error(pc.red('Failed to start agent server'))\n console.error(error)\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;;;;;AA2BA,MAAM,OAAO;CACX,QAAQ;EACN,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,YAAY;EACV,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,eAAe;EACb,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,aAAa;EACX,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACF;AAWD,eAAe,YAAY,EAAE,MAAM,MAAM,YAAY,SAAS,YAAY,YAA6C;AACrH,KAAI;AAEF,UAAS;EAIT,MAAM,eAAe,cADD,OAAO,KAAK,QAAQ,2BAA2B,CACpB;EAC/C,MAAM,WAAW,KAAK,QAAQ,aAAa;EAC3C,MAAM,aAAa,KAAK,KAAK,UAAU,WAAW,UAAU,YAAY;EAGxE,MAAM,OAAOA,UAAQ,IAAI,SAAS,SAAS,IAAI,SAAS,OAAO,KAAK;EACpE,MAAM,OAAOA,UAAQ,IAAI,QAAQ,QAAQ;EAGzC,MAAM,YAAYA,UAAQ,IAAI,aAAaA,UAAQ,KAAK;EACxD,MAAM,cAAcA,UAAQ,IAAI,eAAe,cAAc;EAC7D,MAAM,sBAAsB,UAAU,SAAS;EAC/C,MAAM,mBAAmB,YAAY,aAAa,SAAUA,UAAQ,IAAI,oBAAoB;EAC5F,MAAM,iBAAiB,WAAW,SAAUA,UAAQ,IAAI,kBAAkB;EAC1E,MAAM,kBAAkBA,UAAQ,IAAI,mBAAmB;EACvD,MAAM,mBAAmBA,UAAQ,IAAI;EAIrC,MAAM,MAAM;GACV;GACA;GACA;GACA;GACA;GACA,oBATyBA,UAAQ,IAAI,sBAAsB;GAU3D;GACA;GACA;GACA;GACD;AAED,QAAM,IAAI,KAAK,GAAG,KAAK,2BAA2B,CAAC;AACnD,QAAM,IAAI,KAAK,GAAG,IAAI,WAAW,cAAc,CAAC;AAChD,QAAM,IAAI,KAAK,GAAG,IAAI,SAAS,OAAO,CAAC;AACvC,QAAM,IAAI,KAAK,GAAG,IAAI,SAAS,OAAO,CAAC;AACvC,MAAI,QACF,OAAM,IAAI,KAAK,GAAG,IAAI,4BAA4B,CAAC;AAErD,MAAI,CAAC,cAAc,CAAC,SAClB,OAAM,IAAI,KAAK,GAAG,OAAO,0EAA0E,CAAC;AAItG,QAAM,MAAM,QAAQ,CAAC,WAAW,EAAE;GAChC;GACA,OAAO;GACP,KAAKA,UAAQ,KAAK;GACnB,CAAC;UACK,OAAO;AACd,UAAQ,MAAM,iCAAiC,MAAM;AACrD,YAAQ,KAAK,EAAE;;;AAInB,MAAM,UAAU,cAAc;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD;CACA,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,iBAAS;AAEjB,MAAI;GACF,MAAM,aAAa,KAAK,QAAQA,UAAQ,KAAK,EAAEC,OAAK,UAAU,iBAAiB;GAC/E,MAAM,OAAOA,OAAK,OAAO,OAAO,SAASA,OAAK,MAAM,GAAG,GAAG;GAC1D,MAAM,OAAOA,OAAK;GAClB,MAAM,UAAUA,OAAK;GACrB,MAAM,aAAaA,OAAK;GACxB,MAAM,WAAWA,OAAK;AAEtB,SAAM,YAAY;IAAE;IAAM;IAAM;IAAY;IAAS;IAAY;IAAU,CAAC;WACrE,OAAO;AACd,SAAM,IAAI,MAAM,GAAG,IAAI,+BAA+B,CAAC;AACvD,WAAQ,MAAM,MAAM;AACpB,aAAQ,KAAK,EAAE;;;CAGpB,CAAC;AAEF,oBAAe"}
@@ -33,9 +33,19 @@ const args = {
33
33
  type: "boolean",
34
34
  description: "Disable session caching",
35
35
  default: false
36
+ },
37
+ "allow-write": {
38
+ type: "boolean",
39
+ description: "Allow writing generated files to the filesystem. When not set, no files are written and the config patch is not persisted.",
40
+ default: false
41
+ },
42
+ "allow-all": {
43
+ type: "boolean",
44
+ description: "Grant all permissions (implies --allow-write).",
45
+ default: false
36
46
  }
37
47
  };
38
- async function startServer({ port, host, configPath, noCache }) {
48
+ async function startServer({ port, host, configPath, noCache, allowWrite, allowAll }) {
39
49
  try {
40
50
  (0, dotenv.config)();
41
51
  const agentPkgPath = (0, node_url.fileURLToPath)({}.resolve("@kubb/agent/package.json"));
@@ -43,9 +53,11 @@ async function startServer({ port, host, configPath, noCache }) {
43
53
  const serverPath = node_path.default.join(agentDir, ".output", "server", "index.mjs");
44
54
  const PORT = node_process.env.PORT || (port === 0 ? "3000" : String(port));
45
55
  const HOST = node_process.env.HOST || host || "0.0.0.0";
46
- const KUBB_ROOT = node_process.env.KUBB_ROOT;
56
+ const KUBB_ROOT = node_process.env.KUBB_ROOT || node_process.cwd();
47
57
  const KUBB_CONFIG = node_process.env.KUBB_CONFIG || configPath || "kubb.config.ts";
48
58
  const KUBB_AGENT_NO_CACHE = noCache ? "true" : "false";
59
+ const KUBB_ALLOW_WRITE = allowAll || allowWrite ? "true" : node_process.env.KUBB_ALLOW_WRITE ?? "false";
60
+ const KUBB_ALLOW_ALL = allowAll ? "true" : node_process.env.KUBB_ALLOW_ALL ?? "false";
49
61
  const KUBB_STUDIO_URL = node_process.env.KUBB_STUDIO_URL || "https://studio.kubb.dev";
50
62
  const KUBB_AGENT_TOKEN = node_process.env.KUBB_AGENT_TOKEN;
51
63
  const env = {
@@ -56,13 +68,16 @@ async function startServer({ port, host, configPath, noCache }) {
56
68
  KUBB_STUDIO_URL,
57
69
  KUBB_RETRY_TIMEOUT: node_process.env.KUBB_RETRY_TIMEOUT || "30000",
58
70
  KUBB_AGENT_NO_CACHE,
59
- KUBB_AGENT_TOKEN
71
+ KUBB_AGENT_TOKEN,
72
+ KUBB_ALLOW_WRITE,
73
+ KUBB_ALLOW_ALL
60
74
  };
61
75
  _clack_prompts.log.step(picocolors.default.cyan("Starting agent server..."));
62
76
  _clack_prompts.log.info(picocolors.default.dim(`Config: ${KUBB_CONFIG}`));
63
77
  _clack_prompts.log.info(picocolors.default.dim(`Host: ${HOST}`));
64
78
  _clack_prompts.log.info(picocolors.default.dim(`Port: ${PORT}`));
65
79
  if (noCache) _clack_prompts.log.info(picocolors.default.dim("Session caching: disabled"));
80
+ if (!allowWrite && !allowAll) _clack_prompts.log.warn(picocolors.default.yellow("Filesystem writes disabled. Use --allow-write or --allow-all to enable."));
66
81
  await (0, execa.execa)("node", [serverPath], {
67
82
  env,
68
83
  stdio: "inherit",
@@ -86,11 +101,15 @@ const command = (0, citty.defineCommand)({
86
101
  const port = args$1.port ? Number.parseInt(args$1.port, 10) : 0;
87
102
  const host = args$1.host;
88
103
  const noCache = args$1["no-cache"];
104
+ const allowWrite = args$1["allow-write"];
105
+ const allowAll = args$1["allow-all"];
89
106
  await startServer({
90
107
  port,
91
108
  host,
92
109
  configPath,
93
- noCache
110
+ noCache,
111
+ allowWrite,
112
+ allowAll
94
113
  });
95
114
  } catch (error) {
96
115
  _clack_prompts.log.error(picocolors.default.red("Failed to start agent server"));
@@ -103,4 +122,4 @@ var start_default = command;
103
122
 
104
123
  //#endregion
105
124
  exports.default = start_default;
106
- //# sourceMappingURL=start-CktvgGht.cjs.map
125
+ //# sourceMappingURL=start-Dp1iN5KU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-Dp1iN5KU.cjs","names":["path","process","pc","args"],"sources":["../src/commands/agent/start.ts"],"sourcesContent":["import path from 'node:path'\nimport * as process from 'node:process'\nimport { fileURLToPath } from 'node:url'\n\nimport * as clack from '@clack/prompts'\nimport type { ArgsDef } from 'citty'\nimport { defineCommand } from 'citty'\nimport { config as loadEnv } from 'dotenv'\nimport { execa } from 'execa'\nimport pc from 'picocolors'\n\ndeclare global {\n namespace NodeJS {\n interface ProcessEnv {\n PORT: string\n KUBB_ROOT: string\n KUBB_STUDIO_URL: string\n KUBB_AGENT_TOKEN: string\n KUBB_CONFIG: string\n KUBB_AGENT_NO_CACHE: string\n KUBB_RETRY_TIMEOUT: string\n KUBB_ALLOW_WRITE: string\n KUBB_ALLOW_ALL: string\n }\n }\n}\n\nconst args = {\n config: {\n type: 'string',\n description: 'Path to the Kubb config',\n alias: 'c',\n },\n port: {\n type: 'string',\n description: 'Port for the server. If not specified, an available port is automatically selected.',\n alias: 'p',\n },\n host: {\n type: 'string',\n description: 'Host for the server',\n default: 'localhost',\n },\n 'no-cache': {\n type: 'boolean',\n description: 'Disable session caching',\n default: false,\n },\n 'allow-write': {\n type: 'boolean',\n description: 'Allow writing generated files to the filesystem. When not set, no files are written and the config patch is not persisted.',\n default: false,\n },\n 'allow-all': {\n type: 'boolean',\n description: 'Grant all permissions (implies --allow-write).',\n default: false,\n },\n} as const satisfies ArgsDef\n\ntype StartServerProps = {\n port: number\n host: string\n configPath: string\n noCache: boolean\n allowWrite: boolean\n allowAll: boolean\n}\n\nasync function startServer({ port, host, configPath, noCache, allowWrite, allowAll }: StartServerProps): Promise<void> {\n try {\n // Load .env files into process.env (supports .env, .env.local, .env.*.local)\n loadEnv() // .env\n\n // Resolve the @kubb/agent package path\n const agentPkgUrl = import.meta.resolve('@kubb/agent/package.json')\n const agentPkgPath = fileURLToPath(agentPkgUrl)\n const agentDir = path.dirname(agentPkgPath)\n const serverPath = path.join(agentDir, '.output', 'server', 'index.mjs')\n\n // nitro env\n const PORT = process.env.PORT || (port === 0 ? '3000' : String(port))\n const HOST = process.env.HOST || host || '0.0.0.0'\n\n // kubb env\n const KUBB_ROOT = process.env.KUBB_ROOT || process.cwd()\n const KUBB_CONFIG = process.env.KUBB_CONFIG || configPath || 'kubb.config.ts'\n const KUBB_AGENT_NO_CACHE = noCache ? 'true' : 'false'\n const KUBB_ALLOW_WRITE = allowAll || allowWrite ? 'true' : (process.env.KUBB_ALLOW_WRITE ?? 'false')\n const KUBB_ALLOW_ALL = allowAll ? 'true' : (process.env.KUBB_ALLOW_ALL ?? 'false')\n const KUBB_STUDIO_URL = process.env.KUBB_STUDIO_URL || 'https://studio.kubb.dev'\n const KUBB_AGENT_TOKEN = process.env.KUBB_AGENT_TOKEN\n const KUBB_RETRY_TIMEOUT = process.env.KUBB_RETRY_TIMEOUT || '30000'\n\n // Set environment variables\n const env = {\n KUBB_ROOT,\n KUBB_CONFIG,\n PORT,\n HOST,\n KUBB_STUDIO_URL,\n KUBB_RETRY_TIMEOUT,\n KUBB_AGENT_NO_CACHE,\n KUBB_AGENT_TOKEN,\n KUBB_ALLOW_WRITE,\n KUBB_ALLOW_ALL,\n }\n\n clack.log.step(pc.cyan('Starting agent server...'))\n clack.log.info(pc.dim(`Config: ${KUBB_CONFIG}`))\n clack.log.info(pc.dim(`Host: ${HOST}`))\n clack.log.info(pc.dim(`Port: ${PORT}`))\n if (noCache) {\n clack.log.info(pc.dim('Session caching: disabled'))\n }\n if (!allowWrite && !allowAll) {\n clack.log.warn(pc.yellow('Filesystem writes disabled. Use --allow-write or --allow-all to enable.'))\n }\n\n // Use execa to spawn the server process\n await execa('node', [serverPath], {\n env,\n stdio: 'inherit',\n cwd: process.cwd(),\n })\n } catch (error) {\n console.error('Failed to start agent server:', error)\n process.exit(1)\n }\n}\n\nconst command = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the Agent server',\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n\n try {\n const configPath = path.resolve(process.cwd(), args.config || 'kubb.config.ts')\n const port = args.port ? Number.parseInt(args.port, 10) : 0\n const host = args.host\n const noCache = args['no-cache']\n const allowWrite = args['allow-write']\n const allowAll = args['allow-all']\n\n await startServer({ port, host, configPath, noCache, allowWrite, allowAll })\n } catch (error) {\n clack.log.error(pc.red('Failed to start agent server'))\n console.error(error)\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;;;;;;;;;AA2BA,MAAM,OAAO;CACX,QAAQ;EACN,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,YAAY;EACV,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,eAAe;EACb,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,aAAa;EACX,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACF;AAWD,eAAe,YAAY,EAAE,MAAM,MAAM,YAAY,SAAS,YAAY,YAA6C;AACrH,KAAI;AAEF,sBAAS;EAIT,MAAM,8CAD0B,QAAQ,2BAA2B,CACpB;EAC/C,MAAM,WAAWA,kBAAK,QAAQ,aAAa;EAC3C,MAAM,aAAaA,kBAAK,KAAK,UAAU,WAAW,UAAU,YAAY;EAGxE,MAAM,OAAOC,aAAQ,IAAI,SAAS,SAAS,IAAI,SAAS,OAAO,KAAK;EACpE,MAAM,OAAOA,aAAQ,IAAI,QAAQ,QAAQ;EAGzC,MAAM,YAAYA,aAAQ,IAAI,aAAaA,aAAQ,KAAK;EACxD,MAAM,cAAcA,aAAQ,IAAI,eAAe,cAAc;EAC7D,MAAM,sBAAsB,UAAU,SAAS;EAC/C,MAAM,mBAAmB,YAAY,aAAa,SAAUA,aAAQ,IAAI,oBAAoB;EAC5F,MAAM,iBAAiB,WAAW,SAAUA,aAAQ,IAAI,kBAAkB;EAC1E,MAAM,kBAAkBA,aAAQ,IAAI,mBAAmB;EACvD,MAAM,mBAAmBA,aAAQ,IAAI;EAIrC,MAAM,MAAM;GACV;GACA;GACA;GACA;GACA;GACA,oBATyBA,aAAQ,IAAI,sBAAsB;GAU3D;GACA;GACA;GACA;GACD;AAED,iBAAM,IAAI,KAAKC,mBAAG,KAAK,2BAA2B,CAAC;AACnD,iBAAM,IAAI,KAAKA,mBAAG,IAAI,WAAW,cAAc,CAAC;AAChD,iBAAM,IAAI,KAAKA,mBAAG,IAAI,SAAS,OAAO,CAAC;AACvC,iBAAM,IAAI,KAAKA,mBAAG,IAAI,SAAS,OAAO,CAAC;AACvC,MAAI,QACF,gBAAM,IAAI,KAAKA,mBAAG,IAAI,4BAA4B,CAAC;AAErD,MAAI,CAAC,cAAc,CAAC,SAClB,gBAAM,IAAI,KAAKA,mBAAG,OAAO,0EAA0E,CAAC;AAItG,yBAAY,QAAQ,CAAC,WAAW,EAAE;GAChC;GACA,OAAO;GACP,KAAKD,aAAQ,KAAK;GACnB,CAAC;UACK,OAAO;AACd,UAAQ,MAAM,iCAAiC,MAAM;AACrD,eAAQ,KAAK,EAAE;;;AAInB,MAAM,mCAAwB;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD;CACA,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,iBAAS;AAEjB,MAAI;GACF,MAAM,aAAaD,kBAAK,QAAQC,aAAQ,KAAK,EAAEE,OAAK,UAAU,iBAAiB;GAC/E,MAAM,OAAOA,OAAK,OAAO,OAAO,SAASA,OAAK,MAAM,GAAG,GAAG;GAC1D,MAAM,OAAOA,OAAK;GAClB,MAAM,UAAUA,OAAK;GACrB,MAAM,aAAaA,OAAK;GACxB,MAAM,WAAWA,OAAK;AAEtB,SAAM,YAAY;IAAE;IAAM;IAAM;IAAY;IAAS;IAAY;IAAU,CAAC;WACrE,OAAO;AACd,kBAAM,IAAI,MAAMD,mBAAG,IAAI,+BAA+B,CAAC;AACvD,WAAQ,MAAM,MAAM;AACpB,gBAAQ,KAAK,EAAE;;;CAGpB,CAAC;AAEF,oBAAe"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/cli",
3
- "version": "4.26.0",
3
+ "version": "4.27.0",
4
4
  "description": "Command-line interface for Kubb, enabling easy generation of TypeScript, React-Query, Zod, and other code from OpenAPI specifications.",
5
5
  "keywords": [
6
6
  "cli",
@@ -55,7 +55,7 @@
55
55
  ],
56
56
  "dependencies": {
57
57
  "@clack/prompts": "^1.0.1",
58
- "chokidar": "^4.0.3",
58
+ "chokidar": "^5.0.0",
59
59
  "citty": "^0.1.6",
60
60
  "cosmiconfig": "^9.0.0",
61
61
  "dotenv": "^17.3.1",
@@ -67,15 +67,15 @@
67
67
  "seedrandom": "^3.0.5",
68
68
  "semver": "^7.7.4",
69
69
  "string-argv": "^0.3.2",
70
- "@kubb/core": "4.26.0"
70
+ "@kubb/core": "4.27.0"
71
71
  },
72
72
  "devDependencies": {
73
73
  "@types/seedrandom": "^3.0.8",
74
74
  "@types/semver": "^7.7.1",
75
75
  "source-map-support": "^0.5.21",
76
- "@kubb/agent": "4.26.0",
77
- "@kubb/mcp": "4.26.0",
78
- "@kubb/oas": "4.26.0"
76
+ "@kubb/agent": "4.27.0",
77
+ "@kubb/mcp": "4.27.0",
78
+ "@kubb/oas": "4.27.0"
79
79
  },
80
80
  "engines": {
81
81
  "node": ">=20"
@@ -19,6 +19,8 @@ declare global {
19
19
  KUBB_CONFIG: string
20
20
  KUBB_AGENT_NO_CACHE: string
21
21
  KUBB_RETRY_TIMEOUT: string
22
+ KUBB_ALLOW_WRITE: string
23
+ KUBB_ALLOW_ALL: string
22
24
  }
23
25
  }
24
26
  }
@@ -44,6 +46,16 @@ const args = {
44
46
  description: 'Disable session caching',
45
47
  default: false,
46
48
  },
49
+ 'allow-write': {
50
+ type: 'boolean',
51
+ description: 'Allow writing generated files to the filesystem. When not set, no files are written and the config patch is not persisted.',
52
+ default: false,
53
+ },
54
+ 'allow-all': {
55
+ type: 'boolean',
56
+ description: 'Grant all permissions (implies --allow-write).',
57
+ default: false,
58
+ },
47
59
  } as const satisfies ArgsDef
48
60
 
49
61
  type StartServerProps = {
@@ -51,9 +63,11 @@ type StartServerProps = {
51
63
  host: string
52
64
  configPath: string
53
65
  noCache: boolean
66
+ allowWrite: boolean
67
+ allowAll: boolean
54
68
  }
55
69
 
56
- async function startServer({ port, host, configPath, noCache }: StartServerProps): Promise<void> {
70
+ async function startServer({ port, host, configPath, noCache, allowWrite, allowAll }: StartServerProps): Promise<void> {
57
71
  try {
58
72
  // Load .env files into process.env (supports .env, .env.local, .env.*.local)
59
73
  loadEnv() // .env
@@ -69,9 +83,11 @@ async function startServer({ port, host, configPath, noCache }: StartServerProps
69
83
  const HOST = process.env.HOST || host || '0.0.0.0'
70
84
 
71
85
  // kubb env
72
- const KUBB_ROOT = process.env.KUBB_ROOT
86
+ const KUBB_ROOT = process.env.KUBB_ROOT || process.cwd()
73
87
  const KUBB_CONFIG = process.env.KUBB_CONFIG || configPath || 'kubb.config.ts'
74
88
  const KUBB_AGENT_NO_CACHE = noCache ? 'true' : 'false'
89
+ const KUBB_ALLOW_WRITE = allowAll || allowWrite ? 'true' : (process.env.KUBB_ALLOW_WRITE ?? 'false')
90
+ const KUBB_ALLOW_ALL = allowAll ? 'true' : (process.env.KUBB_ALLOW_ALL ?? 'false')
75
91
  const KUBB_STUDIO_URL = process.env.KUBB_STUDIO_URL || 'https://studio.kubb.dev'
76
92
  const KUBB_AGENT_TOKEN = process.env.KUBB_AGENT_TOKEN
77
93
  const KUBB_RETRY_TIMEOUT = process.env.KUBB_RETRY_TIMEOUT || '30000'
@@ -86,6 +102,8 @@ async function startServer({ port, host, configPath, noCache }: StartServerProps
86
102
  KUBB_RETRY_TIMEOUT,
87
103
  KUBB_AGENT_NO_CACHE,
88
104
  KUBB_AGENT_TOKEN,
105
+ KUBB_ALLOW_WRITE,
106
+ KUBB_ALLOW_ALL,
89
107
  }
90
108
 
91
109
  clack.log.step(pc.cyan('Starting agent server...'))
@@ -95,6 +113,9 @@ async function startServer({ port, host, configPath, noCache }: StartServerProps
95
113
  if (noCache) {
96
114
  clack.log.info(pc.dim('Session caching: disabled'))
97
115
  }
116
+ if (!allowWrite && !allowAll) {
117
+ clack.log.warn(pc.yellow('Filesystem writes disabled. Use --allow-write or --allow-all to enable.'))
118
+ }
98
119
 
99
120
  // Use execa to spawn the server process
100
121
  await execa('node', [serverPath], {
@@ -122,8 +143,10 @@ const command = defineCommand({
122
143
  const port = args.port ? Number.parseInt(args.port, 10) : 0
123
144
  const host = args.host
124
145
  const noCache = args['no-cache']
146
+ const allowWrite = args['allow-write']
147
+ const allowAll = args['allow-all']
125
148
 
126
- await startServer({ port, host, configPath, noCache })
149
+ await startServer({ port, host, configPath, noCache, allowWrite, allowAll })
127
150
  } catch (error) {
128
151
  clack.log.error(pc.red('Failed to start agent server'))
129
152
  console.error(error)
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-BYUts0Ye.cjs","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -1,6 +0,0 @@
1
- //#region package.json
2
- var version = "4.26.0";
3
-
4
- //#endregion
5
- export { version as t };
6
- //# sourceMappingURL=package-YJwLry7P.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-YJwLry7P.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"start-3QvnMf49.js","names":["process","args"],"sources":["../src/commands/agent/start.ts"],"sourcesContent":["import path from 'node:path'\nimport * as process from 'node:process'\nimport { fileURLToPath } from 'node:url'\n\nimport * as clack from '@clack/prompts'\nimport type { ArgsDef } from 'citty'\nimport { defineCommand } from 'citty'\nimport { config as loadEnv } from 'dotenv'\nimport { execa } from 'execa'\nimport pc from 'picocolors'\n\ndeclare global {\n namespace NodeJS {\n interface ProcessEnv {\n PORT: string\n KUBB_ROOT: string\n KUBB_STUDIO_URL: string\n KUBB_AGENT_TOKEN: string\n KUBB_CONFIG: string\n KUBB_AGENT_NO_CACHE: string\n KUBB_RETRY_TIMEOUT: string\n }\n }\n}\n\nconst args = {\n config: {\n type: 'string',\n description: 'Path to the Kubb config',\n alias: 'c',\n },\n port: {\n type: 'string',\n description: 'Port for the server. If not specified, an available port is automatically selected.',\n alias: 'p',\n },\n host: {\n type: 'string',\n description: 'Host for the server',\n default: 'localhost',\n },\n 'no-cache': {\n type: 'boolean',\n description: 'Disable session caching',\n default: false,\n },\n} as const satisfies ArgsDef\n\ntype StartServerProps = {\n port: number\n host: string\n configPath: string\n noCache: boolean\n}\n\nasync function startServer({ port, host, configPath, noCache }: StartServerProps): Promise<void> {\n try {\n // Load .env files into process.env (supports .env, .env.local, .env.*.local)\n loadEnv() // .env\n\n // Resolve the @kubb/agent package path\n const agentPkgUrl = import.meta.resolve('@kubb/agent/package.json')\n const agentPkgPath = fileURLToPath(agentPkgUrl)\n const agentDir = path.dirname(agentPkgPath)\n const serverPath = path.join(agentDir, '.output', 'server', 'index.mjs')\n\n // nitro env\n const PORT = process.env.PORT || (port === 0 ? '3000' : String(port))\n const HOST = process.env.HOST || host || '0.0.0.0'\n\n // kubb env\n const KUBB_ROOT = process.env.KUBB_ROOT\n const KUBB_CONFIG = process.env.KUBB_CONFIG || configPath || 'kubb.config.ts'\n const KUBB_AGENT_NO_CACHE = noCache ? 'true' : 'false'\n const KUBB_STUDIO_URL = process.env.KUBB_STUDIO_URL || 'https://studio.kubb.dev'\n const KUBB_AGENT_TOKEN = process.env.KUBB_AGENT_TOKEN\n const KUBB_RETRY_TIMEOUT = process.env.KUBB_RETRY_TIMEOUT || '30000'\n\n // Set environment variables\n const env = {\n KUBB_ROOT,\n KUBB_CONFIG,\n PORT,\n HOST,\n KUBB_STUDIO_URL,\n KUBB_RETRY_TIMEOUT,\n KUBB_AGENT_NO_CACHE,\n KUBB_AGENT_TOKEN,\n }\n\n clack.log.step(pc.cyan('Starting agent server...'))\n clack.log.info(pc.dim(`Config: ${KUBB_CONFIG}`))\n clack.log.info(pc.dim(`Host: ${HOST}`))\n clack.log.info(pc.dim(`Port: ${PORT}`))\n if (noCache) {\n clack.log.info(pc.dim('Session caching: disabled'))\n }\n\n // Use execa to spawn the server process\n await execa('node', [serverPath], {\n env,\n stdio: 'inherit',\n cwd: process.cwd(),\n })\n } catch (error) {\n console.error('Failed to start agent server:', error)\n process.exit(1)\n }\n}\n\nconst command = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the Agent server',\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n\n try {\n const configPath = path.resolve(process.cwd(), args.config || 'kubb.config.ts')\n const port = args.port ? Number.parseInt(args.port, 10) : 0\n const host = args.host\n const noCache = args['no-cache']\n\n await startServer({ port, host, configPath, noCache })\n } catch (error) {\n clack.log.error(pc.red('Failed to start agent server'))\n console.error(error)\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;;;;;AAyBA,MAAM,OAAO;CACX,QAAQ;EACN,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,YAAY;EACV,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACF;AASD,eAAe,YAAY,EAAE,MAAM,MAAM,YAAY,WAA4C;AAC/F,KAAI;AAEF,UAAS;EAIT,MAAM,eAAe,cADD,OAAO,KAAK,QAAQ,2BAA2B,CACpB;EAC/C,MAAM,WAAW,KAAK,QAAQ,aAAa;EAC3C,MAAM,aAAa,KAAK,KAAK,UAAU,WAAW,UAAU,YAAY;EAGxE,MAAM,OAAOA,UAAQ,IAAI,SAAS,SAAS,IAAI,SAAS,OAAO,KAAK;EACpE,MAAM,OAAOA,UAAQ,IAAI,QAAQ,QAAQ;EAGzC,MAAM,YAAYA,UAAQ,IAAI;EAC9B,MAAM,cAAcA,UAAQ,IAAI,eAAe,cAAc;EAC7D,MAAM,sBAAsB,UAAU,SAAS;EAC/C,MAAM,kBAAkBA,UAAQ,IAAI,mBAAmB;EACvD,MAAM,mBAAmBA,UAAQ,IAAI;EAIrC,MAAM,MAAM;GACV;GACA;GACA;GACA;GACA;GACA,oBATyBA,UAAQ,IAAI,sBAAsB;GAU3D;GACA;GACD;AAED,QAAM,IAAI,KAAK,GAAG,KAAK,2BAA2B,CAAC;AACnD,QAAM,IAAI,KAAK,GAAG,IAAI,WAAW,cAAc,CAAC;AAChD,QAAM,IAAI,KAAK,GAAG,IAAI,SAAS,OAAO,CAAC;AACvC,QAAM,IAAI,KAAK,GAAG,IAAI,SAAS,OAAO,CAAC;AACvC,MAAI,QACF,OAAM,IAAI,KAAK,GAAG,IAAI,4BAA4B,CAAC;AAIrD,QAAM,MAAM,QAAQ,CAAC,WAAW,EAAE;GAChC;GACA,OAAO;GACP,KAAKA,UAAQ,KAAK;GACnB,CAAC;UACK,OAAO;AACd,UAAQ,MAAM,iCAAiC,MAAM;AACrD,YAAQ,KAAK,EAAE;;;AAInB,MAAM,UAAU,cAAc;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD;CACA,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,iBAAS;AAEjB,MAAI;GACF,MAAM,aAAa,KAAK,QAAQA,UAAQ,KAAK,EAAEC,OAAK,UAAU,iBAAiB;GAC/E,MAAM,OAAOA,OAAK,OAAO,OAAO,SAASA,OAAK,MAAM,GAAG,GAAG;GAC1D,MAAM,OAAOA,OAAK;GAClB,MAAM,UAAUA,OAAK;AAErB,SAAM,YAAY;IAAE;IAAM;IAAM;IAAY;IAAS,CAAC;WAC/C,OAAO;AACd,SAAM,IAAI,MAAM,GAAG,IAAI,+BAA+B,CAAC;AACvD,WAAQ,MAAM,MAAM;AACpB,aAAQ,KAAK,EAAE;;;CAGpB,CAAC;AAEF,oBAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"start-CktvgGht.cjs","names":["path","process","pc","args"],"sources":["../src/commands/agent/start.ts"],"sourcesContent":["import path from 'node:path'\nimport * as process from 'node:process'\nimport { fileURLToPath } from 'node:url'\n\nimport * as clack from '@clack/prompts'\nimport type { ArgsDef } from 'citty'\nimport { defineCommand } from 'citty'\nimport { config as loadEnv } from 'dotenv'\nimport { execa } from 'execa'\nimport pc from 'picocolors'\n\ndeclare global {\n namespace NodeJS {\n interface ProcessEnv {\n PORT: string\n KUBB_ROOT: string\n KUBB_STUDIO_URL: string\n KUBB_AGENT_TOKEN: string\n KUBB_CONFIG: string\n KUBB_AGENT_NO_CACHE: string\n KUBB_RETRY_TIMEOUT: string\n }\n }\n}\n\nconst args = {\n config: {\n type: 'string',\n description: 'Path to the Kubb config',\n alias: 'c',\n },\n port: {\n type: 'string',\n description: 'Port for the server. If not specified, an available port is automatically selected.',\n alias: 'p',\n },\n host: {\n type: 'string',\n description: 'Host for the server',\n default: 'localhost',\n },\n 'no-cache': {\n type: 'boolean',\n description: 'Disable session caching',\n default: false,\n },\n} as const satisfies ArgsDef\n\ntype StartServerProps = {\n port: number\n host: string\n configPath: string\n noCache: boolean\n}\n\nasync function startServer({ port, host, configPath, noCache }: StartServerProps): Promise<void> {\n try {\n // Load .env files into process.env (supports .env, .env.local, .env.*.local)\n loadEnv() // .env\n\n // Resolve the @kubb/agent package path\n const agentPkgUrl = import.meta.resolve('@kubb/agent/package.json')\n const agentPkgPath = fileURLToPath(agentPkgUrl)\n const agentDir = path.dirname(agentPkgPath)\n const serverPath = path.join(agentDir, '.output', 'server', 'index.mjs')\n\n // nitro env\n const PORT = process.env.PORT || (port === 0 ? '3000' : String(port))\n const HOST = process.env.HOST || host || '0.0.0.0'\n\n // kubb env\n const KUBB_ROOT = process.env.KUBB_ROOT\n const KUBB_CONFIG = process.env.KUBB_CONFIG || configPath || 'kubb.config.ts'\n const KUBB_AGENT_NO_CACHE = noCache ? 'true' : 'false'\n const KUBB_STUDIO_URL = process.env.KUBB_STUDIO_URL || 'https://studio.kubb.dev'\n const KUBB_AGENT_TOKEN = process.env.KUBB_AGENT_TOKEN\n const KUBB_RETRY_TIMEOUT = process.env.KUBB_RETRY_TIMEOUT || '30000'\n\n // Set environment variables\n const env = {\n KUBB_ROOT,\n KUBB_CONFIG,\n PORT,\n HOST,\n KUBB_STUDIO_URL,\n KUBB_RETRY_TIMEOUT,\n KUBB_AGENT_NO_CACHE,\n KUBB_AGENT_TOKEN,\n }\n\n clack.log.step(pc.cyan('Starting agent server...'))\n clack.log.info(pc.dim(`Config: ${KUBB_CONFIG}`))\n clack.log.info(pc.dim(`Host: ${HOST}`))\n clack.log.info(pc.dim(`Port: ${PORT}`))\n if (noCache) {\n clack.log.info(pc.dim('Session caching: disabled'))\n }\n\n // Use execa to spawn the server process\n await execa('node', [serverPath], {\n env,\n stdio: 'inherit',\n cwd: process.cwd(),\n })\n } catch (error) {\n console.error('Failed to start agent server:', error)\n process.exit(1)\n }\n}\n\nconst command = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the Agent server',\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n\n try {\n const configPath = path.resolve(process.cwd(), args.config || 'kubb.config.ts')\n const port = args.port ? Number.parseInt(args.port, 10) : 0\n const host = args.host\n const noCache = args['no-cache']\n\n await startServer({ port, host, configPath, noCache })\n } catch (error) {\n clack.log.error(pc.red('Failed to start agent server'))\n console.error(error)\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,MAAM,OAAO;CACX,QAAQ;EACN,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,YAAY;EACV,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACF;AASD,eAAe,YAAY,EAAE,MAAM,MAAM,YAAY,WAA4C;AAC/F,KAAI;AAEF,sBAAS;EAIT,MAAM,8CAD0B,QAAQ,2BAA2B,CACpB;EAC/C,MAAM,WAAWA,kBAAK,QAAQ,aAAa;EAC3C,MAAM,aAAaA,kBAAK,KAAK,UAAU,WAAW,UAAU,YAAY;EAGxE,MAAM,OAAOC,aAAQ,IAAI,SAAS,SAAS,IAAI,SAAS,OAAO,KAAK;EACpE,MAAM,OAAOA,aAAQ,IAAI,QAAQ,QAAQ;EAGzC,MAAM,YAAYA,aAAQ,IAAI;EAC9B,MAAM,cAAcA,aAAQ,IAAI,eAAe,cAAc;EAC7D,MAAM,sBAAsB,UAAU,SAAS;EAC/C,MAAM,kBAAkBA,aAAQ,IAAI,mBAAmB;EACvD,MAAM,mBAAmBA,aAAQ,IAAI;EAIrC,MAAM,MAAM;GACV;GACA;GACA;GACA;GACA;GACA,oBATyBA,aAAQ,IAAI,sBAAsB;GAU3D;GACA;GACD;AAED,iBAAM,IAAI,KAAKC,mBAAG,KAAK,2BAA2B,CAAC;AACnD,iBAAM,IAAI,KAAKA,mBAAG,IAAI,WAAW,cAAc,CAAC;AAChD,iBAAM,IAAI,KAAKA,mBAAG,IAAI,SAAS,OAAO,CAAC;AACvC,iBAAM,IAAI,KAAKA,mBAAG,IAAI,SAAS,OAAO,CAAC;AACvC,MAAI,QACF,gBAAM,IAAI,KAAKA,mBAAG,IAAI,4BAA4B,CAAC;AAIrD,yBAAY,QAAQ,CAAC,WAAW,EAAE;GAChC;GACA,OAAO;GACP,KAAKD,aAAQ,KAAK;GACnB,CAAC;UACK,OAAO;AACd,UAAQ,MAAM,iCAAiC,MAAM;AACrD,eAAQ,KAAK,EAAE;;;AAInB,MAAM,mCAAwB;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD;CACA,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,iBAAS;AAEjB,MAAI;GACF,MAAM,aAAaD,kBAAK,QAAQC,aAAQ,KAAK,EAAEE,OAAK,UAAU,iBAAiB;GAC/E,MAAM,OAAOA,OAAK,OAAO,OAAO,SAASA,OAAK,MAAM,GAAG,GAAG;GAC1D,MAAM,OAAOA,OAAK;GAClB,MAAM,UAAUA,OAAK;AAErB,SAAM,YAAY;IAAE;IAAM;IAAM;IAAY;IAAS,CAAC;WAC/C,OAAO;AACd,kBAAM,IAAI,MAAMD,mBAAG,IAAI,+BAA+B,CAAC;AACvD,WAAQ,MAAM,MAAM;AACpB,gBAAQ,KAAK,EAAE;;;CAGpB,CAAC;AAEF,oBAAe"}