afdocs 0.4.0 → 0.5.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.
Files changed (73) hide show
  1. package/README.md +46 -23
  2. package/dist/checks/authentication/auth-alternative-access.js +109 -6
  3. package/dist/checks/authentication/auth-alternative-access.js.map +1 -1
  4. package/dist/checks/authentication/auth-gate-detection.js +8 -3
  5. package/dist/checks/authentication/auth-gate-detection.js.map +1 -1
  6. package/dist/checks/content-structure/markdown-code-fence-validity.js +1 -1
  7. package/dist/checks/content-structure/markdown-code-fence-validity.js.map +1 -1
  8. package/dist/checks/content-structure/section-header-quality.js +240 -6
  9. package/dist/checks/content-structure/section-header-quality.js.map +1 -1
  10. package/dist/checks/content-structure/tabbed-content-serialization.js +200 -5
  11. package/dist/checks/content-structure/tabbed-content-serialization.js.map +1 -1
  12. package/dist/checks/index.d.ts +1 -0
  13. package/dist/checks/index.d.ts.map +1 -1
  14. package/dist/checks/index.js +1 -0
  15. package/dist/checks/index.js.map +1 -1
  16. package/dist/checks/llms-txt/llms-txt-exists.js +17 -10
  17. package/dist/checks/llms-txt/llms-txt-exists.js.map +1 -1
  18. package/dist/checks/observability/llms-txt-freshness.d.ts +24 -1
  19. package/dist/checks/observability/llms-txt-freshness.d.ts.map +1 -1
  20. package/dist/checks/observability/llms-txt-freshness.js +391 -5
  21. package/dist/checks/observability/llms-txt-freshness.js.map +1 -1
  22. package/dist/checks/observability/markdown-content-parity.js +599 -5
  23. package/dist/checks/observability/markdown-content-parity.js.map +1 -1
  24. package/dist/checks/page-size/content-start-position.js +3 -7
  25. package/dist/checks/page-size/content-start-position.js.map +1 -1
  26. package/dist/checks/page-size/page-size-html.js +4 -8
  27. package/dist/checks/page-size/page-size-html.js.map +1 -1
  28. package/dist/checks/page-size/rendering-strategy.d.ts +2 -0
  29. package/dist/checks/page-size/rendering-strategy.d.ts.map +1 -0
  30. package/dist/checks/page-size/rendering-strategy.js +154 -0
  31. package/dist/checks/page-size/rendering-strategy.js.map +1 -0
  32. package/dist/cli/commands/check.d.ts.map +1 -1
  33. package/dist/cli/commands/check.js +9 -0
  34. package/dist/cli/commands/check.js.map +1 -1
  35. package/dist/cli/formatters/text.d.ts.map +1 -1
  36. package/dist/cli/formatters/text.js +13 -3
  37. package/dist/cli/formatters/text.js.map +1 -1
  38. package/dist/cli/index.d.ts.map +1 -1
  39. package/dist/cli/index.js +4 -1
  40. package/dist/cli/index.js.map +1 -1
  41. package/dist/constants.d.ts.map +1 -1
  42. package/dist/constants.js +1 -0
  43. package/dist/constants.js.map +1 -1
  44. package/dist/helpers/detect-rendering.d.ts +31 -0
  45. package/dist/helpers/detect-rendering.d.ts.map +1 -0
  46. package/dist/helpers/detect-rendering.js +85 -0
  47. package/dist/helpers/detect-rendering.js.map +1 -0
  48. package/dist/helpers/detect-tabs.d.ts +12 -0
  49. package/dist/helpers/detect-tabs.d.ts.map +1 -0
  50. package/dist/helpers/detect-tabs.js +309 -0
  51. package/dist/helpers/detect-tabs.js.map +1 -0
  52. package/dist/helpers/fetch-page.d.ts +8 -0
  53. package/dist/helpers/fetch-page.d.ts.map +1 -0
  54. package/dist/helpers/fetch-page.js +20 -0
  55. package/dist/helpers/fetch-page.js.map +1 -0
  56. package/dist/helpers/get-page-urls.d.ts +9 -0
  57. package/dist/helpers/get-page-urls.d.ts.map +1 -1
  58. package/dist/helpers/get-page-urls.js +153 -21
  59. package/dist/helpers/get-page-urls.js.map +1 -1
  60. package/dist/helpers/index.d.ts +5 -0
  61. package/dist/helpers/index.d.ts.map +1 -1
  62. package/dist/helpers/index.js +3 -0
  63. package/dist/helpers/index.js.map +1 -1
  64. package/dist/helpers/to-md-urls.d.ts +4 -0
  65. package/dist/helpers/to-md-urls.d.ts.map +1 -1
  66. package/dist/helpers/to-md-urls.js +13 -0
  67. package/dist/helpers/to-md-urls.js.map +1 -1
  68. package/dist/runner.d.ts.map +1 -1
  69. package/dist/runner.js +1 -0
  70. package/dist/runner.js.map +1 -1
  71. package/dist/types.d.ts +19 -0
  72. package/dist/types.d.ts.map +1 -1
  73. package/package.json +2 -1
@@ -1,10 +1,396 @@
1
1
  import { registerCheck } from '../registry.js';
2
- async function check(_ctx) {
2
+ import { getUrlsFromCachedLlmsTxt, getUrlsFromSitemap, parseSitemapUrls, } from '../../helpers/get-page-urls.js';
3
+ import { isNonPageUrl } from '../../helpers/to-md-urls.js';
4
+ /**
5
+ * Normalize a URL to a canonical path for comparison.
6
+ * Strips trailing slashes, .md/.mdx/.html extensions, and /index variants,
7
+ * then lowercases the path.
8
+ */
9
+ export function normalizeUrlPath(url) {
10
+ try {
11
+ const parsed = new URL(url);
12
+ let path = parsed.pathname;
13
+ // Strip /index.md, /index.mdx, /index.html
14
+ path = path.replace(/\/index\.(?:md|mdx|html?)$/i, '/');
15
+ // Strip .md, .mdx, .html extensions
16
+ path = path.replace(/\.(?:md|mdx|html?)$/i, '');
17
+ // Strip trailing slash (but keep root /)
18
+ if (path.length > 1 && path.endsWith('/')) {
19
+ path = path.slice(0, -1);
20
+ }
21
+ return path.toLowerCase();
22
+ }
23
+ catch {
24
+ return url.toLowerCase();
25
+ }
26
+ }
27
+ /**
28
+ * Path patterns that are unlikely to need llms.txt coverage.
29
+ * These are non-doc pages that commonly appear in sitemaps.
30
+ */
31
+ const EXCLUDED_PATH_PATTERNS = [
32
+ /^\/blog(\/|$)/i,
33
+ /^\/changelog(\/|$)/i,
34
+ /^\/releases?(\/|$)/i,
35
+ /^\/pricing(\/|$)/i,
36
+ /^\/about(\/|$)/i,
37
+ /^\/careers?(\/|$)/i,
38
+ /^\/jobs?(\/|$)/i,
39
+ /^\/contact(\/|$)/i,
40
+ /^\/legal(\/|$)/i,
41
+ /^\/privacy(\/|$)/i,
42
+ /^\/terms(\/|$)/i,
43
+ /^\/security(\/|$)/i,
44
+ /^\/status(\/|$)/i,
45
+ /^\/login(\/|$)/i,
46
+ /^\/signup(\/|$)/i,
47
+ /^\/sign-up(\/|$)/i,
48
+ /^\/sign-in(\/|$)/i,
49
+ /^\/register(\/|$)/i,
50
+ /^\/404(\/|$)/i,
51
+ /^\/500(\/|$)/i,
52
+ ];
53
+ export function isExcludedPath(normalizedPath, baseUrlPath) {
54
+ if (EXCLUDED_PATH_PATTERNS.some((pattern) => pattern.test(normalizedPath))) {
55
+ return true;
56
+ }
57
+ // Also check relative to the base path prefix (e.g. /docs/changelog → /changelog)
58
+ if (baseUrlPath && baseUrlPath !== '/' && normalizedPath.startsWith(baseUrlPath)) {
59
+ const relative = normalizedPath.slice(baseUrlPath.length) || '/';
60
+ if (EXCLUDED_PATH_PATTERNS.some((pattern) => pattern.test(relative))) {
61
+ return true;
62
+ }
63
+ }
64
+ return false;
65
+ }
66
+ /**
67
+ * Detect whether a URL set uses locale-prefixed paths and, if so, return the
68
+ * path segment position where locales appear.
69
+ *
70
+ * Detection is empirical: for each path segment position, count how many
71
+ * distinct 2-letter (or xx-yy) codes appear. If a position has ≥2 distinct
72
+ * codes and those codes cover >50% of URLs, it's a locale segment.
73
+ *
74
+ * Example: `/docs/en/intro` and `/docs/de/intro` → position 1 has codes
75
+ * `en` and `de` → locale position detected at index 1.
76
+ */
77
+ export function detectLocalePosition(urls) {
78
+ const positionCounts = new Map();
79
+ const positionTotals = new Map();
80
+ for (const url of urls) {
81
+ try {
82
+ const segments = new URL(url).pathname.split('/').filter(Boolean);
83
+ for (let i = 0; i < segments.length; i++) {
84
+ const seg = segments[i].toLowerCase();
85
+ if (/^[a-z]{2}(-[a-z]{2})?$/.test(seg)) {
86
+ if (!positionCounts.has(i))
87
+ positionCounts.set(i, new Map());
88
+ const counts = positionCounts.get(i);
89
+ counts.set(seg, (counts.get(seg) ?? 0) + 1);
90
+ positionTotals.set(i, (positionTotals.get(i) ?? 0) + 1);
91
+ }
92
+ }
93
+ }
94
+ catch {
95
+ continue;
96
+ }
97
+ }
98
+ for (const [pos, counts] of positionCounts) {
99
+ if (counts.size < 2)
100
+ continue;
101
+ const total = positionTotals.get(pos) ?? 0;
102
+ if (total > urls.length * 0.5) {
103
+ return pos;
104
+ }
105
+ }
106
+ return null;
107
+ }
108
+ /**
109
+ * Get the dominant value at a given path segment position across a URL set.
110
+ * Returns null if no consistent value is found.
111
+ */
112
+ export function getDominantSegment(urls, position) {
113
+ const counts = new Map();
114
+ for (const url of urls) {
115
+ try {
116
+ const segments = new URL(url).pathname.split('/').filter(Boolean);
117
+ if (segments.length > position) {
118
+ const seg = segments[position].toLowerCase();
119
+ counts.set(seg, (counts.get(seg) ?? 0) + 1);
120
+ }
121
+ }
122
+ catch {
123
+ continue;
124
+ }
125
+ }
126
+ let dominant = '';
127
+ let dominantCount = 0;
128
+ for (const [seg, count] of counts) {
129
+ if (count > dominantCount) {
130
+ dominant = seg;
131
+ dominantCount = count;
132
+ }
133
+ }
134
+ // Only return if it covers >50% of the URLs
135
+ return dominantCount > urls.length * 0.5 ? dominant : null;
136
+ }
137
+ /**
138
+ * Filter URLs to only those whose path segment at `position` matches `locale`.
139
+ */
140
+ function filterByLocale(urls, locale, position) {
141
+ return urls.filter((url) => {
142
+ try {
143
+ const segments = new URL(url).pathname.split('/').filter(Boolean);
144
+ return segments.length > position && segments[position].toLowerCase() === locale;
145
+ }
146
+ catch {
147
+ return false;
148
+ }
149
+ });
150
+ }
151
+ /** Coverage thresholds */
152
+ const COVERAGE_PASS = 0.95;
153
+ const COVERAGE_WARN = 0.8;
154
+ /**
155
+ * Maximum sitemap URLs to collect for freshness comparison.
156
+ * Higher than the default MAX_SITEMAP_URLS (500) used for page sampling,
157
+ * because freshness needs the full sitemap to produce meaningful coverage
158
+ * percentages. Enterprise docs sites (Stripe, MongoDB) can have thousands
159
+ * of pages.
160
+ */
161
+ const MAX_FRESHNESS_SITEMAP_URLS = 50_000;
162
+ /**
163
+ * Try to fetch a docs-specific sitemap at {baseUrl}/sitemap.xml.
164
+ * Many docs sites host their own sitemap that isn't referenced from robots.txt
165
+ * (e.g., Loops /docs/sitemap.xml, Supabase /docs/sitemap.xml).
166
+ */
167
+ async function fetchDocsSitemap(ctx) {
168
+ const baseUrlPath = new URL(ctx.baseUrl).pathname.replace(/\/$/, '');
169
+ if (!baseUrlPath || baseUrlPath === '/')
170
+ return [];
171
+ const docsSitemapUrl = `${ctx.origin}${baseUrlPath}/sitemap.xml`;
172
+ try {
173
+ const response = await ctx.http.fetch(docsSitemapUrl);
174
+ if (!response.ok)
175
+ return [];
176
+ const xml = await response.text();
177
+ const parsed = parseSitemapUrls(xml);
178
+ // If it's a sitemap index, follow one level
179
+ if (parsed.sitemapIndexUrls.length > 0) {
180
+ const urls = [];
181
+ for (const subUrl of parsed.sitemapIndexUrls) {
182
+ try {
183
+ const subResp = await ctx.http.fetch(subUrl);
184
+ if (!subResp.ok)
185
+ continue;
186
+ const subXml = await subResp.text();
187
+ const subParsed = parseSitemapUrls(subXml);
188
+ urls.push(...subParsed.urls);
189
+ }
190
+ catch {
191
+ // Skip failed fetches
192
+ }
193
+ }
194
+ return urls;
195
+ }
196
+ return parsed.urls;
197
+ }
198
+ catch {
199
+ return [];
200
+ }
201
+ }
202
+ /**
203
+ * Scope URLs to the baseUrl path prefix and same origin.
204
+ */
205
+ function scopeUrls(urls, origin, baseUrlPath) {
206
+ return urls.filter((url) => {
207
+ try {
208
+ const parsed = new URL(url);
209
+ if (parsed.origin !== origin)
210
+ return false;
211
+ if (baseUrlPath && baseUrlPath !== '/') {
212
+ if (!parsed.pathname.startsWith(baseUrlPath + '/') && parsed.pathname !== baseUrlPath) {
213
+ return false;
214
+ }
215
+ }
216
+ if (isNonPageUrl(url))
217
+ return false;
218
+ return true;
219
+ }
220
+ catch {
221
+ return false;
222
+ }
223
+ });
224
+ }
225
+ async function check(ctx) {
226
+ const id = 'llms-txt-freshness';
227
+ const category = 'observability';
228
+ // 1. Get llms.txt page URLs (with progressive disclosure walking)
229
+ const llmsTxtUrls = await getUrlsFromCachedLlmsTxt(ctx);
230
+ if (llmsTxtUrls.length === 0) {
231
+ return {
232
+ id,
233
+ category,
234
+ status: 'skip',
235
+ message: 'No page URLs found in llms.txt',
236
+ };
237
+ }
238
+ // 2. Get sitemap URLs, with docs-specific sitemap fallback
239
+ // Use effectiveOrigin when a cross-host redirect was detected, so that
240
+ // sitemap URLs at the redirected host are accepted rather than filtered out.
241
+ const effectiveOrigin = ctx.effectiveOrigin ?? ctx.origin;
242
+ const sitemapWarnings = [];
243
+ let sitemapUrls = await getUrlsFromSitemap(ctx, sitemapWarnings, MAX_FRESHNESS_SITEMAP_URLS, effectiveOrigin);
244
+ let sitemapSource = 'robots.txt/sitemap.xml';
245
+ const baseUrlPath = new URL(ctx.baseUrl).pathname.replace(/\/$/, '');
246
+ // Check if main sitemap has any docs URLs
247
+ let scopedSitemapUrls = scopeUrls(sitemapUrls, effectiveOrigin, baseUrlPath);
248
+ // If the main sitemap has no docs URLs, try a docs-specific sitemap
249
+ if (scopedSitemapUrls.length === 0 && baseUrlPath && baseUrlPath !== '/') {
250
+ const docsSitemapUrls = await fetchDocsSitemap(ctx);
251
+ if (docsSitemapUrls.length > 0) {
252
+ sitemapUrls = docsSitemapUrls;
253
+ scopedSitemapUrls = scopeUrls(docsSitemapUrls, effectiveOrigin, baseUrlPath);
254
+ sitemapSource = `${baseUrlPath}/sitemap.xml`;
255
+ }
256
+ }
257
+ if (sitemapUrls.length === 0) {
258
+ return {
259
+ id,
260
+ category,
261
+ status: 'skip',
262
+ message: 'No sitemap found; cannot assess llms.txt freshness without a sitemap as ground truth',
263
+ details: { sitemapWarnings },
264
+ };
265
+ }
266
+ if (scopedSitemapUrls.length === 0) {
267
+ return {
268
+ id,
269
+ category,
270
+ status: 'skip',
271
+ message: `Sitemap has ${sitemapUrls.length} URLs but none are under the docs path prefix (${baseUrlPath || '/'})`,
272
+ details: {
273
+ totalSitemapUrls: sitemapUrls.length,
274
+ baseUrlPath: baseUrlPath || '/',
275
+ sitemapWarnings,
276
+ },
277
+ };
278
+ }
279
+ // 2b. Locale filtering: if the sitemap uses locale-prefixed paths (e.g. /docs/en/,
280
+ // /docs/de/), filter to the same locale as the llms.txt URLs. This avoids
281
+ // penalizing sites for not listing every localized variant in llms.txt.
282
+ let localeFiltered = false;
283
+ let detectedLocale = null;
284
+ const localePosition = detectLocalePosition(scopedSitemapUrls);
285
+ if (localePosition !== null) {
286
+ const llmsLocale = getDominantSegment(llmsTxtUrls, localePosition);
287
+ if (llmsLocale) {
288
+ detectedLocale = llmsLocale;
289
+ const before = scopedSitemapUrls.length;
290
+ scopedSitemapUrls = filterByLocale(scopedSitemapUrls, llmsLocale, localePosition);
291
+ localeFiltered = scopedSitemapUrls.length < before;
292
+ }
293
+ }
294
+ // 3. Normalize both sets for comparison
295
+ const llmsNormalized = new Set(llmsTxtUrls.map(normalizeUrlPath));
296
+ const sitemapNormalized = new Map(); // normalized -> original URL
297
+ for (const url of scopedSitemapUrls) {
298
+ const norm = normalizeUrlPath(url);
299
+ if (!isExcludedPath(norm, baseUrlPath)) {
300
+ sitemapNormalized.set(norm, url);
301
+ }
302
+ }
303
+ const excludedCount = scopedSitemapUrls.length - sitemapNormalized.size;
304
+ // 4. Missing coverage: in sitemap but not in llms.txt
305
+ const missingFromLlmsTxt = [];
306
+ for (const [norm, originalUrl] of sitemapNormalized) {
307
+ if (!llmsNormalized.has(norm)) {
308
+ missingFromLlmsTxt.push(originalUrl);
309
+ }
310
+ }
311
+ // 5. Unmatched llms.txt links: in llms.txt but not in sitemap
312
+ // This could mean either (a) the page was removed (truly stale) or
313
+ // (b) the sitemap is incomplete. We report it but don't use it to
314
+ // determine the overall status since we can't distinguish the two
315
+ // without fetching every URL (which llms-txt-links-resolve handles).
316
+ const sitemapNormalizedSet = new Set(sitemapNormalized.keys());
317
+ const unmatchedLlmsTxtUrls = [];
318
+ for (const url of llmsTxtUrls) {
319
+ const norm = normalizeUrlPath(url);
320
+ // Only check URLs under the same origin and path prefix
321
+ try {
322
+ const parsed = new URL(url);
323
+ if (parsed.origin !== effectiveOrigin)
324
+ continue;
325
+ if (baseUrlPath &&
326
+ baseUrlPath !== '/' &&
327
+ !parsed.pathname.startsWith(baseUrlPath + '/') &&
328
+ parsed.pathname !== baseUrlPath) {
329
+ continue;
330
+ }
331
+ }
332
+ catch {
333
+ continue;
334
+ }
335
+ if (isExcludedPath(norm, baseUrlPath))
336
+ continue;
337
+ if (!sitemapNormalizedSet.has(norm)) {
338
+ unmatchedLlmsTxtUrls.push(url);
339
+ }
340
+ }
341
+ // 6. Compute metrics
342
+ const sitemapDocPages = sitemapNormalized.size;
343
+ const coveredCount = sitemapDocPages - missingFromLlmsTxt.length;
344
+ const coverageRate = sitemapDocPages > 0 ? coveredCount / sitemapDocPages : 1;
345
+ const unmatchedRate = llmsTxtUrls.length > 0 ? unmatchedLlmsTxtUrls.length / llmsTxtUrls.length : 0;
346
+ const coveragePct = Math.round(coverageRate * 100);
347
+ const unmatchedPct = Math.round(unmatchedRate * 100);
348
+ // 7. Determine status based on coverage only
349
+ // Unmatched links are informational (see note in step 5)
350
+ let overallStatus;
351
+ if (coverageRate >= COVERAGE_PASS) {
352
+ overallStatus = 'pass';
353
+ }
354
+ else if (coverageRate >= COVERAGE_WARN) {
355
+ overallStatus = 'warn';
356
+ }
357
+ else {
358
+ overallStatus = 'fail';
359
+ }
360
+ // 8. Build message
361
+ const parts = [];
362
+ if (overallStatus === 'pass') {
363
+ parts.push(`llms.txt covers ${coveragePct}% of ${sitemapDocPages} sitemap doc pages`);
364
+ }
365
+ else {
366
+ parts.push(`llms.txt covers ${coveredCount}/${sitemapDocPages} sitemap doc pages (${coveragePct}%); ${missingFromLlmsTxt.length} missing`);
367
+ }
368
+ if (unmatchedLlmsTxtUrls.length > 0) {
369
+ parts.push(`${unmatchedLlmsTxtUrls.length} llms.txt links not in sitemap (may indicate stale links or incomplete sitemap)`);
370
+ }
371
+ const message = parts.join('; ');
3
372
  return {
4
- id: 'llms-txt-freshness',
5
- category: 'observability',
6
- status: 'skip',
7
- message: 'Not yet implemented',
373
+ id,
374
+ category,
375
+ status: overallStatus,
376
+ message,
377
+ details: {
378
+ llmsTxtPageCount: llmsTxtUrls.length,
379
+ sitemapTotal: sitemapUrls.length,
380
+ sitemapScoped: scopedSitemapUrls.length,
381
+ sitemapDocPages,
382
+ sitemapSource,
383
+ excludedNonDocPages: excludedCount,
384
+ ...(localeFiltered ? { localeFiltered: true, detectedLocale } : {}),
385
+ baseUrlPath: baseUrlPath || '/',
386
+ coverageRate: coveragePct,
387
+ missingFromLlmsTxt: missingFromLlmsTxt.slice(0, 50),
388
+ missingCount: missingFromLlmsTxt.length,
389
+ unmatchedLlmsTxtUrls: unmatchedLlmsTxtUrls.slice(0, 50),
390
+ unmatchedCount: unmatchedLlmsTxtUrls.length,
391
+ unmatchedPct,
392
+ sitemapWarnings,
393
+ },
8
394
  };
9
395
  }
10
396
  registerCheck({
@@ -1 +1 @@
1
- {"version":3,"file":"llms-txt-freshness.js","sourceRoot":"","sources":["../../../src/checks/observability/llms-txt-freshness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,oBAAoB;QACxB,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,oBAAoB;IACxB,QAAQ,EAAE,eAAe;IACzB,WAAW,EAAE,yDAAyD;IACtE,SAAS,EAAE,CAAC,iBAAiB,CAAC;IAC9B,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
1
+ {"version":3,"file":"llms-txt-freshness.js","sourceRoot":"","sources":["../../../src/checks/observability/llms-txt-freshness.ts"],"names":[],"mappings":"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"}