firecrawl-cli 1.21.1 → 1.23.0
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/README.md +42 -20
- package/dist/__tests__/cli-argv.test.js +20 -2
- package/dist/__tests__/cli-argv.test.js.map +1 -1
- package/dist/__tests__/commands/developer.test.js +36 -35
- package/dist/__tests__/commands/developer.test.js.map +1 -1
- package/dist/__tests__/commands/init.test.js +11 -8
- package/dist/__tests__/commands/init.test.js.map +1 -1
- package/dist/__tests__/commands/setup.test.js +73 -11
- package/dist/__tests__/commands/setup.test.js.map +1 -1
- package/dist/commands/developer.d.ts.map +1 -1
- package/dist/commands/developer.js +66 -33
- package/dist/commands/developer.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +46 -39
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/setup.d.ts +6 -2
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +103 -12
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skills-install.d.ts +35 -0
- package/dist/commands/skills-install.d.ts.map +1 -1
- package/dist/commands/skills-install.js +77 -1
- package/dist/commands/skills-install.js.map +1 -1
- package/dist/commands/skills-native.d.ts +2 -0
- package/dist/commands/skills-native.d.ts.map +1 -1
- package/dist/commands/skills-native.js +9 -1
- package/dist/commands/skills-native.js.map +1 -1
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/types/developer.d.ts +29 -6
- package/dist/types/developer.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,14 +20,24 @@ npx -y firecrawl-cli@latest init -y --browser
|
|
|
20
20
|
|
|
21
21
|
### Setup Skills, Workflows, and MCP
|
|
22
22
|
|
|
23
|
-
If you are using an AI coding agent like Claude Code, you can also install
|
|
23
|
+
If you are using an AI coding agent like Claude Code, you can also install skill groups manually — one command per family:
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
firecrawl setup skills
|
|
27
|
-
firecrawl setup
|
|
26
|
+
firecrawl setup core # scrape/search/crawl/interact primitives + index skills ("skills" is an alias)
|
|
27
|
+
firecrawl setup build # app-integration skills for the Firecrawl API
|
|
28
|
+
firecrawl setup workflows # end-to-end recipes (lead gen, deep research, ...)
|
|
28
29
|
```
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
Or install a single skill by name — the `firecrawl-` prefix is optional:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
firecrawl setup developer-index
|
|
35
|
+
firecrawl setup seo-audit
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
If no API key is found afterwards, an interactive terminal offers a browser login (pass `--browser` to log in without the prompt); non-interactive runs never block — they print a hint and the skills walk agents through setup on first use.
|
|
39
|
+
|
|
40
|
+
These install globally across all detected coding editors by default. Use `--agent <agent>` to scope any of them to one editor.
|
|
31
41
|
|
|
32
42
|
#### Scope setup to a single harness
|
|
33
43
|
|
|
@@ -62,16 +72,24 @@ detected harnesses (all selected by default) so you can pick a subset.
|
|
|
62
72
|
|
|
63
73
|
### Agent skills
|
|
64
74
|
|
|
65
|
-
The init command installs
|
|
75
|
+
The init command installs the **CLI skills** by default and offers the **workflow skills** as optional extras, into AI coding agents (Cursor, Claude Code, Windsurf, etc.):
|
|
76
|
+
|
|
77
|
+
- **CLI skills** — teach agents how to use the Firecrawl CLI for live web work (search, scrape, interact, map, crawl, agent). Installed by default.
|
|
78
|
+
- **Workflow skills** — teach agents how to produce Firecrawl-powered deliverables such as research briefs, SEO audits, QA reports, lead lists, knowledge bases, and design-system extraction. Interactive multi-select during init.
|
|
66
79
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
80
|
+
All skill families live in the [`firecrawl/skills`](https://github.com/firecrawl/skills) catalog — including the **build skills** for integrating Firecrawl into application code:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npx skills add firecrawl/skills
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> Contributing skills? CLI skills (including the research/developer index skills) → PR this repo (`skills/`). Build/SDK skills → PR the [`firecrawl`](https://github.com/firecrawl/firecrawl) monorepo (`skills/`). Workflow skills → PR [`firecrawl/firecrawl-workflows`](https://github.com/firecrawl/firecrawl-workflows). The catalog ([`firecrawl/skills`](https://github.com/firecrawl/skills)) is read-only — never PR it directly.
|
|
70
87
|
|
|
71
88
|
To reinstall skills manually:
|
|
72
89
|
|
|
73
90
|
```bash
|
|
74
|
-
firecrawl setup
|
|
91
|
+
firecrawl setup core
|
|
92
|
+
firecrawl setup build
|
|
75
93
|
firecrawl setup workflows
|
|
76
94
|
```
|
|
77
95
|
|
|
@@ -362,19 +380,20 @@ firecrawl search "AI startups funding" --sources news --tbs qdr:w --limit 15
|
|
|
362
380
|
|
|
363
381
|
Search an index built for coding agents: GitHub issues, merged pull requests, repository READMEs, and curated documentation sites. Use it for a programming question: code behaviour, a library or framework, an API contract, an error message, or a known bug.
|
|
364
382
|
|
|
383
|
+
The CLI intentionally keeps this agent-facing surface lean: it accepts only the query and result count. Express repository, source, result-kind, language, topic, license, and other scoping intent in the query text; semantic retrieval handles the scoping. For advanced filters, use the [Developer Index REST API](https://docs.firecrawl.dev/features/developer).
|
|
384
|
+
|
|
365
385
|
```bash
|
|
366
386
|
firecrawl developer "axum middleware ordering"
|
|
367
387
|
```
|
|
368
388
|
|
|
369
389
|
#### Options
|
|
370
390
|
|
|
371
|
-
| Option | Description
|
|
372
|
-
| --------------------- |
|
|
373
|
-
| `--limit <n>` | Number of results (default: 10, max: 100)
|
|
374
|
-
|
|
|
375
|
-
|
|
|
376
|
-
| `--
|
|
377
|
-
| `--pretty` | Pretty print JSON output |
|
|
391
|
+
| Option | Description |
|
|
392
|
+
| --------------------- | ---------------------------------------------------------- |
|
|
393
|
+
| `--limit <n>` | Number of results (default: 10, max: 100) |
|
|
394
|
+
| `-o, --output <path>` | Save to file |
|
|
395
|
+
| `--json` | Output full response, including citations and index status |
|
|
396
|
+
| `--pretty` | Pretty print JSON output |
|
|
378
397
|
|
|
379
398
|
#### Examples
|
|
380
399
|
|
|
@@ -382,7 +401,10 @@ firecrawl developer "axum middleware ordering"
|
|
|
382
401
|
# Investigate a known bug
|
|
383
402
|
firecrawl developer "tokio spawn_blocking panics thread limit" --limit 10
|
|
384
403
|
|
|
385
|
-
#
|
|
404
|
+
# Put repository and evidence-kind intent directly in the semantic query
|
|
405
|
+
firecrawl developer "tokio select cancellation safety in tokio-rs/tokio issues and merged pull requests"
|
|
406
|
+
|
|
407
|
+
# Keep the full response, including passages, citations, and licenses
|
|
386
408
|
firecrawl developer "tokio select cancellation safety" --json -o results.json
|
|
387
409
|
```
|
|
388
410
|
|
|
@@ -957,9 +979,9 @@ firecrawl x download https://docs.firecrawl.dev --include-paths "/features,/sdks
|
|
|
957
979
|
|
|
958
980
|
### Workflow Skills
|
|
959
981
|
|
|
960
|
-
The old experimental AI workflow commands have moved to the
|
|
961
|
-
[`firecrawl/
|
|
962
|
-
skills
|
|
982
|
+
The old experimental AI workflow commands have moved to the
|
|
983
|
+
[`firecrawl/skills`](https://github.com/firecrawl/skills) catalog
|
|
984
|
+
(`skills/workflows/`). Workflow skills infer from the user's request first and only ask
|
|
963
985
|
short clarifying questions when required inputs are missing. Install them with:
|
|
964
986
|
|
|
965
987
|
```bash
|
|
@@ -23,8 +23,26 @@ const vitest_1 = require("vitest");
|
|
|
23
23
|
(0, vitest_1.expect)(result.status).toBe(0);
|
|
24
24
|
(0, vitest_1.expect)(result.stdout).toContain('Usage: firecrawl developer');
|
|
25
25
|
(0, vitest_1.expect)(result.stdout).toContain('--limit');
|
|
26
|
-
(
|
|
27
|
-
|
|
26
|
+
for (const removedFilter of [
|
|
27
|
+
'--passages',
|
|
28
|
+
'--types',
|
|
29
|
+
'--repos',
|
|
30
|
+
'--sources',
|
|
31
|
+
'--language',
|
|
32
|
+
'--topic',
|
|
33
|
+
'--license',
|
|
34
|
+
'--min-stars',
|
|
35
|
+
'--max-stars',
|
|
36
|
+
'--archived',
|
|
37
|
+
'--fork',
|
|
38
|
+
'--skills-only',
|
|
39
|
+
'--passage-budget',
|
|
40
|
+
]) {
|
|
41
|
+
(0, vitest_1.expect)(result.stdout).not.toContain(removedFilter);
|
|
42
|
+
}
|
|
43
|
+
(0, vitest_1.expect)(result.stdout).toContain('scoping intent in');
|
|
44
|
+
// Lean surface: the CLI does not point at the REST API for filters.
|
|
45
|
+
(0, vitest_1.expect)(result.stdout).not.toContain('docs.firecrawl.dev');
|
|
28
46
|
(0, vitest_1.expect)(result.stderr).not.toContain('unknown command');
|
|
29
47
|
});
|
|
30
48
|
testWithBuiltCli('lists the research command in root help output', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-argv.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-argv.test.ts"],"names":[],"mappings":";;AAAA,2DAA+C;AAC/C,qCAAqC;AACrC,yCAAoC;AACpC,mCAA8C;AAE9C,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IACxD,MAAM,gBAAgB,GAAG,IAAA,oBAAU,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAE,CAAC,CAAC,CAAC,WAAE,CAAC,IAAI,CAAC;IAE5D,gBAAgB,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,IAAA,8BAAS,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;YAC9D,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,gBAAgB,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,IAAA,8BAAS,EACtB,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,EAChC;YACE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,MAAM;SACjB,CACF,CAAC;QAEF,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QAC9D,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"cli-argv.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-argv.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,23 +20,20 @@ vitest_1.vi.mock('../../utils/client', async () => {
|
|
|
20
20
|
(0, vitest_1.describe)('handleDeveloperSearchCommand', () => {
|
|
21
21
|
let mockHttpGet;
|
|
22
22
|
// Wrap a payload in the axios envelope returned by `client.http.get`.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const mockDeveloperResponse = (results, passageBudgetApplied) => ({
|
|
26
|
-
data: {
|
|
27
|
-
success: true,
|
|
28
|
-
results,
|
|
29
|
-
...(passageBudgetApplied == null
|
|
30
|
-
? {}
|
|
31
|
-
: { passage_budget_applied: passageBudgetApplied }),
|
|
32
|
-
},
|
|
23
|
+
const mockDeveloperResponse = (results, extra = {}) => ({
|
|
24
|
+
data: { success: true, results, ...extra },
|
|
33
25
|
});
|
|
34
26
|
const sampleResult = {
|
|
35
27
|
id: 'issue:tokio-rs/tokio#2309',
|
|
36
|
-
type: 'issue',
|
|
37
28
|
url: 'https://github.com/tokio-rs/tokio/issues/2309',
|
|
38
29
|
title: 'spawn_blocking panics when exceeding the thread limit',
|
|
39
|
-
passages: [
|
|
30
|
+
passages: [
|
|
31
|
+
{
|
|
32
|
+
text: 'It will panic if this limit is too low.',
|
|
33
|
+
citation_url: 'https://github.com/tokio-rs/tokio/issues/2309#issuecomment-1',
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
license: { state: 'licensed', spdx_id: 'MIT' },
|
|
40
37
|
};
|
|
41
38
|
(0, vitest_1.beforeEach)(() => {
|
|
42
39
|
(0, mock_client_1.setupTest)();
|
|
@@ -60,15 +57,7 @@ vitest_1.vi.mock('../../utils/client', async () => {
|
|
|
60
57
|
(0, vitest_1.expect)(mockHttpGet).toHaveBeenCalledTimes(1);
|
|
61
58
|
(0, vitest_1.expect)(mockHttpGet).toHaveBeenCalledWith('/v2/search/developer?query=tokio+spawn_blocking&integration=cli');
|
|
62
59
|
});
|
|
63
|
-
(0, vitest_1.it)('passes
|
|
64
|
-
mockHttpGet.mockResolvedValue(mockDeveloperResponse([sampleResult]));
|
|
65
|
-
await (0, developer_1.handleDeveloperSearchCommand)({
|
|
66
|
-
query: 'tokio spawn_blocking',
|
|
67
|
-
skillsOnly: true,
|
|
68
|
-
});
|
|
69
|
-
(0, vitest_1.expect)(mockHttpGet).toHaveBeenCalledWith('/v2/search/developer?query=tokio+spawn_blocking&skills=only&integration=cli');
|
|
70
|
-
});
|
|
71
|
-
(0, vitest_1.it)('passes k when a limit is provided', async () => {
|
|
60
|
+
(0, vitest_1.it)('passes k when a result count is provided', async () => {
|
|
72
61
|
mockHttpGet.mockResolvedValue(mockDeveloperResponse([sampleResult]));
|
|
73
62
|
await (0, developer_1.handleDeveloperSearchCommand)({
|
|
74
63
|
query: 'tokio spawn_blocking',
|
|
@@ -98,25 +87,31 @@ vitest_1.vi.mock('../../utils/client', async () => {
|
|
|
98
87
|
(0, vitest_1.expect)(content).toContain('https://github.com/tokio-rs/tokio/issues/2309');
|
|
99
88
|
(0, vitest_1.expect)(content).toContain('It will panic if this limit is too low.');
|
|
100
89
|
});
|
|
101
|
-
(0, vitest_1.it)('
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
90
|
+
(0, vitest_1.it)('renders full passages, citations, licenses, and indexing echoes', async () => {
|
|
91
|
+
const passage = 'x'.repeat(5000);
|
|
92
|
+
mockHttpGet.mockResolvedValue(mockDeveloperResponse([{ ...sampleResult, passages: [{ text: passage }], license: 'MIT' }], {
|
|
93
|
+
repos: [
|
|
94
|
+
{
|
|
95
|
+
repo: 'tokio-rs/tokio',
|
|
96
|
+
indexed: true,
|
|
97
|
+
types: { issue: true, pullRequest: true, readme: false },
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
sources: [{ source: 'rust', indexed: false }],
|
|
101
|
+
}));
|
|
108
102
|
await (0, developer_1.handleDeveloperSearchCommand)({ query: 'tokio spawn_blocking' });
|
|
109
103
|
const [content] = vitest_1.vi.mocked(output_1.writeOutput).mock.calls[0];
|
|
110
|
-
(0, vitest_1.expect)(content).toContain(
|
|
111
|
-
|
|
112
|
-
(0, vitest_1.expect)(
|
|
104
|
+
(0, vitest_1.expect)(content).toContain(passage);
|
|
105
|
+
(0, vitest_1.expect)(content).toContain('License: MIT');
|
|
106
|
+
(0, vitest_1.expect)(content).toContain('tokio-rs/tokio: indexed');
|
|
107
|
+
(0, vitest_1.expect)(content).toContain('rust: not indexed');
|
|
113
108
|
});
|
|
114
|
-
(0, vitest_1.it)('
|
|
115
|
-
|
|
116
|
-
mockHttpGet.mockResolvedValue(mockDeveloperResponse([{ ...sampleResult, passages: [{ text: passage }] }], 4096));
|
|
109
|
+
(0, vitest_1.it)('renders citation URLs and object license disclosures', async () => {
|
|
110
|
+
mockHttpGet.mockResolvedValue(mockDeveloperResponse([sampleResult]));
|
|
117
111
|
await (0, developer_1.handleDeveloperSearchCommand)({ query: 'tokio spawn_blocking' });
|
|
118
112
|
const [content] = vitest_1.vi.mocked(output_1.writeOutput).mock.calls[0];
|
|
119
|
-
(0, vitest_1.expect)(content).toContain(
|
|
113
|
+
(0, vitest_1.expect)(content).toContain('License: MIT');
|
|
114
|
+
(0, vitest_1.expect)(content).toContain('Citation: https://github.com/tokio-rs/tokio/issues/2309#issuecomment-1');
|
|
120
115
|
});
|
|
121
116
|
(0, vitest_1.it)('prints a placeholder when there are no results', async () => {
|
|
122
117
|
mockHttpGet.mockResolvedValue(mockDeveloperResponse([]));
|
|
@@ -124,6 +119,12 @@ vitest_1.vi.mock('../../utils/client', async () => {
|
|
|
124
119
|
const [content] = vitest_1.vi.mocked(output_1.writeOutput).mock.calls[0];
|
|
125
120
|
(0, vitest_1.expect)(content).toBe('(no results)');
|
|
126
121
|
});
|
|
122
|
+
(0, vitest_1.it)('tolerates a success response that omits results', async () => {
|
|
123
|
+
mockHttpGet.mockResolvedValue({ data: { success: true } });
|
|
124
|
+
await (0, developer_1.handleDeveloperSearchCommand)({ query: 'no result field' });
|
|
125
|
+
const [content] = vitest_1.vi.mocked(output_1.writeOutput).mock.calls[0];
|
|
126
|
+
(0, vitest_1.expect)(content).toBe('(no results)');
|
|
127
|
+
});
|
|
127
128
|
(0, vitest_1.it)('outputs the full envelope as JSON with --json', async () => {
|
|
128
129
|
mockHttpGet.mockResolvedValue(mockDeveloperResponse([sampleResult]));
|
|
129
130
|
await (0, developer_1.handleDeveloperSearchCommand)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"developer.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/developer.test.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,mCAAyE;AACzE,wDAAwE;AACxE,+CAA+C;AAC/C,+CAAsD;AACtD,+CAAiD;AACjD,sDAA+D;AAE/D,WAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAEhE,WAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;IACvC,MAAM,MAAM,GAAG,MAAM,WAAE,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;IAC3D,OAAO;QACL,GAAG,MAAM;QACT,SAAS,EAAE,WAAE,CAAC,EAAE,EAAE;KACnB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAI,WAAqC,CAAC;IAE1C,sEAAsE;IACtE,
|
|
1
|
+
{"version":3,"file":"developer.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/developer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const vitest_1 = require("vitest");
|
|
4
4
|
const child_process_1 = require("child_process");
|
|
5
5
|
const init_1 = require("../../commands/init");
|
|
6
|
+
const skills_install_1 = require("../../commands/skills-install");
|
|
7
|
+
const cliSkillFlags = `--skill ${skills_install_1.CLI_SKILLS.join(' ')}`;
|
|
8
|
+
const workflowSkillFlags = `--skill ${skills_install_1.WORKFLOW_SKILLS.join(' ')}`;
|
|
6
9
|
const { installMcpMock, getApiKeyMock, confirmMock, checkboxMock } = vitest_1.vi.hoisted(() => ({
|
|
7
10
|
installMcpMock: vitest_1.vi.fn(),
|
|
8
11
|
getApiKeyMock: vitest_1.vi.fn(),
|
|
@@ -34,26 +37,26 @@ vitest_1.vi.mock('@inquirer/prompts', () => ({
|
|
|
34
37
|
(0, vitest_1.afterEach)(() => {
|
|
35
38
|
vitest_1.vi.restoreAllMocks();
|
|
36
39
|
});
|
|
37
|
-
(0, vitest_1.it)('installs skills from
|
|
40
|
+
(0, vitest_1.it)('installs CLI and workflow skills from the catalog globally across all detected agents in non-interactive mode', async () => {
|
|
38
41
|
await (0, init_1.handleInitCommand)({
|
|
39
42
|
yes: true,
|
|
40
43
|
skipInstall: true,
|
|
41
44
|
skipAuth: true,
|
|
42
45
|
});
|
|
43
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(
|
|
44
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(
|
|
45
|
-
|
|
46
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --all --yes ${cliSkillFlags}`, vitest_1.expect.objectContaining({ stdio: ['ignore', 'pipe', 'pipe'] }));
|
|
47
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --all --yes ${workflowSkillFlags}`, vitest_1.expect.objectContaining({ stdio: ['ignore', 'pipe', 'pipe'] }));
|
|
48
|
+
// Build skills are intentionally no longer installed by init.
|
|
49
|
+
(0, vitest_1.expect)(child_process_1.execSync).not.toHaveBeenCalledWith(vitest_1.expect.stringContaining('firecrawl-build'), vitest_1.expect.anything());
|
|
46
50
|
});
|
|
47
|
-
(0, vitest_1.it)('scopes non-interactive skills install to one agent
|
|
51
|
+
(0, vitest_1.it)('scopes non-interactive skills install to one agent when provided', async () => {
|
|
48
52
|
await (0, init_1.handleInitCommand)({
|
|
49
53
|
yes: true,
|
|
50
54
|
skipInstall: true,
|
|
51
55
|
skipAuth: true,
|
|
52
56
|
agent: 'cursor',
|
|
53
57
|
});
|
|
54
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(
|
|
55
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(
|
|
56
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith('npx -y skills add firecrawl/firecrawl-workflows --full-depth --global --yes --agent cursor', vitest_1.expect.objectContaining({ stdio: ['ignore', 'pipe', 'pipe'] }));
|
|
58
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --yes --agent cursor ${cliSkillFlags}`, vitest_1.expect.objectContaining({ stdio: ['ignore', 'pipe', 'pipe'] }));
|
|
59
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --yes --agent cursor ${workflowSkillFlags}`, vitest_1.expect.objectContaining({ stdio: ['ignore', 'pipe', 'pipe'] }));
|
|
57
60
|
});
|
|
58
61
|
(0, vitest_1.it)('routes interactive MCP setup through the hardened hosted installer', async () => {
|
|
59
62
|
getApiKeyMock.mockReturnValue('fc-stored-key');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/init.test.ts"],"names":[],"mappings":";;AAAA,mCAAyE;AACzE,iDAAyC;AACzC,8CAAwD;
|
|
1
|
+
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/init.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,13 @@ const os_1 = __importDefault(require("os"));
|
|
|
10
10
|
const path_1 = __importDefault(require("path"));
|
|
11
11
|
const setup_1 = require("../../commands/setup");
|
|
12
12
|
const skills_install_1 = require("../../commands/skills-install");
|
|
13
|
+
const cliSkillFlags = `--skill ${skills_install_1.CLI_SKILLS.join(' ')}`;
|
|
14
|
+
const buildSkillFlags = `--skill ${skills_install_1.BUILD_SKILLS.join(' ')}`;
|
|
15
|
+
const workflowSkillFlags = `--skill ${skills_install_1.WORKFLOW_SKILLS.join(' ')}`;
|
|
13
16
|
const web_defaults_1 = require("../../utils/web-defaults");
|
|
14
17
|
const config_1 = require("../../utils/config");
|
|
18
|
+
const auth_1 = require("../../utils/auth");
|
|
19
|
+
const credentials_1 = require("../../utils/credentials");
|
|
15
20
|
vitest_1.vi.mock('child_process', () => ({
|
|
16
21
|
execFileSync: vitest_1.vi.fn(),
|
|
17
22
|
execSync: vitest_1.vi.fn(),
|
|
@@ -21,6 +26,17 @@ vitest_1.vi.mock('../../utils/web-defaults', () => ({
|
|
|
21
26
|
}));
|
|
22
27
|
vitest_1.vi.mock('../../utils/config', () => ({
|
|
23
28
|
getApiKey: vitest_1.vi.fn(() => 'fc-test-key'),
|
|
29
|
+
updateConfig: vitest_1.vi.fn(),
|
|
30
|
+
}));
|
|
31
|
+
vitest_1.vi.mock('../../utils/auth', () => ({
|
|
32
|
+
isAuthenticated: vitest_1.vi.fn(() => true),
|
|
33
|
+
browserLogin: vitest_1.vi.fn(async () => ({
|
|
34
|
+
apiKey: 'fc-browser-key',
|
|
35
|
+
apiUrl: 'https://api.firecrawl.dev',
|
|
36
|
+
})),
|
|
37
|
+
}));
|
|
38
|
+
vitest_1.vi.mock('../../utils/credentials', () => ({
|
|
39
|
+
saveCredentials: vitest_1.vi.fn(),
|
|
24
40
|
}));
|
|
25
41
|
(0, vitest_1.describe)('handleSetupCommand', () => {
|
|
26
42
|
let originalHome;
|
|
@@ -28,6 +44,11 @@ vitest_1.vi.mock('../../utils/config', () => ({
|
|
|
28
44
|
(0, vitest_1.beforeEach)(() => {
|
|
29
45
|
vitest_1.vi.clearAllMocks();
|
|
30
46
|
vitest_1.vi.mocked(config_1.getApiKey).mockReturnValue('fc-test-key');
|
|
47
|
+
vitest_1.vi.mocked(auth_1.isAuthenticated).mockReturnValue(true);
|
|
48
|
+
vitest_1.vi.mocked(auth_1.browserLogin).mockResolvedValue({
|
|
49
|
+
apiKey: 'fc-browser-key',
|
|
50
|
+
apiUrl: 'https://api.firecrawl.dev',
|
|
51
|
+
});
|
|
31
52
|
originalHome = process.env.HOME;
|
|
32
53
|
originalApiKey = process.env.FIRECRAWL_API_KEY;
|
|
33
54
|
delete process.env.FIRECRAWL_API_KEY;
|
|
@@ -43,19 +64,61 @@ vitest_1.vi.mock('../../utils/config', () => ({
|
|
|
43
64
|
process.env.FIRECRAWL_API_KEY = originalApiKey;
|
|
44
65
|
vitest_1.vi.restoreAllMocks();
|
|
45
66
|
});
|
|
46
|
-
(0, vitest_1.it)('installs
|
|
67
|
+
(0, vitest_1.it)('installs the CLI skills from the catalog globally across all detected agents by default', async () => {
|
|
47
68
|
await (0, setup_1.handleSetupCommand)('skills', {});
|
|
48
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(
|
|
49
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith('npx -y skills add firecrawl/skills --full-depth --global --all', vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
69
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --all ${cliSkillFlags}`, vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
50
70
|
});
|
|
51
|
-
(0, vitest_1.it)('installs
|
|
71
|
+
(0, vitest_1.it)('installs the CLI skills globally for a specific agent without using --all', async () => {
|
|
52
72
|
await (0, setup_1.handleSetupCommand)('skills', { agent: 'cursor' });
|
|
53
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(
|
|
54
|
-
|
|
73
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --agent cursor ${cliSkillFlags}`, vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.it)('treats "core" as the canonical name for the CLI skill set', async () => {
|
|
76
|
+
await (0, setup_1.handleSetupCommand)('core', {});
|
|
77
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --all ${cliSkillFlags}`, vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.it)('installs the build skills from the catalog as their own group', async () => {
|
|
80
|
+
await (0, setup_1.handleSetupCommand)('build', {});
|
|
81
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --all ${buildSkillFlags}`, vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
82
|
+
});
|
|
83
|
+
(0, vitest_1.it)('does not offer auth when already authenticated', async () => {
|
|
84
|
+
await (0, setup_1.handleSetupCommand)('core', {});
|
|
85
|
+
(0, vitest_1.expect)(auth_1.browserLogin).not.toHaveBeenCalled();
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)('prints a hint instead of logging in when unauthenticated and non-interactive', async () => {
|
|
88
|
+
vitest_1.vi.mocked(auth_1.isAuthenticated).mockReturnValue(false);
|
|
89
|
+
const log = vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
90
|
+
await (0, setup_1.handleSetupCommand)('core', { yes: true });
|
|
91
|
+
(0, vitest_1.expect)(auth_1.browserLogin).not.toHaveBeenCalled();
|
|
92
|
+
(0, vitest_1.expect)(log.mock.calls.flat().join('\n')).toContain('No Firecrawl API key found');
|
|
93
|
+
});
|
|
94
|
+
(0, vitest_1.it)('runs the browser login and persists credentials with --browser when unauthenticated', async () => {
|
|
95
|
+
vitest_1.vi.mocked(auth_1.isAuthenticated).mockReturnValue(false);
|
|
96
|
+
vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
97
|
+
await (0, setup_1.handleSetupCommand)('core', { yes: true, browser: true });
|
|
98
|
+
(0, vitest_1.expect)(auth_1.browserLogin).toHaveBeenCalled();
|
|
99
|
+
(0, vitest_1.expect)(credentials_1.saveCredentials).toHaveBeenCalledWith({
|
|
100
|
+
apiKey: 'fc-browser-key',
|
|
101
|
+
apiUrl: 'https://api.firecrawl.dev',
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
(0, vitest_1.it)('installs a single catalog skill by exact name', async () => {
|
|
105
|
+
await (0, setup_1.handleSetupCommand)('firecrawl-developer-index', {});
|
|
106
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith('npx -y skills add firecrawl/skills --full-depth --global --all --skill firecrawl-developer-index', vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.it)('resolves bare skill names by adding the firecrawl- prefix', async () => {
|
|
109
|
+
await (0, setup_1.handleSetupCommand)('developer-index', {});
|
|
110
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith('npx -y skills add firecrawl/skills --full-depth --global --all --skill firecrawl-developer-index', vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.it)('prefers the build group over the firecrawl-build skill for bare "build"', async () => {
|
|
113
|
+
await (0, setup_1.handleSetupCommand)('build', {});
|
|
114
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --all ${buildSkillFlags}`, vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
115
|
+
vitest_1.vi.mocked(child_process_1.execSync).mockClear();
|
|
116
|
+
await (0, setup_1.handleSetupCommand)('firecrawl-build', {});
|
|
117
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith('npx -y skills add firecrawl/skills --full-depth --global --all --skill firecrawl-build', vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
55
118
|
});
|
|
56
|
-
(0, vitest_1.it)('installs workflow skills as a separate setup option', async () => {
|
|
119
|
+
(0, vitest_1.it)('installs workflow skills from the catalog as a separate setup option', async () => {
|
|
57
120
|
await (0, setup_1.handleSetupCommand)('workflows', {});
|
|
58
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(
|
|
121
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --all ${workflowSkillFlags}`, vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
59
122
|
});
|
|
60
123
|
(0, vitest_1.it)('installs all skill repos for Codex non-interactively', async () => {
|
|
61
124
|
await (0, setup_1.installSkillsForAgent)('codex', { global: true, yes: true }, skills_install_1.ALL_SKILL_REPOS);
|
|
@@ -73,8 +136,7 @@ vitest_1.vi.mock('../../utils/config', () => ({
|
|
|
73
136
|
(0, vitest_1.it)('installs the default setup bundle with --yes', async () => {
|
|
74
137
|
vitest_1.vi.mocked(config_1.getApiKey).mockReturnValue(undefined);
|
|
75
138
|
await (0, setup_1.handleSetupCommand)(undefined, { yes: true });
|
|
76
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(
|
|
77
|
-
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith('npx -y skills add firecrawl/skills --full-depth --global --all --yes', vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
139
|
+
(0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith(`npx -y skills add firecrawl/skills --full-depth --global --all --yes ${cliSkillFlags}`, vitest_1.expect.objectContaining({ stdio: 'inherit' }));
|
|
78
140
|
(0, vitest_1.expect)(child_process_1.execFileSync).toHaveBeenCalledWith('npx', [
|
|
79
141
|
'-y',
|
|
80
142
|
'add-mcp@1.14.0',
|
|
@@ -641,7 +703,7 @@ vitest_1.vi.mock('../../utils/config', () => ({
|
|
|
641
703
|
await (0, setup_1.handleSetupCommand)('skills', {});
|
|
642
704
|
const allCalls = child_process_1.execSync.mock.calls;
|
|
643
705
|
const installCalls = allCalls.filter(([cmd]) => cmd.includes('skills add'));
|
|
644
|
-
(0, vitest_1.expect)(installCalls.length).toBe(
|
|
706
|
+
(0, vitest_1.expect)(installCalls.length).toBe(1);
|
|
645
707
|
for (const [, opts] of installCalls) {
|
|
646
708
|
(0, vitest_1.expect)(opts.env).toBeDefined();
|
|
647
709
|
(0, vitest_1.expect)(opts.env.npm_command).toBeUndefined();
|