mastra 0.0.2 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,23 @@
1
+ ## Installation
2
+
3
+ `npm install -g mastra`
4
+
5
+ ## Commands:
6
+
7
+ `mastra init`
8
+
9
+ Initializes a new project.
10
+
11
+ Run this from the root of the Next.js app you want to add Mastra to. This will create a `mastra.config.ts` file in the root of your project, a `docker-compose.yml` file in the root of your project, and a `.env` file in the root of your project.
12
+
13
+ `mastra admin`
14
+
15
+ Starts the admin server
16
+
17
+ `mastra generate`
18
+
19
+ Generates types
20
+
21
+ `mastra migrate`
22
+
23
+ Migrate the mastra database forward
@@ -1,5 +1,120 @@
1
- import React from 'react';
2
- import { Text } from 'ink';
3
- export default function Login() {
4
- return React.createElement(Text, null, "This should open up the Next.js dev server on port 3456");
1
+ import { execa, ExecaError } from 'execa';
2
+ import fs, { existsSync } from 'fs';
3
+ import path from 'path';
4
+ import process from 'process';
5
+ import fse from 'fs-extra/esm';
6
+ async function copyUserEnvFileToAdmin(adminPath) {
7
+ const sourcePath = path.resolve(process.cwd(), '.env');
8
+ const destinationPath = path.resolve(process.cwd(), adminPath, '.env');
9
+ fse.copy(sourcePath, destinationPath, { overwrite: true }, err => {
10
+ if (err) {
11
+ console.log('An error occurred while trying to copy the .env file from ark project directory to admin.');
12
+ console.error(err);
13
+ }
14
+ });
5
15
  }
16
+ async function watchUserEnvAndSyncWithAdminEnv(adminPath) {
17
+ const userEnvPath = path.resolve(process.cwd(), '.env');
18
+ try {
19
+ fs.watch(userEnvPath, eventType => {
20
+ if (eventType === 'change') {
21
+ copyUserEnvFileToAdmin(adminPath);
22
+ }
23
+ });
24
+ }
25
+ catch (err) {
26
+ console.log('An error occurred while trying to watch the .env file in the ark project directory.');
27
+ console.error(err);
28
+ }
29
+ }
30
+ async function generateUserDefinedIntegrations({ adminPath, integrationsPath, }) {
31
+ const buildUserDefinedIntegrationScript = path.resolve(adminPath, 'scripts', 'build-user-defined-integrations.mjs');
32
+ await execa(`node`, [buildUserDefinedIntegrationScript], {
33
+ cwd: adminPath,
34
+ env: {
35
+ ...process.env,
36
+ INTEGRATION_PATH: integrationsPath,
37
+ },
38
+ });
39
+ }
40
+ export async function startNextDevServer() {
41
+ console.log('Starting Next.js dev server...');
42
+ try {
43
+ // TODO: fix cwd so it works from project directory, not just from the cli directory
44
+ const __filename = new URL(import.meta.url).pathname;
45
+ const __dirname = path.dirname(__filename);
46
+ const adminPath = path.resolve(__dirname, '..', '..', 'node_modules', '@mastra', 'admin');
47
+ copyUserEnvFileToAdmin(adminPath);
48
+ watchUserEnvAndSyncWithAdminEnv(adminPath);
49
+ const integrationsPath = path.resolve(process.cwd(), 'integrations');
50
+ if (fs.existsSync(integrationsPath)) {
51
+ generateUserDefinedIntegrations({ adminPath, integrationsPath });
52
+ }
53
+ const nextServer = execa(`npm run dev -- -p 3456`, {
54
+ cwd: adminPath,
55
+ all: true,
56
+ buffer: false,
57
+ env: {
58
+ ...process.env,
59
+ ARK_APP_DIR: process.cwd(),
60
+ },
61
+ shell: true,
62
+ stdio: 'inherit', // This will pipe directly to parent process stdout/stderr
63
+ });
64
+ process.on('SIGINT', async () => {
65
+ console.log('Stopping Next.js dev server...');
66
+ nextServer.kill();
67
+ process.exit();
68
+ });
69
+ await nextServer;
70
+ }
71
+ catch (error) {
72
+ if (error instanceof ExecaError) {
73
+ console.error(error);
74
+ }
75
+ console.error(`Error: ${error.message}`);
76
+ }
77
+ }
78
+ export function dev({ integration }) {
79
+ if (integration) {
80
+ console.log('Generating Admin for integration development...');
81
+ const configPath = path.join(process.cwd(), 'mastra.config.ts');
82
+ const dirName = path.basename(process.cwd());
83
+ const capitalized = dirName.charAt(0).toUpperCase() + dirName.slice(1);
84
+ const envPath = path.join(process.cwd(), '.env');
85
+ if (!existsSync(envPath)) {
86
+ fs.writeFileSync(envPath, '');
87
+ }
88
+ fs.writeFileSync(configPath, `
89
+ import { Config } from '@mastra/core';
90
+ import { ${capitalized}Integration } from './src';
91
+
92
+ export const config: Config = {
93
+ name: '${capitalized.toUpperCase()}',
94
+ db: {
95
+ provider: 'postgresql',
96
+ uri: process.env.DATABASE_URL!,
97
+ },
98
+ workflows: {
99
+ blueprintDirPath: '/mock-data/blueprints',
100
+ systemApis: [],
101
+ systemEvents: {},
102
+ },
103
+ routeRegistrationPath: '/api/mastra',
104
+ systemHostURL: process.env.APP_URL!,
105
+ integrations: [
106
+ new ${capitalized}Integration({
107
+ config: {
108
+ CLIENT_ID: process.env.CLIENT_ID!,
109
+ CLIENT_SECRET: process.env.CLIENT_SECRET!,
110
+ REDIRECT_URI: '/api/mastra/callback',
111
+ }
112
+ })
113
+ ]
114
+ }
115
+ `);
116
+ }
117
+ startNextDevServer().catch(console.error);
118
+ return;
119
+ }
120
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import dotenv from 'dotenv';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ export async function generate() {
5
+ console.log('Generating types...');
6
+ // Add your code here
7
+ dotenv.config();
8
+ const pkgJson = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf8'));
9
+ const kplDeps = Object.keys(pkgJson.dependencies).filter(k => {
10
+ return k.startsWith(`@mastra`) && !['@mastra/core', '@mastra/cli'].includes(k);
11
+ });
12
+ const corePath = path.join(process.cwd(), 'node_modules/@mastra/core');
13
+ const importConfigMap = [];
14
+ for (const dep of kplDeps) {
15
+ const Int = await import(path.join(process.cwd(), `node_modules/${dep}/dist/index.js`));
16
+ const IntEntry = Object.keys(Int)[0];
17
+ const inst = new Int[IntEntry]({ config: {} });
18
+ const name = inst.name;
19
+ const importName = inst.constructor.name;
20
+ const importStatement = `import { ${importName} } from '../../../${inst.name.toLowerCase()}'`;
21
+ const typeFormatName = `${name.substring(0) + name.slice(1).toLowerCase()}Format`;
22
+ const typeFormat = `type ${typeFormatName} = { name: "${name}" };`;
23
+ importConfigMap.push({ importStatement, typeFormat, typeFormatName, importName, name });
24
+ }
25
+ const writePath = path.join(corePath, 'dist', 'generated-types', 'index.d.ts');
26
+ fs.writeFileSync(writePath, `
27
+ ${importConfigMap.map(({ importStatement }) => importStatement).join(`\n`)}
28
+
29
+ export interface IntegrationMap {
30
+ ${importConfigMap.map(({ name, importName }) => `"${name}": ${importName};`).join(`\n`)}
31
+ }
32
+ `);
33
+ console.log('Types generated successfully.');
34
+ }
35
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,qBAAqB;IAErB,MAAM,CAAC,MAAM,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QAC3D,OAAO,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC,CAAC;IAEvE,MAAM,eAAe,GAAG,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,GAAG,gBAAgB,CAAC,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAErC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACzC,MAAM,eAAe,GAAG,YAAY,UAAU,qBAAqB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;QAC9F,MAAM,cAAc,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC;QAClF,MAAM,UAAU,GAAG,QAAQ,cAAc,eAAe,IAAI,MAAM,CAAC;QAEnE,eAAe,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;IAE/E,EAAE,CAAC,aAAa,CACd,SAAS,EACT;MACE,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;KAGzE,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;KAErF,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAC/C,CAAC"}
@@ -1,19 +1,61 @@
1
- import fs from 'fs-extra';
2
- import path from 'node:path';
1
+ import fs from 'fs';
2
+ import Module from 'node:module';
3
+ import path from 'path';
3
4
  import process from 'process';
4
- import React from 'react';
5
- import { Text } from 'ink';
6
- async function init(f) {
5
+ import { startNextDevServer } from './dev.js';
6
+ import { migrate } from './migrate.js';
7
+ import { provision, setupEnvFile } from './provision.js';
8
+ const require = Module.createRequire(import.meta.url);
9
+ export async function init() {
10
+ console.log('Initializing project...');
11
+ if (!checkDependencies())
12
+ return;
13
+ const projectName = getProjectName();
14
+ const { dbUrl, inngestUrl } = await provision(projectName);
15
+ await migrate(false, dbUrl);
16
+ await setupEnvFile({
17
+ dbUrl,
18
+ inngestUrl,
19
+ });
20
+ createBlueprintDir();
21
+ await startNextDevServer();
22
+ }
23
+ function createBlueprintDir() {
24
+ const dirPath = path.join(process.cwd(), 'mastra-blueprints');
25
+ if (fs.existsSync(dirPath)) {
26
+ console.log(`Blueprint folder already exists`);
27
+ return;
28
+ }
29
+ fs.mkdirSync(dirPath);
30
+ }
31
+ function getProjectName() {
32
+ const packageJsonPath = path.join(process.cwd(), 'package.json');
33
+ const pkg = require(packageJsonPath);
34
+ return pkg.name;
35
+ }
36
+ function checkDependencies() {
7
37
  try {
8
- await fs.outputJson(f, { config: '' });
9
- // const data = await fs.readJson(f)
10
- console.log(`writing bfconfig.json`); // => JP
38
+ // Check to make sure a package.json file exists..
39
+ const packageJsonPath = path.join(process.cwd(), 'package.json');
40
+ if (!fs.existsSync(packageJsonPath)) {
41
+ console.log('No package.json file found in the current directory');
42
+ return false;
43
+ }
44
+ // Check to make sure `@mastra/core` is installed.
45
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
46
+ if (!packageJson.dependencies || !packageJson.dependencies['@mastra/core']) {
47
+ console.log('Please install @mastra/core before running this command (npm install @mastra/core)');
48
+ return false;
49
+ }
50
+ if (fs.existsSync(path.join(process.cwd(), 'mastra.config.ts'))) {
51
+ console.log('mastra config file already exists');
52
+ return false;
53
+ }
54
+ return true;
11
55
  }
12
56
  catch (err) {
13
57
  console.error(err);
58
+ return false;
14
59
  }
15
60
  }
16
- export default function Init() {
17
- init(path.join(process.cwd(), 'bfconfig.json'));
18
- return React.createElement(Text, null, "This should write to bfconfig.json");
19
- }
61
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,IAAI,CAAC,iBAAiB,EAAE;QAAE,OAAO;IAEjC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;IAE3D,MAAM,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5B,MAAM,YAAY,CAAC;QACjB,KAAK;QACL,UAAU;KACX,CAAC,CAAC;IAEH,kBAAkB,EAAE,CAAC;IACrB,MAAM,kBAAkB,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IACD,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACrC,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,kDAAkD;QAClD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACnE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,kDAAkD;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,WAAW,CAAC,YAAY,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;YAClG,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { execa, ExecaError } from 'execa';
2
+ import { getPrismaBinPath, getPrismaSchemaPath } from '../utils.js';
3
+ export async function migrate(createOnly = false, dbUrl) {
4
+ console.log('Migrating database...');
5
+ try {
6
+ await checkPostgresReady(dbUrl);
7
+ await _migrate(createOnly, dbUrl);
8
+ console.log('Congrats! Your project is ready to go.');
9
+ return true;
10
+ }
11
+ catch (error) {
12
+ if (error instanceof ExecaError) {
13
+ console.log(error);
14
+ }
15
+ console.log(`Error: ${error.message}`, true);
16
+ if (error.stderr) {
17
+ console.log(`stderr: ${error.stderr}`, true);
18
+ }
19
+ }
20
+ return false;
21
+ }
22
+ export async function _migrate(createOnly = false, dbUrl, swallow = false) {
23
+ const PRISMA_BIN = getPrismaBinPath();
24
+ const PRISMA_SCHEMA = getPrismaSchemaPath();
25
+ const CREATE_ONLY = createOnly ? `--create-only` : ``;
26
+ return execa(`${PRISMA_BIN} migrate dev ${CREATE_ONLY} --schema=${PRISMA_SCHEMA} --name initial_migration`, {
27
+ env: {
28
+ ...process.env,
29
+ DB_URL: dbUrl,
30
+ },
31
+ shell: true,
32
+ all: true,
33
+ stdio: swallow ? 'ignore' : 'inherit', // inherit will pipe directly to parent process stdout/stderr
34
+ });
35
+ }
36
+ async function checkPostgresReady(dbUrl) {
37
+ for (let i = 0; i < 10; i++) {
38
+ try {
39
+ await _migrate(true, dbUrl, true); // attempts to create the migration w/o applying it
40
+ return true;
41
+ }
42
+ catch (error) {
43
+ console.log(`Waiting for postgres to be ready, attempt ${i + 1} of 10`);
44
+ }
45
+ await new Promise(resolve => setTimeout(resolve, 1000));
46
+ }
47
+ throw new Error('Postgres is not ready, aborting');
48
+ }
49
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAU,GAAG,KAAK,EAAE,KAAa;IAC7D,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAElC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAAU,GAAG,KAAK,EAAE,KAAa,EAAE,UAAmB,KAAK;IACxF,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;IAE5C,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtD,OAAO,KAAK,CAAC,GAAG,UAAU,gBAAgB,WAAW,aAAa,aAAa,2BAA2B,EAAE;QAC1G,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,MAAM,EAAE,KAAK;SACd;QACD,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,IAAI;QACT,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,6DAA6D;KACrG,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,KAAa;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,mDAAmD;YACtF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,146 @@
1
+ import { execa } from 'execa';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import prompt from 'prompt';
5
+ import fse from 'fs-extra/esm';
6
+ import { FileEnvService } from '../services/service.fileEnv.js';
7
+ import { config as defaultConfig } from '../starter-files/config.js';
8
+ import { replaceValuesInFile, copyStarterFile, sanitizeForDockerName, getInfraPorts } from '../utils.js';
9
+ const DOCKER_COMPOSE_FILE = 'mastra.docker-compose.yaml';
10
+ const KPL_CONFIG_FILE = 'mastra.config.ts';
11
+ export async function provision(projectName) {
12
+ const sanitizedProjectName = sanitizeForDockerName(projectName);
13
+ const { postgresPort, inngestPort } = await getInfraPorts();
14
+ const { userInputDbUrl, userInputInngestUrl } = await promptUserForInfra();
15
+ const shouldRunDocker = userInputDbUrl === '';
16
+ if (shouldRunDocker) {
17
+ try {
18
+ console.log('Checking if Docker is running...');
19
+ await execa('docker', ['info'], { stdio: 'ignore', shell: true });
20
+ }
21
+ catch (error) {
22
+ console.error('Docker is not running. Please start Docker and try again.');
23
+ throw error;
24
+ }
25
+ }
26
+ const { dbUrl, inngestUrl } = prepareDockerComposeFile({
27
+ userInputDbUrl: String(userInputDbUrl),
28
+ userInputInngestUrl: String(userInputInngestUrl),
29
+ sanitizedProjectName,
30
+ postgresPort,
31
+ inngestPort,
32
+ });
33
+ if (shouldRunDocker) {
34
+ try {
35
+ await execa('docker', ['compose', '-f', DOCKER_COMPOSE_FILE, 'up', '-d'], { stdio: 'inherit' });
36
+ console.log('Docker containers started successfully.');
37
+ }
38
+ catch (error) {
39
+ console.error('Failed to start Docker containers:', error);
40
+ throw error;
41
+ }
42
+ }
43
+ await setupConfig({ postgresPort, sanitizedProjectName });
44
+ await setupRoutes();
45
+ return { dbUrl, inngestUrl };
46
+ }
47
+ export function prepareDockerComposeFile({ userInputDbUrl, userInputInngestUrl, sanitizedProjectName, postgresPort, inngestPort, }) {
48
+ let inngestUrl = `http://localhost:${inngestPort}`;
49
+ let dbUrl = `postgresql://postgres:postgres@localhost:${postgresPort}/mastra?schema=mastra`;
50
+ const editDockerComposeFile = () => {
51
+ replaceValuesInFile({
52
+ filePath: DOCKER_COMPOSE_FILE,
53
+ replacements: [
54
+ { replace: sanitizedProjectName, search: 'REPLACE_PROJECT_NAME' },
55
+ { replace: `${postgresPort}`, search: 'REPLACE_DB_PORT' },
56
+ { replace: `${inngestPort}`, search: 'REPLACE_INNGEST_PORT' },
57
+ ],
58
+ });
59
+ };
60
+ if (userInputDbUrl === '' && userInputInngestUrl === '') {
61
+ copyStarterFile('docker-compose-pg-inngest.yaml', DOCKER_COMPOSE_FILE);
62
+ editDockerComposeFile();
63
+ }
64
+ else if (userInputDbUrl === '' && userInputInngestUrl !== '') {
65
+ copyStarterFile('docker-compose-pg-only.yaml', DOCKER_COMPOSE_FILE);
66
+ editDockerComposeFile();
67
+ inngestUrl = String(userInputInngestUrl);
68
+ }
69
+ else if (userInputDbUrl !== '' && userInputInngestUrl === '') {
70
+ throw new Error('Remote Inngest cannot reach local database');
71
+ }
72
+ else {
73
+ inngestUrl = String(userInputInngestUrl);
74
+ dbUrl = String(userInputDbUrl);
75
+ }
76
+ return { dbUrl, inngestUrl };
77
+ }
78
+ export async function setupRoutes() {
79
+ const { routeRegistrationPath } = defaultConfig;
80
+ const tsconfigPath = path.resolve(process.cwd(), 'tsconfig.json');
81
+ const tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, 'utf8'));
82
+ const mastraConfigAlias = '@mastra/config';
83
+ if (!tsconfig.compilerOptions) {
84
+ tsconfig.compilerOptions = {};
85
+ }
86
+ if (!tsconfig.compilerOptions.paths) {
87
+ tsconfig.compilerOptions.paths = {};
88
+ }
89
+ if (!(mastraConfigAlias in tsconfig.compilerOptions.paths)) {
90
+ tsconfig.compilerOptions.paths[mastraConfigAlias] = [KPL_CONFIG_FILE];
91
+ fs.writeFileSync('tsconfig.json', JSON.stringify(tsconfig, null, 2));
92
+ }
93
+ const apiPath = path.join(`src/app`, routeRegistrationPath, '[...mastra]/route.ts');
94
+ if (fs.existsSync(apiPath)) {
95
+ console.log('Routes file already exists');
96
+ return;
97
+ }
98
+ copyStarterFile('api.ts', apiPath);
99
+ }
100
+ async function promptUserForInfra() {
101
+ prompt.start();
102
+ const { userInputDbUrl, userInputInngestUrl } = await prompt.get({
103
+ properties: {
104
+ userInputDbUrl: {
105
+ description: 'Enter your PostgreSQL connection string (postgresql://username:password@host:port/database) or press Enter to create a new instance:',
106
+ type: 'string',
107
+ pattern: /^(postgresql:\/\/.*|)$/,
108
+ message: 'Please enter a valid PostgreSQL connection string or leave blank',
109
+ required: false,
110
+ },
111
+ userInputInngestUrl: {
112
+ description: 'Enter your Inngest server URL or press Enter to create a new instance:',
113
+ type: 'string',
114
+ pattern: /^(https?:\/\/.*|)$/,
115
+ message: 'Please enter a valid URL or leave blank',
116
+ required: false,
117
+ },
118
+ },
119
+ });
120
+ return { userInputDbUrl, userInputInngestUrl };
121
+ }
122
+ async function setupConfig({ postgresPort, sanitizedProjectName, }) {
123
+ copyStarterFile('config.ts', KPL_CONFIG_FILE);
124
+ replaceValuesInFile({
125
+ filePath: KPL_CONFIG_FILE,
126
+ replacements: [
127
+ {
128
+ search: 'REPLACE_DB_PORT',
129
+ replace: `${postgresPort}`,
130
+ },
131
+ {
132
+ search: 'PROJECT_NAME',
133
+ replace: `${sanitizedProjectName}`,
134
+ },
135
+ ],
136
+ });
137
+ }
138
+ export async function setupEnvFile({ inngestUrl, dbUrl }) {
139
+ const envPath = path.join(process.cwd(), '.env');
140
+ await fse.ensureFile(envPath);
141
+ const fileEnvService = new FileEnvService(envPath);
142
+ await fileEnvService.setEnvValue('INNGEST_URL', inngestUrl);
143
+ await fileEnvService.setEnvValue('DB_URL', dbUrl);
144
+ await fileEnvService.setEnvValue('APP_URL', 'http://localhost:3000');
145
+ }
146
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/commands/provision.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ import { Command } from 'commander';
2
+ import { dev } from './commands/dev.js';
3
+ import { generate } from './commands/generate.js';
4
+ import { init } from './commands/init.js';
5
+ import { migrate } from './commands/migrate.js';
6
+ import { validateNextJsRoot } from './utils.js';
7
+ //add the following line
8
+ const program = new Command();
9
+ program
10
+ .version('1.0.0')
11
+ .description('An example CLI for managing a directory')
12
+ .option('-l, --ls [value]', 'List directory contents')
13
+ .option('-m, --mkdir <value>', 'Create a directory')
14
+ .option('-t, --touch <value>', 'Create a file')
15
+ .action(() => {
16
+ validateNextJsRoot();
17
+ });
18
+ program
19
+ .command('init')
20
+ .description('Initialize a new project')
21
+ .action(() => {
22
+ validateNextJsRoot();
23
+ init();
24
+ });
25
+ program
26
+ .command('dev')
27
+ .description('Start the development server')
28
+ .option('-i, --integration-dev', 'Run in integration dev mode')
29
+ .action(opts => {
30
+ if (!opts?.integrationDev) {
31
+ validateNextJsRoot();
32
+ }
33
+ dev({ integration: opts?.integrationDev });
34
+ });
35
+ program
36
+ .command('generate')
37
+ .description('Generate types')
38
+ .action(() => {
39
+ validateNextJsRoot();
40
+ generate();
41
+ });
42
+ program
43
+ .command('migrate')
44
+ .description('Migrate the mastra database forward')
45
+ .action(() => {
46
+ validateNextJsRoot();
47
+ void migrate(false, process.env.DB_URL);
48
+ });
49
+ program.parse(process.argv);
50
+ const options = program.opts();
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAwB;AACxB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;KACtD,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;KACnD,MAAM,CAAC,qBAAqB,EAAE,eAAe,CAAC;KAC9C,MAAM,CAAC,GAAG,EAAE;IACX,kBAAkB,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,GAAG,EAAE;IACX,kBAAkB,EAAE,CAAC;IACrB,IAAI,EAAE,CAAC;AACT,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,CAAC;KAC9D,MAAM,CAAC,IAAI,CAAC,EAAE;IACb,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;QAC1B,kBAAkB,EAAE,CAAC;IACvB,CAAC;IACD,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,GAAG,EAAE;IACX,kBAAkB,EAAE,CAAC;IACrB,QAAQ,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,GAAG,EAAE;IACX,kBAAkB,EAAE,CAAC;IACrB,KAAK,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,MAAO,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export class EnvService {
2
+ }
3
+ //# sourceMappingURL=service.env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.env.js","sourceRoot":"","sources":["../../src/services/service.env.ts"],"names":[],"mappings":"AAAA,MAAM,OAAgB,UAAU;CAG/B"}
@@ -0,0 +1,63 @@
1
+ import * as fs from 'fs';
2
+ import { EnvService } from './service.env.js';
3
+ // TODO: Refactor (copied from admin)
4
+ export class FileEnvService extends EnvService {
5
+ constructor(filePath) {
6
+ super();
7
+ this.filePath = filePath;
8
+ }
9
+ readFile(filePath) {
10
+ return new Promise((resolve, reject) => {
11
+ fs.readFile(filePath, 'utf8', (err, data) => {
12
+ if (err)
13
+ reject(err);
14
+ else
15
+ resolve(data);
16
+ });
17
+ });
18
+ }
19
+ writeFile({ filePath, data }) {
20
+ return new Promise((resolve, reject) => {
21
+ fs.writeFile(filePath, data, 'utf8', (err) => {
22
+ if (err)
23
+ reject(err);
24
+ else
25
+ resolve();
26
+ });
27
+ });
28
+ }
29
+ async updateEnvData({ key, value, filePath = this.filePath, data, }) {
30
+ const regex = new RegExp(`^${key}=.*$`, 'm');
31
+ if (data.match(regex)) {
32
+ data = data.replace(regex, `${key}=${value}`);
33
+ }
34
+ else {
35
+ data += `\n${key}=${value}`;
36
+ }
37
+ await this.writeFile({ filePath, data });
38
+ console.log(`${key} set to ${value} in ENV file.`);
39
+ return data;
40
+ }
41
+ async getEnvValue(key) {
42
+ try {
43
+ const data = await this.readFile(this.filePath);
44
+ const regex = new RegExp(`^${key}=(.*)$`, 'm');
45
+ const match = data.match(regex);
46
+ return match ? match[1] : null;
47
+ }
48
+ catch (err) {
49
+ console.error(`Error reading ENV value: ${err}`);
50
+ return null;
51
+ }
52
+ }
53
+ async setEnvValue(key, value) {
54
+ try {
55
+ const data = await this.readFile(this.filePath);
56
+ await this.updateEnvData({ key, value, data });
57
+ }
58
+ catch (err) {
59
+ console.error(`Error writing ENV value: ${err}`);
60
+ }
61
+ }
62
+ }
63
+ //# sourceMappingURL=service.fileEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.fileEnv.js","sourceRoot":"","sources":["../../src/services/service.fileEnv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { config } from '@arkw/config';
2
+ import { createFramework } from '@arkw/core';
3
+ const handler = createFramework(config).registerRoutes();
4
+ export { handler as GET, handler as POST, handler as PUT };
5
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/starter-files/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,CAAC;AAEzD,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ export const config = {
2
+ name: 'PROJECT_NAME',
3
+ //logConfig: {}, // TODO: Add this
4
+ integrations: [],
5
+ db: {
6
+ provider: 'postgres',
7
+ uri: 'postgresql://postgres:postgres@127.0.0.1:REPLACE_DB_PORT/mastra?schema=mastra',
8
+ },
9
+ workflows: {
10
+ blueprintDirPath: '/mastra-blueprints',
11
+ systemEvents: {},
12
+ systemApis: [],
13
+ },
14
+ systemHostURL: process.env.APP_URL,
15
+ routeRegistrationPath: '/api/mastra',
16
+ };
17
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/starter-files/config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,IAAI,EAAE,cAAc;IACpB,kCAAkC;IAClC,YAAY,EAAE,EAAE;IAChB,EAAE,EAAE;QACF,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,+EAA+E;KACrF;IACD,SAAS,EAAE;QACT,gBAAgB,EAAE,oBAAoB;QACtC,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE;KACf;IACD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,OAAQ;IACnC,qBAAqB,EAAE,aAAa;CACrC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ const findLockFile = (dir) => {
4
+ const lockFiles = ['pnpm-lock.yaml', 'package-lock.json', 'yarn.lock'];
5
+ for (const file of lockFiles) {
6
+ if (fs.existsSync(path.join(dir, file))) {
7
+ return file;
8
+ }
9
+ }
10
+ const parentDir = path.resolve(dir, '..');
11
+ if (parentDir !== dir) {
12
+ return findLockFile(parentDir);
13
+ }
14
+ return null;
15
+ };
16
+ const getPackageManager = () => {
17
+ const lockFile = findLockFile(process.cwd());
18
+ switch (lockFile) {
19
+ case 'pnpm-lock.yaml':
20
+ return 'pnpm';
21
+ case 'package-lock.json':
22
+ return 'npm';
23
+ case 'yarn.lock':
24
+ return 'yarn';
25
+ default: // we will use npm if we can't figure it out
26
+ return 'npm';
27
+ }
28
+ };
29
+ export default getPackageManager;
30
+ //# sourceMappingURL=getPackageManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPackageManager.js","sourceRoot":"","sources":["../../src/utils/getPackageManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IACnC,MAAM,SAAS,GAAG,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC;IACvE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,gBAAgB;YACnB,OAAO,MAAM,CAAC;QAChB,KAAK,mBAAmB;YACtB,OAAO,KAAK,CAAC;QACf,KAAK,WAAW;YACd,OAAO,MAAM,CAAC;QAChB,SAAS,4CAA4C;YACnD,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
package/dist/utils.js ADDED
@@ -0,0 +1,89 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { check } from 'tcp-port-used';
4
+ import fse from 'fs-extra/esm';
5
+ export function replaceValuesInFile({ filePath, replacements, }) {
6
+ let fileContent = fs.readFileSync(filePath, 'utf8');
7
+ replacements.forEach(({ search, replace }) => {
8
+ fileContent = fileContent.replaceAll(search, replace);
9
+ });
10
+ fs.writeFileSync(filePath, fileContent);
11
+ }
12
+ export function getPrismaBinPath() {
13
+ return path.resolve(process.cwd(), 'node_modules', '@mastra/core', 'node_modules', 'prisma', 'node_modules', '.bin', 'prisma');
14
+ }
15
+ export function getPrismaSchemaPath() {
16
+ return path.resolve(process.cwd(), 'node_modules', '@mastra/core', 'src', 'prisma', 'schema.prisma');
17
+ }
18
+ export function copyStarterFile(inputFile, outputFile) {
19
+ const __filename = new URL(import.meta.url).pathname;
20
+ const __dirname = path.dirname(__filename);
21
+ const filePath = path.resolve(__dirname, '..', 'src', 'starter-files', inputFile);
22
+ const fileString = fs.readFileSync(filePath, 'utf8');
23
+ const outputFilePath = path.join(process.cwd(), outputFile);
24
+ if (fs.existsSync(outputFilePath)) {
25
+ console.log(`${outputFile} already exists`);
26
+ return false;
27
+ }
28
+ fse.outputFileSync(outputFilePath, fileString);
29
+ return fileString;
30
+ }
31
+ const isPortOpen = async (port) => {
32
+ return new Promise((resolve, reject) => {
33
+ check(port).then((inUse) => {
34
+ resolve(!inUse);
35
+ });
36
+ });
37
+ };
38
+ const getNextOpenPort = async (startFrom = 2222) => {
39
+ for (const port of Array.from({ length: 20 }, (_, i) => startFrom + i)) {
40
+ const isOpen = await isPortOpen(port);
41
+ if (isOpen) {
42
+ return port;
43
+ }
44
+ }
45
+ throw new Error('No open ports found after 20 attempts');
46
+ };
47
+ export async function getInfraPorts() {
48
+ let postgresPort = 5432;
49
+ let inngestPort = 8288;
50
+ const dbPortOpen = await isPortOpen(postgresPort);
51
+ const inngestPortOpen = await isPortOpen(inngestPort);
52
+ if (!dbPortOpen) {
53
+ postgresPort = (await getNextOpenPort(postgresPort));
54
+ }
55
+ if (!inngestPortOpen) {
56
+ inngestPort = (await getNextOpenPort(inngestPort));
57
+ }
58
+ return { postgresPort, inngestPort };
59
+ }
60
+ export function sanitizeForDockerName(name) {
61
+ // Convert to lowercase
62
+ let sanitized = name.toLowerCase();
63
+ // Replace any non-alphanumeric characters (excluding dashes) with dashes
64
+ sanitized = sanitized.replace(/[^a-z0-9-]/g, '-');
65
+ // Trim dashes from the start and end
66
+ sanitized = sanitized.replace(/^-+|-+$/g, '');
67
+ // Ensure name is between 2 and 255 characters
68
+ if (sanitized.length < 2) {
69
+ throw new Error('Name must be at least 2 characters long.');
70
+ }
71
+ if (sanitized.length > 255) {
72
+ sanitized = sanitized.substring(0, 255);
73
+ }
74
+ return sanitized;
75
+ }
76
+ export const validateNextJsRoot = () => {
77
+ const cwd = process.cwd();
78
+ fs.readdir(cwd, (err, files) => {
79
+ if (err) {
80
+ console.error('Error reading directory:', err);
81
+ return;
82
+ }
83
+ const configFiles = files.filter(file => file.startsWith('next.config'));
84
+ if (configFiles.length === 0) {
85
+ throw new Error('@mastra/cli should only be run at the root of your Next.js project');
86
+ }
87
+ });
88
+ };
89
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,58 +1,73 @@
1
1
  {
2
- "name": "mastra",
3
- "version": "0.0.2",
4
- "license": "MIT",
5
- "bin": "dist/cli.js",
6
- "type": "module",
7
- "engines": {
8
- "node": ">=16"
9
- },
10
- "scripts": {
11
- "build": "tsc",
12
- "dev": "tsc --watch",
13
- "test": "prettier --check . && xo && ava"
14
- },
15
- "files": [
16
- "dist"
17
- ],
18
- "dependencies": {
19
- "@types/fs-extra": "^11.0.4",
20
- "fs-extra": "^11.2.0",
21
- "ink": "^4.1.0",
22
- "pastel": "^2.0.0",
23
- "react": "^18.2.0",
24
- "zod": "^3.21.4"
25
- },
26
- "devDependencies": {
27
- "@sindresorhus/tsconfig": "^3.0.1",
28
- "@types/react": "^18.0.32",
29
- "@vdemedes/prettier-config": "^2.0.1",
30
- "ava": "^5.2.0",
31
- "chalk": "^5.2.0",
32
- "eslint-config-xo-react": "^0.27.0",
33
- "eslint-plugin-react": "^7.32.2",
34
- "eslint-plugin-react-hooks": "^4.6.0",
35
- "ink-testing-library": "^3.0.0",
36
- "prettier": "^2.8.7",
37
- "ts-node": "^10.9.1",
38
- "typescript": "^5.0.3",
39
- "xo": "^0.54.2"
40
- },
41
- "ava": {
42
- "extensions": {
43
- "ts": "module",
44
- "tsx": "module"
45
- },
46
- "nodeArguments": [
47
- "--loader=ts-node/esm"
48
- ]
49
- },
50
- "xo": {
51
- "extends": "xo-react",
52
- "prettier": true,
53
- "rules": {
54
- "react/prop-types": "off"
55
- }
56
- },
57
- "prettier": "@vdemedes/prettier-config"
58
- }
2
+ "name": "mastra",
3
+ "version": "0.1.1",
4
+ "license": "MIT",
5
+ "description": "",
6
+ "main": "index.js",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "keywords": [],
11
+ "author": "",
12
+ "type": "module",
13
+ "dependencies": {
14
+ "commander": "^12.1.0",
15
+ "execa": "^9.3.1",
16
+ "figlet": "^1.7.0",
17
+ "fs-extra": "^11.2.0",
18
+ "is-port-reachable": "^4.0.0",
19
+ "prompt": "^1.3.0",
20
+ "tcp-port-used": "^1.0.2",
21
+ "@mastra/admin": "0.1.3",
22
+ "@mastra/core": "0.1.1"
23
+ },
24
+ "devDependencies": {
25
+ "@types/fs-extra": "^11.0.4",
26
+ "@types/jest": "^29.5.12",
27
+ "@types/node": "^22.5.0",
28
+ "@types/prompt": "^1.1.8",
29
+ "@types/react": "^18",
30
+ "@types/tcp-port-used": "^1.0.4",
31
+ "dotenv": "^16.3.1",
32
+ "jest": "^29.7.0",
33
+ "ts-jest": "^29.2.4",
34
+ "typescript": "^5.5.4"
35
+ },
36
+ "jest": {
37
+ "preset": "ts-jest/presets/default-esm",
38
+ "moduleNameMapper": {
39
+ "^(\\.{1,2}/.*)\\.js$": "$1"
40
+ },
41
+ "transform": {
42
+ "^.+\\.tsx?$": [
43
+ "ts-jest",
44
+ {
45
+ "useESM": true,
46
+ "tsconfig": {
47
+ "target": "es2021",
48
+ "module": "NodeNext"
49
+ }
50
+ }
51
+ ]
52
+ },
53
+ "extensionsToTreatAsEsm": [
54
+ ".ts"
55
+ ],
56
+ "moduleFileExtensions": [
57
+ "ts",
58
+ "tsx",
59
+ "js",
60
+ "jsx",
61
+ "json",
62
+ "node"
63
+ ]
64
+ },
65
+ "scripts": {
66
+ "build": "npx tsc",
67
+ "build:dev": "npx tsc --watch",
68
+ "init": "npx tsx src/index.ts init",
69
+ "dev": "npx tsx src/index.ts dev",
70
+ "test": "pnpm jest",
71
+ "typecheck": "tsc --noEmit --incremental"
72
+ }
73
+ }
package/dist/cli.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
package/dist/cli.js DELETED
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env node
2
- import Pastel from 'pastel';
3
- const app = new Pastel({
4
- importMeta: import.meta,
5
- });
6
- await app.run();
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export default function Login(): React.JSX.Element;
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export default function Init(): React.JSX.Element;
package/readme.md DELETED
@@ -1,25 +0,0 @@
1
- # bellefond
2
-
3
- > This readme is automatically generated by [create-pastel-app](https://github.com/vadimdemedes/create-pastel-app)
4
-
5
- ## Install
6
-
7
- ```bash
8
- $ npm install --global bellefond
9
- ```
10
-
11
- ## CLI
12
-
13
- ```
14
- $ bellefond --help
15
-
16
- Usage
17
- $ bellefond
18
-
19
- Options
20
- --name Your name
21
-
22
- Examples
23
- $ bellefond2 --name=Jane
24
- Hello, Jane
25
- ```