march-start-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # march-start
2
+
3
+ CLI to scaffold new March AI agent projects.
4
+
5
+ ## Usage
6
+
7
+ ```bash
8
+ # Interactive mode
9
+ npx march-start
10
+
11
+ # Create a named project
12
+ npx march-start my-agent
13
+
14
+ # Use defaults (no prompts)
15
+ npx march-start my-agent --yes
16
+ ```
17
+
18
+ ## What it creates
19
+
20
+ Running `march-start` creates a new directory with:
21
+
22
+ ```
23
+ my-agent/
24
+ ├── src/
25
+ │ └── agent.ts # Main agent code
26
+ ├── .env.example # Environment template
27
+ ├── .gitignore
28
+ ├── package.json
29
+ ├── tsconfig.json
30
+ └── README.md
31
+ ```
32
+
33
+ ## Options
34
+
35
+ | Flag | Description |
36
+ |------|-------------|
37
+ | `-y, --yes` | Skip prompts, use defaults |
38
+ | `-h, --help` | Show help |
39
+ | `-v, --version` | Show version |
40
+
41
+ ## Interactive Prompts
42
+
43
+ When run without `--yes`, you'll be asked:
44
+
45
+ 1. **Project name** - Directory name and package name
46
+ 2. **Agent name** - Name for agent registration
47
+ 3. **Gateway URL** - March Agent Gateway URL
48
+ 4. **Initialize git** - Create git repository
49
+ 5. **Install dependencies** - Run `pnpm install`
50
+
51
+ ## After Creation
52
+
53
+ ```bash
54
+ cd my-agent
55
+ cp .env.example .env
56
+ # Edit .env with your API keys
57
+ pnpm dev
58
+ ```
59
+
60
+ ## Requirements
61
+
62
+ - Node.js 18+
63
+ - pnpm (recommended) or npm
64
+
65
+ ## Related
66
+
67
+ - [march-ai-sdk](https://www.npmjs.com/package/march-ai-sdk) - The SDK this CLI scaffolds projects for
68
+
69
+ ## License
70
+
71
+ MIT
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,295 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/prompts.ts
4
+ import prompts from "prompts";
5
+ import pc from "picocolors";
6
+ var DEFAULT_CONFIG = {
7
+ name: "my-agent",
8
+ agentName: "my-agent",
9
+ gatewayUrl: "agent-gateway:8080",
10
+ initGit: true,
11
+ installDeps: true
12
+ };
13
+ function showBanner() {
14
+ console.log();
15
+ console.log(pc.cyan(" \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"));
16
+ console.log(pc.cyan(" \u2502 \u2502"));
17
+ console.log(pc.cyan(" \u2502") + pc.bold(" March AI Agent Generator ") + pc.cyan(" \u2502"));
18
+ console.log(pc.cyan(" \u2502 \u2502"));
19
+ console.log(pc.cyan(" \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"));
20
+ console.log();
21
+ }
22
+ async function getProjectConfig(args) {
23
+ const useDefaults = args.includes("--yes") || args.includes("-y");
24
+ const projectNameArg = args.find((arg) => !arg.startsWith("-"));
25
+ if (useDefaults) {
26
+ const name = projectNameArg || DEFAULT_CONFIG.name;
27
+ return {
28
+ ...DEFAULT_CONFIG,
29
+ name,
30
+ agentName: name
31
+ };
32
+ }
33
+ const questions = [
34
+ {
35
+ type: projectNameArg ? null : "text",
36
+ name: "name",
37
+ message: "Project name:",
38
+ initial: DEFAULT_CONFIG.name,
39
+ validate: (value) => {
40
+ if (!value) return "Project name is required";
41
+ if (!/^[a-z0-9-]+$/.test(value)) {
42
+ return "Project name can only contain lowercase letters, numbers, and hyphens";
43
+ }
44
+ return true;
45
+ }
46
+ },
47
+ {
48
+ type: "text",
49
+ name: "agentName",
50
+ message: "Agent name (for registration):",
51
+ initial: (prev) => prev || projectNameArg || DEFAULT_CONFIG.agentName
52
+ },
53
+ {
54
+ type: "text",
55
+ name: "gatewayUrl",
56
+ message: "Gateway URL:",
57
+ initial: DEFAULT_CONFIG.gatewayUrl
58
+ },
59
+ {
60
+ type: "confirm",
61
+ name: "initGit",
62
+ message: "Initialize git repository?",
63
+ initial: DEFAULT_CONFIG.initGit
64
+ },
65
+ {
66
+ type: "confirm",
67
+ name: "installDeps",
68
+ message: "Install dependencies?",
69
+ initial: DEFAULT_CONFIG.installDeps
70
+ }
71
+ ];
72
+ let cancelled = false;
73
+ const response = await prompts(questions, {
74
+ onCancel: () => {
75
+ cancelled = true;
76
+ }
77
+ });
78
+ if (cancelled) {
79
+ console.log(pc.yellow("\n Cancelled.\n"));
80
+ return null;
81
+ }
82
+ return {
83
+ name: projectNameArg || response.name,
84
+ agentName: response.agentName,
85
+ gatewayUrl: response.gatewayUrl,
86
+ initGit: response.initGit,
87
+ installDeps: response.installDeps
88
+ };
89
+ }
90
+ function showSuccess(config) {
91
+ console.log();
92
+ console.log(pc.green(" \u2713 ") + pc.bold("Project created successfully!"));
93
+ console.log();
94
+ console.log(pc.dim(" Next steps:"));
95
+ console.log();
96
+ console.log(pc.cyan(` cd ${config.name}`));
97
+ if (!config.installDeps) {
98
+ console.log(pc.cyan(" pnpm install"));
99
+ }
100
+ console.log(pc.cyan(" # Edit .env with your configuration"));
101
+ console.log(pc.cyan(" pnpm dev"));
102
+ console.log();
103
+ console.log(pc.dim(" Documentation: https://www.npmjs.com/package/march-ai-sdk"));
104
+ console.log();
105
+ }
106
+ function showError(message) {
107
+ console.log();
108
+ console.log(pc.red(" \u2717 ") + pc.bold("Error: ") + message);
109
+ console.log();
110
+ }
111
+
112
+ // src/scaffold.ts
113
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from "fs";
114
+ import { join, dirname } from "path";
115
+ import { fileURLToPath } from "url";
116
+ import { execSync } from "child_process";
117
+ import pc2 from "picocolors";
118
+ var __filename = fileURLToPath(import.meta.url);
119
+ var __dirname = dirname(__filename);
120
+ var SKIP_ENTRIES = [
121
+ "node_modules",
122
+ "dist",
123
+ ".env",
124
+ "package-lock.json",
125
+ ".git"
126
+ ];
127
+ function getTemplateDir() {
128
+ const paths = [
129
+ join(__dirname, "..", "..", "agent-ts-template"),
130
+ // From dist/
131
+ join(__dirname, "..", "..", "..", "agent-ts-template"),
132
+ // From src/
133
+ join(__dirname, "template")
134
+ // Fallback to embedded
135
+ ];
136
+ for (const p of paths) {
137
+ if (existsSync(p)) {
138
+ return p;
139
+ }
140
+ }
141
+ throw new Error("Could not find agent-ts-template directory");
142
+ }
143
+ function copyDir(src, dest, replacements) {
144
+ mkdirSync(dest, { recursive: true });
145
+ const entries = readdirSync(src, { withFileTypes: true });
146
+ for (const entry of entries) {
147
+ if (SKIP_ENTRIES.includes(entry.name)) {
148
+ continue;
149
+ }
150
+ const srcPath = join(src, entry.name);
151
+ let destName = entry.name;
152
+ if (destName === "env.example") destName = ".env.example";
153
+ const destPath = join(dest, destName);
154
+ if (entry.isDirectory()) {
155
+ copyDir(srcPath, destPath, replacements);
156
+ } else {
157
+ let content = readFileSync(srcPath, "utf-8");
158
+ if (entry.name === "package.json") {
159
+ content = transformPackageJson(content, replacements);
160
+ } else if (entry.name === "agent.ts") {
161
+ content = transformAgentTs(content, replacements);
162
+ } else {
163
+ for (const [key, value] of Object.entries(replacements)) {
164
+ content = content.replace(new RegExp(`{{${key}}}`, "g"), value);
165
+ }
166
+ }
167
+ writeFileSync(destPath, content);
168
+ }
169
+ }
170
+ }
171
+ function transformAgentTs(content, replacements) {
172
+ content = content.replace(
173
+ /import\s*{\s*MarchAgentApp,\s*Message\s*}\s*from\s*['"][^'"]*ai-ts-framework[^'"]*['"]/,
174
+ "import { MarchAgentApp, Message } from 'march-ai-sdk'"
175
+ );
176
+ for (const [key, value] of Object.entries(replacements)) {
177
+ content = content.replace(new RegExp(`{{${key}}}`, "g"), value);
178
+ }
179
+ return content;
180
+ }
181
+ function transformPackageJson(content, replacements) {
182
+ const pkg = JSON.parse(content);
183
+ pkg.name = replacements.PROJECT_NAME;
184
+ pkg.description = `March AI Agent - ${replacements.AGENT_NAME}`;
185
+ delete pkg.private;
186
+ if (pkg.dependencies) {
187
+ for (const [key, value] of Object.entries(pkg.dependencies)) {
188
+ if (typeof value === "string" && value.includes("ai-ts-framework")) {
189
+ delete pkg.dependencies[key];
190
+ }
191
+ }
192
+ pkg.dependencies["march-ai-sdk"] = replacements.SDK_VERSION;
193
+ }
194
+ return JSON.stringify(pkg, null, 4);
195
+ }
196
+ function detectPackageManager() {
197
+ try {
198
+ execSync("pnpm --version", { stdio: "ignore" });
199
+ return "pnpm";
200
+ } catch {
201
+ try {
202
+ execSync("yarn --version", { stdio: "ignore" });
203
+ return "yarn";
204
+ } catch {
205
+ return "npm";
206
+ }
207
+ }
208
+ }
209
+ async function scaffoldProject(config) {
210
+ const targetDir = join(process.cwd(), config.name);
211
+ if (existsSync(targetDir)) {
212
+ throw new Error(`Directory "${config.name}" already exists`);
213
+ }
214
+ console.log();
215
+ console.log(pc2.dim(" Creating project structure..."));
216
+ mkdirSync(targetDir, { recursive: true });
217
+ const replacements = {
218
+ PROJECT_NAME: config.name,
219
+ AGENT_NAME: config.agentName,
220
+ GATEWAY_URL: config.gatewayUrl,
221
+ SDK_VERSION: "^0.3.0"
222
+ };
223
+ const templateDir = getTemplateDir();
224
+ copyDir(templateDir, targetDir, replacements);
225
+ const gitignorePath = join(targetDir, ".gitignore");
226
+ if (!existsSync(gitignorePath)) {
227
+ writeFileSync(gitignorePath, `node_modules/
228
+ dist/
229
+ .env
230
+ .env.local
231
+ *.log
232
+ `);
233
+ }
234
+ console.log(pc2.dim(" \u2713 Project structure created"));
235
+ if (config.initGit) {
236
+ console.log(pc2.dim(" Initializing git repository..."));
237
+ try {
238
+ execSync("git init", { cwd: targetDir, stdio: "ignore" });
239
+ console.log(pc2.dim(" \u2713 Git repository initialized"));
240
+ } catch {
241
+ console.log(pc2.yellow(" \u26A0 Could not initialize git repository"));
242
+ }
243
+ }
244
+ if (config.installDeps) {
245
+ const pm = detectPackageManager();
246
+ console.log(pc2.dim(` Installing dependencies with ${pm}...`));
247
+ try {
248
+ execSync(`${pm} install`, { cwd: targetDir, stdio: "inherit" });
249
+ console.log(pc2.dim(" \u2713 Dependencies installed"));
250
+ } catch {
251
+ console.log(pc2.yellow(" \u26A0 Could not install dependencies"));
252
+ }
253
+ }
254
+ }
255
+
256
+ // src/index.ts
257
+ async function main() {
258
+ const args = process.argv.slice(2);
259
+ if (args.includes("--help") || args.includes("-h")) {
260
+ console.log(`
261
+ ${"\x1B[36m"}march-start${"\x1B[0m"} - Scaffold new March AI agent projects
262
+
263
+ ${"\x1B[1m"}Usage:${"\x1B[0m"}
264
+ npx march-start [project-name] [options]
265
+
266
+ ${"\x1B[1m"}Options:${"\x1B[0m"}
267
+ -y, --yes Use default options without prompts
268
+ -h, --help Show this help message
269
+
270
+ ${"\x1B[1m"}Examples:${"\x1B[0m"}
271
+ npx march-start Interactive mode
272
+ npx march-start my-agent Create "my-agent" project
273
+ npx march-start my-agent --yes Create with defaults
274
+ `);
275
+ return;
276
+ }
277
+ if (args.includes("--version") || args.includes("-v")) {
278
+ console.log("0.1.0");
279
+ return;
280
+ }
281
+ showBanner();
282
+ try {
283
+ const config = await getProjectConfig(args);
284
+ if (!config) {
285
+ return;
286
+ }
287
+ await scaffoldProject(config);
288
+ showSuccess(config);
289
+ } catch (error) {
290
+ showError(error instanceof Error ? error.message : String(error));
291
+ process.exit(1);
292
+ }
293
+ }
294
+ main();
295
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"]}