@ulpi/browse 2.3.3 → 2.4.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 +8 -2
- package/dist/browse.cjs +3445 -1636
- package/dist/lib.mjs +29504 -0
- package/dist/types/a11y.d.ts +32 -0
- package/dist/types/a11y.d.ts.map +1 -0
- package/dist/types/app/android/bridge.d.ts +41 -0
- package/dist/types/app/android/bridge.d.ts.map +1 -0
- package/dist/types/app/android/emulator.d.ts +32 -0
- package/dist/types/app/android/emulator.d.ts.map +1 -0
- package/dist/types/app/android/manager.d.ts +62 -0
- package/dist/types/app/android/manager.d.ts.map +1 -0
- package/dist/types/app/android/protocol.d.ts +162 -0
- package/dist/types/app/android/protocol.d.ts.map +1 -0
- package/dist/types/app/android/sim-service.d.ts +33 -0
- package/dist/types/app/android/sim-service.d.ts.map +1 -0
- package/dist/types/app/index.d.ts +15 -0
- package/dist/types/app/index.d.ts.map +1 -0
- package/dist/types/app/ios/bridge.d.ts +53 -0
- package/dist/types/app/ios/bridge.d.ts.map +1 -0
- package/dist/types/app/ios/controller.d.ts +131 -0
- package/dist/types/app/ios/controller.d.ts.map +1 -0
- package/dist/types/app/ios/manager.d.ts +96 -0
- package/dist/types/app/ios/manager.d.ts.map +1 -0
- package/dist/types/app/ios/protocol.d.ts +122 -0
- package/dist/types/app/ios/protocol.d.ts.map +1 -0
- package/dist/types/app/ios/sim-service.d.ts +37 -0
- package/dist/types/app/ios/sim-service.d.ts.map +1 -0
- package/dist/types/app/macos/bridge.d.ts +22 -0
- package/dist/types/app/macos/bridge.d.ts.map +1 -0
- package/dist/types/app/manager.d.ts +50 -0
- package/dist/types/app/manager.d.ts.map +1 -0
- package/dist/types/app/normalize.d.ts +27 -0
- package/dist/types/app/normalize.d.ts.map +1 -0
- package/dist/types/app/resolve-app.d.ts +31 -0
- package/dist/types/app/resolve-app.d.ts.map +1 -0
- package/dist/types/app/types.d.ts +77 -0
- package/dist/types/app/types.d.ts.map +1 -0
- package/dist/types/automation/action-context.d.ts +110 -0
- package/dist/types/automation/action-context.d.ts.map +1 -0
- package/dist/types/automation/command.d.ts +138 -0
- package/dist/types/automation/command.d.ts.map +1 -0
- package/dist/types/automation/events.d.ts +72 -0
- package/dist/types/automation/events.d.ts.map +1 -0
- package/dist/types/automation/executor.d.ts +39 -0
- package/dist/types/automation/executor.d.ts.map +1 -0
- package/dist/types/automation/index.d.ts +11 -0
- package/dist/types/automation/index.d.ts.map +1 -0
- package/dist/types/automation/registry.d.ts +38 -0
- package/dist/types/automation/registry.d.ts.map +1 -0
- package/dist/types/automation/rules.d.ts +52 -0
- package/dist/types/automation/rules.d.ts.map +1 -0
- package/dist/types/automation/target.d.ts +76 -0
- package/dist/types/automation/target.d.ts.map +1 -0
- package/dist/types/browser/consent.d.ts +13 -0
- package/dist/types/browser/consent.d.ts.map +1 -0
- package/dist/types/browser/cookie-import.d.ts +94 -0
- package/dist/types/browser/cookie-import.d.ts.map +1 -0
- package/dist/types/browser/detection.d.ts +22 -0
- package/dist/types/browser/detection.d.ts.map +1 -0
- package/dist/types/browser/emulation.d.ts +30 -0
- package/dist/types/browser/emulation.d.ts.map +1 -0
- package/dist/types/browser/events.d.ts +19 -0
- package/dist/types/browser/events.d.ts.map +1 -0
- package/dist/types/browser/index.d.ts +17 -0
- package/dist/types/browser/index.d.ts.map +1 -0
- package/dist/types/browser/macros.d.ts +9 -0
- package/dist/types/browser/macros.d.ts.map +1 -0
- package/dist/types/browser/manager.d.ts +272 -0
- package/dist/types/browser/manager.d.ts.map +1 -0
- package/dist/types/browser/png-compare.d.ts +36 -0
- package/dist/types/browser/png-compare.d.ts.map +1 -0
- package/dist/types/browser/profiles.d.ts +29 -0
- package/dist/types/browser/profiles.d.ts.map +1 -0
- package/dist/types/browser/react-devtools.d.ts +75 -0
- package/dist/types/browser/react-devtools.d.ts.map +1 -0
- package/dist/types/browser/readiness.d.ts +19 -0
- package/dist/types/browser/readiness.d.ts.map +1 -0
- package/dist/types/browser/refs.d.ts +70 -0
- package/dist/types/browser/refs.d.ts.map +1 -0
- package/dist/types/browser/serp.d.ts +16 -0
- package/dist/types/browser/serp.d.ts.map +1 -0
- package/dist/types/browser/snapshot-window.d.ts +31 -0
- package/dist/types/browser/snapshot-window.d.ts.map +1 -0
- package/dist/types/browser/snapshot.d.ts +41 -0
- package/dist/types/browser/snapshot.d.ts.map +1 -0
- package/dist/types/browser/tabs.d.ts +67 -0
- package/dist/types/browser/tabs.d.ts.map +1 -0
- package/dist/types/browser/target.d.ts +106 -0
- package/dist/types/browser/target.d.ts.map +1 -0
- package/dist/types/browser/youtube.d.ts +26 -0
- package/dist/types/browser/youtube.d.ts.map +1 -0
- package/dist/types/cli.d.ts +14 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cloud/auth.d.ts +80 -0
- package/dist/types/cloud/auth.d.ts.map +1 -0
- package/dist/types/cloud/docker.d.ts +76 -0
- package/dist/types/cloud/docker.d.ts.map +1 -0
- package/dist/types/cloud/firecracker.d.ts +142 -0
- package/dist/types/cloud/firecracker.d.ts.map +1 -0
- package/dist/types/cloud/golden-snapshot.d.ts +122 -0
- package/dist/types/cloud/golden-snapshot.d.ts.map +1 -0
- package/dist/types/cloud/index.d.ts +26 -0
- package/dist/types/cloud/index.d.ts.map +1 -0
- package/dist/types/cloud/orchestrator-interface.d.ts +63 -0
- package/dist/types/cloud/orchestrator-interface.d.ts.map +1 -0
- package/dist/types/cloud/orchestrator.d.ts +58 -0
- package/dist/types/cloud/orchestrator.d.ts.map +1 -0
- package/dist/types/cloud/proxy.d.ts +34 -0
- package/dist/types/cloud/proxy.d.ts.map +1 -0
- package/dist/types/cloud/reaper.d.ts +49 -0
- package/dist/types/cloud/reaper.d.ts.map +1 -0
- package/dist/types/cloud/server.d.ts +19 -0
- package/dist/types/cloud/server.d.ts.map +1 -0
- package/dist/types/cloud/sessions.d.ts +85 -0
- package/dist/types/cloud/sessions.d.ts.map +1 -0
- package/dist/types/cloud/vm-orchestrator.d.ts +133 -0
- package/dist/types/cloud/vm-orchestrator.d.ts.map +1 -0
- package/dist/types/cloud/vm-warm-pool.d.ts +104 -0
- package/dist/types/cloud/vm-warm-pool.d.ts.map +1 -0
- package/dist/types/cloud/warm-pool.d.ts +85 -0
- package/dist/types/cloud/warm-pool.d.ts.map +1 -0
- package/dist/types/cloud/ws.d.ts +61 -0
- package/dist/types/cloud/ws.d.ts.map +1 -0
- package/dist/types/commands/meta/auth.d.ts +6 -0
- package/dist/types/commands/meta/auth.d.ts.map +1 -0
- package/dist/types/commands/meta/flows.d.ts +15 -0
- package/dist/types/commands/meta/flows.d.ts.map +1 -0
- package/dist/types/commands/meta/index.d.ts +14 -0
- package/dist/types/commands/meta/index.d.ts.map +1 -0
- package/dist/types/commands/meta/inspection.d.ts +7 -0
- package/dist/types/commands/meta/inspection.d.ts.map +1 -0
- package/dist/types/commands/meta/profile.d.ts +11 -0
- package/dist/types/commands/meta/profile.d.ts.map +1 -0
- package/dist/types/commands/meta/recording.d.ts +7 -0
- package/dist/types/commands/meta/recording.d.ts.map +1 -0
- package/dist/types/commands/meta/screenshots.d.ts +7 -0
- package/dist/types/commands/meta/screenshots.d.ts.map +1 -0
- package/dist/types/commands/meta/sessions.d.ts +7 -0
- package/dist/types/commands/meta/sessions.d.ts.map +1 -0
- package/dist/types/commands/meta/sim.d.ts +10 -0
- package/dist/types/commands/meta/sim.d.ts.map +1 -0
- package/dist/types/commands/meta/system.d.ts +8 -0
- package/dist/types/commands/meta/system.d.ts.map +1 -0
- package/dist/types/commands/meta/tabs.d.ts +6 -0
- package/dist/types/commands/meta/tabs.d.ts.map +1 -0
- package/dist/types/commands/meta/youtube.d.ts +7 -0
- package/dist/types/commands/meta/youtube.d.ts.map +1 -0
- package/dist/types/commands/read.d.ts +16 -0
- package/dist/types/commands/read.d.ts.map +1 -0
- package/dist/types/commands/write.d.ts +17 -0
- package/dist/types/commands/write.d.ts.map +1 -0
- package/dist/types/config.d.ts +101 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/constants.d.ts +36 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/detection/frameworks.d.ts +27 -0
- package/dist/types/detection/frameworks.d.ts.map +1 -0
- package/dist/types/detection/index.d.ts +64 -0
- package/dist/types/detection/index.d.ts.map +1 -0
- package/dist/types/detection/infrastructure.d.ts +82 -0
- package/dist/types/detection/infrastructure.d.ts.map +1 -0
- package/dist/types/detection/saas.d.ts +39 -0
- package/dist/types/detection/saas.d.ts.map +1 -0
- package/dist/types/enable.d.ts +10 -0
- package/dist/types/enable.d.ts.map +1 -0
- package/dist/types/engine/chrome.d.ts +45 -0
- package/dist/types/engine/chrome.d.ts.map +1 -0
- package/dist/types/engine/index.d.ts +9 -0
- package/dist/types/engine/index.d.ts.map +1 -0
- package/dist/types/engine/providers.d.ts +36 -0
- package/dist/types/engine/providers.d.ts.map +1 -0
- package/dist/types/engine/resolver.d.ts +36 -0
- package/dist/types/engine/resolver.d.ts.map +1 -0
- package/dist/types/expect.d.ts +68 -0
- package/dist/types/expect.d.ts.map +1 -0
- package/dist/types/export/index.d.ts +8 -0
- package/dist/types/export/index.d.ts.map +1 -0
- package/dist/types/export/record.d.ts +28 -0
- package/dist/types/export/record.d.ts.map +1 -0
- package/dist/types/export/replay.d.ts +9 -0
- package/dist/types/export/replay.d.ts.map +1 -0
- package/dist/types/flow-parser.d.ts +32 -0
- package/dist/types/flow-parser.d.ts.map +1 -0
- package/dist/types/install-skill.d.ts +8 -0
- package/dist/types/install-skill.d.ts.map +1 -0
- package/dist/types/lib.d.ts +27 -0
- package/dist/types/lib.d.ts.map +1 -0
- package/dist/types/mcp/index.d.ts +10 -0
- package/dist/types/mcp/index.d.ts.map +1 -0
- package/dist/types/mcp/server.d.ts +9 -0
- package/dist/types/mcp/server.d.ts.map +1 -0
- package/dist/types/mcp/tools/index.d.ts +36 -0
- package/dist/types/mcp/tools/index.d.ts.map +1 -0
- package/dist/types/network/buffers.d.ts +53 -0
- package/dist/types/network/buffers.d.ts.map +1 -0
- package/dist/types/network/har.d.ts +10 -0
- package/dist/types/network/har.d.ts.map +1 -0
- package/dist/types/network/index.d.ts +6 -0
- package/dist/types/network/index.d.ts.map +1 -0
- package/dist/types/perf-audit/diff.d.ts +43 -0
- package/dist/types/perf-audit/diff.d.ts.map +1 -0
- package/dist/types/perf-audit/dom-analysis.d.ts +74 -0
- package/dist/types/perf-audit/dom-analysis.d.ts.map +1 -0
- package/dist/types/perf-audit/formatter.d.ts +34 -0
- package/dist/types/perf-audit/formatter.d.ts.map +1 -0
- package/dist/types/perf-audit/index.d.ts +128 -0
- package/dist/types/perf-audit/index.d.ts.map +1 -0
- package/dist/types/perf-audit/persist.d.ts +40 -0
- package/dist/types/perf-audit/persist.d.ts.map +1 -0
- package/dist/types/perf-audit/recommendations.d.ts +18 -0
- package/dist/types/perf-audit/recommendations.d.ts.map +1 -0
- package/dist/types/perf-audit/resource-analyzer.d.ts +46 -0
- package/dist/types/perf-audit/resource-analyzer.d.ts.map +1 -0
- package/dist/types/perf-audit/web-vitals.d.ts +73 -0
- package/dist/types/perf-audit/web-vitals.d.ts.map +1 -0
- package/dist/types/proxy/index.d.ts +6 -0
- package/dist/types/proxy/index.d.ts.map +1 -0
- package/dist/types/proxy/pool.d.ts +44 -0
- package/dist/types/proxy/pool.d.ts.map +1 -0
- package/dist/types/proxy/providers.d.ts +32 -0
- package/dist/types/proxy/providers.d.ts.map +1 -0
- package/dist/types/sdk/client.d.ts +37 -0
- package/dist/types/sdk/client.d.ts.map +1 -0
- package/dist/types/sdk/index.d.ts +17 -0
- package/dist/types/sdk/index.d.ts.map +1 -0
- package/dist/types/sdk/session.d.ts +95 -0
- package/dist/types/sdk/session.d.ts.map +1 -0
- package/dist/types/sdk/transports/cloud.d.ts +89 -0
- package/dist/types/sdk/transports/cloud.d.ts.map +1 -0
- package/dist/types/sdk/transports/index.d.ts +3 -0
- package/dist/types/sdk/transports/index.d.ts.map +1 -0
- package/dist/types/sdk/transports/local.d.ts +56 -0
- package/dist/types/sdk/transports/local.d.ts.map +1 -0
- package/dist/types/sdk.d.ts +35 -0
- package/dist/types/sdk.d.ts.map +1 -0
- package/dist/types/security/auth-vault.d.ts +32 -0
- package/dist/types/security/auth-vault.d.ts.map +1 -0
- package/dist/types/security/domain-filter.d.ts +31 -0
- package/dist/types/security/domain-filter.d.ts.map +1 -0
- package/dist/types/security/index.d.ts +10 -0
- package/dist/types/security/index.d.ts.map +1 -0
- package/dist/types/security/policy.d.ts +20 -0
- package/dist/types/security/policy.d.ts.map +1 -0
- package/dist/types/security/sanitize.d.ts +6 -0
- package/dist/types/security/sanitize.d.ts.map +1 -0
- package/dist/types/server.d.ts +13 -0
- package/dist/types/server.d.ts.map +1 -0
- package/dist/types/session/concurrency.d.ts +28 -0
- package/dist/types/session/concurrency.d.ts.map +1 -0
- package/dist/types/session/encryption.d.ts +8 -0
- package/dist/types/session/encryption.d.ts.map +1 -0
- package/dist/types/session/index.d.ts +7 -0
- package/dist/types/session/index.d.ts.map +1 -0
- package/dist/types/session/manager.d.ts +110 -0
- package/dist/types/session/manager.d.ts.map +1 -0
- package/dist/types/session/persist.d.ts +87 -0
- package/dist/types/session/persist.d.ts.map +1 -0
- package/dist/types/session/tab-lock.d.ts +26 -0
- package/dist/types/session/tab-lock.d.ts.map +1 -0
- package/dist/types/session/target-factory.d.ts +88 -0
- package/dist/types/session/target-factory.d.ts.map +1 -0
- package/dist/types/sim-cli.d.ts +8 -0
- package/dist/types/sim-cli.d.ts.map +1 -0
- package/dist/types/types.d.ts +45 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/visual.d.ts +79 -0
- package/dist/types/visual.d.ts.map +1 -0
- package/package.json +22 -3
- package/skill/browse/SKILL.md +286 -0
- package/skill/{references → browse/references}/commands.md +203 -18
- package/skill/browse-aeo/SKILL.md +148 -0
- package/skill/browse-config/SKILL.md +200 -0
- package/skill/browse-geo/SKILL.md +225 -0
- package/skill/browse-qa/SKILL.md +143 -0
- package/skill/browse-seo/SKILL.md +188 -0
- package/skill/browse-stealth/SKILL.md +246 -0
- package/skill/SKILL.md +0 -496
- /package/skill/{references → browse/references}/guides.md +0 -0
- /package/skill/{references → browse/references}/permissions.md +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: browse-aeo
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: |
|
|
5
|
+
Answer Engine Optimization (AEO) audit and SERP analysis for AI-generated answers.
|
|
6
|
+
Analyzes pages for AEO readiness (structured data, FAQ patterns, heading hierarchy,
|
|
7
|
+
meta quality) and checks how queries appear in AI-powered search results (Google AI
|
|
8
|
+
Overviews, Perplexity, ChatGPT Search). Uses the browse CLI for all page interaction.
|
|
9
|
+
allowed-tools:
|
|
10
|
+
- Bash
|
|
11
|
+
- Read
|
|
12
|
+
argument-hint: "[URL to audit or search query to analyze]"
|
|
13
|
+
arguments:
|
|
14
|
+
- request
|
|
15
|
+
when_to_use: |
|
|
16
|
+
Use when the user asks for AEO audit, answer engine optimization, AI search optimization,
|
|
17
|
+
AI Overview analysis, Perplexity citation check, or says /browse-aeo. Also use when the
|
|
18
|
+
user wants to understand how a page or domain appears in AI-generated answers.
|
|
19
|
+
effort: high
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# browse-aeo: Answer Engine Optimization
|
|
23
|
+
|
|
24
|
+
## Goal
|
|
25
|
+
|
|
26
|
+
Audit a page for AEO readiness or analyze how a query surfaces in AI-powered search.
|
|
27
|
+
Two modes: **Page Audit** (analyze a URL) and **SERP Analysis** (analyze a search query).
|
|
28
|
+
|
|
29
|
+
## Mode 1: Page Audit
|
|
30
|
+
|
|
31
|
+
Evaluate a single URL for AEO readiness. Run each step in order.
|
|
32
|
+
|
|
33
|
+
### Step 1: Navigate and stabilize
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
browse goto <url>
|
|
37
|
+
browse wait --network-idle
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Step 2: Extract structured data
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
browse schema
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Analyze for: JSON-LD presence (critical for AEO), FAQPage schema (directly feeds AI answers), HowTo schema (surfaces in how-to answers), Article/NewsArticle/BlogPosting (attribution), Organization/Person (authority), Breadcrumb (hierarchy), QAPage (Q&A pairs). Empty or minimal structured data is a major AEO gap.
|
|
47
|
+
|
|
48
|
+
### Step 3: Extract and evaluate meta tags
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
browse meta
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Check: meta description (concise direct answer, under 160 chars -- AI uses this as candidate snippet), canonical URL (must be present), Open Graph tags (og:title, og:description), robots directives (`noindex` or `nosnippet` blocks AI citation entirely).
|
|
55
|
+
|
|
56
|
+
### Step 4: Analyze heading hierarchy
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
browse headings
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Evaluate: single H1 (clear topic statement), H2s as questions or clear topic labels (AI uses headings to find answer boundaries), question-format H2s ("What is X?", "How to Y?") are strongly preferred, logical nesting (no skipped levels).
|
|
63
|
+
|
|
64
|
+
### Step 5: Analyze page content for answer patterns
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
browse text
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Scan for: direct definitions in the first paragraph ("X is a..." -- AI favors concise leads), FAQ patterns (Q&A pairs even without schema), numbered/bulleted lists (AI prefers extractable structure), concise paragraphs (under 50 words are more likely cited), authority signals ("We tested...", "In our experience..." -- original research language).
|
|
71
|
+
|
|
72
|
+
### Step 6: Produce the AEO audit report
|
|
73
|
+
|
|
74
|
+
Score the page on a 0-100 scale across these dimensions:
|
|
75
|
+
|
|
76
|
+
| Dimension | Weight | What to check |
|
|
77
|
+
|-----------|--------|---------------|
|
|
78
|
+
| Structured Data | 25% | JSON-LD presence, FAQ/HowTo/Article schema, completeness |
|
|
79
|
+
| Meta Quality | 15% | Description as answer snippet, canonical, no blocking robots |
|
|
80
|
+
| Heading Structure | 20% | Single H1, question-format H2s, logical nesting |
|
|
81
|
+
| Answer Readiness | 25% | Direct definitions, FAQ patterns, concise paragraphs, lists |
|
|
82
|
+
| Authority Signals | 15% | Organization schema, author markup, original research language |
|
|
83
|
+
|
|
84
|
+
Report: overall score out of 100, per-dimension score with findings and recommendations, then the top 3 highest-impact actions.
|
|
85
|
+
|
|
86
|
+
## Mode 2: SERP Analysis
|
|
87
|
+
|
|
88
|
+
Check how a query appears in AI-powered search results.
|
|
89
|
+
|
|
90
|
+
### Step 1: Google search with AI Overview detection
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
browse goto "https://www.google.com/search?q=<url-encoded-query>"
|
|
94
|
+
browse wait --network-idle
|
|
95
|
+
browse snapshot -i
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Read the snapshot to identify: AI Overview (generative answer block, note cited domains), Featured Snippet (boxed answer, note source domain), People Also Ask (expandable questions -- these are AEO targets), organic position of target domain.
|
|
99
|
+
|
|
100
|
+
If Google blocks the request, retry with camoufox:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
browse --runtime camoufox --headed goto "https://www.google.com/search?q=<url-encoded-query>"
|
|
104
|
+
browse --runtime camoufox --headed snapshot -i
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Step 2: Perplexity analysis (camoufox recommended)
|
|
108
|
+
|
|
109
|
+
Perplexity has bot detection. Use camoufox:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
browse --runtime camoufox --headed goto "https://www.perplexity.ai/search?q=<url-encoded-query>"
|
|
113
|
+
browse --runtime camoufox --headed wait --network-idle
|
|
114
|
+
browse --runtime camoufox --headed snapshot -i
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Read the snapshot to identify: cited source domains (numbered citations), answer structure (paragraphs, lists, tables), citation density. If Perplexity blocks, note it in the report and skip.
|
|
118
|
+
|
|
119
|
+
### Step 3: Produce the SERP analysis report
|
|
120
|
+
|
|
121
|
+
Report: for each engine (Google, Perplexity), list AI Overview presence, cited domains, featured snippet source, People Also Ask questions, and target domain position. End with observations on what content types are being cited and specific actions to improve citation likelihood.
|
|
122
|
+
|
|
123
|
+
## Key Rules
|
|
124
|
+
|
|
125
|
+
1. **Always wait after navigation** -- `browse wait --network-idle` before extracting content.
|
|
126
|
+
2. **Use camoufox for search engines** -- Google and Perplexity actively block headless browsers. Fall back to `--runtime camoufox --headed` when blocked.
|
|
127
|
+
3. **Agent interprets snapshots** -- there is no magic SERP parser. The agent reads `browse snapshot -i` output and identifies AI Overview elements, citations, and People Also Ask by reading the accessibility tree.
|
|
128
|
+
4. **Structured data is the top signal** -- JSON-LD FAQ and HowTo schemas are the single most impactful AEO lever. Always check this first.
|
|
129
|
+
5. **Do not fabricate scores** -- if a dimension cannot be evaluated (e.g., page is behind a login wall), mark it as "N/A" and explain why.
|
|
130
|
+
6. **Keep recommendations actionable** -- "Add FAQ schema" is good. "Improve SEO" is not.
|
|
131
|
+
|
|
132
|
+
## Guardrails
|
|
133
|
+
|
|
134
|
+
- Do not add `disable-model-invocation`; this is a general-purpose audit skill.
|
|
135
|
+
- Do not add `context: fork`; audit results are needed in the current flow.
|
|
136
|
+
- Do not run `browse handoff` without explicit user confirmation.
|
|
137
|
+
- Do not guess SERP structure -- always take a snapshot and read it.
|
|
138
|
+
- Do not claim a page "appears in AI Overviews" without actually checking via SERP analysis.
|
|
139
|
+
|
|
140
|
+
## Output Contract
|
|
141
|
+
|
|
142
|
+
Report:
|
|
143
|
+
|
|
144
|
+
1. the mode used (Page Audit or SERP Analysis)
|
|
145
|
+
2. the URL audited or query analyzed
|
|
146
|
+
3. findings per dimension with specific evidence
|
|
147
|
+
4. actionable recommendations ranked by impact
|
|
148
|
+
5. any blockers encountered (bot detection, login walls, empty results)
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: browse-config
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: |
|
|
5
|
+
Guided configuration generator for the browse CLI's camoufox integration.
|
|
6
|
+
Asks the user questions to build a browse.json camoufox section or a named
|
|
7
|
+
profile JSON file for stealth, fast-scraping, Google-safe, or custom setups.
|
|
8
|
+
allowed-tools:
|
|
9
|
+
- AskUserQuestion
|
|
10
|
+
- Bash
|
|
11
|
+
- Read
|
|
12
|
+
- Write
|
|
13
|
+
argument-hint: "[preset or 'custom']"
|
|
14
|
+
arguments:
|
|
15
|
+
- request
|
|
16
|
+
when_to_use: |
|
|
17
|
+
Use when the user asks to configure camoufox, set up stealth browsing, create a browse
|
|
18
|
+
profile, tune anti-detection settings, or says /browse-config. Do NOT use for general
|
|
19
|
+
browse CLI usage or non-camoufox configuration.
|
|
20
|
+
effort: medium
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# browse-config: Camoufox Configuration Generator
|
|
24
|
+
|
|
25
|
+
## Step 0: Ask what the user needs
|
|
26
|
+
|
|
27
|
+
Use AskUserQuestion to determine the goal. Offer these presets:
|
|
28
|
+
|
|
29
|
+
| Preset | Description |
|
|
30
|
+
|--------|-------------|
|
|
31
|
+
| **Stealth browsing** | For scraping protected sites. Enables geoip, humanize, default OS fingerprint. |
|
|
32
|
+
| **Fast scraping** | Minimal footprint. Blocks images, WebRTC, WebGL. Enables disk cache. |
|
|
33
|
+
| **Google-safe** | For Google search without "unusual traffic" blocks. Enables geoip, humanize, random OS. |
|
|
34
|
+
| **Custom** | Walk through each option group interactively. |
|
|
35
|
+
|
|
36
|
+
### Preset defaults
|
|
37
|
+
|
|
38
|
+
**Stealth browsing:**
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"geoip": true,
|
|
42
|
+
"humanize": true
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Fast scraping:**
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"blockImages": true,
|
|
50
|
+
"blockWebrtc": true,
|
|
51
|
+
"blockWebgl": true,
|
|
52
|
+
"enableCache": true
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Google-safe:**
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"geoip": true,
|
|
60
|
+
"humanize": true,
|
|
61
|
+
"os": ["windows", "macos", "linux"]
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Step 1: Custom configuration (skip if preset chosen)
|
|
66
|
+
|
|
67
|
+
If the user chose "Custom", ask about each option group using AskUserQuestion. Present one group at a time.
|
|
68
|
+
|
|
69
|
+
### Identity
|
|
70
|
+
- `os` (string or array) -- target OS fingerprint: "windows", "macos", "linux", or an array for random selection
|
|
71
|
+
- `locale` (string or array) -- browser locale, e.g. "en-US" or ["en-US", "en-GB"]
|
|
72
|
+
- `fingerprint` (object) -- advanced fingerprint overrides (most users skip this)
|
|
73
|
+
|
|
74
|
+
### Privacy
|
|
75
|
+
- `blockWebrtc` (boolean) -- block WebRTC to prevent IP leaks
|
|
76
|
+
- `blockWebgl` (boolean) -- block WebGL fingerprinting
|
|
77
|
+
- `blockImages` (boolean) -- block image loading (also improves speed)
|
|
78
|
+
|
|
79
|
+
### Performance
|
|
80
|
+
- `enableCache` (boolean) -- enable browser disk cache
|
|
81
|
+
- `blockImages` (boolean) -- already covered in Privacy, mention speed benefit here
|
|
82
|
+
|
|
83
|
+
### Network
|
|
84
|
+
- `proxy` (string or object) -- proxy URL like "http://user:pass@host:port" or `{"server":"...","username":"...","password":"..."}`
|
|
85
|
+
- `geoip` (string or boolean) -- true to auto-derive from proxy IP, or a country code like "US"
|
|
86
|
+
|
|
87
|
+
### Behavior
|
|
88
|
+
- `humanize` (boolean or number) -- true for default human-like delays, or a number (0.5-2.0) to control speed
|
|
89
|
+
|
|
90
|
+
### Advanced (offer only if user asks)
|
|
91
|
+
- `addons` (string[]) -- Firefox addon paths to load
|
|
92
|
+
- `excludeAddons` (string[]) -- built-in addons to skip
|
|
93
|
+
- `firefoxUserPrefs` (Record) -- raw Firefox about:config preferences
|
|
94
|
+
- `args` (string[]) -- extra browser launch arguments
|
|
95
|
+
- `fonts` (string[]) -- custom font list
|
|
96
|
+
- `customFontsOnly` (boolean) -- use only custom fonts
|
|
97
|
+
- `screen` (object) -- `{minWidth, maxWidth, minHeight, maxHeight}`
|
|
98
|
+
- `window` ([width, height]) -- fixed window size
|
|
99
|
+
- `ffVersion` (number) -- target Firefox version
|
|
100
|
+
- `headless` (boolean or "virtual") -- headless mode (not recommended for anti-detection)
|
|
101
|
+
- `mainWorldEval` (boolean) -- enable main world JavaScript eval
|
|
102
|
+
- `executablePath` (string) -- custom camoufox binary path
|
|
103
|
+
- `env` (Record) -- environment variables for the browser process
|
|
104
|
+
- `virtualDisplay` (string) -- virtual display config (Linux only)
|
|
105
|
+
- `disableCoop` (boolean) -- disable Cross-Origin-Opener-Policy headers
|
|
106
|
+
- `debug` (boolean) -- enable debug logging
|
|
107
|
+
|
|
108
|
+
## Step 2: Ask where to save
|
|
109
|
+
|
|
110
|
+
Use AskUserQuestion with two options:
|
|
111
|
+
|
|
112
|
+
1. **browse.json** -- adds a `"camoufox"` section to the project's `browse.json`. Applied automatically whenever `--runtime camoufox` is used.
|
|
113
|
+
2. **Named profile** -- saves to `.browse/camoufox-profiles/<name>.json`. Used with `--camoufox-profile <name>`. Good for per-scenario configs (e.g. "google", "scrape", "stealth").
|
|
114
|
+
|
|
115
|
+
If the user picks a named profile, ask for the profile name.
|
|
116
|
+
|
|
117
|
+
## Step 3: Generate and write the file
|
|
118
|
+
|
|
119
|
+
### If browse.json
|
|
120
|
+
|
|
121
|
+
Read the existing `browse.json` first (if it exists). Merge the new `camoufox` key into it. Write the result:
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"camoufox": {
|
|
126
|
+
"geoip": true,
|
|
127
|
+
"humanize": true
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### If named profile
|
|
133
|
+
|
|
134
|
+
Create the directory `.browse/camoufox-profiles/` if needed. Write just the config object:
|
|
135
|
+
|
|
136
|
+
```json
|
|
137
|
+
{
|
|
138
|
+
"geoip": true,
|
|
139
|
+
"humanize": true,
|
|
140
|
+
"os": "windows"
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Step 4: Show usage
|
|
145
|
+
|
|
146
|
+
After writing the file, tell the user exactly how to use it.
|
|
147
|
+
|
|
148
|
+
**If browse.json:**
|
|
149
|
+
```
|
|
150
|
+
Run: browse --runtime camoufox goto <url>
|
|
151
|
+
The camoufox section is applied automatically.
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**If named profile:**
|
|
155
|
+
```
|
|
156
|
+
Run: browse --runtime camoufox --camoufox-profile <name> goto <url>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Always note: "The `--camoufox-profile` flag only applies when starting a new server. If a server is already running, stop it first with `browse stop`."
|
|
160
|
+
|
|
161
|
+
## All CamoufoxConfig options
|
|
162
|
+
|
|
163
|
+
All keys use camelCase in JSON. They are auto-mapped to snake_case for camoufox-js internally.
|
|
164
|
+
|
|
165
|
+
| Key | Type | Description |
|
|
166
|
+
|-----|------|-------------|
|
|
167
|
+
| `os` | string or string[] | Target OS fingerprint |
|
|
168
|
+
| `blockImages` | boolean | Block image loading |
|
|
169
|
+
| `blockWebrtc` | boolean | Block WebRTC |
|
|
170
|
+
| `blockWebgl` | boolean | Block WebGL |
|
|
171
|
+
| `disableCoop` | boolean | Disable COOP headers |
|
|
172
|
+
| `geoip` | string or boolean | GeoIP spoofing (true or country code) |
|
|
173
|
+
| `humanize` | boolean or number | Human-like delays (true or speed factor) |
|
|
174
|
+
| `locale` | string or string[] | Browser locale |
|
|
175
|
+
| `addons` | string[] | Firefox addon paths |
|
|
176
|
+
| `fonts` | string[] | Custom fonts |
|
|
177
|
+
| `customFontsOnly` | boolean | Only use custom fonts |
|
|
178
|
+
| `screen` | object | Screen size range ({minWidth, maxWidth, minHeight, maxHeight}) |
|
|
179
|
+
| `window` | [number, number] | Fixed window size |
|
|
180
|
+
| `fingerprint` | object | Fingerprint overrides |
|
|
181
|
+
| `ffVersion` | number | Firefox version |
|
|
182
|
+
| `headless` | boolean or "virtual" | Headless mode |
|
|
183
|
+
| `mainWorldEval` | boolean | Main world eval |
|
|
184
|
+
| `firefoxUserPrefs` | Record | Firefox about:config prefs |
|
|
185
|
+
| `proxy` | string or object | Proxy config |
|
|
186
|
+
| `enableCache` | boolean | Enable disk cache |
|
|
187
|
+
| `debug` | boolean | Debug logging |
|
|
188
|
+
| `excludeAddons` | string[] | Addons to exclude |
|
|
189
|
+
| `executablePath` | string | Custom browser path |
|
|
190
|
+
| `args` | string[] | Extra browser args |
|
|
191
|
+
| `env` | Record | Environment variables |
|
|
192
|
+
| `virtualDisplay` | string | Virtual display (Linux) |
|
|
193
|
+
|
|
194
|
+
## Guardrails
|
|
195
|
+
|
|
196
|
+
- Always use AskUserQuestion before generating config. Do not assume preferences.
|
|
197
|
+
- Use camelCase keys in all generated JSON (the CLI handles snake_case mapping).
|
|
198
|
+
- Never overwrite existing browse.json fields outside the `camoufox` key.
|
|
199
|
+
- Never include proxy credentials in output shown to the user. Write them to the file only.
|
|
200
|
+
- Do not include options the user did not ask for or confirm, beyond the preset defaults.
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: browse-geo
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: |
|
|
5
|
+
Generative Engine Optimization (GEO) monitoring — track brand and domain visibility
|
|
6
|
+
across AI-powered search engines: Google AI Overviews, Perplexity, and ChatGPT Search.
|
|
7
|
+
Run multi-query sweeps, detect citations, measure domain presence, and generate
|
|
8
|
+
cross-engine visibility reports. Uses the browse CLI with camoufox for stealth.
|
|
9
|
+
allowed-tools:
|
|
10
|
+
- Bash
|
|
11
|
+
- Read
|
|
12
|
+
- AskUserQuestion
|
|
13
|
+
argument-hint: "[brand queries or domain to monitor]"
|
|
14
|
+
arguments:
|
|
15
|
+
- request
|
|
16
|
+
when_to_use: |
|
|
17
|
+
Use when the user asks for GEO monitoring, generative engine optimization, AI visibility
|
|
18
|
+
tracking, brand monitoring in AI search, or says /browse-geo. Examples:
|
|
19
|
+
- "Check if my domain appears in Google AI Overviews for these queries"
|
|
20
|
+
- "Monitor brand visibility across Perplexity and ChatGPT Search"
|
|
21
|
+
- "Run a GEO audit for our product across AI search engines"
|
|
22
|
+
- "Track which domains get cited in AI-generated answers"
|
|
23
|
+
Do NOT use for traditional SEO (rankings, meta tags, crawlability) — use browse-seo instead.
|
|
24
|
+
effort: high
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# browse-geo: Generative Engine Optimization Monitoring
|
|
28
|
+
|
|
29
|
+
## Goal
|
|
30
|
+
|
|
31
|
+
Monitor how a brand or domain appears in AI-generated search results across three engines:
|
|
32
|
+
Google AI Overviews, Perplexity, and ChatGPT Search. Produce a visibility matrix showing
|
|
33
|
+
which queries surface the target domain, in what position, and with what context.
|
|
34
|
+
|
|
35
|
+
## Prerequisites
|
|
36
|
+
|
|
37
|
+
Camoufox is required for Google (bot detection). Install if not available:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
browse --runtime camoufox doctor
|
|
41
|
+
# If not installed:
|
|
42
|
+
npm install camoufox-js && npx camoufox-js fetch
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
For ChatGPT Search, a persistent browser profile with an authenticated ChatGPT session is
|
|
46
|
+
required. Create one if needed:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
browse --profile chatgpt --headed goto https://chatgpt.com
|
|
50
|
+
# User logs in manually via headed browser
|
|
51
|
+
# Profile persists cookies for future sessions
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Step 0: Gather inputs
|
|
55
|
+
|
|
56
|
+
Before running any queries, collect from the user:
|
|
57
|
+
|
|
58
|
+
1. **Target domain** — the domain to track (e.g., `example.com`)
|
|
59
|
+
2. **Query list** — 3-10 brand-relevant search queries
|
|
60
|
+
3. **Engines** — which engines to check (default: all three)
|
|
61
|
+
|
|
62
|
+
If the user provides only a domain, suggest relevant queries based on the domain's likely
|
|
63
|
+
industry and product category. Use `AskUserQuestion` to confirm the query list.
|
|
64
|
+
|
|
65
|
+
## Step 1: Google AI Overviews
|
|
66
|
+
|
|
67
|
+
Google AI Overviews appear at the top of search results for informational queries.
|
|
68
|
+
Use camoufox with consent dismissal to avoid bot detection and cookie banners.
|
|
69
|
+
|
|
70
|
+
### Navigate and extract
|
|
71
|
+
|
|
72
|
+
For each query:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
BROWSE_CONSENT_DISMISS=1 browse --runtime camoufox --headed goto "https://www.google.com/search?q=<url-encoded-query>"
|
|
76
|
+
browse --runtime camoufox --headed wait --network-idle
|
|
77
|
+
browse --runtime camoufox --headed snapshot -i
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Analyze results
|
|
81
|
+
|
|
82
|
+
Read the snapshot output. The AI Overview section typically has an "AI Overview" label,
|
|
83
|
+
expandable summary text with inline citations, and source links. If present, use
|
|
84
|
+
`browse --runtime camoufox --headed text` to extract full content.
|
|
85
|
+
|
|
86
|
+
For each query, record: `ai_overview_present` (yes/no), `domain_cited` (yes/no),
|
|
87
|
+
`citation_position` (number or null), `citation_context` (the claim it supports),
|
|
88
|
+
and `competing_domains` (other cited domains).
|
|
89
|
+
|
|
90
|
+
## Step 2: Perplexity
|
|
91
|
+
|
|
92
|
+
Perplexity shows AI-generated answers with numbered source citations.
|
|
93
|
+
|
|
94
|
+
### Navigate and extract
|
|
95
|
+
|
|
96
|
+
For each query:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
browse goto "https://www.perplexity.ai/search?q=<url-encoded-query>"
|
|
100
|
+
browse wait --network-idle
|
|
101
|
+
browse snapshot -i
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Analyze results
|
|
105
|
+
|
|
106
|
+
Perplexity shows numbered footnote-style citations (e.g., [1], [2]) within the answer
|
|
107
|
+
and a "Sources" section with URLs. Use `browse text` for full content if needed.
|
|
108
|
+
|
|
109
|
+
For each query, record: `answer_generated` (yes/no), `domain_cited` (yes/no),
|
|
110
|
+
`citation_numbers` (positions referencing the target domain), `citation_context`,
|
|
111
|
+
`total_citations`, and `competing_domains`.
|
|
112
|
+
|
|
113
|
+
## Step 3: ChatGPT Search (authenticated)
|
|
114
|
+
|
|
115
|
+
ChatGPT Search requires an authenticated session. Use a persistent profile.
|
|
116
|
+
|
|
117
|
+
### Navigate and query
|
|
118
|
+
|
|
119
|
+
For each query:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
browse --profile chatgpt goto https://chatgpt.com
|
|
123
|
+
browse --profile chatgpt snapshot -i
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Find the input field from the snapshot, then:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
browse --profile chatgpt fill <input-ref> "<query>"
|
|
130
|
+
browse --profile chatgpt press Enter
|
|
131
|
+
browse --profile chatgpt wait --network-idle
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
ChatGPT streams responses. Wait for output to stabilize, then snapshot:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
browse --profile chatgpt wait --network-idle
|
|
138
|
+
browse --profile chatgpt snapshot -i
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
If a stop/regenerate button is visible, the response is still streaming — wait and
|
|
142
|
+
re-snapshot. Use `browse --profile chatgpt text` for full content extraction.
|
|
143
|
+
|
|
144
|
+
### Analyze results
|
|
145
|
+
|
|
146
|
+
ChatGPT Search shows inline numbered citation links and a "Sources" panel with URLs.
|
|
147
|
+
|
|
148
|
+
For each query, record: `response_generated` (yes/no), `search_used` (yes/no --
|
|
149
|
+
ChatGPT may answer from training data without search), `domain_cited` (yes/no),
|
|
150
|
+
`citation_position` (number or null), `citation_context`, and `competing_domains`.
|
|
151
|
+
|
|
152
|
+
## Step 4: Generate visibility report
|
|
153
|
+
|
|
154
|
+
After running all queries across selected engines, compile the results into a
|
|
155
|
+
structured report.
|
|
156
|
+
|
|
157
|
+
### Visibility matrix
|
|
158
|
+
|
|
159
|
+
Create a table with queries as rows and engines as columns:
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
| Query | Google AI Overview | Perplexity | ChatGPT Search |
|
|
163
|
+
|------------------------|--------------------|------------|----------------|
|
|
164
|
+
| "best <product>" | Cited (#2) | Cited (#1) | Not cited |
|
|
165
|
+
| "<brand> vs competitor"| No AI Overview | Cited (#3) | Cited (#2) |
|
|
166
|
+
| "how to <task>" | Cited (#1) | Not cited | Not cited |
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Summary metrics
|
|
170
|
+
|
|
171
|
+
Calculate and report:
|
|
172
|
+
|
|
173
|
+
- **Visibility rate**: percentage of queries where the domain appears, per engine
|
|
174
|
+
- **Average citation position**: mean position when cited, per engine
|
|
175
|
+
- **Best-performing queries**: queries where the domain appears across multiple engines
|
|
176
|
+
- **Gap queries**: queries where the domain is absent from all engines
|
|
177
|
+
- **Top competing domains**: domains that appear most frequently across all queries
|
|
178
|
+
|
|
179
|
+
### Recommendations
|
|
180
|
+
|
|
181
|
+
Based on the findings, suggest:
|
|
182
|
+
|
|
183
|
+
- Which queries have the highest AI visibility potential
|
|
184
|
+
- Where competitors are cited but the target domain is not
|
|
185
|
+
- Content gaps that could improve citation likelihood
|
|
186
|
+
- Which engines favor the domain (focus optimization there)
|
|
187
|
+
|
|
188
|
+
## Multi-query workflow
|
|
189
|
+
|
|
190
|
+
When running many queries, batch by engine to minimize context switching:
|
|
191
|
+
|
|
192
|
+
1. Run all queries on Google AI Overviews first (camoufox session stays warm)
|
|
193
|
+
2. Run all queries on Perplexity second (no special runtime needed)
|
|
194
|
+
3. Run all queries on ChatGPT Search last (authenticated profile session)
|
|
195
|
+
|
|
196
|
+
Between queries on the same engine, no need to restart the browser. Navigate directly
|
|
197
|
+
to the next search URL.
|
|
198
|
+
|
|
199
|
+
## Important rules
|
|
200
|
+
|
|
201
|
+
- **Camoufox for Google** — Google blocks regular Chromium for automated searches. Always
|
|
202
|
+
use `--runtime camoufox --headed` for Google queries.
|
|
203
|
+
- **Rate limiting** — Add natural pauses between queries on the same engine. Do not run
|
|
204
|
+
more than one query every 5-10 seconds on Google. Perplexity and ChatGPT are more lenient.
|
|
205
|
+
- **AI Overviews are not always present** — Google shows AI Overviews for informational
|
|
206
|
+
queries, not navigational or transactional ones. Record absence as a data point.
|
|
207
|
+
- **ChatGPT may not use search** — ChatGPT sometimes answers from training data without
|
|
208
|
+
invoking web search. When no sources panel appears, record `search_used: no`.
|
|
209
|
+
- **Snapshot before text** — always take a snapshot first to understand page structure,
|
|
210
|
+
then use text extraction for full content if needed.
|
|
211
|
+
- **Do not fabricate results** — if a citation is ambiguous or unclear, note it as
|
|
212
|
+
uncertain rather than asserting presence or absence.
|
|
213
|
+
- **Profile persistence** — the `--profile chatgpt` flag reuses cookies across sessions.
|
|
214
|
+
If the session expires, ask the user to re-authenticate via headed mode.
|
|
215
|
+
|
|
216
|
+
## Limitations
|
|
217
|
+
|
|
218
|
+
- **Google AI Overviews availability** — not all queries trigger AI Overviews; availability
|
|
219
|
+
varies by region and query type
|
|
220
|
+
- **ChatGPT Search access** — requires a ChatGPT Plus or Team subscription with search enabled
|
|
221
|
+
- **Rate limits** — aggressive querying may trigger temporary blocks on any engine
|
|
222
|
+
- **Dynamic content** — AI-generated answers change over time; results represent a
|
|
223
|
+
point-in-time snapshot
|
|
224
|
+
- **Image/video citations** — this workflow tracks text citations only; rich media
|
|
225
|
+
citations in AI answers are not captured
|