march-start-cli 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,7 +6,7 @@ CLI to scaffold new March AI agent projects.
6
6
 
7
7
  ```bash
8
8
  # Interactive mode
9
- npx march-start
9
+ npx march-start-cli
10
10
 
11
11
  # Create a named project
12
12
  npx march-start my-agent
package/dist/index.js CHANGED
@@ -91,13 +91,19 @@ function showSuccess(config) {
91
91
  console.log();
92
92
  console.log(pc.green(" \u2713 ") + pc.bold("Project created successfully!"));
93
93
  console.log();
94
+ console.log(pc.dim(" Configuration applied:"));
95
+ console.log(pc.dim(` Agent name: ${config.agentName}`));
96
+ console.log(pc.dim(` Gateway URL: ${config.gatewayUrl}`));
97
+ console.log();
94
98
  console.log(pc.dim(" Next steps:"));
95
99
  console.log();
96
100
  console.log(pc.cyan(` cd ${config.name}`));
97
101
  if (!config.installDeps) {
98
102
  console.log(pc.cyan(" pnpm install"));
99
103
  }
100
- console.log(pc.cyan(" # Edit .env with your configuration"));
104
+ console.log(pc.yellow(" # Add your API keys to .env:"));
105
+ console.log(pc.yellow(" # OPENAI_API_KEY=sk-..."));
106
+ console.log(pc.yellow(" # GATEWAY_API_KEY=your-key"));
101
107
  console.log(pc.cyan(" pnpm dev"));
102
108
  console.log();
103
109
  console.log(pc.dim(" Documentation: https://www.npmjs.com/package/march-ai-sdk"));
@@ -110,7 +116,7 @@ function showError(message) {
110
116
  }
111
117
 
112
118
  // src/scaffold.ts
113
- import { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from "fs";
119
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, copyFileSync } from "fs";
114
120
  import { join, dirname } from "path";
115
121
  import { fileURLToPath } from "url";
116
122
  import { execSync } from "child_process";
@@ -159,6 +165,8 @@ function copyDir(src, dest, replacements) {
159
165
  content = transformPackageJson(content, replacements);
160
166
  } else if (entry.name === "agent.ts") {
161
167
  content = transformAgentTs(content, replacements);
168
+ } else if (entry.name === "env.example") {
169
+ content = transformEnvExample(content, replacements);
162
170
  } else {
163
171
  for (const [key, value] of Object.entries(replacements)) {
164
172
  content = content.replace(new RegExp(`{{${key}}}`, "g"), value);
@@ -178,6 +186,11 @@ function transformAgentTs(content, replacements) {
178
186
  }
179
187
  return content;
180
188
  }
189
+ function transformEnvExample(content, replacements) {
190
+ content = content.replace(/^AGENT_NAME=.*/m, `AGENT_NAME=${replacements.AGENT_NAME}`);
191
+ content = content.replace(/^GATEWAY_URL=.*/m, `GATEWAY_URL=${replacements.GATEWAY_URL}`);
192
+ return content;
193
+ }
181
194
  function transformPackageJson(content, replacements) {
182
195
  const pkg = JSON.parse(content);
183
196
  pkg.name = replacements.PROJECT_NAME;
@@ -222,6 +235,12 @@ async function scaffoldProject(config) {
222
235
  };
223
236
  const templateDir = getTemplateDir();
224
237
  copyDir(templateDir, targetDir, replacements);
238
+ const envExamplePath = join(targetDir, ".env.example");
239
+ const envPath = join(targetDir, ".env");
240
+ if (existsSync(envExamplePath)) {
241
+ copyFileSync(envExamplePath, envPath);
242
+ console.log(pc2.dim(" \u2713 Created .env from .env.example"));
243
+ }
225
244
  const gitignorePath = join(targetDir, ".gitignore");
226
245
  if (!existsSync(gitignorePath)) {
227
246
  writeFileSync(gitignorePath, `node_modules/
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/prompts.ts","../src/scaffold.ts","../src/index.ts"],"sourcesContent":["/**\n * Interactive prompts for march-start CLI\n */\n\nimport prompts from 'prompts'\nimport pc from 'picocolors'\n\nexport interface ProjectConfig {\n name: string\n agentName: string\n gatewayUrl: string\n initGit: boolean\n installDeps: boolean\n}\n\nconst DEFAULT_CONFIG: ProjectConfig = {\n name: 'my-agent',\n agentName: 'my-agent',\n gatewayUrl: 'agent-gateway:8080',\n initGit: true,\n installDeps: true,\n}\n\n/**\n * Display the welcome banner\n */\nexport function showBanner(): void {\n console.log()\n console.log(pc.cyan(' ╭──────────────────────────────────────╮'))\n console.log(pc.cyan(' │ │'))\n console.log(pc.cyan(' │') + pc.bold(' March AI Agent Generator ') + pc.cyan(' │'))\n console.log(pc.cyan(' │ │'))\n console.log(pc.cyan(' ╰──────────────────────────────────────╯'))\n console.log()\n}\n\n/**\n * Get project configuration from command line args or interactive prompts\n */\nexport async function getProjectConfig(args: string[]): Promise<ProjectConfig | null> {\n // Check for --yes flag\n const useDefaults = args.includes('--yes') || args.includes('-y')\n \n // Get project name from args (first non-flag argument)\n const projectNameArg = args.find(arg => !arg.startsWith('-'))\n \n if (useDefaults) {\n const name = projectNameArg || DEFAULT_CONFIG.name\n return {\n ...DEFAULT_CONFIG,\n name,\n agentName: name,\n }\n }\n \n // Interactive prompts\n const questions: prompts.PromptObject[] = [\n {\n type: projectNameArg ? null : 'text',\n name: 'name',\n message: 'Project name:',\n initial: DEFAULT_CONFIG.name,\n validate: (value: string) => {\n if (!value) return 'Project name is required'\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Project name can only contain lowercase letters, numbers, and hyphens'\n }\n return true\n },\n },\n {\n type: 'text',\n name: 'agentName',\n message: 'Agent name (for registration):',\n initial: (prev: string) => prev || projectNameArg || DEFAULT_CONFIG.agentName,\n },\n {\n type: 'text',\n name: 'gatewayUrl',\n message: 'Gateway URL:',\n initial: DEFAULT_CONFIG.gatewayUrl,\n },\n {\n type: 'confirm',\n name: 'initGit',\n message: 'Initialize git repository?',\n initial: DEFAULT_CONFIG.initGit,\n },\n {\n type: 'confirm',\n name: 'installDeps',\n message: 'Install dependencies?',\n initial: DEFAULT_CONFIG.installDeps,\n },\n ]\n \n // Handle Ctrl+C gracefully\n let cancelled = false\n const response = await prompts(questions, {\n onCancel: () => {\n cancelled = true\n },\n })\n \n if (cancelled) {\n console.log(pc.yellow('\\n Cancelled.\\n'))\n return null\n }\n \n return {\n name: projectNameArg || response.name,\n agentName: response.agentName,\n gatewayUrl: response.gatewayUrl,\n initGit: response.initGit,\n installDeps: response.installDeps,\n }\n}\n\n/**\n * Display success message with next steps\n */\nexport function showSuccess(config: ProjectConfig): void {\n console.log()\n console.log(pc.green(' ✓ ') + pc.bold('Project created successfully!'))\n console.log()\n console.log(pc.dim(' Next steps:'))\n console.log()\n console.log(pc.cyan(` cd ${config.name}`))\n if (!config.installDeps) {\n console.log(pc.cyan(' pnpm install'))\n }\n console.log(pc.cyan(' # Edit .env with your configuration'))\n console.log(pc.cyan(' pnpm dev'))\n console.log()\n console.log(pc.dim(' Documentation: https://www.npmjs.com/package/march-ai-sdk'))\n console.log()\n}\n\n/**\n * Display error message\n */\nexport function showError(message: string): void {\n console.log()\n console.log(pc.red(' ✗ ') + pc.bold('Error: ') + message)\n console.log()\n}\n","/**\n * Project scaffolding for march-start CLI\n * \n * Copies from agent-ts-template and applies replacements\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { fileURLToPath } from 'url'\nimport { execSync } from 'child_process'\nimport pc from 'picocolors'\nimport type { ProjectConfig } from './prompts.js'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\n// Files/directories to skip when copying\nconst SKIP_ENTRIES = [\n 'node_modules',\n 'dist',\n '.env',\n 'package-lock.json',\n '.git',\n]\n\n/**\n * Get the agent-ts-template directory path\n */\nfunction getTemplateDir(): string {\n // When running from dist, go up to find agent-ts-template\n // march-start/dist/scaffold.js -> march-start -> multi-agent-api -> agent-ts-template\n const paths = [\n join(__dirname, '..', '..', 'agent-ts-template'), // From dist/\n join(__dirname, '..', '..', '..', 'agent-ts-template'), // From src/\n join(__dirname, 'template'), // Fallback to embedded\n ]\n \n for (const p of paths) {\n if (existsSync(p)) {\n return p\n }\n }\n \n throw new Error('Could not find agent-ts-template directory')\n}\n\n/**\n * Copy directory recursively with replacements\n */\nfunction copyDir(src: string, dest: string, replacements: Record<string, string>): void {\n mkdirSync(dest, { recursive: true })\n const entries = readdirSync(src, { withFileTypes: true })\n \n for (const entry of entries) {\n // Skip certain files/directories\n if (SKIP_ENTRIES.includes(entry.name)) {\n continue\n }\n \n const srcPath = join(src, entry.name)\n let destName = entry.name\n \n // Rename env.example to .env.example\n if (destName === 'env.example') destName = '.env.example'\n \n const destPath = join(dest, destName)\n \n if (entry.isDirectory()) {\n copyDir(srcPath, destPath, replacements)\n } else {\n let content = readFileSync(srcPath, 'utf-8')\n \n // Special handling for package.json - update dependencies\n if (entry.name === 'package.json') {\n content = transformPackageJson(content, replacements)\n } else if (entry.name === 'agent.ts') {\n // Transform agent.ts - replace relative import with npm package\n content = transformAgentTs(content, replacements)\n } else {\n // Apply text replacements for other files\n for (const [key, value] of Object.entries(replacements)) {\n content = content.replace(new RegExp(`{{${key}}}`, 'g'), value)\n }\n }\n \n writeFileSync(destPath, content)\n }\n }\n}\n\n/**\n * Transform agent.ts - replace local framework import with npm package\n */\nfunction transformAgentTs(content: string, replacements: Record<string, string>): string {\n // Replace relative import with npm package\n content = content.replace(\n /import\\s*{\\s*MarchAgentApp,\\s*Message\\s*}\\s*from\\s*['\"][^'\"]*ai-ts-framework[^'\"]*['\"]/,\n \"import { MarchAgentApp, Message } from 'march-ai-sdk'\"\n )\n \n // Apply standard replacements\n for (const [key, value] of Object.entries(replacements)) {\n content = content.replace(new RegExp(`{{${key}}}`, 'g'), value)\n }\n \n return content\n}\n\n/**\n * Transform package.json for the new project\n */\nfunction transformPackageJson(content: string, replacements: Record<string, string>): string {\n const pkg = JSON.parse(content)\n \n // Update package name\n pkg.name = replacements.PROJECT_NAME\n pkg.description = `March AI Agent - ${replacements.AGENT_NAME}`\n \n // Remove workspace-specific fields\n delete pkg.private\n \n // Update dependencies - replace relative path with npm package\n if (pkg.dependencies) {\n // Remove any relative path references to the framework\n for (const [key, value] of Object.entries(pkg.dependencies)) {\n if (typeof value === 'string' && value.includes('ai-ts-framework')) {\n delete pkg.dependencies[key]\n }\n }\n // Add march-ai-sdk\n pkg.dependencies['march-ai-sdk'] = replacements.SDK_VERSION\n }\n \n return JSON.stringify(pkg, null, 4)\n}\n\n/**\n * Detect package manager\n */\nfunction detectPackageManager(): 'pnpm' | 'npm' | 'yarn' {\n try {\n execSync('pnpm --version', { stdio: 'ignore' })\n return 'pnpm'\n } catch {\n try {\n execSync('yarn --version', { stdio: 'ignore' })\n return 'yarn'\n } catch {\n return 'npm'\n }\n }\n}\n\n/**\n * Scaffold a new project\n */\nexport async function scaffoldProject(config: ProjectConfig): Promise<void> {\n const targetDir = join(process.cwd(), config.name)\n \n // Check if directory exists\n if (existsSync(targetDir)) {\n throw new Error(`Directory \"${config.name}\" already exists`)\n }\n \n console.log()\n console.log(pc.dim(' Creating project structure...'))\n \n // Create directory\n mkdirSync(targetDir, { recursive: true })\n \n // Template replacements\n const replacements: Record<string, string> = {\n PROJECT_NAME: config.name,\n AGENT_NAME: config.agentName,\n GATEWAY_URL: config.gatewayUrl,\n SDK_VERSION: '^0.3.0',\n }\n \n // Copy from agent-ts-template\n const templateDir = getTemplateDir()\n copyDir(templateDir, targetDir, replacements)\n \n // Create .gitignore if it doesn't exist\n const gitignorePath = join(targetDir, '.gitignore')\n if (!existsSync(gitignorePath)) {\n writeFileSync(gitignorePath, `node_modules/\ndist/\n.env\n.env.local\n*.log\n`)\n }\n \n console.log(pc.dim(' ✓ Project structure created'))\n \n // Initialize git\n if (config.initGit) {\n console.log(pc.dim(' Initializing git repository...'))\n try {\n execSync('git init', { cwd: targetDir, stdio: 'ignore' })\n console.log(pc.dim(' ✓ Git repository initialized'))\n } catch {\n console.log(pc.yellow(' ⚠ Could not initialize git repository'))\n }\n }\n \n // Install dependencies\n if (config.installDeps) {\n const pm = detectPackageManager()\n console.log(pc.dim(` Installing dependencies with ${pm}...`))\n try {\n execSync(`${pm} install`, { cwd: targetDir, stdio: 'inherit' })\n console.log(pc.dim(' ✓ Dependencies installed'))\n } catch {\n console.log(pc.yellow(' ⚠ Could not install dependencies'))\n }\n }\n}\n","/**\n * march-start CLI\n * \n * Scaffold new March AI agent projects\n * \n * Usage:\n * npx march-start [project-name] [options]\n * \n * Options:\n * -y, --yes Use default options without prompts\n */\n\nimport { showBanner, getProjectConfig, showSuccess, showError } from './prompts.js'\nimport { scaffoldProject } from './scaffold.js'\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2)\n \n // Show help\n if (args.includes('--help') || args.includes('-h')) {\n console.log(`\n ${'\\x1b[36m'}march-start${'\\x1b[0m'} - Scaffold new March AI agent projects\n\n ${'\\x1b[1m'}Usage:${'\\x1b[0m'}\n npx march-start [project-name] [options]\n\n ${'\\x1b[1m'}Options:${'\\x1b[0m'}\n -y, --yes Use default options without prompts\n -h, --help Show this help message\n\n ${'\\x1b[1m'}Examples:${'\\x1b[0m'}\n npx march-start Interactive mode\n npx march-start my-agent Create \"my-agent\" project\n npx march-start my-agent --yes Create with defaults\n`)\n return\n }\n \n // Show version\n if (args.includes('--version') || args.includes('-v')) {\n console.log('0.1.0')\n return\n }\n \n showBanner()\n \n try {\n const config = await getProjectConfig(args)\n \n if (!config) {\n // User cancelled\n return\n }\n \n await scaffoldProject(config)\n showSuccess(config)\n \n } catch (error) {\n showError(error instanceof Error ? error.message : String(error))\n process.exit(1)\n }\n}\n\nmain()\n"],"mappings":"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","names":["pc"]}
1
+ {"version":3,"sources":["../src/prompts.ts","../src/scaffold.ts","../src/index.ts"],"sourcesContent":["/**\n * Interactive prompts for march-start CLI\n */\n\nimport prompts from 'prompts'\nimport pc from 'picocolors'\n\nexport interface ProjectConfig {\n name: string\n agentName: string\n gatewayUrl: string\n initGit: boolean\n installDeps: boolean\n}\n\nconst DEFAULT_CONFIG: ProjectConfig = {\n name: 'my-agent',\n agentName: 'my-agent',\n gatewayUrl: 'agent-gateway:8080',\n initGit: true,\n installDeps: true,\n}\n\n/**\n * Display the welcome banner\n */\nexport function showBanner(): void {\n console.log()\n console.log(pc.cyan(' ╭──────────────────────────────────────╮'))\n console.log(pc.cyan(' │ │'))\n console.log(pc.cyan(' │') + pc.bold(' March AI Agent Generator ') + pc.cyan(' │'))\n console.log(pc.cyan(' │ │'))\n console.log(pc.cyan(' ╰──────────────────────────────────────╯'))\n console.log()\n}\n\n/**\n * Get project configuration from command line args or interactive prompts\n */\nexport async function getProjectConfig(args: string[]): Promise<ProjectConfig | null> {\n // Check for --yes flag\n const useDefaults = args.includes('--yes') || args.includes('-y')\n \n // Get project name from args (first non-flag argument)\n const projectNameArg = args.find(arg => !arg.startsWith('-'))\n \n if (useDefaults) {\n const name = projectNameArg || DEFAULT_CONFIG.name\n return {\n ...DEFAULT_CONFIG,\n name,\n agentName: name,\n }\n }\n \n // Interactive prompts\n const questions: prompts.PromptObject[] = [\n {\n type: projectNameArg ? null : 'text',\n name: 'name',\n message: 'Project name:',\n initial: DEFAULT_CONFIG.name,\n validate: (value: string) => {\n if (!value) return 'Project name is required'\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Project name can only contain lowercase letters, numbers, and hyphens'\n }\n return true\n },\n },\n {\n type: 'text',\n name: 'agentName',\n message: 'Agent name (for registration):',\n initial: (prev: string) => prev || projectNameArg || DEFAULT_CONFIG.agentName,\n },\n {\n type: 'text',\n name: 'gatewayUrl',\n message: 'Gateway URL:',\n initial: DEFAULT_CONFIG.gatewayUrl,\n },\n {\n type: 'confirm',\n name: 'initGit',\n message: 'Initialize git repository?',\n initial: DEFAULT_CONFIG.initGit,\n },\n {\n type: 'confirm',\n name: 'installDeps',\n message: 'Install dependencies?',\n initial: DEFAULT_CONFIG.installDeps,\n },\n ]\n \n // Handle Ctrl+C gracefully\n let cancelled = false\n const response = await prompts(questions, {\n onCancel: () => {\n cancelled = true\n },\n })\n \n if (cancelled) {\n console.log(pc.yellow('\\n Cancelled.\\n'))\n return null\n }\n \n return {\n name: projectNameArg || response.name,\n agentName: response.agentName,\n gatewayUrl: response.gatewayUrl,\n initGit: response.initGit,\n installDeps: response.installDeps,\n }\n}\n\n/**\n * Display success message with next steps\n */\nexport function showSuccess(config: ProjectConfig): void {\n console.log()\n console.log(pc.green(' ✓ ') + pc.bold('Project created successfully!'))\n console.log()\n console.log(pc.dim(' Configuration applied:'))\n console.log(pc.dim(` Agent name: ${config.agentName}`))\n console.log(pc.dim(` Gateway URL: ${config.gatewayUrl}`))\n console.log()\n console.log(pc.dim(' Next steps:'))\n console.log()\n console.log(pc.cyan(` cd ${config.name}`))\n if (!config.installDeps) {\n console.log(pc.cyan(' pnpm install'))\n }\n console.log(pc.yellow(' # Add your API keys to .env:'))\n console.log(pc.yellow(' # OPENAI_API_KEY=sk-...'))\n console.log(pc.yellow(' # GATEWAY_API_KEY=your-key'))\n console.log(pc.cyan(' pnpm dev'))\n console.log()\n console.log(pc.dim(' Documentation: https://www.npmjs.com/package/march-ai-sdk'))\n console.log()\n}\n\n/**\n * Display error message\n */\nexport function showError(message: string): void {\n console.log()\n console.log(pc.red(' ✗ ') + pc.bold('Error: ') + message)\n console.log()\n}\n","/**\n * Project scaffolding for march-start CLI\n * \n * Copies from agent-ts-template and applies replacements\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, copyFileSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { fileURLToPath } from 'url'\nimport { execSync } from 'child_process'\nimport pc from 'picocolors'\nimport type { ProjectConfig } from './prompts.js'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\n// Files/directories to skip when copying\nconst SKIP_ENTRIES = [\n 'node_modules',\n 'dist',\n '.env',\n 'package-lock.json',\n '.git',\n]\n\n/**\n * Get the agent-ts-template directory path\n */\nfunction getTemplateDir(): string {\n // When running from dist, go up to find agent-ts-template\n // march-start/dist/scaffold.js -> march-start -> multi-agent-api -> agent-ts-template\n const paths = [\n join(__dirname, '..', '..', 'agent-ts-template'), // From dist/\n join(__dirname, '..', '..', '..', 'agent-ts-template'), // From src/\n join(__dirname, 'template'), // Fallback to embedded\n ]\n \n for (const p of paths) {\n if (existsSync(p)) {\n return p\n }\n }\n \n throw new Error('Could not find agent-ts-template directory')\n}\n\n/**\n * Copy directory recursively with replacements\n */\nfunction copyDir(src: string, dest: string, replacements: Record<string, string>): void {\n mkdirSync(dest, { recursive: true })\n const entries = readdirSync(src, { withFileTypes: true })\n \n for (const entry of entries) {\n // Skip certain files/directories\n if (SKIP_ENTRIES.includes(entry.name)) {\n continue\n }\n \n const srcPath = join(src, entry.name)\n let destName = entry.name\n \n // Rename env.example to .env.example\n if (destName === 'env.example') destName = '.env.example'\n \n const destPath = join(dest, destName)\n \n if (entry.isDirectory()) {\n copyDir(srcPath, destPath, replacements)\n } else {\n let content = readFileSync(srcPath, 'utf-8')\n \n // Special handling for different file types\n if (entry.name === 'package.json') {\n content = transformPackageJson(content, replacements)\n } else if (entry.name === 'agent.ts') {\n content = transformAgentTs(content, replacements)\n } else if (entry.name === 'env.example') {\n content = transformEnvExample(content, replacements)\n } else {\n // Apply text replacements for other files\n for (const [key, value] of Object.entries(replacements)) {\n content = content.replace(new RegExp(`{{${key}}}`, 'g'), value)\n }\n }\n \n writeFileSync(destPath, content)\n }\n }\n}\n\n/**\n * Transform agent.ts - replace local framework import with npm package\n */\nfunction transformAgentTs(content: string, replacements: Record<string, string>): string {\n // Replace relative import with npm package\n content = content.replace(\n /import\\s*{\\s*MarchAgentApp,\\s*Message\\s*}\\s*from\\s*['\"][^'\"]*ai-ts-framework[^'\"]*['\"]/,\n \"import { MarchAgentApp, Message } from 'march-ai-sdk'\"\n )\n \n // Apply standard replacements\n for (const [key, value] of Object.entries(replacements)) {\n content = content.replace(new RegExp(`{{${key}}}`, 'g'), value)\n }\n \n return content\n}\n\n/**\n * Transform env.example - apply CLI inputs\n */\nfunction transformEnvExample(content: string, replacements: Record<string, string>): string {\n // Replace placeholder values with CLI inputs\n content = content.replace(/^AGENT_NAME=.*/m, `AGENT_NAME=${replacements.AGENT_NAME}`)\n content = content.replace(/^GATEWAY_URL=.*/m, `GATEWAY_URL=${replacements.GATEWAY_URL}`)\n \n return content\n}\n\n/**\n * Transform package.json for the new project\n */\nfunction transformPackageJson(content: string, replacements: Record<string, string>): string {\n const pkg = JSON.parse(content)\n \n // Update package name\n pkg.name = replacements.PROJECT_NAME\n pkg.description = `March AI Agent - ${replacements.AGENT_NAME}`\n \n // Remove workspace-specific fields\n delete pkg.private\n \n // Update dependencies - replace relative path with npm package\n if (pkg.dependencies) {\n // Remove any relative path references to the framework\n for (const [key, value] of Object.entries(pkg.dependencies)) {\n if (typeof value === 'string' && value.includes('ai-ts-framework')) {\n delete pkg.dependencies[key]\n }\n }\n // Add march-ai-sdk\n pkg.dependencies['march-ai-sdk'] = replacements.SDK_VERSION\n }\n \n return JSON.stringify(pkg, null, 4)\n}\n\n/**\n * Detect package manager\n */\nfunction detectPackageManager(): 'pnpm' | 'npm' | 'yarn' {\n try {\n execSync('pnpm --version', { stdio: 'ignore' })\n return 'pnpm'\n } catch {\n try {\n execSync('yarn --version', { stdio: 'ignore' })\n return 'yarn'\n } catch {\n return 'npm'\n }\n }\n}\n\n/**\n * Scaffold a new project\n */\nexport async function scaffoldProject(config: ProjectConfig): Promise<void> {\n const targetDir = join(process.cwd(), config.name)\n \n // Check if directory exists\n if (existsSync(targetDir)) {\n throw new Error(`Directory \"${config.name}\" already exists`)\n }\n \n console.log()\n console.log(pc.dim(' Creating project structure...'))\n \n // Create directory\n mkdirSync(targetDir, { recursive: true })\n \n // Template replacements\n const replacements: Record<string, string> = {\n PROJECT_NAME: config.name,\n AGENT_NAME: config.agentName,\n GATEWAY_URL: config.gatewayUrl,\n SDK_VERSION: '^0.3.0',\n }\n \n // Copy from agent-ts-template\n const templateDir = getTemplateDir()\n copyDir(templateDir, targetDir, replacements)\n \n // Copy .env.example to .env so user can start right away\n const envExamplePath = join(targetDir, '.env.example')\n const envPath = join(targetDir, '.env')\n if (existsSync(envExamplePath)) {\n copyFileSync(envExamplePath, envPath)\n console.log(pc.dim(' ✓ Created .env from .env.example'))\n }\n \n // Create .gitignore if it doesn't exist\n const gitignorePath = join(targetDir, '.gitignore')\n if (!existsSync(gitignorePath)) {\n writeFileSync(gitignorePath, `node_modules/\ndist/\n.env\n.env.local\n*.log\n`)\n }\n \n console.log(pc.dim(' ✓ Project structure created'))\n \n // Initialize git\n if (config.initGit) {\n console.log(pc.dim(' Initializing git repository...'))\n try {\n execSync('git init', { cwd: targetDir, stdio: 'ignore' })\n console.log(pc.dim(' ✓ Git repository initialized'))\n } catch {\n console.log(pc.yellow(' ⚠ Could not initialize git repository'))\n }\n }\n \n // Install dependencies\n if (config.installDeps) {\n const pm = detectPackageManager()\n console.log(pc.dim(` Installing dependencies with ${pm}...`))\n try {\n execSync(`${pm} install`, { cwd: targetDir, stdio: 'inherit' })\n console.log(pc.dim(' ✓ Dependencies installed'))\n } catch {\n console.log(pc.yellow(' ⚠ Could not install dependencies'))\n }\n }\n}\n","/**\n * march-start CLI\n * \n * Scaffold new March AI agent projects\n * \n * Usage:\n * npx march-start [project-name] [options]\n * \n * Options:\n * -y, --yes Use default options without prompts\n */\n\nimport { showBanner, getProjectConfig, showSuccess, showError } from './prompts.js'\nimport { scaffoldProject } from './scaffold.js'\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2)\n \n // Show help\n if (args.includes('--help') || args.includes('-h')) {\n console.log(`\n ${'\\x1b[36m'}march-start${'\\x1b[0m'} - Scaffold new March AI agent projects\n\n ${'\\x1b[1m'}Usage:${'\\x1b[0m'}\n npx march-start [project-name] [options]\n\n ${'\\x1b[1m'}Options:${'\\x1b[0m'}\n -y, --yes Use default options without prompts\n -h, --help Show this help message\n\n ${'\\x1b[1m'}Examples:${'\\x1b[0m'}\n npx march-start Interactive mode\n npx march-start my-agent Create \"my-agent\" project\n npx march-start my-agent --yes Create with defaults\n`)\n return\n }\n \n // Show version\n if (args.includes('--version') || args.includes('-v')) {\n console.log('0.1.0')\n return\n }\n \n showBanner()\n \n try {\n const config = await getProjectConfig(args)\n \n if (!config) {\n // User cancelled\n return\n }\n \n await scaffoldProject(config)\n showSuccess(config)\n \n } catch (error) {\n showError(error instanceof Error ? error.message : String(error))\n process.exit(1)\n }\n}\n\nmain()\n"],"mappings":";;;AAIA,OAAO,aAAa;AACpB,OAAO,QAAQ;AAUf,IAAM,iBAAgC;AAAA,EAClC,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AACjB;AAKO,SAAS,aAAmB;AAC/B,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,KAAK,oPAA4C,CAAC;AACjE,UAAQ,IAAI,GAAG,KAAK,sDAA4C,CAAC;AACjE,UAAQ,IAAI,GAAG,KAAK,UAAK,IAAI,GAAG,KAAK,iCAAiC,IAAI,GAAG,KAAK,eAAU,CAAC;AAC7F,UAAQ,IAAI,GAAG,KAAK,sDAA4C,CAAC;AACjE,UAAQ,IAAI,GAAG,KAAK,oPAA4C,CAAC;AACjE,UAAQ,IAAI;AAChB;AAKA,eAAsB,iBAAiB,MAA+C;AAElF,QAAM,cAAc,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,IAAI;AAGhE,QAAM,iBAAiB,KAAK,KAAK,SAAO,CAAC,IAAI,WAAW,GAAG,CAAC;AAE5D,MAAI,aAAa;AACb,UAAM,OAAO,kBAAkB,eAAe;AAC9C,WAAO;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,WAAW;AAAA,IACf;AAAA,EACJ;AAGA,QAAM,YAAoC;AAAA,IACtC;AAAA,MACI,MAAM,iBAAiB,OAAO;AAAA,MAC9B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,eAAe;AAAA,MACxB,UAAU,CAAC,UAAkB;AACzB,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI,CAAC,eAAe,KAAK,KAAK,GAAG;AAC7B,iBAAO;AAAA,QACX;AACA,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC,SAAiB,QAAQ,kBAAkB,eAAe;AAAA,IACxE;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,eAAe;AAAA,IAC5B;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,eAAe;AAAA,IAC5B;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,eAAe;AAAA,IAC5B;AAAA,EACJ;AAGA,MAAI,YAAY;AAChB,QAAM,WAAW,MAAM,QAAQ,WAAW;AAAA,IACtC,UAAU,MAAM;AACZ,kBAAY;AAAA,IAChB;AAAA,EACJ,CAAC;AAED,MAAI,WAAW;AACX,YAAQ,IAAI,GAAG,OAAO,kBAAkB,CAAC;AACzC,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACH,MAAM,kBAAkB,SAAS;AAAA,IACjC,WAAW,SAAS;AAAA,IACpB,YAAY,SAAS;AAAA,IACrB,SAAS,SAAS;AAAA,IAClB,aAAa,SAAS;AAAA,EAC1B;AACJ;AAKO,SAAS,YAAY,QAA6B;AACrD,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,MAAM,WAAM,IAAI,GAAG,KAAK,+BAA+B,CAAC;AACvE,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,IAAI,0BAA0B,CAAC;AAC9C,UAAQ,IAAI,GAAG,IAAI,mBAAmB,OAAO,SAAS,EAAE,CAAC;AACzD,UAAQ,IAAI,GAAG,IAAI,oBAAoB,OAAO,UAAU,EAAE,CAAC;AAC3D,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,IAAI,eAAe,CAAC;AACnC,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,KAAK,UAAU,OAAO,IAAI,EAAE,CAAC;AAC5C,MAAI,CAAC,OAAO,aAAa;AACrB,YAAQ,IAAI,GAAG,KAAK,kBAAkB,CAAC;AAAA,EAC3C;AACA,UAAQ,IAAI,GAAG,OAAO,kCAAkC,CAAC;AACzD,UAAQ,IAAI,GAAG,OAAO,+BAA+B,CAAC;AACtD,UAAQ,IAAI,GAAG,OAAO,kCAAkC,CAAC;AACzD,UAAQ,IAAI,GAAG,KAAK,cAAc,CAAC;AACnC,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,IAAI,6DAA6D,CAAC;AACjF,UAAQ,IAAI;AAChB;AAKO,SAAS,UAAU,SAAuB;AAC7C,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,IAAI,WAAM,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO;AACzD,UAAQ,IAAI;AAChB;;;ACjJA,SAAS,YAAY,WAAW,eAAe,cAAc,aAAa,oBAAoB;AAC9F,SAAS,MAAM,eAAe;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,OAAOA,SAAQ;AAGf,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AAGpC,IAAM,eAAe;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAKA,SAAS,iBAAyB;AAG9B,QAAM,QAAQ;AAAA,IACV,KAAK,WAAW,MAAM,MAAM,mBAAmB;AAAA;AAAA,IAC/C,KAAK,WAAW,MAAM,MAAM,MAAM,mBAAmB;AAAA;AAAA,IACrD,KAAK,WAAW,UAAU;AAAA;AAAA,EAC9B;AAEA,aAAW,KAAK,OAAO;AACnB,QAAI,WAAW,CAAC,GAAG;AACf,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,QAAM,IAAI,MAAM,4CAA4C;AAChE;AAKA,SAAS,QAAQ,KAAa,MAAc,cAA4C;AACpF,YAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AACnC,QAAM,UAAU,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAExD,aAAW,SAAS,SAAS;AAEzB,QAAI,aAAa,SAAS,MAAM,IAAI,GAAG;AACnC;AAAA,IACJ;AAEA,UAAM,UAAU,KAAK,KAAK,MAAM,IAAI;AACpC,QAAI,WAAW,MAAM;AAGrB,QAAI,aAAa,cAAe,YAAW;AAE3C,UAAM,WAAW,KAAK,MAAM,QAAQ;AAEpC,QAAI,MAAM,YAAY,GAAG;AACrB,cAAQ,SAAS,UAAU,YAAY;AAAA,IAC3C,OAAO;AACH,UAAI,UAAU,aAAa,SAAS,OAAO;AAG3C,UAAI,MAAM,SAAS,gBAAgB;AAC/B,kBAAU,qBAAqB,SAAS,YAAY;AAAA,MACxD,WAAW,MAAM,SAAS,YAAY;AAClC,kBAAU,iBAAiB,SAAS,YAAY;AAAA,MACpD,WAAW,MAAM,SAAS,eAAe;AACrC,kBAAU,oBAAoB,SAAS,YAAY;AAAA,MACvD,OAAO;AAEH,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACrD,oBAAU,QAAQ,QAAQ,IAAI,OAAO,KAAK,GAAG,MAAM,GAAG,GAAG,KAAK;AAAA,QAClE;AAAA,MACJ;AAEA,oBAAc,UAAU,OAAO;AAAA,IACnC;AAAA,EACJ;AACJ;AAKA,SAAS,iBAAiB,SAAiB,cAA8C;AAErF,YAAU,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,EACJ;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACrD,cAAU,QAAQ,QAAQ,IAAI,OAAO,KAAK,GAAG,MAAM,GAAG,GAAG,KAAK;AAAA,EAClE;AAEA,SAAO;AACX;AAKA,SAAS,oBAAoB,SAAiB,cAA8C;AAExF,YAAU,QAAQ,QAAQ,mBAAmB,cAAc,aAAa,UAAU,EAAE;AACpF,YAAU,QAAQ,QAAQ,oBAAoB,eAAe,aAAa,WAAW,EAAE;AAEvF,SAAO;AACX;AAKA,SAAS,qBAAqB,SAAiB,cAA8C;AACzF,QAAM,MAAM,KAAK,MAAM,OAAO;AAG9B,MAAI,OAAO,aAAa;AACxB,MAAI,cAAc,oBAAoB,aAAa,UAAU;AAG7D,SAAO,IAAI;AAGX,MAAI,IAAI,cAAc;AAElB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,YAAY,GAAG;AACzD,UAAI,OAAO,UAAU,YAAY,MAAM,SAAS,iBAAiB,GAAG;AAChE,eAAO,IAAI,aAAa,GAAG;AAAA,MAC/B;AAAA,IACJ;AAEA,QAAI,aAAa,cAAc,IAAI,aAAa;AAAA,EACpD;AAEA,SAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AACtC;AAKA,SAAS,uBAAgD;AACrD,MAAI;AACA,aAAS,kBAAkB,EAAE,OAAO,SAAS,CAAC;AAC9C,WAAO;AAAA,EACX,QAAQ;AACJ,QAAI;AACA,eAAS,kBAAkB,EAAE,OAAO,SAAS,CAAC;AAC9C,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;AAKA,eAAsB,gBAAgB,QAAsC;AACxE,QAAM,YAAY,KAAK,QAAQ,IAAI,GAAG,OAAO,IAAI;AAGjD,MAAI,WAAW,SAAS,GAAG;AACvB,UAAM,IAAI,MAAM,cAAc,OAAO,IAAI,kBAAkB;AAAA,EAC/D;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAIA,IAAG,IAAI,iCAAiC,CAAC;AAGrD,YAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAGxC,QAAM,eAAuC;AAAA,IACzC,cAAc,OAAO;AAAA,IACrB,YAAY,OAAO;AAAA,IACnB,aAAa,OAAO;AAAA,IACpB,aAAa;AAAA,EACjB;AAGA,QAAM,cAAc,eAAe;AACnC,UAAQ,aAAa,WAAW,YAAY;AAG5C,QAAM,iBAAiB,KAAK,WAAW,cAAc;AACrD,QAAM,UAAU,KAAK,WAAW,MAAM;AACtC,MAAI,WAAW,cAAc,GAAG;AAC5B,iBAAa,gBAAgB,OAAO;AACpC,YAAQ,IAAIA,IAAG,IAAI,yCAAoC,CAAC;AAAA,EAC5D;AAGA,QAAM,gBAAgB,KAAK,WAAW,YAAY;AAClD,MAAI,CAAC,WAAW,aAAa,GAAG;AAC5B,kBAAc,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,CAKpC;AAAA,EACG;AAEA,UAAQ,IAAIA,IAAG,IAAI,oCAA+B,CAAC;AAGnD,MAAI,OAAO,SAAS;AAChB,YAAQ,IAAIA,IAAG,IAAI,kCAAkC,CAAC;AACtD,QAAI;AACA,eAAS,YAAY,EAAE,KAAK,WAAW,OAAO,SAAS,CAAC;AACxD,cAAQ,IAAIA,IAAG,IAAI,qCAAgC,CAAC;AAAA,IACxD,QAAQ;AACJ,cAAQ,IAAIA,IAAG,OAAO,8CAAyC,CAAC;AAAA,IACpE;AAAA,EACJ;AAGA,MAAI,OAAO,aAAa;AACpB,UAAM,KAAK,qBAAqB;AAChC,YAAQ,IAAIA,IAAG,IAAI,kCAAkC,EAAE,KAAK,CAAC;AAC7D,QAAI;AACA,eAAS,GAAG,EAAE,YAAY,EAAE,KAAK,WAAW,OAAO,UAAU,CAAC;AAC9D,cAAQ,IAAIA,IAAG,IAAI,iCAA4B,CAAC;AAAA,IACpD,QAAQ;AACJ,cAAQ,IAAIA,IAAG,OAAO,yCAAoC,CAAC;AAAA,IAC/D;AAAA,EACJ;AACJ;;;AC9NA,eAAe,OAAsB;AACjC,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AAGjC,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAChD,YAAQ,IAAI;AAAA,IAChB,UAAU,cAAc,SAAS;AAAA;AAAA,IAEjC,SAAS,SAAS,SAAS;AAAA;AAAA;AAAA,IAG3B,SAAS,WAAW,SAAS;AAAA;AAAA;AAAA;AAAA,IAI7B,SAAS,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA,CAIjC;AACO;AAAA,EACJ;AAGA,MAAI,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,IAAI,GAAG;AACnD,YAAQ,IAAI,OAAO;AACnB;AAAA,EACJ;AAEA,aAAW;AAEX,MAAI;AACA,UAAM,SAAS,MAAM,iBAAiB,IAAI;AAE1C,QAAI,CAAC,QAAQ;AAET;AAAA,IACJ;AAEA,UAAM,gBAAgB,MAAM;AAC5B,gBAAY,MAAM;AAAA,EAEtB,SAAS,OAAO;AACZ,cAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChE,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEA,KAAK;","names":["pc"]}
@@ -1,36 +1,24 @@
1
+ # Agent Configuration
2
+ AGENT_NAME=my-agent
3
+ AGENT_ABOUT=A helpful AI assistant
1
4
 
2
- HOST=0.0.0.0
3
- PORT=8000
4
-
5
- GATEWAY_URL=your-gateway-url-here
6
- CONNECTION_SECURE=false
7
-
8
- GATEWAY_API_KEY=your-gateway-key-here
9
-
10
-
11
- HEARTBEAT_INTERVAL=10
5
+ # Gateway Configuration
6
+ GATEWAY_URL=agent-gateway:8080
7
+ GATEWAY_API_KEY=your-gateway-api-key-here
8
+ CONNECTION_SECURE=false
12
9
 
10
+ # Agent Server
11
+ HOST=0.0.0.0
12
+ PORT=8060
13
13
  AGENT_BASE_URL=http://localhost:8060
14
14
 
15
+ # Heartbeat (seconds)
16
+ HEARTBEAT_INTERVAL=10
15
17
 
16
- OPENAI_API_KEY=your-open-api-key-here
17
-
18
+ # OpenAI Configuration
19
+ OPENAI_API_KEY=your-openai-api-key-here
18
20
  OPENAI_MODEL=gpt-4o-mini
21
+ OPENAI_VISION_MODEL=gpt-4o
19
22
 
20
-
21
- JWT_SECRET=your-secret-key-change-in-production
22
-
23
- JWT_ALGORITHM=HS256
24
-
25
-
26
- JWT_COOKIE_NAME=agent_token
27
-
28
-
29
- CORS_ORIGINS=*
30
-
31
-
32
- NEXT_PUBLIC_API_URL=http://localhost:8060
33
-
34
-
35
-
36
- DEBUG=true
23
+ # Debug
24
+ DEBUG=true
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "march-start-cli",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "CLI to scaffold new March AI agent projects",
5
5
  "type": "module",
6
6
  "bin": {