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.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +464 -0
  3. package/dist/commands/accounts.d.ts +4 -0
  4. package/dist/commands/accounts.js +262 -0
  5. package/dist/commands/accounts.js.map +1 -0
  6. package/dist/commands/aliases.d.ts +3 -0
  7. package/dist/commands/aliases.js +190 -0
  8. package/dist/commands/aliases.js.map +1 -0
  9. package/dist/commands/auth.d.ts +3 -0
  10. package/dist/commands/auth.js +143 -0
  11. package/dist/commands/auth.js.map +1 -0
  12. package/dist/commands/autoresponder.d.ts +4 -0
  13. package/dist/commands/autoresponder.js +280 -0
  14. package/dist/commands/autoresponder.js.map +1 -0
  15. package/dist/commands/catchall.d.ts +2 -0
  16. package/dist/commands/catchall.js +173 -0
  17. package/dist/commands/catchall.js.map +1 -0
  18. package/dist/commands/config.d.ts +5 -0
  19. package/dist/commands/config.js +161 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/dns.d.ts +3 -0
  22. package/dist/commands/dns.js +160 -0
  23. package/dist/commands/dns.js.map +1 -0
  24. package/dist/commands/dnsapi.d.ts +4 -0
  25. package/dist/commands/dnsapi.js +397 -0
  26. package/dist/commands/dnsapi.js.map +1 -0
  27. package/dist/commands/domains.d.ts +2 -0
  28. package/dist/commands/domains.js +109 -0
  29. package/dist/commands/domains.js.map +1 -0
  30. package/dist/commands/filters.d.ts +3 -0
  31. package/dist/commands/filters.js +300 -0
  32. package/dist/commands/filters.js.map +1 -0
  33. package/dist/commands/forwarders.d.ts +3 -0
  34. package/dist/commands/forwarders.js +202 -0
  35. package/dist/commands/forwarders.js.map +1 -0
  36. package/dist/commands/info.d.ts +2 -0
  37. package/dist/commands/info.js +163 -0
  38. package/dist/commands/info.js.map +1 -0
  39. package/dist/commands/lists.d.ts +6 -0
  40. package/dist/commands/lists.js +372 -0
  41. package/dist/commands/lists.js.map +1 -0
  42. package/dist/commands/quota.d.ts +2 -0
  43. package/dist/commands/quota.js +184 -0
  44. package/dist/commands/quota.js.map +1 -0
  45. package/dist/commands/send.d.ts +9 -0
  46. package/dist/commands/send.js +107 -0
  47. package/dist/commands/send.js.map +1 -0
  48. package/dist/commands/setup.d.ts +1 -0
  49. package/dist/commands/setup.js +535 -0
  50. package/dist/commands/setup.js.map +1 -0
  51. package/dist/commands/spam.d.ts +4 -0
  52. package/dist/commands/spam.js +215 -0
  53. package/dist/commands/spam.js.map +1 -0
  54. package/dist/commands/status.d.ts +1 -0
  55. package/dist/commands/status.js +79 -0
  56. package/dist/commands/status.js.map +1 -0
  57. package/dist/commands/troubleshoot.d.ts +1 -0
  58. package/dist/commands/troubleshoot.js +324 -0
  59. package/dist/commands/troubleshoot.js.map +1 -0
  60. package/dist/index.d.ts +2 -0
  61. package/dist/index.js +589 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/mcp.d.ts +2 -0
  64. package/dist/mcp.js +599 -0
  65. package/dist/mcp.js.map +1 -0
  66. package/dist/utils/api.d.ts +15 -0
  67. package/dist/utils/api.js +30 -0
  68. package/dist/utils/api.js.map +1 -0
  69. package/dist/utils/config.d.ts +24 -0
  70. package/dist/utils/config.js +150 -0
  71. package/dist/utils/config.js.map +1 -0
  72. package/dist/utils/directadmin.d.ts +49 -0
  73. package/dist/utils/directadmin.js +444 -0
  74. package/dist/utils/directadmin.js.map +1 -0
  75. package/dist/utils/dns.d.ts +14 -0
  76. package/dist/utils/dns.js +284 -0
  77. package/dist/utils/dns.js.map +1 -0
  78. package/dist/utils/theme.d.ts +24 -0
  79. package/dist/utils/theme.js +95 -0
  80. package/dist/utils/theme.js.map +1 -0
  81. 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
+ }