aeorank 2.3.1 → 3.0.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 +98 -63
- package/dist/browser.d.ts +82 -8
- package/dist/browser.js +1191 -32
- package/dist/browser.js.map +1 -1
- package/dist/{chunk-PKJIKMLV.js → chunk-OCLAIHX6.js} +15 -4
- package/dist/chunk-OCLAIHX6.js.map +1 -0
- package/dist/cli.js +1008 -28
- package/dist/cli.js.map +1 -1
- package/dist/{full-site-crawler-FQYO46YV.js → full-site-crawler-5AYKCZQY.js} +15 -4
- package/dist/full-site-crawler-5AYKCZQY.js.map +1 -0
- package/dist/{full-site-crawler-UIOMKOZA.js → full-site-crawler-BCJS67WQ.js} +2 -2
- package/dist/index.cjs +1215 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +207 -133
- package/dist/index.d.ts +207 -133
- package/dist/index.js +1191 -32
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
- package/dist/chunk-PKJIKMLV.js.map +0 -1
- package/dist/full-site-crawler-FQYO46YV.js.map +0 -1
- /package/dist/{full-site-crawler-UIOMKOZA.js.map → full-site-crawler-BCJS67WQ.js.map} +0 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# AEORank
|
|
2
2
|
|
|
3
|
-
Score any website for AI engine visibility across
|
|
3
|
+
Score any website for AI engine visibility across 34 criteria in a 5-pillar framework. Pure HTTP + regex - zero API keys, under 10 seconds.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/aeorank)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
@@ -35,17 +35,19 @@ import { audit } from 'aeorank';
|
|
|
35
35
|
|
|
36
36
|
const result = await audit('example.com');
|
|
37
37
|
console.log(result.overallScore); // 0-100
|
|
38
|
-
console.log(result.scorecard); //
|
|
38
|
+
console.log(result.scorecard); // 34 criteria with scores, pillars, weights
|
|
39
|
+
console.log(result.pillarScores); // { answerReadiness, contentStructure, ... }
|
|
40
|
+
console.log(result.topFixes); // Top 3 highest-impact fixes
|
|
39
41
|
console.log(result.opportunities); // Prioritized improvements
|
|
40
42
|
```
|
|
41
43
|
|
|
42
44
|
## What It Checks
|
|
43
45
|
|
|
44
|
-
AEORank evaluates
|
|
46
|
+
AEORank evaluates 34 criteria that determine how AI engines (ChatGPT, Claude, Perplexity, Google AI Overviews) discover, parse, and cite your content. Criteria are organized into five pillars:
|
|
45
47
|
|
|
46
|
-
###
|
|
48
|
+
### 5-Pillar Framework
|
|
47
49
|
|
|
48
|
-
**
|
|
50
|
+
**Pillar 1: Answer Readiness (~40%)** - *Why* an AI engine would cite you:
|
|
49
51
|
|
|
50
52
|
| Criterion | Weight | What it measures |
|
|
51
53
|
|-----------|--------|------------------|
|
|
@@ -53,27 +55,45 @@ AEORank evaluates 28 criteria that determine how AI engines (ChatGPT, Claude, Pe
|
|
|
53
55
|
| Original Data & Expert Analysis | 10% | Proprietary research, case studies, unique data points |
|
|
54
56
|
| Content Depth | 7% | Article length, heading structure, deep vs thin pages |
|
|
55
57
|
| Fact & Data Density | 6% | Specific numbers, statistics, data points per page |
|
|
58
|
+
| Citation-Ready Writing | 4% | Self-contained definition sentences, single-claim statements |
|
|
59
|
+
| Answer-First Placement | 3% | Answer block in first 300 words, no throat-clearing openers |
|
|
60
|
+
| Evidence Packaging | 3% | Inline citations, attribution phrases, sources sections |
|
|
61
|
+
|
|
62
|
+
**Pillar 2: Content Structure (~25%)** - *How* AI extracts your answers:
|
|
63
|
+
|
|
64
|
+
| Criterion | Weight | What it measures |
|
|
65
|
+
|-----------|--------|------------------|
|
|
56
66
|
| Direct Answer Paragraphs | 5% | Concise answer paragraphs after question headings |
|
|
57
67
|
| Q&A Content Format | 5% | Question-format headings (What, How, Why) with answers |
|
|
58
68
|
| Query-Answer Alignment | 5% | Every question heading followed by a direct answer |
|
|
59
69
|
| Comprehensive FAQ Section | 4% | Dedicated FAQ with FAQPage schema markup |
|
|
70
|
+
| Table & List Extractability | 3% | HTML tables with headers, ordered/unordered lists |
|
|
71
|
+
| Definition Patterns | 2% | Clear "X is defined as..." patterns for key terms |
|
|
72
|
+
| Entity Disambiguation | 2% | Primary entity defined early, consistent terminology |
|
|
60
73
|
|
|
61
|
-
**
|
|
74
|
+
**Pillar 3: Trust & Authority (~15%)** - *How* AI trusts your content:
|
|
62
75
|
|
|
63
76
|
| Criterion | Weight | What it measures |
|
|
64
77
|
|-----------|--------|------------------|
|
|
65
78
|
| Entity Authority & NAP Consistency | 5% | Organization schema, consistent name/address/phone |
|
|
66
79
|
| Internal Linking Structure | 4% | Topic clusters, breadcrumbs, reachability from homepage |
|
|
67
80
|
| Content Freshness Signals | 4% | dateModified schema, visible dates, recent content |
|
|
68
|
-
| Schema.org Structured Data | 3% | JSON-LD blocks (Organization, Article, FAQPage, etc.) |
|
|
69
81
|
| Author & Expert Schema | 3% | Person schema with credentials and expertise |
|
|
70
|
-
|
|
|
71
|
-
|
|
72
|
-
|
|
82
|
+
| Schema.org Structured Data | 3% | JSON-LD blocks (Organization, Article, FAQPage, etc.) |
|
|
83
|
+
|
|
84
|
+
**Pillar 4: Technical Foundation (~10%)** - *How* easily AI parses your pages:
|
|
85
|
+
|
|
86
|
+
| Criterion | Weight | What it measures |
|
|
87
|
+
|-----------|--------|------------------|
|
|
73
88
|
| Semantic HTML5 & Accessibility | 2% | Semantic elements (main, article, nav), ARIA, lang |
|
|
74
89
|
| Clean, Crawlable HTML | 2% | HTTPS, meta tags, proper heading hierarchy |
|
|
90
|
+
| Visible Date Signal | 2% | Visible publication dates with `<time>` elements |
|
|
91
|
+
| Extraction Friction | 2% | Sentence length, voice-friendly leads, jargon density |
|
|
92
|
+
| Image Context for AI | 1% | Figure/figcaption, descriptive alt text, contextual placement |
|
|
93
|
+
| Schema Coverage & Depth | 1% | Schema markup on inner pages, not just homepage |
|
|
94
|
+
| Speakable Schema | 1% | SpeakableSpecification for voice assistants |
|
|
75
95
|
|
|
76
|
-
**
|
|
96
|
+
**Pillar 5: AI Discovery (~10%)** - *Whether* AI crawlers can find you:
|
|
77
97
|
|
|
78
98
|
| Criterion | Weight | What it measures |
|
|
79
99
|
|-----------|--------|------------------|
|
|
@@ -85,44 +105,48 @@ AEORank evaluates 28 criteria that determine how AI engines (ChatGPT, Claude, Pe
|
|
|
85
105
|
| Sitemap Completeness | 1% | sitemap.xml with lastmod dates |
|
|
86
106
|
| Canonical URL Strategy | 1% | Self-referencing canonical tags |
|
|
87
107
|
| RSS/Atom Feed | 1% | RSS feed linked from homepage |
|
|
88
|
-
| Schema Coverage & Depth | 1% | Schema markup on inner pages, not just homepage |
|
|
89
|
-
| Speakable Schema | 1% | SpeakableSpecification for voice assistants |
|
|
90
108
|
|
|
91
109
|
> **Coherence Gate:** Sites with topic coherence below 6/10 are score-capped regardless of technical perfection. A scattered site with perfect robots.txt, llms.txt, and schema will score lower than a focused site with mediocre technical implementation.
|
|
92
110
|
|
|
93
111
|
<details>
|
|
94
|
-
<summary>All
|
|
95
|
-
|
|
96
|
-
| # | Criterion | Weight |
|
|
97
|
-
|
|
98
|
-
| 1 | llms.txt File | 2% |
|
|
99
|
-
| 2 | Schema.org Structured Data | 3% |
|
|
100
|
-
| 3 | Q&A Content Format | 5% |
|
|
101
|
-
| 4 | Clean, Crawlable HTML | 2% |
|
|
102
|
-
| 5 | Entity Authority & NAP Consistency | 5% |
|
|
103
|
-
| 6 | robots.txt for AI Crawlers | 2% |
|
|
104
|
-
| 7 | Comprehensive FAQ Section | 4% |
|
|
105
|
-
| 8 | Original Data & Expert Analysis | 10% |
|
|
106
|
-
| 9 | Internal Linking Structure | 4% |
|
|
107
|
-
| 10 | Semantic HTML5 & Accessibility | 2% |
|
|
108
|
-
| 11 | Content Freshness Signals | 4% |
|
|
109
|
-
| 12 | Sitemap Completeness | 1% |
|
|
110
|
-
| 13 | RSS/Atom Feed | 1% |
|
|
111
|
-
| 14 | Table & List Extractability | 3% |
|
|
112
|
-
| 15 | Definition Patterns | 2% |
|
|
113
|
-
| 16 | Direct Answer Paragraphs | 5% |
|
|
114
|
-
| 17 | Content Licensing & AI Permissions | 2% |
|
|
115
|
-
| 18 | Author & Expert Schema | 3% |
|
|
116
|
-
| 19 | Fact & Data Density | 6% |
|
|
117
|
-
| 20 | Canonical URL Strategy | 1% |
|
|
118
|
-
| 21 | Content Publishing Velocity | 2% |
|
|
119
|
-
| 22 | Schema Coverage & Depth | 1% |
|
|
120
|
-
| 23 | Speakable Schema | 1% |
|
|
121
|
-
| 24 | Query-Answer Alignment | 5% |
|
|
122
|
-
| 25 | Content Cannibalization | 2% |
|
|
123
|
-
| 26 | Visible Date Signal | 2% |
|
|
124
|
-
| 27 | Topic Coherence | 14% |
|
|
125
|
-
| 28 | Content Depth | 7% |
|
|
112
|
+
<summary>All 34 criteria (numbered list)</summary>
|
|
113
|
+
|
|
114
|
+
| # | Criterion | Weight | Pillar |
|
|
115
|
+
|---|-----------|--------|--------|
|
|
116
|
+
| 1 | llms.txt File | 2% | AI Discovery |
|
|
117
|
+
| 2 | Schema.org Structured Data | 3% | Trust & Authority |
|
|
118
|
+
| 3 | Q&A Content Format | 5% | Content Structure |
|
|
119
|
+
| 4 | Clean, Crawlable HTML | 2% | Technical Foundation |
|
|
120
|
+
| 5 | Entity Authority & NAP Consistency | 5% | Trust & Authority |
|
|
121
|
+
| 6 | robots.txt for AI Crawlers | 2% | AI Discovery |
|
|
122
|
+
| 7 | Comprehensive FAQ Section | 4% | Content Structure |
|
|
123
|
+
| 8 | Original Data & Expert Analysis | 10% | Answer Readiness |
|
|
124
|
+
| 9 | Internal Linking Structure | 4% | Trust & Authority |
|
|
125
|
+
| 10 | Semantic HTML5 & Accessibility | 2% | Technical Foundation |
|
|
126
|
+
| 11 | Content Freshness Signals | 4% | Trust & Authority |
|
|
127
|
+
| 12 | Sitemap Completeness | 1% | AI Discovery |
|
|
128
|
+
| 13 | RSS/Atom Feed | 1% | AI Discovery |
|
|
129
|
+
| 14 | Table & List Extractability | 3% | Content Structure |
|
|
130
|
+
| 15 | Definition Patterns | 2% | Content Structure |
|
|
131
|
+
| 16 | Direct Answer Paragraphs | 5% | Content Structure |
|
|
132
|
+
| 17 | Content Licensing & AI Permissions | 2% | AI Discovery |
|
|
133
|
+
| 18 | Author & Expert Schema | 3% | Trust & Authority |
|
|
134
|
+
| 19 | Fact & Data Density | 6% | Answer Readiness |
|
|
135
|
+
| 20 | Canonical URL Strategy | 1% | AI Discovery |
|
|
136
|
+
| 21 | Content Publishing Velocity | 2% | AI Discovery |
|
|
137
|
+
| 22 | Schema Coverage & Depth | 1% | Technical Foundation |
|
|
138
|
+
| 23 | Speakable Schema | 1% | Technical Foundation |
|
|
139
|
+
| 24 | Query-Answer Alignment | 5% | Content Structure |
|
|
140
|
+
| 25 | Content Cannibalization | 2% | AI Discovery |
|
|
141
|
+
| 26 | Visible Date Signal | 2% | Technical Foundation |
|
|
142
|
+
| 27 | Topic Coherence | 14% | Answer Readiness |
|
|
143
|
+
| 28 | Content Depth | 7% | Answer Readiness |
|
|
144
|
+
| 29 | Citation-Ready Writing | 4% | Answer Readiness |
|
|
145
|
+
| 30 | Answer-First Placement | 3% | Answer Readiness |
|
|
146
|
+
| 31 | Evidence Packaging | 3% | Answer Readiness |
|
|
147
|
+
| 32 | Entity Disambiguation | 2% | Content Structure |
|
|
148
|
+
| 33 | Extraction Friction | 2% | Technical Foundation |
|
|
149
|
+
| 34 | Image Context for AI | 1% | Technical Foundation |
|
|
126
150
|
|
|
127
151
|
</details>
|
|
128
152
|
|
|
@@ -358,29 +382,37 @@ console.log(crawlResult.discoveredUrls.length); // Total URLs found
|
|
|
358
382
|
|
|
359
383
|
## Per-Page Scoring
|
|
360
384
|
|
|
361
|
-
AEORank scores each individual page (0-
|
|
385
|
+
AEORank scores each individual page (0-75) against the 20 criteria that apply at page level. Instead of only seeing "your site scores 62," you get "your /about page scores 45, your /blog/guide scores 72."
|
|
362
386
|
|
|
363
|
-
The
|
|
387
|
+
The 20 per-page criteria follow the same pillar-first weighting as the site-level score:
|
|
364
388
|
|
|
365
|
-
|
|
|
366
|
-
|
|
367
|
-
| **
|
|
389
|
+
| Pillar | Per-Page Criteria | Weight |
|
|
390
|
+
|--------|-------------------|--------|
|
|
391
|
+
| **Answer Readiness** | Original Data & Expert Content | 10% |
|
|
368
392
|
| | Fact & Data Density | 6% |
|
|
369
|
-
| |
|
|
393
|
+
| | Citation-Ready Writing | 4% |
|
|
394
|
+
| | Answer-First Placement | 3% |
|
|
395
|
+
| | Evidence Packaging | 3% |
|
|
396
|
+
| **Content Structure** | Direct Answer Paragraphs | 5% |
|
|
370
397
|
| | Q&A Content Format | 5% |
|
|
371
398
|
| | Query-Answer Alignment | 5% |
|
|
372
399
|
| | FAQ Section Content | 4% |
|
|
373
|
-
| **Organization** | Content Freshness Signals | 4% |
|
|
374
|
-
| | Schema.org Structured Data | 3% |
|
|
375
400
|
| | Table & List Extractability | 3% |
|
|
376
401
|
| | Definition Patterns | 2% |
|
|
377
|
-
| |
|
|
378
|
-
| |
|
|
402
|
+
| | Entity Disambiguation | 2% |
|
|
403
|
+
| **Trust & Authority** | Content Freshness Signals | 4% |
|
|
404
|
+
| | Schema.org Structured Data | 3% |
|
|
405
|
+
| **Technical Foundation** | Semantic HTML5 & Accessibility | 2% |
|
|
379
406
|
| | Clean, Crawlable HTML | 2% |
|
|
380
|
-
|
|
|
407
|
+
| | Visible Date Signal | 2% |
|
|
408
|
+
| | Extraction Friction | 2% |
|
|
409
|
+
| | Image Context for AI | 1% |
|
|
410
|
+
| **AI Discovery** | Canonical URL Strategy | 1% |
|
|
381
411
|
|
|
382
412
|
The remaining 14 criteria are site-level only: llms.txt, robots.txt, sitemap, RSS, entity consistency, internal linking, content licensing, author schema, content velocity, schema coverage, speakable schema, content cannibalization, topic coherence, and content depth.
|
|
383
413
|
|
|
414
|
+
> **Single-page cap:** Per-page scores are capped at 75 since single pages cannot demonstrate site-wide signals like topic coherence, content velocity, or sitemap completeness.
|
|
415
|
+
|
|
384
416
|
### CLI Output
|
|
385
417
|
|
|
386
418
|
Per-page scores appear in the pages section:
|
|
@@ -403,8 +435,9 @@ import type { PageScoreResult, PageCriterionScore } from 'aeorank';
|
|
|
403
435
|
|
|
404
436
|
// Score a single page
|
|
405
437
|
const result = scorePage(html, url);
|
|
406
|
-
console.log(result.aeoScore); // 0-
|
|
407
|
-
console.log(result.criterionScores); //
|
|
438
|
+
console.log(result.aeoScore); // 0-75 (capped for single pages)
|
|
439
|
+
console.log(result.criterionScores); // 20 per-criterion scores
|
|
440
|
+
console.log(result.scoreCapped); // true if score was capped at 75
|
|
408
441
|
|
|
409
442
|
// Score all pages from site data
|
|
410
443
|
const allScores = scoreAllPages(siteData);
|
|
@@ -532,15 +565,17 @@ console.log(result.comparison.tied); // Criteria with equal scores
|
|
|
532
565
|
|
|
533
566
|
## Changelog
|
|
534
567
|
|
|
568
|
+
### v3.0.0 - 5-Pillar Framework & 6 New Criteria
|
|
569
|
+
|
|
570
|
+
Scoring Engine v2: 28 → 34 criteria with 5-pillar framework (Answer Readiness, Content Structure, Trust & Authority, Technical Foundation, AI Discovery). 6 new criteria targeting citation quality, evidence packaging, and extraction friction. Per-pillar sub-scores, top-3 fixes, client-friendly names. Single-page score cap at 75. 15 per-page quality checks (up from 12).
|
|
571
|
+
|
|
535
572
|
### v2.3.0 - Coherence Scaling & Script Stripping
|
|
536
573
|
|
|
537
|
-
|
|
538
|
-
- **Strip inline JavaScript from scoring**: `<script>` and `<style>` tags are now removed before text analysis, preventing WP Rocket and similar deferred-loading scripts from corrupting regex-based scoring.
|
|
539
|
-
- **Regex safety net**: `checkQueryAnswerAlignment` wraps `new RegExp()` in try-catch to handle residual script content gracefully.
|
|
574
|
+
Topic coherence scales with page count. Inline JavaScript stripped from scoring.
|
|
540
575
|
|
|
541
576
|
### v2.2.0 - Auto Page Discovery
|
|
542
577
|
|
|
543
|
-
|
|
578
|
+
Auto-discover pages from homepage links when no sitemap exists.
|
|
544
579
|
|
|
545
580
|
### v2.1.0 - Scoring Rebalance with Coherence Gate
|
|
546
581
|
|
|
@@ -560,7 +595,7 @@ Individual page scores (0-100) against 14 page-level criteria. Top/bottom page r
|
|
|
560
595
|
|
|
561
596
|
## Benchmark Dataset
|
|
562
597
|
|
|
563
|
-
The `data/` directory contains the largest open dataset of AI visibility scores - **13,619 domains** scored across
|
|
598
|
+
The `data/` directory contains the largest open dataset of AI visibility scores - **13,619 domains** scored across 34 criteria, including **4,328 Y Combinator startups** across 48 batches (W06-W26):
|
|
564
599
|
|
|
565
600
|
| File | Contents |
|
|
566
601
|
|------|----------|
|
package/dist/browser.d.ts
CHANGED
|
@@ -62,6 +62,33 @@ declare function extractLinksWithAnchors(html: string, sourceUrl: string, domain
|
|
|
62
62
|
*/
|
|
63
63
|
declare function buildLinkGraph(pages: FetchResult[], domain: string, homepageUrl: string): LinkGraph;
|
|
64
64
|
|
|
65
|
+
/**
|
|
66
|
+
* V2 Pillar Framework — 5-pillar scoring model.
|
|
67
|
+
* Maps all 34 criteria into pillars, computes sub-scores,
|
|
68
|
+
* provides client-friendly names, and calculates top-3 fixes.
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
interface PillarScores {
|
|
72
|
+
answerReadiness: number;
|
|
73
|
+
contentStructure: number;
|
|
74
|
+
trustAuthority: number;
|
|
75
|
+
technicalFoundation: number;
|
|
76
|
+
aiDiscovery: number;
|
|
77
|
+
}
|
|
78
|
+
interface TopFix {
|
|
79
|
+
criterion: string;
|
|
80
|
+
clientName: string;
|
|
81
|
+
description: string;
|
|
82
|
+
impactPoints: number;
|
|
83
|
+
effort: 'Low' | 'Medium' | 'High';
|
|
84
|
+
}
|
|
85
|
+
type PillarName = 'Answer Readiness' | 'Content Structure' | 'Trust & Authority' | 'Technical Foundation' | 'AI Discovery';
|
|
86
|
+
declare const PILLARS: Record<PillarName, string[]>;
|
|
87
|
+
declare const CLIENT_NAMES: Record<string, string>;
|
|
88
|
+
declare function getCriterionPillar(criterionId: string): string;
|
|
89
|
+
declare function computePillarScores(criteria: CriterionResult[]): PillarScores;
|
|
90
|
+
declare function computeTopFixes(criteria: CriterionResult[], count?: number): TopFix[];
|
|
91
|
+
|
|
65
92
|
/**
|
|
66
93
|
* AEORank type definitions.
|
|
67
94
|
* Inlined from @aeo/shared to keep the package zero-dependency.
|
|
@@ -76,6 +103,9 @@ interface ScoreCardItem {
|
|
|
76
103
|
score: number;
|
|
77
104
|
status: Status;
|
|
78
105
|
keyFindings: string;
|
|
106
|
+
pillar?: string;
|
|
107
|
+
clientName?: string;
|
|
108
|
+
weight?: number;
|
|
79
109
|
}
|
|
80
110
|
interface DetailedFinding {
|
|
81
111
|
type: FindingType;
|
|
@@ -120,6 +150,10 @@ interface PageReview {
|
|
|
120
150
|
strengths: PageIssue[];
|
|
121
151
|
aeoScore?: number;
|
|
122
152
|
criterionScores?: PageCriterionScore$1[];
|
|
153
|
+
pillarScores?: PillarScores;
|
|
154
|
+
estimatedSiteScore?: number;
|
|
155
|
+
scoreCapped?: boolean;
|
|
156
|
+
topFixes?: string[];
|
|
123
157
|
}
|
|
124
158
|
interface AuditData {
|
|
125
159
|
site: string;
|
|
@@ -134,6 +168,14 @@ interface AuditData {
|
|
|
134
168
|
pitchNumbers: PitchMetric[];
|
|
135
169
|
bottomLine: string;
|
|
136
170
|
pagesReviewed?: PageReview[];
|
|
171
|
+
pillarScores?: PillarScores;
|
|
172
|
+
coherenceGated?: boolean;
|
|
173
|
+
criteriaScored?: number;
|
|
174
|
+
topFixes?: Array<{
|
|
175
|
+
fix: string;
|
|
176
|
+
impact: string;
|
|
177
|
+
effort: string;
|
|
178
|
+
}>;
|
|
137
179
|
}
|
|
138
180
|
type AuditStatus = 'pass' | 'fail' | 'partial' | 'not_found';
|
|
139
181
|
type Priority = 'P0' | 'P1' | 'P2' | 'P3';
|
|
@@ -272,7 +314,7 @@ interface SitemapDateAnalysis {
|
|
|
272
314
|
declare function countRecentSitemapDates(sitemapText: string): SitemapDateAnalysis;
|
|
273
315
|
declare function extractRawDataSummary(data: SiteData): RawDataSummary;
|
|
274
316
|
/**
|
|
275
|
-
* Run all
|
|
317
|
+
* Run all 34 criteria checks using pre-fetched site data.
|
|
276
318
|
* All functions are synchronous (no HTTP calls) - data was already fetched.
|
|
277
319
|
*/
|
|
278
320
|
declare function auditSiteFromData(data: SiteData): CriterionResult[];
|
|
@@ -282,6 +324,7 @@ declare function auditSiteFromData(data: SiteData): CriterionResult[];
|
|
|
282
324
|
*/
|
|
283
325
|
declare function auditSite(targetUrl: string): Promise<CriterionResult[]>;
|
|
284
326
|
|
|
327
|
+
declare const WEIGHTS: Record<string, number>;
|
|
285
328
|
declare function calculateOverallScore(criteria: CriterionResult[]): number;
|
|
286
329
|
|
|
287
330
|
/**
|
|
@@ -350,6 +393,24 @@ interface CrawlOptions {
|
|
|
350
393
|
respectRobots?: boolean;
|
|
351
394
|
/** Include asset files — skipped by default */
|
|
352
395
|
includeAssets?: boolean;
|
|
396
|
+
/** Called after each batch with per-URL results */
|
|
397
|
+
onProgress?: (event: CrawlProgressEvent) => void;
|
|
398
|
+
}
|
|
399
|
+
interface CrawlProgressEvent {
|
|
400
|
+
/** URLs attempted in this batch */
|
|
401
|
+
urls: string[];
|
|
402
|
+
/** Whether each URL succeeded */
|
|
403
|
+
results: Array<{
|
|
404
|
+
url: string;
|
|
405
|
+
ok: boolean;
|
|
406
|
+
status?: number;
|
|
407
|
+
}>;
|
|
408
|
+
/** Total fetched so far */
|
|
409
|
+
fetched: number;
|
|
410
|
+
/** Total discovered so far */
|
|
411
|
+
discovered: number;
|
|
412
|
+
/** Max pages limit */
|
|
413
|
+
maxPages: number;
|
|
353
414
|
}
|
|
354
415
|
interface CrawlResult {
|
|
355
416
|
pages: FetchResult[];
|
|
@@ -381,7 +442,7 @@ declare function crawlFullSite(siteData: SiteData, options?: CrawlOptions): Prom
|
|
|
381
442
|
|
|
382
443
|
/**
|
|
383
444
|
* Per-page analysis for instant audit.
|
|
384
|
-
* Runs
|
|
445
|
+
* Runs 15 deterministic checks on each crawled page (no LLM).
|
|
385
446
|
*/
|
|
386
447
|
|
|
387
448
|
declare function analyzePage(html: string, url: string, category: PageCategory): PageReview;
|
|
@@ -389,8 +450,8 @@ declare function analyzeAllPages(siteData: SiteData): PageReview[];
|
|
|
389
450
|
|
|
390
451
|
/**
|
|
391
452
|
* Per-page AEO scoring.
|
|
392
|
-
* Evaluates
|
|
393
|
-
* Produces a 0-
|
|
453
|
+
* Evaluates 20 of 34 criteria that apply at individual page level.
|
|
454
|
+
* Produces a 0-75 AEO score per page (single-page cap at 75).
|
|
394
455
|
*/
|
|
395
456
|
|
|
396
457
|
interface PageCriterionScore {
|
|
@@ -402,10 +463,23 @@ interface PageCriterionScore {
|
|
|
402
463
|
interface PageScoreResult {
|
|
403
464
|
aeoScore: number;
|
|
404
465
|
criterionScores: PageCriterionScore[];
|
|
405
|
-
|
|
466
|
+
scoreCapped?: boolean;
|
|
467
|
+
}
|
|
468
|
+
/** 15. Citation-Ready Writing Quality */
|
|
469
|
+
declare function scoreCitationReadyWriting(html: string): number;
|
|
470
|
+
/** 16. Answer-First Placement */
|
|
471
|
+
declare function scoreAnswerFirstPlacement(html: string): number;
|
|
472
|
+
/** 17. Evidence Packaging */
|
|
473
|
+
declare function scoreEvidencePackaging(html: string): number;
|
|
474
|
+
/** 18. Entity Disambiguation */
|
|
475
|
+
declare function scoreEntityDisambiguation(html: string): number;
|
|
476
|
+
/** 19. Extraction Friction Score */
|
|
477
|
+
declare function scoreExtractionFriction(html: string): number;
|
|
478
|
+
/** 20. Image Context for AI */
|
|
479
|
+
declare function scoreImageContextAI(html: string): number;
|
|
406
480
|
/**
|
|
407
|
-
* Score a single page against
|
|
408
|
-
* Returns a 0-100 AEO score and individual criterion scores.
|
|
481
|
+
* Score a single page against 20 AEO criteria.
|
|
482
|
+
* Returns a 0-100 AEO score (capped at 75 for single pages) and individual criterion scores.
|
|
409
483
|
*/
|
|
410
484
|
declare function scorePage(html: string, url?: string): PageScoreResult;
|
|
411
485
|
/**
|
|
@@ -534,4 +608,4 @@ interface ComparisonResult {
|
|
|
534
608
|
*/
|
|
535
609
|
declare function compare(domainA: string, domainB: string, options?: AuditOptions): Promise<ComparisonResult>;
|
|
536
610
|
|
|
537
|
-
export { type AuditData, type AuditFinding, type AuditStatus, CRITERION_LABELS, type ComparisonResult, type CrawlOptions, type CrawlResult, type CriterionComparison, type CriterionDetail, type CriterionResult, type Deliverable, type DetailedFinding, type FetchResult, type FindingSeverity, type FindingType, type FixAction, type FixPhase, type FixPlan, type FixPlanSummary, type ImpactLevel, type LinkEdge, type LinkGraph, type LinkGraphStats, type PageCategory$1 as PageCategory, type PageCriterionScore$1 as PageCriterionScore, type PageIssue, type PageNode, type PageReview, type PageScoreResult, type ParkedDomainResult, type PitchMetric, type Priority, type RawDataSummary, type ScoreCardItem, type SerializedLinkGraph, type Severity, type SiteData, type SitemapDateAnalysis, type Status, type TopicCluster, analyzeAllPages, analyzePage, auditSite, auditSiteFromData, buildDetailedFindings, buildLinkGraph, buildScorecard, calculateOverallScore, compare, countRecentSitemapDates, crawlFullSite, detectParkedDomain, extractAllUrlsFromSitemap, extractContentPagesFromSitemap, extractInternalLinks, extractLinksWithAnchors, extractNavLinks, extractRawDataSummary, fetchMultiPageData, generateBottomLine, generateFixPlan, generateOpportunities, generatePitchNumbers, generateVerdict, inferCategory, prefetchSiteData, scoreAllPages, scorePage, scoreToStatus, serializeLinkGraph };
|
|
611
|
+
export { type AuditData, type AuditFinding, type AuditStatus, CLIENT_NAMES, CRITERION_LABELS, type ComparisonResult, type CrawlOptions, type CrawlProgressEvent, type CrawlResult, type CriterionComparison, type CriterionDetail, type CriterionResult, type Deliverable, type DetailedFinding, type FetchResult, type FindingSeverity, type FindingType, type FixAction, type FixPhase, type FixPlan, type FixPlanSummary, type ImpactLevel, type LinkEdge, type LinkGraph, type LinkGraphStats, PILLARS, type PageCategory$1 as PageCategory, type PageCriterionScore$1 as PageCriterionScore, type PageIssue, type PageNode, type PageReview, type PageScoreResult, type ParkedDomainResult, type PillarName, type PillarScores, type PitchMetric, type Priority, type RawDataSummary, type ScoreCardItem, type SerializedLinkGraph, type Severity, type SiteData, type SitemapDateAnalysis, type Status, type TopFix, type TopicCluster, WEIGHTS, analyzeAllPages, analyzePage, auditSite, auditSiteFromData, buildDetailedFindings, buildLinkGraph, buildScorecard, calculateOverallScore, compare, computePillarScores, computeTopFixes, countRecentSitemapDates, crawlFullSite, detectParkedDomain, extractAllUrlsFromSitemap, extractContentPagesFromSitemap, extractInternalLinks, extractLinksWithAnchors, extractNavLinks, extractRawDataSummary, fetchMultiPageData, generateBottomLine, generateFixPlan, generateOpportunities, generatePitchNumbers, generateVerdict, getCriterionPillar, inferCategory, prefetchSiteData, scoreAllPages, scoreAnswerFirstPlacement, scoreCitationReadyWriting, scoreEntityDisambiguation, scoreEvidencePackaging, scoreExtractionFriction, scoreImageContextAI, scorePage, scoreToStatus, serializeLinkGraph };
|