{"version":3,"file":"index.mjs","names":[],"sources":["../src/build-args.ts","../src/index.ts"],"sourcesContent":["/**\n * Version spec for the underlying CopilotKit CLI. Tracks `@latest` so\n * `create-ag-ui-app` always scaffolds with the current CopilotKit CLI rather\n * than freezing on a pinned major.\n */\nexport const COPILOTKIT_CLI_SPEC = \"copilotkit@latest\";\n\n/** Framework flags as parsed by commander, in selection-priority order. */\nexport interface FrameworkOptions {\n  langgraphPy?: boolean;\n  langgraphJs?: boolean;\n  crewaiFlows?: boolean;\n  mastra?: boolean;\n  ag2?: boolean;\n  llamaindex?: boolean;\n  agno?: boolean;\n  pydanticAi?: boolean;\n  adk?: boolean;\n}\n\n/**\n * Builds the argv passed to `npx` to invoke the CopilotKit CLI's `create`\n * command. Pure and exported so the mapping (and the version spec) is unit\n * tested without spawning a process.\n *\n * @param options - Parsed commander framework flags.\n * @param projectName - Validated project name.\n * @returns The argv array for `spawn(\"npx\", ...)`.\n */\nexport function buildCopilotKitCreateArgs(\n  options: FrameworkOptions,\n  projectName: string,\n): string[] {\n  const frameworkArgs: string[] = [];\n\n  if (options.langgraphPy) {\n    frameworkArgs.push(\"-f\", \"langgraph-py\");\n  } else if (options.langgraphJs) {\n    frameworkArgs.push(\"-f\", \"langgraph-js\");\n  } else if (options.crewaiFlows) {\n    frameworkArgs.push(\"-f\", \"flows\");\n  } else if (options.mastra) {\n    frameworkArgs.push(\"-f\", \"mastra\");\n  } else if (options.ag2) {\n    frameworkArgs.push(\"-f\", \"ag2\");\n  } else if (options.llamaindex) {\n    frameworkArgs.push(\"-f\", \"llamaindex\");\n  } else if (options.agno) {\n    frameworkArgs.push(\"-f\", \"agno\");\n  } else if (options.pydanticAi) {\n    frameworkArgs.push(\"-f\", \"pydantic-ai\");\n  } else if (options.adk) {\n    frameworkArgs.push(\"-f\", \"adk\");\n  }\n\n  return [COPILOTKIT_CLI_SPEC, \"create\", \"--no-banner\", \"-n\", projectName, ...frameworkArgs];\n}\n","#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport { spawn } from \"child_process\";\nimport { buildCopilotKitCreateArgs } from \"./build-args\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { downloadTemplate } from \"giget\";\n\nconst program = new Command();\n\n// Dark purple color\nconst PURPLE = \"\\x1b[35m\";\nconst RESET = \"\\x1b[0m\";\n\nfunction displayBanner() {\n  const banner = `\n${PURPLE}   █████╗  ██████╗       ██╗   ██╗ ██╗\n  ██╔══██╗██╔════╝       ██║   ██║ ██║\n  ███████║██║  ███╗█████╗██║   ██║ ██║\n  ██╔══██║██║   ██║╚════╝██║   ██║ ██║\n  ██║  ██║╚██████╔╝      ╚██████╔╝ ██║\n  ╚═╝  ╚═╝ ╚═════╝        ╚═════╝  ╚═╝\n${RESET}\n  Agent User Interactivity Protocol\n`;\n  console.log(banner);\n}\n\nconst description = `\nQuickly scaffold AG-UI enabled applications for your favorite agent frameworks.\n`;\n\nasync function createProject() {\n  displayBanner();\n\n  console.log(\"\\n~ Let's get started building an AG-UI powered user interactive agent ~\");\n  console.log(\"  Read more about AG-UI at https://ag-ui.com\\n\");\n\n  const options = program.opts();\n  const isFrameworkDefined = [\n    \"langgraphPy\",\n    \"langgraphJs\",\n    \"crewaiFlows\",\n    \"mastra\",\n    \"ag2\",\n    \"llamaindex\",\n    \"pydanticAi\",\n    \"agno\",\n    \"adk\",\n  ].some((flag) => options[flag]);\n\n  if (isFrameworkDefined) {\n    await handleCopilotKitNextJs();\n    return;\n  } else {\n    console.log(\"\");\n    console.log(\"To build an AG-UI app, you need to select a client.\");\n    console.log(\"\");\n  }\n\n  const answers = await inquirer.prompt([\n    {\n      type: \"list\",\n      name: \"client\",\n      message: \"What client do you want to use?\",\n      choices: [\n        \"CopilotKit/Next.js\",\n        \"CLI client\",\n        new inquirer.Separator(\" Other clients coming soon (SMS, Whatsapp, Slack ...)\"),\n      ],\n    },\n  ]);\n\n  switch (answers.client) {\n    case \"CopilotKit/Next.js\":\n      await handleCopilotKitNextJs();\n      break;\n    case \"CLI client\":\n      await handleCliClient();\n      break;\n    default:\n      break;\n  }\n}\n\nasync function handleCopilotKitNextJs() {\n  const options = program.opts();\n\n  const projectName = await inquirer.prompt([\n    {\n      type: \"input\",\n      name: \"name\",\n      message: \"What would you like to name your project?\",\n      default: \"my-ag-ui-app\",\n      validate: (input) => {\n        if (!input.trim()) {\n          return \"Project name cannot be empty\";\n        }\n        if (!/^[a-zA-Z0-9-_]+$/.test(input)) {\n          return \"Project name can only contain letters, numbers, hyphens, and underscores\";\n        }\n        return true;\n      },\n    },\n  ]);\n\n  const copilotkit = spawn(\"npx\", buildCopilotKitCreateArgs(options, projectName.name), {\n    stdio: \"inherit\",\n    shell: true,\n  });\n\n  copilotkit.on(\"close\", (code) => {\n    if (code !== 0) {\n      console.log(\"\\n❌ Project creation failed.\");\n    }\n  });\n}\n\nasync function handleCliClient() {\n  console.log(\"🔧 Setting up CLI client...\\n\");\n\n  // Get current package versions from the monorepo\n  console.log(\"🔍 Reading current package versions...\");\n  const versions = await getCurrentPackageVersions();\n  console.log(`📋 Found versions: ${Object.keys(versions).length} packages`);\n  Object.entries(versions).forEach(([name, version]) => {\n    console.log(`  - ${name}: ${version}`);\n  });\n  console.log(\"\");\n\n  const projectName = await inquirer.prompt([\n    {\n      type: \"input\",\n      name: \"name\",\n      message: \"What would you like to name your CLI project?\",\n      default: \"my-ag-ui-cli-app\",\n      validate: (input) => {\n        if (!input.trim()) {\n          return \"Project name cannot be empty\";\n        }\n        if (!/^[a-zA-Z0-9-_]+$/.test(input)) {\n          return \"Project name can only contain letters, numbers, hyphens, and underscores\";\n        }\n        return true;\n      },\n    },\n  ]);\n\n  try {\n    console.log(`📥 Downloading CLI client template: ${projectName.name}\\n`);\n\n    await downloadTemplate(\"gh:ag-ui-protocol/ag-ui/apps/client-cli-example\", {\n      dir: projectName.name,\n      install: false,\n    });\n\n    console.log(\"✅ CLI client template downloaded successfully!\");\n\n    // Update workspace dependencies with actual versions\n    console.log(\"\\n🔄 Updating workspace dependencies...\");\n    await updateWorkspaceDependencies(projectName.name, versions);\n\n    console.log(`\\n📁 Project created in: ${projectName.name}`);\n    console.log(\"\\n🚀 Next steps:\");\n    console.log(\"   export OPENAI_API_KEY='your-openai-api-key'\");\n    console.log(`   cd ${projectName.name}`);\n    console.log(\"   npm install\");\n    console.log(\"   npm run dev\");\n    console.log(\"\\n💡 Check the README.md for more information on how to use your CLI client!\");\n  } catch (error) {\n    console.log(\"❌ Failed to download CLI client template:\", error);\n    process.exit(1);\n  }\n}\n\n// Metadata\nprogram.name(\"create-ag-ui-app\").description(description).version(\"0.0.36\");\n\n// Add framework flags\nprogram\n  .option(\"--langgraph-py\", \"Use the LangGraph framework with Python\")\n  .option(\"--langgraph-js\", \"Use the LangGraph framework with JavaScript\")\n  .option(\"--crewai-flows\", \"Use the CrewAI framework with Flows\")\n  .option(\"--mastra\", \"Use the Mastra framework\")\n  .option(\"--pydantic-ai\", \"Use the Pydantic AI framework\")\n  .option(\"--llamaindex\", \"Use the LlamaIndex framework\")\n  .option(\"--agno\", \"Use the Agno framework\")\n  .option(\"--ag2\", \"Use the AG2 framework\")\n  .option(\"--adk\", \"Use the ADK framework\");\n\nprogram.action(async () => {\n  await createProject();\n});\n\nprogram.parse();\n\n// Utility functions\n\n// Helper function to get package versions from npmjs\nasync function getCurrentPackageVersions(): Promise<{ [key: string]: string }> {\n  const packages = [\"@ag-ui/client\", \"@ag-ui/core\", \"@ag-ui/mastra\"];\n  const versions: { [key: string]: string } = {};\n\n  for (const packageName of packages) {\n    try {\n      // Fetch package info from npm registry\n      const response = await fetch(`https://registry.npmjs.org/${packageName}`);\n      if (response.ok) {\n        const packageInfo = await response.json();\n        versions[packageName] = packageInfo[\"dist-tags\"]?.latest || \"latest\";\n        console.log(`  ✓ ${packageName}: ${versions[packageName]}`);\n      } else {\n        console.log(`  ⚠️  Could not fetch version for ${packageName}`);\n        // Fallback to latest\n        versions[packageName] = \"latest\";\n      }\n    } catch (error) {\n      console.log(`  ⚠️  Error fetching ${packageName}: ${error}`);\n      // Fallback to latest\n      versions[packageName] = \"latest\";\n    }\n  }\n\n  return versions;\n}\n\n// Function to update workspace dependencies in downloaded project\nasync function updateWorkspaceDependencies(\n  projectPath: string,\n  versions: { [key: string]: string },\n) {\n  const packageJsonPath = path.join(projectPath, \"package.json\");\n\n  try {\n    if (!fs.existsSync(packageJsonPath)) {\n      console.log(\"⚠️  No package.json found in downloaded project\");\n      return;\n    }\n\n    const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n    let updated = false;\n\n    // Update workspace dependencies with actual versions\n    if (packageJson.dependencies) {\n      for (const [depName, depVersion] of Object.entries(packageJson.dependencies)) {\n        if (\n          typeof depVersion === \"string\" &&\n          depVersion.startsWith(\"workspace:\") &&\n          versions[depName]\n        ) {\n          packageJson.dependencies[depName] = `^${versions[depName]}`;\n          updated = true;\n          console.log(`  📦 Updated ${depName}: workspace:* → ^${versions[depName]}`);\n        }\n      }\n    }\n\n    if (updated) {\n      fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + \"\\n\");\n      console.log(\"✅ Package.json updated with actual package versions!\");\n    } else {\n      console.log(\"📄 No workspace dependencies found to update\");\n    }\n  } catch (error) {\n    console.log(`❌ Error updating package.json: ${error}`);\n  }\n}\n"],"mappings":"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"}