@mailmodo/cli 0.0.49-beta.pr51.78 → 0.0.49
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/commands/edit/index.js +0 -1
- package/dist/commands/init/index.d.ts +0 -1
- package/dist/commands/init/index.js +6 -10
- package/dist/lib/base-command.d.ts +0 -24
- package/dist/lib/base-command.js +1 -30
- package/dist/lib/messages.d.ts +0 -27
- package/dist/lib/messages.js +0 -57
- package/oclif.manifest.json +60 -60
- package/package.json +1 -1
|
@@ -49,7 +49,6 @@ export default class Edit extends BaseCommand {
|
|
|
49
49
|
async runEditStep(ctx, changeDescription, flags) {
|
|
50
50
|
const response = await this.withApiSpinner({ json: flags.json, text: ' Applying AI edits...' }, () => this.callEditApi(changeDescription, ctx.email, ctx.templateHtml));
|
|
51
51
|
if (!response.ok) {
|
|
52
|
-
this.handleAiQuotaError(response, 'edit');
|
|
53
52
|
this.handleApiError(response);
|
|
54
53
|
}
|
|
55
54
|
const updated = response.data;
|
|
@@ -64,7 +64,6 @@ export default class Init extends BaseCommand {
|
|
|
64
64
|
url: productUrl,
|
|
65
65
|
}));
|
|
66
66
|
if (!analysisResponse.ok) {
|
|
67
|
-
this.handleAiQuotaError(analysisResponse, 'init');
|
|
68
67
|
this.handleApiError(analysisResponse);
|
|
69
68
|
}
|
|
70
69
|
const analysis = analysisResponse.data;
|
|
@@ -155,7 +154,12 @@ export default class Init extends BaseCommand {
|
|
|
155
154
|
},
|
|
156
155
|
};
|
|
157
156
|
await saveYaml(yamlConfig);
|
|
158
|
-
await this.
|
|
157
|
+
const billingStatus = await this.fetchBillingStatus();
|
|
158
|
+
const monthlyCap = billingStatus?.cap?.inBlocks;
|
|
159
|
+
if (monthlyCap !== null && monthlyCap !== undefined) {
|
|
160
|
+
yamlConfig.project.monthlyCap = monthlyCap;
|
|
161
|
+
await saveYaml(yamlConfig);
|
|
162
|
+
}
|
|
159
163
|
const templateSaves = analysisPayload.recommendedEmails.flatMap((rec, index) => {
|
|
160
164
|
const generated = generatedEmails[index];
|
|
161
165
|
const saves = [];
|
|
@@ -180,14 +184,6 @@ export default class Init extends BaseCommand {
|
|
|
180
184
|
this.log(` Created ${chalk.green('mailmodo.yaml')} + ${chalk.green(String(emailConfigs.length))} email templates in ${chalk.green('/mailmodo')}\n`);
|
|
181
185
|
this.log(` Run ${chalk.cyan("'mailmodo emails'")} to review.\n`);
|
|
182
186
|
}
|
|
183
|
-
async persistMonthlyCap(yamlConfig) {
|
|
184
|
-
const billingStatus = await this.fetchBillingStatus();
|
|
185
|
-
const monthlyCap = billingStatus?.cap?.inBlocks;
|
|
186
|
-
if (monthlyCap !== null && monthlyCap !== undefined) {
|
|
187
|
-
yamlConfig.project.monthlyCap = monthlyCap;
|
|
188
|
-
await saveYaml(yamlConfig);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
187
|
async confirmOverwriteIfNeeded(flags) {
|
|
192
188
|
const existing = await loadYaml();
|
|
193
189
|
if (!existing)
|
|
@@ -2,11 +2,6 @@ import { Command } from '@oclif/core';
|
|
|
2
2
|
import { ApiClient, type ApiRequestDebugInfo } from './api-client.js';
|
|
3
3
|
import { type MailmodoConfig } from './config.js';
|
|
4
4
|
import { type MailmodoYaml } from './yaml-config.js';
|
|
5
|
-
/**
|
|
6
|
-
* Kind of AI quota that was exhausted. Drives both the headline default
|
|
7
|
-
* message and the follow-up tip pointing the user at the next-best action.
|
|
8
|
-
*/
|
|
9
|
-
export type AiQuotaFeature = 'edit' | 'init';
|
|
10
5
|
export interface BillingCapUpdateResult {
|
|
11
6
|
autoChargeBlockCount?: number;
|
|
12
7
|
capBlocks: number;
|
|
@@ -81,25 +76,6 @@ export declare abstract class BaseCommand extends Command {
|
|
|
81
76
|
error?: string;
|
|
82
77
|
status: number;
|
|
83
78
|
}): never;
|
|
84
|
-
/**
|
|
85
|
-
* Intercepts a 429 "Monthly quota exhausted" response from an AI rate-limited
|
|
86
|
-
* endpoint (analyze for `init`, email edit for `edit`) and exits with a
|
|
87
|
-
* feature-specific message that includes the server's error text, the reset
|
|
88
|
-
* date, optional retry hint, and the next-best action. Returns without
|
|
89
|
-
* exiting when the response is not a 429 so callers can fall through to
|
|
90
|
-
* `handleApiError` for non-quota failures.
|
|
91
|
-
*
|
|
92
|
-
* @param {{ status: number; error?: string; data?: unknown; debug?: ApiRequestDebugInfo }} response - The failed API response.
|
|
93
|
-
* Must carry the parsed JSON body (`data`) so reset/retry fields can be surfaced.
|
|
94
|
-
* @param {AiQuotaFeature} feature - Which AI quota was hit. Drives the default headline + tip
|
|
95
|
-
* shown when the server omits an explicit `error` string.
|
|
96
|
-
*/
|
|
97
|
-
protected handleAiQuotaError(response: {
|
|
98
|
-
data?: unknown;
|
|
99
|
-
debug?: ApiRequestDebugInfo;
|
|
100
|
-
error?: string;
|
|
101
|
-
status: number;
|
|
102
|
-
}, feature: AiQuotaFeature): void;
|
|
103
79
|
protected collectDomainSetupInputs(yamlConfig: MailmodoYaml, skipPrompts: boolean): Promise<{
|
|
104
80
|
address: string;
|
|
105
81
|
domain: string;
|
package/dist/lib/base-command.js
CHANGED
|
@@ -5,7 +5,7 @@ import ora from 'ora';
|
|
|
5
5
|
import { ApiClient } from './api-client.js';
|
|
6
6
|
import { loadConfig } from './config.js';
|
|
7
7
|
import { API_ENDPOINTS } from './constants.js';
|
|
8
|
-
import { ERRORS, INFO, PROMPTS,
|
|
8
|
+
import { ERRORS, INFO, PROMPTS, recordLabel, VALIDATION } from './messages.js';
|
|
9
9
|
import { loadYaml, saveYaml } from './yaml-config.js';
|
|
10
10
|
export const FREE_TIER = 'free';
|
|
11
11
|
/**
|
|
@@ -107,35 +107,6 @@ export class BaseCommand extends Command {
|
|
|
107
107
|
}
|
|
108
108
|
this.error(this.formatApiFailure(response.error || ERRORS.UNEXPECTED_API, response));
|
|
109
109
|
}
|
|
110
|
-
/**
|
|
111
|
-
* Intercepts a 429 "Monthly quota exhausted" response from an AI rate-limited
|
|
112
|
-
* endpoint (analyze for `init`, email edit for `edit`) and exits with a
|
|
113
|
-
* feature-specific message that includes the server's error text, the reset
|
|
114
|
-
* date, optional retry hint, and the next-best action. Returns without
|
|
115
|
-
* exiting when the response is not a 429 so callers can fall through to
|
|
116
|
-
* `handleApiError` for non-quota failures.
|
|
117
|
-
*
|
|
118
|
-
* @param {{ status: number; error?: string; data?: unknown; debug?: ApiRequestDebugInfo }} response - The failed API response.
|
|
119
|
-
* Must carry the parsed JSON body (`data`) so reset/retry fields can be surfaced.
|
|
120
|
-
* @param {AiQuotaFeature} feature - Which AI quota was hit. Drives the default headline + tip
|
|
121
|
-
* shown when the server omits an explicit `error` string.
|
|
122
|
-
*/
|
|
123
|
-
handleAiQuotaError(response, feature) {
|
|
124
|
-
if (response.status !== 429)
|
|
125
|
-
return;
|
|
126
|
-
const body = (response.data ?? {});
|
|
127
|
-
const isInit = feature === 'init';
|
|
128
|
-
const message = quotaExhaustedMessage({
|
|
129
|
-
defaultMessage: isInit
|
|
130
|
-
? ERRORS.QUOTA_INIT_DEFAULT
|
|
131
|
-
: ERRORS.QUOTA_EDIT_DEFAULT,
|
|
132
|
-
limitReset: body.limitReset,
|
|
133
|
-
retryAfter: body.retryAfter,
|
|
134
|
-
serverError: typeof body.error === 'string' ? body.error : undefined,
|
|
135
|
-
tip: isInit ? ERRORS.QUOTA_INIT_TIP : ERRORS.QUOTA_EDIT_TIP,
|
|
136
|
-
});
|
|
137
|
-
this.error(this.formatApiFailure(message, response));
|
|
138
|
-
}
|
|
139
110
|
async collectDomainSetupInputs(yamlConfig, skipPrompts) {
|
|
140
111
|
if (skipPrompts) {
|
|
141
112
|
const domain = yamlConfig.project?.domain || '';
|
package/dist/lib/messages.d.ts
CHANGED
|
@@ -19,10 +19,6 @@ export declare const ERRORS: {
|
|
|
19
19
|
readonly INVALID_API_KEY: `Invalid API key. Run ${string} to re-authenticate.`;
|
|
20
20
|
readonly NOT_LOGGED_IN: `Not logged in. Run ${string} to authenticate.`;
|
|
21
21
|
readonly NO_YAML: `No mailmodo.yaml found. Run ${string} first.`;
|
|
22
|
-
readonly QUOTA_EDIT_DEFAULT: "Edit limit reached for this month.";
|
|
23
|
-
readonly QUOTA_EDIT_TIP: "AI edits are limited to 50 per account per month. Manually edit the template file under ./mailmodo to make further changes.";
|
|
24
|
-
readonly QUOTA_INIT_DEFAULT: "Regeneration limit reached.";
|
|
25
|
-
readonly QUOTA_INIT_TIP: `Regenerations are limited to 5 per account per month. Run ${string} to modify individual emails instead.`;
|
|
26
22
|
readonly RATE_LIMIT: "Rate limit exceeded. Please try again later.";
|
|
27
23
|
readonly UNEXPECTED_API: "An unexpected API error occurred.";
|
|
28
24
|
};
|
|
@@ -41,26 +37,3 @@ export declare const INFO: {
|
|
|
41
37
|
};
|
|
42
38
|
export declare function yamlParseError(detail: string): string;
|
|
43
39
|
export declare function recordLabel(index: number): string;
|
|
44
|
-
/**
|
|
45
|
-
* Parses an ISO-8601 timestamp into a `YYYY-MM-DD` date string.
|
|
46
|
-
* Returns the raw input if parsing fails so the original value is preserved.
|
|
47
|
-
*/
|
|
48
|
-
export declare function formatQuotaResetDate(value?: string): string | undefined;
|
|
49
|
-
/**
|
|
50
|
-
* Formats a `retry-after` value (seconds) into a short, human-readable hint
|
|
51
|
-
* suitable for appending to a 429 error message.
|
|
52
|
-
*/
|
|
53
|
-
export declare function formatRetryAfter(seconds?: number): string | undefined;
|
|
54
|
-
/**
|
|
55
|
-
* Builds the multi-line message printed when an AI quota (init regeneration or
|
|
56
|
-
* edit) is exhausted. `serverError` is the message returned by the API; the
|
|
57
|
-
* default text is used when the server omits it. The tip lists the next action
|
|
58
|
-
* the user can take (e.g. switch from init to edit).
|
|
59
|
-
*/
|
|
60
|
-
export declare function quotaExhaustedMessage(input: {
|
|
61
|
-
defaultMessage: string;
|
|
62
|
-
limitReset?: string;
|
|
63
|
-
retryAfter?: number;
|
|
64
|
-
serverError?: string;
|
|
65
|
-
tip: string;
|
|
66
|
-
}): string;
|
package/dist/lib/messages.js
CHANGED
|
@@ -20,10 +20,6 @@ export const ERRORS = {
|
|
|
20
20
|
INVALID_API_KEY: `Invalid API key. Run ${chalk.cyan('mailmodo login')} to re-authenticate.`,
|
|
21
21
|
NOT_LOGGED_IN: `Not logged in. Run ${chalk.cyan('mailmodo login')} to authenticate.`,
|
|
22
22
|
NO_YAML: `No mailmodo.yaml found. Run ${chalk.cyan('mailmodo init')} first.`,
|
|
23
|
-
QUOTA_EDIT_DEFAULT: 'Edit limit reached for this month.',
|
|
24
|
-
QUOTA_EDIT_TIP: 'AI edits are limited to 50 per account per month. Manually edit the template file under ./mailmodo to make further changes.',
|
|
25
|
-
QUOTA_INIT_DEFAULT: 'Regeneration limit reached.',
|
|
26
|
-
QUOTA_INIT_TIP: `Regenerations are limited to 5 per account per month. Run ${chalk.cyan('mailmodo edit <id>')} to modify individual emails instead.`,
|
|
27
23
|
RATE_LIMIT: 'Rate limit exceeded. Please try again later.',
|
|
28
24
|
UNEXPECTED_API: 'An unexpected API error occurred.',
|
|
29
25
|
};
|
|
@@ -46,56 +42,3 @@ export function recordLabel(index) {
|
|
|
46
42
|
const labels = ['DKIM', 'DMARC', 'Return Path'];
|
|
47
43
|
return labels[index] || `Record ${index + 1}`;
|
|
48
44
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Parses an ISO-8601 timestamp into a `YYYY-MM-DD` date string.
|
|
51
|
-
* Returns the raw input if parsing fails so the original value is preserved.
|
|
52
|
-
*/
|
|
53
|
-
export function formatQuotaResetDate(value) {
|
|
54
|
-
if (!value)
|
|
55
|
-
return undefined;
|
|
56
|
-
const parsed = new Date(value);
|
|
57
|
-
if (Number.isNaN(parsed.getTime()))
|
|
58
|
-
return value;
|
|
59
|
-
const year = parsed.getUTCFullYear();
|
|
60
|
-
const month = String(parsed.getUTCMonth() + 1).padStart(2, '0');
|
|
61
|
-
const day = String(parsed.getUTCDate()).padStart(2, '0');
|
|
62
|
-
return `${year}-${month}-${day}`;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Formats a `retry-after` value (seconds) into a short, human-readable hint
|
|
66
|
-
* suitable for appending to a 429 error message.
|
|
67
|
-
*/
|
|
68
|
-
export function formatRetryAfter(seconds) {
|
|
69
|
-
if (typeof seconds !== 'number' || !Number.isFinite(seconds) || seconds <= 0)
|
|
70
|
-
return undefined;
|
|
71
|
-
if (seconds < 60)
|
|
72
|
-
return `${Math.round(seconds)} seconds`;
|
|
73
|
-
const minutes = Math.round(seconds / 60);
|
|
74
|
-
if (minutes < 60)
|
|
75
|
-
return `${minutes} minutes`;
|
|
76
|
-
const hours = Math.round(seconds / 3600);
|
|
77
|
-
if (hours < 24)
|
|
78
|
-
return `${hours} hours`;
|
|
79
|
-
const days = Math.round(seconds / 86_400);
|
|
80
|
-
return `${days} days`;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Builds the multi-line message printed when an AI quota (init regeneration or
|
|
84
|
-
* edit) is exhausted. `serverError` is the message returned by the API; the
|
|
85
|
-
* default text is used when the server omits it. The tip lists the next action
|
|
86
|
-
* the user can take (e.g. switch from init to edit).
|
|
87
|
-
*/
|
|
88
|
-
export function quotaExhaustedMessage(input) {
|
|
89
|
-
const headline = input.serverError || input.defaultMessage;
|
|
90
|
-
const lines = [headline];
|
|
91
|
-
const resetDate = formatQuotaResetDate(input.limitReset);
|
|
92
|
-
if (resetDate && !headline.includes(resetDate)) {
|
|
93
|
-
lines.push(`Resets on ${resetDate}.`);
|
|
94
|
-
}
|
|
95
|
-
const retryHint = formatRetryAfter(input.retryAfter);
|
|
96
|
-
if (retryHint) {
|
|
97
|
-
lines.push(`Try again in ${retryHint}.`);
|
|
98
|
-
}
|
|
99
|
-
lines.push('', input.tip);
|
|
100
|
-
return lines.join('\n');
|
|
101
|
-
}
|
package/oclif.manifest.json
CHANGED
|
@@ -403,15 +403,13 @@
|
|
|
403
403
|
"index.js"
|
|
404
404
|
]
|
|
405
405
|
},
|
|
406
|
-
"
|
|
406
|
+
"login": {
|
|
407
407
|
"aliases": [],
|
|
408
408
|
"args": {},
|
|
409
|
-
"description": "
|
|
409
|
+
"description": "Authenticate with Mailmodo using your API key",
|
|
410
410
|
"examples": [
|
|
411
|
-
"<%= config.bin %>
|
|
412
|
-
"<%= config.bin %>
|
|
413
|
-
"<%= config.bin %> logs --failed",
|
|
414
|
-
"<%= config.bin %> logs --json"
|
|
411
|
+
"<%= config.bin %> login",
|
|
412
|
+
"MAILMODO_API_KEY=YOUR_API_KEY <%= config.bin %> login"
|
|
415
413
|
],
|
|
416
414
|
"flags": {
|
|
417
415
|
"json": {
|
|
@@ -426,40 +424,11 @@
|
|
|
426
424
|
"name": "yes",
|
|
427
425
|
"allowNo": false,
|
|
428
426
|
"type": "boolean"
|
|
429
|
-
},
|
|
430
|
-
"email": {
|
|
431
|
-
"description": "Filter logs by contact email",
|
|
432
|
-
"name": "email",
|
|
433
|
-
"hasDynamicHelp": false,
|
|
434
|
-
"multiple": false,
|
|
435
|
-
"type": "option"
|
|
436
|
-
},
|
|
437
|
-
"failed": {
|
|
438
|
-
"description": "Show only failed/bounced events",
|
|
439
|
-
"name": "failed",
|
|
440
|
-
"allowNo": false,
|
|
441
|
-
"type": "boolean"
|
|
442
|
-
},
|
|
443
|
-
"limit": {
|
|
444
|
-
"description": "Entries per page (max 200)",
|
|
445
|
-
"name": "limit",
|
|
446
|
-
"default": 50,
|
|
447
|
-
"hasDynamicHelp": false,
|
|
448
|
-
"multiple": false,
|
|
449
|
-
"type": "option"
|
|
450
|
-
},
|
|
451
|
-
"page": {
|
|
452
|
-
"description": "Page number",
|
|
453
|
-
"name": "page",
|
|
454
|
-
"default": 1,
|
|
455
|
-
"hasDynamicHelp": false,
|
|
456
|
-
"multiple": false,
|
|
457
|
-
"type": "option"
|
|
458
427
|
}
|
|
459
428
|
},
|
|
460
429
|
"hasDynamicHelp": false,
|
|
461
430
|
"hiddenAliases": [],
|
|
462
|
-
"id": "
|
|
431
|
+
"id": "login",
|
|
463
432
|
"pluginAlias": "@mailmodo/cli",
|
|
464
433
|
"pluginName": "@mailmodo/cli",
|
|
465
434
|
"pluginType": "core",
|
|
@@ -469,7 +438,7 @@
|
|
|
469
438
|
"relativePath": [
|
|
470
439
|
"dist",
|
|
471
440
|
"commands",
|
|
472
|
-
"
|
|
441
|
+
"login",
|
|
473
442
|
"index.js"
|
|
474
443
|
]
|
|
475
444
|
},
|
|
@@ -531,14 +500,15 @@
|
|
|
531
500
|
"index.js"
|
|
532
501
|
]
|
|
533
502
|
},
|
|
534
|
-
"
|
|
503
|
+
"logs": {
|
|
535
504
|
"aliases": [],
|
|
536
505
|
"args": {},
|
|
537
|
-
"description": "View and
|
|
506
|
+
"description": "View email send logs and delivery events",
|
|
538
507
|
"examples": [
|
|
539
|
-
"<%= config.bin %>
|
|
540
|
-
"<%= config.bin %>
|
|
541
|
-
"<%= config.bin %>
|
|
508
|
+
"<%= config.bin %> logs",
|
|
509
|
+
"<%= config.bin %> logs --email sarah@example.com",
|
|
510
|
+
"<%= config.bin %> logs --failed",
|
|
511
|
+
"<%= config.bin %> logs --json"
|
|
542
512
|
],
|
|
543
513
|
"flags": {
|
|
544
514
|
"json": {
|
|
@@ -554,9 +524,31 @@
|
|
|
554
524
|
"allowNo": false,
|
|
555
525
|
"type": "boolean"
|
|
556
526
|
},
|
|
557
|
-
"
|
|
558
|
-
"description": "
|
|
559
|
-
"name": "
|
|
527
|
+
"email": {
|
|
528
|
+
"description": "Filter logs by contact email",
|
|
529
|
+
"name": "email",
|
|
530
|
+
"hasDynamicHelp": false,
|
|
531
|
+
"multiple": false,
|
|
532
|
+
"type": "option"
|
|
533
|
+
},
|
|
534
|
+
"failed": {
|
|
535
|
+
"description": "Show only failed/bounced events",
|
|
536
|
+
"name": "failed",
|
|
537
|
+
"allowNo": false,
|
|
538
|
+
"type": "boolean"
|
|
539
|
+
},
|
|
540
|
+
"limit": {
|
|
541
|
+
"description": "Entries per page (max 200)",
|
|
542
|
+
"name": "limit",
|
|
543
|
+
"default": 50,
|
|
544
|
+
"hasDynamicHelp": false,
|
|
545
|
+
"multiple": false,
|
|
546
|
+
"type": "option"
|
|
547
|
+
},
|
|
548
|
+
"page": {
|
|
549
|
+
"description": "Page number",
|
|
550
|
+
"name": "page",
|
|
551
|
+
"default": 1,
|
|
560
552
|
"hasDynamicHelp": false,
|
|
561
553
|
"multiple": false,
|
|
562
554
|
"type": "option"
|
|
@@ -564,7 +556,7 @@
|
|
|
564
556
|
},
|
|
565
557
|
"hasDynamicHelp": false,
|
|
566
558
|
"hiddenAliases": [],
|
|
567
|
-
"id": "
|
|
559
|
+
"id": "logs",
|
|
568
560
|
"pluginAlias": "@mailmodo/cli",
|
|
569
561
|
"pluginName": "@mailmodo/cli",
|
|
570
562
|
"pluginType": "core",
|
|
@@ -574,17 +566,18 @@
|
|
|
574
566
|
"relativePath": [
|
|
575
567
|
"dist",
|
|
576
568
|
"commands",
|
|
577
|
-
"
|
|
569
|
+
"logs",
|
|
578
570
|
"index.js"
|
|
579
571
|
]
|
|
580
572
|
},
|
|
581
|
-
"
|
|
573
|
+
"settings": {
|
|
582
574
|
"aliases": [],
|
|
583
575
|
"args": {},
|
|
584
|
-
"description": "View
|
|
576
|
+
"description": "View and update project settings",
|
|
585
577
|
"examples": [
|
|
586
|
-
"<%= config.bin %>
|
|
587
|
-
"<%= config.bin %>
|
|
578
|
+
"<%= config.bin %> settings",
|
|
579
|
+
"<%= config.bin %> settings --set brand_color=#0F3460",
|
|
580
|
+
"<%= config.bin %> settings --json"
|
|
588
581
|
],
|
|
589
582
|
"flags": {
|
|
590
583
|
"json": {
|
|
@@ -599,11 +592,18 @@
|
|
|
599
592
|
"name": "yes",
|
|
600
593
|
"allowNo": false,
|
|
601
594
|
"type": "boolean"
|
|
595
|
+
},
|
|
596
|
+
"set": {
|
|
597
|
+
"description": "Set a setting (format: key=value)",
|
|
598
|
+
"name": "set",
|
|
599
|
+
"hasDynamicHelp": false,
|
|
600
|
+
"multiple": false,
|
|
601
|
+
"type": "option"
|
|
602
602
|
}
|
|
603
603
|
},
|
|
604
604
|
"hasDynamicHelp": false,
|
|
605
605
|
"hiddenAliases": [],
|
|
606
|
-
"id": "
|
|
606
|
+
"id": "settings",
|
|
607
607
|
"pluginAlias": "@mailmodo/cli",
|
|
608
608
|
"pluginName": "@mailmodo/cli",
|
|
609
609
|
"pluginType": "core",
|
|
@@ -613,17 +613,17 @@
|
|
|
613
613
|
"relativePath": [
|
|
614
614
|
"dist",
|
|
615
615
|
"commands",
|
|
616
|
-
"
|
|
616
|
+
"settings",
|
|
617
617
|
"index.js"
|
|
618
618
|
]
|
|
619
619
|
},
|
|
620
|
-
"
|
|
620
|
+
"status": {
|
|
621
621
|
"aliases": [],
|
|
622
622
|
"args": {},
|
|
623
|
-
"description": "
|
|
623
|
+
"description": "View email performance metrics and quota usage",
|
|
624
624
|
"examples": [
|
|
625
|
-
"<%= config.bin %>
|
|
626
|
-
"
|
|
625
|
+
"<%= config.bin %> status",
|
|
626
|
+
"<%= config.bin %> status --json"
|
|
627
627
|
],
|
|
628
628
|
"flags": {
|
|
629
629
|
"json": {
|
|
@@ -642,7 +642,7 @@
|
|
|
642
642
|
},
|
|
643
643
|
"hasDynamicHelp": false,
|
|
644
644
|
"hiddenAliases": [],
|
|
645
|
-
"id": "
|
|
645
|
+
"id": "status",
|
|
646
646
|
"pluginAlias": "@mailmodo/cli",
|
|
647
647
|
"pluginName": "@mailmodo/cli",
|
|
648
648
|
"pluginType": "core",
|
|
@@ -652,10 +652,10 @@
|
|
|
652
652
|
"relativePath": [
|
|
653
653
|
"dist",
|
|
654
654
|
"commands",
|
|
655
|
-
"
|
|
655
|
+
"status",
|
|
656
656
|
"index.js"
|
|
657
657
|
]
|
|
658
658
|
}
|
|
659
659
|
},
|
|
660
|
-
"version": "0.0.49
|
|
660
|
+
"version": "0.0.49"
|
|
661
661
|
}
|