create-mastra 0.1.10-alpha.0 → 0.2.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +112 -16
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ pnpm create mastra
|
|
|
32
32
|
|
|
33
33
|
- `--default` - Quick start with defaults (src directory, OpenAI, no examples)
|
|
34
34
|
- `-c, --components <components>` - Comma-separated list of components (agents, tools, workflows)
|
|
35
|
-
- `-l, --llm <model-provider>` - Default model provider (openai, anthropic, or
|
|
35
|
+
- `-l, --llm <model-provider>` - Default model provider (openai, anthropic, groq, google, or cerebras)
|
|
36
36
|
- `-e, --example` - Include example code
|
|
37
37
|
|
|
38
38
|
## Examples
|
package/dist/index.js
CHANGED
|
@@ -15,7 +15,7 @@ import child_process from 'node:child_process';
|
|
|
15
15
|
import util from 'node:util';
|
|
16
16
|
import fs4 from 'node:fs/promises';
|
|
17
17
|
import { execa } from 'execa';
|
|
18
|
-
import fsExtra3 from 'fs-extra/esm';
|
|
18
|
+
import fsExtra3, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
|
|
19
19
|
import prettier from 'prettier';
|
|
20
20
|
import { Transform } from 'node:stream';
|
|
21
21
|
import pino from 'pino';
|
|
@@ -352,14 +352,14 @@ function q({onlyFirst:e=false}={}){const F=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(
|
|
|
352
352
|
`).map(t=>oD(t,u,F)).join(`
|
|
353
353
|
`)}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
354
|
`),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(`
|
|
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$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(`
|
|
356
|
+
`),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
357
|
`).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
358
|
`);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
359
|
`).slice(t);this.output.write(s.join(`
|
|
360
360
|
`)),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
361
|
|
|
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)}
|
|
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","+"),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
363
|
${y(this.state)} ${s.message}
|
|
364
364
|
`,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
365
|
${color2.yellow(a)} ${i}
|
|
@@ -404,7 +404,10 @@ ${color2.gray(ee+G.repeat(r+2)+te)}
|
|
|
404
404
|
`);},ge=(s="")=>{process.stdout.write(`${color2.gray(a)}
|
|
405
405
|
${color2.gray($)} ${s}
|
|
406
406
|
|
|
407
|
-
`);},
|
|
407
|
+
`);},v={message:(s="",{symbol:n=color2.gray(a)}={})=>{const t=[`${color2.gray(a)}`];if(s){const[i,...r]=s.split(`
|
|
408
|
+
`);t.push(`${n} ${i}`,...r.map(o=>`${color2.gray(a)} ${o}`));}process.stdout.write(`${t.join(`
|
|
409
|
+
`)}
|
|
410
|
+
`);},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
411
|
`);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
412
|
`),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
413
|
|
|
@@ -992,6 +995,62 @@ function getPackageManagerInstallCommand(pm) {
|
|
|
992
995
|
return "install";
|
|
993
996
|
}
|
|
994
997
|
}
|
|
998
|
+
function installMastraDocsMCPServer({
|
|
999
|
+
editor,
|
|
1000
|
+
directory
|
|
1001
|
+
}) {
|
|
1002
|
+
if (!editor) return;
|
|
1003
|
+
if (editor === `cursor`) return installCursorMCP(directory);
|
|
1004
|
+
if (editor === `windsurf`) return installWindsurfMCP();
|
|
1005
|
+
}
|
|
1006
|
+
var args = ["-y", "@mastra/mcp-docs-server@latest"];
|
|
1007
|
+
var mcpConfig = {
|
|
1008
|
+
mcpServers: {
|
|
1009
|
+
mastra: process.platform === `win32` ? {
|
|
1010
|
+
command: "cmd",
|
|
1011
|
+
args: ["/c", "npx", ...args]
|
|
1012
|
+
} : {
|
|
1013
|
+
command: "npx",
|
|
1014
|
+
args
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
};
|
|
1018
|
+
function makeConfig(original) {
|
|
1019
|
+
return {
|
|
1020
|
+
...original,
|
|
1021
|
+
mcpServers: {
|
|
1022
|
+
...original?.mcpServers || {},
|
|
1023
|
+
...mcpConfig.mcpServers
|
|
1024
|
+
}
|
|
1025
|
+
};
|
|
1026
|
+
}
|
|
1027
|
+
async function writeMergedConfig(configPath) {
|
|
1028
|
+
const configExists = existsSync(configPath);
|
|
1029
|
+
const config = makeConfig(configExists ? await readJSON(configPath) : {});
|
|
1030
|
+
await ensureFile(configPath);
|
|
1031
|
+
await writeJSON(configPath, config, {
|
|
1032
|
+
spaces: 2
|
|
1033
|
+
});
|
|
1034
|
+
}
|
|
1035
|
+
async function installCursorMCP(directory) {
|
|
1036
|
+
const configPath = path.join(directory, ".cursor", "mcp.json");
|
|
1037
|
+
await writeMergedConfig(configPath);
|
|
1038
|
+
}
|
|
1039
|
+
async function installWindsurfMCP() {
|
|
1040
|
+
const configPath = path.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1041
|
+
const confirm2 = await le({
|
|
1042
|
+
message: `Windsurf only supports a global MCP config (at ${configPath}) is it ok to add/update that global config?
|
|
1043
|
+
This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
|
|
1044
|
+
options: [
|
|
1045
|
+
{ value: "skip", label: "No, skip for now" },
|
|
1046
|
+
{ value: "yes", label: "Yes, I understand" }
|
|
1047
|
+
]
|
|
1048
|
+
});
|
|
1049
|
+
if (confirm2 !== `yes`) {
|
|
1050
|
+
return void 0;
|
|
1051
|
+
}
|
|
1052
|
+
await writeMergedConfig(configPath);
|
|
1053
|
+
}
|
|
995
1054
|
var EnvService = class {
|
|
996
1055
|
};
|
|
997
1056
|
var FileEnvService = class extends EnvService {
|
|
@@ -1113,6 +1172,8 @@ var getAISDKPackage = (llmProvider) => {
|
|
|
1113
1172
|
return "@ai-sdk/groq";
|
|
1114
1173
|
case "google":
|
|
1115
1174
|
return "@ai-sdk/google";
|
|
1175
|
+
case "cerebras":
|
|
1176
|
+
return "@ai-sdk/cerebras";
|
|
1116
1177
|
default:
|
|
1117
1178
|
return "@ai-sdk/openai";
|
|
1118
1179
|
}
|
|
@@ -1128,10 +1189,13 @@ var getProviderImportAndModelItem = (llmProvider) => {
|
|
|
1128
1189
|
modelItem = `anthropic('claude-3-5-sonnet-20241022')`;
|
|
1129
1190
|
} else if (llmProvider === "groq") {
|
|
1130
1191
|
providerImport = `import { groq } from '${getAISDKPackage(llmProvider)}';`;
|
|
1131
|
-
modelItem = `groq('llama-3.3-70b-versatile`;
|
|
1192
|
+
modelItem = `groq('llama-3.3-70b-versatile')`;
|
|
1132
1193
|
} else if (llmProvider === "google") {
|
|
1133
1194
|
providerImport = `import { google } from '${getAISDKPackage(llmProvider)}';`;
|
|
1134
1195
|
modelItem = `google('gemini-1.5-pro-latest')`;
|
|
1196
|
+
} else if (llmProvider === "cerebras") {
|
|
1197
|
+
providerImport = `import { cerebras } from '${getAISDKPackage(llmProvider)}';`;
|
|
1198
|
+
modelItem = `cerebras('llama-3.3-70b')`;
|
|
1135
1199
|
}
|
|
1136
1200
|
return { providerImport, modelItem };
|
|
1137
1201
|
};
|
|
@@ -1440,6 +1504,9 @@ var getAPIKey = async (provider) => {
|
|
|
1440
1504
|
case "google":
|
|
1441
1505
|
key = "GOOGLE_GENERATIVE_AI_API_KEY";
|
|
1442
1506
|
return key;
|
|
1507
|
+
case "cerebras":
|
|
1508
|
+
key = "CEREBRAS_API_KEY";
|
|
1509
|
+
return key;
|
|
1443
1510
|
default:
|
|
1444
1511
|
return key;
|
|
1445
1512
|
}
|
|
@@ -1499,7 +1566,8 @@ var interactivePrompt = async () => {
|
|
|
1499
1566
|
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
1500
1567
|
{ value: "anthropic", label: "Anthropic" },
|
|
1501
1568
|
{ value: "groq", label: "Groq" },
|
|
1502
|
-
{ value: "google", label: "Google" }
|
|
1569
|
+
{ value: "google", label: "Google" },
|
|
1570
|
+
{ value: "cerebras", label: "Cerebras" }
|
|
1503
1571
|
]
|
|
1504
1572
|
}),
|
|
1505
1573
|
llmApiKey: async ({ results: { llmProvider } }) => {
|
|
@@ -1522,7 +1590,26 @@ var interactivePrompt = async () => {
|
|
|
1522
1590
|
addExample: () => ce({
|
|
1523
1591
|
message: "Add example",
|
|
1524
1592
|
initialValue: false
|
|
1525
|
-
})
|
|
1593
|
+
}),
|
|
1594
|
+
configureEditorWithDocsMCP: async () => {
|
|
1595
|
+
const editor = await le({
|
|
1596
|
+
message: `Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)`,
|
|
1597
|
+
options: [
|
|
1598
|
+
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1599
|
+
{ value: "cursor", label: "Cursor" },
|
|
1600
|
+
{ value: "windsurf", label: "Windsurf" }
|
|
1601
|
+
]
|
|
1602
|
+
});
|
|
1603
|
+
if (editor === `skip`) return void 0;
|
|
1604
|
+
if (editor === `cursor`) {
|
|
1605
|
+
v.message(
|
|
1606
|
+
`
|
|
1607
|
+
Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
|
|
1608
|
+
`
|
|
1609
|
+
);
|
|
1610
|
+
}
|
|
1611
|
+
return editor;
|
|
1612
|
+
}
|
|
1526
1613
|
},
|
|
1527
1614
|
{
|
|
1528
1615
|
onCancel: () => {
|
|
@@ -1542,7 +1629,8 @@ var init = async ({
|
|
|
1542
1629
|
addExample = false,
|
|
1543
1630
|
components,
|
|
1544
1631
|
llmProvider = "openai",
|
|
1545
|
-
llmApiKey
|
|
1632
|
+
llmApiKey,
|
|
1633
|
+
configureEditorWithDocsMCP
|
|
1546
1634
|
}) => {
|
|
1547
1635
|
s.start("Initializing Mastra");
|
|
1548
1636
|
try {
|
|
@@ -1575,6 +1663,12 @@ var init = async ({
|
|
|
1575
1663
|
const pm = depsService.packageManager;
|
|
1576
1664
|
const installCommand = getPackageManagerInstallCommand(pm);
|
|
1577
1665
|
await exec2(`${pm} ${installCommand} ${aiSdkPackage}`);
|
|
1666
|
+
if (configureEditorWithDocsMCP) {
|
|
1667
|
+
await installMastraDocsMCPServer({
|
|
1668
|
+
editor: configureEditorWithDocsMCP,
|
|
1669
|
+
directory: process.cwd()
|
|
1670
|
+
});
|
|
1671
|
+
}
|
|
1578
1672
|
s.stop();
|
|
1579
1673
|
if (!llmApiKey) {
|
|
1580
1674
|
me(`
|
|
@@ -1623,11 +1717,12 @@ var execWithTimeout = async (command, timeoutMs) => {
|
|
|
1623
1717
|
}
|
|
1624
1718
|
};
|
|
1625
1719
|
var createMastraProject = async ({
|
|
1720
|
+
projectName: name,
|
|
1626
1721
|
createVersionTag,
|
|
1627
1722
|
timeout
|
|
1628
1723
|
}) => {
|
|
1629
1724
|
pe(color2.inverse("Mastra Create"));
|
|
1630
|
-
const projectName = await ae({
|
|
1725
|
+
const projectName = name ?? await ae({
|
|
1631
1726
|
message: "What do you want to name your project?",
|
|
1632
1727
|
placeholder: "my-mastra-app",
|
|
1633
1728
|
defaultValue: "my-mastra-app"
|
|
@@ -1704,13 +1799,14 @@ var createMastraProject = async ({
|
|
|
1704
1799
|
console.log("");
|
|
1705
1800
|
return { projectName };
|
|
1706
1801
|
};
|
|
1707
|
-
var create = async (
|
|
1802
|
+
var create = async (args2) => {
|
|
1708
1803
|
const { projectName } = await createMastraProject({
|
|
1709
|
-
|
|
1710
|
-
|
|
1804
|
+
projectName: args2?.projectName,
|
|
1805
|
+
createVersionTag: args2?.createVersionTag,
|
|
1806
|
+
timeout: args2?.timeout
|
|
1711
1807
|
});
|
|
1712
1808
|
const directory = "/src";
|
|
1713
|
-
if (!
|
|
1809
|
+
if (!args2.components || !args2.llmProvider || !args2.addExample) {
|
|
1714
1810
|
const result = await interactivePrompt();
|
|
1715
1811
|
await init({
|
|
1716
1812
|
...result,
|
|
@@ -1719,7 +1815,7 @@ var create = async (args) => {
|
|
|
1719
1815
|
postCreate({ projectName });
|
|
1720
1816
|
return;
|
|
1721
1817
|
}
|
|
1722
|
-
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } =
|
|
1818
|
+
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args2;
|
|
1723
1819
|
await init({
|
|
1724
1820
|
directory,
|
|
1725
1821
|
components,
|
|
@@ -1810,7 +1906,7 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
|
|
|
1810
1906
|
} catch {
|
|
1811
1907
|
}
|
|
1812
1908
|
});
|
|
1813
|
-
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
|
|
1909
|
+
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, groq, google, or cerebras)").option("-k, --llm-api-key <api-key>", "API key for the model provider").option("-e, --example", "Include example code").option("-t, --timeout [timeout]", "Configurable timeout for package installation, defaults to 60000 ms").action(async (args) => {
|
|
1814
1910
|
const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
|
|
1815
1911
|
if (args.default) {
|
|
1816
1912
|
await create({
|