create-mastra 0.0.0-commonjs-20250227130920 → 0.0.0-course-20250527170450

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 path2, { dirname } from 'node:path';
8
8
  import { fileURLToPath } from 'node:url';
9
9
  import { PostHog } from 'posthog-node';
10
10
  import h, { stdin, stdout } from 'node:process';
@@ -14,16 +14,15 @@ import tty, { WriteStream } from 'node:tty';
14
14
  import child_process from 'node:child_process';
15
15
  import util from 'node:util';
16
16
  import fs4 from 'node:fs/promises';
17
- import fsExtra3 from 'fs-extra/esm';
18
- import prettier from 'prettier';
19
17
  import { execa } from 'execa';
20
- import { Transform } from 'node:stream';
18
+ import fsExtra3, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
19
+ import prettier from 'prettier';
21
20
  import pino from 'pino';
22
21
  import pretty from 'pino-pretty';
23
22
  import fsExtra from 'fs-extra';
24
23
 
25
24
  var __filename = fileURLToPath(import.meta.url);
26
- var __dirname = path.dirname(__filename);
25
+ var __dirname = path2.dirname(__filename);
27
26
  var PosthogAnalytics = class {
28
27
  sessionId;
29
28
  client;
@@ -35,7 +34,7 @@ var PosthogAnalytics = class {
35
34
  host = "https://app.posthog.com"
36
35
  }) {
37
36
  this.version = version;
38
- const cliConfigPath = path.join(__dirname, "mastra-cli.json");
37
+ const cliConfigPath = path2.join(__dirname, "mastra-cli.json");
39
38
  if (existsSync(cliConfigPath)) {
40
39
  try {
41
40
  const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
@@ -63,7 +62,7 @@ var PosthogAnalytics = class {
63
62
  }
64
63
  writeCliConfig({ distinctId, sessionId }) {
65
64
  try {
66
- writeFileSync(path.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
65
+ writeFileSync(path2.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
67
66
  } catch {
68
67
  }
69
68
  }
@@ -71,7 +70,8 @@ var PosthogAnalytics = class {
71
70
  this.client = new PostHog(apiKey, {
72
71
  host,
73
72
  flushAt: 1,
74
- flushInterval: 0
73
+ flushInterval: 0,
74
+ disableGeoip: false
75
75
  });
76
76
  this.captureSessionStart();
77
77
  process.on("exit", () => {
@@ -80,7 +80,7 @@ var PosthogAnalytics = class {
80
80
  });
81
81
  }
82
82
  isTelemetryEnabled() {
83
- if (process.env.NO_MASTRA_TELEMETRY) {
83
+ if (process.env.MASTRA_TELEMETRY_DISABLED) {
84
84
  return false;
85
85
  }
86
86
  return true;
@@ -135,7 +135,8 @@ var PosthogAnalytics = class {
135
135
  event: "cli_command",
136
136
  properties: {
137
137
  ...this.getSystemProperties(),
138
- ...commandData
138
+ ...commandData,
139
+ origin: options?.origin || "oss"
139
140
  }
140
141
  });
141
142
  } catch {
@@ -145,7 +146,8 @@ var PosthogAnalytics = class {
145
146
  async trackCommandExecution({
146
147
  command,
147
148
  args,
148
- execution
149
+ execution,
150
+ origin
149
151
  }) {
150
152
  const startTime = process.hrtime();
151
153
  try {
@@ -156,7 +158,8 @@ var PosthogAnalytics = class {
156
158
  command,
157
159
  args,
158
160
  durationMs,
159
- status: "success"
161
+ status: "success",
162
+ origin
160
163
  });
161
164
  return result;
162
165
  } catch (error) {
@@ -167,7 +170,8 @@ var PosthogAnalytics = class {
167
170
  args,
168
171
  durationMs,
169
172
  status: "error",
170
- error: error instanceof Error ? error.message : String(error)
173
+ error: error instanceof Error ? error.message : String(error),
174
+ origin
171
175
  });
172
176
  throw error;
173
177
  }
@@ -352,14 +356,14 @@ function q({onlyFirst:e=false}={}){const F=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(
352
356
  `).map(t=>oD(t,u,F)).join(`
353
357
  `)}var nD=Object.defineProperty,aD=(e,u,F)=>u in e?nD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,a$1=(e,u,F)=>(aD(e,typeof u!="symbol"?u+"":u,F),F);function hD(e,u){if(e===u)return;const F=e.split(`
354
358
  `),t=u.split(`
355
- `),s=[];for(let C=0;C<Math.max(F.length,t.length);C++)F[C]!==t[C]&&s.push(C);return s}const V$1=Symbol("clack:cancel");function lD(e){return e===V$1}function v(e,u){e.isTTY&&e.setRawMode(u);}const z=new Map([["k","up"],["j","down"],["h","left"],["l","right"]]),xD=new Set(["up","down","left","right","space","enter"]);class x{constructor({render:u,input:F=stdin,output:t=stdout,...s},C=true){a$1(this,"input"),a$1(this,"output"),a$1(this,"rl"),a$1(this,"opts"),a$1(this,"_track",false),a$1(this,"_render"),a$1(this,"_cursor",0),a$1(this,"state","initial"),a$1(this,"value"),a$1(this,"error",""),a$1(this,"subscribers",new Map),a$1(this,"_prevFrame",""),this.opts=s,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=u.bind(this),this._track=C,this.input=F,this.output=t;}prompt(){const u=new WriteStream(0);return u._write=(F,t,s)=>{this._track&&(this.value=this.rl.line.replace(/\t/g,""),this._cursor=this.rl.cursor,this.emit("value",this.value)),s();},this.input.pipe(u),this.rl=f__default.createInterface({input:this.input,output:u,tabSize:2,prompt:"",escapeCodeTimeout:50}),f__default.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),v(this.input,true),this.output.on("resize",this.render),this.render(),new Promise((F,t)=>{this.once("submit",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),v(this.input,false),F(this.value);}),this.once("cancel",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),v(this.input,false),F(V$1);});})}on(u,F){const t=this.subscribers.get(u)??[];t.push({cb:F}),this.subscribers.set(u,t);}once(u,F){const t=this.subscribers.get(u)??[];t.push({cb:F,once:true}),this.subscribers.set(u,t);}emit(u,...F){const t=this.subscribers.get(u)??[],s=[];for(const C of t)C.cb(...F),C.once&&s.push(()=>t.splice(t.indexOf(C),1));for(const C of s)C();}unsubscribe(){this.subscribers.clear();}onKeypress(u,F){if(this.state==="error"&&(this.state="active"),F?.name&&!this._track&&z.has(F.name)&&this.emit("cursor",z.get(F.name)),F?.name&&xD.has(F.name)&&this.emit("cursor",F.name),u&&(u.toLowerCase()==="y"||u.toLowerCase()==="n")&&this.emit("confirm",u.toLowerCase()==="y"),u===" "&&this.opts.placeholder&&(this.value||(this.rl.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),u&&this.emit("key",u.toLowerCase()),F?.name==="return"){if(this.opts.validate){const t=this.opts.validate(this.value);t&&(this.error=t,this.state="error",this.rl.write(this.value));}this.state!=="error"&&(this.state="submit");}u===""&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close();}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
356
- `),v(this.input,false),this.rl.close(),this.emit(`${this.state}`,this.value),this.unsubscribe();}restoreCursor(){const u=R$1(this._prevFrame,process.stdout.columns,{hard:true}).split(`
359
+ `),s=[];for(let C=0;C<Math.max(F.length,t.length);C++)F[C]!==t[C]&&s.push(C);return s}const V$1=Symbol("clack:cancel");function lD(e){return e===V$1}function v$1(e,u){e.isTTY&&e.setRawMode(u);}const z=new Map([["k","up"],["j","down"],["h","left"],["l","right"]]),xD=new Set(["up","down","left","right","space","enter"]);class x{constructor({render:u,input:F=stdin,output:t=stdout,...s},C=true){a$1(this,"input"),a$1(this,"output"),a$1(this,"rl"),a$1(this,"opts"),a$1(this,"_track",false),a$1(this,"_render"),a$1(this,"_cursor",0),a$1(this,"state","initial"),a$1(this,"value"),a$1(this,"error",""),a$1(this,"subscribers",new Map),a$1(this,"_prevFrame",""),this.opts=s,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=u.bind(this),this._track=C,this.input=F,this.output=t;}prompt(){const u=new WriteStream(0);return u._write=(F,t,s)=>{this._track&&(this.value=this.rl.line.replace(/\t/g,""),this._cursor=this.rl.cursor,this.emit("value",this.value)),s();},this.input.pipe(u),this.rl=f__default.createInterface({input:this.input,output:u,tabSize:2,prompt:"",escapeCodeTimeout:50}),f__default.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),v$1(this.input,true),this.output.on("resize",this.render),this.render(),new Promise((F,t)=>{this.once("submit",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),v$1(this.input,false),F(this.value);}),this.once("cancel",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),v$1(this.input,false),F(V$1);});})}on(u,F){const t=this.subscribers.get(u)??[];t.push({cb:F}),this.subscribers.set(u,t);}once(u,F){const t=this.subscribers.get(u)??[];t.push({cb:F,once:true}),this.subscribers.set(u,t);}emit(u,...F){const t=this.subscribers.get(u)??[],s=[];for(const C of t)C.cb(...F),C.once&&s.push(()=>t.splice(t.indexOf(C),1));for(const C of s)C();}unsubscribe(){this.subscribers.clear();}onKeypress(u,F){if(this.state==="error"&&(this.state="active"),F?.name&&!this._track&&z.has(F.name)&&this.emit("cursor",z.get(F.name)),F?.name&&xD.has(F.name)&&this.emit("cursor",F.name),u&&(u.toLowerCase()==="y"||u.toLowerCase()==="n")&&this.emit("confirm",u.toLowerCase()==="y"),u===" "&&this.opts.placeholder&&(this.value||(this.rl.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),u&&this.emit("key",u.toLowerCase()),F?.name==="return"){if(this.opts.validate){const t=this.opts.validate(this.value);t&&(this.error=t,this.state="error",this.rl.write(this.value));}this.state!=="error"&&(this.state="submit");}u===""&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close();}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
360
+ `),v$1(this.input,false),this.rl.close(),this.emit(`${this.state}`,this.value),this.unsubscribe();}restoreCursor(){const u=R$1(this._prevFrame,process.stdout.columns,{hard:true}).split(`
357
361
  `).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=R$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 F=hD(this._prevFrame,u);if(this.restoreCursor(),F&&F?.length===1){const t=F[0];this.output.write(srcExports.cursor.move(0,t)),this.output.write(srcExports.erase.lines(1));const s=u.split(`
358
362
  `);this.output.write(s[t]),this._prevFrame=u,this.output.write(srcExports.cursor.move(0,s.length-t-1));return}else if(F&&F?.length>1){const t=F[0];this.output.write(srcExports.cursor.move(0,t)),this.output.write(srcExports.erase.down());const s=u.split(`
359
363
  `).slice(t);this.output.write(s.join(`
360
364
  `)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}class BD 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",F=>{this.output.write(srcExports.cursor.move(0,-1)),this.value=F,this.state="submit",this.close();}),this.on("cursor",()=>{this.value=!this.value;});}}var fD=Object.defineProperty,gD=(e,u,F)=>u in e?fD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,K$1=(e,u,F)=>(gD(e,typeof u!="symbol"?u+"":u,F),F);let vD=class extends x{constructor(u){super(u,false),K$1(this,"options"),K$1(this,"cursor",0),this.options=u.options,this.value=[...u.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:F})=>F===u.cursorAt),0),this.on("key",F=>{F==="a"&&this.toggleAll();}),this.on("cursor",F=>{switch(F){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;case "space":this.toggleValue();break}});}get _value(){return this.options[this.cursor].value}toggleAll(){const u=this.value.length===this.options.length;this.value=u?[]:this.options.map(F=>F.value);}toggleValue(){const u=this.value.includes(this._value);this.value=u?this.value.filter(F=>F!==this._value):[...this.value,this._value];}};var wD=Object.defineProperty,yD=(e,u,F)=>u in e?wD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,Z=(e,u,F)=>(yD(e,typeof u!="symbol"?u+"":u,F),F);let $D=class extends x{constructor(u){super(u,false),Z(this,"options"),Z(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:F})=>F===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",F=>{switch(F){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;}};var TD=Object.defineProperty,jD=(e,u,F)=>u in e?TD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,MD=(e,u,F)=>(jD(e,u+"",F),F);class PD extends x{constructor(u){super(u),MD(this,"valueWithCursor",""),this.on("finalize",()=>{this.value||(this.value=u.defaultValue),this.valueWithCursor=this.value;}),this.on("value",()=>{if(this.cursor>=this.value.length)this.valueWithCursor=`${this.value}${color2.inverse(color2.hidden("_"))}`;else {const F=this.value.slice(0,this.cursor),t=this.value.slice(this.cursor);this.valueWithCursor=`${F}${color2.inverse(t[0])}${t.slice(1)}`;}});}get cursor(){return this._cursor}}const WD=globalThis.process.platform.startsWith("win");function OD({input:e=stdin,output:u=stdout,overwrite:F=true,hideCursor:t=true}={}){const s=f.createInterface({input:e,output:u,prompt:"",tabSize:1});f.emitKeypressEvents(e,s),e.isTTY&&e.setRawMode(true);const C=(D,{name:i})=>{if(String(D)===""){t&&u.write(srcExports.cursor.show),process.exit(0);return}if(!F)return;let n=i==="return"?0:-1,E=i==="return"?-1:0;f.moveCursor(u,n,E,()=>{f.clearLine(u,1,()=>{e.once("keypress",C);});});};return t&&u.write(srcExports.cursor.hide),e.once("keypress",C),()=>{e.off("keypress",C),t&&u.write(srcExports.cursor.show),e.isTTY&&!WD&&e.setRawMode(false),s.terminal=false,s.close();}}
361
365
 
362
- function K(){return h.platform!=="win32"?h.env.TERM!=="linux":!!h.env.CI||!!h.env.WT_SESSION||!!h.env.TERMINUS_SUBLIME||h.env.ConEmuTask==="{cmd::Cmder}"||h.env.TERM_PROGRAM==="Terminus-Sublime"||h.env.TERM_PROGRAM==="vscode"||h.env.TERM==="xterm-256color"||h.env.TERM==="alacritty"||h.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const C=K(),u=(s,n)=>C?s:n,Y=u("\u25C6","*"),P=u("\u25A0","x"),V=u("\u25B2","x"),M=u("\u25C7","o"),Q=u("\u250C","T"),a=u("\u2502","|"),$=u("\u2514","\u2014"),I=u("\u25CF",">"),T=u("\u25CB"," "),j=u("\u25FB","[\u2022]"),b=u("\u25FC","[+]"),B=u("\u25FB","[ ]"),G=u("\u2500","-"),H=u("\u256E","+"),ee=u("\u251C","+"),te=u("\u256F","+"),y=s=>{switch(s){case "initial":case "active":return color2.cyan(Y);case "cancel":return color2.red(P);case "error":return color2.yellow(V);case "submit":return color2.green(M)}},E=s=>{const{cursor:n,options:t,style:i}=s,r=s.maxItems??1/0,o=Math.max(process.stdout.rows-4,0),c=Math.min(o,Math.max(r,5));let l=0;n>=l+c-3?l=Math.max(Math.min(n-c+3,t.length-c),0):n<l+2&&(l=Math.max(n-2,0));const d=c<t.length&&l>0,p=c<t.length&&l+c<t.length;return t.slice(l,l+c).map((S,f,x)=>{const g=f===0&&d,m=f===x.length-1&&p;return g||m?color2.dim("..."):i(S,f+l===n)})},ae=s=>new PD({validate:s.validate,placeholder:s.placeholder,defaultValue:s.defaultValue,initialValue:s.initialValue,render(){const n=`${color2.gray(a)}
366
+ function K(){return h.platform!=="win32"?h.env.TERM!=="linux":!!h.env.CI||!!h.env.WT_SESSION||!!h.env.TERMINUS_SUBLIME||h.env.ConEmuTask==="{cmd::Cmder}"||h.env.TERM_PROGRAM==="Terminus-Sublime"||h.env.TERM_PROGRAM==="vscode"||h.env.TERM==="xterm-256color"||h.env.TERM==="alacritty"||h.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const C=K(),u=(s,n)=>C?s:n,Y=u("\u25C6","*"),P=u("\u25A0","x"),V=u("\u25B2","x"),M=u("\u25C7","o"),Q=u("\u250C","T"),a=u("\u2502","|"),$=u("\u2514","\u2014"),I=u("\u25CF",">"),T=u("\u25CB"," "),j=u("\u25FB","[\u2022]"),b=u("\u25FC","[+]"),B=u("\u25FB","[ ]"),G=u("\u2500","-"),H=u("\u256E","+"),ee=u("\u251C","+"),te=u("\u256F","+"),se=u("\u25CF","\u2022"),re=u("\u25C6","*"),ie=u("\u25B2","!"),ne=u("\u25A0","x"),y=s=>{switch(s){case "initial":case "active":return color2.cyan(Y);case "cancel":return color2.red(P);case "error":return color2.yellow(V);case "submit":return color2.green(M)}},E=s=>{const{cursor:n,options:t,style:i}=s,r=s.maxItems??1/0,o=Math.max(process.stdout.rows-4,0),c=Math.min(o,Math.max(r,5));let l=0;n>=l+c-3?l=Math.max(Math.min(n-c+3,t.length-c),0):n<l+2&&(l=Math.max(n-2,0));const d=c<t.length&&l>0,p=c<t.length&&l+c<t.length;return t.slice(l,l+c).map((S,f,x)=>{const g=f===0&&d,m=f===x.length-1&&p;return g||m?color2.dim("..."):i(S,f+l===n)})},ae=s=>new PD({validate:s.validate,placeholder:s.placeholder,defaultValue:s.defaultValue,initialValue:s.initialValue,render(){const n=`${color2.gray(a)}
363
367
  ${y(this.state)} ${s.message}
364
368
  `,t=s.placeholder?color2.inverse(s.placeholder[0])+color2.dim(s.placeholder.slice(1)):color2.inverse(color2.hidden("_")),i=this.value?this.valueWithCursor:t;switch(this.state){case "error":return `${n.trim()}
365
369
  ${color2.yellow(a)} ${i}
@@ -404,10 +408,290 @@ ${color2.gray(ee+G.repeat(r+2)+te)}
404
408
  `);},ge=(s="")=>{process.stdout.write(`${color2.gray(a)}
405
409
  ${color2.gray($)} ${s}
406
410
 
407
- `);},_=()=>{const s=C?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],n=C?80:120;let t,i,r=false,o="";const c=g=>{const m=g>1?"Something went wrong":"Canceled";r&&x(m,g);},l=()=>c(2),d=()=>c(1),p=()=>{process.on("uncaughtExceptionMonitor",l),process.on("unhandledRejection",l),process.on("SIGINT",d),process.on("SIGTERM",d),process.on("exit",c);},S=()=>{process.removeListener("uncaughtExceptionMonitor",l),process.removeListener("unhandledRejection",l),process.removeListener("SIGINT",d),process.removeListener("SIGTERM",d),process.removeListener("exit",c);},f=(g="")=>{r=true,t=OD(),o=g.replace(/\.+$/,""),process.stdout.write(`${color2.gray(a)}
411
+ `);},v={message:(s="",{symbol:n=color2.gray(a)}={})=>{const t=[`${color2.gray(a)}`];if(s){const[i,...r]=s.split(`
412
+ `);t.push(`${n} ${i}`,...r.map(o=>`${color2.gray(a)} ${o}`));}process.stdout.write(`${t.join(`
413
+ `)}
414
+ `);},info:s=>{v.message(s,{symbol:color2.blue(se)});},success:s=>{v.message(s,{symbol:color2.green(re)});},step:s=>{v.message(s,{symbol:color2.green(M)});},warn:s=>{v.message(s,{symbol:color2.yellow(ie)});},warning:s=>{v.warn(s);},error:s=>{v.message(s,{symbol:color2.red(ne)});}},_=()=>{const s=C?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],n=C?80:120;let t,i,r=false,o="";const c=g=>{const m=g>1?"Something went wrong":"Canceled";r&&x(m,g);},l=()=>c(2),d=()=>c(1),p=()=>{process.on("uncaughtExceptionMonitor",l),process.on("unhandledRejection",l),process.on("SIGINT",d),process.on("SIGTERM",d),process.on("exit",c);},S=()=>{process.removeListener("uncaughtExceptionMonitor",l),process.removeListener("unhandledRejection",l),process.removeListener("SIGINT",d),process.removeListener("SIGTERM",d),process.removeListener("exit",c);},f=(g="")=>{r=true,t=OD(),o=g.replace(/\.+$/,""),process.stdout.write(`${color2.gray(a)}
408
415
  `);let m=0,w=0;p(),i=setInterval(()=>{const L=color2.magenta(s[m]),O=".".repeat(Math.floor(w)).slice(0,3);process.stdout.write(srcExports.cursor.move(-999,0)),process.stdout.write(srcExports.erase.down(1)),process.stdout.write(`${L} ${o}${O}`),m=m+1<s.length?m+1:0,w=w<s.length?w+.125:0;},n);},x=(g="",m=0)=>{o=g??o,r=false,clearInterval(i);const w=m===0?color2.green(M):m===1?color2.red(P):color2.red(V);process.stdout.write(srcExports.cursor.move(-999,0)),process.stdout.write(srcExports.erase.down(1)),process.stdout.write(`${w} ${o}
409
416
  `),S(),t();};return {start:f,stop:x,message:(g="")=>{o=g??o;}}};function ye(){const s=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(s,"g")}const ve=async(s,n)=>{const t={},i=Object.keys(s);for(const r of i){const o=s[r],c=await o({results:t})?.catch(l=>{throw l});if(typeof n?.onCancel=="function"&&lD(c)){t[r]="canceled",n.onCancel({results:t});continue}t[r]=c;}return t};
410
417
 
418
+ var shellQuote$1 = {};
419
+
420
+ var quote;
421
+ var hasRequiredQuote;
422
+
423
+ function requireQuote () {
424
+ if (hasRequiredQuote) return quote;
425
+ hasRequiredQuote = 1;
426
+
427
+ quote = function quote(xs) {
428
+ return xs.map(function (s) {
429
+ if (s === '') {
430
+ return '\'\'';
431
+ }
432
+ if (s && typeof s === 'object') {
433
+ return s.op.replace(/(.)/g, '\\$1');
434
+ }
435
+ if ((/["\s]/).test(s) && !(/'/).test(s)) {
436
+ return "'" + s.replace(/(['\\])/g, '\\$1') + "'";
437
+ }
438
+ if ((/["'\s]/).test(s)) {
439
+ return '"' + s.replace(/(["\\$`!])/g, '\\$1') + '"';
440
+ }
441
+ return String(s).replace(/([A-Za-z]:)?([#!"$&'()*,:;<=>?@[\\\]^`{|}])/g, '$1\\$2');
442
+ }).join(' ');
443
+ };
444
+ return quote;
445
+ }
446
+
447
+ var parse;
448
+ var hasRequiredParse;
449
+
450
+ function requireParse () {
451
+ if (hasRequiredParse) return parse;
452
+ hasRequiredParse = 1;
453
+
454
+ // '<(' is process substitution operator and
455
+ // can be parsed the same as control operator
456
+ var CONTROL = '(?:' + [
457
+ '\\|\\|',
458
+ '\\&\\&',
459
+ ';;',
460
+ '\\|\\&',
461
+ '\\<\\(',
462
+ '\\<\\<\\<',
463
+ '>>',
464
+ '>\\&',
465
+ '<\\&',
466
+ '[&;()|<>]'
467
+ ].join('|') + ')';
468
+ var controlRE = new RegExp('^' + CONTROL + '$');
469
+ var META = '|&;()<> \\t';
470
+ var SINGLE_QUOTE = '"((\\\\"|[^"])*?)"';
471
+ var DOUBLE_QUOTE = '\'((\\\\\'|[^\'])*?)\'';
472
+ var hash = /^#$/;
473
+
474
+ var SQ = "'";
475
+ var DQ = '"';
476
+ var DS = '$';
477
+
478
+ var TOKEN = '';
479
+ var mult = 0x100000000; // Math.pow(16, 8);
480
+ for (var i = 0; i < 4; i++) {
481
+ TOKEN += (mult * Math.random()).toString(16);
482
+ }
483
+ var startsWithToken = new RegExp('^' + TOKEN);
484
+
485
+ function matchAll(s, r) {
486
+ var origIndex = r.lastIndex;
487
+
488
+ var matches = [];
489
+ var matchObj;
490
+
491
+ while ((matchObj = r.exec(s))) {
492
+ matches.push(matchObj);
493
+ if (r.lastIndex === matchObj.index) {
494
+ r.lastIndex += 1;
495
+ }
496
+ }
497
+
498
+ r.lastIndex = origIndex;
499
+
500
+ return matches;
501
+ }
502
+
503
+ function getVar(env, pre, key) {
504
+ var r = typeof env === 'function' ? env(key) : env[key];
505
+ if (typeof r === 'undefined' && key != '') {
506
+ r = '';
507
+ } else if (typeof r === 'undefined') {
508
+ r = '$';
509
+ }
510
+
511
+ if (typeof r === 'object') {
512
+ return pre + TOKEN + JSON.stringify(r) + TOKEN;
513
+ }
514
+ return pre + r;
515
+ }
516
+
517
+ function parseInternal(string, env, opts) {
518
+ if (!opts) {
519
+ opts = {};
520
+ }
521
+ var BS = opts.escape || '\\';
522
+ var BAREWORD = '(\\' + BS + '[\'"' + META + ']|[^\\s\'"' + META + '])+';
523
+
524
+ var chunker = new RegExp([
525
+ '(' + CONTROL + ')', // control chars
526
+ '(' + BAREWORD + '|' + SINGLE_QUOTE + '|' + DOUBLE_QUOTE + ')+'
527
+ ].join('|'), 'g');
528
+
529
+ var matches = matchAll(string, chunker);
530
+
531
+ if (matches.length === 0) {
532
+ return [];
533
+ }
534
+ if (!env) {
535
+ env = {};
536
+ }
537
+
538
+ var commented = false;
539
+
540
+ return matches.map(function (match) {
541
+ var s = match[0];
542
+ if (!s || commented) {
543
+ return void 0;
544
+ }
545
+ if (controlRE.test(s)) {
546
+ return { op: s };
547
+ }
548
+
549
+ // Hand-written scanner/parser for Bash quoting rules:
550
+ //
551
+ // 1. inside single quotes, all characters are printed literally.
552
+ // 2. inside double quotes, all characters are printed literally
553
+ // except variables prefixed by '$' and backslashes followed by
554
+ // either a double quote or another backslash.
555
+ // 3. outside of any quotes, backslashes are treated as escape
556
+ // characters and not printed (unless they are themselves escaped)
557
+ // 4. quote context can switch mid-token if there is no whitespace
558
+ // between the two quote contexts (e.g. all'one'"token" parses as
559
+ // "allonetoken")
560
+ var quote = false;
561
+ var esc = false;
562
+ var out = '';
563
+ var isGlob = false;
564
+ var i;
565
+
566
+ function parseEnvVar() {
567
+ i += 1;
568
+ var varend;
569
+ var varname;
570
+ var char = s.charAt(i);
571
+
572
+ if (char === '{') {
573
+ i += 1;
574
+ if (s.charAt(i) === '}') {
575
+ throw new Error('Bad substitution: ' + s.slice(i - 2, i + 1));
576
+ }
577
+ varend = s.indexOf('}', i);
578
+ if (varend < 0) {
579
+ throw new Error('Bad substitution: ' + s.slice(i));
580
+ }
581
+ varname = s.slice(i, varend);
582
+ i = varend;
583
+ } else if ((/[*@#?$!_-]/).test(char)) {
584
+ varname = char;
585
+ i += 1;
586
+ } else {
587
+ var slicedFromI = s.slice(i);
588
+ varend = slicedFromI.match(/[^\w\d_]/);
589
+ if (!varend) {
590
+ varname = slicedFromI;
591
+ i = s.length;
592
+ } else {
593
+ varname = slicedFromI.slice(0, varend.index);
594
+ i += varend.index - 1;
595
+ }
596
+ }
597
+ return getVar(env, '', varname);
598
+ }
599
+
600
+ for (i = 0; i < s.length; i++) {
601
+ var c = s.charAt(i);
602
+ isGlob = isGlob || (!quote && (c === '*' || c === '?'));
603
+ if (esc) {
604
+ out += c;
605
+ esc = false;
606
+ } else if (quote) {
607
+ if (c === quote) {
608
+ quote = false;
609
+ } else if (quote == SQ) {
610
+ out += c;
611
+ } else { // Double quote
612
+ if (c === BS) {
613
+ i += 1;
614
+ c = s.charAt(i);
615
+ if (c === DQ || c === BS || c === DS) {
616
+ out += c;
617
+ } else {
618
+ out += BS + c;
619
+ }
620
+ } else if (c === DS) {
621
+ out += parseEnvVar();
622
+ } else {
623
+ out += c;
624
+ }
625
+ }
626
+ } else if (c === DQ || c === SQ) {
627
+ quote = c;
628
+ } else if (controlRE.test(c)) {
629
+ return { op: s };
630
+ } else if (hash.test(c)) {
631
+ commented = true;
632
+ var commentObj = { comment: string.slice(match.index + i + 1) };
633
+ if (out.length) {
634
+ return [out, commentObj];
635
+ }
636
+ return [commentObj];
637
+ } else if (c === BS) {
638
+ esc = true;
639
+ } else if (c === DS) {
640
+ out += parseEnvVar();
641
+ } else {
642
+ out += c;
643
+ }
644
+ }
645
+
646
+ if (isGlob) {
647
+ return { op: 'glob', pattern: out };
648
+ }
649
+
650
+ return out;
651
+ }).reduce(function (prev, arg) { // finalize parsed arguments
652
+ // TODO: replace this whole reduce with a concat
653
+ return typeof arg === 'undefined' ? prev : prev.concat(arg);
654
+ }, []);
655
+ }
656
+
657
+ parse = function parse(s, env, opts) {
658
+ var mapped = parseInternal(s, env, opts);
659
+ if (typeof env !== 'function') {
660
+ return mapped;
661
+ }
662
+ return mapped.reduce(function (acc, s) {
663
+ if (typeof s === 'object') {
664
+ return acc.concat(s);
665
+ }
666
+ var xs = s.split(RegExp('(' + TOKEN + '.*?' + TOKEN + ')', 'g'));
667
+ if (xs.length === 1) {
668
+ return acc.concat(xs[0]);
669
+ }
670
+ return acc.concat(xs.filter(Boolean).map(function (x) {
671
+ if (startsWithToken.test(x)) {
672
+ return JSON.parse(x.split(TOKEN)[1]);
673
+ }
674
+ return x;
675
+ }));
676
+ }, []);
677
+ };
678
+ return parse;
679
+ }
680
+
681
+ var hasRequiredShellQuote;
682
+
683
+ function requireShellQuote () {
684
+ if (hasRequiredShellQuote) return shellQuote$1;
685
+ hasRequiredShellQuote = 1;
686
+
687
+ shellQuote$1.quote = requireQuote();
688
+ shellQuote$1.parse = requireParse();
689
+ return shellQuote$1;
690
+ }
691
+
692
+ var shellQuoteExports = requireShellQuote();
693
+ var shellQuote = /*@__PURE__*/getDefaultExportFromCjs(shellQuoteExports);
694
+
411
695
  // eslint-disable-next-line no-warning-comments
412
696
  // TODO: Use a better method when it's added to Node.js (https://github.com/nodejs/node/pull/40240)
413
697
  // Lots of optionals here to support Deno.
@@ -781,39 +1065,65 @@ function yoctoSpinner(options) {
781
1065
  }
782
1066
 
783
1067
  var LogLevel = {
784
- INFO: "info"};
785
- var Logger = class {
786
- logger;
1068
+ INFO: "info",
1069
+ ERROR: "error"};
1070
+ var MastraLogger = class {
1071
+ name;
1072
+ level;
787
1073
  transports;
788
1074
  constructor(options = {}) {
789
- this.transports = options.transports || {};
790
- const transportsAry = Object.entries(this.transports);
791
- this.logger = pino(
792
- {
793
- name: options.name || "app",
794
- level: options.level || LogLevel.INFO
795
- },
796
- options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? pretty({
1075
+ this.name = options.name || "Mastra";
1076
+ this.level = options.level || LogLevel.ERROR;
1077
+ this.transports = new Map(Object.entries(options.transports || {}));
1078
+ }
1079
+ getTransports() {
1080
+ return this.transports;
1081
+ }
1082
+ async getLogs(transportId) {
1083
+ if (!transportId || !this.transports.has(transportId)) {
1084
+ return [];
1085
+ }
1086
+ return this.transports.get(transportId).getLogs() ?? [];
1087
+ }
1088
+ async getLogsByRunId({ transportId, runId }) {
1089
+ if (!transportId || !this.transports.has(transportId) || !runId) {
1090
+ return [];
1091
+ }
1092
+ return this.transports.get(transportId).getLogsByRunId({ runId }) ?? [];
1093
+ }
1094
+ };
1095
+
1096
+ var PinoLogger = class extends MastraLogger {
1097
+ logger;
1098
+ constructor(options = {}) {
1099
+ super(options);
1100
+ let prettyStream = void 0;
1101
+ if (!options.overrideDefaultTransports) {
1102
+ prettyStream = pretty({
797
1103
  colorize: true,
798
1104
  levelFirst: true,
799
1105
  ignore: "pid,hostname",
800
1106
  colorizeObjects: true,
801
1107
  translateTime: "SYS:standard",
802
1108
  singleLine: false
803
- }) : pino.multistream([
804
- ...transportsAry.map(([_, transport]) => ({
1109
+ });
1110
+ }
1111
+ const transportsAry = [...this.getTransports().entries()];
1112
+ this.logger = pino(
1113
+ {
1114
+ name: options.name || "app",
1115
+ level: options.level || LogLevel.INFO,
1116
+ formatters: {
1117
+ level: (label) => ({ level: label })
1118
+ }
1119
+ },
1120
+ options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? prettyStream : pino.multistream([
1121
+ ...transportsAry.map(([, transport]) => ({
805
1122
  stream: transport,
806
1123
  level: options.level || LogLevel.INFO
807
1124
  })),
808
1125
  {
809
- stream: pretty({
810
- colorize: true,
811
- levelFirst: true,
812
- ignore: "pid,hostname",
813
- colorizeObjects: true,
814
- translateTime: "SYS:standard",
815
- singleLine: false
816
- }),
1126
+ stream: prettyStream,
817
1127
  level: options.level || LogLevel.INFO
818
1128
  }
819
1129
  ])
@@ -831,67 +1141,8 @@ var Logger = class {
831
1141
  error(message, args = {}) {
832
1142
  this.logger.error(args, message);
833
1143
  }
834
- // Stream creation for process output handling
835
- createStream() {
836
- return new Transform({
837
- transform: (chunk, _encoding, callback) => {
838
- const line = chunk.toString().trim();
839
- if (line) {
840
- this.info(line);
841
- }
842
- callback(null, chunk);
843
- }
844
- });
845
- }
846
- async getLogs(transportId) {
847
- if (!transportId || !this.transports[transportId]) {
848
- return [];
849
- }
850
- return this.transports[transportId].getLogs();
851
- }
852
- async getLogsByRunId({ runId, transportId }) {
853
- return this.transports[transportId]?.getLogsByRunId({ runId });
854
- }
855
1144
  };
856
- function createLogger(options) {
857
- return new Logger(options);
858
- }
859
1145
 
860
- function getPackageManager() {
861
- const userAgent = process.env.npm_config_user_agent || "";
862
- const execPath = process.env.npm_execpath || "";
863
- if (userAgent.includes("yarn")) {
864
- return "yarn";
865
- }
866
- if (userAgent.includes("pnpm")) {
867
- return "pnpm";
868
- }
869
- if (userAgent.includes("npm")) {
870
- return "npm";
871
- }
872
- if (execPath.includes("yarn")) {
873
- return "yarn";
874
- }
875
- if (execPath.includes("pnpm")) {
876
- return "pnpm";
877
- }
878
- if (execPath.includes("npm")) {
879
- return "npm";
880
- }
881
- return "npm";
882
- }
883
- function getPackageManagerInstallCommand(pm) {
884
- switch (pm) {
885
- case "npm":
886
- return "install";
887
- case "yarn":
888
- return "add";
889
- case "pnpm":
890
- return "add";
891
- default:
892
- return "install";
893
- }
894
- }
895
1146
  var DepsService = class {
896
1147
  packageManager;
897
1148
  constructor() {
@@ -900,11 +1151,11 @@ var DepsService = class {
900
1151
  findLockFile(dir) {
901
1152
  const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
902
1153
  for (const file of lockFiles) {
903
- if (fs3__default__default.existsSync(path.join(dir, file))) {
1154
+ if (fs3__default__default.existsSync(path2.join(dir, file))) {
904
1155
  return file;
905
1156
  }
906
1157
  }
907
- const parentDir = path.resolve(dir, "..");
1158
+ const parentDir = path2.resolve(dir, "..");
908
1159
  if (parentDir !== dir) {
909
1160
  return this.findLockFile(parentDir);
910
1161
  }
@@ -941,7 +1192,7 @@ var DepsService = class {
941
1192
  }
942
1193
  async checkDependencies(dependencies) {
943
1194
  try {
944
- const packageJsonPath = path.join(process.cwd(), "package.json");
1195
+ const packageJsonPath = path2.join(process.cwd(), "package.json");
945
1196
  try {
946
1197
  await fs4.access(packageJsonPath);
947
1198
  } catch {
@@ -961,7 +1212,7 @@ var DepsService = class {
961
1212
  }
962
1213
  async getProjectName() {
963
1214
  try {
964
- const packageJsonPath = path.join(process.cwd(), "package.json");
1215
+ const packageJsonPath = path2.join(process.cwd(), "package.json");
965
1216
  const packageJson = await fs4.readFile(packageJsonPath, "utf-8");
966
1217
  const pkg = JSON.parse(packageJson);
967
1218
  return pkg.name;
@@ -972,7 +1223,7 @@ var DepsService = class {
972
1223
  async getPackageVersion() {
973
1224
  const __filename = fileURLToPath(import.meta.url);
974
1225
  const __dirname = dirname(__filename);
975
- const pkgJsonPath = path.join(__dirname, "..", "package.json");
1226
+ const pkgJsonPath = path2.join(__dirname, "..", "package.json");
976
1227
  const content = await fsExtra3.readJSON(pkgJsonPath);
977
1228
  return content.version;
978
1229
  }
@@ -985,6 +1236,156 @@ var DepsService = class {
985
1236
  await fs4.writeFile("package.json", JSON.stringify(packageJson, null, 2));
986
1237
  }
987
1238
  };
1239
+ function getPackageManager() {
1240
+ const userAgent = process.env.npm_config_user_agent || "";
1241
+ const execPath = process.env.npm_execpath || "";
1242
+ if (userAgent.includes("yarn")) {
1243
+ return "yarn";
1244
+ }
1245
+ if (userAgent.includes("pnpm")) {
1246
+ return "pnpm";
1247
+ }
1248
+ if (userAgent.includes("npm")) {
1249
+ return "npm";
1250
+ }
1251
+ if (execPath.includes("yarn")) {
1252
+ return "yarn";
1253
+ }
1254
+ if (execPath.includes("pnpm")) {
1255
+ return "pnpm";
1256
+ }
1257
+ if (execPath.includes("npm")) {
1258
+ return "npm";
1259
+ }
1260
+ return "npm";
1261
+ }
1262
+ function getPackageManagerInstallCommand(pm) {
1263
+ switch (pm) {
1264
+ case "npm":
1265
+ return "install";
1266
+ case "yarn":
1267
+ return "add";
1268
+ case "pnpm":
1269
+ return "add";
1270
+ default:
1271
+ return "install";
1272
+ }
1273
+ }
1274
+ var args = ["-y", "@mastra/mcp-docs-server@latest"];
1275
+ var createMcpConfig = (editor) => {
1276
+ if (editor === "vscode") {
1277
+ return {
1278
+ servers: {
1279
+ mastra: process.platform === `win32` ? {
1280
+ command: "cmd",
1281
+ args: ["/c", "npx", ...args],
1282
+ type: "stdio"
1283
+ } : {
1284
+ command: "npx",
1285
+ args,
1286
+ type: "stdio"
1287
+ }
1288
+ }
1289
+ };
1290
+ }
1291
+ return {
1292
+ mcpServers: {
1293
+ mastra: process.platform === `win32` ? {
1294
+ command: "cmd",
1295
+ args: ["/c", "npx", ...args]
1296
+ } : {
1297
+ command: "npx",
1298
+ args
1299
+ }
1300
+ }
1301
+ };
1302
+ };
1303
+ function makeConfig(original, editor) {
1304
+ if (editor === "vscode") {
1305
+ return {
1306
+ ...original,
1307
+ servers: {
1308
+ ...original?.servers || {},
1309
+ ...createMcpConfig(editor).servers
1310
+ }
1311
+ };
1312
+ }
1313
+ return {
1314
+ ...original,
1315
+ mcpServers: {
1316
+ ...original?.mcpServers || {},
1317
+ ...createMcpConfig(editor).mcpServers
1318
+ }
1319
+ };
1320
+ }
1321
+ async function writeMergedConfig(configPath, editor) {
1322
+ const configExists = existsSync(configPath);
1323
+ const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor);
1324
+ await ensureFile(configPath);
1325
+ await writeJSON(configPath, config, {
1326
+ spaces: 2
1327
+ });
1328
+ }
1329
+ var windsurfGlobalMCPConfigPath = path2.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
1330
+ var cursorGlobalMCPConfigPath = path2.join(os.homedir(), ".cursor", "mcp.json");
1331
+ path2.join(process.cwd(), ".vscode", "mcp.json");
1332
+ var vscodeGlobalMCPConfigPath = path2.join(
1333
+ os.homedir(),
1334
+ process.platform === "win32" ? path2.join("AppData", "Roaming", "Code", "User", "settings.json") : process.platform === "darwin" ? path2.join("Library", "Application Support", "Code", "User", "settings.json") : path2.join(".config", "Code", "User", "settings.json")
1335
+ );
1336
+ async function installMastraDocsMCPServer({ editor, directory }) {
1337
+ if (editor === `cursor`) {
1338
+ await writeMergedConfig(path2.join(directory, ".cursor", "mcp.json"), "cursor");
1339
+ }
1340
+ if (editor === `vscode`) {
1341
+ await writeMergedConfig(path2.join(directory, ".vscode", "mcp.json"), "vscode");
1342
+ }
1343
+ if (editor === `cursor-global`) {
1344
+ const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
1345
+ if (alreadyInstalled) {
1346
+ return;
1347
+ }
1348
+ await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global");
1349
+ }
1350
+ if (editor === `windsurf`) {
1351
+ const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
1352
+ if (alreadyInstalled) {
1353
+ return;
1354
+ }
1355
+ await writeMergedConfig(windsurfGlobalMCPConfigPath, editor);
1356
+ }
1357
+ }
1358
+ async function globalMCPIsAlreadyInstalled(editor) {
1359
+ let configPath = ``;
1360
+ if (editor === "windsurf") {
1361
+ configPath = windsurfGlobalMCPConfigPath;
1362
+ } else if (editor === "cursor-global") {
1363
+ configPath = cursorGlobalMCPConfigPath;
1364
+ } else if (editor === "vscode") {
1365
+ configPath = vscodeGlobalMCPConfigPath;
1366
+ }
1367
+ if (!configPath || !existsSync(configPath)) {
1368
+ return false;
1369
+ }
1370
+ try {
1371
+ const configContents = await readJSON(configPath);
1372
+ if (editor === "vscode") {
1373
+ if (!configContents?.servers) return false;
1374
+ const hasMastraMCP2 = Object.values(configContents.servers).some(
1375
+ (server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
1376
+ );
1377
+ return hasMastraMCP2;
1378
+ }
1379
+ if (!configContents?.mcpServers) return false;
1380
+ const hasMastraMCP = Object.values(configContents.mcpServers).some(
1381
+ (server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
1382
+ );
1383
+ return hasMastraMCP;
1384
+ } catch (e) {
1385
+ console.error(e);
1386
+ return false;
1387
+ }
1388
+ }
988
1389
  var EnvService = class {
989
1390
  };
990
1391
  var FileEnvService = class extends EnvService {
@@ -1056,8 +1457,8 @@ var FileService = class {
1056
1457
  */
1057
1458
  async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
1058
1459
  const __filename = fileURLToPath(import.meta.url);
1059
- const __dirname = path.dirname(__filename);
1060
- const filePath = path.resolve(__dirname, "starter-files", inputFile);
1460
+ const __dirname = path2.dirname(__filename);
1461
+ const filePath = path2.resolve(__dirname, "starter-files", inputFile);
1061
1462
  const fileString = fs3__default__default.readFileSync(filePath, "utf8");
1062
1463
  if (fs3__default__default.existsSync(outputFilePath) && !replaceIfExists) {
1063
1464
  console.log(`${outputFilePath} already exists`);
@@ -1067,7 +1468,7 @@ var FileService = class {
1067
1468
  return true;
1068
1469
  }
1069
1470
  async setupEnvFile({ dbUrl }) {
1070
- const envPath = path.join(process.cwd(), ".env.development");
1471
+ const envPath = path2.join(process.cwd(), ".env.development");
1071
1472
  await fsExtra3.ensureFile(envPath);
1072
1473
  const fileEnvService = new FileEnvService(envPath);
1073
1474
  await fileEnvService.setEnvValue("DB_URL", dbUrl);
@@ -1091,7 +1492,7 @@ var FileService = class {
1091
1492
  fs3__default__default.writeFileSync(filePath, fileContent);
1092
1493
  }
1093
1494
  };
1094
- createLogger({
1495
+ new PinoLogger({
1095
1496
  name: "Mastra CLI",
1096
1497
  level: "debug"
1097
1498
  });
@@ -1104,6 +1505,10 @@ var getAISDKPackage = (llmProvider) => {
1104
1505
  return "@ai-sdk/anthropic";
1105
1506
  case "groq":
1106
1507
  return "@ai-sdk/groq";
1508
+ case "google":
1509
+ return "@ai-sdk/google";
1510
+ case "cerebras":
1511
+ return "@ai-sdk/cerebras";
1107
1512
  default:
1108
1513
  return "@ai-sdk/openai";
1109
1514
  }
@@ -1113,13 +1518,19 @@ var getProviderImportAndModelItem = (llmProvider) => {
1113
1518
  let modelItem = "";
1114
1519
  if (llmProvider === "openai") {
1115
1520
  providerImport = `import { openai } from '${getAISDKPackage(llmProvider)}';`;
1116
- modelItem = `openai('gpt-4o')`;
1521
+ modelItem = `openai('gpt-4o-mini')`;
1117
1522
  } else if (llmProvider === "anthropic") {
1118
1523
  providerImport = `import { anthropic } from '${getAISDKPackage(llmProvider)}';`;
1119
1524
  modelItem = `anthropic('claude-3-5-sonnet-20241022')`;
1120
1525
  } else if (llmProvider === "groq") {
1121
1526
  providerImport = `import { groq } from '${getAISDKPackage(llmProvider)}';`;
1122
- modelItem = `groq('llama3-groq-70b-8192-tool-use-preview')`;
1527
+ modelItem = `groq('llama-3.3-70b-versatile')`;
1528
+ } else if (llmProvider === "google") {
1529
+ providerImport = `import { google } from '${getAISDKPackage(llmProvider)}';`;
1530
+ modelItem = `google('gemini-1.5-pro-latest')`;
1531
+ } else if (llmProvider === "cerebras") {
1532
+ providerImport = `import { cerebras } from '${getAISDKPackage(llmProvider)}';`;
1533
+ modelItem = `cerebras('llama-3.3-70b')`;
1123
1534
  }
1124
1535
  return { providerImport, modelItem };
1125
1536
  };
@@ -1130,6 +1541,7 @@ async function writeAgentSample(llmProvider, destPath, addExampleTool) {
1130
1541
 
1131
1542
  Your primary function is to help users get weather details for specific locations. When responding:
1132
1543
  - Always ask for a location if none is provided
1544
+ - If the location name isn\u2019t in English, please translate it
1133
1545
  - If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
1134
1546
  - Include relevant details like humidity, wind conditions, and precipitation
1135
1547
  - Keep responses concise but informative
@@ -1139,13 +1551,20 @@ async function writeAgentSample(llmProvider, destPath, addExampleTool) {
1139
1551
  const content = `
1140
1552
  ${providerImport}
1141
1553
  import { Agent } from '@mastra/core/agent';
1142
- ${addExampleTool ? `import { weatherTool } from '../tools';` : ""}
1554
+ import { Memory } from '@mastra/memory';
1555
+ import { LibSQLStore } from '@mastra/libsql';
1556
+ ${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
1143
1557
 
1144
1558
  export const weatherAgent = new Agent({
1145
1559
  name: 'Weather Agent',
1146
1560
  instructions: \`${instructions}\`,
1147
1561
  model: ${modelItem},
1148
1562
  ${addExampleTool ? "tools: { weatherTool }," : ""}
1563
+ memory: new Memory({
1564
+ storage: new LibSQLStore({
1565
+ url: "file:../mastra.db", // path is relative to the .mastra/output directory
1566
+ })
1567
+ })
1149
1568
  });
1150
1569
  `;
1151
1570
  const formattedContent = await prettier.format(content, {
@@ -1159,7 +1578,7 @@ async function writeWorkflowSample(destPath, llmProvider) {
1159
1578
  const { providerImport, modelItem } = getProviderImportAndModelItem(llmProvider);
1160
1579
  const content = `${providerImport}
1161
1580
  import { Agent } from '@mastra/core/agent';
1162
- import { Step, Workflow } from '@mastra/core/workflows';
1581
+ import { createStep, createWorkflow } from '@mastra/core/workflows';
1163
1582
  import { z } from 'zod';
1164
1583
 
1165
1584
  const llm = ${modelItem};
@@ -1212,79 +1631,106 @@ const agent = new Agent({
1212
1631
  \`,
1213
1632
  });
1214
1633
 
1215
- const fetchWeather = new Step({
1634
+ const forecastSchema = z.object({
1635
+ date: z.string(),
1636
+ maxTemp: z.number(),
1637
+ minTemp: z.number(),
1638
+ precipitationChance: z.number(),
1639
+ condition: z.string(),
1640
+ location: z.string(),
1641
+ })
1642
+
1643
+ function getWeatherCondition(code: number): string {
1644
+ const conditions: Record<number, string> = {
1645
+ 0: 'Clear sky',
1646
+ 1: 'Mainly clear',
1647
+ 2: 'Partly cloudy',
1648
+ 3: 'Overcast',
1649
+ 45: 'Foggy',
1650
+ 48: 'Depositing rime fog',
1651
+ 51: 'Light drizzle',
1652
+ 53: 'Moderate drizzle',
1653
+ 55: 'Dense drizzle',
1654
+ 61: 'Slight rain',
1655
+ 63: 'Moderate rain',
1656
+ 65: 'Heavy rain',
1657
+ 71: 'Slight snow fall',
1658
+ 73: 'Moderate snow fall',
1659
+ 75: 'Heavy snow fall',
1660
+ 95: 'Thunderstorm',
1661
+ }
1662
+ return conditions[code] || 'Unknown'
1663
+ }
1664
+
1665
+ const fetchWeather = createStep({
1216
1666
  id: 'fetch-weather',
1217
1667
  description: 'Fetches weather forecast for a given city',
1218
1668
  inputSchema: z.object({
1219
1669
  city: z.string().describe('The city to get the weather for'),
1220
1670
  }),
1221
- execute: async ({ context }) => {
1222
- const triggerData = context?.getStepResult<{ city: string }>('trigger');
1223
-
1224
- if (!triggerData) {
1225
- throw new Error('Trigger data not found');
1671
+ outputSchema: forecastSchema,
1672
+ execute: async ({ inputData }) => {
1673
+ if (!inputData) {
1674
+ throw new Error('Input data not found');
1226
1675
  }
1227
1676
 
1228
- const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(triggerData.city)}&count=1\`;
1677
+ const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(inputData.city)}&count=1\`;
1229
1678
  const geocodingResponse = await fetch(geocodingUrl);
1230
1679
  const geocodingData = (await geocodingResponse.json()) as {
1231
1680
  results: { latitude: number; longitude: number; name: string }[];
1232
1681
  };
1233
1682
 
1234
1683
  if (!geocodingData.results?.[0]) {
1235
- throw new Error(\`Location '\${triggerData.city}' not found\`);
1684
+ throw new Error(\`Location '\${inputData.city}' not found\`);
1236
1685
  }
1237
1686
 
1238
1687
  const { latitude, longitude, name } = geocodingData.results[0];
1239
1688
 
1240
- const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}&daily=temperature_2m_max,temperature_2m_min,precipitation_probability_mean,weathercode&timezone=auto\`;
1689
+ const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}&current=precipitation,weathercode&timezone=auto,&hourly=precipitation_probability,temperature_2m\`;
1241
1690
  const response = await fetch(weatherUrl);
1242
1691
  const data = (await response.json()) as {
1243
- daily: {
1244
- time: string[];
1245
- temperature_2m_max: number[];
1246
- temperature_2m_min: number[];
1247
- precipitation_probability_mean: number[];
1248
- weathercode: number[];
1249
- };
1250
- };
1692
+ current: {
1693
+ time: string
1694
+ precipitation: number
1695
+ weathercode: number
1696
+ }
1697
+ hourly: {
1698
+ precipitation_probability: number[]
1699
+ temperature_2m: number[]
1700
+ }
1701
+ }
1251
1702
 
1252
- const forecast = data.daily.time.map((date: string, index: number) => ({
1253
- date,
1254
- maxTemp: data.daily.temperature_2m_max[index],
1255
- minTemp: data.daily.temperature_2m_min[index],
1256
- precipitationChance: data.daily.precipitation_probability_mean[index],
1257
- condition: getWeatherCondition(data.daily.weathercode[index]!),
1258
- location: name,
1259
- }));
1703
+ const forecast = {
1704
+ date: new Date().toISOString(),
1705
+ maxTemp: Math.max(...data.hourly.temperature_2m),
1706
+ minTemp: Math.min(...data.hourly.temperature_2m),
1707
+ condition: getWeatherCondition(data.current.weathercode),
1708
+ precipitationChance: data.hourly.precipitation_probability.reduce(
1709
+ (acc, curr) => Math.max(acc, curr),
1710
+ 0
1711
+ ),
1712
+ }
1260
1713
 
1261
1714
  return forecast;
1262
1715
  },
1263
1716
  });
1264
1717
 
1265
- const forecastSchema = z.array(
1266
- z.object({
1267
- date: z.string(),
1268
- maxTemp: z.number(),
1269
- minTemp: z.number(),
1270
- precipitationChance: z.number(),
1271
- condition: z.string(),
1272
- location: z.string(),
1273
- }),
1274
- );
1275
1718
 
1276
- const planActivities = new Step({
1719
+ const planActivities = createStep({
1277
1720
  id: 'plan-activities',
1278
1721
  description: 'Suggests activities based on weather conditions',
1279
1722
  inputSchema: forecastSchema,
1280
- execute: async ({ context, mastra }) => {
1281
- const forecast = context?.getStepResult<z.infer<typeof forecastSchema>>('fetch-weather');
1723
+ outputSchema: z.object({
1724
+ activities: z.string(),
1725
+ }),
1726
+ execute: async ({ inputData }) => {
1727
+ const forecast = inputData
1282
1728
 
1283
- if (!forecast || forecast.length === 0) {
1284
- throw new Error('Forecast data not found');
1729
+ if (!forecast) {
1730
+ throw new Error('Forecast data not found')
1285
1731
  }
1286
1732
 
1287
- const prompt = \`Based on the following weather forecast for \${forecast[0]?.location}, suggest appropriate activities:
1733
+ const prompt = \`Based on the following weather forecast for \${forecast.location}, suggest appropriate activities:
1288
1734
  \${JSON.stringify(forecast, null, 2)}
1289
1735
  \`;
1290
1736
 
@@ -1295,45 +1741,29 @@ const planActivities = new Step({
1295
1741
  },
1296
1742
  ]);
1297
1743
 
1744
+ let activitiesText = '';
1745
+
1298
1746
  for await (const chunk of response.textStream) {
1299
1747
  process.stdout.write(chunk);
1748
+ activitiesText += chunk;
1300
1749
  }
1301
1750
 
1302
1751
  return {
1303
- activities: response.text,
1752
+ activities: activitiesText,
1304
1753
  };
1305
1754
  },
1306
1755
  });
1307
1756
 
1308
- function getWeatherCondition(code: number): string {
1309
- const conditions: Record<number, string> = {
1310
- 0: 'Clear sky',
1311
- 1: 'Mainly clear',
1312
- 2: 'Partly cloudy',
1313
- 3: 'Overcast',
1314
- 45: 'Foggy',
1315
- 48: 'Depositing rime fog',
1316
- 51: 'Light drizzle',
1317
- 53: 'Moderate drizzle',
1318
- 55: 'Dense drizzle',
1319
- 61: 'Slight rain',
1320
- 63: 'Moderate rain',
1321
- 65: 'Heavy rain',
1322
- 71: 'Slight snow fall',
1323
- 73: 'Moderate snow fall',
1324
- 75: 'Heavy snow fall',
1325
- 95: 'Thunderstorm',
1326
- };
1327
- return conditions[code] || 'Unknown';
1328
- }
1329
-
1330
- const weatherWorkflow = new Workflow({
1331
- name: 'weather-workflow',
1332
- triggerSchema: z.object({
1757
+ const weatherWorkflow = createWorkflow({
1758
+ id: 'weather-workflow',
1759
+ inputSchema: z.object({
1333
1760
  city: z.string().describe('The city to get the weather for'),
1334
1761
  }),
1762
+ outputSchema: z.object({
1763
+ activities: z.string(),
1764
+ })
1335
1765
  })
1336
- .step(fetchWeather)
1766
+ .then(fetchWeather)
1337
1767
  .then(planActivities);
1338
1768
 
1339
1769
  weatherWorkflow.commit();
@@ -1373,7 +1803,7 @@ var writeIndexFile = async ({
1373
1803
  addWorkflow
1374
1804
  }) => {
1375
1805
  const indexPath = dirPath + "/index.ts";
1376
- const destPath = path.join(indexPath);
1806
+ const destPath = path2.join(indexPath);
1377
1807
  try {
1378
1808
  await fs4.writeFile(destPath, "");
1379
1809
  const filteredExports = [
@@ -1395,13 +1825,18 @@ export const mastra = new Mastra()
1395
1825
  destPath,
1396
1826
  `
1397
1827
  import { Mastra } from '@mastra/core/mastra';
1398
- import { createLogger } from '@mastra/core/logger';
1399
- ${addWorkflow ? `import { weatherWorkflow } from './workflows';` : ""}
1400
- ${addAgent ? `import { weatherAgent } from './agents';` : ""}
1828
+ import { PinoLogger } from '@mastra/loggers';
1829
+ import { LibSQLStore } from '@mastra/libsql';
1830
+ ${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
1831
+ ${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
1401
1832
 
1402
1833
  export const mastra = new Mastra({
1403
1834
  ${filteredExports.join("\n ")}
1404
- logger: createLogger({
1835
+ storage: new LibSQLStore({
1836
+ // stores telemetry, evals, ... into memory storage, if it needs to persist, change to file:../mastra.db
1837
+ url: ":memory:",
1838
+ }),
1839
+ logger: new PinoLogger({
1405
1840
  name: 'Mastra',
1406
1841
  level: 'info',
1407
1842
  }),
@@ -1422,6 +1857,12 @@ var getAPIKey = async (provider) => {
1422
1857
  case "groq":
1423
1858
  key = "GROQ_API_KEY";
1424
1859
  return key;
1860
+ case "google":
1861
+ key = "GOOGLE_GENERATIVE_AI_API_KEY";
1862
+ return key;
1863
+ case "cerebras":
1864
+ key = "CEREBRAS_API_KEY";
1865
+ return key;
1425
1866
  default:
1426
1867
  return key;
1427
1868
  }
@@ -1431,11 +1872,13 @@ var writeAPIKey = async ({
1431
1872
  apiKey = "your-api-key"
1432
1873
  }) => {
1433
1874
  const key = await getAPIKey(provider);
1434
- await exec(`echo ${key}=${apiKey} >> .env.development`);
1875
+ const escapedKey = shellQuote.quote([key]);
1876
+ const escapedApiKey = shellQuote.quote([apiKey]);
1877
+ await exec(`echo ${escapedKey}=${escapedApiKey} >> .env`);
1435
1878
  };
1436
1879
  var createMastraDir = async (directory) => {
1437
1880
  let dir = directory.trim().split("/").filter((item) => item !== "");
1438
- const dirPath = path.join(process.cwd(), ...dir, "mastra");
1881
+ const dirPath = path2.join(process.cwd(), ...dir, "mastra");
1439
1882
  try {
1440
1883
  await fs4.access(dirPath);
1441
1884
  return { ok: false };
@@ -1445,7 +1888,7 @@ var createMastraDir = async (directory) => {
1445
1888
  }
1446
1889
  };
1447
1890
  var writeCodeSample = async (dirPath, component, llmProvider, importComponents) => {
1448
- const destPath = dirPath + `/${component}/index.ts`;
1891
+ const destPath = dirPath + `/${component}/weather-${component.slice(0, -1)}.ts`;
1449
1892
  try {
1450
1893
  await writeCodeSampleForComponents(llmProvider, component, destPath, importComponents);
1451
1894
  } catch (err) {
@@ -1480,7 +1923,9 @@ var interactivePrompt = async () => {
1480
1923
  options: [
1481
1924
  { value: "openai", label: "OpenAI", hint: "recommended" },
1482
1925
  { value: "anthropic", label: "Anthropic" },
1483
- { value: "groq", label: "Groq" }
1926
+ { value: "groq", label: "Groq" },
1927
+ { value: "google", label: "Google" },
1928
+ { value: "cerebras", label: "Cerebras" }
1484
1929
  ]
1485
1930
  }),
1486
1931
  llmApiKey: async ({ results: { llmProvider } }) => {
@@ -1503,7 +1948,82 @@ var interactivePrompt = async () => {
1503
1948
  addExample: () => ce({
1504
1949
  message: "Add example",
1505
1950
  initialValue: false
1506
- })
1951
+ }),
1952
+ configureEditorWithDocsMCP: async () => {
1953
+ const windsurfIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`windsurf`);
1954
+ const cursorIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`cursor`);
1955
+ const vscodeIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`vscode`);
1956
+ const editor = await le({
1957
+ message: `Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)`,
1958
+ options: [
1959
+ { value: "skip", label: "Skip for now", hint: "default" },
1960
+ {
1961
+ value: "cursor",
1962
+ label: "Cursor (project only)",
1963
+ hint: cursorIsAlreadyInstalled ? `Already installed globally` : void 0
1964
+ },
1965
+ {
1966
+ value: "cursor-global",
1967
+ label: "Cursor (global, all projects)",
1968
+ hint: cursorIsAlreadyInstalled ? `Already installed` : void 0
1969
+ },
1970
+ {
1971
+ value: "windsurf",
1972
+ label: "Windsurf",
1973
+ hint: windsurfIsAlreadyInstalled ? `Already installed` : void 0
1974
+ },
1975
+ {
1976
+ value: "vscode",
1977
+ label: "VSCode",
1978
+ hint: vscodeIsAlreadyInstalled ? `Already installed` : void 0
1979
+ }
1980
+ ]
1981
+ });
1982
+ if (editor === `skip`) return void 0;
1983
+ if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
1984
+ v.message(`
1985
+ Windsurf is already installed, skipping.`);
1986
+ return void 0;
1987
+ }
1988
+ if (editor === `vscode` && vscodeIsAlreadyInstalled) {
1989
+ v.message(`
1990
+ VSCode is already installed, skipping.`);
1991
+ return void 0;
1992
+ }
1993
+ if (editor === `cursor`) {
1994
+ v.message(
1995
+ `
1996
+ Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
1997
+ `
1998
+ );
1999
+ }
2000
+ if (editor === `cursor-global`) {
2001
+ const confirm2 = await le({
2002
+ message: `Global install will add/update ${cursorGlobalMCPConfigPath} and make the Mastra docs MCP server available in all your Cursor projects. Continue?`,
2003
+ options: [
2004
+ { value: "yes", label: "Yes, I understand" },
2005
+ { value: "skip", label: "No, skip for now" }
2006
+ ]
2007
+ });
2008
+ if (confirm2 !== `yes`) {
2009
+ return void 0;
2010
+ }
2011
+ }
2012
+ if (editor === `windsurf`) {
2013
+ const confirm2 = await le({
2014
+ message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
2015
+ This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
2016
+ options: [
2017
+ { value: "yes", label: "Yes, I understand" },
2018
+ { value: "skip", label: "No, skip for now" }
2019
+ ]
2020
+ });
2021
+ if (confirm2 !== `yes`) {
2022
+ return void 0;
2023
+ }
2024
+ }
2025
+ return editor;
2026
+ }
1507
2027
  },
1508
2028
  {
1509
2029
  onCancel: () => {
@@ -1523,7 +2043,8 @@ var init = async ({
1523
2043
  addExample = false,
1524
2044
  components,
1525
2045
  llmProvider = "openai",
1526
- llmApiKey
2046
+ llmApiKey,
2047
+ configureEditorWithDocsMCP
1527
2048
  }) => {
1528
2049
  s.start("Initializing Mastra");
1529
2050
  try {
@@ -1549,19 +2070,39 @@ var init = async ({
1549
2070
  (component) => writeCodeSample(dirPath, component, llmProvider, components)
1550
2071
  )
1551
2072
  ]);
2073
+ const depService = new DepsService();
2074
+ const needsLibsql = await depService.checkDependencies(["@mastra/libsql"]) !== `ok`;
2075
+ if (needsLibsql) {
2076
+ await depService.installPackages(["@mastra/libsql"]);
2077
+ }
2078
+ const needsMemory = components.includes(`agents`) && await depService.checkDependencies(["@mastra/memory"]) !== `ok`;
2079
+ if (needsMemory) {
2080
+ await depService.installPackages(["@mastra/memory"]);
2081
+ }
2082
+ const needsLoggers = await depService.checkDependencies(["@mastra/loggers"]) !== `ok`;
2083
+ if (needsLoggers) {
2084
+ await depService.installPackages(["@mastra/loggers"]);
2085
+ }
1552
2086
  }
1553
2087
  const key = await getAPIKey(llmProvider || "openai");
1554
2088
  const aiSdkPackage = getAISDKPackage(llmProvider);
1555
- const pm = getPackageManager();
2089
+ const depsService = new DepsService();
2090
+ const pm = depsService.packageManager;
1556
2091
  const installCommand = getPackageManagerInstallCommand(pm);
1557
2092
  await exec2(`${pm} ${installCommand} ${aiSdkPackage}`);
2093
+ if (configureEditorWithDocsMCP) {
2094
+ await installMastraDocsMCPServer({
2095
+ editor: configureEditorWithDocsMCP,
2096
+ directory: process.cwd()
2097
+ });
2098
+ }
1558
2099
  s.stop();
1559
2100
  if (!llmApiKey) {
1560
2101
  me(`
1561
2102
  ${color2.green("Mastra initialized successfully!")}
1562
2103
 
1563
2104
  Add your ${color2.cyan(key)} as an environment variable
1564
- in your ${color2.cyan(".env.development")} file
2105
+ in your ${color2.cyan(".env")} file
1565
2106
  `);
1566
2107
  } else {
1567
2108
  me(`
@@ -1576,9 +2117,12 @@ var init = async ({
1576
2117
  }
1577
2118
  };
1578
2119
  var exec3 = util.promisify(child_process.exec);
1579
- var execWithTimeout = async (command, timeoutMs = 18e4) => {
2120
+ var execWithTimeout = async (command, timeoutMs) => {
1580
2121
  try {
1581
2122
  const promise = exec3(command, { killSignal: "SIGTERM" });
2123
+ if (!timeoutMs) {
2124
+ return await promise;
2125
+ }
1582
2126
  let timeoutId;
1583
2127
  const timeout = new Promise((_, reject) => {
1584
2128
  timeoutId = setTimeout(() => reject(new Error("Command timed out")), timeoutMs);
@@ -1599,9 +2143,28 @@ var execWithTimeout = async (command, timeoutMs = 18e4) => {
1599
2143
  throw error;
1600
2144
  }
1601
2145
  };
1602
- var createMastraProject = async ({ createVersionTag }) => {
2146
+ async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
2147
+ let installCommand = getPackageManagerInstallCommand(pm);
2148
+ if (isDev) {
2149
+ installCommand = `${installCommand} --save-dev`;
2150
+ }
2151
+ try {
2152
+ await execWithTimeout(`${pm} ${installCommand} ${dependency}${versionTag}`, timeout);
2153
+ } catch (err) {
2154
+ console.log("err", err);
2155
+ if (versionTag === "@latest") {
2156
+ throw err;
2157
+ }
2158
+ await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
2159
+ }
2160
+ }
2161
+ var createMastraProject = async ({
2162
+ projectName: name,
2163
+ createVersionTag,
2164
+ timeout
2165
+ }) => {
1603
2166
  pe(color2.inverse("Mastra Create"));
1604
- const projectName = await ae({
2167
+ const projectName = name ?? await ae({
1605
2168
  message: "What do you want to name your project?",
1606
2169
  placeholder: "my-mastra-app",
1607
2170
  defaultValue: "my-mastra-app"
@@ -1629,14 +2192,16 @@ var createMastraProject = async ({ createVersionTag }) => {
1629
2192
  s2.message("Creating project");
1630
2193
  await exec3(`npm init -y`);
1631
2194
  await exec3(`npm pkg set type="module"`);
2195
+ await exec3(`npm pkg set engines.node=">=20.9.0"`);
1632
2196
  const depsService = new DepsService();
1633
2197
  await depsService.addScriptsToPackageJson({
1634
- dev: "mastra dev"
2198
+ dev: "mastra dev",
2199
+ build: "mastra build"
1635
2200
  });
1636
2201
  s2.stop("Project created");
1637
2202
  s2.start(`Installing ${pm} dependencies`);
1638
2203
  await exec3(`${pm} ${installCommand} zod`);
1639
- await exec3(`${pm} ${installCommand} typescript tsx @types/node --save-dev`);
2204
+ await exec3(`${pm} ${installCommand} typescript @types/node --save-dev`);
1640
2205
  await exec3(`echo '{
1641
2206
  "compilerOptions": {
1642
2207
  "target": "ES2022",
@@ -1646,25 +2211,23 @@ var createMastraProject = async ({ createVersionTag }) => {
1646
2211
  "forceConsistentCasingInFileNames": true,
1647
2212
  "strict": true,
1648
2213
  "skipLibCheck": true,
2214
+ "noEmit": true,
1649
2215
  "outDir": "dist"
1650
2216
  },
1651
2217
  "include": [
1652
2218
  "src/**/*"
1653
- ],
1654
- "exclude": [
1655
- "node_modules",
1656
- "dist",
1657
- ".mastra"
1658
2219
  ]
1659
2220
  }' > tsconfig.json`);
1660
2221
  s2.stop(`${pm} dependencies installed`);
1661
2222
  s2.start("Installing mastra");
1662
2223
  const versionTag = createVersionTag ? `@${createVersionTag}` : "@latest";
1663
- await execWithTimeout(`${pm} ${installCommand} mastra${versionTag}`);
2224
+ await installMastraDependency(pm, "mastra", versionTag, true, timeout);
1664
2225
  s2.stop("mastra installed");
1665
- s2.start("Installing @mastra/core");
1666
- await execWithTimeout(`${pm} ${installCommand} @mastra/core${versionTag}`);
1667
- s2.stop("@mastra/core installed");
2226
+ s2.start("Installing dependencies");
2227
+ await installMastraDependency(pm, "@mastra/core", versionTag, false, timeout);
2228
+ await installMastraDependency(pm, "@mastra/libsql", versionTag, false, timeout);
2229
+ await installMastraDependency(pm, "@mastra/memory", versionTag, false, timeout);
2230
+ s2.stop("Dependencies installed");
1668
2231
  s2.start("Adding .gitignore");
1669
2232
  await exec3(`echo output.txt >> .gitignore`);
1670
2233
  await exec3(`echo node_modules >> .gitignore`);
@@ -1673,17 +2236,20 @@ var createMastraProject = async ({ createVersionTag }) => {
1673
2236
  await exec3(`echo .env.development >> .gitignore`);
1674
2237
  await exec3(`echo .env >> .gitignore`);
1675
2238
  await exec3(`echo *.db >> .gitignore`);
2239
+ await exec3(`echo *.db-* >> .gitignore`);
1676
2240
  s2.stop(".gitignore added");
1677
2241
  ge("Project created successfully");
1678
2242
  console.log("");
1679
2243
  return { projectName };
1680
2244
  };
1681
- var create = async (args) => {
2245
+ var create = async (args2) => {
1682
2246
  const { projectName } = await createMastraProject({
1683
- createVersionTag: args?.createVersionTag
2247
+ projectName: args2?.projectName,
2248
+ createVersionTag: args2?.createVersionTag,
2249
+ timeout: args2?.timeout
1684
2250
  });
1685
- const directory = "/src";
1686
- if (!args.components || !args.llmProvider || !args.addExample) {
2251
+ const directory = args2.directory || "src/";
2252
+ if (args2.components === void 0 || args2.llmProvider === void 0 || args2.addExample === void 0) {
1687
2253
  const result = await interactivePrompt();
1688
2254
  await init({
1689
2255
  ...result,
@@ -1692,74 +2258,42 @@ var create = async (args) => {
1692
2258
  postCreate({ projectName });
1693
2259
  return;
1694
2260
  }
1695
- const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args;
2261
+ const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args2;
1696
2262
  await init({
1697
2263
  directory,
1698
2264
  components,
1699
2265
  llmProvider,
1700
2266
  addExample,
1701
- llmApiKey
2267
+ llmApiKey,
2268
+ configureEditorWithDocsMCP: args2.mcpServer
1702
2269
  });
1703
2270
  postCreate({ projectName });
1704
2271
  };
1705
2272
  var postCreate = ({ projectName }) => {
2273
+ const packageManager = getPackageManager();
1706
2274
  ge(`
1707
2275
  ${color2.green("To start your project:")}
1708
2276
 
1709
2277
  ${color2.cyan("cd")} ${projectName}
1710
- ${color2.cyan("npm run dev")}
2278
+ ${color2.cyan(`${packageManager} run dev`)}
1711
2279
  `);
1712
2280
  };
1713
2281
 
1714
2282
  async function getPackageVersion() {
1715
2283
  const __filename = fileURLToPath(import.meta.url);
1716
2284
  const __dirname = dirname(__filename);
1717
- const pkgJsonPath = path.join(__dirname, "..", "package.json");
2285
+ const pkgJsonPath = path2.join(__dirname, "..", "package.json");
1718
2286
  const content = await fsExtra.readJSON(pkgJsonPath);
1719
2287
  return content.version;
1720
2288
  }
1721
- async function tryReadPackageJson(paths) {
1722
- let lastError;
1723
- for (const path2 of paths) {
1724
- try {
1725
- const content = await fsExtra.readJSON(path2);
1726
- if (content.name === "create-mastra") {
1727
- return content;
1728
- }
1729
- } catch (err) {
1730
- lastError = err;
1731
- continue;
1732
- }
1733
- }
1734
- throw lastError || new Error("Could not find create-mastra package.json in any of the expected locations");
1735
- }
1736
2289
  async function getCreateVersionTag() {
1737
2290
  try {
1738
- const binPath = process.argv[1];
1739
- const binDir = dirname(binPath);
1740
- const possiblePaths = [
1741
- // Direct parent paths
1742
- path.join(binDir, "..", "package.json"),
1743
- path.join(binDir, "..", "..", "package.json"),
1744
- path.join(binDir, "..", "..", "..", "package.json"),
1745
- path.join(binDir, "..", "..", "..", "..", "package.json"),
1746
- // Standard node_modules paths
1747
- path.join(binDir, "..", "create-mastra", "package.json"),
1748
- path.join(binDir, "..", "..", "create-mastra", "package.json"),
1749
- path.join(binDir, "..", "..", "..", "create-mastra", "package.json"),
1750
- path.join(binDir, "..", "..", "..", "..", "create-mastra", "package.json"),
1751
- // pnpm specific paths (.pnpm directory)
1752
- path.join(binDir, "..", ".pnpm", "create-mastra@*", "node_modules", "create-mastra", "package.json"),
1753
- path.join(binDir, "..", "..", ".pnpm", "create-mastra@*", "node_modules", "create-mastra", "package.json"),
1754
- // pnpm dlx specific path
1755
- path.join(binDir, "..", "..", "package.json"),
1756
- path.join(binDir, "..", "..", "node_modules", "create-mastra", "package.json")
1757
- ];
1758
- const content = await tryReadPackageJson(possiblePaths);
1759
- if (content.version?.includes("-")) {
1760
- const tag = content.version.split("-")[1].split(".")[0];
1761
- return tag;
1762
- }
2291
+ const pkgPath = fileURLToPath(import.meta.resolve("create-mastra/package.json"));
2292
+ const json = await fsExtra.readJSON(pkgPath);
2293
+ const { stdout } = await execa("npm", ["dist-tag", "create-mastra"]);
2294
+ const tagLine = stdout.split("\n").find((distLine) => distLine.endsWith(`: ${json.version}`));
2295
+ const tag = tagLine ? tagLine.split(":")[0].trim() : "latest";
2296
+ return tag;
1763
2297
  } catch {
1764
2298
  console.error('We could not resolve the create-mastra version tag, falling back to "latest"');
1765
2299
  }
@@ -1783,13 +2317,20 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
1783
2317
  } catch {
1784
2318
  }
1785
2319
  });
1786
- program.name("create-mastra").description("Create a new Mastra project").option("--default", "Quick start with defaults(src, OpenAI, no examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows)").option("-l, --llm <model-provider>", "Default model provider (openai, anthropic, or groq)").option("-k, --llm-api-key <api-key>", "API key for the model provider").option("-e, --example", "Include example code").action(async (args) => {
2320
+ program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
2321
+ "-p, --project-name <string>",
2322
+ "Project name that will be used in package.json and as the project directory name."
2323
+ ).option("--default", "Quick start with defaults(src, OpenAI, no 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)").action(async (projectNameArg, args) => {
2324
+ const projectName = projectNameArg || args.projectName;
2325
+ const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
1787
2326
  if (args.default) {
1788
2327
  await create({
1789
2328
  components: ["agents", "tools", "workflows"],
1790
2329
  llmProvider: "openai",
1791
- addExample: false,
1792
- createVersionTag
2330
+ addExample: true,
2331
+ createVersionTag,
2332
+ timeout,
2333
+ mcpServer: args.mcp
1793
2334
  });
1794
2335
  return;
1795
2336
  }
@@ -1798,7 +2339,11 @@ program.name("create-mastra").description("Create a new Mastra project").option(
1798
2339
  llmProvider: args.llm,
1799
2340
  addExample: args.example,
1800
2341
  llmApiKey: args["llm-api-key"],
1801
- createVersionTag
2342
+ createVersionTag,
2343
+ timeout,
2344
+ projectName,
2345
+ directory: args.dir,
2346
+ mcpServer: args.mcp
1802
2347
  });
1803
2348
  });
1804
2349
  program.parse(process.argv);