create-mastra 0.0.0-span-scorring-test-20251124132129 → 0.0.0-standard-schema-20260126101119

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
@@ -18,12 +18,12 @@ import tty from 'node:tty';
18
18
  import fsExtra, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
19
19
  import prettier from 'prettier';
20
20
  import { execa } from 'execa';
21
+ import fsExtra$1 from 'fs-extra';
21
22
  import pino from 'pino';
22
23
  import pretty from 'pino-pretty';
23
- import fsExtra$1 from 'fs-extra';
24
24
 
25
- var __filename = fileURLToPath(import.meta.url);
26
- var __dirname = path3.dirname(__filename);
25
+ var __filename$1 = fileURLToPath(import.meta.url);
26
+ var __dirname$1 = path3.dirname(__filename$1);
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 = path3.join(__dirname, "mastra-cli.json");
42
+ const cliConfigPath = path3.join(__dirname$1, "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(path3.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
70
+ writeFileSync(path3.join(__dirname$1, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
71
71
  } catch {
72
72
  }
73
73
  }
@@ -105,6 +105,10 @@ var PosthogAnalytics = class {
105
105
  machine_id: os.hostname()
106
106
  };
107
107
  }
108
+ getDurationMs(startTime) {
109
+ const [seconds, nanoseconds] = process.hrtime(startTime);
110
+ return seconds * 1e3 + nanoseconds / 1e6;
111
+ }
108
112
  captureSessionStart() {
109
113
  if (!this.client) {
110
114
  return;
@@ -173,8 +177,7 @@ var PosthogAnalytics = class {
173
177
  const startTime = process.hrtime();
174
178
  try {
175
179
  const result = await execution();
176
- const [seconds, nanoseconds] = process.hrtime(startTime);
177
- const durationMs = seconds * 1e3 + nanoseconds / 1e6;
180
+ const durationMs = this.getDurationMs(startTime);
178
181
  this.trackCommand({
179
182
  command,
180
183
  args,
@@ -184,8 +187,7 @@ var PosthogAnalytics = class {
184
187
  });
185
188
  return result;
186
189
  } catch (error) {
187
- const [seconds, nanoseconds] = process.hrtime(startTime);
188
- const durationMs = seconds * 1e3 + nanoseconds / 1e6;
190
+ const durationMs = this.getDurationMs(startTime);
189
191
  this.trackCommand({
190
192
  command,
191
193
  args,
@@ -382,7 +384,7 @@ function DD({onlyFirst:e=false}={}){const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:
382
384
  `).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=Y$1(this._render(this)??"",process.stdout.columns,{hard:true});if(u!==this._prevFrame){if(this.state==="initial")this.output.write(srcExports.cursor.hide);else {const t=BD(this._prevFrame,u);if(this.restoreCursor(),t&&t?.length===1){const F=t[0];this.output.write(srcExports.cursor.move(0,F)),this.output.write(srcExports.erase.lines(1));const s=u.split(`
383
385
  `);this.output.write(s[F]),this._prevFrame=u,this.output.write(srcExports.cursor.move(0,s.length-F-1));return}if(t&&t?.length>1){const F=t[0];this.output.write(srcExports.cursor.move(0,F)),this.output.write(srcExports.erase.down());const s=u.split(`
384
386
  `).slice(F);this.output.write(s.join(`
385
- `)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}var OD=Object.defineProperty,PD=(e,u,t)=>u in e?OD(e,u,{enumerable:true,configurable:true,writable:true,value:t}):e[u]=t,J=(e,u,t)=>(PD(e,typeof u!="symbol"?u+"":u,t),t);class LD extends x{constructor(u){super(u,false),J(this,"options"),J(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:t})=>t===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",t=>{switch(t){case "left":case "up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case "down":case "right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}this.changeValue();});}get _value(){return this.options[this.cursor]}changeValue(){this.value=this._value.value;}}class RD extends x{get valueWithCursor(){if(this.state==="submit")return this.value;if(this.cursor>=this.value.length)return `${this.value}\u2588`;const u=this.value.slice(0,this.cursor),[t,...F]=this.value.slice(this.cursor);return `${u}${color2.inverse(t)}${F.join("")}`}get cursor(){return this._cursor}constructor(u){super(u),this.on("finalize",()=>{this.value||(this.value=u.defaultValue);});}}
387
+ `)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}class dD extends x{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(u){super(u,false),this.value=!!u.initialValue,this.on("value",()=>{this.value=this._value;}),this.on("confirm",t=>{this.output.write(srcExports.cursor.move(0,-1)),this.value=t,this.state="submit",this.close();}),this.on("cursor",()=>{this.value=!this.value;});}}var OD=Object.defineProperty,PD=(e,u,t)=>u in e?OD(e,u,{enumerable:true,configurable:true,writable:true,value:t}):e[u]=t,J=(e,u,t)=>(PD(e,typeof u!="symbol"?u+"":u,t),t);class LD extends x{constructor(u){super(u,false),J(this,"options"),J(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:t})=>t===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",t=>{switch(t){case "left":case "up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case "down":case "right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}this.changeValue();});}get _value(){return this.options[this.cursor]}changeValue(){this.value=this._value.value;}}class RD extends x{get valueWithCursor(){if(this.state==="submit")return this.value;if(this.cursor>=this.value.length)return `${this.value}\u2588`;const u=this.value.slice(0,this.cursor),[t,...F]=this.value.slice(this.cursor);return `${u}${color2.inverse(t)}${F.join("")}`}get cursor(){return this._cursor}constructor(u){super(u),this.on("finalize",()=>{this.value||(this.value=u.defaultValue);});}}
386
388
 
387
389
  function ce(){return y$1.platform!=="win32"?y$1.env.TERM!=="linux":!!y$1.env.CI||!!y$1.env.WT_SESSION||!!y$1.env.TERMINUS_SUBLIME||y$1.env.ConEmuTask==="{cmd::Cmder}"||y$1.env.TERM_PROGRAM==="Terminus-Sublime"||y$1.env.TERM_PROGRAM==="vscode"||y$1.env.TERM==="xterm-256color"||y$1.env.TERM==="alacritty"||y$1.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const V=ce(),u=(t,n)=>V?t:n,le=u("\u25C6","*"),L=u("\u25A0","x"),W=u("\u25B2","x"),C=u("\u25C7","o"),ue=u("\u250C","T"),o=u("\u2502","|"),d=u("\u2514","\u2014"),k=u("\u25CF",">"),P=u("\u25CB"," "),_=u("\u2500","-"),me=u("\u256E","+"),de=u("\u251C","+"),pe=u("\u256F","+"),q=u("\u25CF","\u2022"),D=u("\u25C6","*"),U=u("\u25B2","!"),K=u("\u25A0","x"),b=t=>{switch(t){case "initial":case "active":return color2.cyan(le);case "cancel":return color2.red(L);case "error":return color2.yellow(W);case "submit":return color2.green(C)}},G=t=>{const{cursor:n,options:r,style:i}=t,s=t.maxItems??Number.POSITIVE_INFINITY,c=Math.max(process.stdout.rows-4,0),a=Math.min(c,Math.max(s,5));let l=0;n>=l+a-3?l=Math.max(Math.min(n-a+3,r.length-a),0):n<l+2&&(l=Math.max(n-2,0));const $=a<r.length&&l>0,g=a<r.length&&l+a<r.length;return r.slice(l,l+a).map((p,v,f)=>{const j=v===0&&$,E=v===f.length-1&&g;return j||E?color2.dim("..."):i(p,v+l===n)})},he=t=>new RD({validate:t.validate,placeholder:t.placeholder,defaultValue:t.defaultValue,initialValue:t.initialValue,render(){const n=`${color2.gray(o)}
388
390
  ${b(this.state)} ${t.message}
@@ -392,7 +394,12 @@ ${color2.yellow(d)} ${color2.yellow(this.error)}
392
394
  `;case "submit":return `${n}${color2.gray(o)} ${color2.dim(this.value||t.placeholder)}`;case "cancel":return `${n}${color2.gray(o)} ${color2.strikethrough(color2.dim(this.value??""))}${this.value?.trim()?`
393
395
  ${color2.gray(o)}`:""}`;default:return `${n}${color2.cyan(o)} ${i}
394
396
  ${color2.cyan(d)}
395
- `}}}).prompt(),ve=t=>{const n=(r,i)=>{const s=r.label??String(r.value);switch(i){case "selected":return `${color2.dim(s)}`;case "active":return `${color2.green(k)} ${s} ${r.hint?color2.dim(`(${r.hint})`):""}`;case "cancelled":return `${color2.strikethrough(color2.dim(s))}`;default:return `${color2.dim(P)} ${color2.dim(s)}`}};return new LD({options:t.options,initialValue:t.initialValue,render(){const r=`${color2.gray(o)}
397
+ `}}}).prompt(),ye=t=>{const n=t.active??"Yes",r=t.inactive??"No";return new dD({active:n,inactive:r,initialValue:t.initialValue??true,render(){const i=`${color2.gray(o)}
398
+ ${b(this.state)} ${t.message}
399
+ `,s=this.value?n:r;switch(this.state){case "submit":return `${i}${color2.gray(o)} ${color2.dim(s)}`;case "cancel":return `${i}${color2.gray(o)} ${color2.strikethrough(color2.dim(s))}
400
+ ${color2.gray(o)}`;default:return `${i}${color2.cyan(o)} ${this.value?`${color2.green(k)} ${n}`:`${color2.dim(P)} ${color2.dim(n)}`} ${color2.dim("/")} ${this.value?`${color2.dim(P)} ${color2.dim(r)}`:`${color2.green(k)} ${r}`}
401
+ ${color2.cyan(d)}
402
+ `}}}).prompt()},ve=t=>{const n=(r,i)=>{const s=r.label??String(r.value);switch(i){case "selected":return `${color2.dim(s)}`;case "active":return `${color2.green(k)} ${s} ${r.hint?color2.dim(`(${r.hint})`):""}`;case "cancelled":return `${color2.strikethrough(color2.dim(s))}`;default:return `${color2.dim(P)} ${color2.dim(s)}`}};return new LD({options:t.options,initialValue:t.initialValue,render(){const r=`${color2.gray(o)}
396
403
  ${b(this.state)} ${t.message}
397
404
  `;switch(this.state){case "submit":return `${r}${color2.gray(o)} ${n(this.options[this.cursor],"selected")}`;case "cancel":return `${r}${color2.gray(o)} ${n(this.options[this.cursor],"cancelled")}
398
405
  ${color2.gray(o)}`;default:return `${r}${color2.cyan(o)} ${G({cursor:this.cursor,options:this.options,maxItems:t.maxItems,style:(i,s)=>n(i,s?"active":"inactive")}).join(`
@@ -1139,10 +1146,15 @@ var MastraLogger = class {
1139
1146
  }
1140
1147
  };
1141
1148
 
1142
- var PinoLogger = class extends MastraLogger {
1149
+ var PinoLogger = class _PinoLogger extends MastraLogger {
1143
1150
  logger;
1144
1151
  constructor(options = {}) {
1145
1152
  super(options);
1153
+ const internalOptions = options;
1154
+ if (internalOptions._logger) {
1155
+ this.logger = internalOptions._logger;
1156
+ return;
1157
+ }
1146
1158
  let prettyStream = void 0;
1147
1159
  if (!options.overrideDefaultTransports) {
1148
1160
  prettyStream = pretty({
@@ -1159,7 +1171,8 @@ var PinoLogger = class extends MastraLogger {
1159
1171
  {
1160
1172
  name: options.name || "app",
1161
1173
  level: options.level || LogLevel.INFO,
1162
- formatters: options.formatters
1174
+ formatters: options.formatters,
1175
+ redact: options.redact
1163
1176
  },
1164
1177
  options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? prettyStream : pino.multistream([
1165
1178
  ...transportsAry.map(([, transport]) => ({
@@ -1173,6 +1186,38 @@ var PinoLogger = class extends MastraLogger {
1173
1186
  ])
1174
1187
  );
1175
1188
  }
1189
+ /**
1190
+ * Creates a child logger with additional bound context.
1191
+ * All logs from the child logger will include the bound context.
1192
+ *
1193
+ * @param bindings - Key-value pairs to include in all logs from this child logger
1194
+ * @returns A new PinoLogger instance with the bound context
1195
+ *
1196
+ * @example
1197
+ * ```typescript
1198
+ * const baseLogger = new PinoLogger({ name: 'MyApp' });
1199
+ *
1200
+ * // Create module-scoped logger
1201
+ * const serviceLogger = baseLogger.child({ module: 'UserService' });
1202
+ * serviceLogger.info('User created', { userId: '123' });
1203
+ * // Output includes: { module: 'UserService', userId: '123', msg: 'User created' }
1204
+ *
1205
+ * // Create request-scoped logger
1206
+ * const requestLogger = baseLogger.child({ requestId: req.id });
1207
+ * requestLogger.error('Request failed', { err: error });
1208
+ * // Output includes: { requestId: 'abc', msg: 'Request failed', err: {...} }
1209
+ * ```
1210
+ */
1211
+ child(bindings) {
1212
+ const childPino = this.logger.child(bindings);
1213
+ const childOptions = {
1214
+ name: this.name,
1215
+ level: this.level,
1216
+ transports: Object.fromEntries(this.transports),
1217
+ _logger: childPino
1218
+ };
1219
+ return new _PinoLogger(childOptions);
1220
+ }
1176
1221
  debug(message, args = {}) {
1177
1222
  this.logger.debug(args, message);
1178
1223
  }
@@ -1188,7 +1233,7 @@ var PinoLogger = class extends MastraLogger {
1188
1233
  };
1189
1234
 
1190
1235
  var package_default = {
1191
- version: "1.0.0-beta.3"};
1236
+ version: "1.0.1"};
1192
1237
  function getPackageManagerAddCommand(pm) {
1193
1238
  switch (pm) {
1194
1239
  case "npm":
@@ -1209,7 +1254,7 @@ var DepsService = class {
1209
1254
  this.packageManager = this.getPackageManager();
1210
1255
  }
1211
1256
  findLockFile(dir) {
1212
- const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
1257
+ const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock", "bun.lockb"];
1213
1258
  for (const file of lockFiles) {
1214
1259
  if (fs3__default__default.existsSync(path3.join(dir, file))) {
1215
1260
  return file;
@@ -1231,6 +1276,7 @@ var DepsService = class {
1231
1276
  case "yarn.lock":
1232
1277
  return "yarn";
1233
1278
  case "bun.lock":
1279
+ case "bun.lockb":
1234
1280
  return "bun";
1235
1281
  default:
1236
1282
  return "npm";
@@ -1448,6 +1494,7 @@ async function writeMergedConfig(configPath, editor, versionTag) {
1448
1494
  });
1449
1495
  }
1450
1496
  var windsurfGlobalMCPConfigPath = path3.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
1497
+ var antigravityGlobalMCPConfigPath = path3.join(os.homedir(), ".gemini", "antigravity", "mcp_config.json");
1451
1498
  var cursorGlobalMCPConfigPath = path3.join(os.homedir(), ".cursor", "mcp.json");
1452
1499
  path3.join(process.cwd(), ".vscode", "mcp.json");
1453
1500
  var vscodeGlobalMCPConfigPath = path3.join(
@@ -1479,11 +1526,20 @@ async function installMastraDocsMCPServer({
1479
1526
  }
1480
1527
  await writeMergedConfig(windsurfGlobalMCPConfigPath, editor, versionTag);
1481
1528
  }
1529
+ if (editor === `antigravity`) {
1530
+ const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
1531
+ if (alreadyInstalled) {
1532
+ return;
1533
+ }
1534
+ await writeMergedConfig(antigravityGlobalMCPConfigPath, editor, versionTag);
1535
+ }
1482
1536
  }
1483
1537
  async function globalMCPIsAlreadyInstalled(editor, versionTag) {
1484
1538
  let configPath = ``;
1485
1539
  if (editor === "windsurf") {
1486
1540
  configPath = windsurfGlobalMCPConfigPath;
1541
+ } else if (editor === "antigravity") {
1542
+ configPath = antigravityGlobalMCPConfigPath;
1487
1543
  } else if (editor === "cursor-global") {
1488
1544
  configPath = cursorGlobalMCPConfigPath;
1489
1545
  } else if (editor === "vscode") {
@@ -1547,7 +1603,6 @@ async function writeAgentSample(llmProvider, destPath, addExampleTool, addScorer
1547
1603
  const content = `
1548
1604
  import { Agent } from '@mastra/core/agent';
1549
1605
  import { Memory } from '@mastra/memory';
1550
- import { LibSQLStore } from '@mastra/libsql';
1551
1606
  ${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
1552
1607
  ${addScorers ? `import { scorers } from '../scorers/weather-scorer';` : ""}
1553
1608
 
@@ -1580,12 +1635,7 @@ export const weatherAgent = new Agent({
1580
1635
  },
1581
1636
  },
1582
1637
  },` : ""}
1583
- memory: new Memory({
1584
- storage: new LibSQLStore({
1585
- id: "memory-storage",
1586
- url: "file:../mastra.db", // path is relative to the .mastra/output directory
1587
- })
1588
- })
1638
+ memory: new Memory()
1589
1639
  });
1590
1640
  `;
1591
1641
  const formattedContent = await prettier.format(content, {
@@ -1936,7 +1986,7 @@ export const mastra = new Mastra()
1936
1986
  import { Mastra } from '@mastra/core/mastra';
1937
1987
  import { PinoLogger } from '@mastra/loggers';
1938
1988
  import { LibSQLStore } from '@mastra/libsql';
1939
- import { Observability } from '@mastra/observability';
1989
+ import { Observability, DefaultExporter, CloudExporter, SensitiveDataFilter } from '@mastra/observability';
1940
1990
  ${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
1941
1991
  ${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
1942
1992
  ${addScorers ? `import { toolCallAppropriatenessScorer, completenessScorer, translationScorer } from './scorers/weather-scorer';` : ""}
@@ -1953,9 +2003,19 @@ export const mastra = new Mastra({
1953
2003
  level: 'info',
1954
2004
  }),
1955
2005
  observability: new Observability({
1956
- // Enables DefaultExporter and CloudExporter for tracing
1957
- default: { enabled: true },
1958
- }),
2006
+ configs: {
2007
+ default: {
2008
+ serviceName: 'mastra',
2009
+ exporters: [
2010
+ new DefaultExporter(), // Persists traces to storage for Mastra Studio
2011
+ new CloudExporter(), // Sends traces to Mastra Cloud (if MASTRA_CLOUD_ACCESS_TOKEN is set)
2012
+ ],
2013
+ spanOutputProcessors: [
2014
+ new SensitiveDataFilter(), // Redacts sensitive data like passwords, tokens, keys
2015
+ ],
2016
+ },
2017
+ },
2018
+ }),
1959
2019
  });
1960
2020
  `
1961
2021
  );
@@ -2077,6 +2137,10 @@ var interactivePrompt = async (args = {}) => {
2077
2137
  {
2078
2138
  value: "vscode",
2079
2139
  label: "VSCode"
2140
+ },
2141
+ {
2142
+ value: "antigravity",
2143
+ label: "Antigravity"
2080
2144
  }
2081
2145
  ]
2082
2146
  });
@@ -2089,19 +2153,19 @@ Note: you will need to go into Cursor Settings -> MCP Settings and manually enab
2089
2153
  );
2090
2154
  }
2091
2155
  if (editor === `cursor-global`) {
2092
- const confirm = await ve({
2156
+ const confirm3 = await ve({
2093
2157
  message: `Global install will add/update ${cursorGlobalMCPConfigPath} and make the Mastra docs MCP server available in all your Cursor projects. Continue?`,
2094
2158
  options: [
2095
2159
  { value: "yes", label: "Yes, I understand" },
2096
2160
  { value: "skip", label: "No, skip for now" }
2097
2161
  ]
2098
2162
  });
2099
- if (confirm !== `yes`) {
2163
+ if (confirm3 !== `yes`) {
2100
2164
  return void 0;
2101
2165
  }
2102
2166
  }
2103
2167
  if (editor === `windsurf`) {
2104
- const confirm = await ve({
2168
+ const confirm3 = await ve({
2105
2169
  message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
2106
2170
  This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
2107
2171
  options: [
@@ -2109,11 +2173,31 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
2109
2173
  { value: "skip", label: "No, skip for now" }
2110
2174
  ]
2111
2175
  });
2112
- if (confirm !== `yes`) {
2176
+ if (confirm3 !== `yes`) {
2177
+ return void 0;
2178
+ }
2179
+ }
2180
+ if (editor === `antigravity`) {
2181
+ const confirm3 = await ve({
2182
+ message: `Antigravity only supports a global MCP config (at ${antigravityGlobalMCPConfigPath}). Is it ok to add/update that global config?
2183
+ This will make the Mastra docs MCP server available in all Antigravity projects.`,
2184
+ options: [
2185
+ { value: "yes", label: "Yes, I understand" },
2186
+ { value: "skip", label: "No, skip for now" }
2187
+ ]
2188
+ });
2189
+ if (confirm3 !== `yes`) {
2113
2190
  return void 0;
2114
2191
  }
2115
2192
  }
2116
2193
  return editor;
2194
+ },
2195
+ initGit: async () => {
2196
+ if (skip?.gitInit) return false;
2197
+ return ye({
2198
+ message: "Initialize a new git repository?",
2199
+ initialValue: true
2200
+ });
2117
2201
  }
2118
2202
  },
2119
2203
  {
@@ -2154,6 +2238,20 @@ function getPackageManager() {
2154
2238
  }
2155
2239
  return "npm";
2156
2240
  }
2241
+ async function gitInit({ cwd }) {
2242
+ await execa("git", ["init"], { cwd, stdio: "ignore" });
2243
+ await execa("git", ["add", "-A"], { cwd, stdio: "ignore" });
2244
+ await execa(
2245
+ "git",
2246
+ [
2247
+ "commit",
2248
+ "-m",
2249
+ '"Initial commit from Mastra"',
2250
+ '--author="dane-ai-mastra[bot] <dane-ai-mastra[bot]@users.noreply.github.com>"'
2251
+ ],
2252
+ { cwd, stdio: "ignore" }
2253
+ );
2254
+ }
2157
2255
  var logger = createLogger(false);
2158
2256
  function createLogger(debug = false) {
2159
2257
  return new PinoLogger({
@@ -2345,7 +2443,8 @@ var init = async ({
2345
2443
  llmApiKey,
2346
2444
  addExample = false,
2347
2445
  configureEditorWithDocsMCP,
2348
- versionTag
2446
+ versionTag,
2447
+ initGit = false
2349
2448
  }) => {
2350
2449
  s.start("Initializing Mastra");
2351
2450
  const packageVersionTag = versionTag ? `@${versionTag}` : "";
@@ -2404,6 +2503,16 @@ var init = async ({
2404
2503
  });
2405
2504
  }
2406
2505
  s.stop();
2506
+ if (initGit) {
2507
+ const s2 = Y();
2508
+ try {
2509
+ s2.start("Initializing git repository");
2510
+ await gitInit({ cwd: process.cwd() });
2511
+ s2.stop("Git repository initialized");
2512
+ } catch {
2513
+ s2.stop();
2514
+ }
2515
+ }
2407
2516
  if (!llmApiKey) {
2408
2517
  Me(`
2409
2518
  ${color2.green("Mastra initialized successfully!")}
@@ -2475,6 +2584,42 @@ async function initializePackageJson(pm) {
2475
2584
  };
2476
2585
  await fs4.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
2477
2586
  }
2587
+ var writeReadmeFile = async ({ dirPath, projectName }) => {
2588
+ const packageManager = getPackageManager();
2589
+ const readmePath = path3.join(dirPath, "README.md");
2590
+ const content = `# ${projectName}
2591
+
2592
+ Welcome to your new [Mastra](https://mastra.ai/) project! We're excited to see what you'll build.
2593
+
2594
+ ## Getting Started
2595
+
2596
+ Start the development server:
2597
+
2598
+ \`\`\`shell
2599
+ ${packageManager} run dev
2600
+ \`\`\`
2601
+
2602
+ Open [http://localhost:4111](http://localhost:4111) in your browser to access [Mastra Studio](https://mastra.ai/docs/getting-started/studio). It provides an interactive UI for building and testing your agents, along with a REST API that exposes your Mastra application as a local service. This lets you start building without worrying about integration right away.
2603
+
2604
+ You can start editing files inside the \`src/mastra\` directory. The development server will automatically reload whenever you make changes.
2605
+
2606
+ ## Learn more
2607
+
2608
+ To learn more about Mastra, visit our [documentation](https://mastra.ai/docs/). Your bootstrapped project includes example code for [agents](https://mastra.ai/docs/agents/overview), [tools](https://mastra.ai/docs/agents/using-tools), [workflows](https://mastra.ai/docs/workflows/overview), [scorers](https://mastra.ai/docs/evals/overview), and [observability](https://mastra.ai/docs/observability/overview).
2609
+
2610
+ If you're new to AI agents, check out our [course](https://mastra.ai/course) and [YouTube videos](https://youtube.com/@mastra-ai). You can also join our [Discord](https://discord.gg/BTYqqHKUrf) community to get help and share your projects.
2611
+
2612
+ ## Deploy on Mastra Cloud
2613
+
2614
+ [Mastra Cloud](https://cloud.mastra.ai/) gives you a serverless agent environment with atomic deployments. Access your agents from anywhere and monitor performance. Make sure they don't go off the rails with evals and tracing.
2615
+
2616
+ Check out the [deployment guide](https://mastra.ai/docs/deployment/overview) for more details.`;
2617
+ const formattedContent = await prettier.format(content, {
2618
+ parser: "markdown",
2619
+ singleQuote: true
2620
+ });
2621
+ await fs4.writeFile(readmePath, formattedContent);
2622
+ };
2478
2623
  async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
2479
2624
  let installCommand = getPackageManagerAddCommand(pm);
2480
2625
  if (isDev) {
@@ -2521,7 +2666,7 @@ var createMastraProject = async ({
2521
2666
  xe("Operation cancelled");
2522
2667
  process.exit(0);
2523
2668
  }
2524
- let result;
2669
+ let result = void 0;
2525
2670
  if (needsInteractive) {
2526
2671
  result = await interactivePrompt({
2527
2672
  options: { showBanner: false },
@@ -2557,6 +2702,7 @@ var createMastraProject = async ({
2557
2702
  build: "mastra build",
2558
2703
  start: "mastra start"
2559
2704
  });
2705
+ await writeReadmeFile({ dirPath: process.cwd(), projectName });
2560
2706
  } catch (error) {
2561
2707
  throw new Error(
2562
2708
  `Failed to initialize project structure: ${error instanceof Error ? error.message : "Unknown error"}`
@@ -2837,6 +2983,14 @@ async function createFromTemplate(args) {
2837
2983
  }
2838
2984
  llmProvider = providerResponse;
2839
2985
  }
2986
+ let initGit = false;
2987
+ const gitConfirmResult = await ye({
2988
+ message: "Initialize a new git repository?",
2989
+ initialValue: true
2990
+ });
2991
+ if (!pD(gitConfirmResult)) {
2992
+ initGit = gitConfirmResult;
2993
+ }
2840
2994
  let projectPath = null;
2841
2995
  try {
2842
2996
  const analytics = args.injectedAnalytics || getAnalytics();
@@ -2862,6 +3016,16 @@ async function createFromTemplate(args) {
2862
3016
  llmProvider
2863
3017
  });
2864
3018
  await installDependencies(projectPath);
3019
+ if (initGit) {
3020
+ const s2 = Y();
3021
+ try {
3022
+ s2.start("Initializing git repository");
3023
+ await gitInit({ cwd: projectPath });
3024
+ s2.stop("Git repository initialized");
3025
+ } catch {
3026
+ s2.stop();
3027
+ }
3028
+ }
2865
3029
  Me(`
2866
3030
  ${color2.green("Mastra template installed!")}
2867
3031
 
@@ -2927,7 +3091,7 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
2927
3091
  program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
2928
3092
  "-p, --project-name <string>",
2929
3093
  "Project name that will be used in package.json and as the project directory name."
2930
- ).option("--default", "Quick start with defaults (src, OpenAI, examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows, scorers)").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(
3094
+ ).option("--default", "Quick start with defaults (src, OpenAI, examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows, scorers)").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, antigravity)").option(
2931
3095
  "--template [template-name]",
2932
3096
  "Create project from a template (use template name, public GitHub URL, or leave blank to select from list)"
2933
3097
  ).action(async (projectNameArg, args) => {