motia 0.6.3-beta.130-538881 → 0.6.4-beta.130

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.
Files changed (49) hide show
  1. package/dist/cjs/cli.js +16 -1
  2. package/dist/cjs/create/index.js +2 -14
  3. package/dist/cjs/create/interactive.d.ts +2 -0
  4. package/dist/cjs/create/interactive.js +28 -19
  5. package/dist/cjs/create/pull-rules.d.ts +7 -0
  6. package/dist/cjs/create/pull-rules.js +28 -0
  7. package/dist/cjs/create/setup-template.js +5 -3
  8. package/dist/cjs/create/templates/index.js +1 -1
  9. package/dist/cjs/create/templates/index.ts +1 -1
  10. package/dist/cjs/cursor-rules/dot-files/.claude/CLAUDE.md +398 -155
  11. package/dist/cjs/cursor-rules/dot-files/.claude/README.md +78 -26
  12. package/dist/cjs/cursor-rules/dot-files/.claude/settings.json +29 -65
  13. package/dist/esm/cli.js +16 -1
  14. package/dist/esm/create/index.js +2 -14
  15. package/dist/esm/create/interactive.d.ts +2 -0
  16. package/dist/esm/create/interactive.js +28 -19
  17. package/dist/esm/create/pull-rules.d.ts +7 -0
  18. package/dist/esm/create/pull-rules.js +21 -0
  19. package/dist/esm/create/setup-template.js +5 -3
  20. package/dist/esm/create/templates/index.js +1 -1
  21. package/dist/esm/create/templates/index.ts +1 -1
  22. package/dist/esm/cursor-rules/dot-files/.claude/CLAUDE.md +398 -155
  23. package/dist/esm/cursor-rules/dot-files/.claude/README.md +78 -26
  24. package/dist/esm/cursor-rules/dot-files/.claude/settings.json +29 -65
  25. package/dist/types/create/interactive.d.ts +2 -0
  26. package/dist/types/create/pull-rules.d.ts +7 -0
  27. package/package.json +4 -4
  28. /package/dist/cjs/create/templates/{typescript → nodejs}/motia-workbench.json +0 -0
  29. /package/dist/cjs/create/templates/{typescript → nodejs}/services/pet-store.ts.txt +0 -0
  30. /package/dist/cjs/create/templates/{typescript → nodejs}/services/types.ts.txt +0 -0
  31. /package/dist/cjs/create/templates/{typescript → nodejs}/steps/api.step.ts-features.json.txt +0 -0
  32. /package/dist/cjs/create/templates/{typescript → nodejs}/steps/api.step.ts.txt +0 -0
  33. /package/dist/cjs/create/templates/{typescript → nodejs}/steps/notification.step.ts.txt +0 -0
  34. /package/dist/cjs/create/templates/{typescript → nodejs}/steps/process-food-order.step.ts-features.json.txt +0 -0
  35. /package/dist/cjs/create/templates/{typescript → nodejs}/steps/process-food-order.step.ts.txt +0 -0
  36. /package/dist/cjs/create/templates/{typescript → nodejs}/steps/state-audit-cron.step.ts-features.json.txt +0 -0
  37. /package/dist/cjs/create/templates/{typescript → nodejs}/steps/state-audit-cron.step.ts.txt +0 -0
  38. /package/dist/cjs/create/templates/{typescript → nodejs}/tutorial.tsx.txt +0 -0
  39. /package/dist/esm/create/templates/{typescript → nodejs}/motia-workbench.json +0 -0
  40. /package/dist/esm/create/templates/{typescript → nodejs}/services/pet-store.ts.txt +0 -0
  41. /package/dist/esm/create/templates/{typescript → nodejs}/services/types.ts.txt +0 -0
  42. /package/dist/esm/create/templates/{typescript → nodejs}/steps/api.step.ts-features.json.txt +0 -0
  43. /package/dist/esm/create/templates/{typescript → nodejs}/steps/api.step.ts.txt +0 -0
  44. /package/dist/esm/create/templates/{typescript → nodejs}/steps/notification.step.ts.txt +0 -0
  45. /package/dist/esm/create/templates/{typescript → nodejs}/steps/process-food-order.step.ts-features.json.txt +0 -0
  46. /package/dist/esm/create/templates/{typescript → nodejs}/steps/process-food-order.step.ts.txt +0 -0
  47. /package/dist/esm/create/templates/{typescript → nodejs}/steps/state-audit-cron.step.ts-features.json.txt +0 -0
  48. /package/dist/esm/create/templates/{typescript → nodejs}/steps/state-audit-cron.step.ts.txt +0 -0
  49. /package/dist/esm/create/templates/{typescript → nodejs}/tutorial.tsx.txt +0 -0
package/dist/cjs/cli.js CHANGED
@@ -24,10 +24,25 @@ commander_1.program
24
24
  .command('create')
25
25
  .description('Create a new motia project')
26
26
  .option('-n, --name <project name>', 'The name for your project, used to create a directory, use ./ or . to create it under the existing directory')
27
+ .option('-t, --template <template>', 'The template to use for your project')
27
28
  .option('-i, --interactive', 'Use interactive prompts to create project') // it's default
29
+ .option('-c, --confirm', 'Confirm the project creation', false)
28
30
  .action((0, config_utils_1.handler)(async (arg, context) => {
29
31
  const { createInteractive } = require('./create/interactive');
30
- await createInteractive({ name: arg.name }, context);
32
+ await createInteractive({
33
+ name: arg.name,
34
+ template: arg.template,
35
+ confirm: !!arg.confirm,
36
+ }, context);
37
+ }));
38
+ commander_1.program
39
+ .command('rules')
40
+ .command('pull')
41
+ .description('Install essential AI development guides (AGENTS.md, CLAUDE.md) and optional Cursor IDE rules')
42
+ .option('-f, --force', 'Overwrite existing files')
43
+ .action((0, config_utils_1.handler)(async (arg, context) => {
44
+ const { pullRules } = require('./create/pull-rules');
45
+ await pullRules({ force: arg.force, rootDir: process.cwd() }, context);
31
46
  }));
32
47
  commander_1.program
33
48
  .command('generate-types')
@@ -12,6 +12,7 @@ const generate_types_1 = require("../generate-types");
12
12
  const version_1 = require("../version");
13
13
  const setup_template_1 = require("./setup-template");
14
14
  const utils_1 = require("./utils");
15
+ const pull_rules_1 = require("./pull-rules");
15
16
  // eslint-disable-next-line @typescript-eslint/no-require-imports
16
17
  require('ts-node').register({
17
18
  transpileOnly: true,
@@ -171,20 +172,7 @@ const create = async ({ projectName, template, cursorEnabled, context }) => {
171
172
  context.log('gitignore-created', (message) => message.tag('success').append('File').append('.gitignore', 'cyan').append('has been created.'));
172
173
  }
173
174
  if (cursorEnabled) {
174
- }
175
- const cursorTemplateDir = path_1.default.join(__dirname, '..', 'cursor-rules', 'dot-files');
176
- const files = fs_1.default.readdirSync(cursorTemplateDir);
177
- for (const file of files) {
178
- const targetFile = path_1.default.join(rootDir, file);
179
- if (!(0, utils_1.checkIfDirectoryExists)(targetFile)) {
180
- const isFolder = fs_1.default.statSync(path_1.default.join(cursorTemplateDir, file)).isDirectory();
181
- fs_1.default.cpSync(path_1.default.join(cursorTemplateDir, file), targetFile, { recursive: isFolder });
182
- context.log(`${file}-created`, (message) => message
183
- .tag('success')
184
- .append(isFolder ? 'Folder' : 'File')
185
- .append(file, 'cyan')
186
- .append('has been created.'));
187
- }
175
+ await (0, pull_rules_1.pullRules)({ force: true, rootDir }, context);
188
176
  }
189
177
  if (template) {
190
178
  await (0, setup_template_1.setupTemplate)(template, rootDir, context);
@@ -1,6 +1,8 @@
1
1
  import { CliContext } from '../cloud/config-utils';
2
2
  interface CreateInteractiveArgs {
3
3
  name?: string;
4
+ template?: string;
5
+ confirm?: boolean;
4
6
  }
5
7
  export declare const createInteractive: (args: CreateInteractiveArgs, context: CliContext) => Promise<void>;
6
8
  export {};
@@ -8,27 +8,30 @@ const inquirer_1 = __importDefault(require("inquirer"));
8
8
  const colors_1 = __importDefault(require("colors"));
9
9
  const index_1 = require("./index");
10
10
  const choices = {
11
- typescript: 'Base (TypeScript)',
11
+ nodejs: 'Base (TypeScript)',
12
12
  python: 'Base (Python)',
13
13
  };
14
14
  const createInteractive = async (args, context) => {
15
15
  context.log('welcome', (message) => message.append('\n🚀 ' + colors_1.default.bold('Welcome to Motia Project Creator!')));
16
- const questions = [
17
- {
16
+ const questions = [];
17
+ let name = args.name;
18
+ let template = args.template;
19
+ if (!args.template) {
20
+ questions.push({
18
21
  type: 'list',
19
22
  name: 'template',
20
- message: '1. What template do you want to use? (Use arrow keys)',
23
+ message: 'What template do you want to use? (Use arrow keys)',
21
24
  choices: Object.keys(choices).map((key) => ({
22
25
  name: choices[key],
23
26
  value: key,
24
27
  })),
25
- },
26
- ];
28
+ });
29
+ }
27
30
  if (!args.name) {
28
31
  questions.push({
29
32
  type: 'input',
30
33
  name: 'projectName',
31
- message: '2. Project name (leave blank to use current folder):',
34
+ message: 'Project name (leave blank to use current folder):',
32
35
  validate: (input) => {
33
36
  if (input && input.trim().length > 0) {
34
37
  if (!/^[a-zA-Z0-9][a-zA-Z0-9-_]*$/.test(input.trim())) {
@@ -40,21 +43,27 @@ const createInteractive = async (args, context) => {
40
43
  filter: (input) => input.trim(),
41
44
  });
42
45
  }
43
- questions.push({
44
- type: 'confirm',
45
- name: 'proceed',
46
- message: '3. Proceed? [Y/n]:',
47
- default: true,
48
- });
49
- const answers = await inquirer_1.default.prompt(questions);
50
- if (!answers.proceed) {
51
- context.log('cancelled', (message) => message.tag('info').append('\n❌ Project creation cancelled.'));
52
- return;
46
+ if (!args.confirm) {
47
+ questions.push({
48
+ type: 'confirm',
49
+ name: 'proceed',
50
+ message: 'Proceed? [Y/n]:',
51
+ default: true,
52
+ });
53
+ }
54
+ if (questions.length > 0) {
55
+ const answers = await inquirer_1.default.prompt(questions);
56
+ if (!args.confirm && !answers.proceed) {
57
+ context.log('cancelled', (message) => message.tag('info').append('\n❌ Project creation cancelled.'));
58
+ return;
59
+ }
60
+ name = args.name || answers.projectName;
61
+ template = args.template || answers.template;
53
62
  }
54
63
  context.log('creating', (message) => message.append('\n🔨 Creating your Motia project...\n'));
55
64
  await (0, index_1.create)({
56
- projectName: args.name || answers.projectName || '.',
57
- template: answers.template,
65
+ projectName: name || '.',
66
+ template: template || 'nodejs',
58
67
  cursorEnabled: true, // Default to true for cursor rules
59
68
  context,
60
69
  });
@@ -0,0 +1,7 @@
1
+ import { CliContext } from '../cloud/config-utils';
2
+ type PullRulesArgs = {
3
+ rootDir: string;
4
+ force?: boolean;
5
+ };
6
+ export declare const pullRules: (args: PullRulesArgs, context: CliContext) => Promise<void>;
7
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.pullRules = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const pullRules = async (args, context) => {
10
+ const cursorTemplateDir = path_1.default.join(__dirname, '..', 'cursor-rules', 'dot-files');
11
+ const files = fs_1.default.readdirSync(cursorTemplateDir);
12
+ for (const file of files) {
13
+ const targetFile = path_1.default.join(args.rootDir, file);
14
+ const isFolder = fs_1.default.statSync(path_1.default.join(cursorTemplateDir, file)).isDirectory();
15
+ const type = isFolder ? 'Folder' : 'File';
16
+ if (args.force || !fs_1.default.existsSync(targetFile)) {
17
+ fs_1.default.cpSync(path_1.default.join(cursorTemplateDir, file), targetFile, {
18
+ recursive: isFolder,
19
+ force: true,
20
+ });
21
+ context.log(`${file}-created`, (message) => message.tag('success').append(type).append(file, 'cyan').append('has been created.'));
22
+ }
23
+ else {
24
+ context.log(`${file}-skipped`, (message) => message.tag('warning').append(type).append(file, 'cyan').append('already exists, skipping...'));
25
+ }
26
+ }
27
+ };
28
+ exports.pullRules = pullRules;
@@ -4,9 +4,11 @@ exports.setupTemplate = void 0;
4
4
  const templates_1 = require("./templates");
5
5
  const setupTemplate = async (template, rootDir, context) => {
6
6
  if (!template || !(template in templates_1.templates)) {
7
- context.log('template-not-found', (message) => message.tag('failed').append(`Template ${template} not found, please use one of the following:`));
8
- context.log('available-templates', (message) => message.tag('info').append(`Available templates: \n\n ${Object.keys(templates_1.templates).join('\n')}`));
9
- return;
7
+ context.log('template-not-found', (message) => message
8
+ .tag('failed')
9
+ .append(`Template ${template} not found, please use one of the following:`)
10
+ .append(Object.keys(templates_1.templates).join(', '), 'gray'));
11
+ process.exit(1);
10
12
  }
11
13
  await templates_1.templates[template](rootDir, context);
12
14
  };
@@ -3,6 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.templates = void 0;
4
4
  const generate_1 = require("./generate");
5
5
  exports.templates = {
6
- typescript: (0, generate_1.generateTemplateSteps)('typescript'),
6
+ nodejs: (0, generate_1.generateTemplateSteps)('nodejs'),
7
7
  python: (0, generate_1.generateTemplateSteps)('python'),
8
8
  };
@@ -1,6 +1,6 @@
1
1
  import { generateTemplateSteps, Generator } from './generate'
2
2
 
3
3
  export const templates: Record<string, Generator> = {
4
- typescript: generateTemplateSteps('typescript'),
4
+ nodejs: generateTemplateSteps('nodejs'),
5
5
  python: generateTemplateSteps('python'),
6
6
  }