create-mastra 0.0.0-support-d1-client-20250701191943 → 0.0.0-taofeeq-fix-tool-call-showing-after-message-20250806184630
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/LICENSE.md +11 -42
- package/dist/index.js +448 -111
- package/dist/index.js.map +1 -1
- package/dist/starter-files/config.d.ts +26 -0
- package/dist/starter-files/config.d.ts.map +1 -0
- package/dist/starter-files/tools.d.ts +79 -0
- package/dist/starter-files/tools.d.ts.map +1 -0
- package/dist/templates/dev.entry.d.ts +2 -0
- package/dist/templates/dev.entry.d.ts.map +1 -0
- package/dist/templates/dev.entry.js +7 -2
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#! /usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
|
-
import * as
|
|
5
|
-
import
|
|
4
|
+
import * as fs4__default from 'node:fs';
|
|
5
|
+
import fs4__default__default, { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
6
6
|
import os from 'node:os';
|
|
7
|
-
import
|
|
7
|
+
import path3, { dirname } from 'node:path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { PostHog } from 'posthog-node';
|
|
10
10
|
import util, { stripVTControlCharacters } from 'node:util';
|
|
@@ -12,18 +12,22 @@ import y$1, { stdout, stdin } from 'node:process';
|
|
|
12
12
|
import * as g from 'node:readline';
|
|
13
13
|
import g__default from 'node:readline';
|
|
14
14
|
import { Writable } from 'node:stream';
|
|
15
|
+
import fs from 'node:fs/promises';
|
|
15
16
|
import child_process from 'node:child_process';
|
|
16
|
-
import fs4 from 'node:fs/promises';
|
|
17
|
-
import { execa } from 'execa';
|
|
18
|
-
import fsExtra3, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
|
|
19
|
-
import prettier from 'prettier';
|
|
20
17
|
import tty from 'node:tty';
|
|
21
18
|
import pino from 'pino';
|
|
22
19
|
import pretty from 'pino-pretty';
|
|
20
|
+
import { execa } from 'execa';
|
|
21
|
+
import fsExtra3, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
|
|
22
|
+
import prettier from 'prettier';
|
|
23
23
|
import fsExtra from 'fs-extra';
|
|
24
24
|
|
|
25
25
|
var __filename = fileURLToPath(import.meta.url);
|
|
26
|
-
var __dirname =
|
|
26
|
+
var __dirname = path3.dirname(__filename);
|
|
27
|
+
var analyticsInstance = null;
|
|
28
|
+
function getAnalytics() {
|
|
29
|
+
return analyticsInstance;
|
|
30
|
+
}
|
|
27
31
|
var PosthogAnalytics = class {
|
|
28
32
|
sessionId;
|
|
29
33
|
client;
|
|
@@ -35,7 +39,7 @@ var PosthogAnalytics = class {
|
|
|
35
39
|
host = "https://app.posthog.com"
|
|
36
40
|
}) {
|
|
37
41
|
this.version = version;
|
|
38
|
-
const cliConfigPath =
|
|
42
|
+
const cliConfigPath = path3.join(__dirname, "mastra-cli.json");
|
|
39
43
|
if (existsSync(cliConfigPath)) {
|
|
40
44
|
try {
|
|
41
45
|
const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
|
|
@@ -63,7 +67,7 @@ var PosthogAnalytics = class {
|
|
|
63
67
|
}
|
|
64
68
|
writeCliConfig({ distinctId, sessionId }) {
|
|
65
69
|
try {
|
|
66
|
-
writeFileSync(
|
|
70
|
+
writeFileSync(path3.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
|
|
67
71
|
} catch {
|
|
68
72
|
}
|
|
69
73
|
}
|
|
@@ -113,6 +117,22 @@ var PosthogAnalytics = class {
|
|
|
113
117
|
}
|
|
114
118
|
});
|
|
115
119
|
}
|
|
120
|
+
trackEvent(eventName, properties) {
|
|
121
|
+
try {
|
|
122
|
+
if (!this.client) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.client.capture({
|
|
126
|
+
distinctId: this.distinctId,
|
|
127
|
+
event: eventName,
|
|
128
|
+
properties: {
|
|
129
|
+
...this.getSystemProperties(),
|
|
130
|
+
...properties
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
} catch {
|
|
134
|
+
}
|
|
135
|
+
}
|
|
116
136
|
trackCommand(options) {
|
|
117
137
|
try {
|
|
118
138
|
if (!this.client) {
|
|
@@ -1153,6 +1173,195 @@ var PinoLogger = class extends MastraLogger {
|
|
|
1153
1173
|
}
|
|
1154
1174
|
};
|
|
1155
1175
|
|
|
1176
|
+
function getPackageManager() {
|
|
1177
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
1178
|
+
const execPath = process.env.npm_execpath || "";
|
|
1179
|
+
if (userAgent.includes("yarn")) {
|
|
1180
|
+
return "yarn";
|
|
1181
|
+
}
|
|
1182
|
+
if (userAgent.includes("pnpm")) {
|
|
1183
|
+
return "pnpm";
|
|
1184
|
+
}
|
|
1185
|
+
if (userAgent.includes("npm")) {
|
|
1186
|
+
return "npm";
|
|
1187
|
+
}
|
|
1188
|
+
if (execPath.includes("yarn")) {
|
|
1189
|
+
return "yarn";
|
|
1190
|
+
}
|
|
1191
|
+
if (execPath.includes("pnpm")) {
|
|
1192
|
+
return "pnpm";
|
|
1193
|
+
}
|
|
1194
|
+
if (execPath.includes("npm")) {
|
|
1195
|
+
return "npm";
|
|
1196
|
+
}
|
|
1197
|
+
return "npm";
|
|
1198
|
+
}
|
|
1199
|
+
function getPackageManagerInstallCommand(pm) {
|
|
1200
|
+
switch (pm) {
|
|
1201
|
+
case "npm":
|
|
1202
|
+
return "install";
|
|
1203
|
+
case "yarn":
|
|
1204
|
+
return "add";
|
|
1205
|
+
case "pnpm":
|
|
1206
|
+
return "add";
|
|
1207
|
+
default:
|
|
1208
|
+
return "install";
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
var logger = new PinoLogger({
|
|
1212
|
+
name: "Mastra CLI",
|
|
1213
|
+
level: "info"
|
|
1214
|
+
});
|
|
1215
|
+
var exec = util.promisify(child_process.exec);
|
|
1216
|
+
async function cloneTemplate(options) {
|
|
1217
|
+
const { template, projectName, targetDir } = options;
|
|
1218
|
+
const projectPath = targetDir ? path3.resolve(targetDir, projectName) : path3.resolve(projectName);
|
|
1219
|
+
const spinner5 = yoctoSpinner({ text: `Cloning template "${template.title}"...` }).start();
|
|
1220
|
+
try {
|
|
1221
|
+
if (await directoryExists(projectPath)) {
|
|
1222
|
+
spinner5.error(`Directory ${projectName} already exists`);
|
|
1223
|
+
throw new Error(`Directory ${projectName} already exists`);
|
|
1224
|
+
}
|
|
1225
|
+
await cloneRepositoryWithoutGit(template.githubUrl, projectPath);
|
|
1226
|
+
await updatePackageJson(projectPath, projectName);
|
|
1227
|
+
const envExamplePath = path3.join(projectPath, ".env.example");
|
|
1228
|
+
if (await fileExists(envExamplePath)) {
|
|
1229
|
+
await fs.copyFile(envExamplePath, path3.join(projectPath, ".env"));
|
|
1230
|
+
}
|
|
1231
|
+
spinner5.success(`Template "${template.title}" cloned successfully to ${projectName}`);
|
|
1232
|
+
return projectPath;
|
|
1233
|
+
} catch (error) {
|
|
1234
|
+
spinner5.error(`Failed to clone template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1235
|
+
throw error;
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
async function directoryExists(dirPath) {
|
|
1239
|
+
try {
|
|
1240
|
+
const stat = await fs.stat(dirPath);
|
|
1241
|
+
return stat.isDirectory();
|
|
1242
|
+
} catch {
|
|
1243
|
+
return false;
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
async function fileExists(filePath) {
|
|
1247
|
+
try {
|
|
1248
|
+
const stat = await fs.stat(filePath);
|
|
1249
|
+
return stat.isFile();
|
|
1250
|
+
} catch {
|
|
1251
|
+
return false;
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
async function cloneRepositoryWithoutGit(repoUrl, targetPath) {
|
|
1255
|
+
await fs.mkdir(targetPath, { recursive: true });
|
|
1256
|
+
try {
|
|
1257
|
+
const degitRepo = repoUrl.replace("https://github.com/", "");
|
|
1258
|
+
const degitCommand = shellQuote.quote(["npx", "degit", degitRepo, targetPath]);
|
|
1259
|
+
await exec(degitCommand, {
|
|
1260
|
+
cwd: process.cwd()
|
|
1261
|
+
});
|
|
1262
|
+
} catch {
|
|
1263
|
+
try {
|
|
1264
|
+
const gitCommand = shellQuote.quote(["git", "clone", repoUrl, targetPath]);
|
|
1265
|
+
await exec(gitCommand, {
|
|
1266
|
+
cwd: process.cwd()
|
|
1267
|
+
});
|
|
1268
|
+
const gitDir = path3.join(targetPath, ".git");
|
|
1269
|
+
if (await directoryExists(gitDir)) {
|
|
1270
|
+
await fs.rm(gitDir, { recursive: true, force: true });
|
|
1271
|
+
}
|
|
1272
|
+
} catch (gitError) {
|
|
1273
|
+
throw new Error(`Failed to clone repository: ${gitError instanceof Error ? gitError.message : "Unknown error"}`);
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
async function updatePackageJson(projectPath, projectName) {
|
|
1278
|
+
const packageJsonPath = path3.join(projectPath, "package.json");
|
|
1279
|
+
try {
|
|
1280
|
+
const packageJsonContent = await fs.readFile(packageJsonPath, "utf-8");
|
|
1281
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
1282
|
+
packageJson.name = projectName;
|
|
1283
|
+
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), "utf-8");
|
|
1284
|
+
} catch (error) {
|
|
1285
|
+
logger.warn(`Could not update package.json: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
async function installDependencies(projectPath, packageManager) {
|
|
1289
|
+
const spinner5 = yoctoSpinner({ text: "Installing dependencies..." }).start();
|
|
1290
|
+
try {
|
|
1291
|
+
const pm = packageManager || getPackageManager();
|
|
1292
|
+
const installCommand = shellQuote.quote([pm, "install"]);
|
|
1293
|
+
await exec(installCommand, {
|
|
1294
|
+
cwd: projectPath
|
|
1295
|
+
});
|
|
1296
|
+
spinner5.success("Dependencies installed successfully");
|
|
1297
|
+
} catch (error) {
|
|
1298
|
+
spinner5.error(`Failed to install dependencies: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1299
|
+
throw error;
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
var TEMPLATES_API_URL = process.env.MASTRA_TEMPLATES_API_URL || "https://mastra.ai/api/templates.json";
|
|
1303
|
+
async function loadTemplates() {
|
|
1304
|
+
try {
|
|
1305
|
+
const response = await fetch(TEMPLATES_API_URL);
|
|
1306
|
+
if (!response.ok) {
|
|
1307
|
+
throw new Error(`Failed to fetch templates: ${response.statusText}`);
|
|
1308
|
+
}
|
|
1309
|
+
const templates = await response.json();
|
|
1310
|
+
return templates;
|
|
1311
|
+
} catch (error) {
|
|
1312
|
+
console.error("Error loading templates:", error);
|
|
1313
|
+
throw new Error("Failed to load templates. Please check your internet connection and try again.");
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
function pluralize(count, singular, plural) {
|
|
1317
|
+
return count === 1 ? singular : plural || `${singular}s`;
|
|
1318
|
+
}
|
|
1319
|
+
async function selectTemplate(templates) {
|
|
1320
|
+
const choices = templates.map((template) => {
|
|
1321
|
+
const parts = [];
|
|
1322
|
+
if (template.agents?.length) {
|
|
1323
|
+
parts.push(`${template.agents.length} ${pluralize(template.agents.length, "agent")}`);
|
|
1324
|
+
}
|
|
1325
|
+
if (template.tools?.length) {
|
|
1326
|
+
parts.push(`${template.tools.length} ${pluralize(template.tools.length, "tool")}`);
|
|
1327
|
+
}
|
|
1328
|
+
if (template.workflows?.length) {
|
|
1329
|
+
parts.push(`${template.workflows.length} ${pluralize(template.workflows.length, "workflow")}`);
|
|
1330
|
+
}
|
|
1331
|
+
if (template.mcp?.length) {
|
|
1332
|
+
parts.push(`${template.mcp.length} ${pluralize(template.mcp.length, "MCP server")}`);
|
|
1333
|
+
}
|
|
1334
|
+
if (template.networks?.length) {
|
|
1335
|
+
parts.push(`${template.networks.length} ${pluralize(template.networks.length, "agent network")}`);
|
|
1336
|
+
}
|
|
1337
|
+
return {
|
|
1338
|
+
value: template,
|
|
1339
|
+
label: template.title,
|
|
1340
|
+
hint: parts.join(", ") || "Template components"
|
|
1341
|
+
};
|
|
1342
|
+
});
|
|
1343
|
+
const selected = await ve({
|
|
1344
|
+
message: "Select a template:",
|
|
1345
|
+
options: choices
|
|
1346
|
+
});
|
|
1347
|
+
if (pD(selected)) {
|
|
1348
|
+
return null;
|
|
1349
|
+
}
|
|
1350
|
+
return selected;
|
|
1351
|
+
}
|
|
1352
|
+
function findTemplateByName(templates, templateName) {
|
|
1353
|
+
let template = templates.find((t) => t.slug === templateName);
|
|
1354
|
+
if (template) return template;
|
|
1355
|
+
const slugWithPrefix = `template-${templateName}`;
|
|
1356
|
+
template = templates.find((t) => t.slug === slugWithPrefix);
|
|
1357
|
+
if (template) return template;
|
|
1358
|
+
template = templates.find((t) => t.title.toLowerCase() === templateName.toLowerCase());
|
|
1359
|
+
if (template) return template;
|
|
1360
|
+
return null;
|
|
1361
|
+
}
|
|
1362
|
+
function getDefaultProjectName(template) {
|
|
1363
|
+
return template.slug.replace(/^template-/, "");
|
|
1364
|
+
}
|
|
1156
1365
|
var DepsService = class {
|
|
1157
1366
|
packageManager;
|
|
1158
1367
|
constructor() {
|
|
@@ -1161,11 +1370,11 @@ var DepsService = class {
|
|
|
1161
1370
|
findLockFile(dir) {
|
|
1162
1371
|
const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
|
|
1163
1372
|
for (const file of lockFiles) {
|
|
1164
|
-
if (
|
|
1373
|
+
if (fs4__default__default.existsSync(path3.join(dir, file))) {
|
|
1165
1374
|
return file;
|
|
1166
1375
|
}
|
|
1167
1376
|
}
|
|
1168
|
-
const parentDir =
|
|
1377
|
+
const parentDir = path3.resolve(dir, "..");
|
|
1169
1378
|
if (parentDir !== dir) {
|
|
1170
1379
|
return this.findLockFile(parentDir);
|
|
1171
1380
|
}
|
|
@@ -1202,13 +1411,13 @@ var DepsService = class {
|
|
|
1202
1411
|
}
|
|
1203
1412
|
async checkDependencies(dependencies) {
|
|
1204
1413
|
try {
|
|
1205
|
-
const packageJsonPath =
|
|
1414
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
1206
1415
|
try {
|
|
1207
|
-
await
|
|
1416
|
+
await fs.access(packageJsonPath);
|
|
1208
1417
|
} catch {
|
|
1209
1418
|
return "No package.json file found in the current directory";
|
|
1210
1419
|
}
|
|
1211
|
-
const packageJson = JSON.parse(await
|
|
1420
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, "utf-8"));
|
|
1212
1421
|
for (const dependency of dependencies) {
|
|
1213
1422
|
if (!packageJson.dependencies || !packageJson.dependencies[dependency]) {
|
|
1214
1423
|
return `Please install ${dependency} before running this command (${this.packageManager} install ${dependency})`;
|
|
@@ -1222,8 +1431,8 @@ var DepsService = class {
|
|
|
1222
1431
|
}
|
|
1223
1432
|
async getProjectName() {
|
|
1224
1433
|
try {
|
|
1225
|
-
const packageJsonPath =
|
|
1226
|
-
const packageJson = await
|
|
1434
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
1435
|
+
const packageJson = await fs.readFile(packageJsonPath, "utf-8");
|
|
1227
1436
|
const pkg = JSON.parse(packageJson);
|
|
1228
1437
|
return pkg.name;
|
|
1229
1438
|
} catch (err) {
|
|
@@ -1233,54 +1442,19 @@ var DepsService = class {
|
|
|
1233
1442
|
async getPackageVersion() {
|
|
1234
1443
|
const __filename = fileURLToPath(import.meta.url);
|
|
1235
1444
|
const __dirname = dirname(__filename);
|
|
1236
|
-
const pkgJsonPath =
|
|
1445
|
+
const pkgJsonPath = path3.join(__dirname, "..", "package.json");
|
|
1237
1446
|
const content = await fsExtra3.readJSON(pkgJsonPath);
|
|
1238
1447
|
return content.version;
|
|
1239
1448
|
}
|
|
1240
1449
|
async addScriptsToPackageJson(scripts) {
|
|
1241
|
-
const packageJson = JSON.parse(await
|
|
1450
|
+
const packageJson = JSON.parse(await fs.readFile("package.json", "utf-8"));
|
|
1242
1451
|
packageJson.scripts = {
|
|
1243
1452
|
...packageJson.scripts,
|
|
1244
1453
|
...scripts
|
|
1245
1454
|
};
|
|
1246
|
-
await
|
|
1455
|
+
await fs.writeFile("package.json", JSON.stringify(packageJson, null, 2));
|
|
1247
1456
|
}
|
|
1248
1457
|
};
|
|
1249
|
-
function getPackageManager() {
|
|
1250
|
-
const userAgent = process.env.npm_config_user_agent || "";
|
|
1251
|
-
const execPath = process.env.npm_execpath || "";
|
|
1252
|
-
if (userAgent.includes("yarn")) {
|
|
1253
|
-
return "yarn";
|
|
1254
|
-
}
|
|
1255
|
-
if (userAgent.includes("pnpm")) {
|
|
1256
|
-
return "pnpm";
|
|
1257
|
-
}
|
|
1258
|
-
if (userAgent.includes("npm")) {
|
|
1259
|
-
return "npm";
|
|
1260
|
-
}
|
|
1261
|
-
if (execPath.includes("yarn")) {
|
|
1262
|
-
return "yarn";
|
|
1263
|
-
}
|
|
1264
|
-
if (execPath.includes("pnpm")) {
|
|
1265
|
-
return "pnpm";
|
|
1266
|
-
}
|
|
1267
|
-
if (execPath.includes("npm")) {
|
|
1268
|
-
return "npm";
|
|
1269
|
-
}
|
|
1270
|
-
return "npm";
|
|
1271
|
-
}
|
|
1272
|
-
function getPackageManagerInstallCommand(pm) {
|
|
1273
|
-
switch (pm) {
|
|
1274
|
-
case "npm":
|
|
1275
|
-
return "install";
|
|
1276
|
-
case "yarn":
|
|
1277
|
-
return "add";
|
|
1278
|
-
case "pnpm":
|
|
1279
|
-
return "add";
|
|
1280
|
-
default:
|
|
1281
|
-
return "install";
|
|
1282
|
-
}
|
|
1283
|
-
}
|
|
1284
1458
|
var args = ["-y", "@mastra/mcp-docs-server"];
|
|
1285
1459
|
var createMcpConfig = (editor) => {
|
|
1286
1460
|
if (editor === "vscode") {
|
|
@@ -1333,19 +1507,19 @@ async function writeMergedConfig(configPath, editor) {
|
|
|
1333
1507
|
spaces: 2
|
|
1334
1508
|
});
|
|
1335
1509
|
}
|
|
1336
|
-
var windsurfGlobalMCPConfigPath =
|
|
1337
|
-
var cursorGlobalMCPConfigPath =
|
|
1338
|
-
|
|
1339
|
-
var vscodeGlobalMCPConfigPath =
|
|
1510
|
+
var windsurfGlobalMCPConfigPath = path3.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1511
|
+
var cursorGlobalMCPConfigPath = path3.join(os.homedir(), ".cursor", "mcp.json");
|
|
1512
|
+
path3.join(process.cwd(), ".vscode", "mcp.json");
|
|
1513
|
+
var vscodeGlobalMCPConfigPath = path3.join(
|
|
1340
1514
|
os.homedir(),
|
|
1341
|
-
process.platform === "win32" ?
|
|
1515
|
+
process.platform === "win32" ? path3.join("AppData", "Roaming", "Code", "User", "settings.json") : process.platform === "darwin" ? path3.join("Library", "Application Support", "Code", "User", "settings.json") : path3.join(".config", "Code", "User", "settings.json")
|
|
1342
1516
|
);
|
|
1343
1517
|
async function installMastraDocsMCPServer({ editor, directory }) {
|
|
1344
1518
|
if (editor === `cursor`) {
|
|
1345
|
-
await writeMergedConfig(
|
|
1519
|
+
await writeMergedConfig(path3.join(directory, ".cursor", "mcp.json"), "cursor");
|
|
1346
1520
|
}
|
|
1347
1521
|
if (editor === `vscode`) {
|
|
1348
|
-
await writeMergedConfig(
|
|
1522
|
+
await writeMergedConfig(path3.join(directory, ".vscode", "mcp.json"), "vscode");
|
|
1349
1523
|
}
|
|
1350
1524
|
if (editor === `cursor-global`) {
|
|
1351
1525
|
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
@@ -1403,7 +1577,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1403
1577
|
}
|
|
1404
1578
|
readFile(filePath) {
|
|
1405
1579
|
return new Promise((resolve, reject) => {
|
|
1406
|
-
|
|
1580
|
+
fs4__default.readFile(filePath, "utf8", (err, data) => {
|
|
1407
1581
|
if (err) reject(err);
|
|
1408
1582
|
else resolve(data);
|
|
1409
1583
|
});
|
|
@@ -1411,7 +1585,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1411
1585
|
}
|
|
1412
1586
|
writeFile({ filePath, data }) {
|
|
1413
1587
|
return new Promise((resolve, reject) => {
|
|
1414
|
-
|
|
1588
|
+
fs4__default.writeFile(filePath, data, "utf8", (err) => {
|
|
1415
1589
|
if (err) reject(err);
|
|
1416
1590
|
else resolve();
|
|
1417
1591
|
});
|
|
@@ -1464,10 +1638,10 @@ var FileService = class {
|
|
|
1464
1638
|
*/
|
|
1465
1639
|
async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
|
|
1466
1640
|
const __filename = fileURLToPath(import.meta.url);
|
|
1467
|
-
const __dirname =
|
|
1468
|
-
const filePath =
|
|
1469
|
-
const fileString =
|
|
1470
|
-
if (
|
|
1641
|
+
const __dirname = path3.dirname(__filename);
|
|
1642
|
+
const filePath = path3.resolve(__dirname, "starter-files", inputFile);
|
|
1643
|
+
const fileString = fs4__default__default.readFileSync(filePath, "utf8");
|
|
1644
|
+
if (fs4__default__default.existsSync(outputFilePath) && !replaceIfExists) {
|
|
1471
1645
|
console.log(`${outputFilePath} already exists`);
|
|
1472
1646
|
return false;
|
|
1473
1647
|
}
|
|
@@ -1475,14 +1649,14 @@ var FileService = class {
|
|
|
1475
1649
|
return true;
|
|
1476
1650
|
}
|
|
1477
1651
|
async setupEnvFile({ dbUrl }) {
|
|
1478
|
-
const envPath =
|
|
1652
|
+
const envPath = path3.join(process.cwd(), ".env.development");
|
|
1479
1653
|
await fsExtra3.ensureFile(envPath);
|
|
1480
1654
|
const fileEnvService = new FileEnvService(envPath);
|
|
1481
1655
|
await fileEnvService.setEnvValue("DB_URL", dbUrl);
|
|
1482
1656
|
}
|
|
1483
1657
|
getFirstExistingFile(files) {
|
|
1484
1658
|
for (const f of files) {
|
|
1485
|
-
if (
|
|
1659
|
+
if (fs4__default__default.existsSync(f)) {
|
|
1486
1660
|
return f;
|
|
1487
1661
|
}
|
|
1488
1662
|
}
|
|
@@ -1492,18 +1666,22 @@ var FileService = class {
|
|
|
1492
1666
|
filePath,
|
|
1493
1667
|
replacements
|
|
1494
1668
|
}) {
|
|
1495
|
-
let fileContent =
|
|
1669
|
+
let fileContent = fs4__default__default.readFileSync(filePath, "utf8");
|
|
1496
1670
|
replacements.forEach(({ search, replace }) => {
|
|
1497
1671
|
fileContent = fileContent.replaceAll(search, replace);
|
|
1498
1672
|
});
|
|
1499
|
-
|
|
1673
|
+
fs4__default__default.writeFileSync(filePath, fileContent);
|
|
1674
|
+
}
|
|
1675
|
+
};
|
|
1676
|
+
var exec2 = util.promisify(child_process.exec);
|
|
1677
|
+
var getAISDKPackageVersion = (llmProvider) => {
|
|
1678
|
+
switch (llmProvider) {
|
|
1679
|
+
case "cerebras":
|
|
1680
|
+
return "^0.2.14";
|
|
1681
|
+
default:
|
|
1682
|
+
return "^1.0.0";
|
|
1500
1683
|
}
|
|
1501
1684
|
};
|
|
1502
|
-
new PinoLogger({
|
|
1503
|
-
name: "Mastra CLI",
|
|
1504
|
-
level: "info"
|
|
1505
|
-
});
|
|
1506
|
-
var exec = util.promisify(child_process.exec);
|
|
1507
1685
|
var getAISDKPackage = (llmProvider) => {
|
|
1508
1686
|
switch (llmProvider) {
|
|
1509
1687
|
case "openai":
|
|
@@ -1534,7 +1712,7 @@ var getProviderImportAndModelItem = (llmProvider) => {
|
|
|
1534
1712
|
modelItem = `groq('llama-3.3-70b-versatile')`;
|
|
1535
1713
|
} else if (llmProvider === "google") {
|
|
1536
1714
|
providerImport = `import { google } from '${getAISDKPackage(llmProvider)}';`;
|
|
1537
|
-
modelItem = `google('gemini-2.5-pro
|
|
1715
|
+
modelItem = `google('gemini-2.5-pro')`;
|
|
1538
1716
|
} else if (llmProvider === "cerebras") {
|
|
1539
1717
|
providerImport = `import { cerebras } from '${getAISDKPackage(llmProvider)}';`;
|
|
1540
1718
|
modelItem = `cerebras('llama-3.3-70b')`;
|
|
@@ -1580,8 +1758,8 @@ export const weatherAgent = new Agent({
|
|
|
1580
1758
|
parser: "typescript",
|
|
1581
1759
|
singleQuote: true
|
|
1582
1760
|
});
|
|
1583
|
-
await
|
|
1584
|
-
await
|
|
1761
|
+
await fs.writeFile(destPath, "");
|
|
1762
|
+
await fs.writeFile(destPath, formattedContent);
|
|
1585
1763
|
}
|
|
1586
1764
|
async function writeWorkflowSample(destPath) {
|
|
1587
1765
|
const content = `import { createStep, createWorkflow } from '@mastra/core/workflows';
|
|
@@ -1774,7 +1952,7 @@ export { weatherWorkflow };`;
|
|
|
1774
1952
|
semi: true,
|
|
1775
1953
|
singleQuote: true
|
|
1776
1954
|
});
|
|
1777
|
-
await
|
|
1955
|
+
await fs.writeFile(destPath, formattedContent);
|
|
1778
1956
|
}
|
|
1779
1957
|
async function writeToolSample(destPath) {
|
|
1780
1958
|
const fileService = new FileService();
|
|
@@ -1803,15 +1981,15 @@ var writeIndexFile = async ({
|
|
|
1803
1981
|
addWorkflow
|
|
1804
1982
|
}) => {
|
|
1805
1983
|
const indexPath = dirPath + "/index.ts";
|
|
1806
|
-
const destPath =
|
|
1984
|
+
const destPath = path3.join(indexPath);
|
|
1807
1985
|
try {
|
|
1808
|
-
await
|
|
1986
|
+
await fs.writeFile(destPath, "");
|
|
1809
1987
|
const filteredExports = [
|
|
1810
1988
|
addWorkflow ? `workflows: { weatherWorkflow },` : "",
|
|
1811
1989
|
addAgent ? `agents: { weatherAgent },` : ""
|
|
1812
1990
|
].filter(Boolean);
|
|
1813
1991
|
if (!addExample) {
|
|
1814
|
-
await
|
|
1992
|
+
await fs.writeFile(
|
|
1815
1993
|
destPath,
|
|
1816
1994
|
`
|
|
1817
1995
|
import { Mastra } from '@mastra/core';
|
|
@@ -1821,7 +1999,7 @@ export const mastra = new Mastra()
|
|
|
1821
1999
|
);
|
|
1822
2000
|
return;
|
|
1823
2001
|
}
|
|
1824
|
-
await
|
|
2002
|
+
await fs.writeFile(
|
|
1825
2003
|
destPath,
|
|
1826
2004
|
`
|
|
1827
2005
|
import { Mastra } from '@mastra/core/mastra';
|
|
@@ -1874,13 +2052,13 @@ var writeAPIKey = async ({
|
|
|
1874
2052
|
const key = await getAPIKey(provider);
|
|
1875
2053
|
const escapedKey = shellQuote.quote([key]);
|
|
1876
2054
|
const escapedApiKey = shellQuote.quote([apiKey]);
|
|
1877
|
-
await
|
|
2055
|
+
await exec2(`echo ${escapedKey}=${escapedApiKey} >> .env`);
|
|
1878
2056
|
};
|
|
1879
2057
|
var createMastraDir = async (directory) => {
|
|
1880
2058
|
let dir = directory.trim().split("/").filter((item) => item !== "");
|
|
1881
|
-
const dirPath =
|
|
2059
|
+
const dirPath = path3.join(process.cwd(), ...dir, "mastra");
|
|
1882
2060
|
try {
|
|
1883
|
-
await
|
|
2061
|
+
await fs.access(dirPath);
|
|
1884
2062
|
return { ok: false };
|
|
1885
2063
|
} catch {
|
|
1886
2064
|
await fsExtra3.ensureDir(dirPath);
|
|
@@ -2017,7 +2195,7 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
2017
2195
|
return mastraProject;
|
|
2018
2196
|
};
|
|
2019
2197
|
var s = Y();
|
|
2020
|
-
var
|
|
2198
|
+
var exec3 = util.promisify(child_process.exec);
|
|
2021
2199
|
var init = async ({
|
|
2022
2200
|
directory,
|
|
2023
2201
|
addExample = false,
|
|
@@ -2066,10 +2244,11 @@ var init = async ({
|
|
|
2066
2244
|
}
|
|
2067
2245
|
const key = await getAPIKey(llmProvider || "openai");
|
|
2068
2246
|
const aiSdkPackage = getAISDKPackage(llmProvider);
|
|
2247
|
+
const aiSdkPackageVersion = getAISDKPackageVersion(llmProvider);
|
|
2069
2248
|
const depsService = new DepsService();
|
|
2070
2249
|
const pm = depsService.packageManager;
|
|
2071
2250
|
const installCommand = getPackageManagerInstallCommand(pm);
|
|
2072
|
-
await
|
|
2251
|
+
await exec3(`${pm} ${installCommand} ${aiSdkPackage}@${aiSdkPackageVersion}`);
|
|
2073
2252
|
if (configureEditorWithDocsMCP) {
|
|
2074
2253
|
await installMastraDocsMCPServer({
|
|
2075
2254
|
editor: configureEditorWithDocsMCP,
|
|
@@ -2096,10 +2275,10 @@ var init = async ({
|
|
|
2096
2275
|
return { success: false };
|
|
2097
2276
|
}
|
|
2098
2277
|
};
|
|
2099
|
-
var
|
|
2278
|
+
var exec4 = util.promisify(child_process.exec);
|
|
2100
2279
|
var execWithTimeout = async (command, timeoutMs) => {
|
|
2101
2280
|
try {
|
|
2102
|
-
const promise =
|
|
2281
|
+
const promise = exec4(command, { killSignal: "SIGTERM" });
|
|
2103
2282
|
if (!timeoutMs) {
|
|
2104
2283
|
return await promise;
|
|
2105
2284
|
}
|
|
@@ -2163,7 +2342,7 @@ var createMastraProject = async ({
|
|
|
2163
2342
|
try {
|
|
2164
2343
|
s2.start("Creating project");
|
|
2165
2344
|
try {
|
|
2166
|
-
await
|
|
2345
|
+
await fs.mkdir(projectName);
|
|
2167
2346
|
} catch (error) {
|
|
2168
2347
|
if (error instanceof Error && "code" in error && error.code === "EEXIST") {
|
|
2169
2348
|
s2.stop(`A directory named "${projectName}" already exists. Please choose a different name.`);
|
|
@@ -2178,9 +2357,9 @@ var createMastraProject = async ({
|
|
|
2178
2357
|
const installCommand = getPackageManagerInstallCommand(pm);
|
|
2179
2358
|
s2.message("Initializing project structure");
|
|
2180
2359
|
try {
|
|
2181
|
-
await
|
|
2182
|
-
await
|
|
2183
|
-
await
|
|
2360
|
+
await exec4(`npm init -y`);
|
|
2361
|
+
await exec4(`npm pkg set type="module"`);
|
|
2362
|
+
await exec4(`npm pkg set engines.node=">=20.9.0"`);
|
|
2184
2363
|
const depsService = new DepsService();
|
|
2185
2364
|
await depsService.addScriptsToPackageJson({
|
|
2186
2365
|
dev: "mastra dev",
|
|
@@ -2195,9 +2374,9 @@ var createMastraProject = async ({
|
|
|
2195
2374
|
s2.stop("Project structure created");
|
|
2196
2375
|
s2.start(`Installing ${pm} dependencies`);
|
|
2197
2376
|
try {
|
|
2198
|
-
await
|
|
2199
|
-
await
|
|
2200
|
-
await
|
|
2377
|
+
await exec4(`${pm} ${installCommand} zod@^3`);
|
|
2378
|
+
await exec4(`${pm} ${installCommand} typescript @types/node --save-dev`);
|
|
2379
|
+
await exec4(`echo '{
|
|
2201
2380
|
"compilerOptions": {
|
|
2202
2381
|
"target": "ES2022",
|
|
2203
2382
|
"module": "ES2022",
|
|
@@ -2240,14 +2419,14 @@ var createMastraProject = async ({
|
|
|
2240
2419
|
s2.stop("Mastra dependencies installed");
|
|
2241
2420
|
s2.start("Adding .gitignore");
|
|
2242
2421
|
try {
|
|
2243
|
-
await
|
|
2244
|
-
await
|
|
2245
|
-
await
|
|
2246
|
-
await
|
|
2247
|
-
await
|
|
2248
|
-
await
|
|
2249
|
-
await
|
|
2250
|
-
await
|
|
2422
|
+
await exec4(`echo output.txt >> .gitignore`);
|
|
2423
|
+
await exec4(`echo node_modules >> .gitignore`);
|
|
2424
|
+
await exec4(`echo dist >> .gitignore`);
|
|
2425
|
+
await exec4(`echo .mastra >> .gitignore`);
|
|
2426
|
+
await exec4(`echo .env.development >> .gitignore`);
|
|
2427
|
+
await exec4(`echo .env >> .gitignore`);
|
|
2428
|
+
await exec4(`echo *.db >> .gitignore`);
|
|
2429
|
+
await exec4(`echo *.db-* >> .gitignore`);
|
|
2251
2430
|
} catch (error) {
|
|
2252
2431
|
throw new Error(`Failed to create .gitignore: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2253
2432
|
}
|
|
@@ -2263,6 +2442,10 @@ var createMastraProject = async ({
|
|
|
2263
2442
|
}
|
|
2264
2443
|
};
|
|
2265
2444
|
var create = async (args2) => {
|
|
2445
|
+
if (args2.template !== void 0) {
|
|
2446
|
+
await createFromTemplate(args2);
|
|
2447
|
+
return;
|
|
2448
|
+
}
|
|
2266
2449
|
const { projectName } = await createMastraProject({
|
|
2267
2450
|
projectName: args2?.projectName,
|
|
2268
2451
|
createVersionTag: args2?.createVersionTag,
|
|
@@ -2300,11 +2483,160 @@ var postCreate = ({ projectName }) => {
|
|
|
2300
2483
|
${color2.cyan(`${packageManager} run dev`)}
|
|
2301
2484
|
`);
|
|
2302
2485
|
};
|
|
2486
|
+
function isGitHubUrl(url) {
|
|
2487
|
+
try {
|
|
2488
|
+
const parsedUrl = new URL(url);
|
|
2489
|
+
return parsedUrl.hostname === "github.com" && parsedUrl.pathname.split("/").length >= 3;
|
|
2490
|
+
} catch {
|
|
2491
|
+
return false;
|
|
2492
|
+
}
|
|
2493
|
+
}
|
|
2494
|
+
async function validateGitHubProject(githubUrl) {
|
|
2495
|
+
const errors = [];
|
|
2496
|
+
try {
|
|
2497
|
+
const urlParts = new URL(githubUrl).pathname.split("/").filter(Boolean);
|
|
2498
|
+
const owner = urlParts[0];
|
|
2499
|
+
const repo = urlParts[1]?.replace(".git", "");
|
|
2500
|
+
if (!owner || !repo) {
|
|
2501
|
+
throw new Error("Invalid GitHub URL format");
|
|
2502
|
+
}
|
|
2503
|
+
const branches = ["main", "master"];
|
|
2504
|
+
let packageJsonContent = null;
|
|
2505
|
+
let indexContent = null;
|
|
2506
|
+
for (const branch of branches) {
|
|
2507
|
+
try {
|
|
2508
|
+
const packageJsonUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/package.json`;
|
|
2509
|
+
const packageJsonResponse = await fetch(packageJsonUrl);
|
|
2510
|
+
if (packageJsonResponse.ok) {
|
|
2511
|
+
packageJsonContent = await packageJsonResponse.text();
|
|
2512
|
+
const indexUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/src/mastra/index.ts`;
|
|
2513
|
+
const indexResponse = await fetch(indexUrl);
|
|
2514
|
+
if (indexResponse.ok) {
|
|
2515
|
+
indexContent = await indexResponse.text();
|
|
2516
|
+
}
|
|
2517
|
+
break;
|
|
2518
|
+
}
|
|
2519
|
+
} catch {
|
|
2520
|
+
}
|
|
2521
|
+
}
|
|
2522
|
+
if (!packageJsonContent) {
|
|
2523
|
+
errors.push("Could not fetch package.json from repository");
|
|
2524
|
+
return { isValid: false, errors };
|
|
2525
|
+
}
|
|
2526
|
+
try {
|
|
2527
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
2528
|
+
const hasMastraCore = packageJson.dependencies?.["@mastra/core"] || packageJson.devDependencies?.["@mastra/core"] || packageJson.peerDependencies?.["@mastra/core"];
|
|
2529
|
+
if (!hasMastraCore) {
|
|
2530
|
+
errors.push("Missing @mastra/core dependency in package.json");
|
|
2531
|
+
}
|
|
2532
|
+
} catch {
|
|
2533
|
+
errors.push("Invalid package.json format");
|
|
2534
|
+
}
|
|
2535
|
+
if (!indexContent) {
|
|
2536
|
+
errors.push("Missing src/mastra/index.ts file");
|
|
2537
|
+
} else {
|
|
2538
|
+
const hasMastraExport = indexContent.includes("export") && (indexContent.includes("new Mastra") || indexContent.includes("Mastra("));
|
|
2539
|
+
if (!hasMastraExport) {
|
|
2540
|
+
errors.push("src/mastra/index.ts does not export a Mastra instance");
|
|
2541
|
+
}
|
|
2542
|
+
}
|
|
2543
|
+
return { isValid: errors.length === 0, errors };
|
|
2544
|
+
} catch (error) {
|
|
2545
|
+
errors.push(`Failed to validate GitHub repository: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2546
|
+
return { isValid: false, errors };
|
|
2547
|
+
}
|
|
2548
|
+
}
|
|
2549
|
+
async function createFromGitHubUrl(url) {
|
|
2550
|
+
const urlParts = new URL(url).pathname.split("/").filter(Boolean);
|
|
2551
|
+
const owner = urlParts[0] || "unknown";
|
|
2552
|
+
const repo = urlParts[1] || "unknown";
|
|
2553
|
+
return {
|
|
2554
|
+
githubUrl: url,
|
|
2555
|
+
title: `${owner}/${repo}`,
|
|
2556
|
+
slug: repo,
|
|
2557
|
+
agents: [],
|
|
2558
|
+
mcp: [],
|
|
2559
|
+
tools: [],
|
|
2560
|
+
networks: [],
|
|
2561
|
+
workflows: []
|
|
2562
|
+
};
|
|
2563
|
+
}
|
|
2564
|
+
async function createFromTemplate(args2) {
|
|
2565
|
+
let selectedTemplate;
|
|
2566
|
+
if (args2.template === true) {
|
|
2567
|
+
const templates = await loadTemplates();
|
|
2568
|
+
const selected = await selectTemplate(templates);
|
|
2569
|
+
if (!selected) {
|
|
2570
|
+
M.info("No template selected. Exiting.");
|
|
2571
|
+
return;
|
|
2572
|
+
}
|
|
2573
|
+
selectedTemplate = selected;
|
|
2574
|
+
} else if (args2.template && typeof args2.template === "string") {
|
|
2575
|
+
if (isGitHubUrl(args2.template)) {
|
|
2576
|
+
const spinner5 = Y();
|
|
2577
|
+
spinner5.start("Validating GitHub repository...");
|
|
2578
|
+
const validation = await validateGitHubProject(args2.template);
|
|
2579
|
+
if (!validation.isValid) {
|
|
2580
|
+
spinner5.stop("Validation failed");
|
|
2581
|
+
M.error("This does not appear to be a valid Mastra project:");
|
|
2582
|
+
validation.errors.forEach((error) => M.error(` - ${error}`));
|
|
2583
|
+
throw new Error("Invalid Mastra project");
|
|
2584
|
+
}
|
|
2585
|
+
spinner5.stop("Valid Mastra project \u2713");
|
|
2586
|
+
selectedTemplate = await createFromGitHubUrl(args2.template);
|
|
2587
|
+
} else {
|
|
2588
|
+
const templates = await loadTemplates();
|
|
2589
|
+
const found = findTemplateByName(templates, args2.template);
|
|
2590
|
+
if (!found) {
|
|
2591
|
+
M.error(`Template "${args2.template}" not found. Available templates:`);
|
|
2592
|
+
templates.forEach((t) => M.info(` - ${t.title} (use: ${t.slug.replace("template-", "")})`));
|
|
2593
|
+
throw new Error(`Template "${args2.template}" not found`);
|
|
2594
|
+
}
|
|
2595
|
+
selectedTemplate = found;
|
|
2596
|
+
}
|
|
2597
|
+
}
|
|
2598
|
+
if (!selectedTemplate) {
|
|
2599
|
+
throw new Error("No template selected");
|
|
2600
|
+
}
|
|
2601
|
+
let projectName = args2.projectName;
|
|
2602
|
+
if (!projectName) {
|
|
2603
|
+
const defaultName = getDefaultProjectName(selectedTemplate);
|
|
2604
|
+
const response = await he({
|
|
2605
|
+
message: "What is your project name?",
|
|
2606
|
+
defaultValue: defaultName,
|
|
2607
|
+
placeholder: defaultName
|
|
2608
|
+
});
|
|
2609
|
+
if (pD(response)) {
|
|
2610
|
+
M.info("Project creation cancelled.");
|
|
2611
|
+
return;
|
|
2612
|
+
}
|
|
2613
|
+
projectName = response;
|
|
2614
|
+
}
|
|
2615
|
+
try {
|
|
2616
|
+
const analytics = getAnalytics();
|
|
2617
|
+
if (analytics) ;
|
|
2618
|
+
const projectPath = await cloneTemplate({
|
|
2619
|
+
template: selectedTemplate,
|
|
2620
|
+
projectName
|
|
2621
|
+
});
|
|
2622
|
+
await installDependencies(projectPath);
|
|
2623
|
+
Me(`
|
|
2624
|
+
${color2.green("Mastra template installed!")}
|
|
2625
|
+
|
|
2626
|
+
Add the necessary environment
|
|
2627
|
+
variables in your ${color2.cyan(".env")} file
|
|
2628
|
+
`);
|
|
2629
|
+
postCreate({ projectName });
|
|
2630
|
+
} catch (error) {
|
|
2631
|
+
M.error(`Failed to create project from template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2632
|
+
throw error;
|
|
2633
|
+
}
|
|
2634
|
+
}
|
|
2303
2635
|
|
|
2304
2636
|
async function getPackageVersion() {
|
|
2305
2637
|
const __filename = fileURLToPath(import.meta.url);
|
|
2306
2638
|
const __dirname = dirname(__filename);
|
|
2307
|
-
const pkgJsonPath =
|
|
2639
|
+
const pkgJsonPath = path3.join(__dirname, "..", "package.json");
|
|
2308
2640
|
const content = await fsExtra.readJSON(pkgJsonPath);
|
|
2309
2641
|
return content.version;
|
|
2310
2642
|
}
|
|
@@ -2342,7 +2674,10 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
|
|
|
2342
2674
|
program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
|
|
2343
2675
|
"-p, --project-name <string>",
|
|
2344
2676
|
"Project name that will be used in package.json and as the project directory name."
|
|
2345
|
-
).option("--default", "Quick start with defaults(src, OpenAI, examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows)").option("-l, --llm <model-provider>", "Default model provider (openai, anthropic, groq, google, or cerebras)").option("-k, --llm-api-key <api-key>", "API key for the model provider").option("-e, --example", "Include example code").option("-n, --no-example", "Do not include example code").option("-t, --timeout [timeout]", "Configurable timeout for package installation, defaults to 60000 ms").option("-d, --dir <directory>", "Target directory for Mastra source code (default: src/)").option("-m, --mcp <mcp>", "MCP Server for code editor (cursor, cursor-global, windsurf, vscode)").
|
|
2677
|
+
).option("--default", "Quick start with defaults(src, OpenAI, examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows)").option("-l, --llm <model-provider>", "Default model provider (openai, anthropic, groq, google, or cerebras)").option("-k, --llm-api-key <api-key>", "API key for the model provider").option("-e, --example", "Include example code").option("-n, --no-example", "Do not include example code").option("-t, --timeout [timeout]", "Configurable timeout for package installation, defaults to 60000 ms").option("-d, --dir <directory>", "Target directory for Mastra source code (default: src/)").option("-m, --mcp <mcp>", "MCP Server for code editor (cursor, cursor-global, windsurf, vscode)").option(
|
|
2678
|
+
"--template [template-name]",
|
|
2679
|
+
"Create project from a template (use template name, public GitHub URL, or leave blank to select from list)"
|
|
2680
|
+
).action(async (projectNameArg, args) => {
|
|
2346
2681
|
const projectName = projectNameArg || args.projectName;
|
|
2347
2682
|
const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
|
|
2348
2683
|
if (args.default) {
|
|
@@ -2353,7 +2688,8 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
|
|
|
2353
2688
|
createVersionTag,
|
|
2354
2689
|
timeout,
|
|
2355
2690
|
mcpServer: args.mcp,
|
|
2356
|
-
directory: "src/"
|
|
2691
|
+
directory: "src/",
|
|
2692
|
+
template: args.template
|
|
2357
2693
|
});
|
|
2358
2694
|
return;
|
|
2359
2695
|
}
|
|
@@ -2366,7 +2702,8 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
|
|
|
2366
2702
|
timeout,
|
|
2367
2703
|
projectName,
|
|
2368
2704
|
directory: args.dir,
|
|
2369
|
-
mcpServer: args.mcp
|
|
2705
|
+
mcpServer: args.mcp,
|
|
2706
|
+
template: args.template
|
|
2370
2707
|
});
|
|
2371
2708
|
});
|
|
2372
2709
|
program.parse(process.argv);
|