firecrawl-cli 1.9.4 → 1.9.6
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 +129 -0
- package/dist/commands/browser.d.ts.map +1 -1
- package/dist/commands/browser.js +3 -2
- package/dist/commands/browser.js.map +1 -1
- package/dist/commands/experimental/backends.d.ts +19 -0
- package/dist/commands/experimental/backends.d.ts.map +1 -0
- package/dist/commands/experimental/backends.js +74 -0
- package/dist/commands/experimental/backends.js.map +1 -0
- package/dist/commands/experimental/index.d.ts +13 -0
- package/dist/commands/experimental/index.d.ts.map +1 -0
- package/dist/commands/experimental/index.js +227 -0
- package/dist/commands/experimental/index.js.map +1 -0
- package/dist/commands/experimental/shared.d.ts +17 -0
- package/dist/commands/experimental/shared.d.ts.map +1 -0
- package/dist/commands/experimental/shared.js +154 -0
- package/dist/commands/experimental/shared.js.map +1 -0
- package/dist/commands/experimental/workflows/competitor-analysis.d.ts +10 -0
- package/dist/commands/experimental/workflows/competitor-analysis.d.ts.map +1 -0
- package/dist/commands/experimental/workflows/competitor-analysis.js +196 -0
- package/dist/commands/experimental/workflows/competitor-analysis.js.map +1 -0
- package/dist/commands/experimental/workflows/deep-research.d.ts +11 -0
- package/dist/commands/experimental/workflows/deep-research.d.ts.map +1 -0
- package/dist/commands/experimental/workflows/deep-research.js +159 -0
- package/dist/commands/experimental/workflows/deep-research.js.map +1 -0
- package/dist/commands/experimental/workflows/demo.d.ts +11 -0
- package/dist/commands/experimental/workflows/demo.d.ts.map +1 -0
- package/dist/commands/experimental/workflows/demo.js +190 -0
- package/dist/commands/experimental/workflows/demo.js.map +1 -0
- package/dist/commands/experimental/workflows/knowledge-base.d.ts +11 -0
- package/dist/commands/experimental/workflows/knowledge-base.d.ts.map +1 -0
- package/dist/commands/experimental/workflows/knowledge-base.js +319 -0
- package/dist/commands/experimental/workflows/knowledge-base.js.map +1 -0
- package/dist/commands/experimental/workflows/lead-research.d.ts +11 -0
- package/dist/commands/experimental/workflows/lead-research.d.ts.map +1 -0
- package/dist/commands/experimental/workflows/lead-research.js +146 -0
- package/dist/commands/experimental/workflows/lead-research.js.map +1 -0
- package/dist/commands/experimental/workflows/qa.d.ts +11 -0
- package/dist/commands/experimental/workflows/qa.d.ts.map +1 -0
- package/dist/commands/experimental/workflows/qa.js +184 -0
- package/dist/commands/experimental/workflows/qa.js.map +1 -0
- package/dist/commands/experimental/workflows/research-papers.d.ts +11 -0
- package/dist/commands/experimental/workflows/research-papers.d.ts.map +1 -0
- package/dist/commands/experimental/workflows/research-papers.js +151 -0
- package/dist/commands/experimental/workflows/research-papers.js.map +1 -0
- package/dist/commands/experimental/workflows/seo-audit.d.ts +11 -0
- package/dist/commands/experimental/workflows/seo-audit.d.ts.map +1 -0
- package/dist/commands/experimental/workflows/seo-audit.js +155 -0
- package/dist/commands/experimental/workflows/seo-audit.js.map +1 -0
- package/dist/commands/experimental/workflows/shop.d.ts +11 -0
- package/dist/commands/experimental/workflows/shop.d.ts.map +1 -0
- package/dist/commands/experimental/workflows/shop.js +155 -0
- package/dist/commands/experimental/workflows/shop.js.map +1 -0
- package/dist/commands/init.d.ts +11 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +474 -36
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +18 -0
- package/dist/commands/login.js.map +1 -1
- package/dist/index.js +17 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workflow: SEO Audit
|
|
4
|
+
*
|
|
5
|
+
* Maps the site, then spawns parallel agents for site structure, on-page SEO,
|
|
6
|
+
* and keyword/competitor analysis. Produces a prioritized audit with specific
|
|
7
|
+
* (not generic) recommendations.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.register = register;
|
|
44
|
+
const backends_1 = require("../backends");
|
|
45
|
+
const shared_1 = require("../shared");
|
|
46
|
+
// ─── Input gathering ────────────────────────────────────────────────────────
|
|
47
|
+
async function gatherInputs(prefill) {
|
|
48
|
+
const { input, select } = await Promise.resolve().then(() => __importStar(require('@inquirer/prompts')));
|
|
49
|
+
const rawUrl = prefill?.url ||
|
|
50
|
+
(await input({
|
|
51
|
+
message: 'What site do you want to audit?',
|
|
52
|
+
validate: shared_1.validateUrl,
|
|
53
|
+
}));
|
|
54
|
+
const keywords = await input({
|
|
55
|
+
message: 'Target keywords? (comma-separated, leave blank to auto-detect)',
|
|
56
|
+
default: '',
|
|
57
|
+
});
|
|
58
|
+
const output = await select({
|
|
59
|
+
message: 'How should the audit be delivered?',
|
|
60
|
+
choices: [
|
|
61
|
+
{ name: 'Print to terminal', value: 'terminal' },
|
|
62
|
+
{ name: 'Save as Markdown file', value: 'markdown' },
|
|
63
|
+
],
|
|
64
|
+
});
|
|
65
|
+
return { url: (0, shared_1.normalizeUrl)(rawUrl), keywords, output };
|
|
66
|
+
}
|
|
67
|
+
// ─── System prompt ──────────────────────────────────────────────────────────
|
|
68
|
+
function buildSystemPrompt(opts) {
|
|
69
|
+
const outputInstructions = opts.output === 'markdown'
|
|
70
|
+
? 'Save the audit to a file called `seo-audit.md` in the current directory. Tell the user the file path when done.'
|
|
71
|
+
: 'Print the full audit to the terminal in well-formatted markdown.';
|
|
72
|
+
return `You are an SEO audit team lead powered by Firecrawl. You orchestrate parallel agents to thoroughly audit a website's search engine optimization.
|
|
73
|
+
|
|
74
|
+
${shared_1.FIRECRAWL_TOOLS_BLOCK}
|
|
75
|
+
|
|
76
|
+
## Your Strategy
|
|
77
|
+
|
|
78
|
+
You are a **team lead**, not a solo auditor. Your job is to:
|
|
79
|
+
|
|
80
|
+
1. **Map the site first** -- Run \`firecrawl map\` yourself to discover all pages and understand the site structure.
|
|
81
|
+
2. **Spawn parallel subagents** -- Launch agents to audit different aspects simultaneously.
|
|
82
|
+
3. **Collect results** -- Each agent reports back findings.
|
|
83
|
+
4. **Synthesize** -- Build the prioritized audit with specific recommendations.
|
|
84
|
+
|
|
85
|
+
## Agent Assignments
|
|
86
|
+
|
|
87
|
+
Spawn these agents in parallel:
|
|
88
|
+
1. **Site Structure Agent** -- Analyze URL structure, check sitemap.xml, evaluate internal linking patterns. Use the sitemap from the map step. Check for orphan pages, redirect chains, broken internal links.
|
|
89
|
+
2. **On-Page SEO Agent** -- Scrape key pages (homepage, top product/service pages, blog, about). For each page: check title tag, meta description, heading hierarchy (H1/H2/H3), content length, image alt tags, schema markup.
|
|
90
|
+
3. **Keyword & Competitor Agent** -- Search for the site's target keywords. Find who's ranking above them. Scrape top competitors' pages and compare their on-page SEO tactics (titles, headings, content structure, meta).
|
|
91
|
+
|
|
92
|
+
${shared_1.SUBAGENT_INSTRUCTIONS}
|
|
93
|
+
|
|
94
|
+
## Output Format
|
|
95
|
+
|
|
96
|
+
${outputInstructions}
|
|
97
|
+
|
|
98
|
+
Structure the audit as:
|
|
99
|
+
|
|
100
|
+
### Site Structure
|
|
101
|
+
- Total pages found
|
|
102
|
+
- URL structure quality
|
|
103
|
+
- Sitemap health
|
|
104
|
+
|
|
105
|
+
### On-Page SEO
|
|
106
|
+
For each key page:
|
|
107
|
+
- Title tag, meta description
|
|
108
|
+
- Heading hierarchy (H1, H2, etc.)
|
|
109
|
+
- Content length and quality
|
|
110
|
+
- Internal linking
|
|
111
|
+
|
|
112
|
+
### Keyword Analysis
|
|
113
|
+
- Current keyword targeting
|
|
114
|
+
- Missing keyword opportunities
|
|
115
|
+
- Competitor keyword comparison
|
|
116
|
+
|
|
117
|
+
### Technical Issues
|
|
118
|
+
- Broken links, redirects
|
|
119
|
+
- Missing meta tags
|
|
120
|
+
- Duplicate content concerns
|
|
121
|
+
|
|
122
|
+
### Competitor Comparison
|
|
123
|
+
Who's outranking them and why.
|
|
124
|
+
|
|
125
|
+
### Recommendations
|
|
126
|
+
Prioritized list of fixes (high/medium/low impact).
|
|
127
|
+
|
|
128
|
+
### Sources
|
|
129
|
+
Every URL scraped.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
Be specific with recommendations. Don't just say "improve meta descriptions" -- say exactly what to change.
|
|
134
|
+
|
|
135
|
+
Start working immediately.`;
|
|
136
|
+
}
|
|
137
|
+
// ─── Command registration ───────────────────────────────────────────────────
|
|
138
|
+
function register(parentCmd, backend) {
|
|
139
|
+
const config = backends_1.BACKENDS[backend];
|
|
140
|
+
parentCmd
|
|
141
|
+
.command('seo-audit')
|
|
142
|
+
.description('Run an SEO audit on a website')
|
|
143
|
+
.argument('[url]', 'URL to audit')
|
|
144
|
+
.option('-y, --yes', 'Auto-approve all tool permissions')
|
|
145
|
+
.action(async (url, options) => {
|
|
146
|
+
const inputs = await gatherInputs(url ? { url } : undefined);
|
|
147
|
+
const skipPermissions = options.yes || (await (0, shared_1.askPermissionMode)(backend));
|
|
148
|
+
console.log(`\nLaunching ${config.displayName}...\n`);
|
|
149
|
+
(0, backends_1.launchAgent)(backend, buildSystemPrompt({ output: inputs.output }), (0, shared_1.buildMessage)([
|
|
150
|
+
`Audit ${inputs.url}`,
|
|
151
|
+
inputs.keywords && `Target keywords: ${inputs.keywords}`,
|
|
152
|
+
]), skipPermissions);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=seo-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-audit.js","sourceRoot":"","sources":["../../../../src/commands/experimental/workflows/seo-audit.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6HH,4BAwBC;AAlJD,0CAAkE;AAClE,sCAOmB;AAUnB,+EAA+E;AAE/E,KAAK,UAAU,YAAY,CAAC,OAA0B;IACpD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;IAE5D,MAAM,MAAM,GACV,OAAO,EAAE,GAAG;QACZ,CAAC,MAAM,KAAK,CAAC;YACX,OAAO,EAAE,iCAAiC;YAC1C,QAAQ,EAAE,oBAAW;SACtB,CAAC,CAAC,CAAC;IAEN,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC;QAC3B,OAAO,EAAE,gEAAgE;QACzE,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO,EAAE,oCAAoC;QAC7C,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE;YAChD,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,UAAU,EAAE;SACrD;KACF,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,EAAE,IAAA,qBAAY,EAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACzD,CAAC;AAED,+EAA+E;AAE/E,SAAS,iBAAiB,CAAC,IAAwB;IACjD,MAAM,kBAAkB,GACtB,IAAI,CAAC,MAAM,KAAK,UAAU;QACxB,CAAC,CAAC,iHAAiH;QACnH,CAAC,CAAC,kEAAkE,CAAC;IAEzE,OAAO;;EAEP,8BAAqB;;;;;;;;;;;;;;;;;;EAkBrB,8BAAqB;;;;EAIrB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAuCO,CAAC;AAC5B,CAAC;AAED,+EAA+E;AAE/E,SAAgB,QAAQ,CAAC,SAAkB,EAAE,OAAgB;IAC3D,MAAM,MAAM,GAAG,mBAAQ,CAAC,OAAO,CAAC,CAAC;IAEjC,SAAS;SACN,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;SACjC,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE7D,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,WAAW,OAAO,CAAC,CAAC;QAEtD,IAAA,sBAAW,EACT,OAAO,EACP,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAC5C,IAAA,qBAAY,EAAC;YACX,SAAS,MAAM,CAAC,GAAG,EAAE;YACrB,MAAM,CAAC,QAAQ,IAAI,oBAAoB,MAAM,CAAC,QAAQ,EAAE;SACzD,CAAC,EACF,eAAe,CAChB,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow: Shop
|
|
3
|
+
*
|
|
4
|
+
* Researches a product across the web (reviews, Reddit, Wirecutter, etc.),
|
|
5
|
+
* finds the best option, then uses a saved Amazon browser profile to
|
|
6
|
+
* add it to cart. Demonstrates persistent browser profiles in action.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { type Backend } from '../backends';
|
|
10
|
+
export declare function register(parentCmd: Command, backend: Backend): void;
|
|
11
|
+
//# sourceMappingURL=shop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shop.d.ts","sourceRoot":"","sources":["../../../../src/commands/experimental/workflows/shop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,aAAa,CAAC;AA+GlE,wBAAgB,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CA4BnE"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workflow: Shop
|
|
4
|
+
*
|
|
5
|
+
* Researches a product across the web (reviews, Reddit, Wirecutter, etc.),
|
|
6
|
+
* finds the best option, then uses a saved Amazon browser profile to
|
|
7
|
+
* add it to cart. Demonstrates persistent browser profiles in action.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.register = register;
|
|
44
|
+
const backends_1 = require("../backends");
|
|
45
|
+
const shared_1 = require("../shared");
|
|
46
|
+
// ─── Input gathering ────────────────────────────────────────────────────────
|
|
47
|
+
async function gatherInputs(prefill) {
|
|
48
|
+
// If query is prefilled, skip interactive prompts entirely
|
|
49
|
+
if (prefill?.query) {
|
|
50
|
+
return { query: prefill.query, budget: '', sites: '', context: '' };
|
|
51
|
+
}
|
|
52
|
+
const { input } = await Promise.resolve().then(() => __importStar(require('@inquirer/prompts')));
|
|
53
|
+
const query = await input({
|
|
54
|
+
message: 'What are you looking to buy?',
|
|
55
|
+
validate: (0, shared_1.validateRequired)('Product'),
|
|
56
|
+
});
|
|
57
|
+
const budget = await input({
|
|
58
|
+
message: 'Budget? (leave blank for no limit)',
|
|
59
|
+
default: '',
|
|
60
|
+
});
|
|
61
|
+
const sites = await input({
|
|
62
|
+
message: 'Preferred site(s)? (e.g. amazon, bestbuy, newegg -- leave blank for any)',
|
|
63
|
+
default: '',
|
|
64
|
+
});
|
|
65
|
+
const context = await input({
|
|
66
|
+
message: 'Any other preferences? (brand, features, delivery location, etc.)',
|
|
67
|
+
default: '',
|
|
68
|
+
});
|
|
69
|
+
return { query, budget, sites, context };
|
|
70
|
+
}
|
|
71
|
+
// ─── System prompt ──────────────────────────────────────────────────────────
|
|
72
|
+
function buildSystemPrompt() {
|
|
73
|
+
return `You are a personal shopping assistant powered by Firecrawl. You shop for products using a real cloud browser -- browsing sites, comparing options, and adding items to cart visually.
|
|
74
|
+
|
|
75
|
+
## STEP 1: Launch Browser and Open Live View
|
|
76
|
+
|
|
77
|
+
Before anything else, launch a browser session and open the live view so the user can watch you shop:
|
|
78
|
+
|
|
79
|
+
\`\`\`bash
|
|
80
|
+
firecrawl browser launch-session --json
|
|
81
|
+
\`\`\`
|
|
82
|
+
|
|
83
|
+
Extract the \`liveViewUrl\` from the JSON output and open it for the user:
|
|
84
|
+
|
|
85
|
+
\`\`\`bash
|
|
86
|
+
open "<liveViewUrl>" # macOS
|
|
87
|
+
xdg-open "<liveViewUrl>" # Linux
|
|
88
|
+
\`\`\`
|
|
89
|
+
|
|
90
|
+
If the \`open\` command fails, print the URL clearly so the user can copy-paste it. Make sure the user sees the live view URL before you start shopping.
|
|
91
|
+
|
|
92
|
+
## STEP 2: Shop Using the Browser
|
|
93
|
+
|
|
94
|
+
Use \`firecrawl browser\` commands to browse, search, compare, and shop. Do everything in the browser -- this is a visual shopping experience.
|
|
95
|
+
|
|
96
|
+
\`\`\`bash
|
|
97
|
+
firecrawl browser "open <url>" # Navigate to a site
|
|
98
|
+
firecrawl browser "snapshot" # See what's on screen
|
|
99
|
+
firecrawl browser "click @<ref>" # Click an element
|
|
100
|
+
firecrawl browser "type @<ref> <text>" # Type into search/fields
|
|
101
|
+
firecrawl browser "scroll down" # Scroll to see more
|
|
102
|
+
firecrawl browser "scrape" # Get page content as markdown
|
|
103
|
+
\`\`\`
|
|
104
|
+
|
|
105
|
+
### How to shop:
|
|
106
|
+
1. Go to the user's preferred site (or Amazon by default)
|
|
107
|
+
2. Search for the product
|
|
108
|
+
3. Browse results, click into listings, compare specs and prices
|
|
109
|
+
4. Pick the best option based on reviews, price, and the user's requirements
|
|
110
|
+
5. Add to cart
|
|
111
|
+
6. Go to cart and snapshot to confirm
|
|
112
|
+
|
|
113
|
+
If you need to research reviews or comparisons outside the shopping site, you can use \`firecrawl search\` or \`firecrawl scrape\`, but **always come back to the browser for the actual shopping**.
|
|
114
|
+
|
|
115
|
+
Do everything sequentially -- do NOT spawn parallel subagents. Work through each step yourself, one at a time.
|
|
116
|
+
|
|
117
|
+
## Output
|
|
118
|
+
|
|
119
|
+
Print a summary to the terminal:
|
|
120
|
+
|
|
121
|
+
### What I Found
|
|
122
|
+
- Products compared, your pick, and why
|
|
123
|
+
|
|
124
|
+
### Cart
|
|
125
|
+
- Items added (name, price, seller)
|
|
126
|
+
- Total estimated cost
|
|
127
|
+
- Cart confirmation
|
|
128
|
+
|
|
129
|
+
Be specific with product names, model numbers, and prices. Start immediately.`;
|
|
130
|
+
}
|
|
131
|
+
// ─── Command registration ───────────────────────────────────────────────────
|
|
132
|
+
function register(parentCmd, backend) {
|
|
133
|
+
const config = backends_1.BACKENDS[backend];
|
|
134
|
+
parentCmd
|
|
135
|
+
.command('shop')
|
|
136
|
+
.description('Research products across the web, then buy using your saved Amazon session')
|
|
137
|
+
.argument('[query...]', 'What to shop for')
|
|
138
|
+
.option('-y, --yes', 'Auto-approve all tool permissions')
|
|
139
|
+
.action(async (queryParts, options) => {
|
|
140
|
+
const prefillQuery = queryParts.length > 0 ? queryParts.join(' ') : undefined;
|
|
141
|
+
const inputs = await gatherInputs(prefillQuery ? { query: prefillQuery } : undefined);
|
|
142
|
+
const parts = [inputs.query];
|
|
143
|
+
if (inputs.budget)
|
|
144
|
+
parts.push(`Budget: ${inputs.budget}`);
|
|
145
|
+
if (inputs.sites)
|
|
146
|
+
parts.push(`Shop on: ${inputs.sites}`);
|
|
147
|
+
if (inputs.context)
|
|
148
|
+
parts.push(inputs.context);
|
|
149
|
+
const userMessage = parts.join('. ') + '.';
|
|
150
|
+
const skipPermissions = true;
|
|
151
|
+
console.log(`\nLaunching ${config.displayName}...\n`);
|
|
152
|
+
(0, backends_1.launchAgent)(backend, buildSystemPrompt(), userMessage, skipPermissions);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=shop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shop.js","sourceRoot":"","sources":["../../../../src/commands/experimental/workflows/shop.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Init command —
|
|
2
|
+
* Init command — interactive step-by-step wizard to set up Firecrawl.
|
|
3
3
|
*
|
|
4
4
|
* Usage: npx -y firecrawl-cli init
|
|
5
5
|
*/
|
|
@@ -13,6 +13,16 @@ export interface InitOptions {
|
|
|
13
13
|
skipAuth?: boolean;
|
|
14
14
|
apiKey?: string;
|
|
15
15
|
browser?: boolean;
|
|
16
|
+
template?: string;
|
|
16
17
|
}
|
|
18
|
+
interface TemplateEntry {
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
path: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const TEMPLATES: TemplateEntry[];
|
|
24
|
+
export declare function findTemplate(name: string): TemplateEntry | undefined;
|
|
25
|
+
export declare function scaffoldTemplate(templatePath: string): Promise<void>;
|
|
17
26
|
export declare function handleInitCommand(options?: InitOptions): Promise<void>;
|
|
27
|
+
export {};
|
|
18
28
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAUD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,SAAS,EAAE,aAAa,EAsDpC,CAAC;AAuWF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAMpE;AAED,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC1E;AAED,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAyCf"}
|