@rivi-software/agentic-seo-check 0.1.0 → 0.1.1
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/LICENSE +1 -1
- package/README.md +65 -15
- package/dist/brand.d.ts +11 -0
- package/dist/brand.js +22 -0
- package/dist/brand.js.map +1 -0
- package/dist/cli.js +125 -80
- package/dist/cli.js.map +1 -1
- package/dist/core/audit.d.ts +16 -16
- package/dist/core/audit.js +363 -248
- package/dist/core/audit.js.map +1 -1
- package/dist/core/concurrency.d.ts +4 -4
- package/dist/core/concurrency.js +33 -23
- package/dist/core/concurrency.js.map +1 -1
- package/dist/core/crawl.d.ts +5 -5
- package/dist/core/crawl.js +250 -121
- package/dist/core/crawl.js.map +1 -1
- package/dist/core/fetch.d.ts +5 -5
- package/dist/core/fetch.js +151 -100
- package/dist/core/fetch.js.map +1 -1
- package/dist/core/html/dom.d.ts +13 -0
- package/dist/core/html/dom.js +17 -0
- package/dist/core/html/dom.js.map +1 -0
- package/dist/core/html/extract.d.ts +2 -2
- package/dist/core/html/extract.js +168 -111
- package/dist/core/html/extract.js.map +1 -1
- package/dist/core/html/structured-data.d.ts +16 -6
- package/dist/core/html/structured-data.js +180 -145
- package/dist/core/html/structured-data.js.map +1 -1
- package/dist/core/html/text.d.ts +14 -14
- package/dist/core/html/text.js +110 -107
- package/dist/core/html/text.js.map +1 -1
- package/dist/core/lighthouse.d.ts +26 -25
- package/dist/core/lighthouse.js +181 -105
- package/dist/core/lighthouse.js.map +1 -1
- package/dist/core/performance-rules.d.ts +2 -2
- package/dist/core/performance-rules.js +105 -33
- package/dist/core/performance-rules.js.map +1 -1
- package/dist/core/render-rules.d.ts +5 -4
- package/dist/core/render-rules.js +129 -62
- package/dist/core/render-rules.js.map +1 -1
- package/dist/core/render.d.ts +2 -2
- package/dist/core/render.js +29 -23
- package/dist/core/render.js.map +1 -1
- package/dist/core/report/markdown.d.ts +2 -2
- package/dist/core/report/markdown.js +110 -131
- package/dist/core/report/markdown.js.map +1 -1
- package/dist/core/robots.d.ts +5 -5
- package/dist/core/robots.js +31 -16
- package/dist/core/robots.js.map +1 -1
- package/dist/core/rules/canonical.d.ts +1 -1
- package/dist/core/rules/canonical.js +93 -57
- package/dist/core/rules/canonical.js.map +1 -1
- package/dist/core/rules/content.js +40 -26
- package/dist/core/rules/content.js.map +1 -1
- package/dist/core/rules/document.js +64 -41
- package/dist/core/rules/document.js.map +1 -1
- package/dist/core/rules/headings.js +58 -38
- package/dist/core/rules/headings.js.map +1 -1
- package/dist/core/rules/hreflang.js +70 -38
- package/dist/core/rules/hreflang.js.map +1 -1
- package/dist/core/rules/images.js +44 -26
- package/dist/core/rules/images.js.map +1 -1
- package/dist/core/rules/index.d.ts +6 -6
- package/dist/core/rules/index.js +36 -35
- package/dist/core/rules/index.js.map +1 -1
- package/dist/core/rules/indexing.d.ts +2 -2
- package/dist/core/rules/indexing.js +48 -26
- package/dist/core/rules/indexing.js.map +1 -1
- package/dist/core/rules/keyword.js +84 -47
- package/dist/core/rules/keyword.js.map +1 -1
- package/dist/core/rules/links.js +72 -37
- package/dist/core/rules/links.js.map +1 -1
- package/dist/core/rules/meta.js +55 -34
- package/dist/core/rules/meta.js.map +1 -1
- package/dist/core/rules/response.js +75 -41
- package/dist/core/rules/response.js.map +1 -1
- package/dist/core/rules/rule.d.ts +6 -6
- package/dist/core/rules/rule.js +36 -36
- package/dist/core/rules/rule.js.map +1 -1
- package/dist/core/rules/social.js +86 -45
- package/dist/core/rules/social.js.map +1 -1
- package/dist/core/rules/structured-data.d.ts +6 -4
- package/dist/core/rules/structured-data.js +314 -102
- package/dist/core/rules/structured-data.js.map +1 -1
- package/dist/core/rules/title.js +48 -33
- package/dist/core/rules/title.js.map +1 -1
- package/dist/core/score.d.ts +3 -3
- package/dist/core/score.js +11 -9
- package/dist/core/score.js.map +1 -1
- package/dist/core/site-rules.d.ts +3 -3
- package/dist/core/site-rules.js +409 -198
- package/dist/core/site-rules.js.map +1 -1
- package/dist/core/sitemap.d.ts +5 -5
- package/dist/core/sitemap.js +109 -64
- package/dist/core/sitemap.js.map +1 -1
- package/dist/core/static.d.ts +2 -2
- package/dist/core/static.js +209 -112
- package/dist/core/static.js.map +1 -1
- package/dist/core/summary.d.ts +2 -2
- package/dist/core/summary.js +11 -6
- package/dist/core/summary.js.map +1 -1
- package/dist/core/types.d.ts +14 -14
- package/dist/core/types.js +15 -8
- package/dist/core/types.js.map +1 -1
- package/dist/core/url.d.ts +11 -11
- package/dist/core/url.js +122 -70
- package/dist/core/url.js.map +1 -1
- package/dist/index.d.ts +11 -11
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/mcp-bin.js +7 -4
- package/dist/mcp-bin.js.map +1 -1
- package/dist/mcp.d.ts +3 -3
- package/dist/mcp.js +312 -122
- package/dist/mcp.js.map +1 -1
- package/dist/version.d.ts +0 -1
- package/dist/version.js +4 -2
- package/dist/version.js.map +1 -1
- package/package.json +27 -9
package/dist/core/static.js
CHANGED
|
@@ -1,85 +1,173 @@
|
|
|
1
|
-
import { promises as fs } from
|
|
2
|
-
import path from
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { buildRobots } from
|
|
6
|
-
import { parseSitemap } from
|
|
7
|
-
import { normalizePath, normalizeUrl } from
|
|
8
|
-
const SKIP_DIRS = new Set([
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
for (const
|
|
23
|
-
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { DEFAULT_USER_AGENT } from "./fetch.js";
|
|
4
|
+
import { extractPage } from "./html/extract.js";
|
|
5
|
+
import { buildRobots } from "./robots.js";
|
|
6
|
+
import { parseSitemap } from "./sitemap.js";
|
|
7
|
+
import { normalizePath, normalizeUrl } from "./url.js";
|
|
8
|
+
const SKIP_DIRS = new Set([
|
|
9
|
+
"node_modules",
|
|
10
|
+
".git",
|
|
11
|
+
".next",
|
|
12
|
+
".nuxt",
|
|
13
|
+
".svelte-kit",
|
|
14
|
+
".cache",
|
|
15
|
+
".vercel",
|
|
16
|
+
".output/server",
|
|
17
|
+
]);
|
|
18
|
+
const MISSING_FILE = "No matching file in output directory";
|
|
19
|
+
const walk = async (dir) => {
|
|
20
|
+
const out = [];
|
|
21
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
if (entry.name.startsWith(".") && entry.name !== ".well-known") {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const full = path.join(dir, entry.name);
|
|
27
|
+
if (entry.isDirectory()) {
|
|
28
|
+
if (SKIP_DIRS.has(entry.name)) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
// oxlint-disable-next-line eslint/no-await-in-loop -- the walk reads one directory at a time, so a deep tree never opens thousands of handles at once
|
|
32
|
+
out.push(...(await walk(full)));
|
|
33
|
+
}
|
|
34
|
+
else if (entry.isFile()) {
|
|
35
|
+
out.push(full);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
};
|
|
40
|
+
const fileExists = async (root, pathname) => {
|
|
41
|
+
let decoded = pathname;
|
|
42
|
+
try {
|
|
43
|
+
decoded = decodeURIComponent(pathname);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
/* keep */
|
|
47
|
+
}
|
|
48
|
+
const candidates = [
|
|
49
|
+
decoded,
|
|
50
|
+
`${decoded}.html`,
|
|
51
|
+
`${decoded}.htm`,
|
|
52
|
+
path.posix.join(decoded, "index.html"),
|
|
53
|
+
path.posix.join(decoded, "index.htm"),
|
|
54
|
+
];
|
|
55
|
+
for (const c of candidates) {
|
|
56
|
+
const full = path.join(root, c);
|
|
57
|
+
if (!full.startsWith(root)) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// oxlint-disable-next-line eslint/no-await-in-loop -- the candidates are tried in order and the first file found ends the search
|
|
61
|
+
const stat = await fs.stat(full).catch(() => null);
|
|
62
|
+
if (stat?.isFile()) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
};
|
|
68
|
+
/** The check a link gets in a directory audit: 200 when the file is there, 404 when not. */
|
|
69
|
+
const fileCheck = (url, finalUrl, exists) => ({
|
|
70
|
+
url,
|
|
71
|
+
status: exists ? 200 : 404,
|
|
72
|
+
finalUrl,
|
|
73
|
+
redirectChain: [],
|
|
74
|
+
error: exists ? undefined : MISSING_FILE,
|
|
75
|
+
});
|
|
76
|
+
const readPages = async (root, files, base, options, toUrlPath) => {
|
|
24
77
|
const records = [];
|
|
25
|
-
const linkChecks = new Map();
|
|
26
|
-
const linkSources = new Map();
|
|
27
78
|
const recordByKey = new Map();
|
|
28
|
-
for (const file of
|
|
29
|
-
|
|
30
|
-
const
|
|
79
|
+
for (const file of files) {
|
|
80
|
+
// oxlint-disable-next-line eslint/no-await-in-loop -- one file at a time on purpose: a build can hold thousands of pages
|
|
81
|
+
const html = await fs.readFile(file, "utf-8");
|
|
82
|
+
const urlPath = toUrlPath(file).replace(/\/index\.html?$/iu, "/");
|
|
31
83
|
const url = new URL(urlPath, base).href;
|
|
32
|
-
const page = extractPage(html, {
|
|
33
|
-
|
|
84
|
+
const page = extractPage(html, {
|
|
85
|
+
url,
|
|
86
|
+
siteHost: base.hostname,
|
|
87
|
+
includeSubdomains: options.includeSubdomains,
|
|
88
|
+
});
|
|
89
|
+
const record = {
|
|
90
|
+
url,
|
|
91
|
+
requestedUrl: url,
|
|
92
|
+
page,
|
|
93
|
+
depth: -1,
|
|
94
|
+
file: path.relative(root, file),
|
|
95
|
+
};
|
|
34
96
|
records.push(record);
|
|
35
97
|
recordByKey.set(normalizePath(new URL(url).pathname), record);
|
|
36
98
|
}
|
|
99
|
+
return { records, recordByKey };
|
|
100
|
+
};
|
|
101
|
+
/** Every internal link of every page, checked against the files in the directory. */
|
|
102
|
+
const checkLinks = async (root, records, fileByPathKey) => {
|
|
103
|
+
const linkChecks = new Map();
|
|
104
|
+
const linkSources = new Map();
|
|
37
105
|
for (const record of records) {
|
|
38
106
|
for (const link of record.page.links) {
|
|
39
|
-
if (!link.internal || !link.url)
|
|
107
|
+
if (!link.internal || !link.url) {
|
|
40
108
|
continue;
|
|
109
|
+
}
|
|
41
110
|
const target = normalizeUrl(link.url) ?? link.url;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
111
|
+
let sources = linkSources.get(target);
|
|
112
|
+
if (!sources) {
|
|
113
|
+
sources = new Set();
|
|
114
|
+
linkSources.set(target, sources);
|
|
115
|
+
}
|
|
116
|
+
sources.add(record.url);
|
|
45
117
|
if (!linkChecks.has(target)) {
|
|
46
|
-
const
|
|
47
|
-
const exists = fileByPathKey.has(
|
|
48
|
-
|
|
118
|
+
const { pathname } = new URL(target);
|
|
119
|
+
const exists = fileByPathKey.has(normalizePath(pathname)) ||
|
|
120
|
+
// oxlint-disable-next-line eslint/no-await-in-loop -- a target is checked once, so the next link to it must see this check
|
|
121
|
+
(await fileExists(root, pathname));
|
|
122
|
+
linkChecks.set(target, fileCheck(target, target, exists));
|
|
49
123
|
}
|
|
50
124
|
}
|
|
51
125
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
126
|
+
return { linkChecks, linkSources };
|
|
127
|
+
};
|
|
128
|
+
/** Depth via breadth-first search from the root index (if present); returns the start page. */
|
|
129
|
+
const assignDepths = (records, recordByKey) => {
|
|
130
|
+
const start = recordByKey.get("/") ?? records[0];
|
|
131
|
+
if (!start) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
start.depth = 0;
|
|
135
|
+
const queue = [start];
|
|
136
|
+
for (let current = queue.shift(); current; current = queue.shift()) {
|
|
137
|
+
for (const link of current.page.links) {
|
|
138
|
+
if (!link.internal || !link.url) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const target = recordByKey.get(normalizePath(new URL(link.url).pathname));
|
|
142
|
+
if (target && target.depth === -1) {
|
|
143
|
+
target.depth = current.depth + 1;
|
|
144
|
+
queue.push(target);
|
|
67
145
|
}
|
|
68
146
|
}
|
|
69
147
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
148
|
+
return start;
|
|
149
|
+
};
|
|
150
|
+
/** sitemap.xml, and the sitemaps robots.txt names, read from the output directory. */
|
|
151
|
+
const readSitemaps = async (root, base, robots) => {
|
|
152
|
+
const sitemaps = {
|
|
153
|
+
sources: [],
|
|
154
|
+
urls: [],
|
|
155
|
+
urlCount: 0,
|
|
156
|
+
errors: [],
|
|
157
|
+
};
|
|
158
|
+
const candidates = [
|
|
159
|
+
...new Set([...robots.info.sitemaps, new URL("/sitemap.xml", base).href]),
|
|
160
|
+
];
|
|
77
161
|
const seen = new Set();
|
|
78
162
|
const urls = new Set();
|
|
79
|
-
while (
|
|
80
|
-
const candidate =
|
|
81
|
-
if (
|
|
163
|
+
while (seen.size < 25) {
|
|
164
|
+
const candidate = candidates.shift();
|
|
165
|
+
if (candidate === undefined) {
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
if (seen.has(candidate)) {
|
|
82
169
|
continue;
|
|
170
|
+
}
|
|
83
171
|
seen.add(candidate);
|
|
84
172
|
let pathname;
|
|
85
173
|
try {
|
|
@@ -90,26 +178,36 @@ export async function scanDirectory(dir, options) {
|
|
|
90
178
|
continue;
|
|
91
179
|
}
|
|
92
180
|
const file = path.join(root, pathname);
|
|
93
|
-
|
|
181
|
+
// oxlint-disable-next-line eslint/no-await-in-loop -- a sitemap index adds the sitemaps it lists to the candidates, so each read decides what comes next
|
|
182
|
+
const xml = await fs.readFile(file, "utf-8").catch(() => null);
|
|
94
183
|
if (xml === null) {
|
|
95
|
-
if (robots.info.sitemaps.includes(candidate))
|
|
184
|
+
if (robots.info.sitemaps.includes(candidate)) {
|
|
96
185
|
sitemaps.errors.push(`${candidate}: declared in robots.txt but ${pathname} is not in the output directory`);
|
|
186
|
+
}
|
|
97
187
|
continue;
|
|
98
188
|
}
|
|
99
189
|
const parsed = parseSitemap(xml);
|
|
100
|
-
if (parsed.kind ===
|
|
190
|
+
if (parsed.kind === "unknown") {
|
|
101
191
|
sitemaps.errors.push(`${pathname}: could not parse as a sitemap`);
|
|
102
192
|
continue;
|
|
103
193
|
}
|
|
104
194
|
sitemaps.sources.push(candidate);
|
|
105
|
-
if (parsed.kind ===
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
195
|
+
if (parsed.kind === "sitemapindex") {
|
|
196
|
+
candidates.push(...parsed.locs);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
for (const loc of parsed.locs) {
|
|
200
|
+
urls.add(loc);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
109
203
|
}
|
|
110
204
|
sitemaps.urls = [...urls];
|
|
111
205
|
sitemaps.urlCount = urls.size;
|
|
112
|
-
|
|
206
|
+
return sitemaps;
|
|
207
|
+
};
|
|
208
|
+
/** A check for each sitemap URL, against the files in the directory, unless a link had one. */
|
|
209
|
+
const checkSitemapUrls = (urls, base, fileByPathKey, linkChecks) => {
|
|
210
|
+
for (const u of urls) {
|
|
113
211
|
let key;
|
|
114
212
|
try {
|
|
115
213
|
key = normalizePath(new URL(u).pathname);
|
|
@@ -117,11 +215,44 @@ export async function scanDirectory(dir, options) {
|
|
|
117
215
|
catch {
|
|
118
216
|
continue;
|
|
119
217
|
}
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
218
|
+
const synthetic = new URL(key === "/" ? "/" : key, base).href;
|
|
219
|
+
if (!linkChecks.has(synthetic)) {
|
|
220
|
+
linkChecks.set(synthetic, fileCheck(u, u, fileByPathKey.has(key)));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
export const scanDirectory = async (dir, options) => {
|
|
225
|
+
const started = performance.now();
|
|
226
|
+
const root = path.resolve(dir);
|
|
227
|
+
const stat = await fs.stat(root).catch(() => null);
|
|
228
|
+
if (!stat?.isDirectory()) {
|
|
229
|
+
throw new Error(`Not a directory: ${root}`);
|
|
230
|
+
}
|
|
231
|
+
const base = new URL(options.baseUrl.endsWith("/") ? options.baseUrl : `${options.baseUrl}/`);
|
|
232
|
+
const walked = await walk(root);
|
|
233
|
+
const files = walked.toSorted();
|
|
234
|
+
const htmlFiles = files.filter((f) => /\.html?$/iu.test(f));
|
|
235
|
+
const hitLimit = htmlFiles.length > options.maxPages;
|
|
236
|
+
const selected = htmlFiles.slice(0, options.maxPages);
|
|
237
|
+
const toUrlPath = (file) => `/${path.relative(root, file).split(path.sep).map(encodeURIComponent).join("/")}`;
|
|
238
|
+
const fileByPathKey = new Map();
|
|
239
|
+
for (const f of htmlFiles) {
|
|
240
|
+
fileByPathKey.set(normalizePath(toUrlPath(f)), f);
|
|
124
241
|
}
|
|
242
|
+
const { records, recordByKey } = await readPages(root, selected, base, options, toUrlPath);
|
|
243
|
+
const { linkChecks, linkSources } = await checkLinks(root, records, fileByPathKey);
|
|
244
|
+
const start = assignDepths(records, recordByKey);
|
|
245
|
+
const linkedKeys = new Set([...linkSources.keys()].map((u) => normalizePath(new URL(u).pathname)));
|
|
246
|
+
const unlinkedPages = records.flatMap((r) => r !== start && !linkedKeys.has(normalizePath(new URL(r.url).pathname))
|
|
247
|
+
? [r.file ?? r.url]
|
|
248
|
+
: []);
|
|
249
|
+
/* robots.txt and sitemap.xml from the output directory. */
|
|
250
|
+
const robotsText = await fs
|
|
251
|
+
.readFile(path.join(root, "robots.txt"), "utf-8")
|
|
252
|
+
.catch(() => null);
|
|
253
|
+
const robots = buildRobots(new URL("/robots.txt", base).href, robotsText === null ? 404 : 200, undefined, robotsText, options.userAgent ?? DEFAULT_USER_AGENT);
|
|
254
|
+
const sitemaps = await readSitemaps(root, base, robots);
|
|
255
|
+
checkSitemapUrls(sitemaps.urls, base, fileByPathKey, linkChecks);
|
|
125
256
|
return {
|
|
126
257
|
startUrl: base.href,
|
|
127
258
|
records,
|
|
@@ -129,7 +260,9 @@ export async function scanDirectory(dir, options) {
|
|
|
129
260
|
linkSources,
|
|
130
261
|
robots: robots.info,
|
|
131
262
|
robotsAllows: robots.info.found ? robots.allows : null,
|
|
132
|
-
blockedByRobots: robots.info.found
|
|
263
|
+
blockedByRobots: robots.info.found
|
|
264
|
+
? records.flatMap((r) => (robots.allows(r.url) ? [] : [r.url]))
|
|
265
|
+
: [],
|
|
133
266
|
sitemaps,
|
|
134
267
|
probes: {},
|
|
135
268
|
stats: {
|
|
@@ -144,41 +277,5 @@ export async function scanDirectory(dir, options) {
|
|
|
144
277
|
},
|
|
145
278
|
unlinkedPages,
|
|
146
279
|
};
|
|
147
|
-
}
|
|
148
|
-
async function walk(dir) {
|
|
149
|
-
const out = [];
|
|
150
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
151
|
-
for (const entry of entries) {
|
|
152
|
-
if (entry.name.startsWith('.') && entry.name !== '.well-known')
|
|
153
|
-
continue;
|
|
154
|
-
const full = path.join(dir, entry.name);
|
|
155
|
-
if (entry.isDirectory()) {
|
|
156
|
-
if (SKIP_DIRS.has(entry.name))
|
|
157
|
-
continue;
|
|
158
|
-
out.push(...(await walk(full)));
|
|
159
|
-
}
|
|
160
|
-
else if (entry.isFile())
|
|
161
|
-
out.push(full);
|
|
162
|
-
}
|
|
163
|
-
return out;
|
|
164
|
-
}
|
|
165
|
-
async function fileExists(root, pathname) {
|
|
166
|
-
let decoded = pathname;
|
|
167
|
-
try {
|
|
168
|
-
decoded = decodeURIComponent(pathname);
|
|
169
|
-
}
|
|
170
|
-
catch {
|
|
171
|
-
/* keep */
|
|
172
|
-
}
|
|
173
|
-
const candidates = [decoded, `${decoded}.html`, `${decoded}.htm`, path.posix.join(decoded, 'index.html'), path.posix.join(decoded, 'index.htm')];
|
|
174
|
-
for (const c of candidates) {
|
|
175
|
-
const full = path.join(root, c);
|
|
176
|
-
if (!full.startsWith(root))
|
|
177
|
-
continue;
|
|
178
|
-
const stat = await fs.stat(full).catch(() => null);
|
|
179
|
-
if (stat?.isFile())
|
|
180
|
-
return true;
|
|
181
|
-
}
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
280
|
+
};
|
|
184
281
|
//# sourceMappingURL=static.js.map
|
package/dist/core/static.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/core/static.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/core/static.ts"],"names":[],"mappings":"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"}
|
package/dist/core/summary.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ExtractedPage, PageSummary, ResponseInfo } from
|
|
2
|
-
export declare
|
|
1
|
+
import type { ExtractedPage, PageSummary, ResponseInfo } from "./types.js";
|
|
2
|
+
export declare const buildSummary: (page: ExtractedPage, response?: ResponseInfo) => PageSummary;
|
package/dist/core/summary.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { robotsDirectives } from
|
|
2
|
-
export
|
|
1
|
+
import { robotsDirectives } from "./rules/indexing.js";
|
|
2
|
+
export const buildSummary = (page, response) => {
|
|
3
3
|
const robots = robotsDirectives(page, response);
|
|
4
4
|
return {
|
|
5
5
|
title: page.title,
|
|
@@ -13,16 +13,21 @@ export function buildSummary(page, response) {
|
|
|
13
13
|
h1: page.h1s,
|
|
14
14
|
headings: page.headings.slice(0, 40),
|
|
15
15
|
wordCount: page.wordCount,
|
|
16
|
-
images: {
|
|
16
|
+
images: {
|
|
17
|
+
total: page.images.length,
|
|
18
|
+
missingAlt: page.images.filter((i) => i.alt === null).length,
|
|
19
|
+
},
|
|
17
20
|
links: {
|
|
18
21
|
internal: page.links.filter((l) => l.internal).length,
|
|
19
22
|
external: page.links.filter((l) => l.url && !l.internal).length,
|
|
20
23
|
nofollow: page.links.filter((l) => l.nofollow).length,
|
|
21
24
|
},
|
|
22
25
|
openGraph: page.og,
|
|
23
|
-
twitterCard: page.twitter[
|
|
24
|
-
structuredDataTypes: [
|
|
26
|
+
twitterCard: page.twitter["card"] ?? null,
|
|
27
|
+
structuredDataTypes: [
|
|
28
|
+
...new Set(page.structuredData.flatMap((i) => i.types)),
|
|
29
|
+
],
|
|
25
30
|
hreflangCount: page.hreflang.length,
|
|
26
31
|
};
|
|
27
|
-
}
|
|
32
|
+
};
|
|
28
33
|
//# sourceMappingURL=summary.js.map
|
package/dist/core/summary.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/core/summary.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/core/summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAAmB,EACnB,QAAuB,EACV,EAAE;IACf,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEhD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;QACpC,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,qBAAqB,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC;QACxD,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,MAAM,CAAC,UAAU;QACzB,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG;QAC7D,EAAE,EAAE,IAAI,CAAC,GAAG;QACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACpC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE;YACN,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YACzB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,MAAM;SAC7D;QACD,KAAK,EAAE;YACL,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM;YACrD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM;YAC/D,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM;SACtD;QACD,SAAS,EAAE,IAAI,CAAC,EAAE;QAClB,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI;QACzC,mBAAmB,EAAE;YACnB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SACxD;QACD,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;KACpC,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Shared types for the SEO audit core. These shapes are the public contract
|
|
3
3
|
* of the CLI JSON output and the MCP tool results (`schemaVersion: 1`).
|
|
4
4
|
*/
|
|
5
|
-
export type Severity =
|
|
5
|
+
export type Severity = "error" | "warning" | "info";
|
|
6
6
|
export declare const SEVERITY_RANK: Record<Severity, number>;
|
|
7
|
-
export type Category =
|
|
8
|
-
export type Requirement =
|
|
7
|
+
export type Category = "title" | "meta" | "headings" | "canonical" | "indexing" | "document" | "social" | "images" | "links" | "international" | "structured-data" | "content" | "keyword" | "response" | "rendering" | "performance" | "site" | "tool";
|
|
8
|
+
export type Requirement = "render" | "lighthouse" | "crawl" | "keyword";
|
|
9
9
|
/** Static description of a rule, exposed through `seo_list_rules` / `agentic-seo-check rules`. */
|
|
10
10
|
export interface RuleMeta {
|
|
11
11
|
id: string;
|
|
@@ -68,13 +68,13 @@ export interface HreflangInfo {
|
|
|
68
68
|
url: string | null;
|
|
69
69
|
}
|
|
70
70
|
export interface StructuredDataItem {
|
|
71
|
-
source:
|
|
71
|
+
source: "json-ld" | "microdata";
|
|
72
72
|
types: string[];
|
|
73
73
|
context: string | null;
|
|
74
74
|
data: Record<string, unknown>;
|
|
75
75
|
}
|
|
76
76
|
export interface StructuredDataError {
|
|
77
|
-
source:
|
|
77
|
+
source: "json-ld";
|
|
78
78
|
message: string;
|
|
79
79
|
snippet: string;
|
|
80
80
|
}
|
|
@@ -177,9 +177,9 @@ export interface LighthouseAuditSummary {
|
|
|
177
177
|
displayValue: string | null;
|
|
178
178
|
}
|
|
179
179
|
export interface PerformanceResult {
|
|
180
|
-
tool:
|
|
180
|
+
tool: "lighthouse";
|
|
181
181
|
lighthouseVersion: string;
|
|
182
|
-
formFactor:
|
|
182
|
+
formFactor: "mobile" | "desktop";
|
|
183
183
|
requestedUrl: string;
|
|
184
184
|
finalUrl: string;
|
|
185
185
|
metrics: LighthouseMetrics;
|
|
@@ -188,7 +188,7 @@ export interface PerformanceResult {
|
|
|
188
188
|
agenticBrowsingAudits: LighthouseAuditSummary[];
|
|
189
189
|
}
|
|
190
190
|
export interface RenderComparison {
|
|
191
|
-
tool:
|
|
191
|
+
tool: "playwright";
|
|
192
192
|
renderedUrl: string;
|
|
193
193
|
consoleErrors: string[];
|
|
194
194
|
raw: RenderSnapshot;
|
|
@@ -204,10 +204,10 @@ export interface RenderSnapshot {
|
|
|
204
204
|
internalLinks: number;
|
|
205
205
|
structuredDataCount: number;
|
|
206
206
|
}
|
|
207
|
-
export type PageSource =
|
|
207
|
+
export type PageSource = "url" | "file" | "html";
|
|
208
208
|
export interface PageAudit {
|
|
209
209
|
schemaVersion: 1;
|
|
210
|
-
kind:
|
|
210
|
+
kind: "page";
|
|
211
211
|
/** What the caller asked for (URL, path, or "inline-html"). */
|
|
212
212
|
target: string;
|
|
213
213
|
/** Final URL after redirects, or the file path. */
|
|
@@ -264,9 +264,9 @@ export interface IssueRollup {
|
|
|
264
264
|
}
|
|
265
265
|
export interface SiteAudit {
|
|
266
266
|
schemaVersion: 1;
|
|
267
|
-
kind:
|
|
267
|
+
kind: "site";
|
|
268
268
|
target: string;
|
|
269
|
-
source:
|
|
269
|
+
source: "crawl" | "directory";
|
|
270
270
|
auditedAt: string;
|
|
271
271
|
crawl: CrawlStats;
|
|
272
272
|
robotsTxt: RobotsTxtInfo | null;
|
|
@@ -292,5 +292,5 @@ export interface Thresholds {
|
|
|
292
292
|
maxKeywordDensityPercent: number;
|
|
293
293
|
}
|
|
294
294
|
export declare const DEFAULT_THRESHOLDS: Thresholds;
|
|
295
|
-
export declare
|
|
296
|
-
export declare
|
|
295
|
+
export declare const emptyCounts: () => SeverityCounts;
|
|
296
|
+
export declare const countFindings: (findings: Finding[]) => SeverityCounts;
|
package/dist/core/types.js
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
* Shared types for the SEO audit core. These shapes are the public contract
|
|
3
3
|
* of the CLI JSON output and the MCP tool results (`schemaVersion: 1`).
|
|
4
4
|
*/
|
|
5
|
-
export const SEVERITY_RANK = {
|
|
5
|
+
export const SEVERITY_RANK = {
|
|
6
|
+
error: 3,
|
|
7
|
+
warning: 2,
|
|
8
|
+
info: 1,
|
|
9
|
+
};
|
|
6
10
|
export const DEFAULT_THRESHOLDS = {
|
|
7
11
|
titleMinChars: 30,
|
|
8
12
|
titleMaxChars: 60,
|
|
@@ -14,13 +18,16 @@ export const DEFAULT_THRESHOLDS = {
|
|
|
14
18
|
deepPageDepth: 3,
|
|
15
19
|
maxKeywordDensityPercent: 3,
|
|
16
20
|
};
|
|
17
|
-
export
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
export const emptyCounts = () => ({
|
|
22
|
+
error: 0,
|
|
23
|
+
warning: 0,
|
|
24
|
+
info: 0,
|
|
25
|
+
});
|
|
26
|
+
export const countFindings = (findings) => {
|
|
21
27
|
const counts = emptyCounts();
|
|
22
|
-
for (const f of findings)
|
|
23
|
-
counts[f.severity]
|
|
28
|
+
for (const f of findings) {
|
|
29
|
+
counts[f.severity] += 1;
|
|
30
|
+
}
|
|
24
31
|
return counts;
|
|
25
|
-
}
|
|
32
|
+
};
|
|
26
33
|
//# sourceMappingURL=types.js.map
|
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,aAAa,GAA6B,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,aAAa,GAA6B;IACrD,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;CACR,CAAC;AA4UF,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC5C,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,mBAAmB,EAAE,EAAE;IACvB,mBAAmB,EAAE,GAAG;IACxB,UAAU,EAAE,EAAE;IACd,gBAAgB,EAAE,GAAG;IACrB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,CAAC;IAChB,wBAAwB,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAmB,EAAE,CAAC,CAAC;IAChD,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;CACR,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAmB,EAAkB,EAAE;IACnE,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|