mxroute-cli 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/LICENSE +21 -0
- package/README.md +464 -0
- package/dist/commands/accounts.d.ts +4 -0
- package/dist/commands/accounts.js +262 -0
- package/dist/commands/accounts.js.map +1 -0
- package/dist/commands/aliases.d.ts +3 -0
- package/dist/commands/aliases.js +190 -0
- package/dist/commands/aliases.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.js +143 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/autoresponder.d.ts +4 -0
- package/dist/commands/autoresponder.js +280 -0
- package/dist/commands/autoresponder.js.map +1 -0
- package/dist/commands/catchall.d.ts +2 -0
- package/dist/commands/catchall.js +173 -0
- package/dist/commands/catchall.js.map +1 -0
- package/dist/commands/config.d.ts +5 -0
- package/dist/commands/config.js +161 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dns.d.ts +3 -0
- package/dist/commands/dns.js +160 -0
- package/dist/commands/dns.js.map +1 -0
- package/dist/commands/dnsapi.d.ts +4 -0
- package/dist/commands/dnsapi.js +397 -0
- package/dist/commands/dnsapi.js.map +1 -0
- package/dist/commands/domains.d.ts +2 -0
- package/dist/commands/domains.js +109 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/filters.d.ts +3 -0
- package/dist/commands/filters.js +300 -0
- package/dist/commands/filters.js.map +1 -0
- package/dist/commands/forwarders.d.ts +3 -0
- package/dist/commands/forwarders.js +202 -0
- package/dist/commands/forwarders.js.map +1 -0
- package/dist/commands/info.d.ts +2 -0
- package/dist/commands/info.js +163 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/lists.d.ts +6 -0
- package/dist/commands/lists.js +372 -0
- package/dist/commands/lists.js.map +1 -0
- package/dist/commands/quota.d.ts +2 -0
- package/dist/commands/quota.js +184 -0
- package/dist/commands/quota.js.map +1 -0
- package/dist/commands/send.d.ts +9 -0
- package/dist/commands/send.js +107 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/setup.d.ts +1 -0
- package/dist/commands/setup.js +535 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/spam.d.ts +4 -0
- package/dist/commands/spam.js +215 -0
- package/dist/commands/spam.js.map +1 -0
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +79 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/troubleshoot.d.ts +1 -0
- package/dist/commands/troubleshoot.js +324 -0
- package/dist/commands/troubleshoot.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +589 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +2 -0
- package/dist/mcp.js +599 -0
- package/dist/mcp.js.map +1 -0
- package/dist/utils/api.d.ts +15 -0
- package/dist/utils/api.js +30 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/config.d.ts +24 -0
- package/dist/utils/config.js +150 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/directadmin.d.ts +49 -0
- package/dist/utils/directadmin.js +444 -0
- package/dist/utils/directadmin.js.map +1 -0
- package/dist/utils/dns.d.ts +14 -0
- package/dist/utils/dns.js +284 -0
- package/dist/utils/dns.js.map +1 -0
- package/dist/utils/theme.d.ts +24 -0
- package/dist/utils/theme.js +95 -0
- package/dist/utils/theme.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkMxRecords = checkMxRecords;
|
|
4
|
+
exports.checkSpfRecord = checkSpfRecord;
|
|
5
|
+
exports.checkDkimRecord = checkDkimRecord;
|
|
6
|
+
exports.checkDmarcRecord = checkDmarcRecord;
|
|
7
|
+
exports.checkCustomHostname = checkCustomHostname;
|
|
8
|
+
exports.runFullDnsCheck = runFullDnsCheck;
|
|
9
|
+
const dns_1 = require("dns");
|
|
10
|
+
const util_1 = require("util");
|
|
11
|
+
const resolver = new dns_1.Resolver();
|
|
12
|
+
const resolveMx = (0, util_1.promisify)(resolver.resolveMx.bind(resolver));
|
|
13
|
+
const resolveTxt = (0, util_1.promisify)(resolver.resolveTxt.bind(resolver));
|
|
14
|
+
const resolveCname = (0, util_1.promisify)(resolver.resolveCname.bind(resolver));
|
|
15
|
+
async function checkMxRecords(domain, server) {
|
|
16
|
+
try {
|
|
17
|
+
const records = await resolveMx(domain);
|
|
18
|
+
const primaryExpected = `${server}.mxrouting.net`;
|
|
19
|
+
const relayExpected = `${server}-relay.mxrouting.net`;
|
|
20
|
+
const hasPrimary = records.some((r) => r.exchange.toLowerCase() === primaryExpected.toLowerCase());
|
|
21
|
+
const hasRelay = records.some((r) => r.exchange.toLowerCase() === relayExpected.toLowerCase());
|
|
22
|
+
const actual = records.map((r) => `${r.priority} ${r.exchange}`).join(', ');
|
|
23
|
+
if (hasPrimary && hasRelay) {
|
|
24
|
+
return {
|
|
25
|
+
type: 'MX',
|
|
26
|
+
name: domain,
|
|
27
|
+
status: 'pass',
|
|
28
|
+
expected: `${primaryExpected} + ${relayExpected}`,
|
|
29
|
+
actual,
|
|
30
|
+
message: 'MX records configured correctly',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
else if (hasPrimary) {
|
|
34
|
+
return {
|
|
35
|
+
type: 'MX',
|
|
36
|
+
name: domain,
|
|
37
|
+
status: 'warn',
|
|
38
|
+
expected: `${primaryExpected} + ${relayExpected}`,
|
|
39
|
+
actual,
|
|
40
|
+
message: 'Primary MX found but relay MX is missing',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return {
|
|
45
|
+
type: 'MX',
|
|
46
|
+
name: domain,
|
|
47
|
+
status: 'fail',
|
|
48
|
+
expected: primaryExpected,
|
|
49
|
+
actual: actual || 'No MX records',
|
|
50
|
+
message: 'MX records not pointing to MXroute',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
return {
|
|
56
|
+
type: 'MX',
|
|
57
|
+
name: domain,
|
|
58
|
+
status: 'fail',
|
|
59
|
+
expected: `${server}.mxrouting.net`,
|
|
60
|
+
actual: 'DNS lookup failed',
|
|
61
|
+
message: err.message,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function checkSpfRecord(domain) {
|
|
66
|
+
try {
|
|
67
|
+
const records = await resolveTxt(domain);
|
|
68
|
+
const flat = records.map((r) => r.join('')).filter((r) => r.startsWith('v=spf1'));
|
|
69
|
+
if (flat.length === 0) {
|
|
70
|
+
return {
|
|
71
|
+
type: 'SPF',
|
|
72
|
+
name: domain,
|
|
73
|
+
status: 'fail',
|
|
74
|
+
expected: 'v=spf1 include:mxroute.com -all',
|
|
75
|
+
actual: 'No SPF record',
|
|
76
|
+
message: 'No SPF record found',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (flat.length > 1) {
|
|
80
|
+
return {
|
|
81
|
+
type: 'SPF',
|
|
82
|
+
name: domain,
|
|
83
|
+
status: 'fail',
|
|
84
|
+
expected: '1 SPF record',
|
|
85
|
+
actual: `${flat.length} SPF records`,
|
|
86
|
+
message: 'Multiple SPF records found — only one allowed per domain',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const spf = flat[0];
|
|
90
|
+
const hasMxroute = spf.includes('include:mxroute.com') || spf.includes('include:mxlogin.com');
|
|
91
|
+
const hasHardFail = spf.endsWith('-all');
|
|
92
|
+
if (hasMxroute && hasHardFail) {
|
|
93
|
+
return {
|
|
94
|
+
type: 'SPF',
|
|
95
|
+
name: domain,
|
|
96
|
+
status: 'pass',
|
|
97
|
+
expected: 'include:mxroute.com -all',
|
|
98
|
+
actual: spf,
|
|
99
|
+
message: 'SPF record configured correctly',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
else if (hasMxroute) {
|
|
103
|
+
return {
|
|
104
|
+
type: 'SPF',
|
|
105
|
+
name: domain,
|
|
106
|
+
status: 'warn',
|
|
107
|
+
expected: '-all (hard fail)',
|
|
108
|
+
actual: spf,
|
|
109
|
+
message: 'SPF includes MXroute but uses soft fail (~all) — recommend -all',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
return {
|
|
114
|
+
type: 'SPF',
|
|
115
|
+
name: domain,
|
|
116
|
+
status: 'fail',
|
|
117
|
+
expected: 'include:mxroute.com',
|
|
118
|
+
actual: spf,
|
|
119
|
+
message: 'SPF record does not include MXroute',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
return {
|
|
125
|
+
type: 'SPF',
|
|
126
|
+
name: domain,
|
|
127
|
+
status: 'fail',
|
|
128
|
+
expected: 'v=spf1 include:mxroute.com -all',
|
|
129
|
+
actual: 'DNS lookup failed',
|
|
130
|
+
message: err.message,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function checkDkimRecord(domain) {
|
|
135
|
+
try {
|
|
136
|
+
const records = await resolveTxt(`x._domainkey.${domain}`);
|
|
137
|
+
const flat = records.map((r) => r.join(''));
|
|
138
|
+
if (flat.length === 0) {
|
|
139
|
+
return {
|
|
140
|
+
type: 'DKIM',
|
|
141
|
+
name: `x._domainkey.${domain}`,
|
|
142
|
+
status: 'fail',
|
|
143
|
+
expected: 'DKIM key present',
|
|
144
|
+
actual: 'No DKIM record',
|
|
145
|
+
message: 'No DKIM record found at x._domainkey',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const dkim = flat[0];
|
|
149
|
+
if (dkim.includes('v=DKIM1') && dkim.includes('p=')) {
|
|
150
|
+
return {
|
|
151
|
+
type: 'DKIM',
|
|
152
|
+
name: `x._domainkey.${domain}`,
|
|
153
|
+
status: 'pass',
|
|
154
|
+
expected: 'Valid DKIM key',
|
|
155
|
+
actual: `${dkim.substring(0, 60)}...`,
|
|
156
|
+
message: 'DKIM record configured correctly',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
return {
|
|
161
|
+
type: 'DKIM',
|
|
162
|
+
name: `x._domainkey.${domain}`,
|
|
163
|
+
status: 'warn',
|
|
164
|
+
expected: 'v=DKIM1; p=...',
|
|
165
|
+
actual: dkim.substring(0, 60),
|
|
166
|
+
message: 'DKIM record found but may be malformed',
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
return {
|
|
172
|
+
type: 'DKIM',
|
|
173
|
+
name: `x._domainkey.${domain}`,
|
|
174
|
+
status: 'fail',
|
|
175
|
+
expected: 'DKIM key at x._domainkey',
|
|
176
|
+
actual: 'DNS lookup failed',
|
|
177
|
+
message: 'No DKIM record found — add TXT record at x._domainkey from Control Panel',
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async function checkDmarcRecord(domain) {
|
|
182
|
+
try {
|
|
183
|
+
const records = await resolveTxt(`_dmarc.${domain}`);
|
|
184
|
+
const flat = records.map((r) => r.join(''));
|
|
185
|
+
if (flat.length === 0) {
|
|
186
|
+
return {
|
|
187
|
+
type: 'DMARC',
|
|
188
|
+
name: `_dmarc.${domain}`,
|
|
189
|
+
status: 'warn',
|
|
190
|
+
expected: 'v=DMARC1; p=quarantine;',
|
|
191
|
+
actual: 'No DMARC record',
|
|
192
|
+
message: 'No DMARC record found — strongly recommended',
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const dmarc = flat[0];
|
|
196
|
+
if (dmarc.includes('v=DMARC1')) {
|
|
197
|
+
const hasReject = dmarc.includes('p=reject');
|
|
198
|
+
const hasQuarantine = dmarc.includes('p=quarantine');
|
|
199
|
+
const status = hasReject || hasQuarantine ? 'pass' : 'warn';
|
|
200
|
+
const message = hasReject
|
|
201
|
+
? 'DMARC with reject policy (strictest)'
|
|
202
|
+
: hasQuarantine
|
|
203
|
+
? 'DMARC with quarantine policy (recommended)'
|
|
204
|
+
: 'DMARC found but using none policy — consider quarantine or reject';
|
|
205
|
+
return {
|
|
206
|
+
type: 'DMARC',
|
|
207
|
+
name: `_dmarc.${domain}`,
|
|
208
|
+
status,
|
|
209
|
+
expected: 'v=DMARC1; p=quarantine;',
|
|
210
|
+
actual: dmarc,
|
|
211
|
+
message,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
return {
|
|
216
|
+
type: 'DMARC',
|
|
217
|
+
name: `_dmarc.${domain}`,
|
|
218
|
+
status: 'fail',
|
|
219
|
+
expected: 'v=DMARC1;',
|
|
220
|
+
actual: dmarc,
|
|
221
|
+
message: 'Record found but not a valid DMARC record',
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
return {
|
|
227
|
+
type: 'DMARC',
|
|
228
|
+
name: `_dmarc.${domain}`,
|
|
229
|
+
status: 'warn',
|
|
230
|
+
expected: 'v=DMARC1; p=quarantine;',
|
|
231
|
+
actual: 'No record',
|
|
232
|
+
message: 'No DMARC record found — strongly recommended to add one',
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
async function checkCustomHostname(domain, server, subdomain = 'mail') {
|
|
237
|
+
try {
|
|
238
|
+
const records = await resolveCname(`${subdomain}.${domain}`);
|
|
239
|
+
const expected = `${server}.mxrouting.net`;
|
|
240
|
+
const matches = records.some((r) => r.toLowerCase().replace(/\.$/, '') === expected.toLowerCase());
|
|
241
|
+
if (matches) {
|
|
242
|
+
return {
|
|
243
|
+
type: 'CNAME',
|
|
244
|
+
name: `${subdomain}.${domain}`,
|
|
245
|
+
status: 'pass',
|
|
246
|
+
expected,
|
|
247
|
+
actual: records[0],
|
|
248
|
+
message: `Custom hostname ${subdomain}.${domain} configured correctly`,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
return {
|
|
253
|
+
type: 'CNAME',
|
|
254
|
+
name: `${subdomain}.${domain}`,
|
|
255
|
+
status: 'fail',
|
|
256
|
+
expected,
|
|
257
|
+
actual: records[0],
|
|
258
|
+
message: `CNAME not pointing to ${expected}`,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
return {
|
|
264
|
+
type: 'CNAME',
|
|
265
|
+
name: `${subdomain}.${domain}`,
|
|
266
|
+
status: 'info',
|
|
267
|
+
expected: `${server}.mxrouting.net`,
|
|
268
|
+
actual: 'No CNAME record',
|
|
269
|
+
message: 'No custom hostname configured (optional)',
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async function runFullDnsCheck(domain, server) {
|
|
274
|
+
const results = await Promise.all([
|
|
275
|
+
checkMxRecords(domain, server),
|
|
276
|
+
checkSpfRecord(domain),
|
|
277
|
+
checkDkimRecord(domain),
|
|
278
|
+
checkDmarcRecord(domain),
|
|
279
|
+
checkCustomHostname(domain, server, 'mail'),
|
|
280
|
+
checkCustomHostname(domain, server, 'webmail'),
|
|
281
|
+
]);
|
|
282
|
+
return results;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=dns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dns.js","sourceRoot":"","sources":["../../src/utils/dns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export declare const theme: {
|
|
3
|
+
primary: chalk.Chalk;
|
|
4
|
+
secondary: chalk.Chalk;
|
|
5
|
+
success: chalk.Chalk;
|
|
6
|
+
warning: chalk.Chalk;
|
|
7
|
+
error: chalk.Chalk;
|
|
8
|
+
muted: chalk.Chalk;
|
|
9
|
+
info: chalk.Chalk;
|
|
10
|
+
bold: chalk.Chalk;
|
|
11
|
+
dim: chalk.Chalk;
|
|
12
|
+
heading(text: string): string;
|
|
13
|
+
subheading(text: string): string;
|
|
14
|
+
label(text: string): string;
|
|
15
|
+
value(text: string): string;
|
|
16
|
+
record(type: string, name: string, value: string, priority?: number): string;
|
|
17
|
+
banner(): string;
|
|
18
|
+
separator(): string;
|
|
19
|
+
keyValue(key: string, val: string, indent?: number): string;
|
|
20
|
+
statusIcon(status: "pass" | "fail" | "warn" | "info"): string;
|
|
21
|
+
box(content: string, title?: string): string;
|
|
22
|
+
};
|
|
23
|
+
declare function stripAnsi(str: string): string;
|
|
24
|
+
export { stripAnsi };
|
|
@@ -0,0 +1,95 @@
|
|
|
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.theme = void 0;
|
|
7
|
+
exports.stripAnsi = stripAnsi;
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const figures_1 = __importDefault(require("figures"));
|
|
10
|
+
exports.theme = {
|
|
11
|
+
primary: chalk_1.default.hex('#6C63FF'),
|
|
12
|
+
secondary: chalk_1.default.hex('#00D9FF'),
|
|
13
|
+
success: chalk_1.default.hex('#00E676'),
|
|
14
|
+
warning: chalk_1.default.hex('#FFD600'),
|
|
15
|
+
error: chalk_1.default.hex('#FF5252'),
|
|
16
|
+
muted: chalk_1.default.hex('#7C8DB0'),
|
|
17
|
+
info: chalk_1.default.hex('#448AFF'),
|
|
18
|
+
bold: chalk_1.default.bold,
|
|
19
|
+
dim: chalk_1.default.dim,
|
|
20
|
+
heading(text) {
|
|
21
|
+
return '\n' + chalk_1.default.bold.hex('#6C63FF')(` ${figures_1.default.pointer} ${text}`) + '\n';
|
|
22
|
+
},
|
|
23
|
+
subheading(text) {
|
|
24
|
+
return chalk_1.default.hex('#00D9FF')(` ${text}`);
|
|
25
|
+
},
|
|
26
|
+
label(text) {
|
|
27
|
+
return chalk_1.default.hex('#7C8DB0')(text);
|
|
28
|
+
},
|
|
29
|
+
value(text) {
|
|
30
|
+
return chalk_1.default.white.bold(text);
|
|
31
|
+
},
|
|
32
|
+
record(type, name, value, priority) {
|
|
33
|
+
const t = chalk_1.default.hex('#FFD600').bold(type.padEnd(6));
|
|
34
|
+
const n = chalk_1.default.white(name.padEnd(20));
|
|
35
|
+
const p = priority !== undefined ? chalk_1.default.hex('#7C8DB0')(`(pri: ${priority}) `.padEnd(12)) : ' ';
|
|
36
|
+
const v = chalk_1.default.hex('#00E676')(value);
|
|
37
|
+
return ` ${t} ${n} ${p} ${v}`;
|
|
38
|
+
},
|
|
39
|
+
banner() {
|
|
40
|
+
const c = chalk_1.default.hex('#00D9FF');
|
|
41
|
+
const m = chalk_1.default.hex('#7C8DB0');
|
|
42
|
+
const p = chalk_1.default.hex('#6C63FF');
|
|
43
|
+
const logo = [
|
|
44
|
+
'',
|
|
45
|
+
c(' __ ____ __ _ '),
|
|
46
|
+
c(' | \\/ \\ \\/ /_ __ ___ _ _| |_ ___ '),
|
|
47
|
+
c(" | |\\/| |\\ /| '__/ _ \\| | | | __/ _ \\"),
|
|
48
|
+
c(' | | | |/ \\| | | (_) | |_| | || __/'),
|
|
49
|
+
c(' |_| |_/_/\\_\\_| \\___/ \\__,_|\\__\\___|'),
|
|
50
|
+
'',
|
|
51
|
+
` ${p('Email Hosting Management CLI')} ${m('v0.1.0')}`,
|
|
52
|
+
'',
|
|
53
|
+
];
|
|
54
|
+
return logo.join('\n');
|
|
55
|
+
},
|
|
56
|
+
separator() {
|
|
57
|
+
return chalk_1.default.hex('#7C8DB0')(' ' + '─'.repeat(42));
|
|
58
|
+
},
|
|
59
|
+
keyValue(key, val, indent = 4) {
|
|
60
|
+
const pad = ' '.repeat(indent);
|
|
61
|
+
return `${pad}${chalk_1.default.hex('#7C8DB0')(key.padEnd(18))} ${chalk_1.default.white(val)}`;
|
|
62
|
+
},
|
|
63
|
+
statusIcon(status) {
|
|
64
|
+
switch (status) {
|
|
65
|
+
case 'pass':
|
|
66
|
+
return chalk_1.default.hex('#00E676')(figures_1.default.tick);
|
|
67
|
+
case 'fail':
|
|
68
|
+
return chalk_1.default.hex('#FF5252')(figures_1.default.cross);
|
|
69
|
+
case 'warn':
|
|
70
|
+
return chalk_1.default.hex('#FFD600')(figures_1.default.warning);
|
|
71
|
+
case 'info':
|
|
72
|
+
return chalk_1.default.hex('#448AFF')(figures_1.default.info);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
box(content, title) {
|
|
76
|
+
const lines = content.split('\n');
|
|
77
|
+
const maxLen = Math.max(...lines.map((l) => stripAnsi(l).length), title ? stripAnsi(title).length + 4 : 0);
|
|
78
|
+
const width = maxLen + 4;
|
|
79
|
+
const top = title
|
|
80
|
+
? chalk_1.default.hex('#6C63FF')(' ┌─ ') +
|
|
81
|
+
chalk_1.default.hex('#00D9FF').bold(title) +
|
|
82
|
+
chalk_1.default.hex('#6C63FF')(' ' + '─'.repeat(Math.max(0, width - stripAnsi(title).length - 5)) + '┐')
|
|
83
|
+
: chalk_1.default.hex('#6C63FF')(' ┌' + '─'.repeat(width) + '┐');
|
|
84
|
+
const bottom = chalk_1.default.hex('#6C63FF')(' └' + '─'.repeat(width) + '┘');
|
|
85
|
+
const body = lines.map((l) => {
|
|
86
|
+
const pad = ' '.repeat(Math.max(0, maxLen - stripAnsi(l).length));
|
|
87
|
+
return chalk_1.default.hex('#6C63FF')(' │') + ' ' + l + pad + ' ' + chalk_1.default.hex('#6C63FF')('│');
|
|
88
|
+
});
|
|
89
|
+
return [top, ...body, bottom].join('\n');
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
function stripAnsi(str) {
|
|
93
|
+
return str.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, '');
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mxroute-cli",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "A powerful CLI for managing MXroute email hosting — send emails, verify DNS, generate records, troubleshoot, and more.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mxroute": "dist/index.js",
|
|
8
|
+
"mxroute-mcp": "dist/mcp.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"test:coverage": "vitest run --coverage",
|
|
17
|
+
"lint": "eslint src/ tests/",
|
|
18
|
+
"lint:fix": "eslint src/ tests/ --fix",
|
|
19
|
+
"format": "prettier --write 'src/**/*.ts' 'tests/**/*.ts'",
|
|
20
|
+
"format:check": "prettier --check 'src/**/*.ts' 'tests/**/*.ts'",
|
|
21
|
+
"typecheck": "tsc --noEmit",
|
|
22
|
+
"ci": "npm run lint && npm run typecheck && npm run build && npm test",
|
|
23
|
+
"prepublishOnly": "npm run ci",
|
|
24
|
+
"postbuild": "chmod +x dist/index.js dist/mcp.js",
|
|
25
|
+
"prepare": "husky",
|
|
26
|
+
"changelog": "conventional-changelog -p conventionalcommits -i CHANGELOG.md -s",
|
|
27
|
+
"preversion": "npm run ci",
|
|
28
|
+
"version": "npm run changelog && git add CHANGELOG.md",
|
|
29
|
+
"postversion": "git push && git push --tags",
|
|
30
|
+
"release": "npm version patch",
|
|
31
|
+
"release:minor": "npm version minor",
|
|
32
|
+
"release:major": "npm version major"
|
|
33
|
+
},
|
|
34
|
+
"lint-staged": {
|
|
35
|
+
"*.ts": [
|
|
36
|
+
"eslint --fix",
|
|
37
|
+
"prettier --write"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"mxroute",
|
|
42
|
+
"email",
|
|
43
|
+
"smtp",
|
|
44
|
+
"dns",
|
|
45
|
+
"cli",
|
|
46
|
+
"mcp",
|
|
47
|
+
"email-hosting",
|
|
48
|
+
"imap",
|
|
49
|
+
"dkim",
|
|
50
|
+
"spf",
|
|
51
|
+
"dmarc",
|
|
52
|
+
"directadmin",
|
|
53
|
+
"model-context-protocol"
|
|
54
|
+
],
|
|
55
|
+
"author": "",
|
|
56
|
+
"license": "MIT",
|
|
57
|
+
"files": [
|
|
58
|
+
"dist",
|
|
59
|
+
"README.md",
|
|
60
|
+
"LICENSE"
|
|
61
|
+
],
|
|
62
|
+
"engines": {
|
|
63
|
+
"node": ">=20.0.0"
|
|
64
|
+
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
67
|
+
"chalk": "^4.1.2",
|
|
68
|
+
"cli-table3": "^0.6.5",
|
|
69
|
+
"commander": "^13.1.0",
|
|
70
|
+
"figures": "^3.2.0",
|
|
71
|
+
"inquirer": "^8.2.6",
|
|
72
|
+
"node-fetch": "^2.7.0",
|
|
73
|
+
"ora": "^5.4.1",
|
|
74
|
+
"zod": "^4.3.6"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@tsconfig/node18": "^18.2.4",
|
|
78
|
+
"@types/inquirer": "^8.2.10",
|
|
79
|
+
"@types/node": "^22.15.17",
|
|
80
|
+
"@types/node-fetch": "^2.6.13",
|
|
81
|
+
"@typescript-eslint/eslint-plugin": "^8.57.0",
|
|
82
|
+
"@typescript-eslint/parser": "^8.57.0",
|
|
83
|
+
"@vitest/coverage-v8": "^4.1.0",
|
|
84
|
+
"conventional-changelog-cli": "^5.0.0",
|
|
85
|
+
"eslint": "^9.39.4",
|
|
86
|
+
"husky": "^9.1.7",
|
|
87
|
+
"lint-staged": "^16.4.0",
|
|
88
|
+
"prettier": "^3.8.1",
|
|
89
|
+
"typescript": "^5.8.3",
|
|
90
|
+
"vitest": "^4.1.0"
|
|
91
|
+
}
|
|
92
|
+
}
|