@mailmodo/cli 0.0.54-beta.pr56.87 → 0.0.54-beta.pr56.88

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.
@@ -49,7 +49,7 @@ export default class Login extends BaseCommand {
49
49
  else {
50
50
  this.log(` ${chalk.dim('1.')} Run ${chalk.cyan('mailmodo init')} to generate an email sequence.`);
51
51
  }
52
- this.log(` ${chalk.dim('2.')} Run ${chalk.cyan('mailmodo logout')} to log in with another account.\n`);
52
+ this.log(` ${chalk.dim(yamlRestored ? '1.' : '2.')} Run ${chalk.cyan('mailmodo logout')} to log in with another account.\n`);
53
53
  return;
54
54
  }
55
55
  }
@@ -68,6 +68,7 @@ export declare abstract class BaseCommand extends Command {
68
68
  * settings and all email sequence definitions.
69
69
  */
70
70
  protected ensureYaml(): Promise<MailmodoYaml>;
71
+ private fetchAndWriteYaml;
71
72
  /**
72
73
  * Attempts to fetch mailmodo.yaml from the server and save it locally.
73
74
  * Returns null silently on any failure so callers can fall through to an error.
@@ -95,20 +95,36 @@ export class BaseCommand extends Command {
95
95
  return restored;
96
96
  this.error(ERRORS.NO_YAML);
97
97
  }
98
+ async fetchAndWriteYaml(client) {
99
+ try {
100
+ const response = await client.getRawText(API_ENDPOINTS.ASSETS_YAML);
101
+ if (!response.ok || !response.data)
102
+ return false;
103
+ await writeFile(join(process.cwd(), YAML_FILE), response.data);
104
+ return true;
105
+ }
106
+ catch {
107
+ return false;
108
+ }
109
+ }
98
110
  /**
99
111
  * Attempts to fetch mailmodo.yaml from the server and save it locally.
100
112
  * Returns null silently on any failure so callers can fall through to an error.
101
113
  */
102
114
  async restoreYamlFromServer() {
103
- if (!this.apiClient)
104
- return null;
105
115
  try {
106
- const response = await this.apiClient.getRawText(API_ENDPOINTS.ASSETS_YAML);
107
- if (!response.ok || !response.data)
116
+ let client = this.apiClient;
117
+ if (!client) {
118
+ const envKey = process.env.MAILMODO_API_KEY;
119
+ const apiKey = envKey ?? (await loadConfig())?.apiKey;
120
+ if (!apiKey)
121
+ return null;
122
+ client = new ApiClient(apiKey);
123
+ }
124
+ const written = await this.fetchAndWriteYaml(client);
125
+ if (!written)
108
126
  return null;
109
- const filePath = join(process.cwd(), YAML_FILE);
110
- await writeFile(filePath, response.data);
111
- this.log(INFO.YAML_RESTORED_FROM_SERVER);
127
+ this.logToStderr(INFO.YAML_RESTORED_FROM_SERVER);
112
128
  return loadYaml();
113
129
  }
114
130
  catch {
@@ -127,16 +143,7 @@ export class BaseCommand extends Command {
127
143
  async recoverYamlAfterLogin(client) {
128
144
  if (existsSync(join(process.cwd(), YAML_FILE)))
129
145
  return false;
130
- try {
131
- const response = await client.getRawText(API_ENDPOINTS.ASSETS_YAML);
132
- if (!response.ok || !response.data)
133
- return false;
134
- await writeFile(join(process.cwd(), YAML_FILE), response.data);
135
- return true;
136
- }
137
- catch {
138
- return false;
139
- }
146
+ return this.fetchAndWriteYaml(client);
140
147
  }
141
148
  /**
142
149
  * Uploads the current local mailmodo.yaml to the server as a backup.
@@ -54,7 +54,9 @@ export async function ensureDomainReady(ctx, yamlConfig, flags) {
54
54
  const check = await ctx.spinner(' Checking domain verification...', flags.json, () => ctx.get(API_ENDPOINTS.DOMAIN_VERIFY, {
55
55
  domain: yamlConfig.project?.domain || '',
56
56
  }));
57
- if (check.ok && check.data?.domainStatus === 'VERIFIED')
57
+ if (!check.ok)
58
+ ctx.onApiError(check);
59
+ if (check.data?.domainStatus === 'VERIFIED')
58
60
  return true;
59
61
  if (yamlConfig.project?.domain) {
60
62
  if (!flags.json)
@@ -4,19 +4,21 @@ import { select } from '@inquirer/prompts';
4
4
  import chalk from 'chalk';
5
5
  import { API_ENDPOINTS, TEMPLATES_DIR } from '../constants.js';
6
6
  import { MISSING_TEMPLATES } from '../messages.js';
7
- import { saveTemplate } from '../yaml-config.js';
7
+ import { getTemplateFilename, saveTemplate, } from '../yaml-config.js';
8
8
  import { buildRegeneratePayload } from './payload.js';
9
9
  export function getMissingTemplateIds(yamlConfig) {
10
10
  return yamlConfig.emails
11
- .filter((e) => !existsSync(join(process.cwd(), TEMPLATES_DIR, `${e.id}.html`)))
11
+ .filter((e) => !existsSync(join(process.cwd(), TEMPLATES_DIR, getTemplateFilename(e.id, e.style, yamlConfig.project?.emailStyle))))
12
12
  .map((e) => e.id);
13
13
  }
14
14
  async function regenerateMissingTemplates(ctx, yamlConfig, missingIds, flags) {
15
- const response = await ctx.spinner(' Regenerating email templates...', flags.json, () => ctx.post(API_ENDPOINTS.GENERATE, buildRegeneratePayload(yamlConfig, missingIds)));
15
+ const response = await ctx.spinner(` ${MISSING_TEMPLATES.REGENERATE_SPINNER}`, flags.json, () => ctx.post(API_ENDPOINTS.GENERATE, buildRegeneratePayload(yamlConfig, missingIds)));
16
16
  if (!response.ok)
17
17
  ctx.onApiError(response);
18
18
  const saves = [];
19
19
  for (const email of response.data?.emails ?? []) {
20
+ if (!/^[\w-]+$/.test(email.id))
21
+ continue;
20
22
  if (email.html)
21
23
  saves.push(saveTemplate(`${email.id}.html`, email.html));
22
24
  if (email.plainHtml)
@@ -44,10 +46,13 @@ export async function handleMissingTemplates(ctx, yamlConfig, missingIds, flags)
44
46
  ctx.log(`\n ${MISSING_TEMPLATES.REGENERATE_NOTE}\n`);
45
47
  const action = await select({
46
48
  choices: [
47
- { name: 'Re-generate via AI', value: 'regenerate' },
48
- { name: 'Abort (restore from version control)', value: 'abort' },
49
+ {
50
+ name: MISSING_TEMPLATES.CHOICE_REGENERATE,
51
+ value: 'regenerate',
52
+ },
53
+ { name: MISSING_TEMPLATES.CHOICE_ABORT, value: 'abort' },
49
54
  ],
50
- message: 'What would you like to do?',
55
+ message: MISSING_TEMPLATES.PROMPT_ACTION,
51
56
  });
52
57
  if (action === 'abort') {
53
58
  ctx.log(`\n ${MISSING_TEMPLATES.ABORT_HINT}\n`);
@@ -1,12 +1,12 @@
1
1
  import chalk from 'chalk';
2
2
  import { SDK_IMPORT_SNIPPET, SDK_INSTALL_COMMAND } from '../constants.js';
3
- import { SEPARATOR } from '../messages.js';
3
+ import { DEPLOY, SEPARATOR } from '../messages.js';
4
4
  export function logDiff(ctx, diff) {
5
5
  if (!diff.hasChanges) {
6
- ctx.log(` No changes from last deployment.`);
6
+ ctx.log(` ${DEPLOY.NO_CHANGES}`);
7
7
  return;
8
8
  }
9
- ctx.log(` Changes vs. last deployment:`);
9
+ ctx.log(` ${DEPLOY.CHANGES_HEADER}`);
10
10
  for (const email of diff.added) {
11
11
  ctx.log(` ${chalk.green('+')} ${email.id.padEnd(24)} ${email.trigger || ''}`);
12
12
  }
@@ -24,7 +24,7 @@ export function logPreDeploySummary(ctx, yamlConfig, validateResult, jsonOutput)
24
24
  return;
25
25
  ctx.log(`\n ${chalk.green('✓')} Domain: ${yamlConfig.project?.domain || 'verified'}\n`);
26
26
  if (!validateResult.existingDeployment || !validateResult.diff) {
27
- ctx.log(` Deploying:`);
27
+ ctx.log(` ${DEPLOY.DEPLOYING_HEADER}`);
28
28
  for (const email of yamlConfig.emails) {
29
29
  ctx.log(` ${chalk.green('+')} ${email.id.padEnd(24)} ${email.trigger}`);
30
30
  }
@@ -35,14 +35,14 @@ export function logPreDeploySummary(ctx, yamlConfig, validateResult, jsonOutput)
35
35
  ctx.log('');
36
36
  }
37
37
  export function logDeploySuccessInstructions(ctx, sdkSnippet) {
38
- ctx.log(` ${chalk.green('Deployed.')} Emails are live.\n`);
38
+ ctx.log(` ${DEPLOY.SUCCESS}\n`);
39
39
  ctx.log(` ${SEPARATOR}`);
40
- ctx.log(` ${chalk.bold('ADD THIS TO YOUR APP (one-time only):')}`);
40
+ ctx.log(` ${DEPLOY.SDK_ONBOARDING_HEADER}`);
41
41
  ctx.log(` ${SEPARATOR}\n`);
42
42
  ctx.log(` ${chalk.cyan(sdkSnippet.install ?? SDK_INSTALL_COMMAND)}\n`);
43
43
  ctx.log(` ${chalk.dim(SDK_IMPORT_SNIPPET)}\n`);
44
44
  if (sdkSnippet.examples) {
45
- ctx.log(` ${chalk.dim('// Example usage:')}`);
45
+ ctx.log(` ${DEPLOY.SDK_EXAMPLE_COMMENT}`);
46
46
  ctx.log(` ${chalk.dim(sdkSnippet.examples.track)}`);
47
47
  ctx.log(` ${chalk.dim(sdkSnippet.examples.identify)}\n`);
48
48
  }
@@ -56,6 +56,6 @@ export function logDeploySuccessInstructions(ctx, sdkSnippet) {
56
56
  ctx.log(` ${chalk.dim(call)}`);
57
57
  if (identifyCalls.length > 0)
58
58
  ctx.log('');
59
- ctx.log(` Full SDK docs: ${chalk.cyan('mailmodo.com/docs/sdk')}\n`);
59
+ ctx.log(` ${DEPLOY.SDK_DOCS_HINT}\n`);
60
60
  ctx.log(` ${SEPARATOR}\n`);
61
61
  }
@@ -15,8 +15,12 @@ export declare const PROMPTS: {
15
15
  };
16
16
  export declare const MISSING_TEMPLATES: {
17
17
  readonly ABORT_HINT: `Restore the missing files from version control, then run ${string} again.`;
18
+ readonly CHOICE_ABORT: "Abort (restore from version control)";
19
+ readonly CHOICE_REGENERATE: "Re-generate via AI";
18
20
  readonly HEADER: `Some email templates are missing from ${string}:`;
21
+ readonly PROMPT_ACTION: "What would you like to do?";
19
22
  readonly REGENERATE_NOTE: string;
23
+ readonly REGENERATE_SPINNER: "Regenerating email templates...";
20
24
  readonly REVIEW_HINT: `Templates regenerated. Review them with ${string}, then run ${string} again.`;
21
25
  readonly YES_ERROR: `Missing templates cannot be resolved with ${string}. Run ${string} without ${string} to regenerate via AI or restore from version control.`;
22
26
  };
@@ -50,6 +54,15 @@ export declare const INFO: {
50
54
  readonly YAML_RESTORED_FROM_SERVER: string;
51
55
  readonly YAML_RESTORED_ON_LOGIN: ` mailmodo.yaml restored from server. Run ${string} to re-deploy your sequences.`;
52
56
  };
57
+ export declare const DEPLOY: {
58
+ readonly CHANGES_HEADER: "Changes vs. last deployment:";
59
+ readonly DEPLOYING_HEADER: "Deploying:";
60
+ readonly NO_CHANGES: "No changes from last deployment.";
61
+ readonly SDK_DOCS_HINT: `Full SDK docs: ${string}`;
62
+ readonly SDK_EXAMPLE_COMMENT: string;
63
+ readonly SDK_ONBOARDING_HEADER: string;
64
+ readonly SUCCESS: `${string} Emails are live.`;
65
+ };
53
66
  export declare function pauseSuccess(sequenceId: string): string;
54
67
  export declare function pauseAlready(sequenceId: string): string;
55
68
  export declare function resumeSuccess(sequenceId: string): string;
@@ -16,8 +16,12 @@ export const PROMPTS = {
16
16
  };
17
17
  export const MISSING_TEMPLATES = {
18
18
  ABORT_HINT: `Restore the missing files from version control, then run ${chalk.cyan('mailmodo deploy')} again.`,
19
+ CHOICE_ABORT: 'Abort (restore from version control)',
20
+ CHOICE_REGENERATE: 'Re-generate via AI',
19
21
  HEADER: `Some email templates are missing from ${chalk.cyan('./mailmodo/')}:`,
22
+ PROMPT_ACTION: 'What would you like to do?',
20
23
  REGENERATE_NOTE: chalk.yellow(' Note: any previous manual edits to these files will be replaced with a new AI draft.'),
24
+ REGENERATE_SPINNER: 'Regenerating email templates...',
21
25
  REVIEW_HINT: `Templates regenerated. Review them with ${chalk.cyan('mailmodo preview')}, then run ${chalk.cyan('mailmodo deploy')} again.`,
22
26
  YES_ERROR: `Missing templates cannot be resolved with ${chalk.cyan('--yes')}. Run ${chalk.cyan('mailmodo deploy')} without ${chalk.cyan('--yes')} to regenerate via AI or restore from version control.`,
23
27
  };
@@ -50,6 +54,15 @@ export const INFO = {
50
54
  YAML_RESTORED_FROM_SERVER: chalk.dim(' mailmodo.yaml not found locally — restored from server.'),
51
55
  YAML_RESTORED_ON_LOGIN: ` mailmodo.yaml restored from server. Run ${chalk.cyan("'mailmodo deploy'")} to re-deploy your sequences.`,
52
56
  };
57
+ export const DEPLOY = {
58
+ CHANGES_HEADER: 'Changes vs. last deployment:',
59
+ DEPLOYING_HEADER: 'Deploying:',
60
+ NO_CHANGES: 'No changes from last deployment.',
61
+ SDK_DOCS_HINT: `Full SDK docs: ${chalk.cyan('mailmodo.com/docs/sdk')}`,
62
+ SDK_EXAMPLE_COMMENT: chalk.dim('// Example usage:'),
63
+ SDK_ONBOARDING_HEADER: chalk.bold('ADD THIS TO YOUR APP (one-time only):'),
64
+ SUCCESS: `${chalk.green('Deployed.')} Emails are live.`,
65
+ };
53
66
  export function pauseSuccess(sequenceId) {
54
67
  return `Sequence ${chalk.cyan(sequenceId)} paused. Run ${chalk.cyan(`mailmodo deploy --resume ${sequenceId}`)} to resume.`;
55
68
  }
@@ -137,13 +137,15 @@
137
137
  "index.js"
138
138
  ]
139
139
  },
140
- "deployments": {
140
+ "deploy": {
141
141
  "aliases": [],
142
142
  "args": {},
143
- "description": "List every deployed sequence on this account, with the IDs needed for deploy --pause / --resume",
143
+ "description": "Deploy, pause, or resume an email sequence",
144
144
  "examples": [
145
- "<%= config.bin %> deployments",
146
- "<%= config.bin %> deployments --json"
145
+ "<%= config.bin %> deploy",
146
+ "<%= config.bin %> deploy --yes",
147
+ "<%= config.bin %> deploy --pause seq_abc123",
148
+ "<%= config.bin %> deploy --resume seq_abc123 --json"
147
149
  ],
148
150
  "flags": {
149
151
  "json": {
@@ -158,11 +160,31 @@
158
160
  "name": "yes",
159
161
  "allowNo": false,
160
162
  "type": "boolean"
163
+ },
164
+ "pause": {
165
+ "description": "Pause a deployed sequence by ID (stops scheduled + triggered sends)",
166
+ "exclusive": [
167
+ "resume"
168
+ ],
169
+ "name": "pause",
170
+ "hasDynamicHelp": false,
171
+ "multiple": false,
172
+ "type": "option"
173
+ },
174
+ "resume": {
175
+ "description": "Resume a paused sequence by ID",
176
+ "exclusive": [
177
+ "pause"
178
+ ],
179
+ "name": "resume",
180
+ "hasDynamicHelp": false,
181
+ "multiple": false,
182
+ "type": "option"
161
183
  }
162
184
  },
163
185
  "hasDynamicHelp": false,
164
186
  "hiddenAliases": [],
165
- "id": "deployments",
187
+ "id": "deploy",
166
188
  "pluginAlias": "@mailmodo/cli",
167
189
  "pluginName": "@mailmodo/cli",
168
190
  "pluginType": "core",
@@ -172,19 +194,17 @@
172
194
  "relativePath": [
173
195
  "dist",
174
196
  "commands",
175
- "deployments",
197
+ "deploy",
176
198
  "index.js"
177
199
  ]
178
200
  },
179
- "deploy": {
201
+ "deployments": {
180
202
  "aliases": [],
181
203
  "args": {},
182
- "description": "Deploy, pause, or resume an email sequence",
204
+ "description": "List every deployed sequence on this account, with the IDs needed for deploy --pause / --resume",
183
205
  "examples": [
184
- "<%= config.bin %> deploy",
185
- "<%= config.bin %> deploy --yes",
186
- "<%= config.bin %> deploy --pause seq_abc123",
187
- "<%= config.bin %> deploy --resume seq_abc123 --json"
206
+ "<%= config.bin %> deployments",
207
+ "<%= config.bin %> deployments --json"
188
208
  ],
189
209
  "flags": {
190
210
  "json": {
@@ -199,31 +219,11 @@
199
219
  "name": "yes",
200
220
  "allowNo": false,
201
221
  "type": "boolean"
202
- },
203
- "pause": {
204
- "description": "Pause a deployed sequence by ID (stops scheduled + triggered sends)",
205
- "exclusive": [
206
- "resume"
207
- ],
208
- "name": "pause",
209
- "hasDynamicHelp": false,
210
- "multiple": false,
211
- "type": "option"
212
- },
213
- "resume": {
214
- "description": "Resume a paused sequence by ID",
215
- "exclusive": [
216
- "pause"
217
- ],
218
- "name": "resume",
219
- "hasDynamicHelp": false,
220
- "multiple": false,
221
- "type": "option"
222
222
  }
223
223
  },
224
224
  "hasDynamicHelp": false,
225
225
  "hiddenAliases": [],
226
- "id": "deploy",
226
+ "id": "deployments",
227
227
  "pluginAlias": "@mailmodo/cli",
228
228
  "pluginName": "@mailmodo/cli",
229
229
  "pluginType": "core",
@@ -233,7 +233,7 @@
233
233
  "relativePath": [
234
234
  "dist",
235
235
  "commands",
236
- "deploy",
236
+ "deployments",
237
237
  "index.js"
238
238
  ]
239
239
  },
@@ -527,19 +527,13 @@
527
527
  "index.js"
528
528
  ]
529
529
  },
530
- "preview": {
530
+ "init": {
531
531
  "aliases": [],
532
- "args": {
533
- "id": {
534
- "description": "Email template ID to preview",
535
- "name": "id"
536
- }
537
- },
538
- "description": "Preview an email in browser, as text, or send a test",
532
+ "args": {},
533
+ "description": "Analyze your product and generate email sequences",
539
534
  "examples": [
540
- "<%= config.bin %> preview welcome",
541
- "<%= config.bin %> preview welcome --text",
542
- "<%= config.bin %> preview welcome --send me@example.com"
535
+ "<%= config.bin %> init",
536
+ "<%= config.bin %> init --url https://myapp.com --yes"
543
537
  ],
544
538
  "flags": {
545
539
  "json": {
@@ -555,23 +549,17 @@
555
549
  "allowNo": false,
556
550
  "type": "boolean"
557
551
  },
558
- "send": {
559
- "description": "Send test email to this address",
560
- "name": "send",
552
+ "url": {
553
+ "description": "Product URL to analyze",
554
+ "name": "url",
561
555
  "hasDynamicHelp": false,
562
556
  "multiple": false,
563
557
  "type": "option"
564
- },
565
- "text": {
566
- "description": "Output plain text version (for AI agents)",
567
- "name": "text",
568
- "allowNo": false,
569
- "type": "boolean"
570
558
  }
571
559
  },
572
560
  "hasDynamicHelp": false,
573
561
  "hiddenAliases": [],
574
- "id": "preview",
562
+ "id": "init",
575
563
  "pluginAlias": "@mailmodo/cli",
576
564
  "pluginName": "@mailmodo/cli",
577
565
  "pluginType": "core",
@@ -581,7 +569,7 @@
581
569
  "relativePath": [
582
570
  "dist",
583
571
  "commands",
584
- "preview",
572
+ "init",
585
573
  "index.js"
586
574
  ]
587
575
  },
@@ -632,14 +620,19 @@
632
620
  "index.js"
633
621
  ]
634
622
  },
635
- "settings": {
623
+ "preview": {
636
624
  "aliases": [],
637
- "args": {},
638
- "description": "View and update project settings",
625
+ "args": {
626
+ "id": {
627
+ "description": "Email template ID to preview",
628
+ "name": "id"
629
+ }
630
+ },
631
+ "description": "Preview an email in browser, as text, or send a test",
639
632
  "examples": [
640
- "<%= config.bin %> settings",
641
- "<%= config.bin %> settings --set brand_color=#0F3460",
642
- "<%= config.bin %> settings --json"
633
+ "<%= config.bin %> preview welcome",
634
+ "<%= config.bin %> preview welcome --text",
635
+ "<%= config.bin %> preview welcome --send me@example.com"
643
636
  ],
644
637
  "flags": {
645
638
  "json": {
@@ -655,17 +648,23 @@
655
648
  "allowNo": false,
656
649
  "type": "boolean"
657
650
  },
658
- "set": {
659
- "description": "Set a setting (format: key=value)",
660
- "name": "set",
651
+ "send": {
652
+ "description": "Send test email to this address",
653
+ "name": "send",
661
654
  "hasDynamicHelp": false,
662
655
  "multiple": false,
663
656
  "type": "option"
657
+ },
658
+ "text": {
659
+ "description": "Output plain text version (for AI agents)",
660
+ "name": "text",
661
+ "allowNo": false,
662
+ "type": "boolean"
664
663
  }
665
664
  },
666
665
  "hasDynamicHelp": false,
667
666
  "hiddenAliases": [],
668
- "id": "settings",
667
+ "id": "preview",
669
668
  "pluginAlias": "@mailmodo/cli",
670
669
  "pluginName": "@mailmodo/cli",
671
670
  "pluginType": "core",
@@ -675,17 +674,18 @@
675
674
  "relativePath": [
676
675
  "dist",
677
676
  "commands",
678
- "settings",
677
+ "preview",
679
678
  "index.js"
680
679
  ]
681
680
  },
682
- "status": {
681
+ "settings": {
683
682
  "aliases": [],
684
683
  "args": {},
685
- "description": "View email performance metrics and quota usage",
684
+ "description": "View and update project settings",
686
685
  "examples": [
687
- "<%= config.bin %> status",
688
- "<%= config.bin %> status --json"
686
+ "<%= config.bin %> settings",
687
+ "<%= config.bin %> settings --set brand_color=#0F3460",
688
+ "<%= config.bin %> settings --json"
689
689
  ],
690
690
  "flags": {
691
691
  "json": {
@@ -700,11 +700,18 @@
700
700
  "name": "yes",
701
701
  "allowNo": false,
702
702
  "type": "boolean"
703
+ },
704
+ "set": {
705
+ "description": "Set a setting (format: key=value)",
706
+ "name": "set",
707
+ "hasDynamicHelp": false,
708
+ "multiple": false,
709
+ "type": "option"
703
710
  }
704
711
  },
705
712
  "hasDynamicHelp": false,
706
713
  "hiddenAliases": [],
707
- "id": "status",
714
+ "id": "settings",
708
715
  "pluginAlias": "@mailmodo/cli",
709
716
  "pluginName": "@mailmodo/cli",
710
717
  "pluginType": "core",
@@ -714,17 +721,17 @@
714
721
  "relativePath": [
715
722
  "dist",
716
723
  "commands",
717
- "status",
724
+ "settings",
718
725
  "index.js"
719
726
  ]
720
727
  },
721
- "init": {
728
+ "status": {
722
729
  "aliases": [],
723
730
  "args": {},
724
- "description": "Analyze your product and generate email sequences",
731
+ "description": "View email performance metrics and quota usage",
725
732
  "examples": [
726
- "<%= config.bin %> init",
727
- "<%= config.bin %> init --url https://myapp.com --yes"
733
+ "<%= config.bin %> status",
734
+ "<%= config.bin %> status --json"
728
735
  ],
729
736
  "flags": {
730
737
  "json": {
@@ -739,18 +746,11 @@
739
746
  "name": "yes",
740
747
  "allowNo": false,
741
748
  "type": "boolean"
742
- },
743
- "url": {
744
- "description": "Product URL to analyze",
745
- "name": "url",
746
- "hasDynamicHelp": false,
747
- "multiple": false,
748
- "type": "option"
749
749
  }
750
750
  },
751
751
  "hasDynamicHelp": false,
752
752
  "hiddenAliases": [],
753
- "id": "init",
753
+ "id": "status",
754
754
  "pluginAlias": "@mailmodo/cli",
755
755
  "pluginName": "@mailmodo/cli",
756
756
  "pluginType": "core",
@@ -760,10 +760,10 @@
760
760
  "relativePath": [
761
761
  "dist",
762
762
  "commands",
763
- "init",
763
+ "status",
764
764
  "index.js"
765
765
  ]
766
766
  }
767
767
  },
768
- "version": "0.0.54-beta.pr56.87"
768
+ "version": "0.0.54-beta.pr56.88"
769
769
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mailmodo/cli",
3
3
  "description": "Email lifecycle automation for the AI-native builder generation.",
4
- "version": "0.0.54-beta.pr56.87",
4
+ "version": "0.0.54-beta.pr56.88",
5
5
  "author": "provishalk",
6
6
  "bin": {
7
7
  "mailmodo": "bin/run.js"