create-mastra 0.0.0-storage-20250225005900 → 0.0.0-vnextWorkflows-20250417075051
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{LICENSE → LICENSE.md} +3 -1
- package/README.md +1 -1
- package/dist/index.js +270 -136
- package/dist/index.js.map +1 -1
- package/dist/templates/dev.entry.js +17 -11
- package/package.json +17 -16
- package/dist/starter-files/workflow.ts +0 -182
- package/starter-files/config.ts +0 -28
- package/starter-files/mastra-pg.docker-compose.yaml +0 -15
- package/starter-files/tools.ts +0 -95
- package/starter-files/workflow.ts +0 -183
package/dist/index.js
CHANGED
|
@@ -5,21 +5,21 @@ 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
7
|
import path, { dirname } from 'node:path';
|
|
8
|
-
import { PostHog } from 'posthog-node';
|
|
9
8
|
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import { PostHog } from 'posthog-node';
|
|
10
10
|
import h, { stdin, stdout } from 'node:process';
|
|
11
11
|
import * as f from 'node:readline';
|
|
12
12
|
import f__default from 'node:readline';
|
|
13
13
|
import tty, { WriteStream } from 'node:tty';
|
|
14
14
|
import child_process from 'node:child_process';
|
|
15
15
|
import util from 'node:util';
|
|
16
|
-
import prettier from 'prettier';
|
|
17
|
-
import fsExtra3 from 'fs-extra/esm';
|
|
18
16
|
import fs4 from 'node:fs/promises';
|
|
19
17
|
import { execa } from 'execa';
|
|
18
|
+
import fsExtra3, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
|
|
19
|
+
import prettier from 'prettier';
|
|
20
|
+
import { Transform } from 'node:stream';
|
|
20
21
|
import pino from 'pino';
|
|
21
22
|
import pretty from 'pino-pretty';
|
|
22
|
-
import { Transform } from 'node:stream';
|
|
23
23
|
import fsExtra from 'fs-extra';
|
|
24
24
|
|
|
25
25
|
var __filename = fileURLToPath(import.meta.url);
|
|
@@ -41,7 +41,7 @@ var PosthogAnalytics = class {
|
|
|
41
41
|
const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
|
|
42
42
|
this.distinctId = distinctId;
|
|
43
43
|
this.sessionId = sessionId;
|
|
44
|
-
} catch
|
|
44
|
+
} catch {
|
|
45
45
|
this.sessionId = randomUUID();
|
|
46
46
|
this.distinctId = this.getDistinctId();
|
|
47
47
|
}
|
|
@@ -64,14 +64,15 @@ var PosthogAnalytics = class {
|
|
|
64
64
|
writeCliConfig({ distinctId, sessionId }) {
|
|
65
65
|
try {
|
|
66
66
|
writeFileSync(path.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
|
|
67
|
-
} catch
|
|
67
|
+
} catch {
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
initializePostHog(apiKey, host) {
|
|
71
71
|
this.client = new PostHog(apiKey, {
|
|
72
72
|
host,
|
|
73
73
|
flushAt: 1,
|
|
74
|
-
flushInterval: 0
|
|
74
|
+
flushInterval: 0,
|
|
75
|
+
disableGeoip: false
|
|
75
76
|
});
|
|
76
77
|
this.captureSessionStart();
|
|
77
78
|
process.on("exit", () => {
|
|
@@ -80,7 +81,7 @@ var PosthogAnalytics = class {
|
|
|
80
81
|
});
|
|
81
82
|
}
|
|
82
83
|
isTelemetryEnabled() {
|
|
83
|
-
if (process.env.
|
|
84
|
+
if (process.env.MASTRA_TELEMETRY_DISABLED) {
|
|
84
85
|
return false;
|
|
85
86
|
}
|
|
86
87
|
return true;
|
|
@@ -135,17 +136,19 @@ var PosthogAnalytics = class {
|
|
|
135
136
|
event: "cli_command",
|
|
136
137
|
properties: {
|
|
137
138
|
...this.getSystemProperties(),
|
|
138
|
-
...commandData
|
|
139
|
+
...commandData,
|
|
140
|
+
origin: options?.origin || "oss"
|
|
139
141
|
}
|
|
140
142
|
});
|
|
141
|
-
} catch
|
|
143
|
+
} catch {
|
|
142
144
|
}
|
|
143
145
|
}
|
|
144
146
|
// Helper method to wrap command execution with timing
|
|
145
147
|
async trackCommandExecution({
|
|
146
148
|
command,
|
|
147
149
|
args,
|
|
148
|
-
execution
|
|
150
|
+
execution,
|
|
151
|
+
origin
|
|
149
152
|
}) {
|
|
150
153
|
const startTime = process.hrtime();
|
|
151
154
|
try {
|
|
@@ -156,7 +159,8 @@ var PosthogAnalytics = class {
|
|
|
156
159
|
command,
|
|
157
160
|
args,
|
|
158
161
|
durationMs,
|
|
159
|
-
status: "success"
|
|
162
|
+
status: "success",
|
|
163
|
+
origin
|
|
160
164
|
});
|
|
161
165
|
return result;
|
|
162
166
|
} catch (error) {
|
|
@@ -167,7 +171,8 @@ var PosthogAnalytics = class {
|
|
|
167
171
|
args,
|
|
168
172
|
durationMs,
|
|
169
173
|
status: "error",
|
|
170
|
-
error: error instanceof Error ? error.message : String(error)
|
|
174
|
+
error: error instanceof Error ? error.message : String(error),
|
|
175
|
+
origin
|
|
171
176
|
});
|
|
172
177
|
throw error;
|
|
173
178
|
}
|
|
@@ -179,7 +184,7 @@ var PosthogAnalytics = class {
|
|
|
179
184
|
}
|
|
180
185
|
try {
|
|
181
186
|
await this.client.shutdown();
|
|
182
|
-
} catch
|
|
187
|
+
} catch {
|
|
183
188
|
}
|
|
184
189
|
}
|
|
185
190
|
};
|
|
@@ -352,14 +357,14 @@ function q({onlyFirst:e=false}={}){const F=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(
|
|
|
352
357
|
`).map(t=>oD(t,u,F)).join(`
|
|
353
358
|
`)}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
359
|
`),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(`
|
|
360
|
+
`),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(`
|
|
361
|
+
`),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
362
|
`).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
363
|
`);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
364
|
`).slice(t);this.output.write(s.join(`
|
|
360
365
|
`)),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
366
|
|
|
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)}
|
|
367
|
+
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
368
|
${y(this.state)} ${s.message}
|
|
364
369
|
`,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
370
|
${color2.yellow(a)} ${i}
|
|
@@ -404,7 +409,10 @@ ${color2.gray(ee+G.repeat(r+2)+te)}
|
|
|
404
409
|
`);},ge=(s="")=>{process.stdout.write(`${color2.gray(a)}
|
|
405
410
|
${color2.gray($)} ${s}
|
|
406
411
|
|
|
407
|
-
`);},
|
|
412
|
+
`);},v={message:(s="",{symbol:n=color2.gray(a)}={})=>{const t=[`${color2.gray(a)}`];if(s){const[i,...r]=s.split(`
|
|
413
|
+
`);t.push(`${n} ${i}`,...r.map(o=>`${color2.gray(a)} ${o}`));}process.stdout.write(`${t.join(`
|
|
414
|
+
`)}
|
|
415
|
+
`);},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
416
|
`);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
417
|
`),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
418
|
|
|
@@ -791,7 +799,14 @@ var Logger = class {
|
|
|
791
799
|
this.logger = pino(
|
|
792
800
|
{
|
|
793
801
|
name: options.name || "app",
|
|
794
|
-
level: options.level || LogLevel.INFO
|
|
802
|
+
level: options.level || LogLevel.INFO,
|
|
803
|
+
formatters: {
|
|
804
|
+
level: (label) => {
|
|
805
|
+
return {
|
|
806
|
+
level: label
|
|
807
|
+
};
|
|
808
|
+
}
|
|
809
|
+
}
|
|
795
810
|
},
|
|
796
811
|
options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? pretty({
|
|
797
812
|
colorize: true,
|
|
@@ -801,7 +816,7 @@ var Logger = class {
|
|
|
801
816
|
translateTime: "SYS:standard",
|
|
802
817
|
singleLine: false
|
|
803
818
|
}) : pino.multistream([
|
|
804
|
-
...transportsAry.map(([
|
|
819
|
+
...transportsAry.map(([, transport]) => ({
|
|
805
820
|
stream: transport,
|
|
806
821
|
level: options.level || LogLevel.INFO
|
|
807
822
|
})),
|
|
@@ -857,41 +872,6 @@ function createLogger(options) {
|
|
|
857
872
|
return new Logger(options);
|
|
858
873
|
}
|
|
859
874
|
|
|
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
875
|
var DepsService = class {
|
|
896
876
|
packageManager;
|
|
897
877
|
constructor() {
|
|
@@ -985,6 +965,95 @@ var DepsService = class {
|
|
|
985
965
|
await fs4.writeFile("package.json", JSON.stringify(packageJson, null, 2));
|
|
986
966
|
}
|
|
987
967
|
};
|
|
968
|
+
function getPackageManager() {
|
|
969
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
970
|
+
const execPath = process.env.npm_execpath || "";
|
|
971
|
+
if (userAgent.includes("yarn")) {
|
|
972
|
+
return "yarn";
|
|
973
|
+
}
|
|
974
|
+
if (userAgent.includes("pnpm")) {
|
|
975
|
+
return "pnpm";
|
|
976
|
+
}
|
|
977
|
+
if (userAgent.includes("npm")) {
|
|
978
|
+
return "npm";
|
|
979
|
+
}
|
|
980
|
+
if (execPath.includes("yarn")) {
|
|
981
|
+
return "yarn";
|
|
982
|
+
}
|
|
983
|
+
if (execPath.includes("pnpm")) {
|
|
984
|
+
return "pnpm";
|
|
985
|
+
}
|
|
986
|
+
if (execPath.includes("npm")) {
|
|
987
|
+
return "npm";
|
|
988
|
+
}
|
|
989
|
+
return "npm";
|
|
990
|
+
}
|
|
991
|
+
function getPackageManagerInstallCommand(pm) {
|
|
992
|
+
switch (pm) {
|
|
993
|
+
case "npm":
|
|
994
|
+
return "install";
|
|
995
|
+
case "yarn":
|
|
996
|
+
return "add";
|
|
997
|
+
case "pnpm":
|
|
998
|
+
return "add";
|
|
999
|
+
default:
|
|
1000
|
+
return "install";
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
var args = ["-y", "@mastra/mcp-docs-server@latest"];
|
|
1004
|
+
var mcpConfig = {
|
|
1005
|
+
mcpServers: {
|
|
1006
|
+
mastra: process.platform === `win32` ? {
|
|
1007
|
+
command: "cmd",
|
|
1008
|
+
args: ["/c", "npx", ...args]
|
|
1009
|
+
} : {
|
|
1010
|
+
command: "npx",
|
|
1011
|
+
args
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
};
|
|
1015
|
+
function makeConfig(original) {
|
|
1016
|
+
return {
|
|
1017
|
+
...original,
|
|
1018
|
+
mcpServers: {
|
|
1019
|
+
...original?.mcpServers || {},
|
|
1020
|
+
...mcpConfig.mcpServers
|
|
1021
|
+
}
|
|
1022
|
+
};
|
|
1023
|
+
}
|
|
1024
|
+
async function writeMergedConfig(configPath) {
|
|
1025
|
+
const configExists = existsSync(configPath);
|
|
1026
|
+
const config = makeConfig(configExists ? await readJSON(configPath) : {});
|
|
1027
|
+
await ensureFile(configPath);
|
|
1028
|
+
await writeJSON(configPath, config, {
|
|
1029
|
+
spaces: 2
|
|
1030
|
+
});
|
|
1031
|
+
}
|
|
1032
|
+
var windsurfGlobalMCPConfigPath = path.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1033
|
+
async function installMastraDocsMCPServer({
|
|
1034
|
+
editor,
|
|
1035
|
+
directory
|
|
1036
|
+
}) {
|
|
1037
|
+
if (editor === `cursor`) await writeMergedConfig(path.join(directory, ".cursor", "mcp.json"));
|
|
1038
|
+
const windsurfIsInstalled = await globalWindsurfMCPIsAlreadyInstalled();
|
|
1039
|
+
if (editor === `windsurf` && !windsurfIsInstalled) await writeMergedConfig(windsurfGlobalMCPConfigPath);
|
|
1040
|
+
}
|
|
1041
|
+
async function globalWindsurfMCPIsAlreadyInstalled() {
|
|
1042
|
+
if (!existsSync(windsurfGlobalMCPConfigPath)) {
|
|
1043
|
+
return false;
|
|
1044
|
+
}
|
|
1045
|
+
try {
|
|
1046
|
+
const configContents = await readJSON(windsurfGlobalMCPConfigPath);
|
|
1047
|
+
if (!configContents?.mcpServers) return false;
|
|
1048
|
+
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1049
|
+
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1050
|
+
);
|
|
1051
|
+
return hasMastraMCP;
|
|
1052
|
+
} catch (e) {
|
|
1053
|
+
console.error(e);
|
|
1054
|
+
return false;
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
988
1057
|
var EnvService = class {
|
|
989
1058
|
};
|
|
990
1059
|
var FileEnvService = class extends EnvService {
|
|
@@ -1104,6 +1173,10 @@ var getAISDKPackage = (llmProvider) => {
|
|
|
1104
1173
|
return "@ai-sdk/anthropic";
|
|
1105
1174
|
case "groq":
|
|
1106
1175
|
return "@ai-sdk/groq";
|
|
1176
|
+
case "google":
|
|
1177
|
+
return "@ai-sdk/google";
|
|
1178
|
+
case "cerebras":
|
|
1179
|
+
return "@ai-sdk/cerebras";
|
|
1107
1180
|
default:
|
|
1108
1181
|
return "@ai-sdk/openai";
|
|
1109
1182
|
}
|
|
@@ -1119,7 +1192,13 @@ var getProviderImportAndModelItem = (llmProvider) => {
|
|
|
1119
1192
|
modelItem = `anthropic('claude-3-5-sonnet-20241022')`;
|
|
1120
1193
|
} else if (llmProvider === "groq") {
|
|
1121
1194
|
providerImport = `import { groq } from '${getAISDKPackage(llmProvider)}';`;
|
|
1122
|
-
modelItem = `groq('
|
|
1195
|
+
modelItem = `groq('llama-3.3-70b-versatile')`;
|
|
1196
|
+
} else if (llmProvider === "google") {
|
|
1197
|
+
providerImport = `import { google } from '${getAISDKPackage(llmProvider)}';`;
|
|
1198
|
+
modelItem = `google('gemini-1.5-pro-latest')`;
|
|
1199
|
+
} else if (llmProvider === "cerebras") {
|
|
1200
|
+
providerImport = `import { cerebras } from '${getAISDKPackage(llmProvider)}';`;
|
|
1201
|
+
modelItem = `cerebras('llama-3.3-70b')`;
|
|
1123
1202
|
}
|
|
1124
1203
|
return { providerImport, modelItem };
|
|
1125
1204
|
};
|
|
@@ -1130,6 +1209,7 @@ async function writeAgentSample(llmProvider, destPath, addExampleTool) {
|
|
|
1130
1209
|
|
|
1131
1210
|
Your primary function is to help users get weather details for specific locations. When responding:
|
|
1132
1211
|
- Always ask for a location if none is provided
|
|
1212
|
+
- If the location name isn\u2019t in English, please translate it
|
|
1133
1213
|
- If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
|
|
1134
1214
|
- Include relevant details like humidity, wind conditions, and precipitation
|
|
1135
1215
|
- Keep responses concise but informative
|
|
@@ -1137,7 +1217,7 @@ async function writeAgentSample(llmProvider, destPath, addExampleTool) {
|
|
|
1137
1217
|
${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
|
|
1138
1218
|
`;
|
|
1139
1219
|
const content = `
|
|
1140
|
-
${providerImport}
|
|
1220
|
+
${providerImport}
|
|
1141
1221
|
import { Agent } from '@mastra/core/agent';
|
|
1142
1222
|
${addExampleTool ? `import { weatherTool } from '../tools';` : ""}
|
|
1143
1223
|
|
|
@@ -1212,14 +1292,26 @@ const agent = new Agent({
|
|
|
1212
1292
|
\`,
|
|
1213
1293
|
});
|
|
1214
1294
|
|
|
1295
|
+
const forecastSchema = z.array(
|
|
1296
|
+
z.object({
|
|
1297
|
+
date: z.string(),
|
|
1298
|
+
maxTemp: z.number(),
|
|
1299
|
+
minTemp: z.number(),
|
|
1300
|
+
precipitationChance: z.number(),
|
|
1301
|
+
condition: z.string(),
|
|
1302
|
+
location: z.string(),
|
|
1303
|
+
}),
|
|
1304
|
+
);
|
|
1305
|
+
|
|
1215
1306
|
const fetchWeather = new Step({
|
|
1216
1307
|
id: 'fetch-weather',
|
|
1217
1308
|
description: 'Fetches weather forecast for a given city',
|
|
1218
1309
|
inputSchema: z.object({
|
|
1219
1310
|
city: z.string().describe('The city to get the weather for'),
|
|
1220
1311
|
}),
|
|
1312
|
+
outputSchema: forecastSchema,
|
|
1221
1313
|
execute: async ({ context }) => {
|
|
1222
|
-
const triggerData = context?.
|
|
1314
|
+
const triggerData = context?.getStepResult<{ city: string }>('trigger');
|
|
1223
1315
|
|
|
1224
1316
|
if (!triggerData) {
|
|
1225
1317
|
throw new Error('Trigger data not found');
|
|
@@ -1262,23 +1354,12 @@ const fetchWeather = new Step({
|
|
|
1262
1354
|
},
|
|
1263
1355
|
});
|
|
1264
1356
|
|
|
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
1357
|
|
|
1276
1358
|
const planActivities = new Step({
|
|
1277
1359
|
id: 'plan-activities',
|
|
1278
1360
|
description: 'Suggests activities based on weather conditions',
|
|
1279
|
-
inputSchema: forecastSchema,
|
|
1280
1361
|
execute: async ({ context, mastra }) => {
|
|
1281
|
-
const forecast = context?.
|
|
1362
|
+
const forecast = context?.getStepResult(fetchWeather);
|
|
1282
1363
|
|
|
1283
1364
|
if (!forecast || forecast.length === 0) {
|
|
1284
1365
|
throw new Error('Forecast data not found');
|
|
@@ -1295,12 +1376,15 @@ const planActivities = new Step({
|
|
|
1295
1376
|
},
|
|
1296
1377
|
]);
|
|
1297
1378
|
|
|
1379
|
+
let activitiesText = '';
|
|
1380
|
+
|
|
1298
1381
|
for await (const chunk of response.textStream) {
|
|
1299
1382
|
process.stdout.write(chunk);
|
|
1383
|
+
activitiesText += chunk;
|
|
1300
1384
|
}
|
|
1301
1385
|
|
|
1302
1386
|
return {
|
|
1303
|
-
activities:
|
|
1387
|
+
activities: activitiesText,
|
|
1304
1388
|
};
|
|
1305
1389
|
},
|
|
1306
1390
|
});
|
|
@@ -1422,6 +1506,12 @@ var getAPIKey = async (provider) => {
|
|
|
1422
1506
|
case "groq":
|
|
1423
1507
|
key = "GROQ_API_KEY";
|
|
1424
1508
|
return key;
|
|
1509
|
+
case "google":
|
|
1510
|
+
key = "GOOGLE_GENERATIVE_AI_API_KEY";
|
|
1511
|
+
return key;
|
|
1512
|
+
case "cerebras":
|
|
1513
|
+
key = "CEREBRAS_API_KEY";
|
|
1514
|
+
return key;
|
|
1425
1515
|
default:
|
|
1426
1516
|
return key;
|
|
1427
1517
|
}
|
|
@@ -1480,7 +1570,9 @@ var interactivePrompt = async () => {
|
|
|
1480
1570
|
options: [
|
|
1481
1571
|
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
1482
1572
|
{ value: "anthropic", label: "Anthropic" },
|
|
1483
|
-
{ value: "groq", label: "Groq" }
|
|
1573
|
+
{ value: "groq", label: "Groq" },
|
|
1574
|
+
{ value: "google", label: "Google" },
|
|
1575
|
+
{ value: "cerebras", label: "Cerebras" }
|
|
1484
1576
|
]
|
|
1485
1577
|
}),
|
|
1486
1578
|
llmApiKey: async ({ results: { llmProvider } }) => {
|
|
@@ -1503,7 +1595,49 @@ var interactivePrompt = async () => {
|
|
|
1503
1595
|
addExample: () => ce({
|
|
1504
1596
|
message: "Add example",
|
|
1505
1597
|
initialValue: false
|
|
1506
|
-
})
|
|
1598
|
+
}),
|
|
1599
|
+
configureEditorWithDocsMCP: async () => {
|
|
1600
|
+
const windsurfIsAlreadyInstalled = await globalWindsurfMCPIsAlreadyInstalled();
|
|
1601
|
+
const editor = await le({
|
|
1602
|
+
message: `Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)`,
|
|
1603
|
+
options: [
|
|
1604
|
+
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1605
|
+
{ value: "cursor", label: "Cursor" },
|
|
1606
|
+
{
|
|
1607
|
+
value: "windsurf",
|
|
1608
|
+
label: "Windsurf",
|
|
1609
|
+
hint: windsurfIsAlreadyInstalled ? `Already installed` : void 0
|
|
1610
|
+
}
|
|
1611
|
+
]
|
|
1612
|
+
});
|
|
1613
|
+
if (editor === `skip`) return void 0;
|
|
1614
|
+
if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
|
|
1615
|
+
v.message(`
|
|
1616
|
+
Windsurf is already installed, skipping.`);
|
|
1617
|
+
return void 0;
|
|
1618
|
+
}
|
|
1619
|
+
if (editor === `cursor`) {
|
|
1620
|
+
v.message(
|
|
1621
|
+
`
|
|
1622
|
+
Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
|
|
1623
|
+
`
|
|
1624
|
+
);
|
|
1625
|
+
}
|
|
1626
|
+
if (editor === `windsurf`) {
|
|
1627
|
+
const confirm2 = await le({
|
|
1628
|
+
message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
|
|
1629
|
+
This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
|
|
1630
|
+
options: [
|
|
1631
|
+
{ value: "yes", label: "Yes, I understand" },
|
|
1632
|
+
{ value: "skip", label: "No, skip for now" }
|
|
1633
|
+
]
|
|
1634
|
+
});
|
|
1635
|
+
if (confirm2 !== `yes`) {
|
|
1636
|
+
return void 0;
|
|
1637
|
+
}
|
|
1638
|
+
}
|
|
1639
|
+
return editor;
|
|
1640
|
+
}
|
|
1507
1641
|
},
|
|
1508
1642
|
{
|
|
1509
1643
|
onCancel: () => {
|
|
@@ -1523,7 +1657,8 @@ var init = async ({
|
|
|
1523
1657
|
addExample = false,
|
|
1524
1658
|
components,
|
|
1525
1659
|
llmProvider = "openai",
|
|
1526
|
-
llmApiKey
|
|
1660
|
+
llmApiKey,
|
|
1661
|
+
configureEditorWithDocsMCP
|
|
1527
1662
|
}) => {
|
|
1528
1663
|
s.start("Initializing Mastra");
|
|
1529
1664
|
try {
|
|
@@ -1552,9 +1687,16 @@ var init = async ({
|
|
|
1552
1687
|
}
|
|
1553
1688
|
const key = await getAPIKey(llmProvider || "openai");
|
|
1554
1689
|
const aiSdkPackage = getAISDKPackage(llmProvider);
|
|
1555
|
-
const
|
|
1690
|
+
const depsService = new DepsService();
|
|
1691
|
+
const pm = depsService.packageManager;
|
|
1556
1692
|
const installCommand = getPackageManagerInstallCommand(pm);
|
|
1557
1693
|
await exec2(`${pm} ${installCommand} ${aiSdkPackage}`);
|
|
1694
|
+
if (configureEditorWithDocsMCP) {
|
|
1695
|
+
await installMastraDocsMCPServer({
|
|
1696
|
+
editor: configureEditorWithDocsMCP,
|
|
1697
|
+
directory: process.cwd()
|
|
1698
|
+
});
|
|
1699
|
+
}
|
|
1558
1700
|
s.stop();
|
|
1559
1701
|
if (!llmApiKey) {
|
|
1560
1702
|
me(`
|
|
@@ -1576,9 +1718,12 @@ var init = async ({
|
|
|
1576
1718
|
}
|
|
1577
1719
|
};
|
|
1578
1720
|
var exec3 = util.promisify(child_process.exec);
|
|
1579
|
-
var execWithTimeout = async (command, timeoutMs
|
|
1721
|
+
var execWithTimeout = async (command, timeoutMs) => {
|
|
1580
1722
|
try {
|
|
1581
1723
|
const promise = exec3(command, { killSignal: "SIGTERM" });
|
|
1724
|
+
if (!timeoutMs) {
|
|
1725
|
+
return await promise;
|
|
1726
|
+
}
|
|
1582
1727
|
let timeoutId;
|
|
1583
1728
|
const timeout = new Promise((_, reject) => {
|
|
1584
1729
|
timeoutId = setTimeout(() => reject(new Error("Command timed out")), timeoutMs);
|
|
@@ -1599,9 +1744,28 @@ var execWithTimeout = async (command, timeoutMs = 18e4) => {
|
|
|
1599
1744
|
throw error;
|
|
1600
1745
|
}
|
|
1601
1746
|
};
|
|
1602
|
-
|
|
1747
|
+
async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
|
|
1748
|
+
let installCommand = getPackageManagerInstallCommand(pm);
|
|
1749
|
+
if (isDev) {
|
|
1750
|
+
installCommand = `${installCommand} --save-dev`;
|
|
1751
|
+
}
|
|
1752
|
+
try {
|
|
1753
|
+
await execWithTimeout(`${pm} ${installCommand} ${dependency}${versionTag}`, timeout);
|
|
1754
|
+
} catch (err) {
|
|
1755
|
+
console.log("err", err);
|
|
1756
|
+
if (versionTag === "@latest") {
|
|
1757
|
+
throw err;
|
|
1758
|
+
}
|
|
1759
|
+
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
var createMastraProject = async ({
|
|
1763
|
+
projectName: name,
|
|
1764
|
+
createVersionTag,
|
|
1765
|
+
timeout
|
|
1766
|
+
}) => {
|
|
1603
1767
|
pe(color2.inverse("Mastra Create"));
|
|
1604
|
-
const projectName = await ae({
|
|
1768
|
+
const projectName = name ?? await ae({
|
|
1605
1769
|
message: "What do you want to name your project?",
|
|
1606
1770
|
placeholder: "my-mastra-app",
|
|
1607
1771
|
defaultValue: "my-mastra-app"
|
|
@@ -1631,12 +1795,13 @@ var createMastraProject = async ({ createVersionTag }) => {
|
|
|
1631
1795
|
await exec3(`npm pkg set type="module"`);
|
|
1632
1796
|
const depsService = new DepsService();
|
|
1633
1797
|
await depsService.addScriptsToPackageJson({
|
|
1634
|
-
dev: "mastra dev"
|
|
1798
|
+
dev: "mastra dev",
|
|
1799
|
+
build: "mastra build"
|
|
1635
1800
|
});
|
|
1636
1801
|
s2.stop("Project created");
|
|
1637
1802
|
s2.start(`Installing ${pm} dependencies`);
|
|
1638
1803
|
await exec3(`${pm} ${installCommand} zod`);
|
|
1639
|
-
await exec3(`${pm} ${installCommand} typescript
|
|
1804
|
+
await exec3(`${pm} ${installCommand} typescript @types/node --save-dev`);
|
|
1640
1805
|
await exec3(`echo '{
|
|
1641
1806
|
"compilerOptions": {
|
|
1642
1807
|
"target": "ES2022",
|
|
@@ -1646,24 +1811,20 @@ var createMastraProject = async ({ createVersionTag }) => {
|
|
|
1646
1811
|
"forceConsistentCasingInFileNames": true,
|
|
1647
1812
|
"strict": true,
|
|
1648
1813
|
"skipLibCheck": true,
|
|
1814
|
+
"noEmit": true,
|
|
1649
1815
|
"outDir": "dist"
|
|
1650
1816
|
},
|
|
1651
1817
|
"include": [
|
|
1652
1818
|
"src/**/*"
|
|
1653
|
-
],
|
|
1654
|
-
"exclude": [
|
|
1655
|
-
"node_modules",
|
|
1656
|
-
"dist",
|
|
1657
|
-
".mastra"
|
|
1658
1819
|
]
|
|
1659
1820
|
}' > tsconfig.json`);
|
|
1660
1821
|
s2.stop(`${pm} dependencies installed`);
|
|
1661
1822
|
s2.start("Installing mastra");
|
|
1662
1823
|
const versionTag = createVersionTag ? `@${createVersionTag}` : "@latest";
|
|
1663
|
-
await
|
|
1824
|
+
await installMastraDependency(pm, "mastra", versionTag, true, timeout);
|
|
1664
1825
|
s2.stop("mastra installed");
|
|
1665
1826
|
s2.start("Installing @mastra/core");
|
|
1666
|
-
await
|
|
1827
|
+
await installMastraDependency(pm, "@mastra/core", versionTag, false, timeout);
|
|
1667
1828
|
s2.stop("@mastra/core installed");
|
|
1668
1829
|
s2.start("Adding .gitignore");
|
|
1669
1830
|
await exec3(`echo output.txt >> .gitignore`);
|
|
@@ -1673,17 +1834,20 @@ var createMastraProject = async ({ createVersionTag }) => {
|
|
|
1673
1834
|
await exec3(`echo .env.development >> .gitignore`);
|
|
1674
1835
|
await exec3(`echo .env >> .gitignore`);
|
|
1675
1836
|
await exec3(`echo *.db >> .gitignore`);
|
|
1837
|
+
await exec3(`echo *.db-* >> .gitignore`);
|
|
1676
1838
|
s2.stop(".gitignore added");
|
|
1677
1839
|
ge("Project created successfully");
|
|
1678
1840
|
console.log("");
|
|
1679
1841
|
return { projectName };
|
|
1680
1842
|
};
|
|
1681
|
-
var create = async (
|
|
1843
|
+
var create = async (args2) => {
|
|
1682
1844
|
const { projectName } = await createMastraProject({
|
|
1683
|
-
|
|
1845
|
+
projectName: args2?.projectName,
|
|
1846
|
+
createVersionTag: args2?.createVersionTag,
|
|
1847
|
+
timeout: args2?.timeout
|
|
1684
1848
|
});
|
|
1685
1849
|
const directory = "/src";
|
|
1686
|
-
if (!
|
|
1850
|
+
if (!args2.components || !args2.llmProvider || !args2.addExample) {
|
|
1687
1851
|
const result = await interactivePrompt();
|
|
1688
1852
|
await init({
|
|
1689
1853
|
...result,
|
|
@@ -1692,7 +1856,7 @@ var create = async (args) => {
|
|
|
1692
1856
|
postCreate({ projectName });
|
|
1693
1857
|
return;
|
|
1694
1858
|
}
|
|
1695
|
-
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } =
|
|
1859
|
+
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args2;
|
|
1696
1860
|
await init({
|
|
1697
1861
|
directory,
|
|
1698
1862
|
components,
|
|
@@ -1718,49 +1882,15 @@ async function getPackageVersion() {
|
|
|
1718
1882
|
const content = await fsExtra.readJSON(pkgJsonPath);
|
|
1719
1883
|
return content.version;
|
|
1720
1884
|
}
|
|
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
1885
|
async function getCreateVersionTag() {
|
|
1737
1886
|
try {
|
|
1738
|
-
const
|
|
1739
|
-
const
|
|
1740
|
-
const
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
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
|
-
}
|
|
1763
|
-
} catch (error) {
|
|
1887
|
+
const pkgPath = fileURLToPath(import.meta.resolve("create-mastra/package.json"));
|
|
1888
|
+
const json = await fsExtra.readJSON(pkgPath);
|
|
1889
|
+
const { stdout } = await execa("npm", ["dist-tag", "create-mastra"]);
|
|
1890
|
+
const tagLine = stdout.split("\n").find((distLine) => distLine.includes(`: ${json.version}`));
|
|
1891
|
+
const tag = tagLine ? tagLine.split(":")[0].trim() : "latest";
|
|
1892
|
+
return tag;
|
|
1893
|
+
} catch {
|
|
1764
1894
|
console.error('We could not resolve the create-mastra version tag, falling back to "latest"');
|
|
1765
1895
|
}
|
|
1766
1896
|
return "latest";
|
|
@@ -1780,16 +1910,18 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
|
|
|
1780
1910
|
command: "version"
|
|
1781
1911
|
});
|
|
1782
1912
|
console.log(`create-mastra ${version}`);
|
|
1783
|
-
} catch
|
|
1913
|
+
} catch {
|
|
1784
1914
|
}
|
|
1785
1915
|
});
|
|
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
|
|
1916
|
+
program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the 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 (projectName, args) => {
|
|
1917
|
+
const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
|
|
1787
1918
|
if (args.default) {
|
|
1788
1919
|
await create({
|
|
1789
1920
|
components: ["agents", "tools", "workflows"],
|
|
1790
1921
|
llmProvider: "openai",
|
|
1791
1922
|
addExample: false,
|
|
1792
|
-
createVersionTag
|
|
1923
|
+
createVersionTag,
|
|
1924
|
+
timeout
|
|
1793
1925
|
});
|
|
1794
1926
|
return;
|
|
1795
1927
|
}
|
|
@@ -1798,7 +1930,9 @@ program.name("create-mastra").description("Create a new Mastra project").option(
|
|
|
1798
1930
|
llmProvider: args.llm,
|
|
1799
1931
|
addExample: args.example,
|
|
1800
1932
|
llmApiKey: args["llm-api-key"],
|
|
1801
|
-
createVersionTag
|
|
1933
|
+
createVersionTag,
|
|
1934
|
+
timeout,
|
|
1935
|
+
projectName
|
|
1802
1936
|
});
|
|
1803
1937
|
});
|
|
1804
1938
|
program.parse(process.argv);
|