create-mastra 0.1.0-alpha.22 → 0.1.0-alpha.24

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
@@ -1,49 +1,1346 @@
1
1
  #! /usr/bin/env node
2
2
  import { Command } from 'commander';
3
- import { PosthogAnalytics } from 'mastra';
4
- import { create } from 'mastra';
5
- import { getPackageVersion } from './utils.js';
6
- const version = await getPackageVersion();
7
- const analytics = new PosthogAnalytics({
8
- apiKey: 'phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT',
9
- host: 'https://us.posthog.com',
10
- version: version,
3
+ import { randomUUID } from 'node:crypto';
4
+ import * as fs from 'node:fs';
5
+ import fs__default, { existsSync, readFileSync, writeFileSync } from 'node:fs';
6
+ import os from 'node:os';
7
+ import path, { dirname } from 'node:path';
8
+ import { PostHog } from 'posthog-node';
9
+ import { fileURLToPath } from 'node:url';
10
+ import h, { stdin, stdout } from 'node:process';
11
+ import * as f from 'node:readline';
12
+ import f__default from 'node:readline';
13
+ import tty, { WriteStream } from 'node:tty';
14
+ import child_process from 'node:child_process';
15
+ import util from 'node:util';
16
+ import prettier from 'prettier';
17
+ import fsExtra from 'fs-extra/esm';
18
+ import fs$1 from 'node:fs/promises';
19
+ import { execa } from 'execa';
20
+ import fsExtra$1 from 'fs-extra';
21
+
22
+ const __filename = fileURLToPath(import.meta.url);
23
+ const __dirname = path.dirname(__filename);
24
+ class PosthogAnalytics {
25
+ constructor({ version, apiKey, host = "https://app.posthog.com" }) {
26
+ this.version = version;
27
+ const cliConfigPath = path.join(__dirname, "mastra-cli.json");
28
+ if (existsSync(cliConfigPath)) {
29
+ try {
30
+ const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
31
+ this.distinctId = distinctId;
32
+ this.sessionId = sessionId;
33
+ } catch (e) {
34
+ this.sessionId = randomUUID();
35
+ this.distinctId = this.getDistinctId();
36
+ }
37
+ this.writeCliConfig({
38
+ distinctId: this.distinctId,
39
+ sessionId: this.sessionId
40
+ });
41
+ } else {
42
+ this.sessionId = randomUUID();
43
+ this.distinctId = this.getDistinctId();
44
+ this.writeCliConfig({
45
+ distinctId: this.distinctId,
46
+ sessionId: this.sessionId
47
+ });
48
+ }
49
+ if (this.isTelemetryEnabled()) {
50
+ this.initializePostHog(apiKey, host);
51
+ }
52
+ }
53
+ writeCliConfig({ distinctId, sessionId }) {
54
+ try {
55
+ writeFileSync(path.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
56
+ } catch (e) {
57
+ }
58
+ }
59
+ initializePostHog(apiKey, host) {
60
+ this.client = new PostHog(apiKey, {
61
+ host,
62
+ flushAt: 1,
63
+ flushInterval: 0
64
+ });
65
+ this.captureSessionStart();
66
+ process.on("exit", () => {
67
+ this.client?.flush();
68
+ });
69
+ }
70
+ isTelemetryEnabled() {
71
+ if (process.env.NO_MASTRA_TELEMETRY) {
72
+ return false;
73
+ }
74
+ return true;
75
+ }
76
+ getDistinctId() {
77
+ const machineId = os.hostname();
78
+ return `mastra-${machineId}`;
79
+ }
80
+ getSystemProperties() {
81
+ return {
82
+ os: process.platform,
83
+ os_version: os.release(),
84
+ node_version: process.version,
85
+ platform: process.arch,
86
+ session_id: this.sessionId,
87
+ cli_version: this.version || "unknown",
88
+ machine_id: os.hostname()
89
+ };
90
+ }
91
+ captureSessionStart() {
92
+ if (!this.client) {
93
+ return;
94
+ }
95
+ this.client.capture({
96
+ distinctId: this.distinctId,
97
+ event: "cli_session_start",
98
+ properties: {
99
+ ...this.getSystemProperties()
100
+ }
101
+ });
102
+ }
103
+ trackCommand(options) {
104
+ try {
105
+ if (!this.client) {
106
+ return;
107
+ }
108
+ const commandData = {
109
+ command: options.command,
110
+ status: options.status || "success"
111
+ };
112
+ if (options.args) {
113
+ commandData.args = options.args;
114
+ }
115
+ if (options.durationMs) {
116
+ commandData.durationMs = options.durationMs;
117
+ }
118
+ if (options.error) {
119
+ commandData.error = options.error;
120
+ }
121
+ this.client.capture({
122
+ distinctId: this.distinctId,
123
+ event: "cli_command",
124
+ properties: {
125
+ ...this.getSystemProperties(),
126
+ ...commandData
127
+ }
128
+ });
129
+ } catch (e) {
130
+ }
131
+ }
132
+ // Helper method to wrap command execution with timing
133
+ async trackCommandExecution({ command, args, execution }) {
134
+ const startTime = process.hrtime();
135
+ try {
136
+ const result = await execution();
137
+ const [seconds, nanoseconds] = process.hrtime(startTime);
138
+ const durationMs = seconds * 1e3 + nanoseconds / 1e6;
139
+ this.trackCommand({
140
+ command,
141
+ args,
142
+ durationMs,
143
+ status: "success"
144
+ });
145
+ return result;
146
+ } catch (error) {
147
+ const [seconds, nanoseconds] = process.hrtime(startTime);
148
+ const durationMs = seconds * 1e3 + nanoseconds / 1e6;
149
+ this.trackCommand({
150
+ command,
151
+ args,
152
+ durationMs,
153
+ status: "error",
154
+ error: error instanceof Error ? error.message : String(error)
155
+ });
156
+ throw error;
157
+ }
158
+ }
159
+ // Ensure PostHog client is shutdown properly
160
+ async shutdown() {
161
+ if (!this.client) {
162
+ return;
163
+ }
164
+ try {
165
+ await this.client.shutdown();
166
+ } catch (e) {
167
+ }
168
+ }
169
+ }
170
+
171
+ function getDefaultExportFromCjs (x) {
172
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
173
+ }
174
+
175
+ var src;
176
+ var hasRequiredSrc;
177
+
178
+ function requireSrc () {
179
+ if (hasRequiredSrc) return src;
180
+ hasRequiredSrc = 1;
181
+
182
+ const ESC = '\x1B';
183
+ const CSI = `${ESC}[`;
184
+ const beep = '\u0007';
185
+
186
+ const cursor = {
187
+ to(x, y) {
188
+ if (!y) return `${CSI}${x + 1}G`;
189
+ return `${CSI}${y + 1};${x + 1}H`;
190
+ },
191
+ move(x, y) {
192
+ let ret = '';
193
+
194
+ if (x < 0) ret += `${CSI}${-x}D`;
195
+ else if (x > 0) ret += `${CSI}${x}C`;
196
+
197
+ if (y < 0) ret += `${CSI}${-y}A`;
198
+ else if (y > 0) ret += `${CSI}${y}B`;
199
+
200
+ return ret;
201
+ },
202
+ up: (count = 1) => `${CSI}${count}A`,
203
+ down: (count = 1) => `${CSI}${count}B`,
204
+ forward: (count = 1) => `${CSI}${count}C`,
205
+ backward: (count = 1) => `${CSI}${count}D`,
206
+ nextLine: (count = 1) => `${CSI}E`.repeat(count),
207
+ prevLine: (count = 1) => `${CSI}F`.repeat(count),
208
+ left: `${CSI}G`,
209
+ hide: `${CSI}?25l`,
210
+ show: `${CSI}?25h`,
211
+ save: `${ESC}7`,
212
+ restore: `${ESC}8`
213
+ };
214
+
215
+ const scroll = {
216
+ up: (count = 1) => `${CSI}S`.repeat(count),
217
+ down: (count = 1) => `${CSI}T`.repeat(count)
218
+ };
219
+
220
+ const erase = {
221
+ screen: `${CSI}2J`,
222
+ up: (count = 1) => `${CSI}1J`.repeat(count),
223
+ down: (count = 1) => `${CSI}J`.repeat(count),
224
+ line: `${CSI}2K`,
225
+ lineEnd: `${CSI}K`,
226
+ lineStart: `${CSI}1K`,
227
+ lines(count) {
228
+ let clear = '';
229
+ for (let i = 0; i < count; i++)
230
+ clear += this.line + (i < count - 1 ? cursor.up() : '');
231
+ if (count)
232
+ clear += cursor.left;
233
+ return clear;
234
+ }
235
+ };
236
+
237
+ src = { cursor, scroll, erase, beep };
238
+ return src;
239
+ }
240
+
241
+ var srcExports = requireSrc();
242
+
243
+ var picocolors = {exports: {}};
244
+
245
+ var hasRequiredPicocolors;
246
+
247
+ function requirePicocolors () {
248
+ if (hasRequiredPicocolors) return picocolors.exports;
249
+ hasRequiredPicocolors = 1;
250
+ let p = process || {}, argv = p.argv || [], env = p.env || {};
251
+ let isColorSupported =
252
+ !(!!env.NO_COLOR || argv.includes("--no-color")) &&
253
+ (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI);
254
+
255
+ let formatter = (open, close, replace = open) =>
256
+ input => {
257
+ let string = "" + input, index = string.indexOf(close, open.length);
258
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close
259
+ };
260
+
261
+ let replaceClose = (string, close, replace, index) => {
262
+ let result = "", cursor = 0;
263
+ do {
264
+ result += string.substring(cursor, index) + replace;
265
+ cursor = index + close.length;
266
+ index = string.indexOf(close, cursor);
267
+ } while (~index)
268
+ return result + string.substring(cursor)
269
+ };
270
+
271
+ let createColors = (enabled = isColorSupported) => {
272
+ let f = enabled ? formatter : () => String;
273
+ return {
274
+ isColorSupported: enabled,
275
+ reset: f("\x1b[0m", "\x1b[0m"),
276
+ bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"),
277
+ dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"),
278
+ italic: f("\x1b[3m", "\x1b[23m"),
279
+ underline: f("\x1b[4m", "\x1b[24m"),
280
+ inverse: f("\x1b[7m", "\x1b[27m"),
281
+ hidden: f("\x1b[8m", "\x1b[28m"),
282
+ strikethrough: f("\x1b[9m", "\x1b[29m"),
283
+
284
+ black: f("\x1b[30m", "\x1b[39m"),
285
+ red: f("\x1b[31m", "\x1b[39m"),
286
+ green: f("\x1b[32m", "\x1b[39m"),
287
+ yellow: f("\x1b[33m", "\x1b[39m"),
288
+ blue: f("\x1b[34m", "\x1b[39m"),
289
+ magenta: f("\x1b[35m", "\x1b[39m"),
290
+ cyan: f("\x1b[36m", "\x1b[39m"),
291
+ white: f("\x1b[37m", "\x1b[39m"),
292
+ gray: f("\x1b[90m", "\x1b[39m"),
293
+
294
+ bgBlack: f("\x1b[40m", "\x1b[49m"),
295
+ bgRed: f("\x1b[41m", "\x1b[49m"),
296
+ bgGreen: f("\x1b[42m", "\x1b[49m"),
297
+ bgYellow: f("\x1b[43m", "\x1b[49m"),
298
+ bgBlue: f("\x1b[44m", "\x1b[49m"),
299
+ bgMagenta: f("\x1b[45m", "\x1b[49m"),
300
+ bgCyan: f("\x1b[46m", "\x1b[49m"),
301
+ bgWhite: f("\x1b[47m", "\x1b[49m"),
302
+
303
+ blackBright: f("\x1b[90m", "\x1b[39m"),
304
+ redBright: f("\x1b[91m", "\x1b[39m"),
305
+ greenBright: f("\x1b[92m", "\x1b[39m"),
306
+ yellowBright: f("\x1b[93m", "\x1b[39m"),
307
+ blueBright: f("\x1b[94m", "\x1b[39m"),
308
+ magentaBright: f("\x1b[95m", "\x1b[39m"),
309
+ cyanBright: f("\x1b[96m", "\x1b[39m"),
310
+ whiteBright: f("\x1b[97m", "\x1b[39m"),
311
+
312
+ bgBlackBright: f("\x1b[100m", "\x1b[49m"),
313
+ bgRedBright: f("\x1b[101m", "\x1b[49m"),
314
+ bgGreenBright: f("\x1b[102m", "\x1b[49m"),
315
+ bgYellowBright: f("\x1b[103m", "\x1b[49m"),
316
+ bgBlueBright: f("\x1b[104m", "\x1b[49m"),
317
+ bgMagentaBright: f("\x1b[105m", "\x1b[49m"),
318
+ bgCyanBright: f("\x1b[106m", "\x1b[49m"),
319
+ bgWhiteBright: f("\x1b[107m", "\x1b[49m"),
320
+ }
321
+ };
322
+
323
+ picocolors.exports = createColors();
324
+ picocolors.exports.createColors = createColors;
325
+ return picocolors.exports;
326
+ }
327
+
328
+ var picocolorsExports = /*@__PURE__*/ requirePicocolors();
329
+ var color = /*@__PURE__*/getDefaultExportFromCjs(picocolorsExports);
330
+
331
+ function q({onlyFirst:e=false}={}){const F=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(F,e?undefined:"g")}const J=q();function S(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(J,"")}function T$1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var j$1={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(t){var s=t.charCodeAt(0),C=t.length==2?t.charCodeAt(1):0,D=s;return 55296<=s&&s<=56319&&56320<=C&&C<=57343&&(s&=1023,C&=1023,D=s<<10|C,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(t){var s=this.eastAsianWidth(t);return s=="F"||s=="W"||s=="A"?2:1};function F(t){return t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(t){for(var s=F(t),C=0,D=0;D<s.length;D++)C=C+this.characterLength(s[D]);return C},u.slice=function(t,s,C){textLen=u.length(t),s=s||0,C=C||1,s<0&&(s=textLen+s),C<0&&(C=textLen+C);for(var D="",i=0,n=F(t),E=0;E<n.length;E++){var h=n[E],o=u.length(h);if(i>=s-(o==2?1:0))if(i+o<=C)D+=h;else break;i+=o;}return D};})(j$1);var Q$1=j$1.exports;const X=T$1(Q$1);var DD=function(){return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const uD=T$1(DD);function A(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:true,...u},e=S(e),e.length===0))return 0;e=e.replace(uD()," ");const F=u.ambiguousIsNarrow?1:2;let t=0;for(const s of e){const C=s.codePointAt(0);if(C<=31||C>=127&&C<=159||C>=768&&C<=879)continue;switch(X.eastAsianWidth(s)){case "F":case "W":t+=2;break;case "A":t+=F;break;default:t+=1;}}return t}const d=10,M$1=(e=0)=>u=>`\x1B[${u+e}m`,P$1=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,W=(e=0)=>(u,F,t)=>`\x1B[${38+e};2;${u};${F};${t}m`,r={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(r.modifier);const FD=Object.keys(r.color),eD=Object.keys(r.bgColor);[...FD,...eD];function tD(){const e=new Map;for(const[u,F]of Object.entries(r)){for(const[t,s]of Object.entries(F))r[t]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},F[t]=r[t],e.set(s[0],s[1]);Object.defineProperty(r,u,{value:F,enumerable:false});}return Object.defineProperty(r,"codes",{value:e,enumerable:false}),r.color.close="\x1B[39m",r.bgColor.close="\x1B[49m",r.color.ansi=M$1(),r.color.ansi256=P$1(),r.color.ansi16m=W(),r.bgColor.ansi=M$1(d),r.bgColor.ansi256=P$1(d),r.bgColor.ansi16m=W(d),Object.defineProperties(r,{rgbToAnsi256:{value:(u,F,t)=>u===F&&F===t?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(F/255*5)+Math.round(t/255*5),enumerable:false},hexToRgb:{value:u=>{const F=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!F)return [0,0,0];let[t]=F;t.length===3&&(t=[...t].map(C=>C+C).join(""));const s=Number.parseInt(t,16);return [s>>16&255,s>>8&255,s&255]},enumerable:false},hexToAnsi256:{value:u=>r.rgbToAnsi256(...r.hexToRgb(u)),enumerable:false},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let F,t,s;if(u>=232)F=((u-232)*10+8)/255,t=F,s=F;else {u-=16;const i=u%36;F=Math.floor(u/36)/5,t=Math.floor(i/6)/5,s=i%6/5;}const C=Math.max(F,t,s)*2;if(C===0)return 30;let D=30+(Math.round(s)<<2|Math.round(t)<<1|Math.round(F));return C===2&&(D+=60),D},enumerable:false},rgbToAnsi:{value:(u,F,t)=>r.ansi256ToAnsi(r.rgbToAnsi256(u,F,t)),enumerable:false},hexToAnsi:{value:u=>r.ansi256ToAnsi(r.hexToAnsi256(u)),enumerable:false}}),r}const sD=tD(),g=new Set(["\x1B","\x9B"]),CD=39,b$1="\x07",O="[",iD="]",I$1="m",w=`${iD}8;;`,N=e=>`${g.values().next().value}${O}${e}${I$1}`,L=e=>`${g.values().next().value}${w}${e}${b$1}`,rD=e=>e.split(" ").map(u=>A(u)),y$1=(e,u,F)=>{const t=[...u];let s=false,C=false,D=A(S(e[e.length-1]));for(const[i,n]of t.entries()){const E=A(n);if(D+E<=F?e[e.length-1]+=n:(e.push(n),D=0),g.has(n)&&(s=true,C=t.slice(i+1).join("").startsWith(w)),s){C?n===b$1&&(s=false,C=false):n===I$1&&(s=false);continue}D+=E,D===F&&i<t.length-1&&(e.push(""),D=0);}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop());},ED=e=>{const u=e.split(" ");let F=u.length;for(;F>0&&!(A(u[F-1])>0);)F--;return F===u.length?e:u.slice(0,F).join(" ")+u.slice(F).join("")},oD=(e,u,F={})=>{if(F.trim!==false&&e.trim()==="")return "";let t="",s,C;const D=rD(e);let i=[""];for(const[E,h]of e.split(" ").entries()){F.trim!==false&&(i[i.length-1]=i[i.length-1].trimStart());let o=A(i[i.length-1]);if(E!==0&&(o>=u&&(F.wordWrap===false||F.trim===false)&&(i.push(""),o=0),(o>0||F.trim===false)&&(i[i.length-1]+=" ",o++)),F.hard&&D[E]>u){const B=u-o,p=1+Math.floor((D[E]-B-1)/u);Math.floor((D[E]-1)/u)<p&&i.push(""),y$1(i,h,u);continue}if(o+D[E]>u&&o>0&&D[E]>0){if(F.wordWrap===false&&o<u){y$1(i,h,u);continue}i.push("");}if(o+D[E]>u&&F.wordWrap===false){y$1(i,h,u);continue}i[i.length-1]+=h;}F.trim!==false&&(i=i.map(E=>ED(E)));const n=[...i.join(`
332
+ `)];for(const[E,h]of n.entries()){if(t+=h,g.has(h)){const{groups:B}=new RegExp(`(?:\\${O}(?<code>\\d+)m|\\${w}(?<uri>.*)${b$1})`).exec(n.slice(E).join(""))||{groups:{}};if(B.code!==undefined){const p=Number.parseFloat(B.code);s=p===CD?undefined:p;}else B.uri!==undefined&&(C=B.uri.length===0?undefined:B.uri);}const o=sD.codes.get(Number(s));n[E+1]===`
333
+ `?(C&&(t+=L("")),s&&o&&(t+=N(o))):h===`
334
+ `&&(s&&o&&(t+=N(s)),C&&(t+=L(C)));}return t};function R$1(e,u,F){return String(e).normalize().replace(/\r\n/g,`
335
+ `).split(`
336
+ `).map(t=>oD(t,u,F)).join(`
337
+ `)}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(`
338
+ `),t=u.split(`
339
+ `),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!==undefined&&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(`
340
+ `),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(`
341
+ `).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(`
342
+ `);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(`
343
+ `).slice(t);this.output.write(s.join(`
344
+ `)),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}${color.inverse(color.hidden("_"))}`;else {const F=this.value.slice(0,this.cursor),t=this.value.slice(this.cursor);this.valueWithCursor=`${F}${color.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();}}
345
+
346
+ 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 color.cyan(Y);case "cancel":return color.red(P);case "error":return color.yellow(V);case "submit":return color.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?color.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=`${color.gray(a)}
347
+ ${y(this.state)} ${s.message}
348
+ `,t=s.placeholder?color.inverse(s.placeholder[0])+color.dim(s.placeholder.slice(1)):color.inverse(color.hidden("_")),i=this.value?this.valueWithCursor:t;switch(this.state){case "error":return `${n.trim()}
349
+ ${color.yellow(a)} ${i}
350
+ ${color.yellow($)} ${color.yellow(this.error)}
351
+ `;case "submit":return `${n}${color.gray(a)} ${color.dim(this.value||s.placeholder)}`;case "cancel":return `${n}${color.gray(a)} ${color.strikethrough(color.dim(this.value??""))}${this.value?.trim()?`
352
+ `+color.gray(a):""}`;default:return `${n}${color.cyan(a)} ${i}
353
+ ${color.cyan($)}
354
+ `}}}).prompt(),ce=s=>{const n=s.active??"Yes",t=s.inactive??"No";return new BD({active:n,inactive:t,initialValue:s.initialValue??true,render(){const i=`${color.gray(a)}
355
+ ${y(this.state)} ${s.message}
356
+ `,r=this.value?n:t;switch(this.state){case "submit":return `${i}${color.gray(a)} ${color.dim(r)}`;case "cancel":return `${i}${color.gray(a)} ${color.strikethrough(color.dim(r))}
357
+ ${color.gray(a)}`;default:return `${i}${color.cyan(a)} ${this.value?`${color.green(I)} ${n}`:`${color.dim(T)} ${color.dim(n)}`} ${color.dim("/")} ${this.value?`${color.dim(T)} ${color.dim(t)}`:`${color.green(I)} ${t}`}
358
+ ${color.cyan($)}
359
+ `}}}).prompt()},le=s=>{const n=(t,i)=>{const r=t.label??String(t.value);switch(i){case "selected":return `${color.dim(r)}`;case "active":return `${color.green(I)} ${r} ${t.hint?color.dim(`(${t.hint})`):""}`;case "cancelled":return `${color.strikethrough(color.dim(r))}`;default:return `${color.dim(T)} ${color.dim(r)}`}};return new $D({options:s.options,initialValue:s.initialValue,render(){const t=`${color.gray(a)}
360
+ ${y(this.state)} ${s.message}
361
+ `;switch(this.state){case "submit":return `${t}${color.gray(a)} ${n(this.options[this.cursor],"selected")}`;case "cancel":return `${t}${color.gray(a)} ${n(this.options[this.cursor],"cancelled")}
362
+ ${color.gray(a)}`;default:return `${t}${color.cyan(a)} ${E({cursor:this.cursor,options:this.options,maxItems:s.maxItems,style:(i,r)=>n(i,r?"active":"inactive")}).join(`
363
+ ${color.cyan(a)} `)}
364
+ ${color.cyan($)}
365
+ `}}}).prompt()},$e=s=>{const n=(t,i)=>{const r=t.label??String(t.value);return i==="active"?`${color.cyan(j)} ${r} ${t.hint?color.dim(`(${t.hint})`):""}`:i==="selected"?`${color.green(b)} ${color.dim(r)}`:i==="cancelled"?`${color.strikethrough(color.dim(r))}`:i==="active-selected"?`${color.green(b)} ${r} ${t.hint?color.dim(`(${t.hint})`):""}`:i==="submitted"?`${color.dim(r)}`:`${color.dim(B)} ${color.dim(r)}`};return new vD({options:s.options,initialValues:s.initialValues,required:s.required??true,cursorAt:s.cursorAt,validate(t){if(this.required&&t.length===0)return `Please select at least one option.
366
+ ${color.reset(color.dim(`Press ${color.gray(color.bgWhite(color.inverse(" space ")))} to select, ${color.gray(color.bgWhite(color.inverse(" enter ")))} to submit`))}`},render(){let t=`${color.gray(a)}
367
+ ${y(this.state)} ${s.message}
368
+ `;const i=(r,o)=>{const c=this.value.includes(r.value);return o&&c?n(r,"active-selected"):c?n(r,"selected"):n(r,o?"active":"inactive")};switch(this.state){case "submit":return `${t}${color.gray(a)} ${this.options.filter(({value:r})=>this.value.includes(r)).map(r=>n(r,"submitted")).join(color.dim(", "))||color.dim("none")}`;case "cancel":{const r=this.options.filter(({value:o})=>this.value.includes(o)).map(o=>n(o,"cancelled")).join(color.dim(", "));return `${t}${color.gray(a)} ${r.trim()?`${r}
369
+ ${color.gray(a)}`:""}`}case "error":{const r=this.error.split(`
370
+ `).map((o,c)=>c===0?`${color.yellow($)} ${color.yellow(o)}`:` ${o}`).join(`
371
+ `);return t+color.yellow(a)+" "+E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
372
+ ${color.yellow(a)} `)+`
373
+ `+r+`
374
+ `}default:return `${t}${color.cyan(a)} ${E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
375
+ ${color.cyan(a)} `)}
376
+ ${color.cyan($)}
377
+ `}}}).prompt()},R=s=>s.replace(ye(),""),me=(s="",n="")=>{const t=`
378
+ ${s}
379
+ `.split(`
380
+ `),i=R(n).length,r=Math.max(t.reduce((c,l)=>(l=R(l),l.length>c?l.length:c),0),i)+2,o=t.map(c=>`${color.gray(a)} ${color.dim(c)}${" ".repeat(r-R(c).length)}${color.gray(a)}`).join(`
381
+ `);process.stdout.write(`${color.gray(a)}
382
+ ${color.green(M)} ${color.reset(n)} ${color.gray(G.repeat(Math.max(r-i-1,1))+H)}
383
+ ${o}
384
+ ${color.gray(ee+G.repeat(r+2)+te)}
385
+ `);},he=(s="")=>{process.stdout.write(`${color.gray($)} ${color.red(s)}
386
+
387
+ `);},pe=(s="")=>{process.stdout.write(`${color.gray(Q)} ${s}
388
+ `);},ge=(s="")=>{process.stdout.write(`${color.gray(a)}
389
+ ${color.gray($)} ${s}
390
+
391
+ `);},_=()=>{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(`${color.gray(a)}
392
+ `);let m=0,w=0;p(),i=setInterval(()=>{const L=color.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?color.green(M):m===1?color.red(P):color.red(V);process.stdout.write(srcExports.cursor.move(-999,0)),process.stdout.write(srcExports.erase.down(1)),process.stdout.write(`${w} ${o}
393
+ `),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};
394
+
395
+ // eslint-disable-next-line no-warning-comments
396
+ // TODO: Use a better method when it's added to Node.js (https://github.com/nodejs/node/pull/40240)
397
+ // Lots of optionals here to support Deno.
398
+ const hasColors = tty?.WriteStream?.prototype?.hasColors?.() ?? false;
399
+
400
+ const format = (open, close) => {
401
+ if (!hasColors) {
402
+ return input => input;
403
+ }
404
+
405
+ const openCode = `\u001B[${open}m`;
406
+ const closeCode = `\u001B[${close}m`;
407
+
408
+ return input => {
409
+ const string = input + ''; // eslint-disable-line no-implicit-coercion -- This is faster.
410
+ let index = string.indexOf(closeCode);
411
+
412
+ if (index === -1) {
413
+ // Note: Intentionally not using string interpolation for performance reasons.
414
+ return openCode + string + closeCode;
415
+ }
416
+
417
+ // Handle nested colors.
418
+
419
+ // We could have done this, but it's too slow (as of Node.js 22).
420
+ // return openCode + string.replaceAll(closeCode, openCode) + closeCode;
421
+
422
+ let result = openCode;
423
+ let lastIndex = 0;
424
+
425
+ while (index !== -1) {
426
+ result += string.slice(lastIndex, index) + openCode;
427
+ lastIndex = index + closeCode.length;
428
+ index = string.indexOf(closeCode, lastIndex);
429
+ }
430
+
431
+ result += string.slice(lastIndex) + closeCode;
432
+
433
+ return result;
434
+ };
435
+ };
436
+
437
+ const reset = format(0, 0);
438
+ const bold = format(1, 22);
439
+ const dim = format(2, 22);
440
+ const italic = format(3, 23);
441
+ const underline = format(4, 24);
442
+ const overline = format(53, 55);
443
+ const inverse = format(7, 27);
444
+ const hidden = format(8, 28);
445
+ const strikethrough = format(9, 29);
446
+
447
+ const black = format(30, 39);
448
+ const red = format(31, 39);
449
+ const green = format(32, 39);
450
+ const yellow = format(33, 39);
451
+ const blue = format(34, 39);
452
+ const magenta = format(35, 39);
453
+ const cyan = format(36, 39);
454
+ const white = format(37, 39);
455
+ const gray = format(90, 39);
456
+
457
+ const bgBlack = format(40, 49);
458
+ const bgRed = format(41, 49);
459
+ const bgGreen = format(42, 49);
460
+ const bgYellow = format(43, 49);
461
+ const bgBlue = format(44, 49);
462
+ const bgMagenta = format(45, 49);
463
+ const bgCyan = format(46, 49);
464
+ const bgWhite = format(47, 49);
465
+ const bgGray = format(100, 49);
466
+
467
+ const redBright = format(91, 39);
468
+ const greenBright = format(92, 39);
469
+ const yellowBright = format(93, 39);
470
+ const blueBright = format(94, 39);
471
+ const magentaBright = format(95, 39);
472
+ const cyanBright = format(96, 39);
473
+ const whiteBright = format(97, 39);
474
+
475
+ const bgRedBright = format(101, 49);
476
+ const bgGreenBright = format(102, 49);
477
+ const bgYellowBright = format(103, 49);
478
+ const bgBlueBright = format(104, 49);
479
+ const bgMagentaBright = format(105, 49);
480
+ const bgCyanBright = format(106, 49);
481
+ const bgWhiteBright = format(107, 49);
482
+
483
+ var yoctocolors = /*#__PURE__*/Object.freeze({
484
+ __proto__: null,
485
+ bgBlack: bgBlack,
486
+ bgBlue: bgBlue,
487
+ bgBlueBright: bgBlueBright,
488
+ bgCyan: bgCyan,
489
+ bgCyanBright: bgCyanBright,
490
+ bgGray: bgGray,
491
+ bgGreen: bgGreen,
492
+ bgGreenBright: bgGreenBright,
493
+ bgMagenta: bgMagenta,
494
+ bgMagentaBright: bgMagentaBright,
495
+ bgRed: bgRed,
496
+ bgRedBright: bgRedBright,
497
+ bgWhite: bgWhite,
498
+ bgWhiteBright: bgWhiteBright,
499
+ bgYellow: bgYellow,
500
+ bgYellowBright: bgYellowBright,
501
+ black: black,
502
+ blue: blue,
503
+ blueBright: blueBright,
504
+ bold: bold,
505
+ cyan: cyan,
506
+ cyanBright: cyanBright,
507
+ dim: dim,
508
+ gray: gray,
509
+ green: green,
510
+ greenBright: greenBright,
511
+ hidden: hidden,
512
+ inverse: inverse,
513
+ italic: italic,
514
+ magenta: magenta,
515
+ magentaBright: magentaBright,
516
+ overline: overline,
517
+ red: red,
518
+ redBright: redBright,
519
+ reset: reset,
520
+ strikethrough: strikethrough,
521
+ underline: underline,
522
+ white: white,
523
+ whiteBright: whiteBright,
524
+ yellow: yellow,
525
+ yellowBright: yellowBright
11
526
  });
12
- const program = new Command();
13
- program
14
- .version(`${version}`, '-v, --version')
15
- .description(`create-mastra ${version}`)
16
- .action(async () => {
527
+
528
+ const isUnicodeSupported = h.platform !== 'win32' || Boolean(h.env.WT_SESSION);
529
+
530
+ const isInteractive = stream => Boolean(
531
+ stream.isTTY
532
+ && h.env.TERM !== 'dumb'
533
+ && !('CI' in h.env),
534
+ );
535
+
536
+ const infoSymbol = blue(isUnicodeSupported ? 'ℹ' : 'i');
537
+ const successSymbol = green(isUnicodeSupported ? '✔' : '√');
538
+ const warningSymbol = yellow(isUnicodeSupported ? '⚠' : '‼');
539
+ const errorSymbol = red(isUnicodeSupported ? '✖️' : '×');
540
+
541
+ const defaultSpinner = {
542
+ frames: isUnicodeSupported
543
+ ? [
544
+ '⠋',
545
+ '⠙',
546
+ '⠹',
547
+ '⠸',
548
+ '⠼',
549
+ '⠴',
550
+ '⠦',
551
+ '⠧',
552
+ '⠇',
553
+ '⠏',
554
+ ]
555
+ : [
556
+ '-',
557
+ '\\',
558
+ '|',
559
+ '/',
560
+ ],
561
+ interval: 80,
562
+ };
563
+
564
+ class YoctoSpinner {
565
+ #frames;
566
+ #interval;
567
+ #currentFrame = -1;
568
+ #timer;
569
+ #text;
570
+ #stream;
571
+ #color;
572
+ #lines = 0;
573
+ #exitHandlerBound;
574
+ #isInteractive;
575
+ #lastSpinnerFrameTime = 0;
576
+
577
+ constructor(options = {}) {
578
+ const spinner = options.spinner ?? defaultSpinner;
579
+ this.#frames = spinner.frames;
580
+ this.#interval = spinner.interval;
581
+ this.#text = options.text ?? '';
582
+ this.#stream = options.stream ?? h.stderr;
583
+ this.#color = options.color ?? 'cyan';
584
+ this.#isInteractive = isInteractive(this.#stream);
585
+ this.#exitHandlerBound = this.#exitHandler.bind(this);
586
+ }
587
+
588
+ start(text) {
589
+ if (text) {
590
+ this.#text = text;
591
+ }
592
+
593
+ if (this.isSpinning) {
594
+ return this;
595
+ }
596
+
597
+ this.#hideCursor();
598
+ this.#render();
599
+ this.#subscribeToProcessEvents();
600
+
601
+ this.#timer = setInterval(() => {
602
+ this.#render();
603
+ }, this.#interval);
604
+
605
+ return this;
606
+ }
607
+
608
+ stop(finalText) {
609
+ if (!this.isSpinning) {
610
+ return this;
611
+ }
612
+
613
+ clearInterval(this.#timer);
614
+ this.#timer = undefined;
615
+ this.#showCursor();
616
+ this.clear();
617
+ this.#unsubscribeFromProcessEvents();
618
+
619
+ if (finalText) {
620
+ this.#stream.write(`${finalText}\n`);
621
+ }
622
+
623
+ return this;
624
+ }
625
+
626
+ #symbolStop(symbol, text) {
627
+ return this.stop(`${symbol} ${text ?? this.#text}`);
628
+ }
629
+
630
+ success(text) {
631
+ return this.#symbolStop(successSymbol, text);
632
+ }
633
+
634
+ error(text) {
635
+ return this.#symbolStop(errorSymbol, text);
636
+ }
637
+
638
+ warning(text) {
639
+ return this.#symbolStop(warningSymbol, text);
640
+ }
641
+
642
+ info(text) {
643
+ return this.#symbolStop(infoSymbol, text);
644
+ }
645
+
646
+ get isSpinning() {
647
+ return this.#timer !== undefined;
648
+ }
649
+
650
+ get text() {
651
+ return this.#text;
652
+ }
653
+
654
+ set text(value = '') {
655
+ this.#text = value;
656
+ this.#render();
657
+ }
658
+
659
+ get color() {
660
+ return this.#color;
661
+ }
662
+
663
+ set color(value) {
664
+ this.#color = value;
665
+ this.#render();
666
+ }
667
+
668
+ clear() {
669
+ if (!this.#isInteractive) {
670
+ return this;
671
+ }
672
+
673
+ this.#stream.cursorTo(0);
674
+
675
+ for (let index = 0; index < this.#lines; index++) {
676
+ if (index > 0) {
677
+ this.#stream.moveCursor(0, -1);
678
+ }
679
+
680
+ this.#stream.clearLine(1);
681
+ }
682
+
683
+ this.#lines = 0;
684
+
685
+ return this;
686
+ }
687
+
688
+ #render() {
689
+ // Ensure we only update the spinner frame at the wanted interval,
690
+ // even if the frame method is called more often.
691
+ const now = Date.now();
692
+ if (this.#currentFrame === -1 || now - this.#lastSpinnerFrameTime >= this.#interval) {
693
+ this.#currentFrame = ++this.#currentFrame % this.#frames.length;
694
+ this.#lastSpinnerFrameTime = now;
695
+ }
696
+
697
+ const applyColor = yoctocolors[this.#color] ?? cyan;
698
+ const frame = this.#frames[this.#currentFrame];
699
+ let string = `${applyColor(frame)} ${this.#text}`;
700
+
701
+ if (!this.#isInteractive) {
702
+ string += '\n';
703
+ }
704
+
705
+ this.clear();
706
+ this.#write(string);
707
+
708
+ if (this.#isInteractive) {
709
+ this.#lines = this.#lineCount(string);
710
+ }
711
+ }
712
+
713
+ #write(text) {
714
+ this.#stream.write(text);
715
+ }
716
+
717
+ #lineCount(text) {
718
+ const width = this.#stream.columns ?? 80;
719
+ const lines = text.split('\n');
720
+
721
+ let lineCount = 0;
722
+ for (const line of lines) {
723
+ lineCount += Math.max(1, Math.ceil(line.length / width));
724
+ }
725
+
726
+ return lineCount;
727
+ }
728
+
729
+ #hideCursor() {
730
+ if (this.#isInteractive) {
731
+ this.#write('\u001B[?25l');
732
+ }
733
+ }
734
+
735
+ #showCursor() {
736
+ if (this.#isInteractive) {
737
+ this.#write('\u001B[?25h');
738
+ }
739
+ }
740
+
741
+ #subscribeToProcessEvents() {
742
+ h.once('SIGINT', this.#exitHandlerBound);
743
+ h.once('SIGTERM', this.#exitHandlerBound);
744
+ }
745
+
746
+ #unsubscribeFromProcessEvents() {
747
+ h.off('SIGINT', this.#exitHandlerBound);
748
+ h.off('SIGTERM', this.#exitHandlerBound);
749
+ }
750
+
751
+ #exitHandler(signal) {
752
+ if (this.isSpinning) {
753
+ this.stop();
754
+ }
755
+
756
+ // SIGINT: 128 + 2
757
+ // SIGTERM: 128 + 15
758
+ const exitCode = signal === 'SIGINT' ? 130 : (signal === 'SIGTERM' ? 143 : 1);
759
+ h.exit(exitCode);
760
+ }
761
+ }
762
+
763
+ function yoctoSpinner(options) {
764
+ return new YoctoSpinner(options);
765
+ }
766
+
767
+ class DepsService {
768
+ constructor() {
769
+ this.packageManager = this.getPackageManager();
770
+ }
771
+ findLockFile(dir) {
772
+ const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock"];
773
+ for (const file of lockFiles) {
774
+ if (fs__default.existsSync(path.join(dir, file))) {
775
+ return file;
776
+ }
777
+ }
778
+ const parentDir = path.resolve(dir, "..");
779
+ if (parentDir !== dir) {
780
+ return this.findLockFile(parentDir);
781
+ }
782
+ return null;
783
+ }
784
+ getPackageManager() {
785
+ const lockFile = this.findLockFile(process.cwd());
786
+ switch (lockFile) {
787
+ case "pnpm-lock.yaml":
788
+ return "pnpm";
789
+ case "package-lock.json":
790
+ return "npm";
791
+ case "yarn.lock":
792
+ return "yarn";
793
+ default:
794
+ return "npm";
795
+ }
796
+ }
797
+ async installPackages(packages) {
798
+ let runCommand = this.packageManager;
799
+ if (this.packageManager === "npm") {
800
+ runCommand = `${this.packageManager} i`;
801
+ } else {
802
+ runCommand = `${this.packageManager} add`;
803
+ }
804
+ const packageList = packages.join(" ");
805
+ return execa(`${runCommand} ${packageList}`, {
806
+ all: true,
807
+ shell: true,
808
+ stdio: "inherit"
809
+ });
810
+ }
811
+ async checkDependencies(dependencies) {
17
812
  try {
18
- analytics.trackCommand({
19
- command: 'version',
20
- });
21
- console.log(`create-mastra ${version}`);
813
+ const packageJsonPath = path.join(process.cwd(), "package.json");
814
+ try {
815
+ await fs$1.access(packageJsonPath);
816
+ } catch {
817
+ return "No package.json file found in the current directory";
818
+ }
819
+ const packageJson = JSON.parse(await fs$1.readFile(packageJsonPath, "utf-8"));
820
+ for (const dependency of dependencies) {
821
+ if (!packageJson.dependencies || !packageJson.dependencies[dependency]) {
822
+ return `Please install ${dependency} before running this command (${this.packageManager} install ${dependency})`;
823
+ }
824
+ }
825
+ return "ok";
826
+ } catch (err) {
827
+ console.error(err);
828
+ return "Could not check dependencies";
22
829
  }
23
- catch (e) { }
830
+ }
831
+ async getProjectName() {
832
+ try {
833
+ const packageJsonPath = path.join(process.cwd(), "package.json");
834
+ const packageJson = await fs$1.readFile(packageJsonPath, "utf-8");
835
+ const pkg = JSON.parse(packageJson);
836
+ return pkg.name;
837
+ } catch (err) {
838
+ throw err;
839
+ }
840
+ }
841
+ async getPackageVersion() {
842
+ const __filename = fileURLToPath(import.meta.url);
843
+ const __dirname = dirname(__filename);
844
+ const pkgJsonPath = path.join(__dirname, "..", "..", "package.json");
845
+ const content = await fsExtra.readJSON(pkgJsonPath);
846
+ return content.version;
847
+ }
848
+ async addScriptsToPackageJson(scripts) {
849
+ const packageJson = JSON.parse(await fs$1.readFile("package.json", "utf-8"));
850
+ packageJson.scripts = {
851
+ ...packageJson.scripts,
852
+ ...scripts
853
+ };
854
+ await fs$1.writeFile("package.json", JSON.stringify(packageJson, null, 2));
855
+ }
856
+ }
857
+
858
+ class EnvService {
859
+ }
860
+
861
+ class FileEnvService extends EnvService {
862
+ constructor(filePath) {
863
+ super();
864
+ this.filePath = filePath;
865
+ }
866
+ readFile(filePath) {
867
+ return new Promise((resolve, reject) => {
868
+ fs.readFile(filePath, "utf8", (err, data) => {
869
+ if (err)
870
+ reject(err);
871
+ else
872
+ resolve(data);
873
+ });
874
+ });
875
+ }
876
+ writeFile({ filePath, data }) {
877
+ return new Promise((resolve, reject) => {
878
+ fs.writeFile(filePath, data, "utf8", (err) => {
879
+ if (err)
880
+ reject(err);
881
+ else
882
+ resolve();
883
+ });
884
+ });
885
+ }
886
+ async updateEnvData({ key, value, filePath = this.filePath, data }) {
887
+ const regex = new RegExp(`^${key}=.*$`, "m");
888
+ if (data.match(regex)) {
889
+ data = data.replace(regex, `${key}=${value}`);
890
+ } else {
891
+ data += `
892
+ ${key}=${value}`;
893
+ }
894
+ await this.writeFile({ filePath, data });
895
+ console.log(`${key} set to ${value} in ENV file.`);
896
+ return data;
897
+ }
898
+ async getEnvValue(key) {
899
+ try {
900
+ const data = await this.readFile(this.filePath);
901
+ const regex = new RegExp(`^${key}=(.*)$`, "m");
902
+ const match = data.match(regex);
903
+ return match?.[1] || null;
904
+ } catch (err) {
905
+ console.error(`Error reading ENV value: ${err}`);
906
+ return null;
907
+ }
908
+ }
909
+ async setEnvValue(key, value) {
910
+ try {
911
+ const data = await this.readFile(this.filePath);
912
+ await this.updateEnvData({ key, value, data });
913
+ } catch (err) {
914
+ console.error(`Error writing ENV value: ${err}`);
915
+ }
916
+ }
917
+ }
918
+
919
+ class FileService {
920
+ /**
921
+ *
922
+ * @param inputFile the file in the starter files directory to copy
923
+ * @param outputFilePath the destination path
924
+ * @param replaceIfExists flag to replace if it exists
925
+ * @returns
926
+ */
927
+ async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
928
+ const __filename = fileURLToPath(import.meta.url);
929
+ const __dirname = path.dirname(__filename);
930
+ const filePath = path.resolve(__dirname, "..", "starter-files", inputFile);
931
+ const fileString = fs__default.readFileSync(filePath, "utf8");
932
+ if (fs__default.existsSync(outputFilePath) && !replaceIfExists) {
933
+ console.log(`${outputFilePath} already exists`);
934
+ return false;
935
+ }
936
+ await fsExtra.outputFile(outputFilePath, fileString);
937
+ return true;
938
+ }
939
+ async setupEnvFile({ dbUrl }) {
940
+ const envPath = path.join(process.cwd(), ".env.development");
941
+ await fsExtra.ensureFile(envPath);
942
+ const fileEnvService = new FileEnvService(envPath);
943
+ await fileEnvService.setEnvValue("DB_URL", dbUrl);
944
+ }
945
+ getFirstExistingFile(files) {
946
+ for (const f of files) {
947
+ if (fs__default.existsSync(f)) {
948
+ return f;
949
+ }
950
+ }
951
+ throw new Error("Missing required file, checked the following paths: " + files.join(", "));
952
+ }
953
+ replaceValuesInFile({ filePath, replacements }) {
954
+ let fileContent = fs__default.readFileSync(filePath, "utf8");
955
+ replacements.forEach(({ search, replace }) => {
956
+ fileContent = fileContent.replaceAll(search, replace);
957
+ });
958
+ fs__default.writeFileSync(filePath, fileContent);
959
+ }
960
+ }
961
+
962
+ const logger = {
963
+ log(args) {
964
+ console.log(args);
965
+ },
966
+ error(args) {
967
+ console.log(color.red(args));
968
+ },
969
+ warn(args) {
970
+ console.log(color.yellow(args));
971
+ },
972
+ info(args) {
973
+ console.log(color.cyan(args));
974
+ },
975
+ success(args) {
976
+ console.log(color.green(args));
977
+ },
978
+ break() {
979
+ console.log("");
980
+ }
981
+ };
982
+
983
+ const exec$1 = util.promisify(child_process.exec);
984
+ const modelToConfigMap = {
985
+ openai: { provider: "OPEN_AI", name: "gpt-4o", toolChoice: "auto" },
986
+ anthropic: { provider: "ANTHROPIC", name: "claude-3-5-sonnet-20241022", toolChoice: "auto" },
987
+ groq: { provider: "GROQ", name: "llama3-groq-70b-8192-tool-use-preview", toolChoice: "auto" }
988
+ };
989
+ async function writeAgentSample(llmProvider, destPath, addExampleTool) {
990
+ const model = modelToConfigMap[llmProvider];
991
+ const instructions = `
992
+ You are a helpful weather assistant that provides accurate weather information.
993
+
994
+ Your primary function is to help users get weather details for specific locations. When responding:
995
+ - Always ask for a location if none is provided
996
+ - Include relevant details like humidity, wind conditions, and precipitation
997
+ - Keep responses concise but informative
998
+
999
+ ${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
1000
+ `;
1001
+ const content = `
1002
+ import { Agent } from '@mastra/core';
1003
+ ${addExampleTool ? `import { weatherTool } from '../tools';` : ""}
1004
+
1005
+ export const weatherAgent = new Agent({
1006
+ name: 'Weather Agent',
1007
+ instructions: \`${instructions}\`,
1008
+ model: ${JSON.stringify(model, null, 2)},
1009
+ ${addExampleTool ? "tools: { weatherTool }," : ""}
1010
+ });
1011
+ `;
1012
+ const formattedContent = await prettier.format(content, {
1013
+ parser: "typescript",
1014
+ singleQuote: true
1015
+ });
1016
+ await fs$1.writeFile(destPath, "");
1017
+ await fs$1.writeFile(destPath, formattedContent);
1018
+ }
1019
+ async function writeWorkflowSample(destPath) {
1020
+ const fileService = new FileService();
1021
+ await fileService.copyStarterFile("workflow.ts", destPath);
1022
+ }
1023
+ async function writeToolSample(destPath) {
1024
+ const fileService = new FileService();
1025
+ await fileService.copyStarterFile("tools.ts", destPath);
1026
+ }
1027
+ async function writeCodeSampleForComponents(llmprovider, component, destPath, components) {
1028
+ switch (component) {
1029
+ case "agents":
1030
+ return writeAgentSample(llmprovider, destPath, components.includes("tools"));
1031
+ case "tools":
1032
+ return writeToolSample(destPath);
1033
+ case "workflows":
1034
+ return writeWorkflowSample(destPath);
1035
+ default:
1036
+ return "";
1037
+ }
1038
+ }
1039
+ const createComponentsDir = async (dirPath, component) => {
1040
+ const componentPath = dirPath + `/${component}`;
1041
+ await fsExtra.ensureDir(componentPath);
1042
+ };
1043
+ const writeIndexFile = async ({ dirPath, addAgent, addExample, addWorkflow }) => {
1044
+ const indexPath = dirPath + "/index.ts";
1045
+ const destPath = path.join(indexPath);
1046
+ try {
1047
+ await fs$1.writeFile(destPath, "");
1048
+ const filteredExports = [
1049
+ addWorkflow ? `workflows: { weatherWorkflow },` : "",
1050
+ addAgent ? `agents: { weatherAgent },` : ""
1051
+ ].filter(Boolean);
1052
+ if (!addExample) {
1053
+ await fs$1.writeFile(destPath, `
1054
+ import { Mastra } from '@mastra/core';
1055
+
1056
+ export const mastra = new Mastra()
1057
+ `);
1058
+ return;
1059
+ }
1060
+ await fs$1.writeFile(destPath, `
1061
+ import { Mastra, createLogger } from '@mastra/core';
1062
+ ${addWorkflow ? `import { weatherWorkflow } from './workflows';` : ""}
1063
+ ${addAgent ? `import { weatherAgent } from './agents';` : ""}
1064
+
1065
+ export const mastra = new Mastra({
1066
+ ${filteredExports.join("\n ")}
1067
+ logger: createLogger({
1068
+ type: 'CONSOLE',
1069
+ level: 'INFO',
1070
+ }),
24
1071
  });
25
- program
26
- .name('create-mastra')
27
- .description('Create a new Mastra project')
28
- .option('--default', 'Quick start with defaults(src, OpenAI, no examples)')
29
- .option('-c, --components <components>', 'Comma-separated list of components (agents, tools, workflows)')
30
- .option('-l, --llm <model-provider>', 'Default model provider (openai, anthropic, or groq)')
31
- .option('-k, --llm-api-key <api-key>', 'API key for the model provider')
32
- .option('-e, --example', 'Include example code')
33
- .action(async (args) => {
34
- if (args.default) {
35
- await create({
36
- components: ['agents', 'tools', 'workflows'],
37
- llmProvider: 'openai',
38
- addExample: false,
1072
+ `);
1073
+ } catch (err) {
1074
+ throw err;
1075
+ }
1076
+ };
1077
+ yoctoSpinner({ text: "Installing Mastra core dependencies\n" });
1078
+ const getAPIKey = async (provider) => {
1079
+ let key = "OPENAI_API_KEY";
1080
+ switch (provider) {
1081
+ case "anthropic":
1082
+ key = "ANTHROPIC_API_KEY";
1083
+ return key;
1084
+ case "groq":
1085
+ key = "GROQ_API_KEY";
1086
+ return key;
1087
+ default:
1088
+ return key;
1089
+ }
1090
+ };
1091
+ const writeAPIKey = async ({ provider, apiKey = "your-api-key" }) => {
1092
+ const key = await getAPIKey(provider);
1093
+ await exec$1(`echo ${key}=${apiKey} >> .env.development`);
1094
+ };
1095
+ const createMastraDir = async (directory) => {
1096
+ let dir = directory.trim().split("/").filter((item) => item !== "");
1097
+ const dirPath = path.join(process.cwd(), ...dir, "mastra");
1098
+ try {
1099
+ await fs$1.access(dirPath);
1100
+ return { ok: false };
1101
+ } catch {
1102
+ await fsExtra.ensureDir(dirPath);
1103
+ return { ok: true, dirPath };
1104
+ }
1105
+ };
1106
+ const writeCodeSample = async (dirPath, component, llmProvider, components) => {
1107
+ const destPath = dirPath + `/${component}/index.ts`;
1108
+ try {
1109
+ await writeCodeSampleForComponents(llmProvider, component, destPath, components);
1110
+ } catch (err) {
1111
+ throw err;
1112
+ }
1113
+ };
1114
+ const interactivePrompt = async () => {
1115
+ pe(color.inverse("Mastra Init"));
1116
+ const mastraProject = await ve({
1117
+ directory: () => ae({
1118
+ message: "Where should we create the Mastra files? (default: src/)",
1119
+ placeholder: "src/",
1120
+ defaultValue: "src/"
1121
+ }),
1122
+ components: () => $e({
1123
+ message: "Choose components to install:",
1124
+ options: [
1125
+ { value: "agents", label: "Agents", hint: "recommended" },
1126
+ {
1127
+ value: "workflows",
1128
+ label: "Workflows"
1129
+ }
1130
+ ]
1131
+ }),
1132
+ shouldAddTools: () => ce({
1133
+ message: "Add tools?",
1134
+ initialValue: false
1135
+ }),
1136
+ llmProvider: () => le({
1137
+ message: "Select default provider:",
1138
+ options: [
1139
+ { value: "openai", label: "OpenAI", hint: "recommended" },
1140
+ { value: "anthropic", label: "Anthropic" },
1141
+ { value: "groq", label: "Groq" }
1142
+ ]
1143
+ }),
1144
+ llmApiKey: async ({ results: { llmProvider } }) => {
1145
+ const keyChoice = await le({
1146
+ message: `Enter your ${llmProvider} API key?`,
1147
+ options: [
1148
+ { value: "skip", label: "Skip for now", hint: "default" },
1149
+ { value: "enter", label: "Enter API key" }
1150
+ ],
1151
+ initialValue: "skip"
1152
+ });
1153
+ if (keyChoice === "enter") {
1154
+ return ae({
1155
+ message: "Enter your API key:",
1156
+ placeholder: "sk-..."
39
1157
  });
40
- return;
1158
+ }
1159
+ return undefined;
1160
+ },
1161
+ addExample: () => ce({
1162
+ message: "Add example",
1163
+ initialValue: false
1164
+ })
1165
+ }, {
1166
+ onCancel: () => {
1167
+ he("Operation cancelled.");
1168
+ process.exit(0);
1169
+ }
1170
+ });
1171
+ const { shouldAddTools, components, ...rest } = mastraProject;
1172
+ const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
1173
+ return { ...rest, components: mastraComponents };
1174
+ };
1175
+
1176
+ const s = _();
1177
+ const init = async ({ directory, addExample = false, components, llmProvider = "openai", llmApiKey }) => {
1178
+ s.start("Initializing Mastra");
1179
+ try {
1180
+ const result = await createMastraDir(directory);
1181
+ if (!result.ok) {
1182
+ s.stop(color.inverse(" Mastra already initialized "));
1183
+ return { success: false };
1184
+ }
1185
+ const dirPath = result.dirPath;
1186
+ await Promise.all([
1187
+ writeIndexFile({
1188
+ dirPath,
1189
+ addExample,
1190
+ addWorkflow: components.includes("workflows"),
1191
+ addAgent: components.includes("agents")
1192
+ }),
1193
+ ...components.map((component) => createComponentsDir(dirPath, component)),
1194
+ writeAPIKey({ provider: llmProvider, apiKey: llmApiKey })
1195
+ ]);
1196
+ if (addExample) {
1197
+ await Promise.all([
1198
+ components.map((component) => writeCodeSample(dirPath, component, llmProvider, components))
1199
+ ]);
41
1200
  }
1201
+ const key = await getAPIKey(llmProvider || "openai");
1202
+ s.stop();
1203
+ if (!llmApiKey) {
1204
+ me(`
1205
+ ${color.green("Mastra initialized successfully!")}
1206
+
1207
+ Add your ${color.cyan(key)} as an environment variable
1208
+ in your ${color.cyan(".env.development")} file
1209
+ `);
1210
+ } else {
1211
+ me(`
1212
+ ${color.green("Mastra initialized successfully!")}
1213
+ `);
1214
+ }
1215
+ return { success: true };
1216
+ } catch (err) {
1217
+ s.stop(color.inverse("An error occurred while initializing Mastra"));
1218
+ console.error(err);
1219
+ return { success: false };
1220
+ }
1221
+ };
1222
+
1223
+ const exec = util.promisify(child_process.exec);
1224
+ const createMastraProject = async () => {
1225
+ pe(color.inverse("Mastra Create"));
1226
+ const projectName = await ae({
1227
+ message: "What do you want to name your project?",
1228
+ placeholder: "my-mastra-app",
1229
+ defaultValue: "my-mastra-app"
1230
+ });
1231
+ if (lD(projectName)) {
1232
+ he("Operation cancelled");
1233
+ process.exit(0);
1234
+ }
1235
+ const s = _();
1236
+ s.start("Creating project");
1237
+ try {
1238
+ await fs$1.mkdir(projectName);
1239
+ } catch (error) {
1240
+ if (error instanceof Error && "code" in error && error.code === "EEXIST") {
1241
+ s.stop(`A directory named "${projectName}" already exists. Please choose a different name or delete the existing directory.`);
1242
+ process.exit(1);
1243
+ }
1244
+ throw error;
1245
+ }
1246
+ process.chdir(projectName);
1247
+ s.message("Creating project");
1248
+ await exec(`npm init -y`);
1249
+ const depsService = new DepsService();
1250
+ await depsService.addScriptsToPackageJson({
1251
+ dev: "mastra dev"
1252
+ });
1253
+ s.stop("Project created");
1254
+ s.start("Installing npm dependencies");
1255
+ await exec(`npm i zod`);
1256
+ await exec(`npm i typescript tsx @types/node --save-dev`);
1257
+ s.stop("NPM dependencies installed");
1258
+ s.start("Installing mastra");
1259
+ await exec(`npm i -D mastra`);
1260
+ s.stop("mastra installed");
1261
+ s.start("Installing @mastra/core");
1262
+ await exec(`npm i @mastra/core@alpha`);
1263
+ s.stop("@mastra/core installed");
1264
+ s.start("Adding .gitignore");
1265
+ await exec(`echo output.txt >> .gitignore`);
1266
+ await exec(`echo node_modules >> .gitignore`);
1267
+ await exec(`echo dist >> .gitignore`);
1268
+ s.stop(".gitignore added");
1269
+ ge("Project created successfully");
1270
+ logger.break();
1271
+ return { projectName };
1272
+ };
1273
+
1274
+ const create = async (args) => {
1275
+ const { projectName } = await createMastraProject();
1276
+ const directory = "/src";
1277
+ if (!args.components || !args.llmProvider || !args.addExample) {
1278
+ const result = await interactivePrompt();
1279
+ await init({
1280
+ ...result,
1281
+ llmApiKey: result?.llmApiKey
1282
+ });
1283
+ postCreate({ projectName });
1284
+ return;
1285
+ }
1286
+ const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args;
1287
+ await init({
1288
+ directory,
1289
+ components,
1290
+ llmProvider,
1291
+ addExample,
1292
+ llmApiKey
1293
+ });
1294
+ postCreate({ projectName });
1295
+ };
1296
+ const postCreate = ({ projectName }) => {
1297
+ ge(`
1298
+ ${color.green("To start your project:")}
1299
+
1300
+ ${color.cyan("cd")} ${projectName}
1301
+ ${color.cyan("npm run dev")}
1302
+ `);
1303
+ };
1304
+
1305
+ async function getPackageVersion() {
1306
+ const __filename = fileURLToPath(import.meta.url);
1307
+ const __dirname = dirname(__filename);
1308
+ const pkgJsonPath = path.join(__dirname, "..", "package.json");
1309
+ const content = await fsExtra$1.readJSON(pkgJsonPath);
1310
+ return content.version;
1311
+ }
1312
+
1313
+ const version = await getPackageVersion();
1314
+ const analytics = new PosthogAnalytics({
1315
+ apiKey: "phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT",
1316
+ host: "https://us.posthog.com",
1317
+ version
1318
+ });
1319
+ const program = new Command();
1320
+ program.version(`${version}`, "-v, --version").description(`create-mastra ${version}`).action(async () => {
1321
+ try {
1322
+ analytics.trackCommand({
1323
+ command: "version"
1324
+ });
1325
+ console.log(`create-mastra ${version}`);
1326
+ } catch (e) {
1327
+ }
1328
+ });
1329
+ 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) => {
1330
+ if (args.default) {
42
1331
  await create({
43
- components: args.components,
44
- llmProvider: args.llm,
45
- addExample: args.example,
46
- llmApiKey: args['llm-api-key'],
1332
+ components: ["agents", "tools", "workflows"],
1333
+ llmProvider: "openai",
1334
+ addExample: false
47
1335
  });
1336
+ return;
1337
+ }
1338
+ await create({
1339
+ components: args.components,
1340
+ llmProvider: args.llm,
1341
+ addExample: args.example,
1342
+ llmApiKey: args["llm-api-key"]
1343
+ });
48
1344
  });
49
1345
  program.parse(process.argv);
1346
+ //# sourceMappingURL=index.js.map