create-mastra 0.0.0-playground-studio-cloud-20251031080052 → 0.0.0-playground-studio-again-20251114100107

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import { randomUUID } from 'node:crypto';
4
4
  import * as fs3__default from 'node:fs';
5
5
  import fs3__default__default, { existsSync, readFileSync, writeFileSync } from 'node:fs';
6
6
  import os from 'node:os';
7
- import path, { dirname } from 'node:path';
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';
@@ -23,7 +23,7 @@ import pretty from 'pino-pretty';
23
23
  import fsExtra$1 from 'fs-extra';
24
24
 
25
25
  var __filename = fileURLToPath(import.meta.url);
26
- var __dirname = path.dirname(__filename);
26
+ var __dirname = path3.dirname(__filename);
27
27
  var analyticsInstance = null;
28
28
  function getAnalytics() {
29
29
  return analyticsInstance;
@@ -39,7 +39,7 @@ var PosthogAnalytics = class {
39
39
  host = "https://app.posthog.com"
40
40
  }) {
41
41
  this.version = version;
42
- const cliConfigPath = path.join(__dirname, "mastra-cli.json");
42
+ const cliConfigPath = path3.join(__dirname, "mastra-cli.json");
43
43
  if (existsSync(cliConfigPath)) {
44
44
  try {
45
45
  const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
@@ -67,7 +67,7 @@ var PosthogAnalytics = class {
67
67
  }
68
68
  writeCliConfig({ distinctId, sessionId }) {
69
69
  try {
70
- writeFileSync(path.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
70
+ writeFileSync(path3.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
71
71
  } catch {
72
72
  }
73
73
  }
@@ -887,6 +887,7 @@ class YoctoSpinner {
887
887
  #exitHandlerBound;
888
888
  #isInteractive;
889
889
  #lastSpinnerFrameTime = 0;
890
+ #isSpinning = false;
890
891
 
891
892
  constructor(options = {}) {
892
893
  const spinner = options.spinner ?? defaultSpinner;
@@ -908,13 +909,17 @@ class YoctoSpinner {
908
909
  return this;
909
910
  }
910
911
 
912
+ this.#isSpinning = true;
911
913
  this.#hideCursor();
912
914
  this.#render();
913
915
  this.#subscribeToProcessEvents();
914
916
 
915
- this.#timer = setInterval(() => {
916
- this.#render();
917
- }, this.#interval);
917
+ // Only start the timer in interactive mode
918
+ if (this.#isInteractive) {
919
+ this.#timer = setInterval(() => {
920
+ this.#render();
921
+ }, this.#interval);
922
+ }
918
923
 
919
924
  return this;
920
925
  }
@@ -924,8 +929,12 @@ class YoctoSpinner {
924
929
  return this;
925
930
  }
926
931
 
927
- clearInterval(this.#timer);
928
- this.#timer = undefined;
932
+ this.#isSpinning = false;
933
+ if (this.#timer) {
934
+ clearInterval(this.#timer);
935
+ this.#timer = undefined;
936
+ }
937
+
929
938
  this.#showCursor();
930
939
  this.clear();
931
940
  this.#unsubscribeFromProcessEvents();
@@ -958,7 +967,7 @@ class YoctoSpinner {
958
967
  }
959
968
 
960
969
  get isSpinning() {
961
- return this.#timer !== undefined;
970
+ return this.#isSpinning;
962
971
  }
963
972
 
964
973
  get text() {
@@ -1095,11 +1104,11 @@ var MastraLogger = class {
1095
1104
  }
1096
1105
  trackException(_error) {
1097
1106
  }
1098
- async getLogs(transportId, params) {
1107
+ async listLogs(transportId, params) {
1099
1108
  if (!transportId || !this.transports.has(transportId)) {
1100
1109
  return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };
1101
1110
  }
1102
- return this.transports.get(transportId).getLogs(params) ?? {
1111
+ return this.transports.get(transportId).listLogs(params) ?? {
1103
1112
  logs: [],
1104
1113
  total: 0,
1105
1114
  page: params?.page ?? 1,
@@ -1107,7 +1116,7 @@ var MastraLogger = class {
1107
1116
  hasMore: false
1108
1117
  };
1109
1118
  }
1110
- async getLogsByRunId({
1119
+ async listLogsByRunId({
1111
1120
  transportId,
1112
1121
  runId,
1113
1122
  fromDate,
@@ -1120,7 +1129,7 @@ var MastraLogger = class {
1120
1129
  if (!transportId || !this.transports.has(transportId) || !runId) {
1121
1130
  return { logs: [], total: 0, page: page ?? 1, perPage: perPage ?? 100, hasMore: false };
1122
1131
  }
1123
- return this.transports.get(transportId).getLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {
1132
+ return this.transports.get(transportId).listLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {
1124
1133
  logs: [],
1125
1134
  total: 0,
1126
1135
  page: page ?? 1,
@@ -1178,118 +1187,8 @@ var PinoLogger = class extends MastraLogger {
1178
1187
  }
1179
1188
  };
1180
1189
 
1181
- var args = ["-y", "@mastra/mcp-docs-server"];
1182
- var createMcpConfig = (editor) => {
1183
- if (editor === "vscode") {
1184
- return {
1185
- servers: {
1186
- mastra: process.platform === `win32` ? {
1187
- command: "cmd",
1188
- args: ["/c", "npx", ...args],
1189
- type: "stdio"
1190
- } : {
1191
- command: "npx",
1192
- args,
1193
- type: "stdio"
1194
- }
1195
- }
1196
- };
1197
- }
1198
- return {
1199
- mcpServers: {
1200
- mastra: {
1201
- command: "npx",
1202
- args
1203
- }
1204
- }
1205
- };
1206
- };
1207
- function makeConfig(original, editor) {
1208
- if (editor === "vscode") {
1209
- return {
1210
- ...original,
1211
- servers: {
1212
- ...original?.servers || {},
1213
- ...createMcpConfig(editor).servers
1214
- }
1215
- };
1216
- }
1217
- return {
1218
- ...original,
1219
- mcpServers: {
1220
- ...original?.mcpServers || {},
1221
- ...createMcpConfig(editor).mcpServers
1222
- }
1223
- };
1224
- }
1225
- async function writeMergedConfig(configPath, editor) {
1226
- const configExists = existsSync(configPath);
1227
- const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor);
1228
- await ensureFile(configPath);
1229
- await writeJSON(configPath, config, {
1230
- spaces: 2
1231
- });
1232
- }
1233
- var windsurfGlobalMCPConfigPath = path.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
1234
- var cursorGlobalMCPConfigPath = path.join(os.homedir(), ".cursor", "mcp.json");
1235
- path.join(process.cwd(), ".vscode", "mcp.json");
1236
- var vscodeGlobalMCPConfigPath = path.join(
1237
- os.homedir(),
1238
- process.platform === "win32" ? path.join("AppData", "Roaming", "Code", "User", "settings.json") : process.platform === "darwin" ? path.join("Library", "Application Support", "Code", "User", "settings.json") : path.join(".config", "Code", "User", "settings.json")
1239
- );
1240
- async function installMastraDocsMCPServer({ editor, directory }) {
1241
- if (editor === `cursor`) {
1242
- await writeMergedConfig(path.join(directory, ".cursor", "mcp.json"), "cursor");
1243
- }
1244
- if (editor === `vscode`) {
1245
- await writeMergedConfig(path.join(directory, ".vscode", "mcp.json"), "vscode");
1246
- }
1247
- if (editor === `cursor-global`) {
1248
- const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
1249
- if (alreadyInstalled) {
1250
- return;
1251
- }
1252
- await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global");
1253
- }
1254
- if (editor === `windsurf`) {
1255
- const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
1256
- if (alreadyInstalled) {
1257
- return;
1258
- }
1259
- await writeMergedConfig(windsurfGlobalMCPConfigPath, editor);
1260
- }
1261
- }
1262
- async function globalMCPIsAlreadyInstalled(editor) {
1263
- let configPath = ``;
1264
- if (editor === "windsurf") {
1265
- configPath = windsurfGlobalMCPConfigPath;
1266
- } else if (editor === "cursor-global") {
1267
- configPath = cursorGlobalMCPConfigPath;
1268
- } else if (editor === "vscode") {
1269
- configPath = vscodeGlobalMCPConfigPath;
1270
- }
1271
- if (!configPath || !existsSync(configPath)) {
1272
- return false;
1273
- }
1274
- try {
1275
- const configContents = await readJSON(configPath);
1276
- if (!configContents) return false;
1277
- if (editor === "vscode") {
1278
- if (!configContents.servers) return false;
1279
- const hasMastraMCP2 = Object.values(configContents.servers).some(
1280
- (server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
1281
- );
1282
- return hasMastraMCP2;
1283
- }
1284
- if (!configContents?.mcpServers) return false;
1285
- const hasMastraMCP = Object.values(configContents.mcpServers).some(
1286
- (server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
1287
- );
1288
- return hasMastraMCP;
1289
- } catch {
1290
- return false;
1291
- }
1292
- }
1190
+ var package_default = {
1191
+ version: "1.0.0-beta.1"};
1293
1192
  function getPackageManagerAddCommand(pm) {
1294
1193
  switch (pm) {
1295
1194
  case "npm":
@@ -1312,11 +1211,11 @@ var DepsService = class {
1312
1211
  findLockFile(dir) {
1313
1212
  const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
1314
1213
  for (const file of lockFiles) {
1315
- if (fs3__default__default.existsSync(path.join(dir, file))) {
1214
+ if (fs3__default__default.existsSync(path3.join(dir, file))) {
1316
1215
  return file;
1317
1216
  }
1318
1217
  }
1319
- const parentDir = path.resolve(dir, "..");
1218
+ const parentDir = path3.resolve(dir, "..");
1320
1219
  if (parentDir !== dir) {
1321
1220
  return this.findLockFile(parentDir);
1322
1221
  }
@@ -1349,7 +1248,7 @@ var DepsService = class {
1349
1248
  }
1350
1249
  async checkDependencies(dependencies) {
1351
1250
  try {
1352
- const packageJsonPath = path.join(process.cwd(), "package.json");
1251
+ const packageJsonPath = path3.join(process.cwd(), "package.json");
1353
1252
  try {
1354
1253
  await fs4.access(packageJsonPath);
1355
1254
  } catch {
@@ -1369,7 +1268,7 @@ var DepsService = class {
1369
1268
  }
1370
1269
  async getProjectName() {
1371
1270
  try {
1372
- const packageJsonPath = path.join(process.cwd(), "package.json");
1271
+ const packageJsonPath = path3.join(process.cwd(), "package.json");
1373
1272
  const packageJson = await fs4.readFile(packageJsonPath, "utf-8");
1374
1273
  const pkg = JSON.parse(packageJson);
1375
1274
  return pkg.name;
@@ -1457,8 +1356,8 @@ var FileService = class {
1457
1356
  */
1458
1357
  async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
1459
1358
  const __filename = fileURLToPath(import.meta.url);
1460
- const __dirname = path.dirname(__filename);
1461
- const filePath = path.resolve(__dirname, "starter-files", inputFile);
1359
+ const __dirname = path3.dirname(__filename);
1360
+ const filePath = path3.resolve(__dirname, "starter-files", inputFile);
1462
1361
  const fileString = fs3__default__default.readFileSync(filePath, "utf8");
1463
1362
  if (fs3__default__default.existsSync(outputFilePath) && !replaceIfExists) {
1464
1363
  console.info(`${outputFilePath} already exists`);
@@ -1468,7 +1367,7 @@ var FileService = class {
1468
1367
  return true;
1469
1368
  }
1470
1369
  async setupEnvFile({ dbUrl }) {
1471
- const envPath = path.join(process.cwd(), ".env.development");
1370
+ const envPath = path3.join(process.cwd(), ".env.development");
1472
1371
  await fsExtra.ensureFile(envPath);
1473
1372
  const fileEnvService = new FileEnvService(envPath);
1474
1373
  await fileEnvService.setEnvValue("DB_URL", dbUrl);
@@ -1492,21 +1391,142 @@ var FileService = class {
1492
1391
  fs3__default__default.writeFileSync(filePath, fileContent);
1493
1392
  }
1494
1393
  };
1394
+ var createArgs = (versionTag) => {
1395
+ const packageName = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
1396
+ return ["-y", packageName];
1397
+ };
1398
+ var createMcpConfig = (editor, versionTag) => {
1399
+ const args = createArgs(versionTag);
1400
+ if (editor === "vscode") {
1401
+ return {
1402
+ servers: {
1403
+ mastra: process.platform === `win32` ? {
1404
+ command: "cmd",
1405
+ args: ["/c", "npx", ...args],
1406
+ type: "stdio"
1407
+ } : {
1408
+ command: "npx",
1409
+ args,
1410
+ type: "stdio"
1411
+ }
1412
+ }
1413
+ };
1414
+ }
1415
+ return {
1416
+ mcpServers: {
1417
+ mastra: {
1418
+ command: "npx",
1419
+ args
1420
+ }
1421
+ }
1422
+ };
1423
+ };
1424
+ function makeConfig(original, editor, versionTag) {
1425
+ if (editor === "vscode") {
1426
+ return {
1427
+ ...original,
1428
+ servers: {
1429
+ ...original?.servers || {},
1430
+ ...createMcpConfig(editor, versionTag).servers
1431
+ }
1432
+ };
1433
+ }
1434
+ return {
1435
+ ...original,
1436
+ mcpServers: {
1437
+ ...original?.mcpServers || {},
1438
+ ...createMcpConfig(editor, versionTag).mcpServers
1439
+ }
1440
+ };
1441
+ }
1442
+ async function writeMergedConfig(configPath, editor, versionTag) {
1443
+ const configExists = existsSync(configPath);
1444
+ const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor, versionTag);
1445
+ await ensureFile(configPath);
1446
+ await writeJSON(configPath, config, {
1447
+ spaces: 2
1448
+ });
1449
+ }
1450
+ var windsurfGlobalMCPConfigPath = path3.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
1451
+ var cursorGlobalMCPConfigPath = path3.join(os.homedir(), ".cursor", "mcp.json");
1452
+ path3.join(process.cwd(), ".vscode", "mcp.json");
1453
+ var vscodeGlobalMCPConfigPath = path3.join(
1454
+ os.homedir(),
1455
+ 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")
1456
+ );
1457
+ async function installMastraDocsMCPServer({
1458
+ editor,
1459
+ directory,
1460
+ versionTag
1461
+ }) {
1462
+ if (editor === `cursor`) {
1463
+ await writeMergedConfig(path3.join(directory, ".cursor", "mcp.json"), "cursor", versionTag);
1464
+ }
1465
+ if (editor === `vscode`) {
1466
+ await writeMergedConfig(path3.join(directory, ".vscode", "mcp.json"), "vscode", versionTag);
1467
+ }
1468
+ if (editor === `cursor-global`) {
1469
+ const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
1470
+ if (alreadyInstalled) {
1471
+ return;
1472
+ }
1473
+ await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global", versionTag);
1474
+ }
1475
+ if (editor === `windsurf`) {
1476
+ const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
1477
+ if (alreadyInstalled) {
1478
+ return;
1479
+ }
1480
+ await writeMergedConfig(windsurfGlobalMCPConfigPath, editor, versionTag);
1481
+ }
1482
+ }
1483
+ async function globalMCPIsAlreadyInstalled(editor, versionTag) {
1484
+ let configPath = ``;
1485
+ if (editor === "windsurf") {
1486
+ configPath = windsurfGlobalMCPConfigPath;
1487
+ } else if (editor === "cursor-global") {
1488
+ configPath = cursorGlobalMCPConfigPath;
1489
+ } else if (editor === "vscode") {
1490
+ configPath = vscodeGlobalMCPConfigPath;
1491
+ }
1492
+ if (!configPath || !existsSync(configPath)) {
1493
+ return false;
1494
+ }
1495
+ try {
1496
+ const configContents = await readJSON(configPath);
1497
+ if (!configContents) return false;
1498
+ const expectedPackage = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
1499
+ if (editor === "vscode") {
1500
+ if (!configContents.servers) return false;
1501
+ const hasMastraMCP2 = Object.values(configContents.servers).some(
1502
+ (server) => server?.args?.find((arg) => arg === expectedPackage)
1503
+ );
1504
+ return hasMastraMCP2;
1505
+ }
1506
+ if (!configContents?.mcpServers) return false;
1507
+ const hasMastraMCP = Object.values(configContents.mcpServers).some(
1508
+ (server) => server?.args?.find((arg) => arg === expectedPackage)
1509
+ );
1510
+ return hasMastraMCP;
1511
+ } catch {
1512
+ return false;
1513
+ }
1514
+ }
1495
1515
  var exec = util.promisify(child_process.exec);
1496
1516
  var getModelIdentifier = (llmProvider) => {
1497
- if (llmProvider === "openai") {
1498
- return `'openai/gpt-4o-mini'`;
1499
- } else if (llmProvider === "anthropic") {
1500
- return `'anthropic/claude-sonnet-4-5-20250929'`;
1517
+ let model = "openai/gpt-4o";
1518
+ if (llmProvider === "anthropic") {
1519
+ model = "anthropic/claude-sonnet-4-5";
1501
1520
  } else if (llmProvider === "groq") {
1502
- return `'groq/llama-3.3-70b-versatile'`;
1521
+ model = "groq/llama-3.3-70b-versatile";
1503
1522
  } else if (llmProvider === "google") {
1504
- return `'google/gemini-2.5-pro'`;
1523
+ model = "google/gemini-2.5-pro";
1505
1524
  } else if (llmProvider === "cerebras") {
1506
- return `'cerebras/llama-3.3-70b'`;
1525
+ model = "cerebras/llama-3.3-70b";
1507
1526
  } else if (llmProvider === "mistral") {
1508
- return `'mistral/mistral-medium-2508'`;
1527
+ model = "mistral/mistral-medium-2508";
1509
1528
  }
1529
+ return model;
1510
1530
  };
1511
1531
  async function writeAgentSample(llmProvider, destPath, addExampleTool, addScorers) {
1512
1532
  const modelString = getModelIdentifier(llmProvider);
@@ -1532,9 +1552,10 @@ ${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
1532
1552
  ${addScorers ? `import { scorers } from '../scorers/weather-scorer';` : ""}
1533
1553
 
1534
1554
  export const weatherAgent = new Agent({
1555
+ id: 'weather-agent',
1535
1556
  name: 'Weather Agent',
1536
1557
  instructions: \`${instructions}\`,
1537
- model: ${modelString},
1558
+ model: '${modelString}',
1538
1559
  ${addExampleTool ? "tools: { weatherTool }," : ""}
1539
1560
  ${addScorers ? `scorers: {
1540
1561
  toolCallAppropriateness: {
@@ -1561,6 +1582,7 @@ export const weatherAgent = new Agent({
1561
1582
  },` : ""}
1562
1583
  memory: new Memory({
1563
1584
  storage: new LibSQLStore({
1585
+ id: "memory-storage",
1564
1586
  url: "file:../mastra.db", // path is relative to the .mastra/output directory
1565
1587
  })
1566
1588
  })
@@ -1773,9 +1795,10 @@ async function writeToolSample(destPath) {
1773
1795
  async function writeScorersSample(llmProvider, destPath) {
1774
1796
  const modelString = getModelIdentifier(llmProvider);
1775
1797
  const content = `import { z } from 'zod';
1776
- import { createToolCallAccuracyScorerCode } from '@mastra/evals/scorers/code';
1777
- import { createCompletenessScorer } from '@mastra/evals/scorers/code';
1778
- import { createScorer } from '@mastra/core/scores';
1798
+ import { createToolCallAccuracyScorerCode } from '@mastra/evals/scorers/prebuilt';
1799
+ import { createCompletenessScorer } from '@mastra/evals/scorers/prebuilt';
1800
+ import { getAssistantMessageFromRunOutput, getUserMessageFromRunInput } from '@mastra/evals/scorers/utils';
1801
+ import { createScorer } from '@mastra/core/evals';
1779
1802
 
1780
1803
  export const toolCallAppropriatenessScorer = createToolCallAccuracyScorerCode({
1781
1804
  expectedTool: 'weatherTool',
@@ -1786,11 +1809,12 @@ export const completenessScorer = createCompletenessScorer();
1786
1809
 
1787
1810
  // Custom LLM-judged scorer: evaluates if non-English locations are translated appropriately
1788
1811
  export const translationScorer = createScorer({
1812
+ id: 'translation-quality-scorer',
1789
1813
  name: 'Translation Quality',
1790
1814
  description: 'Checks that non-English location names are translated and used correctly',
1791
1815
  type: 'agent',
1792
1816
  judge: {
1793
- model: ${modelString},
1817
+ model: '${modelString}',
1794
1818
  instructions:
1795
1819
  'You are an expert evaluator of translation quality for geographic locations. ' +
1796
1820
  'Determine whether the user text mentions a non-English location and whether the assistant correctly uses an English translation of that location. ' +
@@ -1799,8 +1823,8 @@ export const translationScorer = createScorer({
1799
1823
  },
1800
1824
  })
1801
1825
  .preprocess(({ run }) => {
1802
- const userText = (run.input?.inputMessages?.[0]?.content as string) || '';
1803
- const assistantText = (run.output?.[0]?.content as string) || '';
1826
+ const userText = getUserMessageFromRunInput(run.input) || '';
1827
+ const assistantText = getAssistantMessageFromRunOutput(run.output) || '';
1804
1828
  return { userText, assistantText };
1805
1829
  })
1806
1830
  .analyze({
@@ -1887,7 +1911,7 @@ var writeIndexFile = async ({
1887
1911
  addScorers
1888
1912
  }) => {
1889
1913
  const indexPath = dirPath + "/index.ts";
1890
- const destPath = path.join(indexPath);
1914
+ const destPath = path3.join(indexPath);
1891
1915
  try {
1892
1916
  await fs4.writeFile(destPath, "");
1893
1917
  const filteredExports = [
@@ -1899,7 +1923,7 @@ var writeIndexFile = async ({
1899
1923
  await fs4.writeFile(
1900
1924
  destPath,
1901
1925
  `
1902
- import { Mastra } from '@mastra/core';
1926
+ import { Mastra } from '@mastra/core/mastra';
1903
1927
 
1904
1928
  export const mastra = new Mastra()
1905
1929
  `
@@ -1912,6 +1936,7 @@ export const mastra = new Mastra()
1912
1936
  import { Mastra } from '@mastra/core/mastra';
1913
1937
  import { PinoLogger } from '@mastra/loggers';
1914
1938
  import { LibSQLStore } from '@mastra/libsql';
1939
+ import { Observability } from '@mastra/observability';
1915
1940
  ${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
1916
1941
  ${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
1917
1942
  ${addScorers ? `import { toolCallAppropriatenessScorer, completenessScorer, translationScorer } from './scorers/weather-scorer';` : ""}
@@ -1919,6 +1944,7 @@ ${addScorers ? `import { toolCallAppropriatenessScorer, completenessScorer, tran
1919
1944
  export const mastra = new Mastra({
1920
1945
  ${filteredExports.join("\n ")}
1921
1946
  storage: new LibSQLStore({
1947
+ id: "mastra-storage",
1922
1948
  // stores observability, scores, ... into memory storage, if it needs to persist, change to file:../mastra.db
1923
1949
  url: ":memory:",
1924
1950
  }),
@@ -1926,10 +1952,10 @@ export const mastra = new Mastra({
1926
1952
  name: 'Mastra',
1927
1953
  level: 'info',
1928
1954
  }),
1929
- observability: {
1930
- // Enables DefaultExporter and CloudExporter for AI tracing
1955
+ observability: new Observability({
1956
+ // Enables DefaultExporter and CloudExporter for tracing
1931
1957
  default: { enabled: true },
1932
- },
1958
+ }),
1933
1959
  });
1934
1960
  `
1935
1961
  );
@@ -1968,7 +1994,7 @@ var writeAPIKey = async ({ provider, apiKey }) => {
1968
1994
  };
1969
1995
  var createMastraDir = async (directory) => {
1970
1996
  let dir = directory.trim().split("/").filter((item) => item !== "");
1971
- const dirPath = path.join(process.cwd(), ...dir, "mastra");
1997
+ const dirPath = path3.join(process.cwd(), ...dir, "mastra");
1972
1998
  try {
1973
1999
  await fs4.access(dirPath);
1974
2000
  return { ok: false };
@@ -1993,8 +2019,8 @@ var LLM_PROVIDERS = [
1993
2019
  { value: "cerebras", label: "Cerebras" },
1994
2020
  { value: "mistral", label: "Mistral" }
1995
2021
  ];
1996
- var interactivePrompt = async (args2 = {}) => {
1997
- const { skip = {}, options: { showBanner = true } = {} } = args2;
2022
+ var interactivePrompt = async (args = {}) => {
2023
+ const { skip = {}, options: { showBanner = true } = {} } = args;
1998
2024
  if (showBanner) {
1999
2025
  Ie(color2.inverse(" Mastra Init "));
2000
2026
  }
@@ -2032,46 +2058,29 @@ var interactivePrompt = async (args2 = {}) => {
2032
2058
  return void 0;
2033
2059
  },
2034
2060
  configureEditorWithDocsMCP: async () => {
2035
- const windsurfIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`windsurf`);
2036
- const cursorIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`cursor`);
2037
- const vscodeIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`vscode`);
2038
2061
  const editor = await ve({
2039
2062
  message: `Make your IDE into a Mastra expert? (Installs Mastra's MCP server)`,
2040
2063
  options: [
2041
2064
  { value: "skip", label: "Skip for now", hint: "default" },
2042
2065
  {
2043
2066
  value: "cursor",
2044
- label: "Cursor (project only)",
2045
- hint: cursorIsAlreadyInstalled ? `Already installed globally` : void 0
2067
+ label: "Cursor (project only)"
2046
2068
  },
2047
2069
  {
2048
2070
  value: "cursor-global",
2049
- label: "Cursor (global, all projects)",
2050
- hint: cursorIsAlreadyInstalled ? `Already installed` : void 0
2071
+ label: "Cursor (global, all projects)"
2051
2072
  },
2052
2073
  {
2053
2074
  value: "windsurf",
2054
- label: "Windsurf",
2055
- hint: windsurfIsAlreadyInstalled ? `Already installed` : void 0
2075
+ label: "Windsurf"
2056
2076
  },
2057
2077
  {
2058
2078
  value: "vscode",
2059
- label: "VSCode",
2060
- hint: vscodeIsAlreadyInstalled ? `Already installed` : void 0
2079
+ label: "VSCode"
2061
2080
  }
2062
2081
  ]
2063
2082
  });
2064
2083
  if (editor === `skip`) return void 0;
2065
- if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
2066
- M.message(`
2067
- Windsurf is already installed, skipping.`);
2068
- return void 0;
2069
- }
2070
- if (editor === `vscode` && vscodeIsAlreadyInstalled) {
2071
- M.message(`
2072
- VSCode is already installed, skipping.`);
2073
- return void 0;
2074
- }
2075
2084
  if (editor === `cursor`) {
2076
2085
  M.message(
2077
2086
  `
@@ -2148,19 +2157,23 @@ function createLogger(debug = false) {
2148
2157
  }
2149
2158
  var exec2 = util.promisify(child_process.exec);
2150
2159
  async function cloneTemplate(options) {
2151
- const { template, projectName, targetDir } = options;
2152
- const projectPath = targetDir ? path.resolve(targetDir, projectName) : path.resolve(projectName);
2160
+ const { template, projectName, targetDir, branch, llmProvider } = options;
2161
+ const projectPath = targetDir ? path3.resolve(targetDir, projectName) : path3.resolve(projectName);
2153
2162
  const spinner4 = yoctoSpinner({ text: `Cloning template "${template.title}"...` }).start();
2154
2163
  try {
2155
2164
  if (await directoryExists(projectPath)) {
2156
2165
  spinner4.error(`Directory ${projectName} already exists`);
2157
2166
  throw new Error(`Directory ${projectName} already exists`);
2158
2167
  }
2159
- await cloneRepositoryWithoutGit(template.githubUrl, projectPath);
2168
+ await cloneRepositoryWithoutGit(template.githubUrl, projectPath, branch);
2160
2169
  await updatePackageJson(projectPath, projectName);
2161
- const envExamplePath = path.join(projectPath, ".env.example");
2170
+ const envExamplePath = path3.join(projectPath, ".env.example");
2162
2171
  if (await fileExists(envExamplePath)) {
2163
- await fs4.copyFile(envExamplePath, path.join(projectPath, ".env"));
2172
+ const envPath = path3.join(projectPath, ".env");
2173
+ await fs4.copyFile(envExamplePath, envPath);
2174
+ if (llmProvider) {
2175
+ await updateEnvFile(envPath, llmProvider);
2176
+ }
2164
2177
  }
2165
2178
  spinner4.success(`Template "${template.title}" cloned successfully to ${projectName}`);
2166
2179
  return projectPath;
@@ -2185,21 +2198,27 @@ async function fileExists(filePath) {
2185
2198
  return false;
2186
2199
  }
2187
2200
  }
2188
- async function cloneRepositoryWithoutGit(repoUrl, targetPath) {
2201
+ async function cloneRepositoryWithoutGit(repoUrl, targetPath, branch) {
2189
2202
  await fs4.mkdir(targetPath, { recursive: true });
2190
2203
  try {
2191
2204
  const degitRepo = repoUrl.replace("https://github.com/", "");
2192
- const degitCommand = shellQuote2.quote(["npx", "degit", degitRepo, targetPath]);
2205
+ const degitRepoWithBranch = branch ? `${degitRepo}#${branch}` : degitRepo;
2206
+ const degitCommand = shellQuote2.quote(["npx", "degit", degitRepoWithBranch, targetPath]);
2193
2207
  await exec2(degitCommand, {
2194
2208
  cwd: process.cwd()
2195
2209
  });
2196
2210
  } catch {
2197
2211
  try {
2198
- const gitCommand = shellQuote2.quote(["git", "clone", repoUrl, targetPath]);
2212
+ const gitArgs = ["git", "clone"];
2213
+ if (branch) {
2214
+ gitArgs.push("--branch", branch);
2215
+ }
2216
+ gitArgs.push(repoUrl, targetPath);
2217
+ const gitCommand = shellQuote2.quote(gitArgs);
2199
2218
  await exec2(gitCommand, {
2200
2219
  cwd: process.cwd()
2201
2220
  });
2202
- const gitDir = path.join(targetPath, ".git");
2221
+ const gitDir = path3.join(targetPath, ".git");
2203
2222
  if (await directoryExists(gitDir)) {
2204
2223
  await fs4.rm(gitDir, { recursive: true, force: true });
2205
2224
  }
@@ -2209,7 +2228,7 @@ async function cloneRepositoryWithoutGit(repoUrl, targetPath) {
2209
2228
  }
2210
2229
  }
2211
2230
  async function updatePackageJson(projectPath, projectName) {
2212
- const packageJsonPath = path.join(projectPath, "package.json");
2231
+ const packageJsonPath = path3.join(projectPath, "package.json");
2213
2232
  try {
2214
2233
  const packageJsonContent = await fs4.readFile(packageJsonPath, "utf-8");
2215
2234
  const packageJson = JSON.parse(packageJsonContent);
@@ -2219,6 +2238,22 @@ async function updatePackageJson(projectPath, projectName) {
2219
2238
  logger.warn(`Could not update package.json: ${error instanceof Error ? error.message : "Unknown error"}`);
2220
2239
  }
2221
2240
  }
2241
+ async function updateEnvFile(envPath, llmProvider) {
2242
+ try {
2243
+ const envContent = await fs4.readFile(envPath, "utf-8");
2244
+ const modelString = getModelIdentifier(llmProvider);
2245
+ if (!modelString) {
2246
+ logger.warn(`Could not get model identifier for provider: ${llmProvider}`);
2247
+ return;
2248
+ }
2249
+ const modelValue = modelString.replace(/'/g, "");
2250
+ const updatedContent = envContent.replace(/^MODEL=.*/m, `MODEL=${modelValue}`);
2251
+ await fs4.writeFile(envPath, updatedContent, "utf-8");
2252
+ logger.info(`Updated MODEL in .env to ${modelValue}`);
2253
+ } catch (error) {
2254
+ logger.warn(`Could not update .env file: ${error instanceof Error ? error.message : "Unknown error"}`);
2255
+ }
2256
+ }
2222
2257
  async function installDependencies(projectPath, packageManager) {
2223
2258
  const spinner4 = yoctoSpinner({ text: "Installing dependencies..." }).start();
2224
2259
  try {
@@ -2303,9 +2338,11 @@ var init = async ({
2303
2338
  llmProvider = "openai",
2304
2339
  llmApiKey,
2305
2340
  addExample = false,
2306
- configureEditorWithDocsMCP
2341
+ configureEditorWithDocsMCP,
2342
+ versionTag
2307
2343
  }) => {
2308
2344
  s.start("Initializing Mastra");
2345
+ const packageVersionTag = versionTag ? `@${versionTag}` : "";
2309
2346
  try {
2310
2347
  const result = await createMastraDir(directory);
2311
2348
  if (!result.ok) {
@@ -2333,30 +2370,31 @@ var init = async ({
2333
2370
  const depService = new DepsService();
2334
2371
  const needsLibsql = await depService.checkDependencies(["@mastra/libsql"]) !== `ok`;
2335
2372
  if (needsLibsql) {
2336
- await depService.installPackages(["@mastra/libsql"]);
2373
+ await depService.installPackages([`@mastra/libsql${packageVersionTag}`]);
2337
2374
  }
2338
2375
  const needsMemory = components.includes(`agents`) && await depService.checkDependencies(["@mastra/memory"]) !== `ok`;
2339
2376
  if (needsMemory) {
2340
- await depService.installPackages(["@mastra/memory"]);
2377
+ await depService.installPackages([`@mastra/memory${packageVersionTag}`]);
2341
2378
  }
2342
2379
  const needsLoggers = await depService.checkDependencies(["@mastra/loggers"]) !== `ok`;
2343
2380
  if (needsLoggers) {
2344
- await depService.installPackages(["@mastra/loggers"]);
2381
+ await depService.installPackages([`@mastra/loggers${packageVersionTag}`]);
2345
2382
  }
2346
2383
  const needsObservability = await depService.checkDependencies(["@mastra/observability"]) !== `ok`;
2347
2384
  if (needsObservability) {
2348
- await depService.installPackages(["@mastra/observability"]);
2385
+ await depService.installPackages([`@mastra/observability${packageVersionTag}`]);
2349
2386
  }
2350
2387
  const needsEvals = components.includes(`scorers`) && await depService.checkDependencies(["@mastra/evals"]) !== `ok`;
2351
2388
  if (needsEvals) {
2352
- await depService.installPackages(["@mastra/evals"]);
2389
+ await depService.installPackages([`@mastra/evals${packageVersionTag}`]);
2353
2390
  }
2354
2391
  }
2355
2392
  const key = await getAPIKey(llmProvider || "openai");
2356
2393
  if (configureEditorWithDocsMCP) {
2357
2394
  await installMastraDocsMCPServer({
2358
2395
  editor: configureEditorWithDocsMCP,
2359
- directory: process.cwd()
2396
+ directory: process.cwd(),
2397
+ versionTag
2360
2398
  });
2361
2399
  }
2362
2400
  s.stop();
@@ -2495,7 +2533,7 @@ var createMastraProject = async ({
2495
2533
  s2.start(`Installing ${pm} dependencies`);
2496
2534
  try {
2497
2535
  await exec3(`${pm} ${installCommand} zod@^4`);
2498
- await exec3(`${pm} ${installCommand} typescript @types/node --save-dev`);
2536
+ await exec3(`${pm} ${installCommand} -D typescript @types/node`);
2499
2537
  await exec3(`echo '{
2500
2538
  "compilerOptions": {
2501
2539
  "target": "ES2022",
@@ -2561,39 +2599,48 @@ var createMastraProject = async ({
2561
2599
  process.exit(1);
2562
2600
  }
2563
2601
  };
2564
- var create = async (args2) => {
2565
- if (args2.template !== void 0) {
2566
- await createFromTemplate({ ...args2, injectedAnalytics: args2.analytics });
2602
+ var version$1 = package_default.version;
2603
+ var create = async (args) => {
2604
+ if (args.template !== void 0) {
2605
+ await createFromTemplate({
2606
+ projectName: args.projectName,
2607
+ template: args.template,
2608
+ timeout: args.timeout,
2609
+ injectedAnalytics: args.analytics,
2610
+ llmProvider: args.llmProvider
2611
+ });
2567
2612
  return;
2568
2613
  }
2569
- const needsInteractive = args2.components === void 0 || args2.llmProvider === void 0 || args2.addExample === void 0;
2614
+ const needsInteractive = args.components === void 0 || args.llmProvider === void 0 || args.addExample === void 0;
2570
2615
  const { projectName, result } = await createMastraProject({
2571
- projectName: args2?.projectName,
2572
- createVersionTag: args2?.createVersionTag,
2573
- timeout: args2?.timeout,
2574
- llmProvider: args2?.llmProvider,
2575
- llmApiKey: args2?.llmApiKey,
2616
+ projectName: args?.projectName,
2617
+ createVersionTag: args?.createVersionTag,
2618
+ timeout: args?.timeout,
2619
+ llmProvider: args?.llmProvider,
2620
+ llmApiKey: args?.llmApiKey,
2576
2621
  needsInteractive
2577
2622
  });
2578
- const directory = args2.directory || "src/";
2623
+ const directory = args.directory || "src/";
2579
2624
  if (needsInteractive && result) {
2580
2625
  await init({
2581
2626
  ...result,
2582
2627
  llmApiKey: result?.llmApiKey,
2583
2628
  components: ["agents", "tools", "workflows", "scorers"],
2584
- addExample: true
2629
+ addExample: true,
2630
+ versionTag: args.createVersionTag
2585
2631
  });
2586
2632
  postCreate({ projectName });
2587
2633
  return;
2588
2634
  }
2589
- const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args2;
2635
+ const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args;
2590
2636
  await init({
2591
2637
  directory,
2592
2638
  components,
2593
2639
  llmProvider,
2594
2640
  addExample,
2595
2641
  llmApiKey,
2596
- configureEditorWithDocsMCP: args2.mcpServer
2642
+ configureEditorWithDocsMCP: args.mcpServer,
2643
+ versionTag: args.createVersionTag
2597
2644
  });
2598
2645
  postCreate({ projectName });
2599
2646
  };
@@ -2684,9 +2731,9 @@ async function createFromGitHubUrl(url) {
2684
2731
  workflows: []
2685
2732
  };
2686
2733
  }
2687
- async function createFromTemplate(args2) {
2734
+ async function createFromTemplate(args) {
2688
2735
  let selectedTemplate;
2689
- if (args2.template === true) {
2736
+ if (args.template === true) {
2690
2737
  const templates = await loadTemplates();
2691
2738
  const selected = await selectTemplate(templates);
2692
2739
  if (!selected) {
@@ -2694,11 +2741,11 @@ async function createFromTemplate(args2) {
2694
2741
  return;
2695
2742
  }
2696
2743
  selectedTemplate = selected;
2697
- } else if (args2.template && typeof args2.template === "string") {
2698
- if (isGitHubUrl(args2.template)) {
2744
+ } else if (args.template && typeof args.template === "string") {
2745
+ if (isGitHubUrl(args.template)) {
2699
2746
  const spinner4 = Y();
2700
2747
  spinner4.start("Validating GitHub repository...");
2701
- const validation = await validateGitHubProject(args2.template);
2748
+ const validation = await validateGitHubProject(args.template);
2702
2749
  if (!validation.isValid) {
2703
2750
  spinner4.stop("Validation failed");
2704
2751
  M.error("This does not appear to be a valid Mastra project:");
@@ -2706,14 +2753,14 @@ async function createFromTemplate(args2) {
2706
2753
  throw new Error("Invalid Mastra project");
2707
2754
  }
2708
2755
  spinner4.stop("Valid Mastra project \u2713");
2709
- selectedTemplate = await createFromGitHubUrl(args2.template);
2756
+ selectedTemplate = await createFromGitHubUrl(args.template);
2710
2757
  } else {
2711
2758
  const templates = await loadTemplates();
2712
- const found = findTemplateByName(templates, args2.template);
2759
+ const found = findTemplateByName(templates, args.template);
2713
2760
  if (!found) {
2714
- M.error(`Template "${args2.template}" not found. Available templates:`);
2761
+ M.error(`Template "${args.template}" not found. Available templates:`);
2715
2762
  templates.forEach((t) => M.info(` - ${t.title} (use: ${t.slug.replace("template-", "")})`));
2716
- throw new Error(`Template "${args2.template}" not found`);
2763
+ throw new Error(`Template "${args.template}" not found`);
2717
2764
  }
2718
2765
  selectedTemplate = found;
2719
2766
  }
@@ -2721,7 +2768,7 @@ async function createFromTemplate(args2) {
2721
2768
  if (!selectedTemplate) {
2722
2769
  throw new Error("No template selected");
2723
2770
  }
2724
- let projectName = args2.projectName;
2771
+ let projectName = args.projectName;
2725
2772
  if (!projectName) {
2726
2773
  const defaultName = getDefaultProjectName(selectedTemplate);
2727
2774
  const response = await he({
@@ -2735,17 +2782,40 @@ async function createFromTemplate(args2) {
2735
2782
  }
2736
2783
  projectName = response;
2737
2784
  }
2785
+ let llmProvider = args.llmProvider;
2786
+ if (!llmProvider) {
2787
+ const providerResponse = await ve({
2788
+ message: "Select a default provider:",
2789
+ options: LLM_PROVIDERS
2790
+ });
2791
+ if (pD(providerResponse)) {
2792
+ M.info("Project creation cancelled.");
2793
+ return;
2794
+ }
2795
+ llmProvider = providerResponse;
2796
+ }
2738
2797
  try {
2739
- const analytics = args2.injectedAnalytics || getAnalytics();
2798
+ const analytics = args.injectedAnalytics || getAnalytics();
2740
2799
  if (analytics) {
2741
2800
  analytics.trackEvent("cli_template_used", {
2742
2801
  template_slug: selectedTemplate.slug,
2743
2802
  template_title: selectedTemplate.title
2744
2803
  });
2804
+ if (llmProvider) {
2805
+ analytics.trackEvent("cli_model_provider_selected", {
2806
+ provider: llmProvider,
2807
+ selection_method: args.llmProvider ? "cli_args" : "interactive"
2808
+ });
2809
+ }
2745
2810
  }
2811
+ const isBeta = version$1?.includes("beta") ?? false;
2812
+ const isMastraTemplate = selectedTemplate.githubUrl.includes("github.com/mastra-ai/");
2813
+ const branch = isBeta && isMastraTemplate ? "beta" : void 0;
2746
2814
  const projectPath = await cloneTemplate({
2747
2815
  template: selectedTemplate,
2748
- projectName
2816
+ projectName,
2817
+ branch,
2818
+ llmProvider
2749
2819
  });
2750
2820
  await installDependencies(projectPath);
2751
2821
  Me(`
@@ -2764,7 +2834,7 @@ async function createFromTemplate(args2) {
2764
2834
  async function getPackageVersion() {
2765
2835
  const __filename = fileURLToPath(import.meta.url);
2766
2836
  const __dirname = dirname(__filename);
2767
- const pkgJsonPath = path.join(__dirname, "..", "package.json");
2837
+ const pkgJsonPath = path3.join(__dirname, "..", "package.json");
2768
2838
  const content = await fsExtra$1.readJSON(pkgJsonPath);
2769
2839
  return content.version;
2770
2840
  }