firecrawl-cli 1.9.4 → 1.9.5
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 +158 -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,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workflow: Lead Research
|
|
4
|
+
*
|
|
5
|
+
* Spawns parallel agents to research a company, recent news/activity, and
|
|
6
|
+
* optionally a specific person -- all at once. Results are synthesized into
|
|
7
|
+
* a brief with talking points and pain points.
|
|
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 company = prefill?.company ||
|
|
50
|
+
(await input({
|
|
51
|
+
message: 'What company do you want to research?',
|
|
52
|
+
validate: (0, shared_1.validateRequired)('Company name or URL'),
|
|
53
|
+
}));
|
|
54
|
+
const person = await input({
|
|
55
|
+
message: 'Specific person to research? (leave blank to skip)',
|
|
56
|
+
default: '',
|
|
57
|
+
});
|
|
58
|
+
const context = await input({
|
|
59
|
+
message: 'What\'s the context? (e.g., "preparing for a sales call", "partnership eval")',
|
|
60
|
+
default: '',
|
|
61
|
+
});
|
|
62
|
+
const output = await select({
|
|
63
|
+
message: 'How should the brief be delivered?',
|
|
64
|
+
choices: [
|
|
65
|
+
{ name: 'Print to terminal', value: 'terminal' },
|
|
66
|
+
{ name: 'Save as Markdown file', value: 'markdown' },
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
return { company, person, context, output };
|
|
70
|
+
}
|
|
71
|
+
// ─── System prompt ──────────────────────────────────────────────────────────
|
|
72
|
+
function buildSystemPrompt(opts) {
|
|
73
|
+
const outputInstructions = opts.output === 'markdown'
|
|
74
|
+
? 'Save the brief to a file called `lead-brief.md` in the current directory. Tell the user the file path when done.'
|
|
75
|
+
: 'Print the full brief to the terminal in well-formatted markdown.';
|
|
76
|
+
return `You are a lead research team lead powered by Firecrawl. You orchestrate parallel research agents to prepare intelligence briefs before meetings, calls, or outreach.
|
|
77
|
+
|
|
78
|
+
${shared_1.FIRECRAWL_TOOLS_BLOCK}
|
|
79
|
+
|
|
80
|
+
## Your Strategy
|
|
81
|
+
|
|
82
|
+
You are a **team lead**, not a solo researcher. Your job is to:
|
|
83
|
+
|
|
84
|
+
1. **Spawn parallel subagents** -- Launch agents to research the company, recent activity, and person simultaneously.
|
|
85
|
+
2. **Collect results** -- Each agent reports back findings with sources.
|
|
86
|
+
3. **Synthesize** -- Build the brief with talking points and pain points from all agent findings.
|
|
87
|
+
|
|
88
|
+
## Agent Assignments
|
|
89
|
+
|
|
90
|
+
Spawn these agents in parallel:
|
|
91
|
+
1. **Company Profile Agent** -- Scrape the company website: about page, team/careers, product pages, pricing. Return what they do, size, stage, tech stack, key metrics.
|
|
92
|
+
2. **News & Activity Agent** -- Search for recent news about the company: funding, launches, hires, partnerships, press coverage from the last 6 months. Scrape the top results.
|
|
93
|
+
3. **Person Research Agent** (if a person is specified) -- Search for the person: their role, background, recent talks/posts/tweets, interests, public profiles. Scrape relevant pages.
|
|
94
|
+
|
|
95
|
+
${shared_1.SUBAGENT_INSTRUCTIONS}
|
|
96
|
+
|
|
97
|
+
## Output Format
|
|
98
|
+
|
|
99
|
+
${outputInstructions}
|
|
100
|
+
|
|
101
|
+
Structure the brief as:
|
|
102
|
+
|
|
103
|
+
### Company Overview
|
|
104
|
+
What they do, size, stage, key metrics.
|
|
105
|
+
|
|
106
|
+
### Recent Activity
|
|
107
|
+
News, launches, funding, hires from the last 6 months.
|
|
108
|
+
|
|
109
|
+
### Key People
|
|
110
|
+
Relevant people at the company with their roles and backgrounds.
|
|
111
|
+
|
|
112
|
+
### Talking Points
|
|
113
|
+
5-7 specific conversation starters based on your research.
|
|
114
|
+
|
|
115
|
+
### Potential Pain Points
|
|
116
|
+
What challenges might they be facing based on their industry/stage/tech?
|
|
117
|
+
|
|
118
|
+
### Sources
|
|
119
|
+
Every URL you scraped.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
Be concise and actionable. This is a pre-meeting brief, not a thesis.
|
|
124
|
+
|
|
125
|
+
Start working immediately.`;
|
|
126
|
+
}
|
|
127
|
+
// ─── Command registration ───────────────────────────────────────────────────
|
|
128
|
+
function register(parentCmd, backend) {
|
|
129
|
+
const config = backends_1.BACKENDS[backend];
|
|
130
|
+
parentCmd
|
|
131
|
+
.command('lead-research')
|
|
132
|
+
.description('Research a company or person before a meeting or outreach')
|
|
133
|
+
.argument('[company]', 'Company name or URL')
|
|
134
|
+
.option('-y, --yes', 'Auto-approve all tool permissions')
|
|
135
|
+
.action(async (company, options) => {
|
|
136
|
+
const inputs = await gatherInputs(company ? { company } : undefined);
|
|
137
|
+
const skipPermissions = options.yes || (await (0, shared_1.askPermissionMode)(backend));
|
|
138
|
+
console.log(`\nLaunching ${config.displayName}...\n`);
|
|
139
|
+
(0, backends_1.launchAgent)(backend, buildSystemPrompt({ output: inputs.output }), (0, shared_1.buildMessage)([
|
|
140
|
+
`Research ${inputs.company}`,
|
|
141
|
+
inputs.person && `Focus on ${inputs.person}`,
|
|
142
|
+
inputs.context && `Context: ${inputs.context}`,
|
|
143
|
+
]), skipPermissions);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=lead-research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-research.js","sourceRoot":"","sources":["../../../../src/commands/experimental/workflows/lead-research.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqHH,4BAyBC;AA3ID,0CAAkE;AAClE,sCAMmB;AAWnB,+EAA+E;AAE/E,KAAK,UAAU,YAAY,CAAC,OAA8B;IACxD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;IAE5D,MAAM,OAAO,GACX,OAAO,EAAE,OAAO;QAChB,CAAC,MAAM,KAAK,CAAC;YACX,OAAO,EAAE,uCAAuC;YAChD,QAAQ,EAAE,IAAA,yBAAgB,EAAC,qBAAqB,CAAC;SAClD,CAAC,CAAC,CAAC;IAEN,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;QACzB,OAAO,EAAE,oDAAoD;QAC7D,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;QAC1B,OAAO,EACL,+EAA+E;QACjF,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,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC9C,CAAC;AAED,+EAA+E;AAE/E,SAAS,iBAAiB,CAAC,IAAwB;IACjD,MAAM,kBAAkB,GACtB,IAAI,CAAC,MAAM,KAAK,UAAU;QACxB,CAAC,CAAC,kHAAkH;QACpH,CAAC,CAAC,kEAAkE,CAAC;IAEzE,OAAO;;EAEP,8BAAqB;;;;;;;;;;;;;;;;;EAiBrB,8BAAqB;;;;EAIrB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;2BA0BO,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,eAAe,CAAC;SACxB,WAAW,CAAC,2DAA2D,CAAC;SACxE,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;SAC5C,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAErE,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,YAAY,MAAM,CAAC,OAAO,EAAE;YAC5B,MAAM,CAAC,MAAM,IAAI,YAAY,MAAM,CAAC,MAAM,EAAE;YAC5C,MAAM,CAAC,OAAO,IAAI,YAAY,MAAM,CAAC,OAAO,EAAE;SAC/C,CAAC,EACF,eAAe,CAChB,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow: QA / Dogfood
|
|
3
|
+
*
|
|
4
|
+
* Acts as a QA team lead: maps the site, then spawns 3-4 parallel subagents
|
|
5
|
+
* that use Firecrawl's cloud browser to click around, fill forms, test
|
|
6
|
+
* interactions, and find bugs simultaneously.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { type Backend } from '../backends';
|
|
10
|
+
export declare function register(parentCmd: Command, backend: Backend): void;
|
|
11
|
+
//# sourceMappingURL=qa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa.d.ts","sourceRoot":"","sources":["../../../../src/commands/experimental/workflows/qa.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,aAAa,CAAC;AA8JlE,wBAAgB,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBnE"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workflow: QA / Dogfood
|
|
4
|
+
*
|
|
5
|
+
* Acts as a QA team lead: maps the site, then spawns 3-4 parallel subagents
|
|
6
|
+
* that use Firecrawl's cloud browser to click around, fill forms, test
|
|
7
|
+
* interactions, and find bugs simultaneously.
|
|
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's the URL of the site to test?",
|
|
52
|
+
validate: shared_1.validateUrl,
|
|
53
|
+
}));
|
|
54
|
+
const focus = await select({
|
|
55
|
+
message: 'What should the QA focus on?',
|
|
56
|
+
choices: [
|
|
57
|
+
{ name: 'Full exploratory test (everything)', value: 'full' },
|
|
58
|
+
{ name: 'Forms and user flows', value: 'forms' },
|
|
59
|
+
{ name: 'Navigation and links', value: 'navigation' },
|
|
60
|
+
{ name: 'Responsive / mobile issues', value: 'responsive' },
|
|
61
|
+
{ name: 'Performance and load times', value: 'performance' },
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
const context = await input({
|
|
65
|
+
message: 'Any specific areas or known issues to check? (leave blank to skip)',
|
|
66
|
+
default: '',
|
|
67
|
+
});
|
|
68
|
+
const output = await select({
|
|
69
|
+
message: 'How should the report be delivered?',
|
|
70
|
+
choices: [
|
|
71
|
+
{ name: 'Print to terminal', value: 'terminal' },
|
|
72
|
+
{ name: 'Save as Markdown file', value: 'markdown' },
|
|
73
|
+
],
|
|
74
|
+
});
|
|
75
|
+
return { url: (0, shared_1.normalizeUrl)(rawUrl), focus, context, output };
|
|
76
|
+
}
|
|
77
|
+
// ─── System prompt ──────────────────────────────────────────────────────────
|
|
78
|
+
function buildSystemPrompt(opts) {
|
|
79
|
+
const outputInstructions = opts.output === 'markdown'
|
|
80
|
+
? 'Save the QA report to a file called `qa-report.md` in the current directory. Tell the user the file path when done.'
|
|
81
|
+
: 'Print the final unified QA report to the terminal in well-formatted markdown.';
|
|
82
|
+
const focusInstructions = {
|
|
83
|
+
full: `Spawn ALL of these parallel agents:
|
|
84
|
+
1. **Navigation & Links Agent** -- Map the site, visit every nav item, check footer links, breadcrumbs, 404s, broken links.
|
|
85
|
+
2. **Forms & Interactions Agent** -- Find every form, test valid/invalid submissions, check validation messages, test edge cases (empty, too long, special chars).
|
|
86
|
+
3. **Content & Visual Agent** -- Check content quality, heading hierarchy, image alt tags, visual consistency, scroll through all pages.
|
|
87
|
+
4. **Error States Agent** -- Hit invalid URLs, test error pages, try unauthorized access, check API error responses visible in the UI.`,
|
|
88
|
+
forms: `Spawn these parallel agents:
|
|
89
|
+
1. **Form Discovery Agent** -- Map the site and find every form, input, and interactive element.
|
|
90
|
+
2. **Happy Path Agent** -- Test every form with valid data, verify success states.
|
|
91
|
+
3. **Edge Case Agent** -- Test with empty fields, max-length inputs, special characters, SQL injection strings, XSS payloads.
|
|
92
|
+
4. **Validation Agent** -- Test field-level validation, required fields, format validation (email, phone, etc).`,
|
|
93
|
+
navigation: `Spawn these parallel agents:
|
|
94
|
+
1. **Sitemap Agent** -- Map the full site, check sitemap.xml, compare discovered vs listed URLs.
|
|
95
|
+
2. **Nav Testing Agent** -- Click every nav item, dropdown, mega menu. Test mobile nav if responsive.
|
|
96
|
+
3. **Link Checker Agent** -- Scrape every page for links, verify each one returns 200.
|
|
97
|
+
4. **Routing Agent** -- Test back/forward, deep linking, query params, hash routing.`,
|
|
98
|
+
responsive: `Spawn these parallel agents:
|
|
99
|
+
1. **Desktop Agent** -- Test at 1920px, 1440px, 1024px widths.
|
|
100
|
+
2. **Tablet Agent** -- Test at 768px and 1024px portrait/landscape.
|
|
101
|
+
3. **Mobile Agent** -- Test at 375px and 390px widths.
|
|
102
|
+
4. **Interaction Agent** -- Test touch targets, overflow, horizontal scroll, zoom behavior.`,
|
|
103
|
+
performance: `Spawn these parallel agents:
|
|
104
|
+
1. **Page Load Agent** -- Measure load times for key pages (homepage, product, blog, pricing).
|
|
105
|
+
2. **Asset Audit Agent** -- Check image sizes, unoptimized assets, render-blocking scripts.
|
|
106
|
+
3. **Content Efficiency Agent** -- Check for lazy loading, pagination, infinite scroll behavior.
|
|
107
|
+
4. **Comparison Agent** -- Load competitor sites, compare performance characteristics.`,
|
|
108
|
+
};
|
|
109
|
+
return `You are a QA team lead powered by Firecrawl. You orchestrate parallel testing agents to thoroughly test live websites.
|
|
110
|
+
|
|
111
|
+
${shared_1.QA_TOOLS_BLOCK}
|
|
112
|
+
|
|
113
|
+
## Your Strategy
|
|
114
|
+
|
|
115
|
+
You are a **team lead**, not a solo tester. Your job is to:
|
|
116
|
+
|
|
117
|
+
1. **Map the site first** -- Run \`firecrawl map\` yourself to discover all pages.
|
|
118
|
+
2. **Spawn parallel subagents** -- Use the Agent tool to launch multiple testing agents simultaneously. Each agent gets a specific testing mandate and a subset of pages.
|
|
119
|
+
3. **Collect results** -- Each agent reports back its findings.
|
|
120
|
+
4. **Synthesize** -- Merge all agent findings into one unified report, deduplicate issues, and assign severity.
|
|
121
|
+
|
|
122
|
+
## Agent Assignments
|
|
123
|
+
|
|
124
|
+
${focusInstructions[opts.focus]}
|
|
125
|
+
|
|
126
|
+
${shared_1.SUBAGENT_INSTRUCTIONS}
|
|
127
|
+
|
|
128
|
+
- Tell each agent which pages to test (divide the sitemap between them)
|
|
129
|
+
- Tell each agent to use \`firecrawl browser\` and \`firecrawl scrape\` commands
|
|
130
|
+
- Each agent should report findings as: severity (critical/major/minor), URL, description, steps to reproduce
|
|
131
|
+
|
|
132
|
+
## Output Format
|
|
133
|
+
|
|
134
|
+
${outputInstructions}
|
|
135
|
+
|
|
136
|
+
Structure the unified QA report as:
|
|
137
|
+
|
|
138
|
+
### Summary
|
|
139
|
+
- Overall health score (out of 10)
|
|
140
|
+
- Pages tested: X
|
|
141
|
+
- Issues found: X critical, X major, X minor
|
|
142
|
+
- Agents deployed: X
|
|
143
|
+
|
|
144
|
+
### Critical Issues
|
|
145
|
+
Bugs that break functionality or block users:
|
|
146
|
+
- **[C-1]** URL | Description | Steps to reproduce | Expected vs actual
|
|
147
|
+
|
|
148
|
+
### Major Issues
|
|
149
|
+
Significant UX problems or broken features:
|
|
150
|
+
- **[M-1]** URL | Description | Steps to reproduce
|
|
151
|
+
|
|
152
|
+
### Minor Issues
|
|
153
|
+
Visual glitches, inconsistencies, polish items:
|
|
154
|
+
- **[m-1]** URL | Description
|
|
155
|
+
|
|
156
|
+
### Positive Observations
|
|
157
|
+
Things that work particularly well.
|
|
158
|
+
|
|
159
|
+
### Pages Tested
|
|
160
|
+
Full list of every URL visited across all agents.
|
|
161
|
+
|
|
162
|
+
### Agent Summary
|
|
163
|
+
Which agent found what -- brief summary of each agent's work.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
Start by mapping the site, then immediately fan out your testing agents in parallel.`;
|
|
168
|
+
}
|
|
169
|
+
// ─── Command registration ───────────────────────────────────────────────────
|
|
170
|
+
function register(parentCmd, backend) {
|
|
171
|
+
const config = backends_1.BACKENDS[backend];
|
|
172
|
+
parentCmd
|
|
173
|
+
.command('qa')
|
|
174
|
+
.description('QA test a live website using Firecrawl cloud browser')
|
|
175
|
+
.argument('[url]', 'URL to test')
|
|
176
|
+
.option('-y, --yes', 'Auto-approve all tool permissions')
|
|
177
|
+
.action(async (url, options) => {
|
|
178
|
+
const inputs = await gatherInputs(url ? { url } : undefined);
|
|
179
|
+
const skipPermissions = options.yes || (await (0, shared_1.askPermissionMode)(backend));
|
|
180
|
+
console.log(`\nLaunching ${config.displayName}...\n`);
|
|
181
|
+
(0, backends_1.launchAgent)(backend, buildSystemPrompt({ focus: inputs.focus, output: inputs.output }), (0, shared_1.buildMessage)([`Test ${inputs.url}`, inputs.context]), skipPermissions);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=qa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa.js","sourceRoot":"","sources":["../../../../src/commands/experimental/workflows/qa.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow: Research Papers
|
|
3
|
+
*
|
|
4
|
+
* Spawns parallel agents by source type (academic, industry, technical) to find,
|
|
5
|
+
* scrape, and synthesize research papers, whitepapers, and PDFs into a
|
|
6
|
+
* structured literature review.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { type Backend } from '../backends';
|
|
10
|
+
export declare function register(parentCmd: Command, backend: Backend): void;
|
|
11
|
+
//# sourceMappingURL=research-papers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-papers.d.ts","sourceRoot":"","sources":["../../../../src/commands/experimental/workflows/research-papers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,aAAa,CAAC;AAsHlE,wBAAgB,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAyBnE"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workflow: Research Papers
|
|
4
|
+
*
|
|
5
|
+
* Spawns parallel agents by source type (academic, industry, technical) to find,
|
|
6
|
+
* scrape, and synthesize research papers, whitepapers, and PDFs into a
|
|
7
|
+
* structured literature review.
|
|
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 topic = prefill?.topic ||
|
|
50
|
+
(await input({
|
|
51
|
+
message: 'What topic do you want to find papers on?',
|
|
52
|
+
validate: (0, shared_1.validateRequired)('Topic'),
|
|
53
|
+
}));
|
|
54
|
+
const count = await input({
|
|
55
|
+
message: 'How many papers/sources to target? (default: 10)',
|
|
56
|
+
default: '10',
|
|
57
|
+
});
|
|
58
|
+
const context = await input({
|
|
59
|
+
message: 'Any specific angles or questions? (leave blank to skip)',
|
|
60
|
+
default: '',
|
|
61
|
+
});
|
|
62
|
+
const output = await select({
|
|
63
|
+
message: 'How should the literature review be delivered?',
|
|
64
|
+
choices: [
|
|
65
|
+
{ name: 'Print to terminal', value: 'terminal' },
|
|
66
|
+
{ name: 'Save as Markdown file', value: 'markdown' },
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
return { topic, count, context, output };
|
|
70
|
+
}
|
|
71
|
+
// ─── System prompt ──────────────────────────────────────────────────────────
|
|
72
|
+
function buildSystemPrompt(opts) {
|
|
73
|
+
const outputInstructions = opts.output === 'markdown'
|
|
74
|
+
? 'Save the literature review to `literature-review.md` in the current directory. Tell the user the file path when done.'
|
|
75
|
+
: 'Print the full literature review to the terminal in well-formatted markdown.';
|
|
76
|
+
return `You are a research papers team lead powered by Firecrawl. You find, scrape, and synthesize research papers, whitepapers, and PDFs into a structured literature review.
|
|
77
|
+
|
|
78
|
+
${shared_1.FIRECRAWL_TOOLS_BLOCK}
|
|
79
|
+
|
|
80
|
+
## Your Strategy
|
|
81
|
+
|
|
82
|
+
You are a **team lead**. Your job is to:
|
|
83
|
+
|
|
84
|
+
1. **Find papers and PDFs** -- Search for research papers, whitepapers, technical reports, and PDFs on the topic. Target sources like arXiv, Google Scholar, IEEE, ACM, company research blogs, and PDF links.
|
|
85
|
+
2. **Spawn parallel subagents** -- Each agent scrapes and analyzes a subset of papers.
|
|
86
|
+
3. **Synthesize** -- Build a structured literature review from all agent findings.
|
|
87
|
+
|
|
88
|
+
## Agent Assignments
|
|
89
|
+
|
|
90
|
+
Spawn agents by source type:
|
|
91
|
+
1. **Academic Papers Agent** -- Search for and scrape research papers from arXiv, Google Scholar links, university sites. Use \`firecrawl scrape\` on PDF URLs directly -- Firecrawl handles PDFs natively.
|
|
92
|
+
2. **Industry Reports Agent** -- Search for whitepapers, technical reports, and industry publications. Scrape company research blogs and report PDFs.
|
|
93
|
+
3. **Technical Articles Agent** -- Search for in-depth technical articles, blog posts from researchers, and conference talk summaries.
|
|
94
|
+
|
|
95
|
+
${shared_1.SUBAGENT_INSTRUCTIONS}
|
|
96
|
+
|
|
97
|
+
## Output Format
|
|
98
|
+
|
|
99
|
+
${outputInstructions}
|
|
100
|
+
|
|
101
|
+
Structure the literature review as:
|
|
102
|
+
|
|
103
|
+
### Abstract
|
|
104
|
+
2-3 paragraph summary of the research landscape.
|
|
105
|
+
|
|
106
|
+
### Key Papers
|
|
107
|
+
For each paper/source:
|
|
108
|
+
- **Title** and authors (if available)
|
|
109
|
+
- **Source URL**
|
|
110
|
+
- **Key findings** (2-3 bullet points)
|
|
111
|
+
- **Methodology** (if applicable)
|
|
112
|
+
- **Relevance** to the topic
|
|
113
|
+
|
|
114
|
+
### Themes & Consensus
|
|
115
|
+
What do the papers agree on? What are the established findings?
|
|
116
|
+
|
|
117
|
+
### Open Questions & Debates
|
|
118
|
+
Where do papers disagree? What's unresolved?
|
|
119
|
+
|
|
120
|
+
### Emerging Trends
|
|
121
|
+
Recent developments and where the field is heading.
|
|
122
|
+
|
|
123
|
+
### Sources
|
|
124
|
+
Every URL scraped, organized by type (paper, report, article).
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
Be thorough with citations. Every claim should trace back to a specific source. If a PDF fails to scrape, note it and try an alternative.
|
|
129
|
+
|
|
130
|
+
Start by searching for papers on the topic.`;
|
|
131
|
+
}
|
|
132
|
+
// ─── Command registration ───────────────────────────────────────────────────
|
|
133
|
+
function register(parentCmd, backend) {
|
|
134
|
+
const config = backends_1.BACKENDS[backend];
|
|
135
|
+
parentCmd
|
|
136
|
+
.command('research-papers')
|
|
137
|
+
.description('Find and synthesize research papers, whitepapers, and PDFs')
|
|
138
|
+
.argument('[topic]', 'Research topic')
|
|
139
|
+
.option('-y, --yes', 'Auto-approve all tool permissions')
|
|
140
|
+
.action(async (topic, options) => {
|
|
141
|
+
const inputs = await gatherInputs(topic ? { topic } : undefined);
|
|
142
|
+
const skipPermissions = options.yes || (await (0, shared_1.askPermissionMode)(backend));
|
|
143
|
+
console.log(`\nLaunching ${config.displayName}...\n`);
|
|
144
|
+
(0, backends_1.launchAgent)(backend, buildSystemPrompt({ output: inputs.output }), (0, shared_1.buildMessage)([
|
|
145
|
+
`Research papers on: ${inputs.topic}`,
|
|
146
|
+
`Target ~${inputs.count} papers`,
|
|
147
|
+
inputs.context,
|
|
148
|
+
]), skipPermissions);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=research-papers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-papers.js","sourceRoot":"","sources":["../../../../src/commands/experimental/workflows/research-papers.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyHH,4BAyBC;AA/ID,0CAAkE;AAClE,sCAMmB;AAWnB,+EAA+E;AAE/E,KAAK,UAAU,YAAY,CAAC,OAA4B;IACtD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;IAE5D,MAAM,KAAK,GACT,OAAO,EAAE,KAAK;QACd,CAAC,MAAM,KAAK,CAAC;YACX,OAAO,EAAE,2CAA2C;YACpD,QAAQ,EAAE,IAAA,yBAAgB,EAAC,OAAO,CAAC;SACpC,CAAC,CAAC,CAAC;IAEN,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC;QACxB,OAAO,EAAE,kDAAkD;QAC3D,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;QAC1B,OAAO,EAAE,yDAAyD;QAClE,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO,EAAE,gDAAgD;QACzD,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,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED,+EAA+E;AAE/E,SAAS,iBAAiB,CAAC,IAAwB;IACjD,MAAM,kBAAkB,GACtB,IAAI,CAAC,MAAM,KAAK,UAAU;QACxB,CAAC,CAAC,uHAAuH;QACzH,CAAC,CAAC,8EAA8E,CAAC;IAErF,OAAO;;EAEP,8BAAqB;;;;;;;;;;;;;;;;;EAiBrB,8BAAqB;;;;EAIrB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CA+BwB,CAAC;AAC7C,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,iBAAiB,CAAC;SAC1B,WAAW,CAAC,4DAA4D,CAAC;SACzE,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;SACrC,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEjE,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,uBAAuB,MAAM,CAAC,KAAK,EAAE;YACrC,WAAW,MAAM,CAAC,KAAK,SAAS;YAChC,MAAM,CAAC,OAAO;SACf,CAAC,EACF,eAAe,CAChB,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow: SEO Audit
|
|
3
|
+
*
|
|
4
|
+
* Maps the site, then spawns parallel agents for site structure, on-page SEO,
|
|
5
|
+
* and keyword/competitor analysis. Produces a prioritized audit with specific
|
|
6
|
+
* (not generic) recommendations.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { type Backend } from '../backends';
|
|
10
|
+
export declare function register(parentCmd: Command, backend: Backend): void;
|
|
11
|
+
//# sourceMappingURL=seo-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-audit.d.ts","sourceRoot":"","sources":["../../../../src/commands/experimental/workflows/seo-audit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,aAAa,CAAC;AA0HlE,wBAAgB,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAwBnE"}
|