afdocs 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 +46 -23
- package/dist/checks/authentication/auth-alternative-access.js +109 -6
- package/dist/checks/authentication/auth-alternative-access.js.map +1 -1
- package/dist/checks/authentication/auth-gate-detection.js +8 -3
- package/dist/checks/authentication/auth-gate-detection.js.map +1 -1
- package/dist/checks/content-structure/markdown-code-fence-validity.js +1 -1
- package/dist/checks/content-structure/markdown-code-fence-validity.js.map +1 -1
- package/dist/checks/content-structure/section-header-quality.js +240 -6
- package/dist/checks/content-structure/section-header-quality.js.map +1 -1
- package/dist/checks/content-structure/tabbed-content-serialization.js +200 -5
- package/dist/checks/content-structure/tabbed-content-serialization.js.map +1 -1
- package/dist/checks/index.d.ts +1 -0
- package/dist/checks/index.d.ts.map +1 -1
- package/dist/checks/index.js +1 -0
- package/dist/checks/index.js.map +1 -1
- package/dist/checks/llms-txt/llms-txt-exists.js +17 -10
- package/dist/checks/llms-txt/llms-txt-exists.js.map +1 -1
- package/dist/checks/observability/llms-txt-freshness.d.ts +24 -1
- package/dist/checks/observability/llms-txt-freshness.d.ts.map +1 -1
- package/dist/checks/observability/llms-txt-freshness.js +391 -5
- package/dist/checks/observability/llms-txt-freshness.js.map +1 -1
- package/dist/checks/observability/markdown-content-parity.js +599 -5
- package/dist/checks/observability/markdown-content-parity.js.map +1 -1
- package/dist/checks/page-size/content-start-position.js +3 -7
- package/dist/checks/page-size/content-start-position.js.map +1 -1
- package/dist/checks/page-size/page-size-html.js +4 -8
- package/dist/checks/page-size/page-size-html.js.map +1 -1
- package/dist/checks/page-size/rendering-strategy.d.ts +2 -0
- package/dist/checks/page-size/rendering-strategy.d.ts.map +1 -0
- package/dist/checks/page-size/rendering-strategy.js +154 -0
- package/dist/checks/page-size/rendering-strategy.js.map +1 -0
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +9 -0
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/formatters/text.d.ts.map +1 -1
- package/dist/cli/formatters/text.js +20 -3
- package/dist/cli/formatters/text.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -1
- package/dist/helpers/detect-rendering.d.ts +31 -0
- package/dist/helpers/detect-rendering.d.ts.map +1 -0
- package/dist/helpers/detect-rendering.js +85 -0
- package/dist/helpers/detect-rendering.js.map +1 -0
- package/dist/helpers/detect-tabs.d.ts +12 -0
- package/dist/helpers/detect-tabs.d.ts.map +1 -0
- package/dist/helpers/detect-tabs.js +309 -0
- package/dist/helpers/detect-tabs.js.map +1 -0
- package/dist/helpers/fetch-page.d.ts +8 -0
- package/dist/helpers/fetch-page.d.ts.map +1 -0
- package/dist/helpers/fetch-page.js +20 -0
- package/dist/helpers/fetch-page.js.map +1 -0
- package/dist/helpers/get-page-urls.d.ts +9 -0
- package/dist/helpers/get-page-urls.d.ts.map +1 -1
- package/dist/helpers/get-page-urls.js +153 -21
- package/dist/helpers/get-page-urls.js.map +1 -1
- package/dist/helpers/index.d.ts +5 -0
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/index.js +3 -0
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/to-md-urls.d.ts +4 -0
- package/dist/helpers/to-md-urls.d.ts.map +1 -1
- package/dist/helpers/to-md-urls.js +13 -0
- package/dist/helpers/to-md-urls.js.map +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +3 -1
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -1,10 +1,205 @@
|
|
|
1
1
|
import { registerCheck } from '../registry.js';
|
|
2
|
-
|
|
2
|
+
import { discoverAndSamplePages } from '../../helpers/get-page-urls.js';
|
|
3
|
+
import { htmlToMarkdown } from '../../helpers/html-to-markdown.js';
|
|
4
|
+
import { fetchPage } from '../../helpers/fetch-page.js';
|
|
5
|
+
import { detectTabGroups } from '../../helpers/detect-tabs.js';
|
|
6
|
+
import { toMdUrls } from '../../helpers/to-md-urls.js';
|
|
7
|
+
function sizeStatus(chars) {
|
|
8
|
+
if (chars <= 50_000)
|
|
9
|
+
return 'pass';
|
|
10
|
+
if (chars <= 100_000)
|
|
11
|
+
return 'warn';
|
|
12
|
+
return 'fail';
|
|
13
|
+
}
|
|
14
|
+
function worstStatus(statuses) {
|
|
15
|
+
if (statuses.includes('fail'))
|
|
16
|
+
return 'fail';
|
|
17
|
+
if (statuses.includes('warn'))
|
|
18
|
+
return 'warn';
|
|
19
|
+
return 'pass';
|
|
20
|
+
}
|
|
21
|
+
function formatSize(chars) {
|
|
22
|
+
if (chars >= 1000)
|
|
23
|
+
return `${Math.round(chars / 1000)}K`;
|
|
24
|
+
return String(chars);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Try to fetch a .md fallback URL for a page. Returns the body if successful, null otherwise.
|
|
28
|
+
*/
|
|
29
|
+
async function tryMdFallback(ctx, pageUrl) {
|
|
30
|
+
const candidates = toMdUrls(pageUrl);
|
|
31
|
+
for (const mdUrl of candidates) {
|
|
32
|
+
try {
|
|
33
|
+
const response = await ctx.http.fetch(mdUrl);
|
|
34
|
+
if (!response.ok)
|
|
35
|
+
continue;
|
|
36
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
37
|
+
if (!contentType.includes('text/markdown') && !contentType.includes('text/plain'))
|
|
38
|
+
continue;
|
|
39
|
+
const body = await response.text();
|
|
40
|
+
// Sanity check: must have some content and not be HTML
|
|
41
|
+
if (body.length > 0 && !body.trimStart().startsWith('<!'))
|
|
42
|
+
return body;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Skip failed fetches
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check whether the rendering-strategy check flagged a specific URL as an SPA shell.
|
|
52
|
+
* Returns true if the URL was analyzed and found to lack server-rendered content.
|
|
53
|
+
*/
|
|
54
|
+
function isSpaShell(ctx, url) {
|
|
55
|
+
const renderResult = ctx.previousResults.get('rendering-strategy');
|
|
56
|
+
if (!renderResult?.details?.pageResults)
|
|
57
|
+
return false;
|
|
58
|
+
const pageResults = renderResult.details.pageResults;
|
|
59
|
+
const match = pageResults.find((r) => r.url === url);
|
|
60
|
+
return match?.status === 'fail';
|
|
61
|
+
}
|
|
62
|
+
async function analyzePage(ctx, url) {
|
|
63
|
+
const page = await fetchPage(ctx, url);
|
|
64
|
+
// For markdown responses, run MDX detection directly
|
|
65
|
+
if (!page.isHtml) {
|
|
66
|
+
const tabGroups = detectTabGroups(page.body);
|
|
67
|
+
if (tabGroups.length === 0) {
|
|
68
|
+
return { url, tabGroups: [], totalTabbedChars: 0, status: 'pass', source: 'markdown' };
|
|
69
|
+
}
|
|
70
|
+
// For markdown content, the serialized size is the raw content of the tab groups
|
|
71
|
+
let totalTabbedChars = 0;
|
|
72
|
+
for (const group of tabGroups) {
|
|
73
|
+
totalTabbedChars += group.htmlSlice.length;
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
url,
|
|
77
|
+
tabGroups,
|
|
78
|
+
totalTabbedChars,
|
|
79
|
+
status: sizeStatus(totalTabbedChars),
|
|
80
|
+
source: 'markdown',
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// HTML response: try HTML-based detection first
|
|
84
|
+
const tabGroups = detectTabGroups(page.body);
|
|
85
|
+
if (tabGroups.length > 0) {
|
|
86
|
+
let totalTabbedChars = 0;
|
|
87
|
+
for (const group of tabGroups) {
|
|
88
|
+
const md = htmlToMarkdown(group.htmlSlice);
|
|
89
|
+
totalTabbedChars += md.length;
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
url,
|
|
93
|
+
tabGroups,
|
|
94
|
+
totalTabbedChars,
|
|
95
|
+
status: sizeStatus(totalTabbedChars),
|
|
96
|
+
source: 'html',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// No tabs found in HTML. If rendering-strategy flagged this as an SPA shell,
|
|
100
|
+
// try the markdown path as a fallback so we can still analyze tab content
|
|
101
|
+
// for agents that support content negotiation.
|
|
102
|
+
if (isSpaShell(ctx, url)) {
|
|
103
|
+
const mdBody = await tryMdFallback(ctx, url);
|
|
104
|
+
if (mdBody) {
|
|
105
|
+
const mdTabGroups = detectTabGroups(mdBody);
|
|
106
|
+
if (mdTabGroups.length > 0) {
|
|
107
|
+
let totalTabbedChars = 0;
|
|
108
|
+
for (const group of mdTabGroups) {
|
|
109
|
+
totalTabbedChars += group.htmlSlice.length;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
url,
|
|
113
|
+
tabGroups: mdTabGroups,
|
|
114
|
+
totalTabbedChars,
|
|
115
|
+
status: sizeStatus(totalTabbedChars),
|
|
116
|
+
source: 'md-fallback',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return { url, tabGroups: [], totalTabbedChars: 0, status: 'pass', source: 'html' };
|
|
122
|
+
}
|
|
123
|
+
async function check(ctx) {
|
|
124
|
+
const id = 'tabbed-content-serialization';
|
|
125
|
+
const category = 'content-structure';
|
|
126
|
+
const { urls: pageUrls, totalPages, sampled: wasSampled, warnings, } = await discoverAndSamplePages(ctx);
|
|
127
|
+
const results = [];
|
|
128
|
+
const concurrency = ctx.options.maxConcurrency;
|
|
129
|
+
for (let i = 0; i < pageUrls.length; i += concurrency) {
|
|
130
|
+
const batch = pageUrls.slice(i, i + concurrency);
|
|
131
|
+
const batchResults = await Promise.all(batch.map(async (url) => {
|
|
132
|
+
try {
|
|
133
|
+
return await analyzePage(ctx, url);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
return {
|
|
137
|
+
url,
|
|
138
|
+
tabGroups: [],
|
|
139
|
+
totalTabbedChars: 0,
|
|
140
|
+
status: 'fail',
|
|
141
|
+
error: err instanceof Error ? err.message : String(err),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}));
|
|
145
|
+
results.push(...batchResults);
|
|
146
|
+
}
|
|
147
|
+
const successful = results.filter((r) => !r.error);
|
|
148
|
+
const fetchErrors = results.filter((r) => r.error).length;
|
|
149
|
+
if (successful.length === 0) {
|
|
150
|
+
const suffix = fetchErrors > 0 ? `; ${fetchErrors} failed to fetch` : '';
|
|
151
|
+
return {
|
|
152
|
+
id,
|
|
153
|
+
category,
|
|
154
|
+
status: 'fail',
|
|
155
|
+
message: `Could not fetch any pages to analyze${suffix}`,
|
|
156
|
+
details: {
|
|
157
|
+
totalPages,
|
|
158
|
+
testedPages: results.length,
|
|
159
|
+
sampled: wasSampled,
|
|
160
|
+
fetchErrors,
|
|
161
|
+
tabbedPages: results,
|
|
162
|
+
discoveryWarnings: warnings,
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const pagesWithTabs = successful.filter((r) => r.tabGroups.length > 0);
|
|
167
|
+
const totalGroupsFound = successful.reduce((sum, r) => sum + r.tabGroups.length, 0);
|
|
168
|
+
const overallStatus = worstStatus(successful.map((r) => r.status));
|
|
169
|
+
const pageLabel = wasSampled ? 'sampled pages' : 'pages';
|
|
170
|
+
let message;
|
|
171
|
+
if (totalGroupsFound === 0) {
|
|
172
|
+
message = `No tabbed content detected across ${successful.length} ${pageLabel}`;
|
|
173
|
+
}
|
|
174
|
+
else if (overallStatus === 'pass') {
|
|
175
|
+
message = `${totalGroupsFound} tab group(s) across ${pagesWithTabs.length} of ${successful.length} ${pageLabel}; all serialize under 50K chars`;
|
|
176
|
+
}
|
|
177
|
+
else if (overallStatus === 'warn') {
|
|
178
|
+
const worst = Math.max(...successful.map((r) => r.totalTabbedChars));
|
|
179
|
+
message = `${totalGroupsFound} tab group(s) found; worst page serializes to ${formatSize(worst)} chars (50K–100K)`;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
const worst = Math.max(...successful.map((r) => r.totalTabbedChars));
|
|
183
|
+
message = `${totalGroupsFound} tab group(s) found; worst page serializes to ${formatSize(worst)} chars (over 100K)`;
|
|
184
|
+
}
|
|
185
|
+
if (fetchErrors > 0) {
|
|
186
|
+
message += `; ${fetchErrors} failed to fetch`;
|
|
187
|
+
}
|
|
3
188
|
return {
|
|
4
|
-
id
|
|
5
|
-
category
|
|
6
|
-
status:
|
|
7
|
-
message
|
|
189
|
+
id,
|
|
190
|
+
category,
|
|
191
|
+
status: overallStatus,
|
|
192
|
+
message,
|
|
193
|
+
details: {
|
|
194
|
+
totalPages,
|
|
195
|
+
testedPages: results.length,
|
|
196
|
+
sampled: wasSampled,
|
|
197
|
+
pagesWithTabs: pagesWithTabs.length,
|
|
198
|
+
totalGroupsFound,
|
|
199
|
+
fetchErrors,
|
|
200
|
+
tabbedPages: results,
|
|
201
|
+
discoveryWarnings: warnings,
|
|
202
|
+
},
|
|
8
203
|
};
|
|
9
204
|
}
|
|
10
205
|
registerCheck({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabbed-content-serialization.js","sourceRoot":"","sources":["../../../src/checks/content-structure/tabbed-content-serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"tabbed-content-serialization.js","sourceRoot":"","sources":["../../../src/checks/content-structure/tabbed-content-serialization.ts"],"names":[],"mappings":"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"}
|
package/dist/checks/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import './llms-txt/llms-txt-links-resolve.js';
|
|
|
5
5
|
import './llms-txt/llms-txt-links-markdown.js';
|
|
6
6
|
import './markdown-availability/markdown-url-support.js';
|
|
7
7
|
import './markdown-availability/content-negotiation.js';
|
|
8
|
+
import './page-size/rendering-strategy.js';
|
|
8
9
|
import './page-size/page-size-markdown.js';
|
|
9
10
|
import './page-size/page-size-html.js';
|
|
10
11
|
import './page-size/content-start-position.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAGA,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,uCAAuC,CAAC;AAG/C,OAAO,iDAAiD,CAAC;AACzD,OAAO,gDAAgD,CAAC;AAGxD,OAAO,mCAAmC,CAAC;AAC3C,OAAO,+BAA+B,CAAC;AACvC,OAAO,uCAAuC,CAAC;AAG/C,OAAO,qDAAqD,CAAC;AAC7D,OAAO,+CAA+C,CAAC;AACvD,OAAO,qDAAqD,CAAC;AAG7D,OAAO,sCAAsC,CAAC;AAC9C,OAAO,sCAAsC,CAAC;AAG9C,OAAO,+CAA+C,CAAC;AAGvD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,4CAA4C,CAAC;AACpD,OAAO,yCAAyC,CAAC;AAGjD,OAAO,yCAAyC,CAAC;AACjD,OAAO,6CAA6C,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAGA,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,uCAAuC,CAAC;AAG/C,OAAO,iDAAiD,CAAC;AACzD,OAAO,gDAAgD,CAAC;AAGxD,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,+BAA+B,CAAC;AACvC,OAAO,uCAAuC,CAAC;AAG/C,OAAO,qDAAqD,CAAC;AAC7D,OAAO,+CAA+C,CAAC;AACvD,OAAO,qDAAqD,CAAC;AAG7D,OAAO,sCAAsC,CAAC;AAC9C,OAAO,sCAAsC,CAAC;AAG9C,OAAO,+CAA+C,CAAC;AAGvD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,4CAA4C,CAAC;AACpD,OAAO,yCAAyC,CAAC;AAGjD,OAAO,yCAAyC,CAAC;AACjD,OAAO,6CAA6C,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|
package/dist/checks/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import './llms-txt/llms-txt-links-markdown.js';
|
|
|
9
9
|
import './markdown-availability/markdown-url-support.js';
|
|
10
10
|
import './markdown-availability/content-negotiation.js';
|
|
11
11
|
// Category 3: Page Size
|
|
12
|
+
import './page-size/rendering-strategy.js';
|
|
12
13
|
import './page-size/page-size-markdown.js';
|
|
13
14
|
import './page-size/page-size-html.js';
|
|
14
15
|
import './page-size/content-start-position.js';
|
package/dist/checks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,uBAAuB;AACvB,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,uCAAuC,CAAC;AAE/C,oCAAoC;AACpC,OAAO,iDAAiD,CAAC;AACzD,OAAO,gDAAgD,CAAC;AAExD,wBAAwB;AACxB,OAAO,mCAAmC,CAAC;AAC3C,OAAO,+BAA+B,CAAC;AACvC,OAAO,uCAAuC,CAAC;AAE/C,gCAAgC;AAChC,OAAO,qDAAqD,CAAC;AAC7D,OAAO,+CAA+C,CAAC;AACvD,OAAO,qDAAqD,CAAC;AAE7D,4BAA4B;AAC5B,OAAO,sCAAsC,CAAC;AAC9C,OAAO,sCAAsC,CAAC;AAE9C,oCAAoC;AACpC,OAAO,+CAA+C,CAAC;AAEvD,4BAA4B;AAC5B,OAAO,uCAAuC,CAAC;AAC/C,OAAO,4CAA4C,CAAC;AACpD,OAAO,yCAAyC,CAAC;AAEjD,6BAA6B;AAC7B,OAAO,yCAAyC,CAAC;AACjD,OAAO,6CAA6C,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,uBAAuB;AACvB,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,uCAAuC,CAAC;AAE/C,oCAAoC;AACpC,OAAO,iDAAiD,CAAC;AACzD,OAAO,gDAAgD,CAAC;AAExD,wBAAwB;AACxB,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,+BAA+B,CAAC;AACvC,OAAO,uCAAuC,CAAC;AAE/C,gCAAgC;AAChC,OAAO,qDAAqD,CAAC;AAC7D,OAAO,+CAA+C,CAAC;AACvD,OAAO,qDAAqD,CAAC;AAE7D,4BAA4B;AAC5B,OAAO,sCAAsC,CAAC;AAC9C,OAAO,sCAAsC,CAAC;AAE9C,oCAAoC;AACpC,OAAO,+CAA+C,CAAC;AAEvD,4BAA4B;AAC5B,OAAO,uCAAuC,CAAC;AAC/C,OAAO,4CAA4C,CAAC;AACpD,OAAO,yCAAyC,CAAC;AAEjD,6BAA6B;AAC7B,OAAO,yCAAyC,CAAC;AACjD,OAAO,6CAA6C,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { registerCheck } from '../registry.js';
|
|
2
|
+
import { isCrossHostRedirect } from '../../helpers/to-md-urls.js';
|
|
2
3
|
/**
|
|
3
4
|
* Build candidate URLs for llms.txt discovery.
|
|
4
5
|
* Per spec: {base_url}/llms.txt, {origin}/llms.txt, {origin}/docs/llms.txt
|
|
@@ -11,16 +12,6 @@ function getCandidateUrls(baseUrl, origin) {
|
|
|
11
12
|
candidates.add(`${origin}/docs/llms.txt`);
|
|
12
13
|
return Array.from(candidates);
|
|
13
14
|
}
|
|
14
|
-
function isCrossHostRedirect(originalUrl, finalUrl) {
|
|
15
|
-
try {
|
|
16
|
-
const original = new URL(originalUrl);
|
|
17
|
-
const final_ = new URL(finalUrl);
|
|
18
|
-
return original.host !== final_.host;
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
15
|
async function checkLlmsTxtExists(ctx) {
|
|
25
16
|
const candidates = getCandidateUrls(ctx.baseUrl, ctx.origin);
|
|
26
17
|
const discovered = [];
|
|
@@ -136,6 +127,22 @@ async function checkLlmsTxtExists(ctx) {
|
|
|
136
127
|
if (redirectedOrigins.length > 0) {
|
|
137
128
|
details.redirectedOrigins = redirectedOrigins;
|
|
138
129
|
}
|
|
130
|
+
// Set effectiveOrigin for downstream checks when content lives at a different host.
|
|
131
|
+
// Derive from redirect URLs on discovered files, or from the fallback redirectedOrigins.
|
|
132
|
+
if (!ctx.effectiveOrigin) {
|
|
133
|
+
const crossHostFile = discovered.find((f) => f.crossHostRedirect && f.redirectUrl);
|
|
134
|
+
if (crossHostFile?.redirectUrl) {
|
|
135
|
+
try {
|
|
136
|
+
ctx.effectiveOrigin = new URL(crossHostFile.redirectUrl).origin;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
/* ignore malformed */
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (redirectedOrigins.length > 0) {
|
|
143
|
+
ctx.effectiveOrigin = redirectedOrigins[0];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
139
146
|
if (discovered.length === 0) {
|
|
140
147
|
const redirectNote = redirectedOrigins.length > 0
|
|
141
148
|
? `; candidates redirected cross-host to ${redirectedOrigins.join(', ')} (agents can't follow cross-host redirects)`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llms-txt-exists.js","sourceRoot":"","sources":["../../../src/checks/llms-txt/llms-txt-exists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"llms-txt-exists.js","sourceRoot":"","sources":["../../../src/checks/llms-txt/llms-txt-exists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAGlE;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,MAAc;IACvD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,WAAW,CAAC,CAAC;IACtC,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC;IACrC,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,gBAAgB,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,GAAiB;IACjD,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,WAAW,GAMZ,EAAE,CAAC;IAER,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAE7C,WAAW,CAAC,IAAI,CAAC;gBACf,GAAG;gBACH,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;aACzD,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACtC,oCAAoC;gBACpC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC;gBAClD,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC9E,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,IAAI,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAChF,UAAU,CAAC,IAAI,CAAC;wBACd,GAAG;wBACH,OAAO;wBACP,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;wBAC3D,iBAAiB,EAAE,SAAS;qBAC7B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,IAAI,CAAC;gBACf,GAAG;gBACH,MAAM,EAAE,CAAC;gBACT,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,yDAAyD;IACzD,MAAM,iBAAiB,GAAa,EAAE,CAAC;IACvC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,QAAQ,IAAI,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3E,IAAI,CAAC;oBACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;oBAC1D,MAAM,WAAW,GAAG,GAAG,gBAAgB,WAAW,CAAC;oBACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBACvE,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;wBAClC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;wBAC5B,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,mBAAmB;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,MAAM,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;YACjD,MAAM,WAAW,GAAG,GAAG,gBAAgB,WAAW,CAAC;YACnD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBACnD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAE7C,WAAW,CAAC,IAAI,CAAC;oBACf,GAAG,EAAE,WAAW;oBAChB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;iBACzD,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;oBAC1B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACtC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC;oBAClD,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;oBAC9E,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAChD,UAAU,CAAC,IAAI,CAAC;4BACd,GAAG,EAAE,WAAW;4BAChB,OAAO;4BACP,MAAM,EAAE,QAAQ,CAAC,MAAM;4BACvB,UAAU,EAAE,KAAK;4BACjB,iBAAiB,EAAE,IAAI;yBACxB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,WAAW,CAAC,IAAI,CAAC;oBACf,GAAG,EAAE,WAAW;oBAChB,MAAM,EAAE,CAAC;oBACT,UAAU,EAAE,KAAK;oBACjB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IAEvE,MAAM,MAAM,GACV,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEtE,+CAA+C;IAC/C,MAAM,OAAO,GAA4B;QACvC,aAAa,EAAE,WAAW;QAC1B,eAAe,EAAE,UAAU;QAC3B,WAAW;QACX,WAAW;KACZ,CAAC;IAEF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAChD,CAAC;IAED,oFAAoF;IACpF,yFAAyF;IACzF,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;QACnF,IAAI,aAAa,EAAE,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;YAClE,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;aAAM,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,eAAe,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,YAAY,GAChB,iBAAiB,CAAC,MAAM,GAAG,CAAC;YAC1B,CAAC,CAAC,yCAAyC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,6CAA6C;YACpH,CAAC,CAAC,EAAE,CAAC;QACT,OAAO;YACL,EAAE,EAAE,iBAAiB;YACrB,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,gDAAgD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,GAAG,MAAM,EAAE;YACzG,OAAO;SACR,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAClE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;YACL,EAAE,EAAE,iBAAiB;YACrB,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uFAAuF,MAAM,EAAE;YACxG,OAAO;SACR,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;QACjC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,OAAO;QACL,EAAE,EAAE,iBAAiB;QACrB,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB,UAAU,CAAC,MAAM,eAAe,MAAM,EAAE;QACtE,OAAO;KACR,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,iBAAiB;IACrB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,oEAAoE;IACjF,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,kBAAkB;CACxB,CAAC,CAAC"}
|
|
@@ -1,2 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Normalize a URL to a canonical path for comparison.
|
|
3
|
+
* Strips trailing slashes, .md/.mdx/.html extensions, and /index variants,
|
|
4
|
+
* then lowercases the path.
|
|
5
|
+
*/
|
|
6
|
+
export declare function normalizeUrlPath(url: string): string;
|
|
7
|
+
export declare function isExcludedPath(normalizedPath: string, baseUrlPath?: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Detect whether a URL set uses locale-prefixed paths and, if so, return the
|
|
10
|
+
* path segment position where locales appear.
|
|
11
|
+
*
|
|
12
|
+
* Detection is empirical: for each path segment position, count how many
|
|
13
|
+
* distinct 2-letter (or xx-yy) codes appear. If a position has ≥2 distinct
|
|
14
|
+
* codes and those codes cover >50% of URLs, it's a locale segment.
|
|
15
|
+
*
|
|
16
|
+
* Example: `/docs/en/intro` and `/docs/de/intro` → position 1 has codes
|
|
17
|
+
* `en` and `de` → locale position detected at index 1.
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectLocalePosition(urls: string[]): number | null;
|
|
20
|
+
/**
|
|
21
|
+
* Get the dominant value at a given path segment position across a URL set.
|
|
22
|
+
* Returns null if no consistent value is found.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getDominantSegment(urls: string[], position: number): string | null;
|
|
2
25
|
//# sourceMappingURL=llms-txt-freshness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llms-txt-freshness.d.ts","sourceRoot":"","sources":["../../../src/checks/observability/llms-txt-freshness.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"llms-txt-freshness.d.ts","sourceRoot":"","sources":["../../../src/checks/observability/llms-txt-freshness.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoBpD;AA6BD,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAYpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CA8BlE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBlF"}
|