create-agentmark 0.8.3 → 0.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9,34 +9,6 @@ import prompts2 from "prompts";
9
9
  import fs4 from "fs-extra";
10
10
  import * as path2 from "path";
11
11
 
12
- // src/utils/providers.ts
13
- var Providers = {
14
- openai: {
15
- label: "OpenAI",
16
- languageModels: [
17
- "gpt-4o",
18
- "gpt-4o-mini",
19
- "gpt-4",
20
- "gpt-5",
21
- "gpt-4-turbo",
22
- "gpt-3.5-turbo"
23
- ],
24
- imageModels: ["dall-e-3", "dall-e-2"],
25
- speechModels: ["tts-1", "tts-1-hd"]
26
- },
27
- anthropic: {
28
- label: "Anthropic",
29
- languageModels: [
30
- "claude-sonnet-4-20250514",
31
- "claude-opus-4-20250514",
32
- "claude-3-5-sonnet-20241022",
33
- "claude-3-5-haiku-20241022"
34
- ],
35
- imageModels: [],
36
- speechModels: []
37
- }
38
- };
39
-
40
12
  // src/utils/examples/templates/adapters.ts
41
13
  var createAdapterConfig = (provider) => {
42
14
  return {
@@ -599,7 +571,7 @@ var getAnimalDrawingPrompt = () => {
599
571
  return `---
600
572
  name: animal-drawing
601
573
  image_config:
602
- model_name: dall-e-3
574
+ model_name: openai/dall-e-3
603
575
  num_images: 1
604
576
  size: 1024x1024
605
577
  aspect_ratio: 1:1
@@ -701,7 +673,7 @@ var getStoryTellerPrompt = () => {
701
673
  return `---
702
674
  name: story-teller
703
675
  speech_config:
704
- model_name: tts-1-hd
676
+ model_name: openai/tts-1-hd
705
677
  voice: "nova"
706
678
  speed: 1.0
707
679
  output_format: "mp3"
@@ -774,13 +746,11 @@ var createExamplePrompts = (model, targetPath = ".", adapter = "ai-sdk") => {
774
746
 
775
747
  // src/utils/examples/templates/user-client-config.ts
776
748
  var getClientConfigContent = (options) => {
777
- const { provider, languageModels, adapter, deploymentMode = "cloud" } = options;
749
+ const { provider, adapter, deploymentMode = "cloud" } = options;
778
750
  const adapterConfig = getAdapterConfig(adapter, provider);
779
751
  const { modelRegistry, toolRegistry } = adapterConfig.classes;
780
752
  const isClaudeAgentSdk = adapter === "claude-agent-sdk";
781
753
  const providerImport = isClaudeAgentSdk ? "" : `import { ${provider} } from '@ai-sdk/${provider}';`;
782
- const extraModelRegs = provider === "openai" && !isClaudeAgentSdk ? `.registerModels(["dall-e-3"], (name: string) => ${provider}.image(name))
783
- .registerModels(["tts-1-hd"], (name: string) => ${provider}.speech(name))` : "";
784
754
  const loaderImport = deploymentMode === "cloud" ? `import { ApiLoader } from "@agentmark-ai/loader-api";` : `import { ApiLoader } from "@agentmark-ai/loader-api";
785
755
  import { FileLoader } from "@agentmark-ai/loader-file";`;
786
756
  const loaderSetup = deploymentMode === "cloud" ? ` // ApiLoader works for both development and production
@@ -810,8 +780,7 @@ import { FileLoader } from "@agentmark-ai/loader-file";`;
810
780
  return modelRegistry;
811
781
  }` : `function createModelRegistry() {
812
782
  const modelRegistry = new ${modelRegistry}()
813
- .registerModels(${JSON.stringify(languageModels)}, (name: string) => ${provider}(name))
814
- ${extraModelRegs};
783
+ .registerProviders({ ${provider} });
815
784
  return modelRegistry;
816
785
  }`;
817
786
  const adapterOptionsImport = isClaudeAgentSdk ? `
@@ -1147,7 +1116,7 @@ var setupMCPServer = (client, targetPath) => {
1147
1116
  var createExampleApp = async (client, targetPath = ".", apiKey = "", adapter = "ai-sdk", deploymentMode = "cloud", projectInfo = null, resolutions = []) => {
1148
1117
  try {
1149
1118
  const modelProvider = adapter === "claude-agent-sdk" ? "anthropic" : "openai";
1150
- const model = adapter === "claude-agent-sdk" ? "claude-sonnet-4-20250514" : "gpt-4o";
1119
+ const model = adapter === "claude-agent-sdk" ? "anthropic/claude-sonnet-4-20250514" : "openai/gpt-4o";
1151
1120
  const isExistingProject = projectInfo?.isExistingProject ?? false;
1152
1121
  if (isExistingProject) {
1153
1122
  console.log("Adding AgentMark to existing project...");
@@ -1159,10 +1128,9 @@ var createExampleApp = async (client, targetPath = ".", apiKey = "", adapter = "
1159
1128
  setupMCPServer(client, targetPath);
1160
1129
  createExamplePrompts(model, targetPath, adapter);
1161
1130
  console.log(`\u2705 Example prompts and datasets created in ${folderName}/agentmark/`);
1162
- const langModels = Providers[modelProvider].languageModels.slice(0, 1);
1163
1131
  fs4.writeFileSync(
1164
1132
  `${targetPath}/agentmark.client.ts`,
1165
- getClientConfigContent({ provider: modelProvider, languageModels: langModels, adapter, deploymentMode })
1133
+ getClientConfigContent({ provider: modelProvider, adapter, deploymentMode })
1166
1134
  );
1167
1135
  if (shouldMergeFile(".env", projectInfo, resolutions)) {
1168
1136
  const envVars = {};
@@ -1807,7 +1775,7 @@ htmlcov/
1807
1775
  };
1808
1776
  var createPythonApp = async (client, targetPath = ".", apiKey = "", deploymentMode = "cloud", adapter = "pydantic-ai", projectInfo = null, resolutions = []) => {
1809
1777
  try {
1810
- const model = adapter === "claude-agent-sdk" ? "claude-sonnet-4-20250514" : "gpt-4o";
1778
+ const model = adapter === "claude-agent-sdk" ? "anthropic/claude-sonnet-4-20250514" : "openai/gpt-4o";
1811
1779
  const adapterDisplayName = adapter === "claude-agent-sdk" ? "Claude Agent SDK" : "Pydantic AI";
1812
1780
  const isExistingProject = projectInfo?.isExistingProject ?? false;
1813
1781
  if (isExistingProject) {
@@ -2127,7 +2095,7 @@ var main = async () => {
2127
2095
  });
2128
2096
  adapter = response.adapter;
2129
2097
  }
2130
- config.builtInModels = adapter === "claude-agent-sdk" ? ["claude-sonnet-4-20250514"] : ["gpt-4o"];
2098
+ config.builtInModels = adapter === "claude-agent-sdk" ? ["anthropic/claude-sonnet-4-20250514"] : ["openai/gpt-4o"];
2131
2099
  const apiKeyName = adapter === "claude-agent-sdk" ? "Anthropic" : "OpenAI";
2132
2100
  let apiKey = "";
2133
2101
  const { providedApiKey } = await prompts2({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/examples/create-example-app.ts","../src/utils/providers.ts","../src/utils/examples/templates/adapters.ts","../src/utils/examples/templates/app-index.ts","../src/utils/examples/templates/env.ts","../src/utils/examples/templates/package-setup.ts","../src/utils/file-merge.ts","../src/utils/types.ts","../src/utils/examples/templates/tsconfig.ts","../src/utils/examples/templates/animal-drawing-prompt.ts","../src/utils/examples/templates/customer-support-prompt.ts","../src/utils/examples/templates/party-planner-prompt.ts","../src/utils/examples/templates/story-teller-prompt.ts","../src/utils/examples/templates/datasets.ts","../src/utils/examples/templates/example-prompts.ts","../src/utils/examples/templates/user-client-config.ts","../src/utils/conflict-resolution.ts","../src/utils/git-init.ts","../src/utils/examples/create-python-app.ts","../src/utils/project-detection.ts","../src/utils/package-manager.ts"],"sourcesContent":["import fs from \"fs-extra\";\nimport path from \"path\";\nimport prompts from \"prompts\";\nimport { createExampleApp } from \"./utils/examples/create-example-app\";\nimport { createPythonApp } from \"./utils/examples/create-python-app\";\nimport { detectProjectInfo, isCurrentDirectory } from \"./utils/project-detection.js\";\nimport { displayProjectDetectionSummary, promptForResolutions } from \"./utils/conflict-resolution.js\";\nimport type { ProjectInfo, ConflictResolution } from \"./utils/types.js\";\n\nconst parseArgs = () => {\n const args = process.argv.slice(2);\n let deploymentMode: \"cloud\" | \"static\" | undefined;\n let language: \"typescript\" | \"python\" | undefined;\n\n for (const arg of args) {\n if (arg === \"--cloud\") {\n deploymentMode = \"cloud\";\n } else if (arg === \"--self-host\") {\n deploymentMode = \"static\";\n } else if (arg === \"--python\") {\n language = \"python\";\n } else if (arg === \"--typescript\") {\n language = \"typescript\";\n }\n }\n\n return { deploymentMode, language };\n};\n\nconst main = async () => {\n const cliArgs = parseArgs();\n const config: any = {\n $schema:\n \"https://raw.githubusercontent.com/agentmark-ai/agentmark/refs/heads/main/packages/cli/agentmark.schema.json\",\n version: \"2.0.0\",\n mdxVersion: \"1.0\",\n agentmarkPath: \".\",\n };\n console.log(\"Initializing project.\");\n\n const { folderName } = await prompts({\n name: \"folderName\",\n type: \"text\",\n message: \"Where would you like to create your AgentMark app?\",\n initial: \"my-agentmark-app\",\n });\n\n // Determine target path - handle \".\" for current directory\n const isCurrentDir = isCurrentDirectory(folderName);\n const targetPath = isCurrentDir ? process.cwd() : path.resolve(folderName);\n\n // Create the target folder only if not using current directory\n if (!isCurrentDir) {\n fs.ensureDirSync(targetPath);\n }\n\n // Detect existing project\n const projectInfo: ProjectInfo = detectProjectInfo(targetPath);\n\n // Show detection summary if existing project found\n if (projectInfo.isExistingProject) {\n displayProjectDetectionSummary(projectInfo);\n }\n\n // Prompt for conflict resolutions if needed\n const resolutions: ConflictResolution[] = await promptForResolutions(projectInfo.conflictingFiles);\n\n // Language selection\n let language = cliArgs.language;\n if (!language) {\n const response = await prompts({\n name: \"language\",\n type: \"select\",\n message: \"Which language would you like to use?\",\n choices: [\n { title: \"TypeScript\", value: \"typescript\" },\n { title: \"Python\", value: \"python\" },\n ],\n });\n language = response.language;\n }\n\n // Adapter selection depends on language\n let adapter: string;\n if (language === \"python\") {\n const response = await prompts({\n name: \"adapter\",\n type: \"select\",\n message: \"Which adapter would you like to use?\",\n choices: [\n { title: \"Pydantic AI\", value: \"pydantic-ai\" },\n { title: \"Claude Agent SDK\", value: \"claude-agent-sdk\" },\n ],\n });\n adapter = response.adapter;\n } else {\n const response = await prompts({\n name: \"adapter\",\n type: \"select\",\n message: \"Which adapter would you like to use?\",\n choices: [\n { title: \"AI SDK (Vercel)\", value: \"ai-sdk\" },\n { title: \"Claude Agent SDK\", value: \"claude-agent-sdk\" },\n { title: \"Mastra\", value: \"mastra\" },\n ],\n });\n adapter = response.adapter;\n }\n\n // Set built-in models based on adapter\n config.builtInModels = adapter === 'claude-agent-sdk'\n ? ['claude-sonnet-4-20250514']\n : ['gpt-4o'];\n\n // Prompt for API key based on adapter\n const apiKeyName = adapter === 'claude-agent-sdk' ? 'Anthropic' : 'OpenAI';\n let apiKey = \"\";\n const { providedApiKey } = await prompts({\n name: \"providedApiKey\",\n type: \"password\",\n message: `Enter your ${apiKeyName} API key (or press Enter to skip):`,\n initial: \"\",\n });\n apiKey = providedApiKey || \"\";\n\n let deploymentMode = cliArgs.deploymentMode;\n if (!deploymentMode) {\n const response = await prompts({\n name: \"deploymentMode\",\n type: \"select\",\n message: \"Use AgentMark Cloud or manage yourself?\",\n choices: [\n {\n title: \"AgentMark Cloud (recommended)\",\n value: \"cloud\",\n description: \"Have AgentMark cloud manage prompts, datasets, traces, experiments, alerts & more\"\n },\n {\n title: \"Self-hosted\",\n value: \"static\",\n description: \"Self-manage your prompts, datasets, traces & experiments\"\n },\n ],\n });\n deploymentMode = response.deploymentMode;\n }\n\n const { client } = await prompts({\n name: \"client\",\n type: \"select\",\n message: \"Make your IDE an AgentMark expert\",\n choices: [\n { title: \"Claude Code\", value: \"claude-code\" },\n { title: \"Cursor\", value: \"cursor\" },\n { title: \"VS Code\", value: \"vscode\" },\n { title: \"Zed\", value: \"zed\" },\n { title: \"Skip\", value: \"skip\" },\n ],\n });\n\n if (language === \"python\") {\n await createPythonApp(client, targetPath, apiKey, deploymentMode, adapter, projectInfo, resolutions);\n } else {\n await createExampleApp(client, targetPath, apiKey, adapter, deploymentMode, projectInfo, resolutions);\n }\n\n // Generate agentmark.json based on conflict resolution\n const agentmarkJsonPath = path.join(targetPath, \"agentmark.json\");\n const agentmarkJsonResolution = resolutions.find((r) => r.path === \"agentmark.json\");\n\n // Write agentmark.json if it doesn't exist or if user chose to overwrite\n if (!fs.existsSync(agentmarkJsonPath) || agentmarkJsonResolution?.action === \"overwrite\") {\n fs.writeJsonSync(agentmarkJsonPath, config, { spaces: 2 });\n } else if (agentmarkJsonResolution?.action === \"skip\") {\n console.log(\"⏭️ Skipped agentmark.json (keeping existing file)\");\n }\n};\n\nmain().catch((error) => {\n console.error(\"Error:\", error);\n process.exit(1);\n});\n","import fs from \"fs-extra\";\nimport * as path from \"path\";\nimport { Providers } from \"../providers.js\";\nimport {\n setupPackageJson,\n installDependencies,\n getIndexFileContent,\n getTsConfigContent,\n getEnvFileContent,\n createExamplePrompts,\n getClientConfigContent,\n getAdapterConfig,\n} from \"./templates/index.js\";\nimport { fetchPromptsFrontmatter, generateTypeDefinitions } from \"@agentmark-ai/shared-utils\";\nimport { appendGitignore, appendEnv } from \"../file-merge.js\";\nimport { shouldMergeFile } from \"../conflict-resolution.js\";\nimport type { ProjectInfo, ConflictResolution } from \"../types.js\";\nimport { initGitRepo } from \"../git-init.js\";\n\nconst setupMCPServer = (client: string, targetPath: string) => {\n if (client === \"skip\") {\n console.log(\"Skipping MCP server setup.\");\n return;\n }\n\n // Keep ./ prefix for display in messages\n const folderName = targetPath;\n\n // Handle VS Code\n if (client === \"vscode\") {\n try {\n console.log(`Setting up MCP server for VS Code in ${folderName}...`);\n const vscodeDir = path.join(targetPath, \".vscode\");\n fs.ensureDirSync(vscodeDir);\n\n const mcpConfig = {\n servers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(vscodeDir, \"mcp.json\"), mcpConfig, { spaces: 2 });\n console.log(`✅ MCP server configured for VS Code in ${folderName}/.vscode/mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for VS Code:`, error);\n console.log(\"See https://docs.agentmark.co/agentmark/further_reference/agentmark-mcp for setup instructions.\");\n }\n return;\n }\n\n // Handle Zed\n if (client === \"zed\") {\n try {\n console.log(`Setting up MCP server for Zed in ${folderName}...`);\n const zedDir = path.join(targetPath, \".zed\");\n fs.ensureDirSync(zedDir);\n\n const zedConfig = {\n context_servers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(zedDir, \"settings.json\"), zedConfig, { spaces: 2 });\n console.log(`✅ MCP server configured for Zed in ${folderName}/.zed/settings.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Zed:`, error);\n console.log(\"See https://docs.agentmark.co/agentmark/further_reference/agentmark-mcp for setup instructions.\");\n }\n return;\n }\n\n // Handle Cursor\n if (client === \"cursor\") {\n try {\n console.log(`Setting up MCP server for Cursor in ${folderName}...`);\n const cursorDir = path.join(targetPath, \".cursor\");\n fs.ensureDirSync(cursorDir);\n\n const cursorConfig = {\n mcpServers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(cursorDir, \"mcp.json\"), cursorConfig, { spaces: 2 });\n console.log(`✅ MCP server configured for Cursor in ${folderName}/.cursor/mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Cursor:`, error);\n console.log(\"See https://docs.agentmark.co/agentmark/further_reference/agentmark-mcp for setup instructions.\");\n }\n return;\n }\n\n // Handle Claude Code\n if (client === \"claude-code\") {\n try {\n console.log(`Setting up MCP server for Claude Code in ${folderName}...`);\n\n const mcpConfig = {\n mcpServers: {\n \"agentmark-docs\": {\n type: \"http\",\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(targetPath, \".mcp.json\"), mcpConfig, { spaces: 2 });\n console.log(`✅ MCP server configured for Claude Code in ${folderName}/.mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Claude Code:`, error);\n console.log(\"See https://docs.agentmark.co/agentmark/further_reference/agentmark-mcp for setup instructions.\");\n }\n return;\n }\n};\n\n\nexport const createExampleApp = async (\n client: string,\n targetPath: string = \".\",\n apiKey: string = \"\",\n adapter: string = \"ai-sdk\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n projectInfo: ProjectInfo | null = null,\n resolutions: ConflictResolution[] = []\n) => {\n try {\n const modelProvider = adapter === 'claude-agent-sdk' ? 'anthropic' : 'openai';\n const model = adapter === 'claude-agent-sdk' ? 'claude-sonnet-4-20250514' : 'gpt-4o';\n const isExistingProject = projectInfo?.isExistingProject ?? false;\n\n if (isExistingProject) {\n console.log(\"Adding AgentMark to existing project...\");\n } else {\n console.log(\"Creating AgentMark example app...\");\n }\n\n // Keep ./ prefix for display in messages\n const folderName = targetPath;\n\n // Create directory structure\n fs.ensureDirSync(`${targetPath}/agentmark`);\n\n setupMCPServer(client, targetPath);\n\n // Create example prompts\n createExamplePrompts(model, targetPath, adapter);\n console.log(`✅ Example prompts and datasets created in ${folderName}/agentmark/`);\n\n // Create user client config at project root\n // Prefer TS for dev ergonomics\n const langModels = Providers[modelProvider as keyof typeof Providers].languageModels.slice(0, 1);\n fs.writeFileSync(\n `${targetPath}/agentmark.client.ts`,\n getClientConfigContent({ provider: modelProvider, languageModels: langModels, adapter, deploymentMode })\n );\n\n // Create or append to .env file\n if (shouldMergeFile('.env', projectInfo, resolutions)) {\n const envVars: Record<string, string> = {};\n const apiKeyEnvVar = adapter === 'claude-agent-sdk' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n if (apiKey) {\n envVars[apiKeyEnvVar] = apiKey;\n } else {\n envVars[apiKeyEnvVar] = adapter === 'claude-agent-sdk' ? 'your-anthropic-api-key' : 'your-openai-api-key';\n }\n const result = appendEnv(targetPath, envVars);\n if (result.added.length > 0) {\n console.log(`✅ Added to .env: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Skipped existing .env vars: ${result.skipped.join(', ')}`);\n }\n } else {\n fs.writeFileSync(`${targetPath}/.env`, getEnvFileContent(modelProvider, apiKey, adapter));\n }\n\n // Create or append to .gitignore\n // Note: .agentmark/ removed - dev-entry.ts is now at project root for version control\n const gitignoreEntries = ['node_modules/', '.env', '*.agentmark-outputs/', 'dist/'];\n if (shouldMergeFile('.gitignore', projectInfo, resolutions)) {\n const result = appendGitignore(targetPath, gitignoreEntries);\n if (result.added.length > 0) {\n console.log(`✅ Added to .gitignore: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Already in .gitignore: ${result.skipped.join(', ')}`);\n }\n } else {\n const gitignore = gitignoreEntries.join('\\n');\n fs.writeFileSync(`${targetPath}/.gitignore`, gitignore);\n }\n\n // Create the main application file (skip for existing projects)\n if (!isExistingProject) {\n fs.writeFileSync(\n `${targetPath}/index.ts`,\n getIndexFileContent(adapter, deploymentMode)\n );\n } else {\n console.log(\"⏭️ Skipped index.ts (existing project)\");\n }\n\n // Create tsconfig.json (skip for existing projects)\n if (!isExistingProject) {\n fs.writeJsonSync(`${targetPath}/tsconfig.json`, getTsConfigContent(), { spaces: 2 });\n } else {\n console.log(\"⏭️ Skipped tsconfig.json (existing project)\");\n }\n\n // Setup package.json and install dependencies\n const packageManager = projectInfo?.packageManager ?? null;\n setupPackageJson(targetPath, deploymentMode, projectInfo);\n installDependencies(modelProvider, targetPath, adapter, deploymentMode, packageManager);\n\n // Generate types file using the type generation library\n console.log(\"Generating types from prompts...\");\n try {\n const agentmarkDir = path.join(targetPath, 'agentmark');\n const prompts = await fetchPromptsFrontmatter({ rootDir: agentmarkDir });\n const typeDefinitions = await generateTypeDefinitions(prompts);\n fs.writeFileSync(`${targetPath}/agentmark.types.ts`, typeDefinitions);\n } catch (error) {\n console.warn(\"Warning: Could not generate types automatically:\", error);\n console.log(\"You can generate types later by running: npx agentmark generate-types --root-dir agentmark\");\n // Create a placeholder types file\n fs.writeFileSync(`${targetPath}/agentmark.types.ts`, `// Auto-generated types from AgentMark\\n// Run 'npx agentmark generate-types --root-dir agentmark' to generate types\\nexport default interface AgentmarkTypes {}\\n`);\n }\n\n // Create dev-entry.ts at project root (version controlled)\n console.log(\"Creating development server entry point...\");\n\n // Get adapter-specific values from config\n const adapterConfig = getAdapterConfig(adapter, modelProvider);\n const { webhookHandler } = adapterConfig.classes;\n\n const devEntryPath = path.join(targetPath, 'dev-entry.ts');\n\n const devEntryContent = `// Development webhook server entry point\n// This file is version controlled - customize as needed for your project\n\nimport { createWebhookServer } from '@agentmark-ai/cli/runner-server';\nimport { ${webhookHandler} } from '${adapterConfig.package}/runner';\nimport { AgentMarkSDK } from '@agentmark-ai/sdk';\nimport path from 'path';\n\nasync function main() {\n const args = process.argv.slice(2);\n const webhookPortArg = args.find(arg => arg.startsWith('--webhook-port='));\n const apiServerPortArg = args.find(arg => arg.startsWith('--api-server-port='));\n\n const webhookPort = webhookPortArg ? parseInt(webhookPortArg.split('=')[1]) : 9417;\n const apiServerPort = apiServerPortArg ? parseInt(apiServerPortArg.split('=')[1]) : 9418;\n const apiServerUrl = \\`http://localhost:\\${apiServerPort}\\`;\n\n // Set environment for development mode before importing client\n process.env.NODE_ENV = 'development';\n process.env.AGENTMARK_BASE_URL = apiServerUrl;\n\n // Now import client - it will pick up the dev environment\n const { client } = await import('./agentmark.client.js');\n\n // Initialize OpenTelemetry tracing to export traces to the API server\n const sdk = new AgentMarkSDK({\n apiKey: '',\n appId: '',\n baseUrl: apiServerUrl,\n });\n sdk.initTracing({ disableBatch: true });\n\n const handler = new ${webhookHandler}(client as any);\n const templatesDirectory = path.join(process.cwd(), 'agentmark');\n\n await createWebhookServer({\n port: webhookPort,\n handler,\n apiServerUrl,\n templatesDirectory\n });\n}\n\nmain().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n`;\n\n // Only create dev-entry.ts if it doesn't exist (preserve existing customizations - FR-003)\n if (fs.existsSync(devEntryPath)) {\n console.log(\"⏭️ Skipped dev-entry.ts (already exists - preserving customizations)\");\n } else {\n fs.writeFileSync(devEntryPath, devEntryContent);\n console.log(`✅ Created dev-entry.ts at project root`);\n }\n\n // Initialize git repo for new projects\n if (!isExistingProject) {\n initGitRepo(targetPath);\n }\n\n // Success message\n console.log(\"\\n✅ Agentmark initialization completed successfully!\");\n\n console.log(\n `\n █████╗ ██████╗ ███████╗███╗ ██╗████████╗███╗ ███╗ █████╗ ██████╗ ██╗ ██╗\n██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝████╗ ████║██╔══██╗██╔══██╗██║ ██╔╝\n███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ██╔████╔██║███████║██████╔╝█████╔╝\n██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗\n██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ██║ ╚═╝ ██║██║ ██║██║ ██║██║ ██╗\n╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝\n\n `\n );\n\n console.log('\\n' + '═'.repeat(70));\n console.log('Next Steps');\n console.log('═'.repeat(70));\n\n // Use detected package manager for instructions\n const runCmd = packageManager?.runCmd ?? 'npm run';\n\n // Check if agentmark script was namespaced\n const pkgJsonPath = path.join(targetPath, 'package.json');\n let agentmarkScriptName = 'agentmark';\n if (fs.existsSync(pkgJsonPath)) {\n const pkgJson = fs.readJsonSync(pkgJsonPath);\n if (pkgJson.scripts?.['agentmark:agentmark']) {\n agentmarkScriptName = 'agentmark:agentmark';\n }\n }\n\n console.log('\\n Get Started:');\n if (folderName !== \".\" && folderName !== \"./\" && !isExistingProject) {\n console.log(` $ cd ${folderName}`);\n }\n console.log(` $ ${runCmd} ${agentmarkScriptName} dev\\n`);\n\n console.log('─'.repeat(70));\n console.log('Resources');\n console.log('─'.repeat(70));\n console.log(' Documentation: https://docs.agentmark.co');\n console.log('═'.repeat(70) + '\\n');\n } catch (error) {\n console.error(\"Error creating example app:\", error);\n throw error;\n }\n};\n","export const Providers = {\n openai: {\n label: \"OpenAI\",\n languageModels: [\n \"gpt-4o\",\n \"gpt-4o-mini\",\n \"gpt-4\",\n \"gpt-5\",\n \"gpt-4-turbo\",\n \"gpt-3.5-turbo\",\n ],\n imageModels: [\"dall-e-3\", \"dall-e-2\"],\n speechModels: [\"tts-1\", \"tts-1-hd\"],\n },\n anthropic: {\n label: \"Anthropic\",\n languageModels: [\n \"claude-sonnet-4-20250514\",\n \"claude-opus-4-20250514\",\n \"claude-3-5-sonnet-20241022\",\n \"claude-3-5-haiku-20241022\",\n ],\n imageModels: [],\n speechModels: [],\n },\n};\n","export interface AdapterConfig {\n /** npm package name for the adapter */\n package: string;\n /** Additional npm packages required by this adapter */\n dependencies: string[];\n /** Class names used in generated code */\n classes: {\n modelRegistry: string;\n toolRegistry: string;\n webhookHandler: string;\n };\n}\n\nexport const createAdapterConfig = (\n provider: string\n): Record<string, AdapterConfig> => {\n return {\n \"ai-sdk\": {\n package: \"@agentmark-ai/ai-sdk-v5-adapter\",\n dependencies: [\"ai@^5\", `@ai-sdk/${provider}@^2`],\n classes: {\n modelRegistry: \"VercelAIModelRegistry\",\n toolRegistry: \"VercelAIToolRegistry\",\n webhookHandler: \"VercelAdapterWebhookHandler\",\n },\n },\n mastra: {\n package: \"@agentmark-ai/mastra-v0-adapter\",\n dependencies: [\n \"@mastra/core@<0.20.0\",\n \"@mastra/mcp@<0.13.4\",\n `@ai-sdk/${provider}@<2`,\n ],\n classes: {\n modelRegistry: \"MastraModelRegistry\",\n toolRegistry: \"MastraToolRegistry\",\n webhookHandler: \"MastraAdapterWebhookHandler\",\n },\n },\n \"claude-agent-sdk\": {\n package: \"@agentmark-ai/claude-agent-sdk-adapter\",\n dependencies: [\"@anthropic-ai/claude-agent-sdk@^0.1.0\"],\n classes: {\n modelRegistry: \"ClaudeAgentModelRegistry\",\n toolRegistry: \"ClaudeAgentToolRegistry\",\n webhookHandler: \"ClaudeAgentWebhookHandler\",\n },\n },\n };\n};\n\nexport function getAdapterConfig(\n adapter: string,\n provider: string\n): AdapterConfig {\n const config = createAdapterConfig(provider)[adapter];\n if (!config) {\n throw new Error(\n `Unknown adapter: ${adapter}. Available adapters: ${Object.keys(\n createAdapterConfig(provider)\n ).join(\", \")}`\n );\n }\n return config;\n}\n","export const getIndexFileContent = (adapter: string = \"ai-sdk\", deploymentMode: \"cloud\" | \"static\" = \"cloud\"): string => {\n const isCloud = deploymentMode === \"cloud\";\n\n const tracingImport = `import { AgentMarkSDK } from \"@agentmark-ai/sdk\";\n`;\n\n const cloudTracingInit = `\n// Initialize tracing - traces will be sent to AgentMark Cloud\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: process.env.AGENTMARK_API_KEY ?? \"\",\n appId: process.env.AGENTMARK_APP_ID ?? \"\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const staticTracingInit = `\n// Initialize tracing - traces will be sent to local dev server\n// Make sure to run \"npm run agentmark dev\" in another terminal first\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: \"\",\n appId: \"\",\n baseUrl: \"http://localhost:9418\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const tracingInit = isCloud ? cloudTracingInit : staticTracingInit;\n\n if (adapter === \"claude-agent-sdk\") {\n return `import \"dotenv/config\";\nimport { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { withTracing } from \"@agentmark-ai/claude-agent-sdk-adapter\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const adapted = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n // Execute with Claude Agent SDK using withTracing for telemetry\n // The adapted object contains { query, telemetry } ready for withTracing()\n const tracedResult = await withTracing(query, adapted);\n\n // traceId is available immediately\n console.log(\"Trace ID:\", tracedResult.traceId);\n\n let result = \"\";\n for await (const message of tracedResult) {\n if (message.type === \"result\" && message.subtype === \"success\") {\n result = message.result || \"\";\n }\n }\n\n return result;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else if (adapter === \"mastra\") {\n return `import \"dotenv/config\";\nimport { Agent } from \"@mastra/core/agent\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const agentConfig = await prompt.formatAgent({\n options: {\n telemetry,\n },\n });\n\n const [messages, generateOptions] = await agentConfig.formatMessages({\n props: {\n customer_question: customer_message,\n },\n });\n\n const agent = new Agent(agentConfig);\n const response = await agent.generate(messages, generateOptions);\n\n return (response as any).text || (response as any).content || String(response);\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else {\n return `import \"dotenv/config\";\nimport { generateText } from \"ai\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const vercelInput = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n const resp = await generateText(vercelInput);\n\n return resp.text;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n }\n};\n","export const getEnvFileContent = (\n _modelProvider: string,\n apiKey: string = '',\n adapter: string = 'ai-sdk'\n): string => {\n const apiKeyValue = apiKey || 'your_api_key_here';\n\n // Use ANTHROPIC_API_KEY for claude-agent-sdk adapter\n const apiKeyName = adapter === 'claude-agent-sdk' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n\n return `# Cloud deployment: Set these environment variables\n# AGENTMARK_BASE_URL=https://api.agentmark.co\n# AGENTMARK_API_KEY=your_agentmark_api_key\n# AGENTMARK_APP_ID=your_agentmark_app_id\n# Learn more: https://docs.agentmark.co/platform/getting_started/quickstart\n\n${apiKeyName}=${apiKeyValue}\n`;\n};\n","import fs from \"fs-extra\";\nimport { execSync } from \"child_process\";\nimport { getAdapterConfig } from \"./adapters.js\";\nimport { mergePackageJson } from \"../../file-merge.js\";\nimport { DEFAULT_PACKAGE_MANAGER } from \"../../types.js\";\nimport type { ProjectInfo, PackageManagerConfig } from \"../../types.js\";\n\nexport const setupPackageJson = (\n targetPath: string = \".\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n projectInfo: ProjectInfo | null = null\n) => {\n const packageJsonPath = `${targetPath}/package.json`;\n const isExistingProject = projectInfo?.isExistingProject ?? false;\n\n if (!fs.existsSync(packageJsonPath)) {\n console.log(\"Creating package.json...\");\n execSync(\"npm init -y\", { cwd: targetPath });\n }\n\n // For existing projects, use merge logic\n if (isExistingProject && fs.existsSync(packageJsonPath)) {\n // Build scripts to add - with namespacing for conflicts\n const scriptsToAdd: Record<string, string> = {\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n if (deploymentMode === \"static\") {\n scriptsToAdd[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n // Use mergePackageJson for existing projects\n const result = mergePackageJson(targetPath, {}, {}, scriptsToAdd);\n\n if (result.added.length > 0) {\n console.log(`✅ Added to package.json: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Skipped existing in package.json: ${result.skipped.join(', ')}`);\n }\n if (result.warnings.length > 0) {\n result.warnings.forEach((w) => console.log(`⚠️ ${w}`));\n }\n } else {\n // Update the created package.json with additional information\n const pkgJson = fs.readJsonSync(packageJsonPath);\n pkgJson.name =\n pkgJson.name === \"test\" || !pkgJson.name\n ? \"agentmark-example-app\"\n : pkgJson.name;\n pkgJson.description =\n pkgJson.description || \"A simple Node.js app using the Agentmark SDK\";\n\n // Base scripts for all modes\n const scripts: Record<string, string> = {\n ...pkgJson.scripts,\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n // For static/self-hosted mode, add the build script\n if (deploymentMode === \"static\") {\n scripts[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n pkgJson.scripts = scripts;\n\n fs.writeJsonSync(packageJsonPath, pkgJson, { spaces: 2 });\n }\n};\n\nexport const installDependencies = (\n modelProvider: string,\n targetPath: string = \".\",\n adapter: string = \"ai-sdk\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n packageManager: PackageManagerConfig | null = null\n) => {\n console.log(\"Installing required packages...\");\n console.log(\"This might take a moment...\");\n\n const adapterConfig = getAdapterConfig(adapter, modelProvider);\n\n // Use detected package manager or default to npm\n const pm = packageManager || DEFAULT_PACKAGE_MANAGER;\n\n // npm needs --legacy-peer-deps due to some transitive dependency conflicts\n const npmSuffix = pm.name === 'npm' ? ' --legacy-peer-deps' : '';\n\n try {\n // Dev dependencies to install\n const devDeps = ['typescript', 'ts-node', '@types/node', '@agentmark-ai/cli'];\n\n // Install dev dependencies using detected package manager config\n const devDepsCmd = `${pm.addDevCmd} ${devDeps.join(' ')}${npmSuffix}`;\n\n console.log(`Using ${pm.name} to install dependencies...`);\n\n execSync(devDepsCmd, {\n stdio: \"inherit\",\n cwd: targetPath,\n });\n\n // Install the common packages\n // SDK is required for both local (connects to agentmark serve) and cloud (connects to API)\n // Loader packages are imported directly - ApiLoader always needed, FileLoader only for static mode\n const loaderPackages = deploymentMode === \"static\"\n ? [\"@agentmark-ai/loader-api\", \"@agentmark-ai/loader-file\"]\n : [\"@agentmark-ai/loader-api\"];\n\n const deps = [\n \"dotenv\",\n \"@agentmark-ai/prompt-core\",\n \"@agentmark-ai/sdk\",\n adapterConfig.package,\n ...loaderPackages,\n ...adapterConfig.dependencies,\n ];\n\n // Install regular dependencies using detected package manager config\n const depsCmd = `${pm.addCmd} ${deps.join(' ')}${npmSuffix}`;\n\n execSync(depsCmd, { stdio: \"inherit\", cwd: targetPath });\n\n console.log(\"Packages installed successfully!\");\n } catch (error) {\n console.error(\"Error installing packages:\", error);\n throw new Error(\n \"Failed to install required packages. Please check your network connection and try again.\"\n );\n }\n};\n","/**\n * File merge utilities for handling existing files during initialization.\n * Supports merging package.json, appending to .gitignore and .env files.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport type { MergeResult } from './types.js';\n\n/**\n * Merge AgentMark dependencies and scripts into an existing package.json.\n * Preserves all existing content, only adds missing AgentMark entries.\n */\nexport function mergePackageJson(\n targetPath: string,\n agentmarkDeps: Record<string, string>,\n agentmarkDevDeps: Record<string, string>,\n agentmarkScripts: Record<string, string>\n): MergeResult {\n const packageJsonPath = path.join(targetPath, 'package.json');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n // Read existing package.json\n if (!fs.existsSync(packageJsonPath)) {\n result.warnings.push('No existing package.json found');\n return result;\n }\n\n const existing = fs.readJsonSync(packageJsonPath) as Record<string, unknown>;\n\n // Initialize sections if they don't exist\n if (!existing.dependencies) {\n existing.dependencies = {};\n }\n if (!existing.devDependencies) {\n existing.devDependencies = {};\n }\n if (!existing.scripts) {\n existing.scripts = {};\n }\n\n const deps = existing.dependencies as Record<string, string>;\n const devDeps = existing.devDependencies as Record<string, string>;\n const scripts = existing.scripts as Record<string, string>;\n\n // Add AgentMark dependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDeps)) {\n if (deps[pkg]) {\n result.skipped.push(`dependency: ${pkg} (already exists)`);\n } else {\n deps[pkg] = version;\n result.added.push(`dependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark devDependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDevDeps)) {\n if (devDeps[pkg]) {\n result.skipped.push(`devDependency: ${pkg} (already exists)`);\n } else {\n devDeps[pkg] = version;\n result.added.push(`devDependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark scripts (use namespace if conflict exists)\n for (const [scriptName, scriptCmd] of Object.entries(agentmarkScripts)) {\n if (scripts[scriptName]) {\n // Conflict - use namespaced script name\n const namespacedName = `agentmark:${scriptName}`;\n if (scripts[namespacedName]) {\n // Both the original and namespaced version exist - skip with warning\n result.skipped.push(`script: ${scriptName}`);\n result.warnings.push(\n `Script \"${scriptName}\" and \"${namespacedName}\" both already exist. Skipping.`\n );\n } else {\n scripts[namespacedName] = scriptCmd;\n result.added.push(`script: ${namespacedName} (namespaced due to conflict)`);\n result.warnings.push(\n `Script \"${scriptName}\" already exists. Added as \"${namespacedName}\" instead.`\n );\n }\n } else {\n scripts[scriptName] = scriptCmd;\n result.added.push(`script: ${scriptName}`);\n }\n }\n\n // Write merged package.json\n fs.writeJsonSync(packageJsonPath, existing, { spaces: 2 });\n\n result.success = true;\n result.content = JSON.stringify(existing, null, 2);\n return result;\n } catch (error) {\n result.warnings.push(`Error merging package.json: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark entries to an existing .gitignore file.\n * Checks for duplicates before adding.\n */\nexport function appendGitignore(targetPath: string, entries: string[]): MergeResult {\n const gitignorePath = path.join(targetPath, '.gitignore');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(gitignorePath)) {\n existingContent = fs.readFileSync(gitignorePath, 'utf-8');\n }\n\n // Parse existing entries (normalize trailing slashes)\n const existingEntries = new Set(\n existingContent\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'))\n .map((line) => line.replace(/\\/$/, '')) // Remove trailing slashes for comparison\n );\n\n const entriesToAdd: string[] = [];\n\n for (const entry of entries) {\n const normalizedEntry = entry.replace(/\\/$/, '');\n if (existingEntries.has(normalizedEntry)) {\n result.skipped.push(entry);\n } else {\n entriesToAdd.push(entry);\n result.added.push(entry);\n }\n }\n\n if (entriesToAdd.length > 0) {\n // Add a header comment and the new entries\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n newContent += entriesToAdd.join('\\n');\n newContent += '\\n';\n\n fs.writeFileSync(gitignorePath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .gitignore: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark environment variables to an existing .env file.\n * Does not overwrite existing keys.\n */\nexport function appendEnv(\n targetPath: string,\n envVars: Record<string, string>\n): MergeResult {\n const envPath = path.join(targetPath, '.env');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(envPath)) {\n existingContent = fs.readFileSync(envPath, 'utf-8');\n }\n\n // Parse existing keys\n const existingKeys = new Set<string>();\n const lines = existingContent.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const match = trimmed.match(/^([^=]+)=/);\n if (match && match[1]) {\n existingKeys.add(match[1]);\n }\n }\n }\n\n const varsToAdd: Array<[string, string]> = [];\n\n for (const [key, value] of Object.entries(envVars)) {\n if (existingKeys.has(key)) {\n result.skipped.push(key);\n } else {\n varsToAdd.push([key, value]);\n result.added.push(key);\n }\n }\n\n if (varsToAdd.length > 0) {\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n for (const [key, value] of varsToAdd) {\n newContent += `${key}=${value}\\n`;\n }\n\n fs.writeFileSync(envPath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .env: ${error}`);\n return result;\n }\n}\n\n/**\n * Check if a file should be skipped based on existing project detection.\n * Used for files like index.ts that should never be generated in existing projects.\n */\nexport function shouldSkipFile(\n fileName: string,\n isExistingProject: boolean,\n skipFiles: string[]\n): boolean {\n if (!isExistingProject) {\n return false;\n }\n return skipFiles.includes(fileName);\n}\n","/**\n * Type definitions for existing repository initialization.\n * These types support project detection, conflict resolution, and package manager handling.\n */\n\n/** Supported package managers for TypeScript projects */\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\n/** Configuration for a specific package manager */\nexport interface PackageManagerConfig {\n /** Package manager name */\n name: PackageManager;\n /** Lock file that indicates this package manager is in use */\n lockFile: string;\n /** Command to install all dependencies */\n installCmd: string;\n /** Command to add a production dependency */\n addCmd: string;\n /** Command to add a dev dependency */\n addDevCmd: string;\n /** Command prefix for running scripts (e.g., 'npm run', 'yarn') */\n runCmd: string;\n}\n\n/** Package manager configurations indexed by lock file name */\nexport const PACKAGE_MANAGERS: Record<string, PackageManagerConfig> = {\n 'yarn.lock': {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCmd: 'yarn install',\n addCmd: 'yarn add',\n addDevCmd: 'yarn add --dev',\n runCmd: 'yarn',\n },\n 'pnpm-lock.yaml': {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCmd: 'pnpm install',\n addCmd: 'pnpm add',\n addDevCmd: 'pnpm add --save-dev',\n runCmd: 'pnpm',\n },\n 'bun.lockb': {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCmd: 'bun install',\n addCmd: 'bun add',\n addDevCmd: 'bun add --dev',\n runCmd: 'bun run',\n },\n 'package-lock.json': {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCmd: 'npm install',\n addCmd: 'npm install',\n addDevCmd: 'npm install --save-dev',\n runCmd: 'npm run',\n },\n};\n\n/** Default package manager when no lock file is found */\nexport const DEFAULT_PACKAGE_MANAGER: PackageManagerConfig = PACKAGE_MANAGERS['package-lock.json']!;\n\n/** Information about a detected Python virtual environment */\nexport interface PythonVenvInfo {\n /** Absolute path to the venv directory */\n path: string;\n /** Relative name (e.g., '.venv' or 'venv') */\n name: string;\n /** Platform-specific activate command */\n activateCmd: string;\n /** Platform-specific pip path */\n pipPath: string;\n}\n\n/** Type of file for determining merge strategy */\nexport type FileType = 'config' | 'source' | 'directory' | 'dotfile';\n\n/** Resolution strategy for a conflicting file */\nexport type ConflictStrategy = 'merge' | 'append' | 'prompt' | 'skip';\n\n/** Represents a file that may conflict with AgentMark initialization */\nexport interface ConflictFile {\n /** Relative path from project root */\n path: string;\n /** Type of file for determining merge strategy */\n type: FileType;\n /** Recommended resolution strategy */\n strategy: ConflictStrategy;\n}\n\n/** Files that may conflict with AgentMark initialization */\nexport const CONFLICT_FILES: ConflictFile[] = [\n { path: 'agentmark.json', type: 'config', strategy: 'prompt' },\n { path: 'agentmark', type: 'directory', strategy: 'prompt' },\n { path: 'agentmark.client.ts', type: 'source', strategy: 'prompt' },\n { path: 'agentmark_client.py', type: 'source', strategy: 'prompt' },\n { path: '.gitignore', type: 'dotfile', strategy: 'append' },\n { path: '.env', type: 'dotfile', strategy: 'append' },\n { path: 'package.json', type: 'config', strategy: 'merge' },\n { path: 'index.ts', type: 'source', strategy: 'skip' },\n { path: 'main.py', type: 'source', strategy: 'skip' },\n { path: 'tsconfig.json', type: 'config', strategy: 'skip' },\n { path: 'pyproject.toml', type: 'config', strategy: 'skip' },\n];\n\n/** User's resolution choice for a conflict */\nexport type ConflictAction = 'skip' | 'overwrite' | 'merge';\n\n/** A conflict resolution decision from the user */\nexport interface ConflictResolution {\n /** Path to the conflicting file */\n path: string;\n /** Action chosen by the user */\n action: ConflictAction;\n}\n\n/** Detected information about an existing project */\nexport interface ProjectInfo {\n /** Whether any project indicators were found */\n isExistingProject: boolean;\n /** Detected project type */\n type: 'typescript' | 'python' | 'unknown';\n /** Detected package manager (for TypeScript projects) */\n packageManager: PackageManagerConfig;\n /** Files that exist and may conflict */\n conflictingFiles: ConflictFile[];\n /** Whether the agentmark/ directory already exists */\n hasAgentmarkDir: boolean;\n /** Whether an existing Python venv was detected */\n pythonVenv: PythonVenvInfo | null;\n}\n\n/** Result of a file merge operation */\nexport interface MergeResult {\n /** Whether the merge was successful */\n success: boolean;\n /** The merged content (if applicable) */\n content?: string;\n /** Any warnings generated during merge */\n warnings: string[];\n /** What was added (for user feedback) */\n added: string[];\n /** What was skipped (already present) */\n skipped: string[];\n}\n\n/** Extended options for initialization in existing projects */\nexport interface InitOptions {\n /** Target directory path */\n targetPath: string;\n /** Selected language */\n language: 'typescript' | 'python';\n /** Selected adapter (TypeScript only) */\n adapter?: string;\n /** Deployment mode */\n deploymentMode: 'cloud' | 'static';\n /** API key (if provided) */\n apiKey?: string;\n /** IDE client for MCP setup */\n client: string;\n /** Detected project info (null if new project) */\n projectInfo: ProjectInfo | null;\n /** User's conflict resolutions */\n conflictResolutions: ConflictResolution[];\n}\n","export const getTsConfigContent = (): object => {\n return {\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n }\n };\n}; ","export const getAnimalDrawingPrompt = (): string => {\n return `---\nname: animal-drawing\nimage_config:\n model_name: dall-e-3\n num_images: 1\n size: 1024x1024\n aspect_ratio: 1:1\ntest_settings:\n dataset: animal.jsonl\n props:\n animal: \"cat\"\n---\n\n<ImagePrompt>\nDraw a hyper-realistic picture of a {props.animal}\n</ImagePrompt>`;\n};","export const getCustomerSupportPrompt = (model: string): string => {\n return `---\nname: customer-support-agent\ntext_config:\n model_name: ${model}\n max_calls: 2\n tools:\n search_knowledgebase:\n description: Search the company knowledgebase for information about shipping, warranty, and returns policies.\n parameters:\n type: object\n properties:\n query:\n type: string\n description: The search query to find relevant information\n required: [query]\ntest_settings:\n dataset: customer-query.jsonl\n props:\n customer_question: \"I'm having trouble with my order. How long does shipping take?\"\ninput_schema:\n type: object\n properties:\n customer_question:\n type: string\n description: \"The customer's question\"\n required:\n - customer_question\n---\n\n<System>\nYou are a customer service agent for a company that sells products online. You are given a customer's question and you need to respond to the customer. You need to be friendly, professional, and helpful.\n\nYou have access to the following tool:\n- search_knowledgebase: Search the company knowledgebase for information about shipping, warranty, and returns. Use this when customers ask about these topics.\n</System>\n\n<User>{props.customer_question}</User>`;\n};","export const getPartyPlannerPrompt = (model: string): string => {\n return `---\nname: party-planner\nobject_config:\n model_name: ${model}\n schema:\n type: object\n properties:\n names:\n type: array\n description: \"List of names of people attending the party.\"\n items:\n type: string\n required:\n - names\ntest_settings:\n dataset: party.jsonl\n evals:\n - exact_match_json\n props:\n party_text: \"We're having a party with Alice, Bob, and Carol.\"\ninput_schema:\n type: object\n properties:\n party_text:\n type: string\n description: \"A block of text describing the upcoming party and attendees.\"\n required:\n - party_text\n---\n\n<System>\nExtract the names of all people attending the party from the following text. Respond with a list of names only.\n</System>\n\n<User>\nText: {props.party_text}\n</User>`;\n};","export const getStoryTellerPrompt = (): string => {\n return `---\nname: story-teller\nspeech_config:\n model_name: tts-1-hd\n voice: \"nova\"\n speed: 1.0\n output_format: \"mp3\"\ntest_settings:\n dataset: story.jsonl\n props:\n story: \"Once upon a time, there was a cat who loved to play with a ball.\"\n---\n\n<System>\nYou are a storyteller for children. Make sure your story is engaging and interesting.\n</System>\n\n<SpeechPrompt>\n- {props.story}\n</SpeechPrompt>`;\n};","export const getAnimalDataset = (): string => {\n return `{\"input\": {\"animal\": \"cat\"}, \"expected_output\": \"A realistic picture of a cat\"}\n{\"input\": {\"animal\": \"dog\"}, \"expected_output\": \"A realistic picture of a dog\"}\n{\"input\": {\"animal\": \"bird\"}, \"expected_output\": \"A realistic picture of a bird\"}`;\n};\n\nexport const getCustomerQueryDataset = (): string => {\n return `{\"input\": {\"customer_question\": \"My package hasn't arrived yet. Can you help me track it?\"}}\n{\"input\": {\"customer_question\": \"I received the wrong item in my order. What should I do?\"}}\n{\"input\": {\"customer_question\": \"How do I return a product that I purchased last week?\"}}`;\n};\n\nexport const getPartyDataset = (): string => {\n return `{\"input\": {\"party_text\": \"We're having a party with Alice, Bob, and Carol.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Alice\\\\\", \\\\\"Bob\\\\\", \\\\\"Carol\\\\\"]}\"}\n{\"input\": {\"party_text\": \"The guest list includes Dave, Emma, and Frank.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Dave\\\\\", \\\\\"Emma\\\\\", \\\\\"Frank\\\\\"]}\"}\n{\"input\": {\"party_text\": \"Join us for a celebration with Grace, Henry, and Isla.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Grace\\\\\", \\\\\"Henry\\\\\", \\\\\"Isla\\\\\"]}\"}`;\n};\n\nexport const getStoryDataset = (): string => {\n return `{\"input\": {\"story\": \"Once upon a time, the Moon woke up and found her glow missing! She floated around the sky asking stars, clouds, and even comets if they'd seen her light. It wasn't until she peeked into a mountain lake that she saw her glow shining back—hidden in her own reflection! Laughing, she realized she had never lost it—it was with her all along, just hiding beneath a cloudy sky.\"}}\n{\"input\": {\"story\": \"Benny was no ordinary banana—he dreamed of becoming a superhero. One day, when a monkey slipped in the jungle and cried for help, Benny rolled into action, dodging vines and swinging from branches using his peel like a lasso. The monkey was saved, and from that day on, Benny was known as \\\\\"The Peel of Justice,\\\\\" the bravest fruit in the whole rainforest.\"}}\n{\"input\": {\"story\": \"In the town of Maplebrook, there was a library that whispered stories when no one was looking. Curious little Nia tiptoed in one rainy day and heard the books giggling softly. She opened one called The Secret Tunnel, and to her surprise, it sucked her in! She found herself riding a dragon through glittering caves. When she returned, the book winked shut—waiting for its next reader to listen.\"}}`;\n};","import fs from 'fs-extra';\nimport { getAnimalDrawingPrompt } from './animal-drawing-prompt.js';\nimport { getCustomerSupportPrompt } from './customer-support-prompt.js';\nimport { getPartyPlannerPrompt } from './party-planner-prompt.js';\nimport { getStoryTellerPrompt } from './story-teller-prompt.js';\nimport { getAnimalDataset, getCustomerQueryDataset, getPartyDataset, getStoryDataset } from './datasets.js';\n\nexport const createExamplePrompts = (model: string, targetPath: string = \".\", adapter: string = \"ai-sdk\") => {\n // Ensure the templates directory exists\n fs.ensureDirSync(`${targetPath}/agentmark`);\n\n const noImageSupport = [\"mastra\", \"claude-agent-sdk\"];\n const noSpeechSupport = [\"mastra\", \"claude-agent-sdk\"];\n const skipImagePrompts = noImageSupport.includes(adapter);\n const skipSpeechPrompts = noSpeechSupport.includes(adapter);\n\n // Create animal drawing prompt and dataset (uses image_config - skip for unsupported adapters)\n if (!skipImagePrompts) {\n const animalDrawingPrompt = getAnimalDrawingPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/animal-drawing.prompt.mdx`, animalDrawingPrompt);\n const animalDataset = getAnimalDataset();\n fs.writeFileSync(`${targetPath}/agentmark/animal.jsonl`, animalDataset);\n }\n\n // Create customer support prompt and dataset\n const customerSupportPrompt = getCustomerSupportPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/customer-support-agent.prompt.mdx`, customerSupportPrompt);\n const customerQueryDataset = getCustomerQueryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/customer-query.jsonl`, customerQueryDataset);\n\n // Create party planner prompt and dataset\n const partyPlannerPrompt = getPartyPlannerPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/party-planner.prompt.mdx`, partyPlannerPrompt);\n const partyDataset = getPartyDataset();\n fs.writeFileSync(`${targetPath}/agentmark/party.jsonl`, partyDataset);\n\n // Create story teller prompt and dataset (uses speech_config - skip for unsupported adapters)\n if (!skipSpeechPrompts) {\n const storyTellerPrompt = getStoryTellerPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/story-teller.prompt.mdx`, storyTellerPrompt);\n const storyDataset = getStoryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/story.jsonl`, storyDataset);\n }\n};","import { getAdapterConfig } from \"./adapters.js\";\n\nexport const getClientConfigContent = (options: { provider: string; languageModels: string[]; adapter: string; deploymentMode?: \"cloud\" | \"static\" }) => {\n const { provider, languageModels, adapter, deploymentMode = \"cloud\" } = options;\n const adapterConfig = getAdapterConfig(adapter, provider);\n const { modelRegistry, toolRegistry } = adapterConfig.classes;\n\n // Claude Agent SDK doesn't use @ai-sdk provider imports\n const isClaudeAgentSdk = adapter === \"claude-agent-sdk\";\n const providerImport = isClaudeAgentSdk ? '' : `import { ${provider} } from '@ai-sdk/${provider}';`;\n\n const extraModelRegs = provider === 'openai' && !isClaudeAgentSdk\n ? `.registerModels([\"dall-e-3\"], (name: string) => ${provider}.image(name))\n .registerModels([\"tts-1-hd\"], (name: string) => ${provider}.speech(name))`\n : '';\n\n // Import loaders from dedicated packages\n const loaderImport = deploymentMode === \"cloud\"\n ? `import { ApiLoader } from \"@agentmark-ai/loader-api\";`\n : `import { ApiLoader } from \"@agentmark-ai/loader-api\";\nimport { FileLoader } from \"@agentmark-ai/loader-file\";`;\n\n const loaderSetup = deploymentMode === \"cloud\"\n ? ` // ApiLoader works for both development and production\n // - Development: 'agentmark dev' sets AGENTMARK_BASE_URL to localhost\n // - Production: Set AGENTMARK_API_KEY and AGENTMARK_APP_ID for cloud\n const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : ApiLoader.cloud({\n apiKey: process.env.AGENTMARK_API_KEY!,\n appId: process.env.AGENTMARK_APP_ID!,\n });`\n : ` const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : new FileLoader('./dist/agentmark');`;\n\n // Claude Agent SDK model registry setup is different\n const modelRegistrySetup = isClaudeAgentSdk\n ? `function createModelRegistry() {\n // Claude Agent SDK accepts model names directly.\n // Use createDefault() for simple pass-through of model names.\n const modelRegistry = ${modelRegistry}.createDefault();\n\n // To configure specific models (e.g., extended thinking), use:\n // const modelRegistry = new ${modelRegistry}()\n // .registerModels(/claude-.*-thinking/, (name) => ({\n // model: name,\n // maxThinkingTokens: 10000, // Enable extended thinking\n // }))\n // .registerModels(\"claude-sonnet-4-20250514\", (name) => ({ model: name }));\n\n return modelRegistry;\n}`\n : `function createModelRegistry() {\n const modelRegistry = new ${modelRegistry}()\n .registerModels(${JSON.stringify(languageModels)}, (name: string) => ${provider}(name))\n ${extraModelRegs};\n return modelRegistry;\n}`;\n\n // Claude Agent SDK adapter options\n const adapterOptionsImport = isClaudeAgentSdk\n ? `\n// Claude Agent SDK adapter options\n// See: https://github.com/anthropics/claude-agent-sdk\nconst adapterOptions = {\n // Permission mode controls tool access:\n // - 'default': Requires user approval for each tool use\n // - 'acceptEdits': Auto-approve file edits only\n // - 'bypassPermissions': Auto-approve all tools (use for automated pipelines)\n // - 'plan': Planning mode only, no tool execution\n permissionMode: 'bypassPermissions' as const,\n\n // Maximum conversation turns before stopping\n maxTurns: 20,\n\n // Optional: Set working directory for file operations\n // cwd: process.cwd(),\n\n // Optional: Budget limit in USD\n // maxBudgetUsd: 10.00,\n\n // Optional: Restrict which tools the agent can use\n // allowedTools: ['Read', 'Write', 'Glob'],\n // disallowedTools: ['Bash'],\n};`\n : '';\n\n const createClientCall = isClaudeAgentSdk\n ? `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry, adapterOptions });`\n : `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry });`;\n\n return `// agentmark.client.ts\nimport path from 'node:path';\nimport dotenv from 'dotenv';\ndotenv.config({ path: path.resolve(__dirname, '.env') });\nimport { createAgentMarkClient, ${modelRegistry}, ${toolRegistry}, EvalRegistry } from \"${adapterConfig.package}\";\n${loaderImport}\nimport AgentMarkTypes, { Tools } from './agentmark.types';\n${providerImport}\n${adapterOptionsImport}\n\n${modelRegistrySetup}\n\nfunction createToolRegistry() {\n const toolRegistry = new ${toolRegistry}<Tools>()\n .register('search_knowledgebase', async ({ query }) => {\n // Simulate search delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Return all three knowledge base articles\n // The LLM will select the relevant one based on the query\n return {\n articles: [\n { topic: 'shipping', content: 'Standard shipping takes 3–5 business days.' },\n { topic: 'warranty', content: 'All products include a 1-year limited warranty.' },\n { topic: 'returns', content: 'You can return items within 30 days of delivery.' }\n ]\n };\n });\n return toolRegistry;\n}\n\nfunction createEvalRegistry() {\n const evalRegistry = new EvalRegistry()\n .register('exact_match_json', ({ output, expectedOutput }) => {\n if (!expectedOutput) {\n return { score: 0, label: 'error', reason: 'No expected output provided', passed: false };\n }\n try {\n const ok = JSON.stringify(output) === JSON.stringify(JSON.parse(expectedOutput));\n return {\n score: ok ? 1 : 0,\n label: ok ? 'correct' : 'incorrect',\n reason: ok ? 'Exact match' : 'Mismatch',\n passed: ok\n };\n } catch (e) {\n return { score: 0, label: 'error', reason: 'Failed to parse expected output as JSON', passed: false };\n }\n });\n return evalRegistry;\n}\n\nfunction createClient() {\n${loaderSetup}\n const modelRegistry = createModelRegistry();\n const toolRegistry = createToolRegistry();\n const evalRegistry = createEvalRegistry();\n ${createClientCall}\n}\n\nexport const client = createClient();\n`;\n};\n","/**\n * Conflict resolution utilities for handling existing files.\n * Prompts users for resolution when files would be overwritten.\n */\n\nimport prompts from 'prompts';\nimport type {\n ConflictFile,\n ConflictResolution,\n ConflictAction,\n ProjectInfo,\n} from './types.js';\n\n/**\n * Filter conflicts that require user prompting.\n * Returns only conflicts with 'prompt' strategy that actually exist.\n */\nexport function getPromptableConflicts(conflictingFiles: ConflictFile[]): ConflictFile[] {\n return conflictingFiles.filter((file) => file.strategy === 'prompt');\n}\n\n/**\n * Prompt user for resolution of a single conflict.\n */\nasync function promptForSingleConflict(\n conflict: ConflictFile\n): Promise<ConflictResolution> {\n const typeLabel = conflict.type === 'directory' ? 'directory' : 'file';\n\n const { action } = await prompts({\n type: 'select',\n name: 'action',\n message: `${conflict.path} already exists. What would you like to do?`,\n choices: [\n {\n title: `Skip (keep existing ${typeLabel})`,\n value: 'skip',\n description: `Don't modify the existing ${typeLabel}`,\n },\n {\n title: 'Overwrite',\n value: 'overwrite',\n description: `Replace with new AgentMark ${typeLabel}`,\n },\n ],\n initial: 0, // Default to skip for safety\n });\n\n return {\n path: conflict.path,\n action: action as ConflictAction || 'skip',\n };\n}\n\n/**\n * Prompt user for resolution of all conflicts that require prompting.\n * Returns an array of resolution decisions.\n */\nexport async function promptForResolutions(\n conflictingFiles: ConflictFile[]\n): Promise<ConflictResolution[]> {\n const promptableConflicts = getPromptableConflicts(conflictingFiles);\n\n if (promptableConflicts.length === 0) {\n return [];\n }\n\n console.log('\\n⚠️ Found existing files that may conflict with AgentMark initialization:\\n');\n\n const resolutions: ConflictResolution[] = [];\n\n for (const conflict of promptableConflicts) {\n const resolution = await promptForSingleConflict(conflict);\n resolutions.push(resolution);\n }\n\n console.log(''); // Add blank line after prompts\n return resolutions;\n}\n\n/**\n * Get the resolution action for a specific file path.\n * Returns the user's choice or the default strategy if no prompt was needed.\n */\nexport function getResolutionAction(\n filePath: string,\n resolutions: ConflictResolution[],\n conflictingFiles: ConflictFile[]\n): ConflictAction {\n // First check if user provided a resolution\n const userResolution = resolutions.find((r) => r.path === filePath);\n if (userResolution) {\n return userResolution.action;\n }\n\n // Check the default strategy for this file\n const conflictFile = conflictingFiles.find((f) => f.path === filePath);\n if (conflictFile) {\n // Map strategy to action\n switch (conflictFile.strategy) {\n case 'skip':\n return 'skip';\n case 'merge':\n return 'merge';\n case 'append':\n return 'merge'; // Append is a form of merge\n case 'prompt':\n // If we got here without a resolution, default to skip for safety\n return 'skip';\n }\n }\n\n // Default: overwrite (file doesn't conflict or isn't tracked)\n return 'overwrite';\n}\n\n/**\n * Check if a file should be skipped based on resolutions.\n */\nexport function shouldSkipFile(\n filePath: string,\n projectInfo: ProjectInfo | null,\n resolutions: ConflictResolution[]\n): boolean {\n if (!projectInfo || !projectInfo.isExistingProject) {\n return false;\n }\n\n const action = getResolutionAction(filePath, resolutions, projectInfo.conflictingFiles);\n return action === 'skip';\n}\n\n/**\n * Check if a file should be merged based on resolutions.\n */\nexport function shouldMergeFile(\n filePath: string,\n projectInfo: ProjectInfo | null,\n resolutions: ConflictResolution[]\n): boolean {\n if (!projectInfo || !projectInfo.isExistingProject) {\n return false;\n }\n\n const action = getResolutionAction(filePath, resolutions, projectInfo.conflictingFiles);\n return action === 'merge';\n}\n\n/**\n * Display a summary of existing project detection.\n */\nexport function displayProjectDetectionSummary(projectInfo: ProjectInfo): void {\n if (!projectInfo.isExistingProject) {\n return;\n }\n\n console.log('\\n📁 Detected existing project:');\n console.log(` Type: ${projectInfo.type}`);\n\n if (projectInfo.type === 'typescript') {\n console.log(` Package Manager: ${projectInfo.packageManager.name}`);\n }\n\n if (projectInfo.pythonVenv) {\n console.log(` Python Venv: ${projectInfo.pythonVenv.name}`);\n }\n\n if (projectInfo.hasAgentmarkDir) {\n console.log(' ⚠️ AgentMark directory already exists');\n }\n\n console.log('');\n}\n","import { execSync } from \"child_process\";\n\n/**\n * Initialize a git repository and create an initial commit.\n *\n * Skips silently when:\n * - The target path is already inside a git repository\n * - git is not installed\n * - Any git command fails (non-fatal)\n */\nexport function initGitRepo(targetPath: string): boolean {\n try {\n // Check if git is available\n try {\n execSync(\"git --version\", { stdio: \"ignore\" });\n } catch {\n console.log(\"⚠️ git not found — skipping repository initialization\");\n return false;\n }\n\n // Check if already inside a git repo\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", {\n cwd: targetPath,\n stdio: \"ignore\",\n });\n // Already in a git repo — skip\n return false;\n } catch {\n // Not in a git repo — proceed\n }\n\n execSync(\"git init\", { cwd: targetPath, stdio: \"ignore\" });\n execSync(\"git add -A\", { cwd: targetPath, stdio: \"ignore\" });\n execSync(\n 'git -c user.name=\"create-agentmark\" -c user.email=\"noreply\" commit -m \"Initial commit from create-agentmark\"',\n { cwd: targetPath, stdio: \"ignore\" },\n );\n\n console.log(\"✅ Initialized git repository with initial commit\");\n return true;\n } catch {\n console.log(\"⚠️ Could not initialize git repository\");\n return false;\n }\n}\n","import fs from \"fs-extra\";\nimport * as path from \"path\";\nimport {\n createExamplePrompts,\n} from \"./templates/index.js\";\nimport { appendGitignore, appendEnv } from \"../file-merge.js\";\nimport { shouldMergeFile } from \"../conflict-resolution.js\";\nimport type { ProjectInfo, ConflictResolution } from \"../types.js\";\nimport { initGitRepo } from \"../git-init.js\";\n\nconst setupMCPServer = (client: string, targetPath: string) => {\n if (client === \"skip\") {\n console.log(\"Skipping MCP server setup.\");\n return;\n }\n\n const folderName = targetPath;\n\n // Handle VS Code\n if (client === \"vscode\") {\n try {\n console.log(`Setting up MCP server for VS Code in ${folderName}...`);\n const vscodeDir = path.join(targetPath, \".vscode\");\n fs.ensureDirSync(vscodeDir);\n\n const mcpConfig = {\n servers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(vscodeDir, \"mcp.json\"), mcpConfig, { spaces: 2 });\n console.log(`MCP server configured for VS Code in ${folderName}/.vscode/mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for VS Code:`, error);\n }\n return;\n }\n\n // Handle Zed\n if (client === \"zed\") {\n try {\n console.log(`Setting up MCP server for Zed in ${folderName}...`);\n const zedDir = path.join(targetPath, \".zed\");\n fs.ensureDirSync(zedDir);\n\n const zedConfig = {\n context_servers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(zedDir, \"settings.json\"), zedConfig, { spaces: 2 });\n console.log(`MCP server configured for Zed in ${folderName}/.zed/settings.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Zed:`, error);\n }\n return;\n }\n\n // Handle Cursor\n if (client === \"cursor\") {\n try {\n console.log(`Setting up MCP server for Cursor in ${folderName}...`);\n const cursorDir = path.join(targetPath, \".cursor\");\n fs.ensureDirSync(cursorDir);\n\n const cursorConfig = {\n mcpServers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(cursorDir, \"mcp.json\"), cursorConfig, { spaces: 2 });\n console.log(`MCP server configured for Cursor in ${folderName}/.cursor/mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Cursor:`, error);\n }\n return;\n }\n\n // Handle Claude Code\n if (client === \"claude-code\") {\n try {\n console.log(`Setting up MCP server for Claude Code in ${folderName}...`);\n\n const mcpConfig = {\n mcpServers: {\n \"agentmark-docs\": {\n type: \"http\",\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(targetPath, \".mcp.json\"), mcpConfig, { spaces: 2 });\n console.log(`MCP server configured for Claude Code in ${folderName}/.mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Claude Code:`, error);\n }\n return;\n }\n};\n\nconst getPyprojectContent = (projectName: string, adapter: string): string => {\n if (adapter === \"claude-agent-sdk\") {\n return `[project]\nname = \"${projectName}\"\nversion = \"0.1.0\"\ndescription = \"An AgentMark application using Claude Agent SDK\"\nrequires-python = \">=3.12\"\ndependencies = [\n \"agentmark-sdk>=0.1.0\",\n \"agentmark-claude-agent-sdk>=0.1.0\",\n \"agentmark-prompt-core>=0.1.0\",\n \"python-dotenv>=1.0.0\",\n \"claude-agent-sdk>=0.1.0\",\n]\n\n[project.optional-dependencies]\ndev = [\n \"pytest>=7.0\",\n \"pytest-asyncio>=0.21\",\n \"mypy>=1.0\",\n]\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\n[tool.mypy]\nstrict = true\n`;\n }\n\n // Default: pydantic-ai\n return `[project]\nname = \"${projectName}\"\nversion = \"0.1.0\"\ndescription = \"An AgentMark application using Pydantic AI\"\nrequires-python = \">=3.12\"\ndependencies = [\n \"agentmark-sdk>=0.1.0\",\n \"agentmark-pydantic-ai>=0.1.0\",\n \"agentmark-prompt-core>=0.1.0\",\n \"python-dotenv>=1.0.0\",\n \"pydantic-ai[openai]>=0.1.0\",\n]\n\n[project.optional-dependencies]\ndev = [\n \"pytest>=7.0\",\n \"pytest-asyncio>=0.21\",\n \"mypy>=1.0\",\n]\nanthropic = [\"pydantic-ai[anthropic]\"]\ngemini = [\"pydantic-ai[gemini]\"]\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\n[tool.mypy]\nstrict = true\n`;\n};\n\nconst getAgentmarkClientContent = (_deploymentMode: \"cloud\" | \"static\", adapter: string): string => {\n if (adapter === \"claude-agent-sdk\") {\n return `\"\"\"AgentMark client configuration.\n\nThis file configures the AgentMark client with Claude Agent SDK adapter.\nCustomize the model registry and tool registry as needed.\n\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom dotenv import load_dotenv\n\nfrom agentmark.prompt_core import FileLoader\nfrom agentmark_claude_agent_sdk import (\n create_claude_agent_client,\n create_default_model_registry,\n ClaudeAgentToolRegistry,\n)\n\n# Load environment variables\nload_dotenv()\n\n# Configure model registry with default mappings\n# Supports: claude-* models\nmodel_registry = create_default_model_registry()\n\n# Configure tool registry for custom tools\ntool_registry = ClaudeAgentToolRegistry()\n\n# Example tool registration:\n# tool_registry.register(\n# \"search\",\n# lambda args, ctx: f\"Search results for: {args['query']}\",\n# description=\"Search the web\",\n# parameters={\"type\": \"object\", \"properties\": {\"query\": {\"type\": \"string\"}}, \"required\": [\"query\"]},\n# )\n\n# Create file loader for local development\n# Uses the project root as base directory for resolving relative paths\nproject_root = Path(__file__).parent.resolve()\nloader = FileLoader(base_dir=str(project_root))\n\n# Create the client\nclient = create_claude_agent_client(\n model_registry=model_registry,\n tool_registry=tool_registry,\n loader=loader,\n)\n\n__all__ = [\"client\"]\n`;\n }\n\n // Default: pydantic-ai\n return `\"\"\"AgentMark client configuration.\n\nThis file configures the AgentMark client with Pydantic AI adapter.\nCustomize the model registry and tool registry as needed.\n\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom dotenv import load_dotenv\n\nfrom agentmark.prompt_core import FileLoader\nfrom agentmark_pydantic_ai_v0 import (\n create_pydantic_ai_client,\n create_default_model_registry,\n PydanticAIToolRegistry,\n)\n\n# Load environment variables\nload_dotenv()\n\n# Configure model registry with default mappings\n# Supports: gpt-*, claude-*, gemini-*, etc.\nmodel_registry = create_default_model_registry()\n\n# Configure tool registry for custom tools\ntool_registry = PydanticAIToolRegistry()\n\n# Example tool registration:\n# @tool_registry.register(\"search\")\n# async def search_web(args: dict, ctx: dict | None) -> str:\n# query = args[\"query\"]\n# return f\"Search results for: {query}\"\n\n# Create file loader for local development\n# Uses the project root as base directory for resolving relative paths\nproject_root = Path(__file__).parent.resolve()\nloader = FileLoader(base_dir=str(project_root))\n\n# Create the client\nclient = create_pydantic_ai_client(\n model_registry=model_registry,\n tool_registry=tool_registry,\n loader=loader,\n)\n\n__all__ = [\"client\"]\n`;\n};\n\nexport const getMainPyContent = (adapter: string, deploymentMode: \"cloud\" | \"static\" = \"cloud\"): string => {\n const isCloud = deploymentMode === \"cloud\";\n\n const cloudTracingInit = `\n# Initialize tracing - traces will be sent to AgentMark Cloud\n# To disable tracing, comment out sdk.init_tracing() below\nsdk = AgentMarkSDK(\n api_key=os.environ.get(\"AGENTMARK_API_KEY\", \"\"),\n app_id=os.environ.get(\"AGENTMARK_APP_ID\", \"\"),\n)\nsdk.init_tracing(disable_batch=True)\n`;\n\n const staticTracingInit = `\n# Initialize tracing - traces will be sent to local dev server\n# Make sure to run \"npm run agentmark dev\" in another terminal first\n# To disable tracing, comment out sdk.init_tracing() below\nsdk = AgentMarkSDK(\n api_key=\"\",\n app_id=\"\",\n base_url=\"http://localhost:9418\",\n)\nsdk.init_tracing(disable_batch=True)\n`;\n\n const tracingInit = isCloud ? cloudTracingInit : staticTracingInit;\n\n if (adapter === \"claude-agent-sdk\") {\n return `\"\"\"Example usage of AgentMark with Claude Agent SDK.\n\nRun with: python main.py\n\"\"\"\n\nimport asyncio\nimport json\nimport os\nfrom pathlib import Path\n\nfrom agentmark_sdk import AgentMarkSDK\nfrom agentmark_claude_agent_sdk import run_text_prompt\nfrom agentmark_client import client\n${tracingInit}\n\nasync def main():\n \"\"\"Run the party planner prompt.\"\"\"\n # Load the prompt AST (in production, use the API loader)\n prompt_path = Path(\"agentmark/party-planner.prompt.mdx.json\")\n\n if not prompt_path.exists():\n print(\"Prompt file not found. Run 'agentmark build' first.\")\n return\n\n with open(prompt_path) as f:\n ast = json.load(f)\n\n # Load and format the prompt\n prompt = await client.load_text_prompt(ast)\n params = await prompt.format(props={\n \"numberOfGuests\": 10,\n \"theme\": \"80s disco\",\n \"dietaryRestrictions\": [\"vegetarian\", \"gluten-free\"],\n })\n\n # Execute the prompt\n print(\"Running party planner prompt...\")\n result = await run_text_prompt(params)\n\n print(\"\\\\n\" + \"=\" * 50)\n print(\"Party Plan:\")\n print(\"=\" * 50)\n print(result.output)\n print(\"\\\\n\" + \"-\" * 50)\n print(f\"Tokens used: {result.usage}\")\n\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n`;\n }\n\n // Default: pydantic-ai\n return `\"\"\"Example usage of AgentMark with Pydantic AI.\n\nRun with: python main.py\n\"\"\"\n\nimport asyncio\nimport json\nimport os\nfrom pathlib import Path\n\nfrom agentmark_sdk import AgentMarkSDK\nfrom agentmark_pydantic_ai_v0 import run_text_prompt\nfrom agentmark_client import client\n${tracingInit}\n\nasync def main():\n \"\"\"Run the party planner prompt.\"\"\"\n # Load the prompt AST (in production, use the API loader)\n prompt_path = Path(\"agentmark/party-planner.prompt.mdx.json\")\n\n if not prompt_path.exists():\n print(\"Prompt file not found. Run 'agentmark build' first.\")\n return\n\n with open(prompt_path) as f:\n ast = json.load(f)\n\n # Load and format the prompt\n prompt = await client.load_text_prompt(ast)\n params = await prompt.format(props={\n \"numberOfGuests\": 10,\n \"theme\": \"80s disco\",\n \"dietaryRestrictions\": [\"vegetarian\", \"gluten-free\"],\n })\n\n # Execute the prompt\n print(\"Running party planner prompt...\")\n result = await run_text_prompt(params)\n\n print(\"\\\\n\" + \"=\" * 50)\n print(\"Party Plan:\")\n print(\"=\" * 50)\n print(result.output)\n print(\"\\\\n\" + \"-\" * 50)\n print(f\"Tokens used: {result.usage.total_tokens}\")\n\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n`;\n};\n\nconst getDevServerContent = (adapter: string): string => {\n const adapterPackage = adapter === \"claude-agent-sdk\"\n ? \"agentmark_claude_agent_sdk\"\n : \"agentmark_pydantic_ai_v0\";\n\n return `\"\"\"Auto-generated webhook server for AgentMark development.\n\nThis server is started by 'npm run agentmark dev' (agentmark dev) and handles\nprompt execution requests from the CLI.\n\"\"\"\n\nimport argparse\nimport sys\nfrom pathlib import Path\n\n# Add parent directory to path for imports\nsys.path.insert(0, str(Path(__file__).parent.parent))\n\nfrom ${adapterPackage} import create_webhook_server\nfrom agentmark_client import client\n\n\nif __name__ == \"__main__\":\n parser = argparse.ArgumentParser()\n parser.add_argument(\"--webhook-port\", type=int, default=9417)\n parser.add_argument(\"--api-server-port\", type=int, default=9418)\n args = parser.parse_args()\n\n create_webhook_server(client, args.webhook_port, args.api_server_port)\n`;\n};\n\nconst getEnvContent = (apiKey: string, adapter: string): string => {\n if (adapter === \"claude-agent-sdk\") {\n return `# Anthropic API Key\nANTHROPIC_API_KEY=${apiKey}\n`;\n }\n\n // Default: pydantic-ai (OpenAI)\n return `# OpenAI API Key\nOPENAI_API_KEY=${apiKey}\n\n# For Anthropic models, add:\n# ANTHROPIC_API_KEY=your-key-here\n\n# For Google Gemini models, add:\n# GOOGLE_API_KEY=your-key-here\n`;\n};\n\nconst getGitignoreContent = (): string => {\n return `# Python\n__pycache__/\n*.py[cod]\n*$py.class\n.venv/\nvenv/\n.env\n\n# AgentMark\n*.agentmark-outputs/\n.agentmark/\n\n# IDE\n.idea/\n.vscode/\n*.swp\n\n# Build\ndist/\nbuild/\n*.egg-info/\n\n# Testing\n.pytest_cache/\n.coverage\nhtmlcov/\n`;\n};\n\nexport const createPythonApp = async (\n client: string,\n targetPath: string = \".\",\n apiKey: string = \"\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n adapter: string = \"pydantic-ai\",\n projectInfo: ProjectInfo | null = null,\n resolutions: ConflictResolution[] = []\n) => {\n try {\n const model = adapter === 'claude-agent-sdk' ? 'claude-sonnet-4-20250514' : 'gpt-4o';\n const adapterDisplayName = adapter === 'claude-agent-sdk' ? 'Claude Agent SDK' : 'Pydantic AI';\n const isExistingProject = projectInfo?.isExistingProject ?? false;\n\n if (isExistingProject) {\n console.log(`Adding AgentMark to existing Python project with ${adapterDisplayName}...`);\n } else {\n console.log(`Creating AgentMark Python app with ${adapterDisplayName}...`);\n }\n\n const folderName = targetPath;\n\n // Create directory structure\n fs.ensureDirSync(`${targetPath}/agentmark`);\n\n setupMCPServer(client, targetPath);\n\n // Create example prompts (reuse from TypeScript)\n createExamplePrompts(model, targetPath, adapter);\n console.log(`Example prompts and datasets created in ${folderName}/agentmark/`);\n\n // Create pyproject.toml (skip for existing projects)\n if (!isExistingProject) {\n const projectName = path.basename(targetPath).replace(/[^a-zA-Z0-9_-]/g, \"-\");\n fs.writeFileSync(`${targetPath}/pyproject.toml`, getPyprojectContent(projectName, adapter));\n } else {\n console.log(\"⏭️ Skipped pyproject.toml (existing project)\");\n }\n\n // Create agentmark_client.py (always create - this is AgentMark-specific)\n fs.writeFileSync(`${targetPath}/agentmark_client.py`, getAgentmarkClientContent(deploymentMode, adapter));\n\n // Create main.py (skip for existing projects)\n if (!isExistingProject) {\n fs.writeFileSync(`${targetPath}/main.py`, getMainPyContent(adapter, deploymentMode));\n } else {\n console.log(\"⏭️ Skipped main.py (existing project)\");\n }\n\n // Create or append to .env file\n if (shouldMergeFile('.env', projectInfo, resolutions)) {\n const envVars: Record<string, string> = {};\n const apiKeyEnvVar = adapter === 'claude-agent-sdk' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n if (apiKey) {\n envVars[apiKeyEnvVar] = apiKey;\n } else {\n envVars[apiKeyEnvVar] = adapter === 'claude-agent-sdk' ? 'your-anthropic-api-key' : 'your-openai-api-key';\n }\n const result = appendEnv(targetPath, envVars);\n if (result.added.length > 0) {\n console.log(`✅ Added to .env: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Skipped existing .env vars: ${result.skipped.join(', ')}`);\n }\n } else {\n fs.writeFileSync(`${targetPath}/.env`, getEnvContent(apiKey, adapter));\n }\n\n // Create or append to .gitignore\n const gitignoreEntries = [\n '__pycache__/', '*.py[cod]', '*$py.class', '.venv/', 'venv/', '.env',\n '*.agentmark-outputs/', '.agentmark/', '.idea/', '.vscode/', '*.swp',\n 'dist/', 'build/', '*.egg-info/', '.pytest_cache/', '.coverage', 'htmlcov/'\n ];\n if (shouldMergeFile('.gitignore', projectInfo, resolutions)) {\n const result = appendGitignore(targetPath, gitignoreEntries);\n if (result.added.length > 0) {\n console.log(`✅ Added to .gitignore: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Already in .gitignore: ${result.skipped.join(', ')}`);\n }\n } else {\n fs.writeFileSync(`${targetPath}/.gitignore`, getGitignoreContent());\n }\n\n // Create .agentmark directory with dev_server.py\n const agentmarkInternalDir = path.join(targetPath, '.agentmark');\n fs.ensureDirSync(agentmarkInternalDir);\n fs.writeFileSync(path.join(agentmarkInternalDir, 'dev_server.py'), getDevServerContent(adapter));\n\n // Python environment setup notes\n const pythonVenv = projectInfo?.pythonVenv;\n if (pythonVenv) {\n console.log(`\\n📦 Detected existing Python venv: ${pythonVenv.name}`);\n console.log(\" Remember to activate it before running AgentMark commands.\");\n } else if (!isExistingProject) {\n console.log(\"Setting up Python environment...\");\n console.log(\"Note: You'll need to set up a virtual environment and install dependencies.\");\n console.log(\"\");\n }\n\n // Initialize git repo for new projects\n if (!isExistingProject) {\n initGitRepo(targetPath);\n }\n\n // Success message\n console.log(\"\\n✅ AgentMark Python initialization completed successfully!\");\n\n console.log(\n `\n ██████╗ ██╗ ██╗████████╗██╗ ██╗ ██████╗ ███╗ ██╗\n ██╔══██╗╚██╗ ██╔╝╚══██╔══╝██║ ██║██╔═══██╗████╗ ██║\n ██████╔╝ ╚████╔╝ ██║ ███████║██║ ██║██╔██╗ ██║\n ██╔═══╝ ╚██╔╝ ██║ ██╔══██║██║ ██║██║╚██╗██║\n ██║ ██║ ██║ ██║ ██║╚██████╔╝██║ ╚████║\n ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝\n + AgentMark\n `\n );\n\n console.log('\\n' + '═'.repeat(70));\n console.log('Next Steps');\n console.log('═'.repeat(70));\n\n console.log('\\n Get Started:');\n if (folderName !== \".\" && folderName !== \"./\" && !isExistingProject) {\n console.log(` $ cd ${folderName}`);\n }\n\n // Show venv activation or creation based on detection\n if (pythonVenv) {\n const activateCmd = process.platform === 'win32'\n ? `${pythonVenv.name}\\\\Scripts\\\\activate`\n : `source ${pythonVenv.name}/bin/activate`;\n console.log(` $ ${activateCmd}`);\n console.log(' $ pip install agentmark-pydantic-ai agentmark-prompt-core python-dotenv \"pydantic-ai[openai]\"');\n } else {\n console.log(' $ python -m venv .venv');\n console.log(' $ source .venv/bin/activate # On Windows: .venv\\\\Scripts\\\\activate');\n console.log(' $ pip install -e \".[dev]\"');\n }\n console.log(' $ npm run agentmark dev\\n');\n\n console.log('─'.repeat(70));\n console.log('Resources');\n console.log('─'.repeat(70));\n console.log(' Documentation: https://docs.agentmark.co');\n console.log('═'.repeat(70) + '\\n');\n } catch (error) {\n console.error(\"Error creating Python app:\", error);\n throw error;\n }\n};\n","/**\n * Project detection utilities for identifying existing projects.\n * Detects TypeScript/Python projects and their configurations.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport {\n type ProjectInfo,\n type ConflictFile,\n type PythonVenvInfo,\n CONFLICT_FILES,\n} from './types.js';\nimport { detectPackageManager } from './package-manager.js';\n\n// Re-export for backwards compatibility\nexport { detectPackageManager };\n\nconst IS_WINDOWS = process.platform === 'win32';\n\n/**\n * Detect if a TypeScript/Node.js project exists in the target directory.\n * Checks for package.json, tsconfig.json, or node_modules.\n */\nexport function detectTypeScriptProject(targetPath: string): boolean {\n const indicators = ['package.json', 'tsconfig.json', 'node_modules'];\n return indicators.some((file) => fs.existsSync(path.join(targetPath, file)));\n}\n\n/**\n * Detect if a Python project exists in the target directory.\n * Checks for pyproject.toml, requirements.txt, setup.py, or virtual environments.\n */\nexport function detectPythonProject(targetPath: string): boolean {\n const indicators = ['pyproject.toml', 'requirements.txt', 'setup.py', '.venv', 'venv'];\n return indicators.some((file) => fs.existsSync(path.join(targetPath, file)));\n}\n\n/**\n * Detect existing Python virtual environment.\n * Checks .venv and venv directories, returns platform-specific paths.\n */\nexport function detectPythonVenv(targetPath: string): PythonVenvInfo | null {\n const venvNames = ['.venv', 'venv'];\n\n for (const name of venvNames) {\n const venvPath = path.join(targetPath, name);\n if (fs.existsSync(venvPath) && fs.statSync(venvPath).isDirectory()) {\n // Check if it's actually a venv (has bin/Scripts and pyvenv.cfg or similar)\n const binDir = IS_WINDOWS ? 'Scripts' : 'bin';\n const binPath = path.join(venvPath, binDir);\n\n if (fs.existsSync(binPath)) {\n const pipExe = IS_WINDOWS ? 'pip.exe' : 'pip';\n\n return {\n path: venvPath,\n name,\n activateCmd: IS_WINDOWS\n ? `${name}\\\\Scripts\\\\activate`\n : `source ${name}/bin/activate`,\n pipPath: path.join(binPath, pipExe),\n };\n }\n }\n }\n\n // Check VIRTUAL_ENV environment variable\n const envVenv = process.env.VIRTUAL_ENV;\n if (envVenv && fs.existsSync(envVenv)) {\n // Check if VIRTUAL_ENV is inside the target directory\n const resolvedTarget = path.resolve(targetPath);\n const resolvedVenv = path.resolve(envVenv);\n const isInsideTarget = resolvedVenv.startsWith(resolvedTarget + path.sep) ||\n resolvedVenv === resolvedTarget;\n\n if (!isInsideTarget) {\n // VIRTUAL_ENV points outside target directory - likely from another project\n // Don't use it as it could give incorrect instructions\n console.warn(\n `⚠️ Note: VIRTUAL_ENV (${envVenv}) points outside the target directory. ` +\n `It will not be used for this initialization.`\n );\n return null;\n }\n\n const binDir = IS_WINDOWS ? 'Scripts' : 'bin';\n const pipExe = IS_WINDOWS ? 'pip.exe' : 'pip';\n const name = path.basename(envVenv);\n\n return {\n path: envVenv,\n name,\n activateCmd: IS_WINDOWS\n ? `${name}\\\\Scripts\\\\activate`\n : `source ${name}/bin/activate`,\n pipPath: path.join(envVenv, binDir, pipExe),\n };\n }\n\n return null;\n}\n\n/**\n * Detect files that may conflict with AgentMark initialization.\n * Returns only the files that actually exist in the target directory.\n */\nexport function detectConflictingFiles(targetPath: string): ConflictFile[] {\n const existingConflicts: ConflictFile[] = [];\n\n for (const conflictFile of CONFLICT_FILES) {\n const fullPath = path.join(targetPath, conflictFile.path);\n if (fs.existsSync(fullPath)) {\n existingConflicts.push(conflictFile);\n }\n }\n\n return existingConflicts;\n}\n\n/**\n * Detect all project information for the target directory.\n * This is the main function that combines all detection logic.\n */\nexport function detectProjectInfo(targetPath: string): ProjectInfo {\n const isTypeScript = detectTypeScriptProject(targetPath);\n const isPython = detectPythonProject(targetPath);\n const isExistingProject = isTypeScript || isPython;\n\n let type: 'typescript' | 'python' | 'unknown' = 'unknown';\n if (isTypeScript && !isPython) {\n type = 'typescript';\n } else if (isPython && !isTypeScript) {\n type = 'python';\n } else if (isTypeScript && isPython) {\n // If both, prefer TypeScript (more common case for polyglot projects)\n type = 'typescript';\n }\n\n const packageManager = detectPackageManager(targetPath);\n const conflictingFiles = detectConflictingFiles(targetPath);\n const hasAgentmarkDir = fs.existsSync(path.join(targetPath, 'agentmark'));\n const pythonVenv = detectPythonVenv(targetPath);\n\n return {\n isExistingProject,\n type,\n packageManager,\n conflictingFiles,\n hasAgentmarkDir,\n pythonVenv,\n };\n}\n\n/**\n * Check if the target path is the current directory.\n * Used to determine if we need to skip mkdir and cd instructions.\n */\nexport function isCurrentDirectory(folderName: string): boolean {\n return folderName === '.' || folderName === './' || folderName === '.\\\\';\n}\n","/**\n * Package manager utilities for detecting and using the correct package manager.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { execSync, execFileSync } from 'child_process';\nimport {\n type PackageManager,\n type PackageManagerConfig,\n PACKAGE_MANAGERS,\n DEFAULT_PACKAGE_MANAGER,\n} from './types.js';\n\n/**\n * Detect the package manager in use by checking for lock files.\n * Priority order: yarn > pnpm > bun > npm.\n */\nexport function detectPackageManager(targetPath: string): PackageManagerConfig {\n // Check lock files in priority order\n const lockFiles = ['yarn.lock', 'pnpm-lock.yaml', 'bun.lockb', 'package-lock.json'];\n\n for (const lockFile of lockFiles) {\n if (fs.existsSync(path.join(targetPath, lockFile))) {\n const config = PACKAGE_MANAGERS[lockFile];\n if (config) {\n return config;\n }\n }\n }\n\n // Default to npm if no lock file found\n return DEFAULT_PACKAGE_MANAGER;\n}\n\n/**\n * Get the package manager configuration by name.\n */\nexport function getPackageManagerConfig(name: PackageManager): PackageManagerConfig {\n const configs = Object.values(PACKAGE_MANAGERS);\n const config = configs.find((c) => c.name === name);\n return config || DEFAULT_PACKAGE_MANAGER;\n}\n\n/**\n * Install dependencies using the detected package manager.\n */\nexport function installDependencies(\n targetPath: string,\n packageManager: PackageManagerConfig\n): void {\n console.log(`Installing dependencies with ${packageManager.name}...`);\n\n try {\n execSync(packageManager.installCmd, {\n stdio: 'inherit',\n cwd: targetPath,\n });\n console.log('Dependencies installed successfully!');\n } catch (error) {\n console.error(`Error installing dependencies with ${packageManager.name}:`, error);\n throw new Error(\n `Failed to install dependencies. Please run \"${packageManager.installCmd}\" manually.`\n );\n }\n}\n\n/**\n * Add production dependencies using the detected package manager.\n */\nexport function addDependencies(\n targetPath: string,\n packageManager: PackageManagerConfig,\n packages: string[]\n): void {\n if (packages.length === 0) return;\n\n console.log(`Adding dependencies with ${packageManager.name}...`);\n\n try {\n // Build the command arguments\n const cmdParts = packageManager.addCmd.split(' ');\n const cmd = cmdParts[0]!;\n const args = [...cmdParts.slice(1), ...packages];\n\n execFileSync(cmd, args, {\n stdio: 'inherit',\n cwd: targetPath,\n });\n } catch (error) {\n console.error(`Error adding dependencies:`, error);\n throw new Error(\n `Failed to add dependencies. Please run \"${packageManager.addCmd} ${packages.join(' ')}\" manually.`\n );\n }\n}\n\n/**\n * Add dev dependencies using the detected package manager.\n */\nexport function addDevDependencies(\n targetPath: string,\n packageManager: PackageManagerConfig,\n packages: string[]\n): void {\n if (packages.length === 0) return;\n\n console.log(`Adding dev dependencies with ${packageManager.name}...`);\n\n try {\n // Build the command arguments\n const cmdParts = packageManager.addDevCmd.split(' ');\n const cmd = cmdParts[0]!;\n const args = [...cmdParts.slice(1), ...packages];\n\n execFileSync(cmd, args, {\n stdio: 'inherit',\n cwd: targetPath,\n });\n } catch (error) {\n console.error(`Error adding dev dependencies:`, error);\n throw new Error(\n `Failed to add dev dependencies. Please run \"${packageManager.addDevCmd} ${packages.join(' ')}\" manually.`\n );\n }\n}\n\n/**\n * Get the run script command for a package manager.\n * e.g., \"npm run dev\" or \"yarn dev\" or \"pnpm dev\"\n */\nexport function getRunScriptCmd(\n packageManager: PackageManagerConfig,\n script: string\n): string {\n return `${packageManager.runCmd} ${script}`;\n}\n"],"mappings":"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","names":["fs","path","prompts","fs","path","fs","fs","fs","fs","execSync","fs","prompts","fs","path","setupMCPServer","fs","fs","path","fs","path","fs","path","fs","path","prompts","path","fs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/examples/create-example-app.ts","../src/utils/examples/templates/adapters.ts","../src/utils/examples/templates/app-index.ts","../src/utils/examples/templates/env.ts","../src/utils/examples/templates/package-setup.ts","../src/utils/file-merge.ts","../src/utils/types.ts","../src/utils/examples/templates/tsconfig.ts","../src/utils/examples/templates/animal-drawing-prompt.ts","../src/utils/examples/templates/customer-support-prompt.ts","../src/utils/examples/templates/party-planner-prompt.ts","../src/utils/examples/templates/story-teller-prompt.ts","../src/utils/examples/templates/datasets.ts","../src/utils/examples/templates/example-prompts.ts","../src/utils/examples/templates/user-client-config.ts","../src/utils/conflict-resolution.ts","../src/utils/git-init.ts","../src/utils/examples/create-python-app.ts","../src/utils/project-detection.ts","../src/utils/package-manager.ts"],"sourcesContent":["import fs from \"fs-extra\";\nimport path from \"path\";\nimport prompts from \"prompts\";\nimport { createExampleApp } from \"./utils/examples/create-example-app\";\nimport { createPythonApp } from \"./utils/examples/create-python-app\";\nimport { detectProjectInfo, isCurrentDirectory } from \"./utils/project-detection.js\";\nimport { displayProjectDetectionSummary, promptForResolutions } from \"./utils/conflict-resolution.js\";\nimport type { ProjectInfo, ConflictResolution } from \"./utils/types.js\";\n\nconst parseArgs = () => {\n const args = process.argv.slice(2);\n let deploymentMode: \"cloud\" | \"static\" | undefined;\n let language: \"typescript\" | \"python\" | undefined;\n\n for (const arg of args) {\n if (arg === \"--cloud\") {\n deploymentMode = \"cloud\";\n } else if (arg === \"--self-host\") {\n deploymentMode = \"static\";\n } else if (arg === \"--python\") {\n language = \"python\";\n } else if (arg === \"--typescript\") {\n language = \"typescript\";\n }\n }\n\n return { deploymentMode, language };\n};\n\nconst main = async () => {\n const cliArgs = parseArgs();\n const config: any = {\n $schema:\n \"https://raw.githubusercontent.com/agentmark-ai/agentmark/refs/heads/main/packages/cli/agentmark.schema.json\",\n version: \"2.0.0\",\n mdxVersion: \"1.0\",\n agentmarkPath: \".\",\n };\n console.log(\"Initializing project.\");\n\n const { folderName } = await prompts({\n name: \"folderName\",\n type: \"text\",\n message: \"Where would you like to create your AgentMark app?\",\n initial: \"my-agentmark-app\",\n });\n\n // Determine target path - handle \".\" for current directory\n const isCurrentDir = isCurrentDirectory(folderName);\n const targetPath = isCurrentDir ? process.cwd() : path.resolve(folderName);\n\n // Create the target folder only if not using current directory\n if (!isCurrentDir) {\n fs.ensureDirSync(targetPath);\n }\n\n // Detect existing project\n const projectInfo: ProjectInfo = detectProjectInfo(targetPath);\n\n // Show detection summary if existing project found\n if (projectInfo.isExistingProject) {\n displayProjectDetectionSummary(projectInfo);\n }\n\n // Prompt for conflict resolutions if needed\n const resolutions: ConflictResolution[] = await promptForResolutions(projectInfo.conflictingFiles);\n\n // Language selection\n let language = cliArgs.language;\n if (!language) {\n const response = await prompts({\n name: \"language\",\n type: \"select\",\n message: \"Which language would you like to use?\",\n choices: [\n { title: \"TypeScript\", value: \"typescript\" },\n { title: \"Python\", value: \"python\" },\n ],\n });\n language = response.language;\n }\n\n // Adapter selection depends on language\n let adapter: string;\n if (language === \"python\") {\n const response = await prompts({\n name: \"adapter\",\n type: \"select\",\n message: \"Which adapter would you like to use?\",\n choices: [\n { title: \"Pydantic AI\", value: \"pydantic-ai\" },\n { title: \"Claude Agent SDK\", value: \"claude-agent-sdk\" },\n ],\n });\n adapter = response.adapter;\n } else {\n const response = await prompts({\n name: \"adapter\",\n type: \"select\",\n message: \"Which adapter would you like to use?\",\n choices: [\n { title: \"AI SDK (Vercel)\", value: \"ai-sdk\" },\n { title: \"Claude Agent SDK\", value: \"claude-agent-sdk\" },\n { title: \"Mastra\", value: \"mastra\" },\n ],\n });\n adapter = response.adapter;\n }\n\n // Set built-in models based on adapter\n config.builtInModels = adapter === 'claude-agent-sdk'\n ? ['anthropic/claude-sonnet-4-20250514']\n : ['openai/gpt-4o'];\n\n // Prompt for API key based on adapter\n const apiKeyName = adapter === 'claude-agent-sdk' ? 'Anthropic' : 'OpenAI';\n let apiKey = \"\";\n const { providedApiKey } = await prompts({\n name: \"providedApiKey\",\n type: \"password\",\n message: `Enter your ${apiKeyName} API key (or press Enter to skip):`,\n initial: \"\",\n });\n apiKey = providedApiKey || \"\";\n\n let deploymentMode = cliArgs.deploymentMode;\n if (!deploymentMode) {\n const response = await prompts({\n name: \"deploymentMode\",\n type: \"select\",\n message: \"Use AgentMark Cloud or manage yourself?\",\n choices: [\n {\n title: \"AgentMark Cloud (recommended)\",\n value: \"cloud\",\n description: \"Have AgentMark cloud manage prompts, datasets, traces, experiments, alerts & more\"\n },\n {\n title: \"Self-hosted\",\n value: \"static\",\n description: \"Self-manage your prompts, datasets, traces & experiments\"\n },\n ],\n });\n deploymentMode = response.deploymentMode;\n }\n\n const { client } = await prompts({\n name: \"client\",\n type: \"select\",\n message: \"Make your IDE an AgentMark expert\",\n choices: [\n { title: \"Claude Code\", value: \"claude-code\" },\n { title: \"Cursor\", value: \"cursor\" },\n { title: \"VS Code\", value: \"vscode\" },\n { title: \"Zed\", value: \"zed\" },\n { title: \"Skip\", value: \"skip\" },\n ],\n });\n\n if (language === \"python\") {\n await createPythonApp(client, targetPath, apiKey, deploymentMode, adapter, projectInfo, resolutions);\n } else {\n await createExampleApp(client, targetPath, apiKey, adapter, deploymentMode, projectInfo, resolutions);\n }\n\n // Generate agentmark.json based on conflict resolution\n const agentmarkJsonPath = path.join(targetPath, \"agentmark.json\");\n const agentmarkJsonResolution = resolutions.find((r) => r.path === \"agentmark.json\");\n\n // Write agentmark.json if it doesn't exist or if user chose to overwrite\n if (!fs.existsSync(agentmarkJsonPath) || agentmarkJsonResolution?.action === \"overwrite\") {\n fs.writeJsonSync(agentmarkJsonPath, config, { spaces: 2 });\n } else if (agentmarkJsonResolution?.action === \"skip\") {\n console.log(\"⏭️ Skipped agentmark.json (keeping existing file)\");\n }\n};\n\nmain().catch((error) => {\n console.error(\"Error:\", error);\n process.exit(1);\n});\n","import fs from \"fs-extra\";\nimport * as path from \"path\";\nimport {\n setupPackageJson,\n installDependencies,\n getIndexFileContent,\n getTsConfigContent,\n getEnvFileContent,\n createExamplePrompts,\n getClientConfigContent,\n getAdapterConfig,\n} from \"./templates/index.js\";\nimport { fetchPromptsFrontmatter, generateTypeDefinitions } from \"@agentmark-ai/shared-utils\";\nimport { appendGitignore, appendEnv } from \"../file-merge.js\";\nimport { shouldMergeFile } from \"../conflict-resolution.js\";\nimport type { ProjectInfo, ConflictResolution } from \"../types.js\";\nimport { initGitRepo } from \"../git-init.js\";\n\nconst setupMCPServer = (client: string, targetPath: string) => {\n if (client === \"skip\") {\n console.log(\"Skipping MCP server setup.\");\n return;\n }\n\n // Keep ./ prefix for display in messages\n const folderName = targetPath;\n\n // Handle VS Code\n if (client === \"vscode\") {\n try {\n console.log(`Setting up MCP server for VS Code in ${folderName}...`);\n const vscodeDir = path.join(targetPath, \".vscode\");\n fs.ensureDirSync(vscodeDir);\n\n const mcpConfig = {\n servers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(vscodeDir, \"mcp.json\"), mcpConfig, { spaces: 2 });\n console.log(`✅ MCP server configured for VS Code in ${folderName}/.vscode/mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for VS Code:`, error);\n console.log(\"See https://docs.agentmark.co/agentmark/further_reference/agentmark-mcp for setup instructions.\");\n }\n return;\n }\n\n // Handle Zed\n if (client === \"zed\") {\n try {\n console.log(`Setting up MCP server for Zed in ${folderName}...`);\n const zedDir = path.join(targetPath, \".zed\");\n fs.ensureDirSync(zedDir);\n\n const zedConfig = {\n context_servers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(zedDir, \"settings.json\"), zedConfig, { spaces: 2 });\n console.log(`✅ MCP server configured for Zed in ${folderName}/.zed/settings.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Zed:`, error);\n console.log(\"See https://docs.agentmark.co/agentmark/further_reference/agentmark-mcp for setup instructions.\");\n }\n return;\n }\n\n // Handle Cursor\n if (client === \"cursor\") {\n try {\n console.log(`Setting up MCP server for Cursor in ${folderName}...`);\n const cursorDir = path.join(targetPath, \".cursor\");\n fs.ensureDirSync(cursorDir);\n\n const cursorConfig = {\n mcpServers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(cursorDir, \"mcp.json\"), cursorConfig, { spaces: 2 });\n console.log(`✅ MCP server configured for Cursor in ${folderName}/.cursor/mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Cursor:`, error);\n console.log(\"See https://docs.agentmark.co/agentmark/further_reference/agentmark-mcp for setup instructions.\");\n }\n return;\n }\n\n // Handle Claude Code\n if (client === \"claude-code\") {\n try {\n console.log(`Setting up MCP server for Claude Code in ${folderName}...`);\n\n const mcpConfig = {\n mcpServers: {\n \"agentmark-docs\": {\n type: \"http\",\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(targetPath, \".mcp.json\"), mcpConfig, { spaces: 2 });\n console.log(`✅ MCP server configured for Claude Code in ${folderName}/.mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Claude Code:`, error);\n console.log(\"See https://docs.agentmark.co/agentmark/further_reference/agentmark-mcp for setup instructions.\");\n }\n return;\n }\n};\n\n\nexport const createExampleApp = async (\n client: string,\n targetPath: string = \".\",\n apiKey: string = \"\",\n adapter: string = \"ai-sdk\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n projectInfo: ProjectInfo | null = null,\n resolutions: ConflictResolution[] = []\n) => {\n try {\n const modelProvider = adapter === 'claude-agent-sdk' ? 'anthropic' : 'openai';\n const model = adapter === 'claude-agent-sdk' ? 'anthropic/claude-sonnet-4-20250514' : 'openai/gpt-4o';\n const isExistingProject = projectInfo?.isExistingProject ?? false;\n\n if (isExistingProject) {\n console.log(\"Adding AgentMark to existing project...\");\n } else {\n console.log(\"Creating AgentMark example app...\");\n }\n\n // Keep ./ prefix for display in messages\n const folderName = targetPath;\n\n // Create directory structure\n fs.ensureDirSync(`${targetPath}/agentmark`);\n\n setupMCPServer(client, targetPath);\n\n // Create example prompts\n createExamplePrompts(model, targetPath, adapter);\n console.log(`✅ Example prompts and datasets created in ${folderName}/agentmark/`);\n\n // Create user client config at project root\n // Prefer TS for dev ergonomics\n fs.writeFileSync(\n `${targetPath}/agentmark.client.ts`,\n getClientConfigContent({ provider: modelProvider, adapter, deploymentMode })\n );\n\n // Create or append to .env file\n if (shouldMergeFile('.env', projectInfo, resolutions)) {\n const envVars: Record<string, string> = {};\n const apiKeyEnvVar = adapter === 'claude-agent-sdk' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n if (apiKey) {\n envVars[apiKeyEnvVar] = apiKey;\n } else {\n envVars[apiKeyEnvVar] = adapter === 'claude-agent-sdk' ? 'your-anthropic-api-key' : 'your-openai-api-key';\n }\n const result = appendEnv(targetPath, envVars);\n if (result.added.length > 0) {\n console.log(`✅ Added to .env: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Skipped existing .env vars: ${result.skipped.join(', ')}`);\n }\n } else {\n fs.writeFileSync(`${targetPath}/.env`, getEnvFileContent(modelProvider, apiKey, adapter));\n }\n\n // Create or append to .gitignore\n // Note: .agentmark/ removed - dev-entry.ts is now at project root for version control\n const gitignoreEntries = ['node_modules/', '.env', '*.agentmark-outputs/', 'dist/'];\n if (shouldMergeFile('.gitignore', projectInfo, resolutions)) {\n const result = appendGitignore(targetPath, gitignoreEntries);\n if (result.added.length > 0) {\n console.log(`✅ Added to .gitignore: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Already in .gitignore: ${result.skipped.join(', ')}`);\n }\n } else {\n const gitignore = gitignoreEntries.join('\\n');\n fs.writeFileSync(`${targetPath}/.gitignore`, gitignore);\n }\n\n // Create the main application file (skip for existing projects)\n if (!isExistingProject) {\n fs.writeFileSync(\n `${targetPath}/index.ts`,\n getIndexFileContent(adapter, deploymentMode)\n );\n } else {\n console.log(\"⏭️ Skipped index.ts (existing project)\");\n }\n\n // Create tsconfig.json (skip for existing projects)\n if (!isExistingProject) {\n fs.writeJsonSync(`${targetPath}/tsconfig.json`, getTsConfigContent(), { spaces: 2 });\n } else {\n console.log(\"⏭️ Skipped tsconfig.json (existing project)\");\n }\n\n // Setup package.json and install dependencies\n const packageManager = projectInfo?.packageManager ?? null;\n setupPackageJson(targetPath, deploymentMode, projectInfo);\n installDependencies(modelProvider, targetPath, adapter, deploymentMode, packageManager);\n\n // Generate types file using the type generation library\n console.log(\"Generating types from prompts...\");\n try {\n const agentmarkDir = path.join(targetPath, 'agentmark');\n const prompts = await fetchPromptsFrontmatter({ rootDir: agentmarkDir });\n const typeDefinitions = await generateTypeDefinitions(prompts);\n fs.writeFileSync(`${targetPath}/agentmark.types.ts`, typeDefinitions);\n } catch (error) {\n console.warn(\"Warning: Could not generate types automatically:\", error);\n console.log(\"You can generate types later by running: npx agentmark generate-types --root-dir agentmark\");\n // Create a placeholder types file\n fs.writeFileSync(`${targetPath}/agentmark.types.ts`, `// Auto-generated types from AgentMark\\n// Run 'npx agentmark generate-types --root-dir agentmark' to generate types\\nexport default interface AgentmarkTypes {}\\n`);\n }\n\n // Create dev-entry.ts at project root (version controlled)\n console.log(\"Creating development server entry point...\");\n\n // Get adapter-specific values from config\n const adapterConfig = getAdapterConfig(adapter, modelProvider);\n const { webhookHandler } = adapterConfig.classes;\n\n const devEntryPath = path.join(targetPath, 'dev-entry.ts');\n\n const devEntryContent = `// Development webhook server entry point\n// This file is version controlled - customize as needed for your project\n\nimport { createWebhookServer } from '@agentmark-ai/cli/runner-server';\nimport { ${webhookHandler} } from '${adapterConfig.package}/runner';\nimport { AgentMarkSDK } from '@agentmark-ai/sdk';\nimport path from 'path';\n\nasync function main() {\n const args = process.argv.slice(2);\n const webhookPortArg = args.find(arg => arg.startsWith('--webhook-port='));\n const apiServerPortArg = args.find(arg => arg.startsWith('--api-server-port='));\n\n const webhookPort = webhookPortArg ? parseInt(webhookPortArg.split('=')[1]) : 9417;\n const apiServerPort = apiServerPortArg ? parseInt(apiServerPortArg.split('=')[1]) : 9418;\n const apiServerUrl = \\`http://localhost:\\${apiServerPort}\\`;\n\n // Set environment for development mode before importing client\n process.env.NODE_ENV = 'development';\n process.env.AGENTMARK_BASE_URL = apiServerUrl;\n\n // Now import client - it will pick up the dev environment\n const { client } = await import('./agentmark.client.js');\n\n // Initialize OpenTelemetry tracing to export traces to the API server\n const sdk = new AgentMarkSDK({\n apiKey: '',\n appId: '',\n baseUrl: apiServerUrl,\n });\n sdk.initTracing({ disableBatch: true });\n\n const handler = new ${webhookHandler}(client as any);\n const templatesDirectory = path.join(process.cwd(), 'agentmark');\n\n await createWebhookServer({\n port: webhookPort,\n handler,\n apiServerUrl,\n templatesDirectory\n });\n}\n\nmain().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n`;\n\n // Only create dev-entry.ts if it doesn't exist (preserve existing customizations - FR-003)\n if (fs.existsSync(devEntryPath)) {\n console.log(\"⏭️ Skipped dev-entry.ts (already exists - preserving customizations)\");\n } else {\n fs.writeFileSync(devEntryPath, devEntryContent);\n console.log(`✅ Created dev-entry.ts at project root`);\n }\n\n // Initialize git repo for new projects\n if (!isExistingProject) {\n initGitRepo(targetPath);\n }\n\n // Success message\n console.log(\"\\n✅ Agentmark initialization completed successfully!\");\n\n console.log(\n `\n █████╗ ██████╗ ███████╗███╗ ██╗████████╗███╗ ███╗ █████╗ ██████╗ ██╗ ██╗\n██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝████╗ ████║██╔══██╗██╔══██╗██║ ██╔╝\n███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ██╔████╔██║███████║██████╔╝█████╔╝\n██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗\n██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ██║ ╚═╝ ██║██║ ██║██║ ██║██║ ██╗\n╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝\n\n `\n );\n\n console.log('\\n' + '═'.repeat(70));\n console.log('Next Steps');\n console.log('═'.repeat(70));\n\n // Use detected package manager for instructions\n const runCmd = packageManager?.runCmd ?? 'npm run';\n\n // Check if agentmark script was namespaced\n const pkgJsonPath = path.join(targetPath, 'package.json');\n let agentmarkScriptName = 'agentmark';\n if (fs.existsSync(pkgJsonPath)) {\n const pkgJson = fs.readJsonSync(pkgJsonPath);\n if (pkgJson.scripts?.['agentmark:agentmark']) {\n agentmarkScriptName = 'agentmark:agentmark';\n }\n }\n\n console.log('\\n Get Started:');\n if (folderName !== \".\" && folderName !== \"./\" && !isExistingProject) {\n console.log(` $ cd ${folderName}`);\n }\n console.log(` $ ${runCmd} ${agentmarkScriptName} dev\\n`);\n\n console.log('─'.repeat(70));\n console.log('Resources');\n console.log('─'.repeat(70));\n console.log(' Documentation: https://docs.agentmark.co');\n console.log('═'.repeat(70) + '\\n');\n } catch (error) {\n console.error(\"Error creating example app:\", error);\n throw error;\n }\n};\n","export interface AdapterConfig {\n /** npm package name for the adapter */\n package: string;\n /** Additional npm packages required by this adapter */\n dependencies: string[];\n /** Class names used in generated code */\n classes: {\n modelRegistry: string;\n toolRegistry: string;\n webhookHandler: string;\n };\n}\n\nexport const createAdapterConfig = (\n provider: string\n): Record<string, AdapterConfig> => {\n return {\n \"ai-sdk\": {\n package: \"@agentmark-ai/ai-sdk-v5-adapter\",\n dependencies: [\"ai@^5\", `@ai-sdk/${provider}@^2`],\n classes: {\n modelRegistry: \"VercelAIModelRegistry\",\n toolRegistry: \"VercelAIToolRegistry\",\n webhookHandler: \"VercelAdapterWebhookHandler\",\n },\n },\n mastra: {\n package: \"@agentmark-ai/mastra-v0-adapter\",\n dependencies: [\n \"@mastra/core@<0.20.0\",\n \"@mastra/mcp@<0.13.4\",\n `@ai-sdk/${provider}@<2`,\n ],\n classes: {\n modelRegistry: \"MastraModelRegistry\",\n toolRegistry: \"MastraToolRegistry\",\n webhookHandler: \"MastraAdapterWebhookHandler\",\n },\n },\n \"claude-agent-sdk\": {\n package: \"@agentmark-ai/claude-agent-sdk-adapter\",\n dependencies: [\"@anthropic-ai/claude-agent-sdk@^0.1.0\"],\n classes: {\n modelRegistry: \"ClaudeAgentModelRegistry\",\n toolRegistry: \"ClaudeAgentToolRegistry\",\n webhookHandler: \"ClaudeAgentWebhookHandler\",\n },\n },\n };\n};\n\nexport function getAdapterConfig(\n adapter: string,\n provider: string\n): AdapterConfig {\n const config = createAdapterConfig(provider)[adapter];\n if (!config) {\n throw new Error(\n `Unknown adapter: ${adapter}. Available adapters: ${Object.keys(\n createAdapterConfig(provider)\n ).join(\", \")}`\n );\n }\n return config;\n}\n","export const getIndexFileContent = (adapter: string = \"ai-sdk\", deploymentMode: \"cloud\" | \"static\" = \"cloud\"): string => {\n const isCloud = deploymentMode === \"cloud\";\n\n const tracingImport = `import { AgentMarkSDK } from \"@agentmark-ai/sdk\";\n`;\n\n const cloudTracingInit = `\n// Initialize tracing - traces will be sent to AgentMark Cloud\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: process.env.AGENTMARK_API_KEY ?? \"\",\n appId: process.env.AGENTMARK_APP_ID ?? \"\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const staticTracingInit = `\n// Initialize tracing - traces will be sent to local dev server\n// Make sure to run \"npm run agentmark dev\" in another terminal first\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: \"\",\n appId: \"\",\n baseUrl: \"http://localhost:9418\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const tracingInit = isCloud ? cloudTracingInit : staticTracingInit;\n\n if (adapter === \"claude-agent-sdk\") {\n return `import \"dotenv/config\";\nimport { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { withTracing } from \"@agentmark-ai/claude-agent-sdk-adapter\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const adapted = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n // Execute with Claude Agent SDK using withTracing for telemetry\n // The adapted object contains { query, telemetry } ready for withTracing()\n const tracedResult = await withTracing(query, adapted);\n\n // traceId is available immediately\n console.log(\"Trace ID:\", tracedResult.traceId);\n\n let result = \"\";\n for await (const message of tracedResult) {\n if (message.type === \"result\" && message.subtype === \"success\") {\n result = message.result || \"\";\n }\n }\n\n return result;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else if (adapter === \"mastra\") {\n return `import \"dotenv/config\";\nimport { Agent } from \"@mastra/core/agent\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const agentConfig = await prompt.formatAgent({\n options: {\n telemetry,\n },\n });\n\n const [messages, generateOptions] = await agentConfig.formatMessages({\n props: {\n customer_question: customer_message,\n },\n });\n\n const agent = new Agent(agentConfig);\n const response = await agent.generate(messages, generateOptions);\n\n return (response as any).text || (response as any).content || String(response);\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else {\n return `import \"dotenv/config\";\nimport { generateText } from \"ai\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const vercelInput = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n const resp = await generateText(vercelInput);\n\n return resp.text;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n }\n};\n","export const getEnvFileContent = (\n _modelProvider: string,\n apiKey: string = '',\n adapter: string = 'ai-sdk'\n): string => {\n const apiKeyValue = apiKey || 'your_api_key_here';\n\n // Use ANTHROPIC_API_KEY for claude-agent-sdk adapter\n const apiKeyName = adapter === 'claude-agent-sdk' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n\n return `# Cloud deployment: Set these environment variables\n# AGENTMARK_BASE_URL=https://api.agentmark.co\n# AGENTMARK_API_KEY=your_agentmark_api_key\n# AGENTMARK_APP_ID=your_agentmark_app_id\n# Learn more: https://docs.agentmark.co/platform/getting_started/quickstart\n\n${apiKeyName}=${apiKeyValue}\n`;\n};\n","import fs from \"fs-extra\";\nimport { execSync } from \"child_process\";\nimport { getAdapterConfig } from \"./adapters.js\";\nimport { mergePackageJson } from \"../../file-merge.js\";\nimport { DEFAULT_PACKAGE_MANAGER } from \"../../types.js\";\nimport type { ProjectInfo, PackageManagerConfig } from \"../../types.js\";\n\nexport const setupPackageJson = (\n targetPath: string = \".\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n projectInfo: ProjectInfo | null = null\n) => {\n const packageJsonPath = `${targetPath}/package.json`;\n const isExistingProject = projectInfo?.isExistingProject ?? false;\n\n if (!fs.existsSync(packageJsonPath)) {\n console.log(\"Creating package.json...\");\n execSync(\"npm init -y\", { cwd: targetPath });\n }\n\n // For existing projects, use merge logic\n if (isExistingProject && fs.existsSync(packageJsonPath)) {\n // Build scripts to add - with namespacing for conflicts\n const scriptsToAdd: Record<string, string> = {\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n if (deploymentMode === \"static\") {\n scriptsToAdd[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n // Use mergePackageJson for existing projects\n const result = mergePackageJson(targetPath, {}, {}, scriptsToAdd);\n\n if (result.added.length > 0) {\n console.log(`✅ Added to package.json: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Skipped existing in package.json: ${result.skipped.join(', ')}`);\n }\n if (result.warnings.length > 0) {\n result.warnings.forEach((w) => console.log(`⚠️ ${w}`));\n }\n } else {\n // Update the created package.json with additional information\n const pkgJson = fs.readJsonSync(packageJsonPath);\n pkgJson.name =\n pkgJson.name === \"test\" || !pkgJson.name\n ? \"agentmark-example-app\"\n : pkgJson.name;\n pkgJson.description =\n pkgJson.description || \"A simple Node.js app using the Agentmark SDK\";\n\n // Base scripts for all modes\n const scripts: Record<string, string> = {\n ...pkgJson.scripts,\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n // For static/self-hosted mode, add the build script\n if (deploymentMode === \"static\") {\n scripts[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n pkgJson.scripts = scripts;\n\n fs.writeJsonSync(packageJsonPath, pkgJson, { spaces: 2 });\n }\n};\n\nexport const installDependencies = (\n modelProvider: string,\n targetPath: string = \".\",\n adapter: string = \"ai-sdk\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n packageManager: PackageManagerConfig | null = null\n) => {\n console.log(\"Installing required packages...\");\n console.log(\"This might take a moment...\");\n\n const adapterConfig = getAdapterConfig(adapter, modelProvider);\n\n // Use detected package manager or default to npm\n const pm = packageManager || DEFAULT_PACKAGE_MANAGER;\n\n // npm needs --legacy-peer-deps due to some transitive dependency conflicts\n const npmSuffix = pm.name === 'npm' ? ' --legacy-peer-deps' : '';\n\n try {\n // Dev dependencies to install\n const devDeps = ['typescript', 'ts-node', '@types/node', '@agentmark-ai/cli'];\n\n // Install dev dependencies using detected package manager config\n const devDepsCmd = `${pm.addDevCmd} ${devDeps.join(' ')}${npmSuffix}`;\n\n console.log(`Using ${pm.name} to install dependencies...`);\n\n execSync(devDepsCmd, {\n stdio: \"inherit\",\n cwd: targetPath,\n });\n\n // Install the common packages\n // SDK is required for both local (connects to agentmark serve) and cloud (connects to API)\n // Loader packages are imported directly - ApiLoader always needed, FileLoader only for static mode\n const loaderPackages = deploymentMode === \"static\"\n ? [\"@agentmark-ai/loader-api\", \"@agentmark-ai/loader-file\"]\n : [\"@agentmark-ai/loader-api\"];\n\n const deps = [\n \"dotenv\",\n \"@agentmark-ai/prompt-core\",\n \"@agentmark-ai/sdk\",\n adapterConfig.package,\n ...loaderPackages,\n ...adapterConfig.dependencies,\n ];\n\n // Install regular dependencies using detected package manager config\n const depsCmd = `${pm.addCmd} ${deps.join(' ')}${npmSuffix}`;\n\n execSync(depsCmd, { stdio: \"inherit\", cwd: targetPath });\n\n console.log(\"Packages installed successfully!\");\n } catch (error) {\n console.error(\"Error installing packages:\", error);\n throw new Error(\n \"Failed to install required packages. Please check your network connection and try again.\"\n );\n }\n};\n","/**\n * File merge utilities for handling existing files during initialization.\n * Supports merging package.json, appending to .gitignore and .env files.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport type { MergeResult } from './types.js';\n\n/**\n * Merge AgentMark dependencies and scripts into an existing package.json.\n * Preserves all existing content, only adds missing AgentMark entries.\n */\nexport function mergePackageJson(\n targetPath: string,\n agentmarkDeps: Record<string, string>,\n agentmarkDevDeps: Record<string, string>,\n agentmarkScripts: Record<string, string>\n): MergeResult {\n const packageJsonPath = path.join(targetPath, 'package.json');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n // Read existing package.json\n if (!fs.existsSync(packageJsonPath)) {\n result.warnings.push('No existing package.json found');\n return result;\n }\n\n const existing = fs.readJsonSync(packageJsonPath) as Record<string, unknown>;\n\n // Initialize sections if they don't exist\n if (!existing.dependencies) {\n existing.dependencies = {};\n }\n if (!existing.devDependencies) {\n existing.devDependencies = {};\n }\n if (!existing.scripts) {\n existing.scripts = {};\n }\n\n const deps = existing.dependencies as Record<string, string>;\n const devDeps = existing.devDependencies as Record<string, string>;\n const scripts = existing.scripts as Record<string, string>;\n\n // Add AgentMark dependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDeps)) {\n if (deps[pkg]) {\n result.skipped.push(`dependency: ${pkg} (already exists)`);\n } else {\n deps[pkg] = version;\n result.added.push(`dependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark devDependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDevDeps)) {\n if (devDeps[pkg]) {\n result.skipped.push(`devDependency: ${pkg} (already exists)`);\n } else {\n devDeps[pkg] = version;\n result.added.push(`devDependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark scripts (use namespace if conflict exists)\n for (const [scriptName, scriptCmd] of Object.entries(agentmarkScripts)) {\n if (scripts[scriptName]) {\n // Conflict - use namespaced script name\n const namespacedName = `agentmark:${scriptName}`;\n if (scripts[namespacedName]) {\n // Both the original and namespaced version exist - skip with warning\n result.skipped.push(`script: ${scriptName}`);\n result.warnings.push(\n `Script \"${scriptName}\" and \"${namespacedName}\" both already exist. Skipping.`\n );\n } else {\n scripts[namespacedName] = scriptCmd;\n result.added.push(`script: ${namespacedName} (namespaced due to conflict)`);\n result.warnings.push(\n `Script \"${scriptName}\" already exists. Added as \"${namespacedName}\" instead.`\n );\n }\n } else {\n scripts[scriptName] = scriptCmd;\n result.added.push(`script: ${scriptName}`);\n }\n }\n\n // Write merged package.json\n fs.writeJsonSync(packageJsonPath, existing, { spaces: 2 });\n\n result.success = true;\n result.content = JSON.stringify(existing, null, 2);\n return result;\n } catch (error) {\n result.warnings.push(`Error merging package.json: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark entries to an existing .gitignore file.\n * Checks for duplicates before adding.\n */\nexport function appendGitignore(targetPath: string, entries: string[]): MergeResult {\n const gitignorePath = path.join(targetPath, '.gitignore');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(gitignorePath)) {\n existingContent = fs.readFileSync(gitignorePath, 'utf-8');\n }\n\n // Parse existing entries (normalize trailing slashes)\n const existingEntries = new Set(\n existingContent\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'))\n .map((line) => line.replace(/\\/$/, '')) // Remove trailing slashes for comparison\n );\n\n const entriesToAdd: string[] = [];\n\n for (const entry of entries) {\n const normalizedEntry = entry.replace(/\\/$/, '');\n if (existingEntries.has(normalizedEntry)) {\n result.skipped.push(entry);\n } else {\n entriesToAdd.push(entry);\n result.added.push(entry);\n }\n }\n\n if (entriesToAdd.length > 0) {\n // Add a header comment and the new entries\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n newContent += entriesToAdd.join('\\n');\n newContent += '\\n';\n\n fs.writeFileSync(gitignorePath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .gitignore: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark environment variables to an existing .env file.\n * Does not overwrite existing keys.\n */\nexport function appendEnv(\n targetPath: string,\n envVars: Record<string, string>\n): MergeResult {\n const envPath = path.join(targetPath, '.env');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(envPath)) {\n existingContent = fs.readFileSync(envPath, 'utf-8');\n }\n\n // Parse existing keys\n const existingKeys = new Set<string>();\n const lines = existingContent.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const match = trimmed.match(/^([^=]+)=/);\n if (match && match[1]) {\n existingKeys.add(match[1]);\n }\n }\n }\n\n const varsToAdd: Array<[string, string]> = [];\n\n for (const [key, value] of Object.entries(envVars)) {\n if (existingKeys.has(key)) {\n result.skipped.push(key);\n } else {\n varsToAdd.push([key, value]);\n result.added.push(key);\n }\n }\n\n if (varsToAdd.length > 0) {\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n for (const [key, value] of varsToAdd) {\n newContent += `${key}=${value}\\n`;\n }\n\n fs.writeFileSync(envPath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .env: ${error}`);\n return result;\n }\n}\n\n/**\n * Check if a file should be skipped based on existing project detection.\n * Used for files like index.ts that should never be generated in existing projects.\n */\nexport function shouldSkipFile(\n fileName: string,\n isExistingProject: boolean,\n skipFiles: string[]\n): boolean {\n if (!isExistingProject) {\n return false;\n }\n return skipFiles.includes(fileName);\n}\n","/**\n * Type definitions for existing repository initialization.\n * These types support project detection, conflict resolution, and package manager handling.\n */\n\n/** Supported package managers for TypeScript projects */\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\n/** Configuration for a specific package manager */\nexport interface PackageManagerConfig {\n /** Package manager name */\n name: PackageManager;\n /** Lock file that indicates this package manager is in use */\n lockFile: string;\n /** Command to install all dependencies */\n installCmd: string;\n /** Command to add a production dependency */\n addCmd: string;\n /** Command to add a dev dependency */\n addDevCmd: string;\n /** Command prefix for running scripts (e.g., 'npm run', 'yarn') */\n runCmd: string;\n}\n\n/** Package manager configurations indexed by lock file name */\nexport const PACKAGE_MANAGERS: Record<string, PackageManagerConfig> = {\n 'yarn.lock': {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCmd: 'yarn install',\n addCmd: 'yarn add',\n addDevCmd: 'yarn add --dev',\n runCmd: 'yarn',\n },\n 'pnpm-lock.yaml': {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCmd: 'pnpm install',\n addCmd: 'pnpm add',\n addDevCmd: 'pnpm add --save-dev',\n runCmd: 'pnpm',\n },\n 'bun.lockb': {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCmd: 'bun install',\n addCmd: 'bun add',\n addDevCmd: 'bun add --dev',\n runCmd: 'bun run',\n },\n 'package-lock.json': {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCmd: 'npm install',\n addCmd: 'npm install',\n addDevCmd: 'npm install --save-dev',\n runCmd: 'npm run',\n },\n};\n\n/** Default package manager when no lock file is found */\nexport const DEFAULT_PACKAGE_MANAGER: PackageManagerConfig = PACKAGE_MANAGERS['package-lock.json']!;\n\n/** Information about a detected Python virtual environment */\nexport interface PythonVenvInfo {\n /** Absolute path to the venv directory */\n path: string;\n /** Relative name (e.g., '.venv' or 'venv') */\n name: string;\n /** Platform-specific activate command */\n activateCmd: string;\n /** Platform-specific pip path */\n pipPath: string;\n}\n\n/** Type of file for determining merge strategy */\nexport type FileType = 'config' | 'source' | 'directory' | 'dotfile';\n\n/** Resolution strategy for a conflicting file */\nexport type ConflictStrategy = 'merge' | 'append' | 'prompt' | 'skip';\n\n/** Represents a file that may conflict with AgentMark initialization */\nexport interface ConflictFile {\n /** Relative path from project root */\n path: string;\n /** Type of file for determining merge strategy */\n type: FileType;\n /** Recommended resolution strategy */\n strategy: ConflictStrategy;\n}\n\n/** Files that may conflict with AgentMark initialization */\nexport const CONFLICT_FILES: ConflictFile[] = [\n { path: 'agentmark.json', type: 'config', strategy: 'prompt' },\n { path: 'agentmark', type: 'directory', strategy: 'prompt' },\n { path: 'agentmark.client.ts', type: 'source', strategy: 'prompt' },\n { path: 'agentmark_client.py', type: 'source', strategy: 'prompt' },\n { path: '.gitignore', type: 'dotfile', strategy: 'append' },\n { path: '.env', type: 'dotfile', strategy: 'append' },\n { path: 'package.json', type: 'config', strategy: 'merge' },\n { path: 'index.ts', type: 'source', strategy: 'skip' },\n { path: 'main.py', type: 'source', strategy: 'skip' },\n { path: 'tsconfig.json', type: 'config', strategy: 'skip' },\n { path: 'pyproject.toml', type: 'config', strategy: 'skip' },\n];\n\n/** User's resolution choice for a conflict */\nexport type ConflictAction = 'skip' | 'overwrite' | 'merge';\n\n/** A conflict resolution decision from the user */\nexport interface ConflictResolution {\n /** Path to the conflicting file */\n path: string;\n /** Action chosen by the user */\n action: ConflictAction;\n}\n\n/** Detected information about an existing project */\nexport interface ProjectInfo {\n /** Whether any project indicators were found */\n isExistingProject: boolean;\n /** Detected project type */\n type: 'typescript' | 'python' | 'unknown';\n /** Detected package manager (for TypeScript projects) */\n packageManager: PackageManagerConfig;\n /** Files that exist and may conflict */\n conflictingFiles: ConflictFile[];\n /** Whether the agentmark/ directory already exists */\n hasAgentmarkDir: boolean;\n /** Whether an existing Python venv was detected */\n pythonVenv: PythonVenvInfo | null;\n}\n\n/** Result of a file merge operation */\nexport interface MergeResult {\n /** Whether the merge was successful */\n success: boolean;\n /** The merged content (if applicable) */\n content?: string;\n /** Any warnings generated during merge */\n warnings: string[];\n /** What was added (for user feedback) */\n added: string[];\n /** What was skipped (already present) */\n skipped: string[];\n}\n\n/** Extended options for initialization in existing projects */\nexport interface InitOptions {\n /** Target directory path */\n targetPath: string;\n /** Selected language */\n language: 'typescript' | 'python';\n /** Selected adapter (TypeScript only) */\n adapter?: string;\n /** Deployment mode */\n deploymentMode: 'cloud' | 'static';\n /** API key (if provided) */\n apiKey?: string;\n /** IDE client for MCP setup */\n client: string;\n /** Detected project info (null if new project) */\n projectInfo: ProjectInfo | null;\n /** User's conflict resolutions */\n conflictResolutions: ConflictResolution[];\n}\n","export const getTsConfigContent = (): object => {\n return {\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n }\n };\n}; ","export const getAnimalDrawingPrompt = (): string => {\n return `---\nname: animal-drawing\nimage_config:\n model_name: openai/dall-e-3\n num_images: 1\n size: 1024x1024\n aspect_ratio: 1:1\ntest_settings:\n dataset: animal.jsonl\n props:\n animal: \"cat\"\n---\n\n<ImagePrompt>\nDraw a hyper-realistic picture of a {props.animal}\n</ImagePrompt>`;\n};","export const getCustomerSupportPrompt = (model: string): string => {\n return `---\nname: customer-support-agent\ntext_config:\n model_name: ${model}\n max_calls: 2\n tools:\n search_knowledgebase:\n description: Search the company knowledgebase for information about shipping, warranty, and returns policies.\n parameters:\n type: object\n properties:\n query:\n type: string\n description: The search query to find relevant information\n required: [query]\ntest_settings:\n dataset: customer-query.jsonl\n props:\n customer_question: \"I'm having trouble with my order. How long does shipping take?\"\ninput_schema:\n type: object\n properties:\n customer_question:\n type: string\n description: \"The customer's question\"\n required:\n - customer_question\n---\n\n<System>\nYou are a customer service agent for a company that sells products online. You are given a customer's question and you need to respond to the customer. You need to be friendly, professional, and helpful.\n\nYou have access to the following tool:\n- search_knowledgebase: Search the company knowledgebase for information about shipping, warranty, and returns. Use this when customers ask about these topics.\n</System>\n\n<User>{props.customer_question}</User>`;\n};","export const getPartyPlannerPrompt = (model: string): string => {\n return `---\nname: party-planner\nobject_config:\n model_name: ${model}\n schema:\n type: object\n properties:\n names:\n type: array\n description: \"List of names of people attending the party.\"\n items:\n type: string\n required:\n - names\ntest_settings:\n dataset: party.jsonl\n evals:\n - exact_match_json\n props:\n party_text: \"We're having a party with Alice, Bob, and Carol.\"\ninput_schema:\n type: object\n properties:\n party_text:\n type: string\n description: \"A block of text describing the upcoming party and attendees.\"\n required:\n - party_text\n---\n\n<System>\nExtract the names of all people attending the party from the following text. Respond with a list of names only.\n</System>\n\n<User>\nText: {props.party_text}\n</User>`;\n};","export const getStoryTellerPrompt = (): string => {\n return `---\nname: story-teller\nspeech_config:\n model_name: openai/tts-1-hd\n voice: \"nova\"\n speed: 1.0\n output_format: \"mp3\"\ntest_settings:\n dataset: story.jsonl\n props:\n story: \"Once upon a time, there was a cat who loved to play with a ball.\"\n---\n\n<System>\nYou are a storyteller for children. Make sure your story is engaging and interesting.\n</System>\n\n<SpeechPrompt>\n- {props.story}\n</SpeechPrompt>`;\n};","export const getAnimalDataset = (): string => {\n return `{\"input\": {\"animal\": \"cat\"}, \"expected_output\": \"A realistic picture of a cat\"}\n{\"input\": {\"animal\": \"dog\"}, \"expected_output\": \"A realistic picture of a dog\"}\n{\"input\": {\"animal\": \"bird\"}, \"expected_output\": \"A realistic picture of a bird\"}`;\n};\n\nexport const getCustomerQueryDataset = (): string => {\n return `{\"input\": {\"customer_question\": \"My package hasn't arrived yet. Can you help me track it?\"}}\n{\"input\": {\"customer_question\": \"I received the wrong item in my order. What should I do?\"}}\n{\"input\": {\"customer_question\": \"How do I return a product that I purchased last week?\"}}`;\n};\n\nexport const getPartyDataset = (): string => {\n return `{\"input\": {\"party_text\": \"We're having a party with Alice, Bob, and Carol.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Alice\\\\\", \\\\\"Bob\\\\\", \\\\\"Carol\\\\\"]}\"}\n{\"input\": {\"party_text\": \"The guest list includes Dave, Emma, and Frank.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Dave\\\\\", \\\\\"Emma\\\\\", \\\\\"Frank\\\\\"]}\"}\n{\"input\": {\"party_text\": \"Join us for a celebration with Grace, Henry, and Isla.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Grace\\\\\", \\\\\"Henry\\\\\", \\\\\"Isla\\\\\"]}\"}`;\n};\n\nexport const getStoryDataset = (): string => {\n return `{\"input\": {\"story\": \"Once upon a time, the Moon woke up and found her glow missing! She floated around the sky asking stars, clouds, and even comets if they'd seen her light. It wasn't until she peeked into a mountain lake that she saw her glow shining back—hidden in her own reflection! Laughing, she realized she had never lost it—it was with her all along, just hiding beneath a cloudy sky.\"}}\n{\"input\": {\"story\": \"Benny was no ordinary banana—he dreamed of becoming a superhero. One day, when a monkey slipped in the jungle and cried for help, Benny rolled into action, dodging vines and swinging from branches using his peel like a lasso. The monkey was saved, and from that day on, Benny was known as \\\\\"The Peel of Justice,\\\\\" the bravest fruit in the whole rainforest.\"}}\n{\"input\": {\"story\": \"In the town of Maplebrook, there was a library that whispered stories when no one was looking. Curious little Nia tiptoed in one rainy day and heard the books giggling softly. She opened one called The Secret Tunnel, and to her surprise, it sucked her in! She found herself riding a dragon through glittering caves. When she returned, the book winked shut—waiting for its next reader to listen.\"}}`;\n};","import fs from 'fs-extra';\nimport { getAnimalDrawingPrompt } from './animal-drawing-prompt.js';\nimport { getCustomerSupportPrompt } from './customer-support-prompt.js';\nimport { getPartyPlannerPrompt } from './party-planner-prompt.js';\nimport { getStoryTellerPrompt } from './story-teller-prompt.js';\nimport { getAnimalDataset, getCustomerQueryDataset, getPartyDataset, getStoryDataset } from './datasets.js';\n\nexport const createExamplePrompts = (model: string, targetPath: string = \".\", adapter: string = \"ai-sdk\") => {\n // Ensure the templates directory exists\n fs.ensureDirSync(`${targetPath}/agentmark`);\n\n const noImageSupport = [\"mastra\", \"claude-agent-sdk\"];\n const noSpeechSupport = [\"mastra\", \"claude-agent-sdk\"];\n const skipImagePrompts = noImageSupport.includes(adapter);\n const skipSpeechPrompts = noSpeechSupport.includes(adapter);\n\n // Create animal drawing prompt and dataset (uses image_config - skip for unsupported adapters)\n if (!skipImagePrompts) {\n const animalDrawingPrompt = getAnimalDrawingPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/animal-drawing.prompt.mdx`, animalDrawingPrompt);\n const animalDataset = getAnimalDataset();\n fs.writeFileSync(`${targetPath}/agentmark/animal.jsonl`, animalDataset);\n }\n\n // Create customer support prompt and dataset\n const customerSupportPrompt = getCustomerSupportPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/customer-support-agent.prompt.mdx`, customerSupportPrompt);\n const customerQueryDataset = getCustomerQueryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/customer-query.jsonl`, customerQueryDataset);\n\n // Create party planner prompt and dataset\n const partyPlannerPrompt = getPartyPlannerPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/party-planner.prompt.mdx`, partyPlannerPrompt);\n const partyDataset = getPartyDataset();\n fs.writeFileSync(`${targetPath}/agentmark/party.jsonl`, partyDataset);\n\n // Create story teller prompt and dataset (uses speech_config - skip for unsupported adapters)\n if (!skipSpeechPrompts) {\n const storyTellerPrompt = getStoryTellerPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/story-teller.prompt.mdx`, storyTellerPrompt);\n const storyDataset = getStoryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/story.jsonl`, storyDataset);\n }\n};","import { getAdapterConfig } from \"./adapters.js\";\n\nexport const getClientConfigContent = (options: { provider: string; adapter: string; deploymentMode?: \"cloud\" | \"static\" }) => {\n const { provider, adapter, deploymentMode = \"cloud\" } = options;\n const adapterConfig = getAdapterConfig(adapter, provider);\n const { modelRegistry, toolRegistry } = adapterConfig.classes;\n\n // Claude Agent SDK doesn't use @ai-sdk provider imports\n const isClaudeAgentSdk = adapter === \"claude-agent-sdk\";\n const providerImport = isClaudeAgentSdk ? '' : `import { ${provider} } from '@ai-sdk/${provider}';`;\n\n // Import loaders from dedicated packages\n const loaderImport = deploymentMode === \"cloud\"\n ? `import { ApiLoader } from \"@agentmark-ai/loader-api\";`\n : `import { ApiLoader } from \"@agentmark-ai/loader-api\";\nimport { FileLoader } from \"@agentmark-ai/loader-file\";`;\n\n const loaderSetup = deploymentMode === \"cloud\"\n ? ` // ApiLoader works for both development and production\n // - Development: 'agentmark dev' sets AGENTMARK_BASE_URL to localhost\n // - Production: Set AGENTMARK_API_KEY and AGENTMARK_APP_ID for cloud\n const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : ApiLoader.cloud({\n apiKey: process.env.AGENTMARK_API_KEY!,\n appId: process.env.AGENTMARK_APP_ID!,\n });`\n : ` const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : new FileLoader('./dist/agentmark');`;\n\n // Claude Agent SDK model registry setup is different\n const modelRegistrySetup = isClaudeAgentSdk\n ? `function createModelRegistry() {\n // Claude Agent SDK accepts model names directly.\n // Use createDefault() for simple pass-through of model names.\n const modelRegistry = ${modelRegistry}.createDefault();\n\n // To configure specific models (e.g., extended thinking), use:\n // const modelRegistry = new ${modelRegistry}()\n // .registerModels(/claude-.*-thinking/, (name) => ({\n // model: name,\n // maxThinkingTokens: 10000, // Enable extended thinking\n // }))\n // .registerModels(\"claude-sonnet-4-20250514\", (name) => ({ model: name }));\n\n return modelRegistry;\n}`\n : `function createModelRegistry() {\n const modelRegistry = new ${modelRegistry}()\n .registerProviders({ ${provider} });\n return modelRegistry;\n}`;\n\n // Claude Agent SDK adapter options\n const adapterOptionsImport = isClaudeAgentSdk\n ? `\n// Claude Agent SDK adapter options\n// See: https://github.com/anthropics/claude-agent-sdk\nconst adapterOptions = {\n // Permission mode controls tool access:\n // - 'default': Requires user approval for each tool use\n // - 'acceptEdits': Auto-approve file edits only\n // - 'bypassPermissions': Auto-approve all tools (use for automated pipelines)\n // - 'plan': Planning mode only, no tool execution\n permissionMode: 'bypassPermissions' as const,\n\n // Maximum conversation turns before stopping\n maxTurns: 20,\n\n // Optional: Set working directory for file operations\n // cwd: process.cwd(),\n\n // Optional: Budget limit in USD\n // maxBudgetUsd: 10.00,\n\n // Optional: Restrict which tools the agent can use\n // allowedTools: ['Read', 'Write', 'Glob'],\n // disallowedTools: ['Bash'],\n};`\n : '';\n\n const createClientCall = isClaudeAgentSdk\n ? `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry, adapterOptions });`\n : `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry });`;\n\n return `// agentmark.client.ts\nimport path from 'node:path';\nimport dotenv from 'dotenv';\ndotenv.config({ path: path.resolve(__dirname, '.env') });\nimport { createAgentMarkClient, ${modelRegistry}, ${toolRegistry}, EvalRegistry } from \"${adapterConfig.package}\";\n${loaderImport}\nimport AgentMarkTypes, { Tools } from './agentmark.types';\n${providerImport}\n${adapterOptionsImport}\n\n${modelRegistrySetup}\n\nfunction createToolRegistry() {\n const toolRegistry = new ${toolRegistry}<Tools>()\n .register('search_knowledgebase', async ({ query }) => {\n // Simulate search delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Return all three knowledge base articles\n // The LLM will select the relevant one based on the query\n return {\n articles: [\n { topic: 'shipping', content: 'Standard shipping takes 3–5 business days.' },\n { topic: 'warranty', content: 'All products include a 1-year limited warranty.' },\n { topic: 'returns', content: 'You can return items within 30 days of delivery.' }\n ]\n };\n });\n return toolRegistry;\n}\n\nfunction createEvalRegistry() {\n const evalRegistry = new EvalRegistry()\n .register('exact_match_json', ({ output, expectedOutput }) => {\n if (!expectedOutput) {\n return { score: 0, label: 'error', reason: 'No expected output provided', passed: false };\n }\n try {\n const ok = JSON.stringify(output) === JSON.stringify(JSON.parse(expectedOutput));\n return {\n score: ok ? 1 : 0,\n label: ok ? 'correct' : 'incorrect',\n reason: ok ? 'Exact match' : 'Mismatch',\n passed: ok\n };\n } catch (e) {\n return { score: 0, label: 'error', reason: 'Failed to parse expected output as JSON', passed: false };\n }\n });\n return evalRegistry;\n}\n\nfunction createClient() {\n${loaderSetup}\n const modelRegistry = createModelRegistry();\n const toolRegistry = createToolRegistry();\n const evalRegistry = createEvalRegistry();\n ${createClientCall}\n}\n\nexport const client = createClient();\n`;\n};\n","/**\n * Conflict resolution utilities for handling existing files.\n * Prompts users for resolution when files would be overwritten.\n */\n\nimport prompts from 'prompts';\nimport type {\n ConflictFile,\n ConflictResolution,\n ConflictAction,\n ProjectInfo,\n} from './types.js';\n\n/**\n * Filter conflicts that require user prompting.\n * Returns only conflicts with 'prompt' strategy that actually exist.\n */\nexport function getPromptableConflicts(conflictingFiles: ConflictFile[]): ConflictFile[] {\n return conflictingFiles.filter((file) => file.strategy === 'prompt');\n}\n\n/**\n * Prompt user for resolution of a single conflict.\n */\nasync function promptForSingleConflict(\n conflict: ConflictFile\n): Promise<ConflictResolution> {\n const typeLabel = conflict.type === 'directory' ? 'directory' : 'file';\n\n const { action } = await prompts({\n type: 'select',\n name: 'action',\n message: `${conflict.path} already exists. What would you like to do?`,\n choices: [\n {\n title: `Skip (keep existing ${typeLabel})`,\n value: 'skip',\n description: `Don't modify the existing ${typeLabel}`,\n },\n {\n title: 'Overwrite',\n value: 'overwrite',\n description: `Replace with new AgentMark ${typeLabel}`,\n },\n ],\n initial: 0, // Default to skip for safety\n });\n\n return {\n path: conflict.path,\n action: action as ConflictAction || 'skip',\n };\n}\n\n/**\n * Prompt user for resolution of all conflicts that require prompting.\n * Returns an array of resolution decisions.\n */\nexport async function promptForResolutions(\n conflictingFiles: ConflictFile[]\n): Promise<ConflictResolution[]> {\n const promptableConflicts = getPromptableConflicts(conflictingFiles);\n\n if (promptableConflicts.length === 0) {\n return [];\n }\n\n console.log('\\n⚠️ Found existing files that may conflict with AgentMark initialization:\\n');\n\n const resolutions: ConflictResolution[] = [];\n\n for (const conflict of promptableConflicts) {\n const resolution = await promptForSingleConflict(conflict);\n resolutions.push(resolution);\n }\n\n console.log(''); // Add blank line after prompts\n return resolutions;\n}\n\n/**\n * Get the resolution action for a specific file path.\n * Returns the user's choice or the default strategy if no prompt was needed.\n */\nexport function getResolutionAction(\n filePath: string,\n resolutions: ConflictResolution[],\n conflictingFiles: ConflictFile[]\n): ConflictAction {\n // First check if user provided a resolution\n const userResolution = resolutions.find((r) => r.path === filePath);\n if (userResolution) {\n return userResolution.action;\n }\n\n // Check the default strategy for this file\n const conflictFile = conflictingFiles.find((f) => f.path === filePath);\n if (conflictFile) {\n // Map strategy to action\n switch (conflictFile.strategy) {\n case 'skip':\n return 'skip';\n case 'merge':\n return 'merge';\n case 'append':\n return 'merge'; // Append is a form of merge\n case 'prompt':\n // If we got here without a resolution, default to skip for safety\n return 'skip';\n }\n }\n\n // Default: overwrite (file doesn't conflict or isn't tracked)\n return 'overwrite';\n}\n\n/**\n * Check if a file should be skipped based on resolutions.\n */\nexport function shouldSkipFile(\n filePath: string,\n projectInfo: ProjectInfo | null,\n resolutions: ConflictResolution[]\n): boolean {\n if (!projectInfo || !projectInfo.isExistingProject) {\n return false;\n }\n\n const action = getResolutionAction(filePath, resolutions, projectInfo.conflictingFiles);\n return action === 'skip';\n}\n\n/**\n * Check if a file should be merged based on resolutions.\n */\nexport function shouldMergeFile(\n filePath: string,\n projectInfo: ProjectInfo | null,\n resolutions: ConflictResolution[]\n): boolean {\n if (!projectInfo || !projectInfo.isExistingProject) {\n return false;\n }\n\n const action = getResolutionAction(filePath, resolutions, projectInfo.conflictingFiles);\n return action === 'merge';\n}\n\n/**\n * Display a summary of existing project detection.\n */\nexport function displayProjectDetectionSummary(projectInfo: ProjectInfo): void {\n if (!projectInfo.isExistingProject) {\n return;\n }\n\n console.log('\\n📁 Detected existing project:');\n console.log(` Type: ${projectInfo.type}`);\n\n if (projectInfo.type === 'typescript') {\n console.log(` Package Manager: ${projectInfo.packageManager.name}`);\n }\n\n if (projectInfo.pythonVenv) {\n console.log(` Python Venv: ${projectInfo.pythonVenv.name}`);\n }\n\n if (projectInfo.hasAgentmarkDir) {\n console.log(' ⚠️ AgentMark directory already exists');\n }\n\n console.log('');\n}\n","import { execSync } from \"child_process\";\n\n/**\n * Initialize a git repository and create an initial commit.\n *\n * Skips silently when:\n * - The target path is already inside a git repository\n * - git is not installed\n * - Any git command fails (non-fatal)\n */\nexport function initGitRepo(targetPath: string): boolean {\n try {\n // Check if git is available\n try {\n execSync(\"git --version\", { stdio: \"ignore\" });\n } catch {\n console.log(\"⚠️ git not found — skipping repository initialization\");\n return false;\n }\n\n // Check if already inside a git repo\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", {\n cwd: targetPath,\n stdio: \"ignore\",\n });\n // Already in a git repo — skip\n return false;\n } catch {\n // Not in a git repo — proceed\n }\n\n execSync(\"git init\", { cwd: targetPath, stdio: \"ignore\" });\n execSync(\"git add -A\", { cwd: targetPath, stdio: \"ignore\" });\n execSync(\n 'git -c user.name=\"create-agentmark\" -c user.email=\"noreply\" commit -m \"Initial commit from create-agentmark\"',\n { cwd: targetPath, stdio: \"ignore\" },\n );\n\n console.log(\"✅ Initialized git repository with initial commit\");\n return true;\n } catch {\n console.log(\"⚠️ Could not initialize git repository\");\n return false;\n }\n}\n","import fs from \"fs-extra\";\nimport * as path from \"path\";\nimport {\n createExamplePrompts,\n} from \"./templates/index.js\";\nimport { appendGitignore, appendEnv } from \"../file-merge.js\";\nimport { shouldMergeFile } from \"../conflict-resolution.js\";\nimport type { ProjectInfo, ConflictResolution } from \"../types.js\";\nimport { initGitRepo } from \"../git-init.js\";\n\nconst setupMCPServer = (client: string, targetPath: string) => {\n if (client === \"skip\") {\n console.log(\"Skipping MCP server setup.\");\n return;\n }\n\n const folderName = targetPath;\n\n // Handle VS Code\n if (client === \"vscode\") {\n try {\n console.log(`Setting up MCP server for VS Code in ${folderName}...`);\n const vscodeDir = path.join(targetPath, \".vscode\");\n fs.ensureDirSync(vscodeDir);\n\n const mcpConfig = {\n servers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(vscodeDir, \"mcp.json\"), mcpConfig, { spaces: 2 });\n console.log(`MCP server configured for VS Code in ${folderName}/.vscode/mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for VS Code:`, error);\n }\n return;\n }\n\n // Handle Zed\n if (client === \"zed\") {\n try {\n console.log(`Setting up MCP server for Zed in ${folderName}...`);\n const zedDir = path.join(targetPath, \".zed\");\n fs.ensureDirSync(zedDir);\n\n const zedConfig = {\n context_servers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(zedDir, \"settings.json\"), zedConfig, { spaces: 2 });\n console.log(`MCP server configured for Zed in ${folderName}/.zed/settings.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Zed:`, error);\n }\n return;\n }\n\n // Handle Cursor\n if (client === \"cursor\") {\n try {\n console.log(`Setting up MCP server for Cursor in ${folderName}...`);\n const cursorDir = path.join(targetPath, \".cursor\");\n fs.ensureDirSync(cursorDir);\n\n const cursorConfig = {\n mcpServers: {\n \"agentmark-docs\": {\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(cursorDir, \"mcp.json\"), cursorConfig, { spaces: 2 });\n console.log(`MCP server configured for Cursor in ${folderName}/.cursor/mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Cursor:`, error);\n }\n return;\n }\n\n // Handle Claude Code\n if (client === \"claude-code\") {\n try {\n console.log(`Setting up MCP server for Claude Code in ${folderName}...`);\n\n const mcpConfig = {\n mcpServers: {\n \"agentmark-docs\": {\n type: \"http\",\n url: \"https://docs.agentmark.co/mcp\"\n },\n \"agentmark-traces\": {\n command: \"npx\",\n args: [\"@agentmark-ai/mcp-server\"],\n env: {\n AGENTMARK_URL: \"http://localhost:9418\"\n }\n }\n }\n };\n\n fs.writeJsonSync(path.join(targetPath, \".mcp.json\"), mcpConfig, { spaces: 2 });\n console.log(`MCP server configured for Claude Code in ${folderName}/.mcp.json`);\n } catch (error) {\n console.warn(`Warning: Could not set up MCP server for Claude Code:`, error);\n }\n return;\n }\n};\n\nconst getPyprojectContent = (projectName: string, adapter: string): string => {\n if (adapter === \"claude-agent-sdk\") {\n return `[project]\nname = \"${projectName}\"\nversion = \"0.1.0\"\ndescription = \"An AgentMark application using Claude Agent SDK\"\nrequires-python = \">=3.12\"\ndependencies = [\n \"agentmark-sdk>=0.1.0\",\n \"agentmark-claude-agent-sdk>=0.1.0\",\n \"agentmark-prompt-core>=0.1.0\",\n \"python-dotenv>=1.0.0\",\n \"claude-agent-sdk>=0.1.0\",\n]\n\n[project.optional-dependencies]\ndev = [\n \"pytest>=7.0\",\n \"pytest-asyncio>=0.21\",\n \"mypy>=1.0\",\n]\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\n[tool.mypy]\nstrict = true\n`;\n }\n\n // Default: pydantic-ai\n return `[project]\nname = \"${projectName}\"\nversion = \"0.1.0\"\ndescription = \"An AgentMark application using Pydantic AI\"\nrequires-python = \">=3.12\"\ndependencies = [\n \"agentmark-sdk>=0.1.0\",\n \"agentmark-pydantic-ai>=0.1.0\",\n \"agentmark-prompt-core>=0.1.0\",\n \"python-dotenv>=1.0.0\",\n \"pydantic-ai[openai]>=0.1.0\",\n]\n\n[project.optional-dependencies]\ndev = [\n \"pytest>=7.0\",\n \"pytest-asyncio>=0.21\",\n \"mypy>=1.0\",\n]\nanthropic = [\"pydantic-ai[anthropic]\"]\ngemini = [\"pydantic-ai[gemini]\"]\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\n[tool.mypy]\nstrict = true\n`;\n};\n\nconst getAgentmarkClientContent = (_deploymentMode: \"cloud\" | \"static\", adapter: string): string => {\n if (adapter === \"claude-agent-sdk\") {\n return `\"\"\"AgentMark client configuration.\n\nThis file configures the AgentMark client with Claude Agent SDK adapter.\nCustomize the model registry and tool registry as needed.\n\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom dotenv import load_dotenv\n\nfrom agentmark.prompt_core import FileLoader\nfrom agentmark_claude_agent_sdk import (\n create_claude_agent_client,\n create_default_model_registry,\n ClaudeAgentToolRegistry,\n)\n\n# Load environment variables\nload_dotenv()\n\n# Configure model registry with default mappings\n# Supports: claude-* models\nmodel_registry = create_default_model_registry()\n\n# Configure tool registry for custom tools\ntool_registry = ClaudeAgentToolRegistry()\n\n# Example tool registration:\n# tool_registry.register(\n# \"search\",\n# lambda args, ctx: f\"Search results for: {args['query']}\",\n# description=\"Search the web\",\n# parameters={\"type\": \"object\", \"properties\": {\"query\": {\"type\": \"string\"}}, \"required\": [\"query\"]},\n# )\n\n# Create file loader for local development\n# Uses the project root as base directory for resolving relative paths\nproject_root = Path(__file__).parent.resolve()\nloader = FileLoader(base_dir=str(project_root))\n\n# Create the client\nclient = create_claude_agent_client(\n model_registry=model_registry,\n tool_registry=tool_registry,\n loader=loader,\n)\n\n__all__ = [\"client\"]\n`;\n }\n\n // Default: pydantic-ai\n return `\"\"\"AgentMark client configuration.\n\nThis file configures the AgentMark client with Pydantic AI adapter.\nCustomize the model registry and tool registry as needed.\n\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom dotenv import load_dotenv\n\nfrom agentmark.prompt_core import FileLoader\nfrom agentmark_pydantic_ai_v0 import (\n create_pydantic_ai_client,\n create_default_model_registry,\n PydanticAIToolRegistry,\n)\n\n# Load environment variables\nload_dotenv()\n\n# Configure model registry with default mappings\n# Supports: gpt-*, claude-*, gemini-*, etc.\nmodel_registry = create_default_model_registry()\n\n# Configure tool registry for custom tools\ntool_registry = PydanticAIToolRegistry()\n\n# Example tool registration:\n# @tool_registry.register(\"search\")\n# async def search_web(args: dict, ctx: dict | None) -> str:\n# query = args[\"query\"]\n# return f\"Search results for: {query}\"\n\n# Create file loader for local development\n# Uses the project root as base directory for resolving relative paths\nproject_root = Path(__file__).parent.resolve()\nloader = FileLoader(base_dir=str(project_root))\n\n# Create the client\nclient = create_pydantic_ai_client(\n model_registry=model_registry,\n tool_registry=tool_registry,\n loader=loader,\n)\n\n__all__ = [\"client\"]\n`;\n};\n\nexport const getMainPyContent = (adapter: string, deploymentMode: \"cloud\" | \"static\" = \"cloud\"): string => {\n const isCloud = deploymentMode === \"cloud\";\n\n const cloudTracingInit = `\n# Initialize tracing - traces will be sent to AgentMark Cloud\n# To disable tracing, comment out sdk.init_tracing() below\nsdk = AgentMarkSDK(\n api_key=os.environ.get(\"AGENTMARK_API_KEY\", \"\"),\n app_id=os.environ.get(\"AGENTMARK_APP_ID\", \"\"),\n)\nsdk.init_tracing(disable_batch=True)\n`;\n\n const staticTracingInit = `\n# Initialize tracing - traces will be sent to local dev server\n# Make sure to run \"npm run agentmark dev\" in another terminal first\n# To disable tracing, comment out sdk.init_tracing() below\nsdk = AgentMarkSDK(\n api_key=\"\",\n app_id=\"\",\n base_url=\"http://localhost:9418\",\n)\nsdk.init_tracing(disable_batch=True)\n`;\n\n const tracingInit = isCloud ? cloudTracingInit : staticTracingInit;\n\n if (adapter === \"claude-agent-sdk\") {\n return `\"\"\"Example usage of AgentMark with Claude Agent SDK.\n\nRun with: python main.py\n\"\"\"\n\nimport asyncio\nimport json\nimport os\nfrom pathlib import Path\n\nfrom agentmark_sdk import AgentMarkSDK\nfrom agentmark_claude_agent_sdk import run_text_prompt\nfrom agentmark_client import client\n${tracingInit}\n\nasync def main():\n \"\"\"Run the party planner prompt.\"\"\"\n # Load the prompt AST (in production, use the API loader)\n prompt_path = Path(\"agentmark/party-planner.prompt.mdx.json\")\n\n if not prompt_path.exists():\n print(\"Prompt file not found. Run 'agentmark build' first.\")\n return\n\n with open(prompt_path) as f:\n ast = json.load(f)\n\n # Load and format the prompt\n prompt = await client.load_text_prompt(ast)\n params = await prompt.format(props={\n \"numberOfGuests\": 10,\n \"theme\": \"80s disco\",\n \"dietaryRestrictions\": [\"vegetarian\", \"gluten-free\"],\n })\n\n # Execute the prompt\n print(\"Running party planner prompt...\")\n result = await run_text_prompt(params)\n\n print(\"\\\\n\" + \"=\" * 50)\n print(\"Party Plan:\")\n print(\"=\" * 50)\n print(result.output)\n print(\"\\\\n\" + \"-\" * 50)\n print(f\"Tokens used: {result.usage}\")\n\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n`;\n }\n\n // Default: pydantic-ai\n return `\"\"\"Example usage of AgentMark with Pydantic AI.\n\nRun with: python main.py\n\"\"\"\n\nimport asyncio\nimport json\nimport os\nfrom pathlib import Path\n\nfrom agentmark_sdk import AgentMarkSDK\nfrom agentmark_pydantic_ai_v0 import run_text_prompt\nfrom agentmark_client import client\n${tracingInit}\n\nasync def main():\n \"\"\"Run the party planner prompt.\"\"\"\n # Load the prompt AST (in production, use the API loader)\n prompt_path = Path(\"agentmark/party-planner.prompt.mdx.json\")\n\n if not prompt_path.exists():\n print(\"Prompt file not found. Run 'agentmark build' first.\")\n return\n\n with open(prompt_path) as f:\n ast = json.load(f)\n\n # Load and format the prompt\n prompt = await client.load_text_prompt(ast)\n params = await prompt.format(props={\n \"numberOfGuests\": 10,\n \"theme\": \"80s disco\",\n \"dietaryRestrictions\": [\"vegetarian\", \"gluten-free\"],\n })\n\n # Execute the prompt\n print(\"Running party planner prompt...\")\n result = await run_text_prompt(params)\n\n print(\"\\\\n\" + \"=\" * 50)\n print(\"Party Plan:\")\n print(\"=\" * 50)\n print(result.output)\n print(\"\\\\n\" + \"-\" * 50)\n print(f\"Tokens used: {result.usage.total_tokens}\")\n\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n`;\n};\n\nconst getDevServerContent = (adapter: string): string => {\n const adapterPackage = adapter === \"claude-agent-sdk\"\n ? \"agentmark_claude_agent_sdk\"\n : \"agentmark_pydantic_ai_v0\";\n\n return `\"\"\"Auto-generated webhook server for AgentMark development.\n\nThis server is started by 'npm run agentmark dev' (agentmark dev) and handles\nprompt execution requests from the CLI.\n\"\"\"\n\nimport argparse\nimport sys\nfrom pathlib import Path\n\n# Add parent directory to path for imports\nsys.path.insert(0, str(Path(__file__).parent.parent))\n\nfrom ${adapterPackage} import create_webhook_server\nfrom agentmark_client import client\n\n\nif __name__ == \"__main__\":\n parser = argparse.ArgumentParser()\n parser.add_argument(\"--webhook-port\", type=int, default=9417)\n parser.add_argument(\"--api-server-port\", type=int, default=9418)\n args = parser.parse_args()\n\n create_webhook_server(client, args.webhook_port, args.api_server_port)\n`;\n};\n\nconst getEnvContent = (apiKey: string, adapter: string): string => {\n if (adapter === \"claude-agent-sdk\") {\n return `# Anthropic API Key\nANTHROPIC_API_KEY=${apiKey}\n`;\n }\n\n // Default: pydantic-ai (OpenAI)\n return `# OpenAI API Key\nOPENAI_API_KEY=${apiKey}\n\n# For Anthropic models, add:\n# ANTHROPIC_API_KEY=your-key-here\n\n# For Google Gemini models, add:\n# GOOGLE_API_KEY=your-key-here\n`;\n};\n\nconst getGitignoreContent = (): string => {\n return `# Python\n__pycache__/\n*.py[cod]\n*$py.class\n.venv/\nvenv/\n.env\n\n# AgentMark\n*.agentmark-outputs/\n.agentmark/\n\n# IDE\n.idea/\n.vscode/\n*.swp\n\n# Build\ndist/\nbuild/\n*.egg-info/\n\n# Testing\n.pytest_cache/\n.coverage\nhtmlcov/\n`;\n};\n\nexport const createPythonApp = async (\n client: string,\n targetPath: string = \".\",\n apiKey: string = \"\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n adapter: string = \"pydantic-ai\",\n projectInfo: ProjectInfo | null = null,\n resolutions: ConflictResolution[] = []\n) => {\n try {\n const model = adapter === 'claude-agent-sdk' ? 'anthropic/claude-sonnet-4-20250514' : 'openai/gpt-4o';\n const adapterDisplayName = adapter === 'claude-agent-sdk' ? 'Claude Agent SDK' : 'Pydantic AI';\n const isExistingProject = projectInfo?.isExistingProject ?? false;\n\n if (isExistingProject) {\n console.log(`Adding AgentMark to existing Python project with ${adapterDisplayName}...`);\n } else {\n console.log(`Creating AgentMark Python app with ${adapterDisplayName}...`);\n }\n\n const folderName = targetPath;\n\n // Create directory structure\n fs.ensureDirSync(`${targetPath}/agentmark`);\n\n setupMCPServer(client, targetPath);\n\n // Create example prompts (reuse from TypeScript)\n createExamplePrompts(model, targetPath, adapter);\n console.log(`Example prompts and datasets created in ${folderName}/agentmark/`);\n\n // Create pyproject.toml (skip for existing projects)\n if (!isExistingProject) {\n const projectName = path.basename(targetPath).replace(/[^a-zA-Z0-9_-]/g, \"-\");\n fs.writeFileSync(`${targetPath}/pyproject.toml`, getPyprojectContent(projectName, adapter));\n } else {\n console.log(\"⏭️ Skipped pyproject.toml (existing project)\");\n }\n\n // Create agentmark_client.py (always create - this is AgentMark-specific)\n fs.writeFileSync(`${targetPath}/agentmark_client.py`, getAgentmarkClientContent(deploymentMode, adapter));\n\n // Create main.py (skip for existing projects)\n if (!isExistingProject) {\n fs.writeFileSync(`${targetPath}/main.py`, getMainPyContent(adapter, deploymentMode));\n } else {\n console.log(\"⏭️ Skipped main.py (existing project)\");\n }\n\n // Create or append to .env file\n if (shouldMergeFile('.env', projectInfo, resolutions)) {\n const envVars: Record<string, string> = {};\n const apiKeyEnvVar = adapter === 'claude-agent-sdk' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n if (apiKey) {\n envVars[apiKeyEnvVar] = apiKey;\n } else {\n envVars[apiKeyEnvVar] = adapter === 'claude-agent-sdk' ? 'your-anthropic-api-key' : 'your-openai-api-key';\n }\n const result = appendEnv(targetPath, envVars);\n if (result.added.length > 0) {\n console.log(`✅ Added to .env: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Skipped existing .env vars: ${result.skipped.join(', ')}`);\n }\n } else {\n fs.writeFileSync(`${targetPath}/.env`, getEnvContent(apiKey, adapter));\n }\n\n // Create or append to .gitignore\n const gitignoreEntries = [\n '__pycache__/', '*.py[cod]', '*$py.class', '.venv/', 'venv/', '.env',\n '*.agentmark-outputs/', '.agentmark/', '.idea/', '.vscode/', '*.swp',\n 'dist/', 'build/', '*.egg-info/', '.pytest_cache/', '.coverage', 'htmlcov/'\n ];\n if (shouldMergeFile('.gitignore', projectInfo, resolutions)) {\n const result = appendGitignore(targetPath, gitignoreEntries);\n if (result.added.length > 0) {\n console.log(`✅ Added to .gitignore: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Already in .gitignore: ${result.skipped.join(', ')}`);\n }\n } else {\n fs.writeFileSync(`${targetPath}/.gitignore`, getGitignoreContent());\n }\n\n // Create .agentmark directory with dev_server.py\n const agentmarkInternalDir = path.join(targetPath, '.agentmark');\n fs.ensureDirSync(agentmarkInternalDir);\n fs.writeFileSync(path.join(agentmarkInternalDir, 'dev_server.py'), getDevServerContent(adapter));\n\n // Python environment setup notes\n const pythonVenv = projectInfo?.pythonVenv;\n if (pythonVenv) {\n console.log(`\\n📦 Detected existing Python venv: ${pythonVenv.name}`);\n console.log(\" Remember to activate it before running AgentMark commands.\");\n } else if (!isExistingProject) {\n console.log(\"Setting up Python environment...\");\n console.log(\"Note: You'll need to set up a virtual environment and install dependencies.\");\n console.log(\"\");\n }\n\n // Initialize git repo for new projects\n if (!isExistingProject) {\n initGitRepo(targetPath);\n }\n\n // Success message\n console.log(\"\\n✅ AgentMark Python initialization completed successfully!\");\n\n console.log(\n `\n ██████╗ ██╗ ██╗████████╗██╗ ██╗ ██████╗ ███╗ ██╗\n ██╔══██╗╚██╗ ██╔╝╚══██╔══╝██║ ██║██╔═══██╗████╗ ██║\n ██████╔╝ ╚████╔╝ ██║ ███████║██║ ██║██╔██╗ ██║\n ██╔═══╝ ╚██╔╝ ██║ ██╔══██║██║ ██║██║╚██╗██║\n ██║ ██║ ██║ ██║ ██║╚██████╔╝██║ ╚████║\n ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝\n + AgentMark\n `\n );\n\n console.log('\\n' + '═'.repeat(70));\n console.log('Next Steps');\n console.log('═'.repeat(70));\n\n console.log('\\n Get Started:');\n if (folderName !== \".\" && folderName !== \"./\" && !isExistingProject) {\n console.log(` $ cd ${folderName}`);\n }\n\n // Show venv activation or creation based on detection\n if (pythonVenv) {\n const activateCmd = process.platform === 'win32'\n ? `${pythonVenv.name}\\\\Scripts\\\\activate`\n : `source ${pythonVenv.name}/bin/activate`;\n console.log(` $ ${activateCmd}`);\n console.log(' $ pip install agentmark-pydantic-ai agentmark-prompt-core python-dotenv \"pydantic-ai[openai]\"');\n } else {\n console.log(' $ python -m venv .venv');\n console.log(' $ source .venv/bin/activate # On Windows: .venv\\\\Scripts\\\\activate');\n console.log(' $ pip install -e \".[dev]\"');\n }\n console.log(' $ npm run agentmark dev\\n');\n\n console.log('─'.repeat(70));\n console.log('Resources');\n console.log('─'.repeat(70));\n console.log(' Documentation: https://docs.agentmark.co');\n console.log('═'.repeat(70) + '\\n');\n } catch (error) {\n console.error(\"Error creating Python app:\", error);\n throw error;\n }\n};\n","/**\n * Project detection utilities for identifying existing projects.\n * Detects TypeScript/Python projects and their configurations.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport {\n type ProjectInfo,\n type ConflictFile,\n type PythonVenvInfo,\n CONFLICT_FILES,\n} from './types.js';\nimport { detectPackageManager } from './package-manager.js';\n\n// Re-export for backwards compatibility\nexport { detectPackageManager };\n\nconst IS_WINDOWS = process.platform === 'win32';\n\n/**\n * Detect if a TypeScript/Node.js project exists in the target directory.\n * Checks for package.json, tsconfig.json, or node_modules.\n */\nexport function detectTypeScriptProject(targetPath: string): boolean {\n const indicators = ['package.json', 'tsconfig.json', 'node_modules'];\n return indicators.some((file) => fs.existsSync(path.join(targetPath, file)));\n}\n\n/**\n * Detect if a Python project exists in the target directory.\n * Checks for pyproject.toml, requirements.txt, setup.py, or virtual environments.\n */\nexport function detectPythonProject(targetPath: string): boolean {\n const indicators = ['pyproject.toml', 'requirements.txt', 'setup.py', '.venv', 'venv'];\n return indicators.some((file) => fs.existsSync(path.join(targetPath, file)));\n}\n\n/**\n * Detect existing Python virtual environment.\n * Checks .venv and venv directories, returns platform-specific paths.\n */\nexport function detectPythonVenv(targetPath: string): PythonVenvInfo | null {\n const venvNames = ['.venv', 'venv'];\n\n for (const name of venvNames) {\n const venvPath = path.join(targetPath, name);\n if (fs.existsSync(venvPath) && fs.statSync(venvPath).isDirectory()) {\n // Check if it's actually a venv (has bin/Scripts and pyvenv.cfg or similar)\n const binDir = IS_WINDOWS ? 'Scripts' : 'bin';\n const binPath = path.join(venvPath, binDir);\n\n if (fs.existsSync(binPath)) {\n const pipExe = IS_WINDOWS ? 'pip.exe' : 'pip';\n\n return {\n path: venvPath,\n name,\n activateCmd: IS_WINDOWS\n ? `${name}\\\\Scripts\\\\activate`\n : `source ${name}/bin/activate`,\n pipPath: path.join(binPath, pipExe),\n };\n }\n }\n }\n\n // Check VIRTUAL_ENV environment variable\n const envVenv = process.env.VIRTUAL_ENV;\n if (envVenv && fs.existsSync(envVenv)) {\n // Check if VIRTUAL_ENV is inside the target directory\n const resolvedTarget = path.resolve(targetPath);\n const resolvedVenv = path.resolve(envVenv);\n const isInsideTarget = resolvedVenv.startsWith(resolvedTarget + path.sep) ||\n resolvedVenv === resolvedTarget;\n\n if (!isInsideTarget) {\n // VIRTUAL_ENV points outside target directory - likely from another project\n // Don't use it as it could give incorrect instructions\n console.warn(\n `⚠️ Note: VIRTUAL_ENV (${envVenv}) points outside the target directory. ` +\n `It will not be used for this initialization.`\n );\n return null;\n }\n\n const binDir = IS_WINDOWS ? 'Scripts' : 'bin';\n const pipExe = IS_WINDOWS ? 'pip.exe' : 'pip';\n const name = path.basename(envVenv);\n\n return {\n path: envVenv,\n name,\n activateCmd: IS_WINDOWS\n ? `${name}\\\\Scripts\\\\activate`\n : `source ${name}/bin/activate`,\n pipPath: path.join(envVenv, binDir, pipExe),\n };\n }\n\n return null;\n}\n\n/**\n * Detect files that may conflict with AgentMark initialization.\n * Returns only the files that actually exist in the target directory.\n */\nexport function detectConflictingFiles(targetPath: string): ConflictFile[] {\n const existingConflicts: ConflictFile[] = [];\n\n for (const conflictFile of CONFLICT_FILES) {\n const fullPath = path.join(targetPath, conflictFile.path);\n if (fs.existsSync(fullPath)) {\n existingConflicts.push(conflictFile);\n }\n }\n\n return existingConflicts;\n}\n\n/**\n * Detect all project information for the target directory.\n * This is the main function that combines all detection logic.\n */\nexport function detectProjectInfo(targetPath: string): ProjectInfo {\n const isTypeScript = detectTypeScriptProject(targetPath);\n const isPython = detectPythonProject(targetPath);\n const isExistingProject = isTypeScript || isPython;\n\n let type: 'typescript' | 'python' | 'unknown' = 'unknown';\n if (isTypeScript && !isPython) {\n type = 'typescript';\n } else if (isPython && !isTypeScript) {\n type = 'python';\n } else if (isTypeScript && isPython) {\n // If both, prefer TypeScript (more common case for polyglot projects)\n type = 'typescript';\n }\n\n const packageManager = detectPackageManager(targetPath);\n const conflictingFiles = detectConflictingFiles(targetPath);\n const hasAgentmarkDir = fs.existsSync(path.join(targetPath, 'agentmark'));\n const pythonVenv = detectPythonVenv(targetPath);\n\n return {\n isExistingProject,\n type,\n packageManager,\n conflictingFiles,\n hasAgentmarkDir,\n pythonVenv,\n };\n}\n\n/**\n * Check if the target path is the current directory.\n * Used to determine if we need to skip mkdir and cd instructions.\n */\nexport function isCurrentDirectory(folderName: string): boolean {\n return folderName === '.' || folderName === './' || folderName === '.\\\\';\n}\n","/**\n * Package manager utilities for detecting and using the correct package manager.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { execSync, execFileSync } from 'child_process';\nimport {\n type PackageManager,\n type PackageManagerConfig,\n PACKAGE_MANAGERS,\n DEFAULT_PACKAGE_MANAGER,\n} from './types.js';\n\n/**\n * Detect the package manager in use by checking for lock files.\n * Priority order: yarn > pnpm > bun > npm.\n */\nexport function detectPackageManager(targetPath: string): PackageManagerConfig {\n // Check lock files in priority order\n const lockFiles = ['yarn.lock', 'pnpm-lock.yaml', 'bun.lockb', 'package-lock.json'];\n\n for (const lockFile of lockFiles) {\n if (fs.existsSync(path.join(targetPath, lockFile))) {\n const config = PACKAGE_MANAGERS[lockFile];\n if (config) {\n return config;\n }\n }\n }\n\n // Default to npm if no lock file found\n return DEFAULT_PACKAGE_MANAGER;\n}\n\n/**\n * Get the package manager configuration by name.\n */\nexport function getPackageManagerConfig(name: PackageManager): PackageManagerConfig {\n const configs = Object.values(PACKAGE_MANAGERS);\n const config = configs.find((c) => c.name === name);\n return config || DEFAULT_PACKAGE_MANAGER;\n}\n\n/**\n * Install dependencies using the detected package manager.\n */\nexport function installDependencies(\n targetPath: string,\n packageManager: PackageManagerConfig\n): void {\n console.log(`Installing dependencies with ${packageManager.name}...`);\n\n try {\n execSync(packageManager.installCmd, {\n stdio: 'inherit',\n cwd: targetPath,\n });\n console.log('Dependencies installed successfully!');\n } catch (error) {\n console.error(`Error installing dependencies with ${packageManager.name}:`, error);\n throw new Error(\n `Failed to install dependencies. Please run \"${packageManager.installCmd}\" manually.`\n );\n }\n}\n\n/**\n * Add production dependencies using the detected package manager.\n */\nexport function addDependencies(\n targetPath: string,\n packageManager: PackageManagerConfig,\n packages: string[]\n): void {\n if (packages.length === 0) return;\n\n console.log(`Adding dependencies with ${packageManager.name}...`);\n\n try {\n // Build the command arguments\n const cmdParts = packageManager.addCmd.split(' ');\n const cmd = cmdParts[0]!;\n const args = [...cmdParts.slice(1), ...packages];\n\n execFileSync(cmd, args, {\n stdio: 'inherit',\n cwd: targetPath,\n });\n } catch (error) {\n console.error(`Error adding dependencies:`, error);\n throw new Error(\n `Failed to add dependencies. Please run \"${packageManager.addCmd} ${packages.join(' ')}\" manually.`\n );\n }\n}\n\n/**\n * Add dev dependencies using the detected package manager.\n */\nexport function addDevDependencies(\n targetPath: string,\n packageManager: PackageManagerConfig,\n packages: string[]\n): void {\n if (packages.length === 0) return;\n\n console.log(`Adding dev dependencies with ${packageManager.name}...`);\n\n try {\n // Build the command arguments\n const cmdParts = packageManager.addDevCmd.split(' ');\n const cmd = cmdParts[0]!;\n const args = [...cmdParts.slice(1), ...packages];\n\n execFileSync(cmd, args, {\n stdio: 'inherit',\n cwd: targetPath,\n });\n } catch (error) {\n console.error(`Error adding dev dependencies:`, error);\n throw new Error(\n `Failed to add dev dependencies. Please run \"${packageManager.addDevCmd} ${packages.join(' ')}\" manually.`\n );\n }\n}\n\n/**\n * Get the run script command for a package manager.\n * e.g., \"npm run dev\" or \"yarn dev\" or \"pnpm dev\"\n */\nexport function getRunScriptCmd(\n packageManager: PackageManagerConfig,\n script: string\n): string {\n return `${packageManager.runCmd} ${script}`;\n}\n"],"mappings":"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","names":["fs","path","prompts","fs","path","fs","fs","fs","fs","execSync","fs","prompts","fs","path","setupMCPServer","fs","fs","path","fs","path","fs","path","fs","path","prompts","path","fs"]}
@@ -100,7 +100,6 @@ declare const createExamplePrompts: (model: string, targetPath?: string, adapter
100
100
 
101
101
  declare const getClientConfigContent: (options: {
102
102
  provider: string;
103
- languageModels: string[];
104
103
  adapter: string;
105
104
  deploymentMode?: "cloud" | "static";
106
105
  }) => string;
@@ -443,7 +443,7 @@ var getAnimalDrawingPrompt = () => {
443
443
  return `---
444
444
  name: animal-drawing
445
445
  image_config:
446
- model_name: dall-e-3
446
+ model_name: openai/dall-e-3
447
447
  num_images: 1
448
448
  size: 1024x1024
449
449
  aspect_ratio: 1:1
@@ -545,7 +545,7 @@ var getStoryTellerPrompt = () => {
545
545
  return `---
546
546
  name: story-teller
547
547
  speech_config:
548
- model_name: tts-1-hd
548
+ model_name: openai/tts-1-hd
549
549
  voice: "nova"
550
550
  speed: 1.0
551
551
  output_format: "mp3"
@@ -618,13 +618,11 @@ var createExamplePrompts = (model, targetPath = ".", adapter = "ai-sdk") => {
618
618
 
619
619
  // src/utils/examples/templates/user-client-config.ts
620
620
  var getClientConfigContent = (options) => {
621
- const { provider, languageModels, adapter, deploymentMode = "cloud" } = options;
621
+ const { provider, adapter, deploymentMode = "cloud" } = options;
622
622
  const adapterConfig = getAdapterConfig(adapter, provider);
623
623
  const { modelRegistry, toolRegistry } = adapterConfig.classes;
624
624
  const isClaudeAgentSdk = adapter === "claude-agent-sdk";
625
625
  const providerImport = isClaudeAgentSdk ? "" : `import { ${provider} } from '@ai-sdk/${provider}';`;
626
- const extraModelRegs = provider === "openai" && !isClaudeAgentSdk ? `.registerModels(["dall-e-3"], (name: string) => ${provider}.image(name))
627
- .registerModels(["tts-1-hd"], (name: string) => ${provider}.speech(name))` : "";
628
626
  const loaderImport = deploymentMode === "cloud" ? `import { ApiLoader } from "@agentmark-ai/loader-api";` : `import { ApiLoader } from "@agentmark-ai/loader-api";
629
627
  import { FileLoader } from "@agentmark-ai/loader-file";`;
630
628
  const loaderSetup = deploymentMode === "cloud" ? ` // ApiLoader works for both development and production
@@ -654,8 +652,7 @@ import { FileLoader } from "@agentmark-ai/loader-file";`;
654
652
  return modelRegistry;
655
653
  }` : `function createModelRegistry() {
656
654
  const modelRegistry = new ${modelRegistry}()
657
- .registerModels(${JSON.stringify(languageModels)}, (name: string) => ${provider}(name))
658
- ${extraModelRegs};
655
+ .registerProviders({ ${provider} });
659
656
  return modelRegistry;
660
657
  }`;
661
658
  const adapterOptionsImport = isClaudeAgentSdk ? `
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/examples/templates/adapters.ts","../../../../src/utils/examples/templates/app-index.ts","../../../../src/utils/examples/templates/env.ts","../../../../src/utils/examples/templates/package-setup.ts","../../../../src/utils/file-merge.ts","../../../../src/utils/types.ts","../../../../src/utils/examples/templates/tsconfig.ts","../../../../src/utils/examples/templates/animal-drawing-prompt.ts","../../../../src/utils/examples/templates/customer-support-prompt.ts","../../../../src/utils/examples/templates/party-planner-prompt.ts","../../../../src/utils/examples/templates/story-teller-prompt.ts","../../../../src/utils/examples/templates/datasets.ts","../../../../src/utils/examples/templates/example-prompts.ts","../../../../src/utils/examples/templates/user-client-config.ts"],"sourcesContent":["export interface AdapterConfig {\n /** npm package name for the adapter */\n package: string;\n /** Additional npm packages required by this adapter */\n dependencies: string[];\n /** Class names used in generated code */\n classes: {\n modelRegistry: string;\n toolRegistry: string;\n webhookHandler: string;\n };\n}\n\nexport const createAdapterConfig = (\n provider: string\n): Record<string, AdapterConfig> => {\n return {\n \"ai-sdk\": {\n package: \"@agentmark-ai/ai-sdk-v5-adapter\",\n dependencies: [\"ai@^5\", `@ai-sdk/${provider}@^2`],\n classes: {\n modelRegistry: \"VercelAIModelRegistry\",\n toolRegistry: \"VercelAIToolRegistry\",\n webhookHandler: \"VercelAdapterWebhookHandler\",\n },\n },\n mastra: {\n package: \"@agentmark-ai/mastra-v0-adapter\",\n dependencies: [\n \"@mastra/core@<0.20.0\",\n \"@mastra/mcp@<0.13.4\",\n `@ai-sdk/${provider}@<2`,\n ],\n classes: {\n modelRegistry: \"MastraModelRegistry\",\n toolRegistry: \"MastraToolRegistry\",\n webhookHandler: \"MastraAdapterWebhookHandler\",\n },\n },\n \"claude-agent-sdk\": {\n package: \"@agentmark-ai/claude-agent-sdk-adapter\",\n dependencies: [\"@anthropic-ai/claude-agent-sdk@^0.1.0\"],\n classes: {\n modelRegistry: \"ClaudeAgentModelRegistry\",\n toolRegistry: \"ClaudeAgentToolRegistry\",\n webhookHandler: \"ClaudeAgentWebhookHandler\",\n },\n },\n };\n};\n\nexport function getAdapterConfig(\n adapter: string,\n provider: string\n): AdapterConfig {\n const config = createAdapterConfig(provider)[adapter];\n if (!config) {\n throw new Error(\n `Unknown adapter: ${adapter}. Available adapters: ${Object.keys(\n createAdapterConfig(provider)\n ).join(\", \")}`\n );\n }\n return config;\n}\n","export const getIndexFileContent = (adapter: string = \"ai-sdk\", deploymentMode: \"cloud\" | \"static\" = \"cloud\"): string => {\n const isCloud = deploymentMode === \"cloud\";\n\n const tracingImport = `import { AgentMarkSDK } from \"@agentmark-ai/sdk\";\n`;\n\n const cloudTracingInit = `\n// Initialize tracing - traces will be sent to AgentMark Cloud\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: process.env.AGENTMARK_API_KEY ?? \"\",\n appId: process.env.AGENTMARK_APP_ID ?? \"\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const staticTracingInit = `\n// Initialize tracing - traces will be sent to local dev server\n// Make sure to run \"npm run agentmark dev\" in another terminal first\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: \"\",\n appId: \"\",\n baseUrl: \"http://localhost:9418\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const tracingInit = isCloud ? cloudTracingInit : staticTracingInit;\n\n if (adapter === \"claude-agent-sdk\") {\n return `import \"dotenv/config\";\nimport { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { withTracing } from \"@agentmark-ai/claude-agent-sdk-adapter\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const adapted = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n // Execute with Claude Agent SDK using withTracing for telemetry\n // The adapted object contains { query, telemetry } ready for withTracing()\n const tracedResult = await withTracing(query, adapted);\n\n // traceId is available immediately\n console.log(\"Trace ID:\", tracedResult.traceId);\n\n let result = \"\";\n for await (const message of tracedResult) {\n if (message.type === \"result\" && message.subtype === \"success\") {\n result = message.result || \"\";\n }\n }\n\n return result;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else if (adapter === \"mastra\") {\n return `import \"dotenv/config\";\nimport { Agent } from \"@mastra/core/agent\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const agentConfig = await prompt.formatAgent({\n options: {\n telemetry,\n },\n });\n\n const [messages, generateOptions] = await agentConfig.formatMessages({\n props: {\n customer_question: customer_message,\n },\n });\n\n const agent = new Agent(agentConfig);\n const response = await agent.generate(messages, generateOptions);\n\n return (response as any).text || (response as any).content || String(response);\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else {\n return `import \"dotenv/config\";\nimport { generateText } from \"ai\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const vercelInput = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n const resp = await generateText(vercelInput);\n\n return resp.text;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n }\n};\n","export const getEnvFileContent = (\n _modelProvider: string,\n apiKey: string = '',\n adapter: string = 'ai-sdk'\n): string => {\n const apiKeyValue = apiKey || 'your_api_key_here';\n\n // Use ANTHROPIC_API_KEY for claude-agent-sdk adapter\n const apiKeyName = adapter === 'claude-agent-sdk' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n\n return `# Cloud deployment: Set these environment variables\n# AGENTMARK_BASE_URL=https://api.agentmark.co\n# AGENTMARK_API_KEY=your_agentmark_api_key\n# AGENTMARK_APP_ID=your_agentmark_app_id\n# Learn more: https://docs.agentmark.co/platform/getting_started/quickstart\n\n${apiKeyName}=${apiKeyValue}\n`;\n};\n","import fs from \"fs-extra\";\nimport { execSync } from \"child_process\";\nimport { getAdapterConfig } from \"./adapters.js\";\nimport { mergePackageJson } from \"../../file-merge.js\";\nimport { DEFAULT_PACKAGE_MANAGER } from \"../../types.js\";\nimport type { ProjectInfo, PackageManagerConfig } from \"../../types.js\";\n\nexport const setupPackageJson = (\n targetPath: string = \".\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n projectInfo: ProjectInfo | null = null\n) => {\n const packageJsonPath = `${targetPath}/package.json`;\n const isExistingProject = projectInfo?.isExistingProject ?? false;\n\n if (!fs.existsSync(packageJsonPath)) {\n console.log(\"Creating package.json...\");\n execSync(\"npm init -y\", { cwd: targetPath });\n }\n\n // For existing projects, use merge logic\n if (isExistingProject && fs.existsSync(packageJsonPath)) {\n // Build scripts to add - with namespacing for conflicts\n const scriptsToAdd: Record<string, string> = {\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n if (deploymentMode === \"static\") {\n scriptsToAdd[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n // Use mergePackageJson for existing projects\n const result = mergePackageJson(targetPath, {}, {}, scriptsToAdd);\n\n if (result.added.length > 0) {\n console.log(`✅ Added to package.json: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Skipped existing in package.json: ${result.skipped.join(', ')}`);\n }\n if (result.warnings.length > 0) {\n result.warnings.forEach((w) => console.log(`⚠️ ${w}`));\n }\n } else {\n // Update the created package.json with additional information\n const pkgJson = fs.readJsonSync(packageJsonPath);\n pkgJson.name =\n pkgJson.name === \"test\" || !pkgJson.name\n ? \"agentmark-example-app\"\n : pkgJson.name;\n pkgJson.description =\n pkgJson.description || \"A simple Node.js app using the Agentmark SDK\";\n\n // Base scripts for all modes\n const scripts: Record<string, string> = {\n ...pkgJson.scripts,\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n // For static/self-hosted mode, add the build script\n if (deploymentMode === \"static\") {\n scripts[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n pkgJson.scripts = scripts;\n\n fs.writeJsonSync(packageJsonPath, pkgJson, { spaces: 2 });\n }\n};\n\nexport const installDependencies = (\n modelProvider: string,\n targetPath: string = \".\",\n adapter: string = \"ai-sdk\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n packageManager: PackageManagerConfig | null = null\n) => {\n console.log(\"Installing required packages...\");\n console.log(\"This might take a moment...\");\n\n const adapterConfig = getAdapterConfig(adapter, modelProvider);\n\n // Use detected package manager or default to npm\n const pm = packageManager || DEFAULT_PACKAGE_MANAGER;\n\n // npm needs --legacy-peer-deps due to some transitive dependency conflicts\n const npmSuffix = pm.name === 'npm' ? ' --legacy-peer-deps' : '';\n\n try {\n // Dev dependencies to install\n const devDeps = ['typescript', 'ts-node', '@types/node', '@agentmark-ai/cli'];\n\n // Install dev dependencies using detected package manager config\n const devDepsCmd = `${pm.addDevCmd} ${devDeps.join(' ')}${npmSuffix}`;\n\n console.log(`Using ${pm.name} to install dependencies...`);\n\n execSync(devDepsCmd, {\n stdio: \"inherit\",\n cwd: targetPath,\n });\n\n // Install the common packages\n // SDK is required for both local (connects to agentmark serve) and cloud (connects to API)\n // Loader packages are imported directly - ApiLoader always needed, FileLoader only for static mode\n const loaderPackages = deploymentMode === \"static\"\n ? [\"@agentmark-ai/loader-api\", \"@agentmark-ai/loader-file\"]\n : [\"@agentmark-ai/loader-api\"];\n\n const deps = [\n \"dotenv\",\n \"@agentmark-ai/prompt-core\",\n \"@agentmark-ai/sdk\",\n adapterConfig.package,\n ...loaderPackages,\n ...adapterConfig.dependencies,\n ];\n\n // Install regular dependencies using detected package manager config\n const depsCmd = `${pm.addCmd} ${deps.join(' ')}${npmSuffix}`;\n\n execSync(depsCmd, { stdio: \"inherit\", cwd: targetPath });\n\n console.log(\"Packages installed successfully!\");\n } catch (error) {\n console.error(\"Error installing packages:\", error);\n throw new Error(\n \"Failed to install required packages. Please check your network connection and try again.\"\n );\n }\n};\n","/**\n * File merge utilities for handling existing files during initialization.\n * Supports merging package.json, appending to .gitignore and .env files.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport type { MergeResult } from './types.js';\n\n/**\n * Merge AgentMark dependencies and scripts into an existing package.json.\n * Preserves all existing content, only adds missing AgentMark entries.\n */\nexport function mergePackageJson(\n targetPath: string,\n agentmarkDeps: Record<string, string>,\n agentmarkDevDeps: Record<string, string>,\n agentmarkScripts: Record<string, string>\n): MergeResult {\n const packageJsonPath = path.join(targetPath, 'package.json');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n // Read existing package.json\n if (!fs.existsSync(packageJsonPath)) {\n result.warnings.push('No existing package.json found');\n return result;\n }\n\n const existing = fs.readJsonSync(packageJsonPath) as Record<string, unknown>;\n\n // Initialize sections if they don't exist\n if (!existing.dependencies) {\n existing.dependencies = {};\n }\n if (!existing.devDependencies) {\n existing.devDependencies = {};\n }\n if (!existing.scripts) {\n existing.scripts = {};\n }\n\n const deps = existing.dependencies as Record<string, string>;\n const devDeps = existing.devDependencies as Record<string, string>;\n const scripts = existing.scripts as Record<string, string>;\n\n // Add AgentMark dependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDeps)) {\n if (deps[pkg]) {\n result.skipped.push(`dependency: ${pkg} (already exists)`);\n } else {\n deps[pkg] = version;\n result.added.push(`dependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark devDependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDevDeps)) {\n if (devDeps[pkg]) {\n result.skipped.push(`devDependency: ${pkg} (already exists)`);\n } else {\n devDeps[pkg] = version;\n result.added.push(`devDependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark scripts (use namespace if conflict exists)\n for (const [scriptName, scriptCmd] of Object.entries(agentmarkScripts)) {\n if (scripts[scriptName]) {\n // Conflict - use namespaced script name\n const namespacedName = `agentmark:${scriptName}`;\n if (scripts[namespacedName]) {\n // Both the original and namespaced version exist - skip with warning\n result.skipped.push(`script: ${scriptName}`);\n result.warnings.push(\n `Script \"${scriptName}\" and \"${namespacedName}\" both already exist. Skipping.`\n );\n } else {\n scripts[namespacedName] = scriptCmd;\n result.added.push(`script: ${namespacedName} (namespaced due to conflict)`);\n result.warnings.push(\n `Script \"${scriptName}\" already exists. Added as \"${namespacedName}\" instead.`\n );\n }\n } else {\n scripts[scriptName] = scriptCmd;\n result.added.push(`script: ${scriptName}`);\n }\n }\n\n // Write merged package.json\n fs.writeJsonSync(packageJsonPath, existing, { spaces: 2 });\n\n result.success = true;\n result.content = JSON.stringify(existing, null, 2);\n return result;\n } catch (error) {\n result.warnings.push(`Error merging package.json: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark entries to an existing .gitignore file.\n * Checks for duplicates before adding.\n */\nexport function appendGitignore(targetPath: string, entries: string[]): MergeResult {\n const gitignorePath = path.join(targetPath, '.gitignore');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(gitignorePath)) {\n existingContent = fs.readFileSync(gitignorePath, 'utf-8');\n }\n\n // Parse existing entries (normalize trailing slashes)\n const existingEntries = new Set(\n existingContent\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'))\n .map((line) => line.replace(/\\/$/, '')) // Remove trailing slashes for comparison\n );\n\n const entriesToAdd: string[] = [];\n\n for (const entry of entries) {\n const normalizedEntry = entry.replace(/\\/$/, '');\n if (existingEntries.has(normalizedEntry)) {\n result.skipped.push(entry);\n } else {\n entriesToAdd.push(entry);\n result.added.push(entry);\n }\n }\n\n if (entriesToAdd.length > 0) {\n // Add a header comment and the new entries\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n newContent += entriesToAdd.join('\\n');\n newContent += '\\n';\n\n fs.writeFileSync(gitignorePath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .gitignore: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark environment variables to an existing .env file.\n * Does not overwrite existing keys.\n */\nexport function appendEnv(\n targetPath: string,\n envVars: Record<string, string>\n): MergeResult {\n const envPath = path.join(targetPath, '.env');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(envPath)) {\n existingContent = fs.readFileSync(envPath, 'utf-8');\n }\n\n // Parse existing keys\n const existingKeys = new Set<string>();\n const lines = existingContent.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const match = trimmed.match(/^([^=]+)=/);\n if (match && match[1]) {\n existingKeys.add(match[1]);\n }\n }\n }\n\n const varsToAdd: Array<[string, string]> = [];\n\n for (const [key, value] of Object.entries(envVars)) {\n if (existingKeys.has(key)) {\n result.skipped.push(key);\n } else {\n varsToAdd.push([key, value]);\n result.added.push(key);\n }\n }\n\n if (varsToAdd.length > 0) {\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n for (const [key, value] of varsToAdd) {\n newContent += `${key}=${value}\\n`;\n }\n\n fs.writeFileSync(envPath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .env: ${error}`);\n return result;\n }\n}\n\n/**\n * Check if a file should be skipped based on existing project detection.\n * Used for files like index.ts that should never be generated in existing projects.\n */\nexport function shouldSkipFile(\n fileName: string,\n isExistingProject: boolean,\n skipFiles: string[]\n): boolean {\n if (!isExistingProject) {\n return false;\n }\n return skipFiles.includes(fileName);\n}\n","/**\n * Type definitions for existing repository initialization.\n * These types support project detection, conflict resolution, and package manager handling.\n */\n\n/** Supported package managers for TypeScript projects */\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\n/** Configuration for a specific package manager */\nexport interface PackageManagerConfig {\n /** Package manager name */\n name: PackageManager;\n /** Lock file that indicates this package manager is in use */\n lockFile: string;\n /** Command to install all dependencies */\n installCmd: string;\n /** Command to add a production dependency */\n addCmd: string;\n /** Command to add a dev dependency */\n addDevCmd: string;\n /** Command prefix for running scripts (e.g., 'npm run', 'yarn') */\n runCmd: string;\n}\n\n/** Package manager configurations indexed by lock file name */\nexport const PACKAGE_MANAGERS: Record<string, PackageManagerConfig> = {\n 'yarn.lock': {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCmd: 'yarn install',\n addCmd: 'yarn add',\n addDevCmd: 'yarn add --dev',\n runCmd: 'yarn',\n },\n 'pnpm-lock.yaml': {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCmd: 'pnpm install',\n addCmd: 'pnpm add',\n addDevCmd: 'pnpm add --save-dev',\n runCmd: 'pnpm',\n },\n 'bun.lockb': {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCmd: 'bun install',\n addCmd: 'bun add',\n addDevCmd: 'bun add --dev',\n runCmd: 'bun run',\n },\n 'package-lock.json': {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCmd: 'npm install',\n addCmd: 'npm install',\n addDevCmd: 'npm install --save-dev',\n runCmd: 'npm run',\n },\n};\n\n/** Default package manager when no lock file is found */\nexport const DEFAULT_PACKAGE_MANAGER: PackageManagerConfig = PACKAGE_MANAGERS['package-lock.json']!;\n\n/** Information about a detected Python virtual environment */\nexport interface PythonVenvInfo {\n /** Absolute path to the venv directory */\n path: string;\n /** Relative name (e.g., '.venv' or 'venv') */\n name: string;\n /** Platform-specific activate command */\n activateCmd: string;\n /** Platform-specific pip path */\n pipPath: string;\n}\n\n/** Type of file for determining merge strategy */\nexport type FileType = 'config' | 'source' | 'directory' | 'dotfile';\n\n/** Resolution strategy for a conflicting file */\nexport type ConflictStrategy = 'merge' | 'append' | 'prompt' | 'skip';\n\n/** Represents a file that may conflict with AgentMark initialization */\nexport interface ConflictFile {\n /** Relative path from project root */\n path: string;\n /** Type of file for determining merge strategy */\n type: FileType;\n /** Recommended resolution strategy */\n strategy: ConflictStrategy;\n}\n\n/** Files that may conflict with AgentMark initialization */\nexport const CONFLICT_FILES: ConflictFile[] = [\n { path: 'agentmark.json', type: 'config', strategy: 'prompt' },\n { path: 'agentmark', type: 'directory', strategy: 'prompt' },\n { path: 'agentmark.client.ts', type: 'source', strategy: 'prompt' },\n { path: 'agentmark_client.py', type: 'source', strategy: 'prompt' },\n { path: '.gitignore', type: 'dotfile', strategy: 'append' },\n { path: '.env', type: 'dotfile', strategy: 'append' },\n { path: 'package.json', type: 'config', strategy: 'merge' },\n { path: 'index.ts', type: 'source', strategy: 'skip' },\n { path: 'main.py', type: 'source', strategy: 'skip' },\n { path: 'tsconfig.json', type: 'config', strategy: 'skip' },\n { path: 'pyproject.toml', type: 'config', strategy: 'skip' },\n];\n\n/** User's resolution choice for a conflict */\nexport type ConflictAction = 'skip' | 'overwrite' | 'merge';\n\n/** A conflict resolution decision from the user */\nexport interface ConflictResolution {\n /** Path to the conflicting file */\n path: string;\n /** Action chosen by the user */\n action: ConflictAction;\n}\n\n/** Detected information about an existing project */\nexport interface ProjectInfo {\n /** Whether any project indicators were found */\n isExistingProject: boolean;\n /** Detected project type */\n type: 'typescript' | 'python' | 'unknown';\n /** Detected package manager (for TypeScript projects) */\n packageManager: PackageManagerConfig;\n /** Files that exist and may conflict */\n conflictingFiles: ConflictFile[];\n /** Whether the agentmark/ directory already exists */\n hasAgentmarkDir: boolean;\n /** Whether an existing Python venv was detected */\n pythonVenv: PythonVenvInfo | null;\n}\n\n/** Result of a file merge operation */\nexport interface MergeResult {\n /** Whether the merge was successful */\n success: boolean;\n /** The merged content (if applicable) */\n content?: string;\n /** Any warnings generated during merge */\n warnings: string[];\n /** What was added (for user feedback) */\n added: string[];\n /** What was skipped (already present) */\n skipped: string[];\n}\n\n/** Extended options for initialization in existing projects */\nexport interface InitOptions {\n /** Target directory path */\n targetPath: string;\n /** Selected language */\n language: 'typescript' | 'python';\n /** Selected adapter (TypeScript only) */\n adapter?: string;\n /** Deployment mode */\n deploymentMode: 'cloud' | 'static';\n /** API key (if provided) */\n apiKey?: string;\n /** IDE client for MCP setup */\n client: string;\n /** Detected project info (null if new project) */\n projectInfo: ProjectInfo | null;\n /** User's conflict resolutions */\n conflictResolutions: ConflictResolution[];\n}\n","export const getTsConfigContent = (): object => {\n return {\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n }\n };\n}; ","export const getAnimalDrawingPrompt = (): string => {\n return `---\nname: animal-drawing\nimage_config:\n model_name: dall-e-3\n num_images: 1\n size: 1024x1024\n aspect_ratio: 1:1\ntest_settings:\n dataset: animal.jsonl\n props:\n animal: \"cat\"\n---\n\n<ImagePrompt>\nDraw a hyper-realistic picture of a {props.animal}\n</ImagePrompt>`;\n};","export const getCustomerSupportPrompt = (model: string): string => {\n return `---\nname: customer-support-agent\ntext_config:\n model_name: ${model}\n max_calls: 2\n tools:\n search_knowledgebase:\n description: Search the company knowledgebase for information about shipping, warranty, and returns policies.\n parameters:\n type: object\n properties:\n query:\n type: string\n description: The search query to find relevant information\n required: [query]\ntest_settings:\n dataset: customer-query.jsonl\n props:\n customer_question: \"I'm having trouble with my order. How long does shipping take?\"\ninput_schema:\n type: object\n properties:\n customer_question:\n type: string\n description: \"The customer's question\"\n required:\n - customer_question\n---\n\n<System>\nYou are a customer service agent for a company that sells products online. You are given a customer's question and you need to respond to the customer. You need to be friendly, professional, and helpful.\n\nYou have access to the following tool:\n- search_knowledgebase: Search the company knowledgebase for information about shipping, warranty, and returns. Use this when customers ask about these topics.\n</System>\n\n<User>{props.customer_question}</User>`;\n};","export const getPartyPlannerPrompt = (model: string): string => {\n return `---\nname: party-planner\nobject_config:\n model_name: ${model}\n schema:\n type: object\n properties:\n names:\n type: array\n description: \"List of names of people attending the party.\"\n items:\n type: string\n required:\n - names\ntest_settings:\n dataset: party.jsonl\n evals:\n - exact_match_json\n props:\n party_text: \"We're having a party with Alice, Bob, and Carol.\"\ninput_schema:\n type: object\n properties:\n party_text:\n type: string\n description: \"A block of text describing the upcoming party and attendees.\"\n required:\n - party_text\n---\n\n<System>\nExtract the names of all people attending the party from the following text. Respond with a list of names only.\n</System>\n\n<User>\nText: {props.party_text}\n</User>`;\n};","export const getStoryTellerPrompt = (): string => {\n return `---\nname: story-teller\nspeech_config:\n model_name: tts-1-hd\n voice: \"nova\"\n speed: 1.0\n output_format: \"mp3\"\ntest_settings:\n dataset: story.jsonl\n props:\n story: \"Once upon a time, there was a cat who loved to play with a ball.\"\n---\n\n<System>\nYou are a storyteller for children. Make sure your story is engaging and interesting.\n</System>\n\n<SpeechPrompt>\n- {props.story}\n</SpeechPrompt>`;\n};","export const getAnimalDataset = (): string => {\n return `{\"input\": {\"animal\": \"cat\"}, \"expected_output\": \"A realistic picture of a cat\"}\n{\"input\": {\"animal\": \"dog\"}, \"expected_output\": \"A realistic picture of a dog\"}\n{\"input\": {\"animal\": \"bird\"}, \"expected_output\": \"A realistic picture of a bird\"}`;\n};\n\nexport const getCustomerQueryDataset = (): string => {\n return `{\"input\": {\"customer_question\": \"My package hasn't arrived yet. Can you help me track it?\"}}\n{\"input\": {\"customer_question\": \"I received the wrong item in my order. What should I do?\"}}\n{\"input\": {\"customer_question\": \"How do I return a product that I purchased last week?\"}}`;\n};\n\nexport const getPartyDataset = (): string => {\n return `{\"input\": {\"party_text\": \"We're having a party with Alice, Bob, and Carol.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Alice\\\\\", \\\\\"Bob\\\\\", \\\\\"Carol\\\\\"]}\"}\n{\"input\": {\"party_text\": \"The guest list includes Dave, Emma, and Frank.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Dave\\\\\", \\\\\"Emma\\\\\", \\\\\"Frank\\\\\"]}\"}\n{\"input\": {\"party_text\": \"Join us for a celebration with Grace, Henry, and Isla.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Grace\\\\\", \\\\\"Henry\\\\\", \\\\\"Isla\\\\\"]}\"}`;\n};\n\nexport const getStoryDataset = (): string => {\n return `{\"input\": {\"story\": \"Once upon a time, the Moon woke up and found her glow missing! She floated around the sky asking stars, clouds, and even comets if they'd seen her light. It wasn't until she peeked into a mountain lake that she saw her glow shining back—hidden in her own reflection! Laughing, she realized she had never lost it—it was with her all along, just hiding beneath a cloudy sky.\"}}\n{\"input\": {\"story\": \"Benny was no ordinary banana—he dreamed of becoming a superhero. One day, when a monkey slipped in the jungle and cried for help, Benny rolled into action, dodging vines and swinging from branches using his peel like a lasso. The monkey was saved, and from that day on, Benny was known as \\\\\"The Peel of Justice,\\\\\" the bravest fruit in the whole rainforest.\"}}\n{\"input\": {\"story\": \"In the town of Maplebrook, there was a library that whispered stories when no one was looking. Curious little Nia tiptoed in one rainy day and heard the books giggling softly. She opened one called The Secret Tunnel, and to her surprise, it sucked her in! She found herself riding a dragon through glittering caves. When she returned, the book winked shut—waiting for its next reader to listen.\"}}`;\n};","import fs from 'fs-extra';\nimport { getAnimalDrawingPrompt } from './animal-drawing-prompt.js';\nimport { getCustomerSupportPrompt } from './customer-support-prompt.js';\nimport { getPartyPlannerPrompt } from './party-planner-prompt.js';\nimport { getStoryTellerPrompt } from './story-teller-prompt.js';\nimport { getAnimalDataset, getCustomerQueryDataset, getPartyDataset, getStoryDataset } from './datasets.js';\n\nexport const createExamplePrompts = (model: string, targetPath: string = \".\", adapter: string = \"ai-sdk\") => {\n // Ensure the templates directory exists\n fs.ensureDirSync(`${targetPath}/agentmark`);\n\n const noImageSupport = [\"mastra\", \"claude-agent-sdk\"];\n const noSpeechSupport = [\"mastra\", \"claude-agent-sdk\"];\n const skipImagePrompts = noImageSupport.includes(adapter);\n const skipSpeechPrompts = noSpeechSupport.includes(adapter);\n\n // Create animal drawing prompt and dataset (uses image_config - skip for unsupported adapters)\n if (!skipImagePrompts) {\n const animalDrawingPrompt = getAnimalDrawingPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/animal-drawing.prompt.mdx`, animalDrawingPrompt);\n const animalDataset = getAnimalDataset();\n fs.writeFileSync(`${targetPath}/agentmark/animal.jsonl`, animalDataset);\n }\n\n // Create customer support prompt and dataset\n const customerSupportPrompt = getCustomerSupportPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/customer-support-agent.prompt.mdx`, customerSupportPrompt);\n const customerQueryDataset = getCustomerQueryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/customer-query.jsonl`, customerQueryDataset);\n\n // Create party planner prompt and dataset\n const partyPlannerPrompt = getPartyPlannerPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/party-planner.prompt.mdx`, partyPlannerPrompt);\n const partyDataset = getPartyDataset();\n fs.writeFileSync(`${targetPath}/agentmark/party.jsonl`, partyDataset);\n\n // Create story teller prompt and dataset (uses speech_config - skip for unsupported adapters)\n if (!skipSpeechPrompts) {\n const storyTellerPrompt = getStoryTellerPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/story-teller.prompt.mdx`, storyTellerPrompt);\n const storyDataset = getStoryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/story.jsonl`, storyDataset);\n }\n};","import { getAdapterConfig } from \"./adapters.js\";\n\nexport const getClientConfigContent = (options: { provider: string; languageModels: string[]; adapter: string; deploymentMode?: \"cloud\" | \"static\" }) => {\n const { provider, languageModels, adapter, deploymentMode = \"cloud\" } = options;\n const adapterConfig = getAdapterConfig(adapter, provider);\n const { modelRegistry, toolRegistry } = adapterConfig.classes;\n\n // Claude Agent SDK doesn't use @ai-sdk provider imports\n const isClaudeAgentSdk = adapter === \"claude-agent-sdk\";\n const providerImport = isClaudeAgentSdk ? '' : `import { ${provider} } from '@ai-sdk/${provider}';`;\n\n const extraModelRegs = provider === 'openai' && !isClaudeAgentSdk\n ? `.registerModels([\"dall-e-3\"], (name: string) => ${provider}.image(name))\n .registerModels([\"tts-1-hd\"], (name: string) => ${provider}.speech(name))`\n : '';\n\n // Import loaders from dedicated packages\n const loaderImport = deploymentMode === \"cloud\"\n ? `import { ApiLoader } from \"@agentmark-ai/loader-api\";`\n : `import { ApiLoader } from \"@agentmark-ai/loader-api\";\nimport { FileLoader } from \"@agentmark-ai/loader-file\";`;\n\n const loaderSetup = deploymentMode === \"cloud\"\n ? ` // ApiLoader works for both development and production\n // - Development: 'agentmark dev' sets AGENTMARK_BASE_URL to localhost\n // - Production: Set AGENTMARK_API_KEY and AGENTMARK_APP_ID for cloud\n const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : ApiLoader.cloud({\n apiKey: process.env.AGENTMARK_API_KEY!,\n appId: process.env.AGENTMARK_APP_ID!,\n });`\n : ` const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : new FileLoader('./dist/agentmark');`;\n\n // Claude Agent SDK model registry setup is different\n const modelRegistrySetup = isClaudeAgentSdk\n ? `function createModelRegistry() {\n // Claude Agent SDK accepts model names directly.\n // Use createDefault() for simple pass-through of model names.\n const modelRegistry = ${modelRegistry}.createDefault();\n\n // To configure specific models (e.g., extended thinking), use:\n // const modelRegistry = new ${modelRegistry}()\n // .registerModels(/claude-.*-thinking/, (name) => ({\n // model: name,\n // maxThinkingTokens: 10000, // Enable extended thinking\n // }))\n // .registerModels(\"claude-sonnet-4-20250514\", (name) => ({ model: name }));\n\n return modelRegistry;\n}`\n : `function createModelRegistry() {\n const modelRegistry = new ${modelRegistry}()\n .registerModels(${JSON.stringify(languageModels)}, (name: string) => ${provider}(name))\n ${extraModelRegs};\n return modelRegistry;\n}`;\n\n // Claude Agent SDK adapter options\n const adapterOptionsImport = isClaudeAgentSdk\n ? `\n// Claude Agent SDK adapter options\n// See: https://github.com/anthropics/claude-agent-sdk\nconst adapterOptions = {\n // Permission mode controls tool access:\n // - 'default': Requires user approval for each tool use\n // - 'acceptEdits': Auto-approve file edits only\n // - 'bypassPermissions': Auto-approve all tools (use for automated pipelines)\n // - 'plan': Planning mode only, no tool execution\n permissionMode: 'bypassPermissions' as const,\n\n // Maximum conversation turns before stopping\n maxTurns: 20,\n\n // Optional: Set working directory for file operations\n // cwd: process.cwd(),\n\n // Optional: Budget limit in USD\n // maxBudgetUsd: 10.00,\n\n // Optional: Restrict which tools the agent can use\n // allowedTools: ['Read', 'Write', 'Glob'],\n // disallowedTools: ['Bash'],\n};`\n : '';\n\n const createClientCall = isClaudeAgentSdk\n ? `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry, adapterOptions });`\n : `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry });`;\n\n return `// agentmark.client.ts\nimport path from 'node:path';\nimport dotenv from 'dotenv';\ndotenv.config({ path: path.resolve(__dirname, '.env') });\nimport { createAgentMarkClient, ${modelRegistry}, ${toolRegistry}, EvalRegistry } from \"${adapterConfig.package}\";\n${loaderImport}\nimport AgentMarkTypes, { Tools } from './agentmark.types';\n${providerImport}\n${adapterOptionsImport}\n\n${modelRegistrySetup}\n\nfunction createToolRegistry() {\n const toolRegistry = new ${toolRegistry}<Tools>()\n .register('search_knowledgebase', async ({ query }) => {\n // Simulate search delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Return all three knowledge base articles\n // The LLM will select the relevant one based on the query\n return {\n articles: [\n { topic: 'shipping', content: 'Standard shipping takes 3–5 business days.' },\n { topic: 'warranty', content: 'All products include a 1-year limited warranty.' },\n { topic: 'returns', content: 'You can return items within 30 days of delivery.' }\n ]\n };\n });\n return toolRegistry;\n}\n\nfunction createEvalRegistry() {\n const evalRegistry = new EvalRegistry()\n .register('exact_match_json', ({ output, expectedOutput }) => {\n if (!expectedOutput) {\n return { score: 0, label: 'error', reason: 'No expected output provided', passed: false };\n }\n try {\n const ok = JSON.stringify(output) === JSON.stringify(JSON.parse(expectedOutput));\n return {\n score: ok ? 1 : 0,\n label: ok ? 'correct' : 'incorrect',\n reason: ok ? 'Exact match' : 'Mismatch',\n passed: ok\n };\n } catch (e) {\n return { score: 0, label: 'error', reason: 'Failed to parse expected output as JSON', passed: false };\n }\n });\n return evalRegistry;\n}\n\nfunction createClient() {\n${loaderSetup}\n const modelRegistry = createModelRegistry();\n const toolRegistry = createToolRegistry();\n const evalRegistry = createEvalRegistry();\n ${createClientCall}\n}\n\nexport const client = createClient();\n`;\n};\n"],"mappings":"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","names":["fs","fs","fs","fs"]}
1
+ {"version":3,"sources":["../../../../src/utils/examples/templates/adapters.ts","../../../../src/utils/examples/templates/app-index.ts","../../../../src/utils/examples/templates/env.ts","../../../../src/utils/examples/templates/package-setup.ts","../../../../src/utils/file-merge.ts","../../../../src/utils/types.ts","../../../../src/utils/examples/templates/tsconfig.ts","../../../../src/utils/examples/templates/animal-drawing-prompt.ts","../../../../src/utils/examples/templates/customer-support-prompt.ts","../../../../src/utils/examples/templates/party-planner-prompt.ts","../../../../src/utils/examples/templates/story-teller-prompt.ts","../../../../src/utils/examples/templates/datasets.ts","../../../../src/utils/examples/templates/example-prompts.ts","../../../../src/utils/examples/templates/user-client-config.ts"],"sourcesContent":["export interface AdapterConfig {\n /** npm package name for the adapter */\n package: string;\n /** Additional npm packages required by this adapter */\n dependencies: string[];\n /** Class names used in generated code */\n classes: {\n modelRegistry: string;\n toolRegistry: string;\n webhookHandler: string;\n };\n}\n\nexport const createAdapterConfig = (\n provider: string\n): Record<string, AdapterConfig> => {\n return {\n \"ai-sdk\": {\n package: \"@agentmark-ai/ai-sdk-v5-adapter\",\n dependencies: [\"ai@^5\", `@ai-sdk/${provider}@^2`],\n classes: {\n modelRegistry: \"VercelAIModelRegistry\",\n toolRegistry: \"VercelAIToolRegistry\",\n webhookHandler: \"VercelAdapterWebhookHandler\",\n },\n },\n mastra: {\n package: \"@agentmark-ai/mastra-v0-adapter\",\n dependencies: [\n \"@mastra/core@<0.20.0\",\n \"@mastra/mcp@<0.13.4\",\n `@ai-sdk/${provider}@<2`,\n ],\n classes: {\n modelRegistry: \"MastraModelRegistry\",\n toolRegistry: \"MastraToolRegistry\",\n webhookHandler: \"MastraAdapterWebhookHandler\",\n },\n },\n \"claude-agent-sdk\": {\n package: \"@agentmark-ai/claude-agent-sdk-adapter\",\n dependencies: [\"@anthropic-ai/claude-agent-sdk@^0.1.0\"],\n classes: {\n modelRegistry: \"ClaudeAgentModelRegistry\",\n toolRegistry: \"ClaudeAgentToolRegistry\",\n webhookHandler: \"ClaudeAgentWebhookHandler\",\n },\n },\n };\n};\n\nexport function getAdapterConfig(\n adapter: string,\n provider: string\n): AdapterConfig {\n const config = createAdapterConfig(provider)[adapter];\n if (!config) {\n throw new Error(\n `Unknown adapter: ${adapter}. Available adapters: ${Object.keys(\n createAdapterConfig(provider)\n ).join(\", \")}`\n );\n }\n return config;\n}\n","export const getIndexFileContent = (adapter: string = \"ai-sdk\", deploymentMode: \"cloud\" | \"static\" = \"cloud\"): string => {\n const isCloud = deploymentMode === \"cloud\";\n\n const tracingImport = `import { AgentMarkSDK } from \"@agentmark-ai/sdk\";\n`;\n\n const cloudTracingInit = `\n// Initialize tracing - traces will be sent to AgentMark Cloud\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: process.env.AGENTMARK_API_KEY ?? \"\",\n appId: process.env.AGENTMARK_APP_ID ?? \"\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const staticTracingInit = `\n// Initialize tracing - traces will be sent to local dev server\n// Make sure to run \"npm run agentmark dev\" in another terminal first\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: \"\",\n appId: \"\",\n baseUrl: \"http://localhost:9418\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const tracingInit = isCloud ? cloudTracingInit : staticTracingInit;\n\n if (adapter === \"claude-agent-sdk\") {\n return `import \"dotenv/config\";\nimport { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { withTracing } from \"@agentmark-ai/claude-agent-sdk-adapter\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const adapted = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n // Execute with Claude Agent SDK using withTracing for telemetry\n // The adapted object contains { query, telemetry } ready for withTracing()\n const tracedResult = await withTracing(query, adapted);\n\n // traceId is available immediately\n console.log(\"Trace ID:\", tracedResult.traceId);\n\n let result = \"\";\n for await (const message of tracedResult) {\n if (message.type === \"result\" && message.subtype === \"success\") {\n result = message.result || \"\";\n }\n }\n\n return result;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else if (adapter === \"mastra\") {\n return `import \"dotenv/config\";\nimport { Agent } from \"@mastra/core/agent\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const agentConfig = await prompt.formatAgent({\n options: {\n telemetry,\n },\n });\n\n const [messages, generateOptions] = await agentConfig.formatMessages({\n props: {\n customer_question: customer_message,\n },\n });\n\n const agent = new Agent(agentConfig);\n const response = await agent.generate(messages, generateOptions);\n\n return (response as any).text || (response as any).content || String(response);\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else {\n return `import \"dotenv/config\";\nimport { generateText } from \"ai\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const vercelInput = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n const resp = await generateText(vercelInput);\n\n return resp.text;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n }\n};\n","export const getEnvFileContent = (\n _modelProvider: string,\n apiKey: string = '',\n adapter: string = 'ai-sdk'\n): string => {\n const apiKeyValue = apiKey || 'your_api_key_here';\n\n // Use ANTHROPIC_API_KEY for claude-agent-sdk adapter\n const apiKeyName = adapter === 'claude-agent-sdk' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n\n return `# Cloud deployment: Set these environment variables\n# AGENTMARK_BASE_URL=https://api.agentmark.co\n# AGENTMARK_API_KEY=your_agentmark_api_key\n# AGENTMARK_APP_ID=your_agentmark_app_id\n# Learn more: https://docs.agentmark.co/platform/getting_started/quickstart\n\n${apiKeyName}=${apiKeyValue}\n`;\n};\n","import fs from \"fs-extra\";\nimport { execSync } from \"child_process\";\nimport { getAdapterConfig } from \"./adapters.js\";\nimport { mergePackageJson } from \"../../file-merge.js\";\nimport { DEFAULT_PACKAGE_MANAGER } from \"../../types.js\";\nimport type { ProjectInfo, PackageManagerConfig } from \"../../types.js\";\n\nexport const setupPackageJson = (\n targetPath: string = \".\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n projectInfo: ProjectInfo | null = null\n) => {\n const packageJsonPath = `${targetPath}/package.json`;\n const isExistingProject = projectInfo?.isExistingProject ?? false;\n\n if (!fs.existsSync(packageJsonPath)) {\n console.log(\"Creating package.json...\");\n execSync(\"npm init -y\", { cwd: targetPath });\n }\n\n // For existing projects, use merge logic\n if (isExistingProject && fs.existsSync(packageJsonPath)) {\n // Build scripts to add - with namespacing for conflicts\n const scriptsToAdd: Record<string, string> = {\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n if (deploymentMode === \"static\") {\n scriptsToAdd[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n // Use mergePackageJson for existing projects\n const result = mergePackageJson(targetPath, {}, {}, scriptsToAdd);\n\n if (result.added.length > 0) {\n console.log(`✅ Added to package.json: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Skipped existing in package.json: ${result.skipped.join(', ')}`);\n }\n if (result.warnings.length > 0) {\n result.warnings.forEach((w) => console.log(`⚠️ ${w}`));\n }\n } else {\n // Update the created package.json with additional information\n const pkgJson = fs.readJsonSync(packageJsonPath);\n pkgJson.name =\n pkgJson.name === \"test\" || !pkgJson.name\n ? \"agentmark-example-app\"\n : pkgJson.name;\n pkgJson.description =\n pkgJson.description || \"A simple Node.js app using the Agentmark SDK\";\n\n // Base scripts for all modes\n const scripts: Record<string, string> = {\n ...pkgJson.scripts,\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n // For static/self-hosted mode, add the build script\n if (deploymentMode === \"static\") {\n scripts[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n pkgJson.scripts = scripts;\n\n fs.writeJsonSync(packageJsonPath, pkgJson, { spaces: 2 });\n }\n};\n\nexport const installDependencies = (\n modelProvider: string,\n targetPath: string = \".\",\n adapter: string = \"ai-sdk\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n packageManager: PackageManagerConfig | null = null\n) => {\n console.log(\"Installing required packages...\");\n console.log(\"This might take a moment...\");\n\n const adapterConfig = getAdapterConfig(adapter, modelProvider);\n\n // Use detected package manager or default to npm\n const pm = packageManager || DEFAULT_PACKAGE_MANAGER;\n\n // npm needs --legacy-peer-deps due to some transitive dependency conflicts\n const npmSuffix = pm.name === 'npm' ? ' --legacy-peer-deps' : '';\n\n try {\n // Dev dependencies to install\n const devDeps = ['typescript', 'ts-node', '@types/node', '@agentmark-ai/cli'];\n\n // Install dev dependencies using detected package manager config\n const devDepsCmd = `${pm.addDevCmd} ${devDeps.join(' ')}${npmSuffix}`;\n\n console.log(`Using ${pm.name} to install dependencies...`);\n\n execSync(devDepsCmd, {\n stdio: \"inherit\",\n cwd: targetPath,\n });\n\n // Install the common packages\n // SDK is required for both local (connects to agentmark serve) and cloud (connects to API)\n // Loader packages are imported directly - ApiLoader always needed, FileLoader only for static mode\n const loaderPackages = deploymentMode === \"static\"\n ? [\"@agentmark-ai/loader-api\", \"@agentmark-ai/loader-file\"]\n : [\"@agentmark-ai/loader-api\"];\n\n const deps = [\n \"dotenv\",\n \"@agentmark-ai/prompt-core\",\n \"@agentmark-ai/sdk\",\n adapterConfig.package,\n ...loaderPackages,\n ...adapterConfig.dependencies,\n ];\n\n // Install regular dependencies using detected package manager config\n const depsCmd = `${pm.addCmd} ${deps.join(' ')}${npmSuffix}`;\n\n execSync(depsCmd, { stdio: \"inherit\", cwd: targetPath });\n\n console.log(\"Packages installed successfully!\");\n } catch (error) {\n console.error(\"Error installing packages:\", error);\n throw new Error(\n \"Failed to install required packages. Please check your network connection and try again.\"\n );\n }\n};\n","/**\n * File merge utilities for handling existing files during initialization.\n * Supports merging package.json, appending to .gitignore and .env files.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport type { MergeResult } from './types.js';\n\n/**\n * Merge AgentMark dependencies and scripts into an existing package.json.\n * Preserves all existing content, only adds missing AgentMark entries.\n */\nexport function mergePackageJson(\n targetPath: string,\n agentmarkDeps: Record<string, string>,\n agentmarkDevDeps: Record<string, string>,\n agentmarkScripts: Record<string, string>\n): MergeResult {\n const packageJsonPath = path.join(targetPath, 'package.json');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n // Read existing package.json\n if (!fs.existsSync(packageJsonPath)) {\n result.warnings.push('No existing package.json found');\n return result;\n }\n\n const existing = fs.readJsonSync(packageJsonPath) as Record<string, unknown>;\n\n // Initialize sections if they don't exist\n if (!existing.dependencies) {\n existing.dependencies = {};\n }\n if (!existing.devDependencies) {\n existing.devDependencies = {};\n }\n if (!existing.scripts) {\n existing.scripts = {};\n }\n\n const deps = existing.dependencies as Record<string, string>;\n const devDeps = existing.devDependencies as Record<string, string>;\n const scripts = existing.scripts as Record<string, string>;\n\n // Add AgentMark dependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDeps)) {\n if (deps[pkg]) {\n result.skipped.push(`dependency: ${pkg} (already exists)`);\n } else {\n deps[pkg] = version;\n result.added.push(`dependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark devDependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDevDeps)) {\n if (devDeps[pkg]) {\n result.skipped.push(`devDependency: ${pkg} (already exists)`);\n } else {\n devDeps[pkg] = version;\n result.added.push(`devDependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark scripts (use namespace if conflict exists)\n for (const [scriptName, scriptCmd] of Object.entries(agentmarkScripts)) {\n if (scripts[scriptName]) {\n // Conflict - use namespaced script name\n const namespacedName = `agentmark:${scriptName}`;\n if (scripts[namespacedName]) {\n // Both the original and namespaced version exist - skip with warning\n result.skipped.push(`script: ${scriptName}`);\n result.warnings.push(\n `Script \"${scriptName}\" and \"${namespacedName}\" both already exist. Skipping.`\n );\n } else {\n scripts[namespacedName] = scriptCmd;\n result.added.push(`script: ${namespacedName} (namespaced due to conflict)`);\n result.warnings.push(\n `Script \"${scriptName}\" already exists. Added as \"${namespacedName}\" instead.`\n );\n }\n } else {\n scripts[scriptName] = scriptCmd;\n result.added.push(`script: ${scriptName}`);\n }\n }\n\n // Write merged package.json\n fs.writeJsonSync(packageJsonPath, existing, { spaces: 2 });\n\n result.success = true;\n result.content = JSON.stringify(existing, null, 2);\n return result;\n } catch (error) {\n result.warnings.push(`Error merging package.json: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark entries to an existing .gitignore file.\n * Checks for duplicates before adding.\n */\nexport function appendGitignore(targetPath: string, entries: string[]): MergeResult {\n const gitignorePath = path.join(targetPath, '.gitignore');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(gitignorePath)) {\n existingContent = fs.readFileSync(gitignorePath, 'utf-8');\n }\n\n // Parse existing entries (normalize trailing slashes)\n const existingEntries = new Set(\n existingContent\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'))\n .map((line) => line.replace(/\\/$/, '')) // Remove trailing slashes for comparison\n );\n\n const entriesToAdd: string[] = [];\n\n for (const entry of entries) {\n const normalizedEntry = entry.replace(/\\/$/, '');\n if (existingEntries.has(normalizedEntry)) {\n result.skipped.push(entry);\n } else {\n entriesToAdd.push(entry);\n result.added.push(entry);\n }\n }\n\n if (entriesToAdd.length > 0) {\n // Add a header comment and the new entries\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n newContent += entriesToAdd.join('\\n');\n newContent += '\\n';\n\n fs.writeFileSync(gitignorePath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .gitignore: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark environment variables to an existing .env file.\n * Does not overwrite existing keys.\n */\nexport function appendEnv(\n targetPath: string,\n envVars: Record<string, string>\n): MergeResult {\n const envPath = path.join(targetPath, '.env');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(envPath)) {\n existingContent = fs.readFileSync(envPath, 'utf-8');\n }\n\n // Parse existing keys\n const existingKeys = new Set<string>();\n const lines = existingContent.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const match = trimmed.match(/^([^=]+)=/);\n if (match && match[1]) {\n existingKeys.add(match[1]);\n }\n }\n }\n\n const varsToAdd: Array<[string, string]> = [];\n\n for (const [key, value] of Object.entries(envVars)) {\n if (existingKeys.has(key)) {\n result.skipped.push(key);\n } else {\n varsToAdd.push([key, value]);\n result.added.push(key);\n }\n }\n\n if (varsToAdd.length > 0) {\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n for (const [key, value] of varsToAdd) {\n newContent += `${key}=${value}\\n`;\n }\n\n fs.writeFileSync(envPath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .env: ${error}`);\n return result;\n }\n}\n\n/**\n * Check if a file should be skipped based on existing project detection.\n * Used for files like index.ts that should never be generated in existing projects.\n */\nexport function shouldSkipFile(\n fileName: string,\n isExistingProject: boolean,\n skipFiles: string[]\n): boolean {\n if (!isExistingProject) {\n return false;\n }\n return skipFiles.includes(fileName);\n}\n","/**\n * Type definitions for existing repository initialization.\n * These types support project detection, conflict resolution, and package manager handling.\n */\n\n/** Supported package managers for TypeScript projects */\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\n/** Configuration for a specific package manager */\nexport interface PackageManagerConfig {\n /** Package manager name */\n name: PackageManager;\n /** Lock file that indicates this package manager is in use */\n lockFile: string;\n /** Command to install all dependencies */\n installCmd: string;\n /** Command to add a production dependency */\n addCmd: string;\n /** Command to add a dev dependency */\n addDevCmd: string;\n /** Command prefix for running scripts (e.g., 'npm run', 'yarn') */\n runCmd: string;\n}\n\n/** Package manager configurations indexed by lock file name */\nexport const PACKAGE_MANAGERS: Record<string, PackageManagerConfig> = {\n 'yarn.lock': {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCmd: 'yarn install',\n addCmd: 'yarn add',\n addDevCmd: 'yarn add --dev',\n runCmd: 'yarn',\n },\n 'pnpm-lock.yaml': {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCmd: 'pnpm install',\n addCmd: 'pnpm add',\n addDevCmd: 'pnpm add --save-dev',\n runCmd: 'pnpm',\n },\n 'bun.lockb': {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCmd: 'bun install',\n addCmd: 'bun add',\n addDevCmd: 'bun add --dev',\n runCmd: 'bun run',\n },\n 'package-lock.json': {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCmd: 'npm install',\n addCmd: 'npm install',\n addDevCmd: 'npm install --save-dev',\n runCmd: 'npm run',\n },\n};\n\n/** Default package manager when no lock file is found */\nexport const DEFAULT_PACKAGE_MANAGER: PackageManagerConfig = PACKAGE_MANAGERS['package-lock.json']!;\n\n/** Information about a detected Python virtual environment */\nexport interface PythonVenvInfo {\n /** Absolute path to the venv directory */\n path: string;\n /** Relative name (e.g., '.venv' or 'venv') */\n name: string;\n /** Platform-specific activate command */\n activateCmd: string;\n /** Platform-specific pip path */\n pipPath: string;\n}\n\n/** Type of file for determining merge strategy */\nexport type FileType = 'config' | 'source' | 'directory' | 'dotfile';\n\n/** Resolution strategy for a conflicting file */\nexport type ConflictStrategy = 'merge' | 'append' | 'prompt' | 'skip';\n\n/** Represents a file that may conflict with AgentMark initialization */\nexport interface ConflictFile {\n /** Relative path from project root */\n path: string;\n /** Type of file for determining merge strategy */\n type: FileType;\n /** Recommended resolution strategy */\n strategy: ConflictStrategy;\n}\n\n/** Files that may conflict with AgentMark initialization */\nexport const CONFLICT_FILES: ConflictFile[] = [\n { path: 'agentmark.json', type: 'config', strategy: 'prompt' },\n { path: 'agentmark', type: 'directory', strategy: 'prompt' },\n { path: 'agentmark.client.ts', type: 'source', strategy: 'prompt' },\n { path: 'agentmark_client.py', type: 'source', strategy: 'prompt' },\n { path: '.gitignore', type: 'dotfile', strategy: 'append' },\n { path: '.env', type: 'dotfile', strategy: 'append' },\n { path: 'package.json', type: 'config', strategy: 'merge' },\n { path: 'index.ts', type: 'source', strategy: 'skip' },\n { path: 'main.py', type: 'source', strategy: 'skip' },\n { path: 'tsconfig.json', type: 'config', strategy: 'skip' },\n { path: 'pyproject.toml', type: 'config', strategy: 'skip' },\n];\n\n/** User's resolution choice for a conflict */\nexport type ConflictAction = 'skip' | 'overwrite' | 'merge';\n\n/** A conflict resolution decision from the user */\nexport interface ConflictResolution {\n /** Path to the conflicting file */\n path: string;\n /** Action chosen by the user */\n action: ConflictAction;\n}\n\n/** Detected information about an existing project */\nexport interface ProjectInfo {\n /** Whether any project indicators were found */\n isExistingProject: boolean;\n /** Detected project type */\n type: 'typescript' | 'python' | 'unknown';\n /** Detected package manager (for TypeScript projects) */\n packageManager: PackageManagerConfig;\n /** Files that exist and may conflict */\n conflictingFiles: ConflictFile[];\n /** Whether the agentmark/ directory already exists */\n hasAgentmarkDir: boolean;\n /** Whether an existing Python venv was detected */\n pythonVenv: PythonVenvInfo | null;\n}\n\n/** Result of a file merge operation */\nexport interface MergeResult {\n /** Whether the merge was successful */\n success: boolean;\n /** The merged content (if applicable) */\n content?: string;\n /** Any warnings generated during merge */\n warnings: string[];\n /** What was added (for user feedback) */\n added: string[];\n /** What was skipped (already present) */\n skipped: string[];\n}\n\n/** Extended options for initialization in existing projects */\nexport interface InitOptions {\n /** Target directory path */\n targetPath: string;\n /** Selected language */\n language: 'typescript' | 'python';\n /** Selected adapter (TypeScript only) */\n adapter?: string;\n /** Deployment mode */\n deploymentMode: 'cloud' | 'static';\n /** API key (if provided) */\n apiKey?: string;\n /** IDE client for MCP setup */\n client: string;\n /** Detected project info (null if new project) */\n projectInfo: ProjectInfo | null;\n /** User's conflict resolutions */\n conflictResolutions: ConflictResolution[];\n}\n","export const getTsConfigContent = (): object => {\n return {\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n }\n };\n}; ","export const getAnimalDrawingPrompt = (): string => {\n return `---\nname: animal-drawing\nimage_config:\n model_name: openai/dall-e-3\n num_images: 1\n size: 1024x1024\n aspect_ratio: 1:1\ntest_settings:\n dataset: animal.jsonl\n props:\n animal: \"cat\"\n---\n\n<ImagePrompt>\nDraw a hyper-realistic picture of a {props.animal}\n</ImagePrompt>`;\n};","export const getCustomerSupportPrompt = (model: string): string => {\n return `---\nname: customer-support-agent\ntext_config:\n model_name: ${model}\n max_calls: 2\n tools:\n search_knowledgebase:\n description: Search the company knowledgebase for information about shipping, warranty, and returns policies.\n parameters:\n type: object\n properties:\n query:\n type: string\n description: The search query to find relevant information\n required: [query]\ntest_settings:\n dataset: customer-query.jsonl\n props:\n customer_question: \"I'm having trouble with my order. How long does shipping take?\"\ninput_schema:\n type: object\n properties:\n customer_question:\n type: string\n description: \"The customer's question\"\n required:\n - customer_question\n---\n\n<System>\nYou are a customer service agent for a company that sells products online. You are given a customer's question and you need to respond to the customer. You need to be friendly, professional, and helpful.\n\nYou have access to the following tool:\n- search_knowledgebase: Search the company knowledgebase for information about shipping, warranty, and returns. Use this when customers ask about these topics.\n</System>\n\n<User>{props.customer_question}</User>`;\n};","export const getPartyPlannerPrompt = (model: string): string => {\n return `---\nname: party-planner\nobject_config:\n model_name: ${model}\n schema:\n type: object\n properties:\n names:\n type: array\n description: \"List of names of people attending the party.\"\n items:\n type: string\n required:\n - names\ntest_settings:\n dataset: party.jsonl\n evals:\n - exact_match_json\n props:\n party_text: \"We're having a party with Alice, Bob, and Carol.\"\ninput_schema:\n type: object\n properties:\n party_text:\n type: string\n description: \"A block of text describing the upcoming party and attendees.\"\n required:\n - party_text\n---\n\n<System>\nExtract the names of all people attending the party from the following text. Respond with a list of names only.\n</System>\n\n<User>\nText: {props.party_text}\n</User>`;\n};","export const getStoryTellerPrompt = (): string => {\n return `---\nname: story-teller\nspeech_config:\n model_name: openai/tts-1-hd\n voice: \"nova\"\n speed: 1.0\n output_format: \"mp3\"\ntest_settings:\n dataset: story.jsonl\n props:\n story: \"Once upon a time, there was a cat who loved to play with a ball.\"\n---\n\n<System>\nYou are a storyteller for children. Make sure your story is engaging and interesting.\n</System>\n\n<SpeechPrompt>\n- {props.story}\n</SpeechPrompt>`;\n};","export const getAnimalDataset = (): string => {\n return `{\"input\": {\"animal\": \"cat\"}, \"expected_output\": \"A realistic picture of a cat\"}\n{\"input\": {\"animal\": \"dog\"}, \"expected_output\": \"A realistic picture of a dog\"}\n{\"input\": {\"animal\": \"bird\"}, \"expected_output\": \"A realistic picture of a bird\"}`;\n};\n\nexport const getCustomerQueryDataset = (): string => {\n return `{\"input\": {\"customer_question\": \"My package hasn't arrived yet. Can you help me track it?\"}}\n{\"input\": {\"customer_question\": \"I received the wrong item in my order. What should I do?\"}}\n{\"input\": {\"customer_question\": \"How do I return a product that I purchased last week?\"}}`;\n};\n\nexport const getPartyDataset = (): string => {\n return `{\"input\": {\"party_text\": \"We're having a party with Alice, Bob, and Carol.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Alice\\\\\", \\\\\"Bob\\\\\", \\\\\"Carol\\\\\"]}\"}\n{\"input\": {\"party_text\": \"The guest list includes Dave, Emma, and Frank.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Dave\\\\\", \\\\\"Emma\\\\\", \\\\\"Frank\\\\\"]}\"}\n{\"input\": {\"party_text\": \"Join us for a celebration with Grace, Henry, and Isla.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Grace\\\\\", \\\\\"Henry\\\\\", \\\\\"Isla\\\\\"]}\"}`;\n};\n\nexport const getStoryDataset = (): string => {\n return `{\"input\": {\"story\": \"Once upon a time, the Moon woke up and found her glow missing! She floated around the sky asking stars, clouds, and even comets if they'd seen her light. It wasn't until she peeked into a mountain lake that she saw her glow shining back—hidden in her own reflection! Laughing, she realized she had never lost it—it was with her all along, just hiding beneath a cloudy sky.\"}}\n{\"input\": {\"story\": \"Benny was no ordinary banana—he dreamed of becoming a superhero. One day, when a monkey slipped in the jungle and cried for help, Benny rolled into action, dodging vines and swinging from branches using his peel like a lasso. The monkey was saved, and from that day on, Benny was known as \\\\\"The Peel of Justice,\\\\\" the bravest fruit in the whole rainforest.\"}}\n{\"input\": {\"story\": \"In the town of Maplebrook, there was a library that whispered stories when no one was looking. Curious little Nia tiptoed in one rainy day and heard the books giggling softly. She opened one called The Secret Tunnel, and to her surprise, it sucked her in! She found herself riding a dragon through glittering caves. When she returned, the book winked shut—waiting for its next reader to listen.\"}}`;\n};","import fs from 'fs-extra';\nimport { getAnimalDrawingPrompt } from './animal-drawing-prompt.js';\nimport { getCustomerSupportPrompt } from './customer-support-prompt.js';\nimport { getPartyPlannerPrompt } from './party-planner-prompt.js';\nimport { getStoryTellerPrompt } from './story-teller-prompt.js';\nimport { getAnimalDataset, getCustomerQueryDataset, getPartyDataset, getStoryDataset } from './datasets.js';\n\nexport const createExamplePrompts = (model: string, targetPath: string = \".\", adapter: string = \"ai-sdk\") => {\n // Ensure the templates directory exists\n fs.ensureDirSync(`${targetPath}/agentmark`);\n\n const noImageSupport = [\"mastra\", \"claude-agent-sdk\"];\n const noSpeechSupport = [\"mastra\", \"claude-agent-sdk\"];\n const skipImagePrompts = noImageSupport.includes(adapter);\n const skipSpeechPrompts = noSpeechSupport.includes(adapter);\n\n // Create animal drawing prompt and dataset (uses image_config - skip for unsupported adapters)\n if (!skipImagePrompts) {\n const animalDrawingPrompt = getAnimalDrawingPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/animal-drawing.prompt.mdx`, animalDrawingPrompt);\n const animalDataset = getAnimalDataset();\n fs.writeFileSync(`${targetPath}/agentmark/animal.jsonl`, animalDataset);\n }\n\n // Create customer support prompt and dataset\n const customerSupportPrompt = getCustomerSupportPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/customer-support-agent.prompt.mdx`, customerSupportPrompt);\n const customerQueryDataset = getCustomerQueryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/customer-query.jsonl`, customerQueryDataset);\n\n // Create party planner prompt and dataset\n const partyPlannerPrompt = getPartyPlannerPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/party-planner.prompt.mdx`, partyPlannerPrompt);\n const partyDataset = getPartyDataset();\n fs.writeFileSync(`${targetPath}/agentmark/party.jsonl`, partyDataset);\n\n // Create story teller prompt and dataset (uses speech_config - skip for unsupported adapters)\n if (!skipSpeechPrompts) {\n const storyTellerPrompt = getStoryTellerPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/story-teller.prompt.mdx`, storyTellerPrompt);\n const storyDataset = getStoryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/story.jsonl`, storyDataset);\n }\n};","import { getAdapterConfig } from \"./adapters.js\";\n\nexport const getClientConfigContent = (options: { provider: string; adapter: string; deploymentMode?: \"cloud\" | \"static\" }) => {\n const { provider, adapter, deploymentMode = \"cloud\" } = options;\n const adapterConfig = getAdapterConfig(adapter, provider);\n const { modelRegistry, toolRegistry } = adapterConfig.classes;\n\n // Claude Agent SDK doesn't use @ai-sdk provider imports\n const isClaudeAgentSdk = adapter === \"claude-agent-sdk\";\n const providerImport = isClaudeAgentSdk ? '' : `import { ${provider} } from '@ai-sdk/${provider}';`;\n\n // Import loaders from dedicated packages\n const loaderImport = deploymentMode === \"cloud\"\n ? `import { ApiLoader } from \"@agentmark-ai/loader-api\";`\n : `import { ApiLoader } from \"@agentmark-ai/loader-api\";\nimport { FileLoader } from \"@agentmark-ai/loader-file\";`;\n\n const loaderSetup = deploymentMode === \"cloud\"\n ? ` // ApiLoader works for both development and production\n // - Development: 'agentmark dev' sets AGENTMARK_BASE_URL to localhost\n // - Production: Set AGENTMARK_API_KEY and AGENTMARK_APP_ID for cloud\n const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : ApiLoader.cloud({\n apiKey: process.env.AGENTMARK_API_KEY!,\n appId: process.env.AGENTMARK_APP_ID!,\n });`\n : ` const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : new FileLoader('./dist/agentmark');`;\n\n // Claude Agent SDK model registry setup is different\n const modelRegistrySetup = isClaudeAgentSdk\n ? `function createModelRegistry() {\n // Claude Agent SDK accepts model names directly.\n // Use createDefault() for simple pass-through of model names.\n const modelRegistry = ${modelRegistry}.createDefault();\n\n // To configure specific models (e.g., extended thinking), use:\n // const modelRegistry = new ${modelRegistry}()\n // .registerModels(/claude-.*-thinking/, (name) => ({\n // model: name,\n // maxThinkingTokens: 10000, // Enable extended thinking\n // }))\n // .registerModels(\"claude-sonnet-4-20250514\", (name) => ({ model: name }));\n\n return modelRegistry;\n}`\n : `function createModelRegistry() {\n const modelRegistry = new ${modelRegistry}()\n .registerProviders({ ${provider} });\n return modelRegistry;\n}`;\n\n // Claude Agent SDK adapter options\n const adapterOptionsImport = isClaudeAgentSdk\n ? `\n// Claude Agent SDK adapter options\n// See: https://github.com/anthropics/claude-agent-sdk\nconst adapterOptions = {\n // Permission mode controls tool access:\n // - 'default': Requires user approval for each tool use\n // - 'acceptEdits': Auto-approve file edits only\n // - 'bypassPermissions': Auto-approve all tools (use for automated pipelines)\n // - 'plan': Planning mode only, no tool execution\n permissionMode: 'bypassPermissions' as const,\n\n // Maximum conversation turns before stopping\n maxTurns: 20,\n\n // Optional: Set working directory for file operations\n // cwd: process.cwd(),\n\n // Optional: Budget limit in USD\n // maxBudgetUsd: 10.00,\n\n // Optional: Restrict which tools the agent can use\n // allowedTools: ['Read', 'Write', 'Glob'],\n // disallowedTools: ['Bash'],\n};`\n : '';\n\n const createClientCall = isClaudeAgentSdk\n ? `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry, adapterOptions });`\n : `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry });`;\n\n return `// agentmark.client.ts\nimport path from 'node:path';\nimport dotenv from 'dotenv';\ndotenv.config({ path: path.resolve(__dirname, '.env') });\nimport { createAgentMarkClient, ${modelRegistry}, ${toolRegistry}, EvalRegistry } from \"${adapterConfig.package}\";\n${loaderImport}\nimport AgentMarkTypes, { Tools } from './agentmark.types';\n${providerImport}\n${adapterOptionsImport}\n\n${modelRegistrySetup}\n\nfunction createToolRegistry() {\n const toolRegistry = new ${toolRegistry}<Tools>()\n .register('search_knowledgebase', async ({ query }) => {\n // Simulate search delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Return all three knowledge base articles\n // The LLM will select the relevant one based on the query\n return {\n articles: [\n { topic: 'shipping', content: 'Standard shipping takes 3–5 business days.' },\n { topic: 'warranty', content: 'All products include a 1-year limited warranty.' },\n { topic: 'returns', content: 'You can return items within 30 days of delivery.' }\n ]\n };\n });\n return toolRegistry;\n}\n\nfunction createEvalRegistry() {\n const evalRegistry = new EvalRegistry()\n .register('exact_match_json', ({ output, expectedOutput }) => {\n if (!expectedOutput) {\n return { score: 0, label: 'error', reason: 'No expected output provided', passed: false };\n }\n try {\n const ok = JSON.stringify(output) === JSON.stringify(JSON.parse(expectedOutput));\n return {\n score: ok ? 1 : 0,\n label: ok ? 'correct' : 'incorrect',\n reason: ok ? 'Exact match' : 'Mismatch',\n passed: ok\n };\n } catch (e) {\n return { score: 0, label: 'error', reason: 'Failed to parse expected output as JSON', passed: false };\n }\n });\n return evalRegistry;\n}\n\nfunction createClient() {\n${loaderSetup}\n const modelRegistry = createModelRegistry();\n const toolRegistry = createToolRegistry();\n const evalRegistry = createEvalRegistry();\n ${createClientCall}\n}\n\nexport const client = createClient();\n`;\n};\n"],"mappings":"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","names":["fs","fs","fs","fs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-agentmark",
3
- "version": "0.8.3",
3
+ "version": "0.8.4",
4
4
  "type": "module",
5
5
  "description": "Create AgentMark projects with npm create agentmark",
6
6
  "main": "dist/index.js",