march-start-cli 0.1.1 → 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/dist/index.js +21 -2
- package/dist/index.js.map +1 -1
- package/dist/template/env.example +17 -29
- package/package.json +1 -1
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.
|
|
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":"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","names":["pc"]}
|
|
@@ -1,36 +1,24 @@
|
|
|
1
|
+
# Agent Configuration
|
|
2
|
+
AGENT_NAME=my-agent
|
|
3
|
+
AGENT_ABOUT=A helpful AI assistant
|
|
1
4
|
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|