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 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 the skills manually:
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 workflows
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
- These install globally across all detected coding editors by default. Use `--agent <agent>` to scope either command to one editor.
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 all Firecrawl agent skill segments into AI coding agents (Cursor, Claude Code, Windsurf, etc.):
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
- - **CLI skills** — teach agents how to use the Firecrawl CLI for live web work (search, scrape, interact, map, crawl, agent)
68
- - **Build skills** — teach agents how to integrate Firecrawl into application code (choose endpoints, wire SDKs, set up API keys)
69
- - **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
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 skills
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
- | `--skills-only` | Search only agent-skill files |
375
- | `-o, --output <path>` | Save to file |
376
- | `--json` | Output as compact JSON |
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
- # Keep the full passages for an agent
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 NPX-installable
961
- [`firecrawl/firecrawl-workflows`](https://github.com/firecrawl/firecrawl-workflows)
962
- skills package. Workflow skills infer from the user's request first and only ask
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
- (0, vitest_1.expect)(result.stdout).toContain('--skills-only');
27
- (0, vitest_1.expect)(result.stdout).not.toContain('--passage-budget');
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":"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"}
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,KAAK,MAAM,aAAa,IAAI;YAC1B,YAAY;YACZ,SAAS;YACT,SAAS;YACT,WAAW;YACX,YAAY;YACZ,SAAS;YACT,WAAW;YACX,aAAa;YACb,aAAa;YACb,YAAY;YACZ,QAAQ;YACR,eAAe;YACf,kBAAkB;SACnB,EAAE,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;QACD,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACrD,oEAAoE;QACpE,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC1D,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,gBAAgB,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtE,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,iBAAiB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,gBAAgB,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAG,IAAA,8BAAS,EACtB,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAC/B;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,2BAA2B,CAAC,CAAC;QAC7D,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,gBAAgB,CACd,iEAAiE,EACjE,GAAG,EAAE;QACH,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,iBAAiB,CAAC,CAAC;QACjD,wEAAwE;QACxE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACrD,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC,CACF,CAAC;IAEF,gBAAgB,CACd,qDAAqD,EACrD,GAAG,EAAE;QACH,MAAM,KAAK,GAAG,IAAA,8BAAS,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;YACtE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,8BAAS,EACtB,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAC7B;YACE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,MAAM;SACjB,CACF,CAAC;QAEF,IAAA,eAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAA,eAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC,CACF,CAAC;IAEF,gBAAgB,CACd,wEAAwE,EACxE,GAAG,EAAE;QACH,MAAM,MAAM,GAAG;oCACe,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;OAEpD,CAAC;QAEF,MAAM,MAAM,GAAG,IAAA,8BAAS,EACtB,OAAO,CAAC,QAAQ,EAChB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACjC;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,wBAAwB,CAAC,CAAC;QAC1D,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACzD,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -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
- // Mirrors the `/v2/search/developer` response shape:
24
- // { success, results: [{ id, type, url, title, passages: [{ text }] }] }
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: [{ text: 'It will panic if this limit is too low.' }],
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 skills=only when skillsOnly is set', async () => {
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)('keeps the legacy local cut when the server omits budget metadata', async () => {
102
- mockHttpGet.mockResolvedValue(mockDeveloperResponse([
103
- {
104
- ...sampleResult,
105
- passages: [{ text: 'first passage' }, { text: 'x'.repeat(5000) }],
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('first passage\n---\nx');
111
- const body = content.split('\n').slice(2).join('\n');
112
- (0, vitest_1.expect)(body.length).toBeLessThanOrEqual(1200);
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)('does not cut content after the server applies the passage budget', async () => {
115
- const passage = 'x'.repeat(5000);
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(passage);
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":"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"}
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 all repos globally across all detected agents in non-interactive mode', async () => {
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('npx -y skills add firecrawl/cli --full-depth --global --all --yes', vitest_1.expect.objectContaining({ stdio: ['ignore', 'pipe', 'pipe'] }));
44
- (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: ['ignore', 'pipe', 'pipe'] }));
45
- (0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith('npx -y skills add firecrawl/firecrawl-workflows --full-depth --global --all --yes', vitest_1.expect.objectContaining({ stdio: ['ignore', 'pipe', 'pipe'] }));
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 across all repos when provided', async () => {
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('npx -y skills add firecrawl/cli --full-depth --global --yes --agent cursor', vitest_1.expect.objectContaining({ stdio: ['ignore', 'pipe', 'pipe'] }));
55
- (0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith('npx -y skills add firecrawl/skills --full-depth --global --yes --agent cursor', vitest_1.expect.objectContaining({ stdio: ['ignore', 'pipe', 'pipe'] }));
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":"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"}
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 core and build skills globally across all detected agents by default', async () => {
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('npx -y skills add firecrawl/cli --full-depth --global --all', vitest_1.expect.objectContaining({ stdio: 'inherit' }));
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 core and build skills globally for a specific agent without using --all', async () => {
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('npx -y skills add firecrawl/cli --full-depth --global --agent cursor', vitest_1.expect.objectContaining({ stdio: 'inherit' }));
54
- (0, vitest_1.expect)(child_process_1.execSync).toHaveBeenCalledWith('npx -y skills add firecrawl/skills --full-depth --global --agent cursor', vitest_1.expect.objectContaining({ stdio: 'inherit' }));
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('npx -y skills add firecrawl/firecrawl-workflows --full-depth --global --all', vitest_1.expect.objectContaining({ stdio: 'inherit' }));
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('npx -y skills add firecrawl/cli --full-depth --global --all --yes', vitest_1.expect.objectContaining({ stdio: 'inherit' }));
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(2);
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();