@rivi-software/agentic-seo-check 0.4.0 → 0.6.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 +49 -7
- package/dist/cli.js +28 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/aeo/audit.d.ts +8 -0
- package/dist/core/aeo/audit.js +101 -17
- package/dist/core/aeo/audit.js.map +1 -1
- package/dist/core/aeo/bots.d.ts +48 -0
- package/dist/core/aeo/bots.js +151 -5
- package/dist/core/aeo/bots.js.map +1 -1
- package/dist/core/aeo/fixes.d.ts +38 -0
- package/dist/core/aeo/fixes.js +111 -0
- package/dist/core/aeo/fixes.js.map +1 -0
- package/dist/core/aeo/site-rules.d.ts +5 -0
- package/dist/core/aeo/site-rules.js +293 -10
- package/dist/core/aeo/site-rules.js.map +1 -1
- package/dist/core/audit.d.ts +8 -0
- package/dist/core/audit.js +144 -25
- package/dist/core/audit.js.map +1 -1
- package/dist/core/crawl.js +43 -4
- package/dist/core/crawl.js.map +1 -1
- package/dist/core/html/answer.d.ts +5 -2
- package/dist/core/html/answer.js +25 -7
- package/dist/core/html/answer.js.map +1 -1
- package/dist/core/html/dom.d.ts +13 -1
- package/dist/core/html/dom.js +30 -2
- package/dist/core/html/dom.js.map +1 -1
- package/dist/core/html/extract.js +122 -30
- package/dist/core/html/extract.js.map +1 -1
- package/dist/core/html/head.js +114 -19
- package/dist/core/html/head.js.map +1 -1
- package/dist/core/html/resources.js +15 -7
- package/dist/core/html/resources.js.map +1 -1
- package/dist/core/html/structured-data.js +21 -5
- package/dist/core/html/structured-data.js.map +1 -1
- package/dist/core/lighthouse.d.ts +5 -6
- package/dist/core/lighthouse.js +297 -7
- package/dist/core/lighthouse.js.map +1 -1
- package/dist/core/performance-fixes.d.ts +25 -0
- package/dist/core/performance-fixes.js +446 -0
- package/dist/core/performance-fixes.js.map +1 -0
- package/dist/core/performance-rules.js +56 -8
- package/dist/core/performance-rules.js.map +1 -1
- package/dist/core/recheck.d.ts +68 -0
- package/dist/core/recheck.js +247 -0
- package/dist/core/recheck.js.map +1 -0
- package/dist/core/render-fixes.d.ts +27 -0
- package/dist/core/render-fixes.js +164 -0
- package/dist/core/render-fixes.js.map +1 -0
- package/dist/core/render-rules.js +60 -21
- package/dist/core/render-rules.js.map +1 -1
- package/dist/core/render.d.ts +9 -1
- package/dist/core/render.js +36 -2
- package/dist/core/render.js.map +1 -1
- package/dist/core/report/markdown.js +68 -1
- package/dist/core/report/markdown.js.map +1 -1
- package/dist/core/robots.d.ts +5 -0
- package/dist/core/robots.js +8 -0
- package/dist/core/robots.js.map +1 -1
- package/dist/core/rules/aeo.js +339 -25
- package/dist/core/rules/aeo.js.map +1 -1
- package/dist/core/rules/canonical.js +107 -11
- package/dist/core/rules/canonical.js.map +1 -1
- package/dist/core/rules/content.js +65 -7
- package/dist/core/rules/content.js.map +1 -1
- package/dist/core/rules/document.js +73 -8
- package/dist/core/rules/document.js.map +1 -1
- package/dist/core/rules/fix.d.ts +55 -0
- package/dist/core/rules/fix.js +159 -0
- package/dist/core/rules/fix.js.map +1 -0
- package/dist/core/rules/head.js +81 -4
- package/dist/core/rules/head.js.map +1 -1
- package/dist/core/rules/headings.js +92 -9
- package/dist/core/rules/headings.js.map +1 -1
- package/dist/core/rules/hreflang.js +79 -9
- package/dist/core/rules/hreflang.js.map +1 -1
- package/dist/core/rules/images.js +49 -0
- package/dist/core/rules/images.js.map +1 -1
- package/dist/core/rules/index.d.ts +11 -0
- package/dist/core/rules/index.js +21 -1
- package/dist/core/rules/index.js.map +1 -1
- package/dist/core/rules/indexing.js +108 -1
- package/dist/core/rules/indexing.js.map +1 -1
- package/dist/core/rules/keyword.js +91 -1
- package/dist/core/rules/keyword.js.map +1 -1
- package/dist/core/rules/links.js +42 -0
- package/dist/core/rules/links.js.map +1 -1
- package/dist/core/rules/loading.js +54 -1
- package/dist/core/rules/loading.js.map +1 -1
- package/dist/core/rules/meta.js +36 -5
- package/dist/core/rules/meta.js.map +1 -1
- package/dist/core/rules/page-fixes.d.ts +39 -0
- package/dist/core/rules/page-fixes.js +107 -0
- package/dist/core/rules/page-fixes.js.map +1 -0
- package/dist/core/rules/quoted-tags.d.ts +23 -0
- package/dist/core/rules/quoted-tags.js +79 -0
- package/dist/core/rules/quoted-tags.js.map +1 -0
- package/dist/core/rules/response.js +71 -7
- package/dist/core/rules/response.js.map +1 -1
- package/dist/core/rules/rule.d.ts +17 -4
- package/dist/core/rules/rule.js +11 -2
- package/dist/core/rules/rule.js.map +1 -1
- package/dist/core/rules/social.js +101 -10
- package/dist/core/rules/social.js.map +1 -1
- package/dist/core/rules/structured-data-fixes.d.ts +33 -0
- package/dist/core/rules/structured-data-fixes.js +469 -0
- package/dist/core/rules/structured-data-fixes.js.map +1 -0
- package/dist/core/rules/structured-data-values.js +242 -31
- package/dist/core/rules/structured-data-values.js.map +1 -1
- package/dist/core/rules/structured-data.js +171 -4
- package/dist/core/rules/structured-data.js.map +1 -1
- package/dist/core/rules/title.js +39 -5
- package/dist/core/rules/title.js.map +1 -1
- package/dist/core/rules/urls.js +166 -0
- package/dist/core/rules/urls.js.map +1 -1
- package/dist/core/site-fixes.d.ts +111 -0
- package/dist/core/site-fixes.js +650 -0
- package/dist/core/site-fixes.js.map +1 -0
- package/dist/core/site-rules.js +474 -53
- package/dist/core/site-rules.js.map +1 -1
- package/dist/core/sitemap.d.ts +16 -0
- package/dist/core/sitemap.js +34 -0
- package/dist/core/sitemap.js.map +1 -1
- package/dist/core/types.d.ts +223 -3
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +16 -2
- package/dist/mcp.js.map +1 -1
- package/package.json +5 -7
- package/skills/seo-audit/SKILL.md +23 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/core/report/markdown.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/core/report/markdown.ts"],"names":[],"mappings":"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"}
|
package/dist/core/robots.d.ts
CHANGED
|
@@ -12,6 +12,11 @@ export interface RobotsResult {
|
|
|
12
12
|
* on another origin is allowed: this robots.txt has no say over it.
|
|
13
13
|
*/
|
|
14
14
|
export declare const agentMatcher: (url: string, text: string) => ((target: string, agent: string) => boolean);
|
|
15
|
+
/**
|
|
16
|
+
* The line of robots.txt at `url` (1-based) whose rule decides whether `agent` may fetch `target`,
|
|
17
|
+
* or -1 when no rule matches, so a fix can quote the Disallow line that blocks a URL.
|
|
18
|
+
*/
|
|
19
|
+
export declare const ruleLineMatcher: (url: string, text: string) => ((target: string, agent: string) => number);
|
|
15
20
|
export declare const buildRobots: (url: string, status: number | null, error: string | undefined, text: string | null, userAgent: string) => RobotsResult;
|
|
16
21
|
export declare const loadRobotsTxt: (origin: string, userAgent: string, options?: FetchOptions) => Promise<RobotsResult>;
|
|
17
22
|
/** Short bot token used for robots.txt matching, derived from the full UA string. */
|
package/dist/core/robots.js
CHANGED
|
@@ -14,6 +14,14 @@ export const agentMatcher = (url, text) => {
|
|
|
14
14
|
const robot = robotsParser(url, text.slice(0, MAX_ROBOTS_BYTES));
|
|
15
15
|
return (target, agent) => robot.isAllowed(target, agent) ?? true;
|
|
16
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* The line of robots.txt at `url` (1-based) whose rule decides whether `agent` may fetch `target`,
|
|
19
|
+
* or -1 when no rule matches, so a fix can quote the Disallow line that blocks a URL.
|
|
20
|
+
*/
|
|
21
|
+
export const ruleLineMatcher = (url, text) => {
|
|
22
|
+
const robot = robotsParser(url, text.slice(0, MAX_ROBOTS_BYTES));
|
|
23
|
+
return (target, agent) => robot.getMatchingLineNumber(target, agent);
|
|
24
|
+
};
|
|
17
25
|
export const buildRobots = (url, status, error, text, userAgent) => {
|
|
18
26
|
const info = {
|
|
19
27
|
url,
|
package/dist/core/robots.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/core/robots.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/core/robots.ts"],"names":[],"mappings":"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"}
|
package/dist/core/rules/aeo.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { addProperty, directiveFixes, markupAt, scriptJson, statusLine, } from "../aeo/fixes.js";
|
|
1
2
|
import { articles, comparable, directivesFor, hasNoindex, hasNosnippet, isEntity, isHomePage, markedUpTexts, maxSnippet, nameOf, stripTags, typedNodes, } from "../aeo/page.js";
|
|
2
3
|
import { isJsonObject, isString } from "../html/structured-data.js";
|
|
4
|
+
import { collapseWhitespace } from "../html/text.js";
|
|
5
|
+
import { addHtml, escapeAttribute, escapeText, isCut, removeEdit, replaceEdit, replaceHtml, slot, withContent, withoutAttribute, } from "./fix.js";
|
|
3
6
|
import { parseRobotsHeader, robotsDirectives } from "./indexing.js";
|
|
4
7
|
import { cap, defineRule, GOOGLE_DOCS } from "./rule.js";
|
|
5
8
|
/** Answer engines' own documentation for the AEO rules. */
|
|
@@ -34,6 +37,212 @@ const metaSelector = (sources) => {
|
|
|
34
37
|
};
|
|
35
38
|
const isNoai = (d) => d === "noai" || d === "noimageai";
|
|
36
39
|
const yearOf = (value) => isString(value) ? (/^\d{4}/u.exec(value.trim())?.[0] ?? null) : null;
|
|
40
|
+
/* ---------------------------------------------------------------------------
|
|
41
|
+
* Fixes
|
|
42
|
+
* ------------------------------------------------------------------------- */
|
|
43
|
+
const ENGINE_META = new Set(["robots", "googlebot", "bingbot"]);
|
|
44
|
+
const GOOGLE_META = new Set(["robots", "googlebot"]);
|
|
45
|
+
const BING_META = new Set(["robots", "bingbot"]);
|
|
46
|
+
const GOOGLE_HEADER = new Set([null, "googlebot"]);
|
|
47
|
+
const BING_HEADER = new Set([null, "bingbot"]);
|
|
48
|
+
/** Drops the directives `drop` names and keeps the rest. */
|
|
49
|
+
const without = (...drop) => (d) => drop.includes(d) ? null : d;
|
|
50
|
+
/** noindex goes; "none" (noindex, nofollow) keeps its nofollow half. */
|
|
51
|
+
const allowIndexing = (d) => {
|
|
52
|
+
if (d === "noindex") {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return d === "none" ? "nofollow" : d;
|
|
56
|
+
};
|
|
57
|
+
/** A max-snippet below 100 characters becomes -1, no limit. */
|
|
58
|
+
const liftSnippetLimit = (d) => {
|
|
59
|
+
if (!d.startsWith("max-snippet:")) {
|
|
60
|
+
return d;
|
|
61
|
+
}
|
|
62
|
+
const n = Number(d.slice("max-snippet:".length));
|
|
63
|
+
return Number.isInteger(n) && n > 0 && n < 100 ? "max-snippet:-1" : d;
|
|
64
|
+
};
|
|
65
|
+
const PAGE_ERROR_WRITE = "Serve the page's HTML with status 200. If the page moved, answer 301 with a Location header to its new URL instead; if it is gone for good, remove the links to it.";
|
|
66
|
+
/** Text from structured data as page text: tags stripped, whitespace collapsed, escaped for HTML. */
|
|
67
|
+
const asHtmlText = (value) => escapeText(collapseWhitespace(stripTags(value)));
|
|
68
|
+
/** Whether a structured data object comes from microdata rather than JSON-LD. */
|
|
69
|
+
const isMicrodata = (page, node) => page.structuredData.some((i) => i.source === "microdata" && i.data === node);
|
|
70
|
+
/** The heading element that asks `question`, as the HTML writes it, skipping ones already used. */
|
|
71
|
+
const headingTag = (page, question, used) => {
|
|
72
|
+
const index = page.headings.findIndex((h, i) => !used.has(i) &&
|
|
73
|
+
(question.level === 0 || h.level === question.level) &&
|
|
74
|
+
comparable(h.text) === comparable(question.text));
|
|
75
|
+
const tag = page.markup.headings[index];
|
|
76
|
+
if (index === -1 || tag === undefined) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
used.add(index);
|
|
80
|
+
return tag;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* The edit that writes `html` right after the element `tag` quotes, or at `at` when there is no
|
|
84
|
+
* whole quote: a heading cut at 500 characters (an anchor icon's SVG makes one long) would be
|
|
85
|
+
* written back cut, with the rest of it lost.
|
|
86
|
+
*/
|
|
87
|
+
const addAfter = (tag, at, html, write) => tag && !isCut(tag)
|
|
88
|
+
? replaceHtml(tag, `${tag}\n${html}`, { at, write })
|
|
89
|
+
: addHtml(at, html, write);
|
|
90
|
+
/** Edits that put an answer right under each question heading that lacks a short one. */
|
|
91
|
+
const answerFixes = (page, weak) => {
|
|
92
|
+
const used = new Set();
|
|
93
|
+
return weak.map((q) => {
|
|
94
|
+
const at = q.level === 0 ? "summary, dt" : `h${q.level}`;
|
|
95
|
+
const write = q.sectionWords === 0
|
|
96
|
+
? `One or two sentences (under 60 words) that answer "${q.text}" directly.`
|
|
97
|
+
: `One or two sentences (under 60 words) that answer "${q.text}" directly, before the longer text that follows it now.`;
|
|
98
|
+
return addAfter(headingTag(page, q, used), at, `<p>${slot("direct answer")}</p>`, write);
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
const SHOW_MARKED_UP = "Show this text on the page, built from the same data as the JSON-LD (an FAQ or steps section is a good place). If the page should not show it, remove the item from the JSON-LD instead. If JavaScript adds it, render it on the server too.";
|
|
102
|
+
/** Edits that put marked-up questions, answers and steps the page does not show on the page. */
|
|
103
|
+
const showMarkedUpFixes = (page, texts, hidden) => {
|
|
104
|
+
const edits = [];
|
|
105
|
+
const steps = [];
|
|
106
|
+
const used = new Set();
|
|
107
|
+
let question = null;
|
|
108
|
+
let block = null;
|
|
109
|
+
const flush = () => {
|
|
110
|
+
if (block) {
|
|
111
|
+
edits.push(addHtml("body", block.join("\n"), SHOW_MARKED_UP));
|
|
112
|
+
block = null;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
for (const t of texts) {
|
|
116
|
+
if (t.type === "Question") {
|
|
117
|
+
flush();
|
|
118
|
+
question = t.text;
|
|
119
|
+
if (hidden.has(t)) {
|
|
120
|
+
block = [`<h3>${asHtmlText(t.text)}</h3>`];
|
|
121
|
+
}
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (!hidden.has(t)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const html = `<p>${asHtmlText(t.text)}</p>`;
|
|
128
|
+
if (t.type === "HowToStep") {
|
|
129
|
+
steps.push(` <li>${asHtmlText(t.text)}</li>`);
|
|
130
|
+
}
|
|
131
|
+
else if (block) {
|
|
132
|
+
block.push(html);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// The question is on the page; its answer goes right under it.
|
|
136
|
+
const tag = question
|
|
137
|
+
? headingTag(page, { level: 0, text: stripTags(question) }, used)
|
|
138
|
+
: null;
|
|
139
|
+
edits.push(addAfter(tag, "body", html, SHOW_MARKED_UP));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
flush();
|
|
143
|
+
if (steps.length) {
|
|
144
|
+
edits.push(addHtml("body", ["<ol>", ...steps, "</ol>"].join("\n"), SHOW_MARKED_UP));
|
|
145
|
+
}
|
|
146
|
+
return edits;
|
|
147
|
+
};
|
|
148
|
+
const AUTHOR_WRITE = "The name of the person who wrote the article and the URL of their page on this site; with no person behind it, use an Organization with name and url. It replaces an empty author.";
|
|
149
|
+
/** The author property for an article in JSON-LD or microdata, with slots for who wrote it. */
|
|
150
|
+
const authorProperty = {
|
|
151
|
+
json: `"author": {"@type": "Person", "name": "${slot("author's name")}", "url": "${slot("URL of the author's page")}"}`,
|
|
152
|
+
microdata: `<div itemprop="author" itemscope itemtype="https://schema.org/Person"><a itemprop="url" href="${slot("URL of the author's page")}"><span itemprop="name">${slot("author's name")}</span></a></div>`,
|
|
153
|
+
};
|
|
154
|
+
const DATE_PROPERTY = new Map([
|
|
155
|
+
[
|
|
156
|
+
"datePublished",
|
|
157
|
+
{
|
|
158
|
+
hint: "YYYY-MM-DD the article was first published",
|
|
159
|
+
write: "The date the article was first published, in ISO 8601: 2026-03-14, or 2026-03-14T09:30:00+01:00 with the time.",
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
[
|
|
163
|
+
"dateModified",
|
|
164
|
+
{
|
|
165
|
+
hint: "YYYY-MM-DD of the last real change",
|
|
166
|
+
write: "The date the content last changed materially (not every build), in ISO 8601; the same as datePublished if it never changed.",
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
]);
|
|
170
|
+
/** The date an article states: datePublished, else dateModified, as written. */
|
|
171
|
+
const articleDate = (node) => {
|
|
172
|
+
for (const key of ["datePublished", "dateModified"]) {
|
|
173
|
+
const value = node[key];
|
|
174
|
+
if (isString(value) && value.trim()) {
|
|
175
|
+
return value.trim();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return "";
|
|
179
|
+
};
|
|
180
|
+
const bareAuthors = (page) => articles(page).flatMap(({ node, types }) => {
|
|
181
|
+
const target = {
|
|
182
|
+
type: types[0] ?? "Article",
|
|
183
|
+
microdata: isMicrodata(page, node),
|
|
184
|
+
within: "author",
|
|
185
|
+
};
|
|
186
|
+
const authors = Array.isArray(node["author"])
|
|
187
|
+
? node["author"]
|
|
188
|
+
: [node["author"]];
|
|
189
|
+
return authors.flatMap((a) => {
|
|
190
|
+
if (isString(a) && a.trim()) {
|
|
191
|
+
return [{ name: a.trim(), json: JSON.stringify(a), target }];
|
|
192
|
+
}
|
|
193
|
+
if (isJsonObject(a) &&
|
|
194
|
+
a["url"] === undefined &&
|
|
195
|
+
a["sameAs"] === undefined) {
|
|
196
|
+
return [{ name: nameOf(a) ?? "(unnamed author)", json: null, target }];
|
|
197
|
+
}
|
|
198
|
+
return [];
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
/** The edits that give a bare author a url: the name becomes a Person, or the object gets a url. */
|
|
202
|
+
const authorUrlFix = (author) => {
|
|
203
|
+
const url = slot(`URL of ${author.name}'s author page`);
|
|
204
|
+
const write = `The URL of ${author.name}'s page on this site (or a profile that identifies them), and sameAs with their profiles elsewhere where they exist.`;
|
|
205
|
+
if (author.json !== null && !author.target.microdata) {
|
|
206
|
+
return [
|
|
207
|
+
replaceHtml(author.json, `{"@type": "Person", "name": ${scriptJson(author.name)}, "url": "${url}"}`, { at: markupAt(author.target), write }),
|
|
208
|
+
];
|
|
209
|
+
}
|
|
210
|
+
// A microdata author written as text has no item of its own: a <link itemprop="url"> inside it
|
|
211
|
+
// would give the article the url. The author element has to become a Person item first.
|
|
212
|
+
if (author.json !== null) {
|
|
213
|
+
const at = markupAt(author.target);
|
|
214
|
+
return [
|
|
215
|
+
addHtml(at, 'itemscope itemtype="https://schema.org/Person"', "These attributes on the author element itself, so it becomes a Person item that holds its name and url."),
|
|
216
|
+
replaceHtml(escapeText(author.name), `<span itemprop="name">${escapeText(author.name)}</span><link itemprop="url" href="${url}">`, { at, write }),
|
|
217
|
+
];
|
|
218
|
+
}
|
|
219
|
+
return [
|
|
220
|
+
addProperty(author.target, {
|
|
221
|
+
json: `"url": "${url}"`,
|
|
222
|
+
microdata: `<link itemprop="url" href="${url}">`,
|
|
223
|
+
}, write),
|
|
224
|
+
];
|
|
225
|
+
};
|
|
226
|
+
/** Organization JSON-LD for a home page, named after og:site_name when the page has one. */
|
|
227
|
+
const organizationFix = (page) => {
|
|
228
|
+
const siteName = page.og["site_name"];
|
|
229
|
+
const name = siteName
|
|
230
|
+
? scriptJson(siteName)
|
|
231
|
+
: `"${slot("organization name")}"`;
|
|
232
|
+
const code = [
|
|
233
|
+
'<script type="application/ld+json">',
|
|
234
|
+
"{",
|
|
235
|
+
' "@context": "https://schema.org",',
|
|
236
|
+
' "@type": "Organization",',
|
|
237
|
+
` "name": ${name},`,
|
|
238
|
+
` "url": ${scriptJson(new URL("/", page.url).href)},`,
|
|
239
|
+
` "logo": "${slot("absolute URL of the logo image")}",`,
|
|
240
|
+
` "sameAs": ["${slot("URL of an official profile")}"]`,
|
|
241
|
+
"}",
|
|
242
|
+
"</script>",
|
|
243
|
+
].join("\n");
|
|
244
|
+
return addHtml("head", code, `The organization's name, the absolute URL of its logo, and the URLs of its official profiles (LinkedIn, Wikipedia, Wikidata, social accounts). For a personal site use "@type": "Person" with the person's name.`);
|
|
245
|
+
};
|
|
37
246
|
export const aeoRules = [
|
|
38
247
|
defineRule({
|
|
39
248
|
id: "aeo.page-error",
|
|
@@ -48,11 +257,20 @@ export const aeoRules = [
|
|
|
48
257
|
}
|
|
49
258
|
if (response.error) {
|
|
50
259
|
return make(`The page could not be fetched: ${response.error}.`, {
|
|
260
|
+
fix: [
|
|
261
|
+
replaceEdit("http", `no response (${response.error})`, "HTTP/1.1 200 OK", { at: "status line", write: PAGE_ERROR_WRITE }),
|
|
262
|
+
],
|
|
51
263
|
evidence: { error: response.error },
|
|
52
264
|
});
|
|
53
265
|
}
|
|
54
266
|
return response.status !== null && response.status >= 400
|
|
55
267
|
? make(`The page answers HTTP ${response.status}.`, {
|
|
268
|
+
fix: [
|
|
269
|
+
replaceEdit("http", statusLine(response.status), "HTTP/1.1 200 OK", {
|
|
270
|
+
at: "status line",
|
|
271
|
+
write: PAGE_ERROR_WRITE,
|
|
272
|
+
}),
|
|
273
|
+
],
|
|
56
274
|
evidence: { status: response.status },
|
|
57
275
|
})
|
|
58
276
|
: null;
|
|
@@ -68,6 +286,16 @@ export const aeoRules = [
|
|
|
68
286
|
const r = robotsDirectives(page, response);
|
|
69
287
|
return r.noindex
|
|
70
288
|
? make(`Page is set to noindex via ${r.sources.join(" and ")}, so Google AI Overviews and AI Mode, Copilot and other answer engines built on a search index cannot cite it.`, {
|
|
289
|
+
fix: directiveFixes(page, response, {
|
|
290
|
+
metaNames: null,
|
|
291
|
+
headerAgents: new Set([
|
|
292
|
+
null,
|
|
293
|
+
"googlebot",
|
|
294
|
+
"googlebot-news",
|
|
295
|
+
"bingbot",
|
|
296
|
+
]),
|
|
297
|
+
change: allowIndexing,
|
|
298
|
+
}, "Apply this only if answer engines should cite the page: keep noindex on login, cart, internal search and other private pages, and check production before you change a preview host's X-Robots-Tag."),
|
|
71
299
|
selector: r.sources.includes("meta")
|
|
72
300
|
? 'head > meta[name="robots"]'
|
|
73
301
|
: undefined,
|
|
@@ -94,6 +322,11 @@ export const aeoRules = [
|
|
|
94
322
|
}
|
|
95
323
|
const sources = sourcesOf(page.answer.robotsMeta, response?.headers["x-robots-tag"], (d) => d === "nosnippet" || d === "max-snippet:0");
|
|
96
324
|
return make(`Page sets nosnippet for ${engines.join(" and ")} via ${sources.join(" and ")}, so its text cannot be quoted in AI answers.`, {
|
|
325
|
+
fix: directiveFixes(page, response, {
|
|
326
|
+
metaNames: ENGINE_META,
|
|
327
|
+
headerAgents: new Set([null, "googlebot", "bingbot"]),
|
|
328
|
+
change: without("nosnippet", "max-snippet:0"),
|
|
329
|
+
}, "Keep nosnippet if it is deliberate (a paywall, legal text). To hide one part of the page only, put data-nosnippet on that part instead."),
|
|
97
330
|
selector: metaSelector(sources),
|
|
98
331
|
evidence: { engines, sources },
|
|
99
332
|
});
|
|
@@ -112,7 +345,14 @@ export const aeoRules = [
|
|
|
112
345
|
limit > 0 &&
|
|
113
346
|
limit < 100 &&
|
|
114
347
|
!hasNoindex(directives)
|
|
115
|
-
? make(`max-snippet:${limit} lets Google quote at most ${limit} characters of this page.`, {
|
|
348
|
+
? make(`max-snippet:${limit} lets Google quote at most ${limit} characters of this page.`, {
|
|
349
|
+
fix: directiveFixes(page, response, {
|
|
350
|
+
metaNames: GOOGLE_META,
|
|
351
|
+
headerAgents: GOOGLE_HEADER,
|
|
352
|
+
change: liftSnippetLimit,
|
|
353
|
+
}, "max-snippet:-1 lets Google quote as much as an answer needs; a limit of 160 or more works too. Keep the short limit if it is deliberate."),
|
|
354
|
+
evidence: { maxSnippet: limit },
|
|
355
|
+
})
|
|
116
356
|
: null;
|
|
117
357
|
}),
|
|
118
358
|
defineRule({
|
|
@@ -131,7 +371,15 @@ export const aeoRules = [
|
|
|
131
371
|
return null;
|
|
132
372
|
}
|
|
133
373
|
const sources = sourcesOf(page.answer.robotsMeta.filter((m) => m.name !== "googlebot"), response?.headers["x-robots-tag"], (d) => d === "noarchive");
|
|
134
|
-
return make(`Page sets noarchive via ${sources.join(" and ")}, so Copilot leaves it out of its answers.`, {
|
|
374
|
+
return make(`Page sets noarchive via ${sources.join(" and ")}, so Copilot leaves it out of its answers.`, {
|
|
375
|
+
fix: directiveFixes(page, response, {
|
|
376
|
+
metaNames: BING_META,
|
|
377
|
+
headerAgents: BING_HEADER,
|
|
378
|
+
change: without("noarchive"),
|
|
379
|
+
}, "For a paywalled page, write nocache in place of noarchive: Copilot then cites its URL, title and snippet only. Keep noarchive if keeping the page out of Copilot is deliberate."),
|
|
380
|
+
selector: metaSelector(sources),
|
|
381
|
+
evidence: { sources },
|
|
382
|
+
});
|
|
135
383
|
}),
|
|
136
384
|
defineRule({
|
|
137
385
|
id: "aeo.nocache",
|
|
@@ -143,7 +391,13 @@ export const aeoRules = [
|
|
|
143
391
|
}, ({ page, response }, make) => {
|
|
144
392
|
const bing = directivesFor("bing", page, response);
|
|
145
393
|
return bing.includes("nocache") && !hasNoindex(bing)
|
|
146
|
-
? make("Page sets nocache, so Copilot may use only its URL, title and snippet."
|
|
394
|
+
? make("Page sets nocache, so Copilot may use only its URL, title and snippet.", {
|
|
395
|
+
fix: directiveFixes(page, response, {
|
|
396
|
+
metaNames: BING_META,
|
|
397
|
+
headerAgents: BING_HEADER,
|
|
398
|
+
change: without("nocache"),
|
|
399
|
+
}, "Keep nocache if Copilot should link to the page without quoting it, as for a paywall."),
|
|
400
|
+
})
|
|
147
401
|
: null;
|
|
148
402
|
}),
|
|
149
403
|
defineRule({
|
|
@@ -155,7 +409,15 @@ export const aeoRules = [
|
|
|
155
409
|
}, ({ page, response }, make) => {
|
|
156
410
|
const sources = sourcesOf(page.answer.robotsMeta, response?.headers["x-robots-tag"], isNoai);
|
|
157
411
|
return sources.length
|
|
158
|
-
? make(`Page sets noai/noimageai via ${sources.join(" and ")}; Google, Bing, OpenAI and Anthropic do not document support for it.`, {
|
|
412
|
+
? make(`Page sets noai/noimageai via ${sources.join(" and ")}; Google, Bing, OpenAI and Anthropic do not document support for it.`, {
|
|
413
|
+
fix: directiveFixes(page, response, {
|
|
414
|
+
metaNames: null,
|
|
415
|
+
headerAgents: null,
|
|
416
|
+
change: without("noai", "noimageai"),
|
|
417
|
+
}, "To keep the content out of AI training, say so in robots.txt instead: a `User-Agent: __usage_ai-training` group with `Disallow: /`, which Google, Microsoft, OpenAI and Anthropic back. Opting out of training is the owner's choice."),
|
|
418
|
+
selector: metaSelector(sources),
|
|
419
|
+
evidence: { sources },
|
|
420
|
+
})
|
|
159
421
|
: null;
|
|
160
422
|
}),
|
|
161
423
|
defineRule({
|
|
@@ -166,7 +428,7 @@ export const aeoRules = [
|
|
|
166
428
|
recommendation: "Keep data-nosnippet on boilerplate or paywalled parts only. The text answer engines should quote must be outside it.",
|
|
167
429
|
docs: GOOGLE_DOCS.robotsMeta,
|
|
168
430
|
}, ({ page }, make) => {
|
|
169
|
-
const { nosnippetWords, nosnippetElements, nosnippetSelectors } = page.answer;
|
|
431
|
+
const { nosnippetWords, nosnippetElements, nosnippetSelectors, nosnippetTags, } = page.answer;
|
|
170
432
|
if (!nosnippetWords || page.wordCount < 50) {
|
|
171
433
|
return null;
|
|
172
434
|
}
|
|
@@ -176,6 +438,19 @@ export const aeoRules = [
|
|
|
176
438
|
}
|
|
177
439
|
return make(`data-nosnippet hides ${nosnippetWords} of ${page.wordCount} words (${Math.round(share * 100)}%) from snippets and AI Overviews.`, {
|
|
178
440
|
severity: share >= 0.5 ? "warning" : "info",
|
|
441
|
+
fix: nosnippetSelectors.map((at, i) => {
|
|
442
|
+
const write = "Keep data-nosnippet on boilerplate and paywalled text; take it off the text answer engines should quote.";
|
|
443
|
+
const tag = nosnippetTags[i];
|
|
444
|
+
const rewritten = tag
|
|
445
|
+
? withoutAttribute(tag, "data-nosnippet")
|
|
446
|
+
: null;
|
|
447
|
+
return tag && rewritten
|
|
448
|
+
? replaceHtml(tag, rewritten, { at, write })
|
|
449
|
+
: removeEdit("html", "data-nosnippet", {
|
|
450
|
+
at,
|
|
451
|
+
write: `Delete the data-nosnippet attribute, with its value if it has one, from this element. ${write}`,
|
|
452
|
+
});
|
|
453
|
+
}),
|
|
179
454
|
selector: nosnippetSelectors[0],
|
|
180
455
|
evidence: {
|
|
181
456
|
elements: nosnippetElements,
|
|
@@ -200,7 +475,17 @@ export const aeoRules = [
|
|
|
200
475
|
const shell = emptyAppRoot
|
|
201
476
|
? `an empty app root (${emptyAppRoot})`
|
|
202
477
|
: "a <noscript> message asking for JavaScript";
|
|
478
|
+
const write = "The page's headings and text, rendered on the server: server-side rendering or static generation (Next.js server components, Nuxt SSR, SvelteKit or Astro prerendering, or a prerender step for a Vite or CRA app), so the HTML the server sends holds the content and the app hydrates it.";
|
|
479
|
+
const content = slot("the page's content as HTML");
|
|
480
|
+
const rootTag = page.answer.emptyAppRootTag;
|
|
481
|
+
// A quote cut at 500 characters (a wordless SVG spinner or skeleton in the root) would be
|
|
482
|
+
// written back cut, "…" and all: then the fix adds the content to the root instead.
|
|
483
|
+
const filled = rootTag && !isCut(rootTag) ? withContent(rootTag, content) : null;
|
|
484
|
+
const fix = rootTag && filled && emptyAppRoot
|
|
485
|
+
? replaceHtml(rootTag, filled, { at: emptyAppRoot, write })
|
|
486
|
+
: addHtml(emptyAppRoot ?? "body", content, write);
|
|
203
487
|
return make(`The HTML has ${page.wordCount} words of text and ${shell}. GPTBot, OAI-SearchBot, ClaudeBot and PerplexityBot do not run JavaScript, so they see an empty page.`, {
|
|
488
|
+
fix: [fix],
|
|
204
489
|
selector: emptyAppRoot ?? "noscript",
|
|
205
490
|
evidence: {
|
|
206
491
|
wordCount: page.wordCount,
|
|
@@ -220,6 +505,7 @@ export const aeoRules = [
|
|
|
220
505
|
(q.firstBlockWords ?? q.sectionWords) > LONG_ANSWER_WORDS);
|
|
221
506
|
return weak.length
|
|
222
507
|
? make(`${weak.length} of ${page.answer.questions.length} question heading(s) are not followed by a short direct answer.`, {
|
|
508
|
+
fix: answerFixes(page, weak),
|
|
223
509
|
evidence: {
|
|
224
510
|
questions: cap(weak.map((q) => ({
|
|
225
511
|
question: q.text,
|
|
@@ -240,7 +526,12 @@ export const aeoRules = [
|
|
|
240
526
|
!page.headings.some((h) => h.level >= 2) &&
|
|
241
527
|
page.answer.lists === 0 &&
|
|
242
528
|
page.answer.tables === 0
|
|
243
|
-
? make(`Page has ${page.wordCount} words without subheadings, lists or tables.`, {
|
|
529
|
+
? make(`Page has ${page.wordCount} words without subheadings, lists or tables.`, {
|
|
530
|
+
fix: [
|
|
531
|
+
addHtml("p", `<h2>${slot("what the next part covers")}</h2>`, "Before each paragraph that starts a new topic (every 150-300 words), an <h2> that names it. Put steps, options and comparisons in <ol>, <ul> or <table>."),
|
|
532
|
+
],
|
|
533
|
+
evidence: { wordCount: page.wordCount },
|
|
534
|
+
})
|
|
244
535
|
: null),
|
|
245
536
|
defineRule({
|
|
246
537
|
id: "aeo.schema-text-not-visible",
|
|
@@ -268,6 +559,7 @@ export const aeoRules = [
|
|
|
268
559
|
});
|
|
269
560
|
return hidden.length
|
|
270
561
|
? make(`${hidden.length} of ${texts.length} marked-up question(s), answer(s) or step(s) do not appear in the page's HTML text.`, {
|
|
562
|
+
fix: showMarkedUpFixes(page, texts, new Set(hidden)),
|
|
271
563
|
selector: 'script[type="application/ld+json"]',
|
|
272
564
|
evidence: {
|
|
273
565
|
missing: cap(hidden.map((t) => ({
|
|
@@ -295,6 +587,10 @@ export const aeoRules = [
|
|
|
295
587
|
});
|
|
296
588
|
return missing.length
|
|
297
589
|
? make(`${missing[0]?.types[0] ?? "Article"} structured data has no author.`, {
|
|
590
|
+
fix: missing.map(({ node, types }) => addProperty({
|
|
591
|
+
type: types[0] ?? "Article",
|
|
592
|
+
microdata: isMicrodata(page, node),
|
|
593
|
+
}, authorProperty, AUTHOR_WRITE)),
|
|
298
594
|
selector: 'script[type="application/ld+json"]',
|
|
299
595
|
evidence: { types: cap(missing.flatMap((m) => m.types)) },
|
|
300
596
|
})
|
|
@@ -308,26 +604,13 @@ export const aeoRules = [
|
|
|
308
604
|
recommendation: 'Write the author as {"@type": "Person", "name": ..., "url": ...}, with url pointing to an author page, and sameAs listing the person\'s profiles where they exist.',
|
|
309
605
|
docs: AEO_DOCS.article,
|
|
310
606
|
}, ({ page }, make) => {
|
|
311
|
-
const bare =
|
|
312
|
-
|
|
313
|
-
? node["author"]
|
|
314
|
-
: [node["author"]];
|
|
315
|
-
return authors.flatMap((a) => {
|
|
316
|
-
if (isString(a) && a.trim()) {
|
|
317
|
-
return [a.trim()];
|
|
318
|
-
}
|
|
319
|
-
if (isJsonObject(a) &&
|
|
320
|
-
a["url"] === undefined &&
|
|
321
|
-
a["sameAs"] === undefined) {
|
|
322
|
-
return [nameOf(a) ?? "(unnamed author)"];
|
|
323
|
-
}
|
|
324
|
-
return [];
|
|
325
|
-
});
|
|
326
|
-
});
|
|
607
|
+
const bare = bareAuthors(page);
|
|
608
|
+
const names = bare.map((a) => a.name);
|
|
327
609
|
return bare.length
|
|
328
|
-
? make(`Article author ${
|
|
610
|
+
? make(`Article author ${names.map((n) => `"${n}"`).join(", ")} has no url or sameAs.`, {
|
|
611
|
+
fix: bare.flatMap(authorUrlFix),
|
|
329
612
|
selector: 'script[type="application/ld+json"]',
|
|
330
|
-
evidence: { authors: cap(
|
|
613
|
+
evidence: { authors: cap(names) },
|
|
331
614
|
})
|
|
332
615
|
: null;
|
|
333
616
|
}),
|
|
@@ -352,6 +635,19 @@ export const aeoRules = [
|
|
|
352
635
|
}
|
|
353
636
|
return make(`${article.types[0] ?? "Article"} structured data has no ${missing.join(" or ")}.`, {
|
|
354
637
|
severity: missing.includes("datePublished") ? "warning" : "info",
|
|
638
|
+
fix: missing.map((property) => {
|
|
639
|
+
const { hint, write } = DATE_PROPERTY.get(property) ?? {
|
|
640
|
+
hint: "YYYY-MM-DD",
|
|
641
|
+
write: "A date in ISO 8601.",
|
|
642
|
+
};
|
|
643
|
+
return addProperty({
|
|
644
|
+
type: article.types[0] ?? "Article",
|
|
645
|
+
microdata: isMicrodata(page, article.node),
|
|
646
|
+
}, {
|
|
647
|
+
json: `"${property}": "${slot(hint)}"`,
|
|
648
|
+
microdata: `<meta itemprop="${property}" content="${slot(hint)}">`,
|
|
649
|
+
}, write);
|
|
650
|
+
}),
|
|
355
651
|
selector: 'script[type="application/ld+json"]',
|
|
356
652
|
evidence: { missing },
|
|
357
653
|
});
|
|
@@ -378,7 +674,12 @@ export const aeoRules = [
|
|
|
378
674
|
years.some((y) => page.text.includes(y))) {
|
|
379
675
|
return null;
|
|
380
676
|
}
|
|
677
|
+
const date = articleDate(article.node);
|
|
678
|
+
const h1 = page.headings.findIndex((h) => h.level === 1);
|
|
381
679
|
return make("Article has a date in its structured data, but none on the page.", {
|
|
680
|
+
fix: [
|
|
681
|
+
addAfter(page.markup.headings[h1] ?? null, h1 === -1 ? "body" : "h1", `<p><time datetime="${escapeAttribute(date)}">${slot("the date for readers")}</time></p>`, `${JSON.stringify(date)} written the way the page writes dates (14 March 2026), next to the title or byline, after a word such as "Published" or "Updated".`),
|
|
682
|
+
],
|
|
382
683
|
evidence: {
|
|
383
684
|
datePublished: article.node["datePublished"] ?? null,
|
|
384
685
|
dateModified: article.node["dateModified"] ?? null,
|
|
@@ -396,7 +697,9 @@ export const aeoRules = [
|
|
|
396
697
|
isHomePage(page.url) &&
|
|
397
698
|
page.wordCount > 0 &&
|
|
398
699
|
!typedNodes(page.structuredData).some(isEntity)
|
|
399
|
-
? make("Home page has no Organization or Person structured data."
|
|
700
|
+
? make("Home page has no Organization or Person structured data.", {
|
|
701
|
+
fix: [organizationFix(page)],
|
|
702
|
+
})
|
|
400
703
|
: null),
|
|
401
704
|
defineRule({
|
|
402
705
|
id: "aeo.entity-same-as-missing",
|
|
@@ -409,6 +712,17 @@ export const aeoRules = [
|
|
|
409
712
|
const bare = typedNodes(page.structuredData).filter((n) => n.topLevel && isEntity(n) && n.node["sameAs"] === undefined);
|
|
410
713
|
return bare.length
|
|
411
714
|
? make(`${bare[0]?.types[0] ?? "Organization"} "${nameOf(bare[0]?.node["name"]) ?? "unnamed"}" has no sameAs links.`, {
|
|
715
|
+
fix: bare.map((n) => {
|
|
716
|
+
const name = nameOf(n.node["name"]);
|
|
717
|
+
return addProperty({
|
|
718
|
+
type: n.types[0] ?? "Organization",
|
|
719
|
+
name,
|
|
720
|
+
microdata: isMicrodata(page, n.node),
|
|
721
|
+
}, {
|
|
722
|
+
json: `"sameAs": ["${slot("URL of an official profile")}", "${slot("URL of another profile")}"]`,
|
|
723
|
+
microdata: `<link itemprop="sameAs" href="${slot("URL of an official profile")}">`,
|
|
724
|
+
}, `The URLs of ${name ?? "the entity"}'s official profiles: Wikipedia, Wikidata, LinkedIn, social accounts. List as many as exist; drop the second slot if there is only one.`);
|
|
725
|
+
}),
|
|
412
726
|
selector: 'script[type="application/ld+json"]',
|
|
413
727
|
evidence: {
|
|
414
728
|
entities: cap(bare.map((n) => ({
|