firecrawl-cli 1.18.6 → 1.19.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.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for the doctor command. Covers:
3
+ * - version comparison utility
4
+ * - MCP-entry detection helper
5
+ * - runChecks() across pass/warn/fail scenarios
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=doctor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/commands/doctor.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for the doctor command. Covers:
4
+ * - version comparison utility
5
+ * - MCP-entry detection helper
6
+ * - runChecks() across pass/warn/fail scenarios
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const vitest_1 = require("vitest");
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const os_1 = __importDefault(require("os"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const npm_registry_1 = require("../../utils/npm-registry");
17
+ const agents_1 = require("../../utils/agents");
18
+ const doctor_1 = require("../../commands/doctor");
19
+ const config_1 = require("../../utils/config");
20
+ const mockFetch = vitest_1.vi.fn();
21
+ global.fetch = mockFetch;
22
+ (0, vitest_1.describe)('compareVersions', () => {
23
+ (0, vitest_1.it)('returns 0 for equal versions', () => {
24
+ (0, vitest_1.expect)((0, npm_registry_1.compareVersions)('1.2.3', '1.2.3')).toBe(0);
25
+ });
26
+ (0, vitest_1.it)('returns negative when first is older', () => {
27
+ (0, vitest_1.expect)((0, npm_registry_1.compareVersions)('1.0.0', '1.0.1')).toBeLessThan(0);
28
+ (0, vitest_1.expect)((0, npm_registry_1.compareVersions)('1.0.0', '2.0.0')).toBeLessThan(0);
29
+ });
30
+ (0, vitest_1.it)('returns positive when first is newer', () => {
31
+ (0, vitest_1.expect)((0, npm_registry_1.compareVersions)('1.0.1', '1.0.0')).toBeGreaterThan(0);
32
+ (0, vitest_1.expect)((0, npm_registry_1.compareVersions)('2.0.0', '1.9.9')).toBeGreaterThan(0);
33
+ });
34
+ (0, vitest_1.it)('handles missing parts and v-prefix', () => {
35
+ (0, vitest_1.expect)((0, npm_registry_1.compareVersions)('v1.2', '1.2.0')).toBe(0);
36
+ (0, vitest_1.expect)((0, npm_registry_1.compareVersions)('1.2.0-beta.1', '1.2.0')).toBe(0);
37
+ });
38
+ });
39
+ (0, vitest_1.describe)('hasFirecrawlMcpEntry', () => {
40
+ (0, vitest_1.it)('detects firecrawl under mcpServers', () => {
41
+ (0, vitest_1.expect)((0, agents_1.hasFirecrawlMcpEntry)({
42
+ mcpServers: { firecrawl: { command: 'npx' } },
43
+ })).toBe(true);
44
+ });
45
+ (0, vitest_1.it)('detects firecrawl under mcp.servers (VS Code style)', () => {
46
+ (0, vitest_1.expect)((0, agents_1.hasFirecrawlMcpEntry)({
47
+ mcp: { servers: { firecrawl: { command: 'npx' } } },
48
+ })).toBe(true);
49
+ });
50
+ (0, vitest_1.it)('returns false when no firecrawl entry present', () => {
51
+ (0, vitest_1.expect)((0, agents_1.hasFirecrawlMcpEntry)({
52
+ mcpServers: { other: { command: 'npx' } },
53
+ })).toBe(false);
54
+ });
55
+ (0, vitest_1.it)('returns false for non-object input', () => {
56
+ (0, vitest_1.expect)((0, agents_1.hasFirecrawlMcpEntry)(null)).toBe(false);
57
+ (0, vitest_1.expect)((0, agents_1.hasFirecrawlMcpEntry)('string')).toBe(false);
58
+ (0, vitest_1.expect)((0, agents_1.hasFirecrawlMcpEntry)(42)).toBe(false);
59
+ });
60
+ (0, vitest_1.it)('walks nested objects', () => {
61
+ (0, vitest_1.expect)((0, agents_1.hasFirecrawlMcpEntry)({
62
+ projects: {
63
+ '/repo': { mcpServers: { firecrawl: {} } },
64
+ },
65
+ })).toBe(true);
66
+ });
67
+ });
68
+ (0, vitest_1.describe)('runChecks', () => {
69
+ let tmpCwd;
70
+ let originalCwd;
71
+ (0, vitest_1.beforeEach)(() => {
72
+ (0, config_1.resetConfig)();
73
+ mockFetch.mockReset();
74
+ originalCwd = process.cwd();
75
+ tmpCwd = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'doctor-test-'));
76
+ process.chdir(tmpCwd);
77
+ });
78
+ (0, vitest_1.afterEach)(() => {
79
+ process.chdir(originalCwd);
80
+ fs_1.default.rmSync(tmpCwd, { recursive: true, force: true });
81
+ (0, config_1.resetConfig)();
82
+ });
83
+ /**
84
+ * Stub every outbound fetch the doctor makes.
85
+ * - registry.npmjs.org → returns { version }
86
+ * - /v2/team/credit-usage → returns credit usage payload + status
87
+ * - /v2/team/queue-status → returns queue payload + status
88
+ */
89
+ function stubFetch(opts) {
90
+ mockFetch.mockImplementation(async (url) => {
91
+ if (url.includes('registry.npmjs.org')) {
92
+ if (opts.registryUnreachable)
93
+ throw new Error('ENOTFOUND');
94
+ return {
95
+ ok: true,
96
+ status: 200,
97
+ json: async () => ({ version: opts.latestVersion ?? '1.0.0' }),
98
+ };
99
+ }
100
+ if (url.includes('/v2/team/credit-usage')) {
101
+ if (opts.slowMs)
102
+ await new Promise((r) => setTimeout(r, opts.slowMs));
103
+ const status = opts.creditsStatus ?? 200;
104
+ return {
105
+ ok: status >= 200 && status < 300,
106
+ status,
107
+ json: async () => ({ data: opts.credits ?? {} }),
108
+ };
109
+ }
110
+ if (url.includes('/v2/team/queue-status')) {
111
+ const status = opts.queueStatus ?? 200;
112
+ return {
113
+ ok: status >= 200 && status < 300,
114
+ status,
115
+ json: async () => ({
116
+ success: true,
117
+ activeJobsInQueue: 0,
118
+ maxConcurrency: 10,
119
+ ...opts.queue,
120
+ }),
121
+ };
122
+ }
123
+ throw new Error(`Unexpected fetch: ${url}`);
124
+ });
125
+ }
126
+ function checkByName(checks, name) {
127
+ const c = checks.find((x) => x.name === name);
128
+ if (!c)
129
+ throw new Error(`Missing check: ${name}`);
130
+ return c;
131
+ }
132
+ (0, vitest_1.it)('fails the API Key check when no key is configured', async () => {
133
+ stubFetch({});
134
+ const { checks } = await (0, doctor_1.runChecks)({});
135
+ (0, vitest_1.expect)(checkByName(checks, 'API Key').status).toBe('fail');
136
+ // Without a key we don't ping the API, so concurrency comes back as fail
137
+ (0, vitest_1.expect)(checkByName(checks, 'Concurrency').status).toBe('fail');
138
+ });
139
+ (0, vitest_1.it)('passes the happy path with current version and full credits', async () => {
140
+ (0, config_1.initializeConfig)({
141
+ apiKey: 'fc-abc123def456',
142
+ apiUrl: 'https://api.firecrawl.dev',
143
+ });
144
+ stubFetch({
145
+ latestVersion: '0.0.1', // older than packageJson, so doctor sees pass
146
+ credits: { remainingCredits: 9000, planCredits: 10000 },
147
+ queue: { success: true, activeJobsInQueue: 1, maxConcurrency: 10 },
148
+ });
149
+ const { checks } = await (0, doctor_1.runChecks)({});
150
+ (0, vitest_1.expect)(checkByName(checks, 'API Key').status).toBe('pass');
151
+ (0, vitest_1.expect)(checkByName(checks, 'API Reachability').status).toBe('pass');
152
+ (0, vitest_1.expect)(checkByName(checks, 'API Key Validity').status).toBe('pass');
153
+ (0, vitest_1.expect)(checkByName(checks, 'Credits').status).toBe('pass');
154
+ (0, vitest_1.expect)(checkByName(checks, 'Concurrency').status).toBe('pass');
155
+ });
156
+ (0, vitest_1.it)('labels API keys passed by flag as flag sourced', async () => {
157
+ (0, config_1.initializeConfig)({
158
+ apiKey: 'fc-stored',
159
+ apiUrl: 'https://api.firecrawl.dev',
160
+ });
161
+ stubFetch({
162
+ credits: { remainingCredits: 500, planCredits: 1000 },
163
+ });
164
+ const { checks } = await (0, doctor_1.runChecks)({ apiKey: 'fc-flag' });
165
+ (0, vitest_1.expect)(checkByName(checks, 'API Key').message).toBe('fc-...flag (flag)');
166
+ });
167
+ (0, vitest_1.it)('warns on outdated CLI version', async () => {
168
+ (0, config_1.initializeConfig)({
169
+ apiKey: 'fc-test',
170
+ apiUrl: 'https://api.firecrawl.dev',
171
+ });
172
+ stubFetch({
173
+ latestVersion: '99.99.99',
174
+ credits: { remainingCredits: 100, planCredits: 1000 },
175
+ });
176
+ const { checks } = await (0, doctor_1.runChecks)({});
177
+ (0, vitest_1.expect)(checkByName(checks, 'CLI Version').status).toBe('warn');
178
+ });
179
+ (0, vitest_1.it)('fails API Key Validity on 401', async () => {
180
+ (0, config_1.initializeConfig)({ apiKey: 'fc-bad', apiUrl: 'https://api.firecrawl.dev' });
181
+ stubFetch({ creditsStatus: 401 });
182
+ const { checks } = await (0, doctor_1.runChecks)({});
183
+ (0, vitest_1.expect)(checkByName(checks, 'API Key Validity').status).toBe('fail');
184
+ });
185
+ (0, vitest_1.it)('warns when credits are below 10% of plan', async () => {
186
+ (0, config_1.initializeConfig)({
187
+ apiKey: 'fc-test',
188
+ apiUrl: 'https://api.firecrawl.dev',
189
+ });
190
+ stubFetch({
191
+ credits: { remainingCredits: 50, planCredits: 1000 },
192
+ });
193
+ const { checks } = await (0, doctor_1.runChecks)({});
194
+ (0, vitest_1.expect)(checkByName(checks, 'Credits').status).toBe('warn');
195
+ });
196
+ (0, vitest_1.it)('does not render impossible credit percentages above 100%', async () => {
197
+ (0, config_1.initializeConfig)({
198
+ apiKey: 'fc-test',
199
+ apiUrl: 'https://api.firecrawl.dev',
200
+ });
201
+ stubFetch({
202
+ credits: { remainingCredits: 5000, planCredits: 1000 },
203
+ });
204
+ const { checks } = await (0, doctor_1.runChecks)({});
205
+ (0, vitest_1.expect)(checkByName(checks, 'Credits')).toMatchObject({
206
+ status: 'pass',
207
+ message: '5,000 / 1,000 (above plan)',
208
+ });
209
+ });
210
+ (0, vitest_1.it)('fails when credits hit zero', async () => {
211
+ (0, config_1.initializeConfig)({
212
+ apiKey: 'fc-test',
213
+ apiUrl: 'https://api.firecrawl.dev',
214
+ });
215
+ stubFetch({
216
+ credits: { remainingCredits: 0, planCredits: 1000 },
217
+ });
218
+ const { checks } = await (0, doctor_1.runChecks)({});
219
+ (0, vitest_1.expect)(checkByName(checks, 'Credits').status).toBe('fail');
220
+ });
221
+ (0, vitest_1.it)('warns concurrency when active >= max', async () => {
222
+ (0, config_1.initializeConfig)({
223
+ apiKey: 'fc-test',
224
+ apiUrl: 'https://api.firecrawl.dev',
225
+ });
226
+ stubFetch({
227
+ credits: { remainingCredits: 500, planCredits: 1000 },
228
+ queue: { success: true, activeJobsInQueue: 10, maxConcurrency: 10 },
229
+ });
230
+ const { checks } = await (0, doctor_1.runChecks)({});
231
+ (0, vitest_1.expect)(checkByName(checks, 'Concurrency').status).toBe('warn');
232
+ });
233
+ (0, vitest_1.it)('warns when .firecrawl/ exists but .gitignore is missing', async () => {
234
+ (0, config_1.initializeConfig)({
235
+ apiKey: 'fc-test',
236
+ apiUrl: 'https://api.firecrawl.dev',
237
+ });
238
+ fs_1.default.mkdirSync(path_1.default.join(tmpCwd, '.firecrawl'));
239
+ stubFetch({ credits: { remainingCredits: 500, planCredits: 1000 } });
240
+ const { checks } = await (0, doctor_1.runChecks)({});
241
+ (0, vitest_1.expect)(checkByName(checks, '.gitignore').status).toBe('warn');
242
+ });
243
+ (0, vitest_1.it)('passes when .firecrawl/ exists and is gitignored', async () => {
244
+ (0, config_1.initializeConfig)({
245
+ apiKey: 'fc-test',
246
+ apiUrl: 'https://api.firecrawl.dev',
247
+ });
248
+ fs_1.default.mkdirSync(path_1.default.join(tmpCwd, '.firecrawl'));
249
+ fs_1.default.writeFileSync(path_1.default.join(tmpCwd, '.gitignore'), '.firecrawl/\n');
250
+ stubFetch({ credits: { remainingCredits: 500, planCredits: 1000 } });
251
+ const { checks } = await (0, doctor_1.runChecks)({});
252
+ (0, vitest_1.expect)(checkByName(checks, '.gitignore').status).toBe('pass');
253
+ });
254
+ (0, vitest_1.it)('warns when .env key mismatches configured key', async () => {
255
+ (0, config_1.initializeConfig)({
256
+ apiKey: 'fc-stored',
257
+ apiUrl: 'https://api.firecrawl.dev',
258
+ });
259
+ fs_1.default.writeFileSync(path_1.default.join(tmpCwd, '.env'), 'FIRECRAWL_API_KEY=fc-different\n');
260
+ stubFetch({ credits: { remainingCredits: 500, planCredits: 1000 } });
261
+ const { checks } = await (0, doctor_1.runChecks)({});
262
+ (0, vitest_1.expect)(checkByName(checks, 'Local .env').status).toBe('warn');
263
+ });
264
+ (0, vitest_1.it)('warns on custom (non-default) API URL', async () => {
265
+ (0, config_1.initializeConfig)({ apiKey: 'fc-test', apiUrl: 'http://localhost:3002' });
266
+ stubFetch({ credits: { remainingCredits: 500, planCredits: 1000 } });
267
+ const { checks } = await (0, doctor_1.runChecks)({});
268
+ (0, vitest_1.expect)(checkByName(checks, 'API Reachability').status).toBe('warn');
269
+ });
270
+ (0, vitest_1.it)('does not warn on the default API URL with a trailing slash', async () => {
271
+ (0, config_1.initializeConfig)({
272
+ apiKey: 'fc-test',
273
+ apiUrl: 'https://api.firecrawl.dev/',
274
+ });
275
+ stubFetch({ credits: { remainingCredits: 500, planCredits: 1000 } });
276
+ const { checks } = await (0, doctor_1.runChecks)({});
277
+ (0, vitest_1.expect)(checkByName(checks, 'API Reachability').status).toBe('pass');
278
+ });
279
+ (0, vitest_1.it)('returns plain messages without ANSI escapes for JSON output', async () => {
280
+ (0, config_1.initializeConfig)({
281
+ apiKey: 'fc-test',
282
+ apiUrl: 'https://api.firecrawl.dev',
283
+ });
284
+ stubFetch({
285
+ latestVersion: '99.99.99',
286
+ credits: { remainingCredits: 500, planCredits: 1000 },
287
+ });
288
+ const { checks } = await (0, doctor_1.runChecks)({});
289
+ (0, vitest_1.expect)(JSON.stringify({ checks })).not.toMatch(/\u001b\[/);
290
+ (0, vitest_1.expect)(checkByName(checks, 'CLI Version').message).toContain('(v99.99.99 available)');
291
+ });
292
+ });
293
+ (0, vitest_1.describe)('runSupportAsk', () => {
294
+ const jobId = '123e4567-e89b-12d3-a456-426614174000';
295
+ (0, vitest_1.beforeEach)(() => {
296
+ (0, config_1.resetConfig)();
297
+ mockFetch.mockReset();
298
+ vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { });
299
+ vitest_1.vi.spyOn(console, 'error').mockImplementation(() => { });
300
+ });
301
+ (0, vitest_1.afterEach)(() => {
302
+ vitest_1.vi.restoreAllMocks();
303
+ (0, config_1.resetConfig)();
304
+ });
305
+ (0, vitest_1.it)('posts question and jobId to the support Ask endpoint', async () => {
306
+ (0, config_1.initializeConfig)({
307
+ apiKey: 'fc-test',
308
+ apiUrl: 'https://api.firecrawl.dev',
309
+ });
310
+ mockFetch.mockResolvedValue({
311
+ ok: true,
312
+ status: 200,
313
+ json: async () => ({
314
+ answer: 'Try increasing waitFor.',
315
+ fixParameters: { waitFor: 5000 },
316
+ }),
317
+ });
318
+ const exitCode = await (0, doctor_1.runSupportAsk)({
319
+ jobId,
320
+ query: 'why did this scrape return empty markdown?',
321
+ });
322
+ (0, vitest_1.expect)(exitCode).toBe(0);
323
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledWith('https://api.firecrawl.dev/v2/support/ask', vitest_1.expect.objectContaining({
324
+ method: 'POST',
325
+ headers: vitest_1.expect.objectContaining({
326
+ Authorization: 'Bearer fc-test',
327
+ 'Content-Type': 'application/json',
328
+ }),
329
+ body: JSON.stringify({
330
+ question: 'why did this scrape return empty markdown?',
331
+ jobId,
332
+ }),
333
+ }));
334
+ });
335
+ (0, vitest_1.it)('does not call support Ask without an API key', async () => {
336
+ const exitCode = await (0, doctor_1.runSupportAsk)({ jobId });
337
+ (0, vitest_1.expect)(exitCode).toBe(1);
338
+ (0, vitest_1.expect)(mockFetch).not.toHaveBeenCalled();
339
+ });
340
+ });
341
+ //# sourceMappingURL=doctor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/doctor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Doctor command — diagnostics for the Firecrawl CLI.
3
+ *
4
+ * Two modes:
5
+ * 1. `firecrawl doctor` runs a pass/warn/fail checklist over the local
6
+ * environment (CLI version, auth, credits, MCP install, etc.) and exits
7
+ * non-zero if any check fails. Suitable as a CI / onboarding gate.
8
+ * 2. `firecrawl doctor <job-id>` forwards to `/v2/support/ask` and renders
9
+ * the answer for a specific failed run.
10
+ */
11
+ type CheckStatus = 'pass' | 'warn' | 'fail';
12
+ interface CheckResult {
13
+ name: string;
14
+ status: CheckStatus;
15
+ /** Inline detail shown next to the check name. */
16
+ message: string;
17
+ /** Optional fix command shown beneath a warn/fail. */
18
+ fix?: string;
19
+ }
20
+ export interface DoctorOptions {
21
+ apiKey?: string;
22
+ apiUrl?: string;
23
+ /** Job ID to diagnose via /v2/support/ask. */
24
+ jobId?: string;
25
+ /** Optional override for the support query (mode 2). */
26
+ query?: string;
27
+ json?: boolean;
28
+ }
29
+ /**
30
+ * Run every health check. Exported for tests.
31
+ */
32
+ export declare function runChecks(options?: DoctorOptions): Promise<{
33
+ checks: CheckResult[];
34
+ apiUrl: string;
35
+ }>;
36
+ /**
37
+ * Mode 2: diagnose a specific run via /v2/support/ask.
38
+ */
39
+ export declare function runSupportAsk(options: DoctorOptions): Promise<number>;
40
+ /**
41
+ * Top-level command entrypoint.
42
+ */
43
+ export declare function handleDoctorCommand(options?: DoctorOptions): Promise<void>;
44
+ export {};
45
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAG5C,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAkiBD;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC;IACpE,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAgDD;AAmCD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAyD3E;AAkDD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAkBf"}