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 +71 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +295 -0
- package/dist/index.js.map +1 -0
- package/dist/template/README.md +1092 -0
- package/dist/template/env.example +36 -0
- package/dist/template/package.json +27 -0
- package/dist/template/src/agent.ts +186 -0
- package/dist/template/tsconfig.json +27 -0
- package/package.json +51 -0
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
|
package/dist/index.d.ts
ADDED
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":";;;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,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,KAAK,yCAAyC,CAAC;AAC9D,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;;;AC3IA,SAAS,YAAY,WAAW,eAAe,cAAc,mBAAmB;AAChF,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;AAElC,kBAAU,iBAAiB,SAAS,YAAY;AAAA,MACpD,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,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,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;;;AC1MA,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"]}
|