afdocs 0.3.4 → 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 (77) hide show
  1. package/README.md +53 -30
  2. package/dist/checks/agent-discoverability/llms-txt-directive.js +206 -5
  3. package/dist/checks/agent-discoverability/llms-txt-directive.js.map +1 -1
  4. package/dist/checks/authentication/auth-alternative-access.js +109 -6
  5. package/dist/checks/authentication/auth-alternative-access.js.map +1 -1
  6. package/dist/checks/authentication/auth-gate-detection.js +8 -3
  7. package/dist/checks/authentication/auth-gate-detection.js.map +1 -1
  8. package/dist/checks/content-structure/markdown-code-fence-validity.js +1 -1
  9. package/dist/checks/content-structure/markdown-code-fence-validity.js.map +1 -1
  10. package/dist/checks/content-structure/section-header-quality.js +240 -6
  11. package/dist/checks/content-structure/section-header-quality.js.map +1 -1
  12. package/dist/checks/content-structure/tabbed-content-serialization.js +200 -5
  13. package/dist/checks/content-structure/tabbed-content-serialization.js.map +1 -1
  14. package/dist/checks/index.d.ts +1 -0
  15. package/dist/checks/index.d.ts.map +1 -1
  16. package/dist/checks/index.js +1 -0
  17. package/dist/checks/index.js.map +1 -1
  18. package/dist/checks/llms-txt/llms-txt-exists.js +17 -10
  19. package/dist/checks/llms-txt/llms-txt-exists.js.map +1 -1
  20. package/dist/checks/observability/llms-txt-freshness.d.ts +24 -1
  21. package/dist/checks/observability/llms-txt-freshness.d.ts.map +1 -1
  22. package/dist/checks/observability/llms-txt-freshness.js +391 -5
  23. package/dist/checks/observability/llms-txt-freshness.js.map +1 -1
  24. package/dist/checks/observability/markdown-content-parity.js +599 -5
  25. package/dist/checks/observability/markdown-content-parity.js.map +1 -1
  26. package/dist/checks/page-size/content-start-position.js +3 -7
  27. package/dist/checks/page-size/content-start-position.js.map +1 -1
  28. package/dist/checks/page-size/page-size-html.js +4 -8
  29. package/dist/checks/page-size/page-size-html.js.map +1 -1
  30. package/dist/checks/page-size/rendering-strategy.d.ts +2 -0
  31. package/dist/checks/page-size/rendering-strategy.d.ts.map +1 -0
  32. package/dist/checks/page-size/rendering-strategy.js +154 -0
  33. package/dist/checks/page-size/rendering-strategy.js.map +1 -0
  34. package/dist/checks/url-stability/redirect-behavior.js +127 -5
  35. package/dist/checks/url-stability/redirect-behavior.js.map +1 -1
  36. package/dist/cli/commands/check.d.ts.map +1 -1
  37. package/dist/cli/commands/check.js +9 -0
  38. package/dist/cli/commands/check.js.map +1 -1
  39. package/dist/cli/formatters/text.d.ts.map +1 -1
  40. package/dist/cli/formatters/text.js +13 -3
  41. package/dist/cli/formatters/text.js.map +1 -1
  42. package/dist/cli/index.d.ts.map +1 -1
  43. package/dist/cli/index.js +4 -1
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/constants.d.ts.map +1 -1
  46. package/dist/constants.js +1 -0
  47. package/dist/constants.js.map +1 -1
  48. package/dist/helpers/detect-rendering.d.ts +31 -0
  49. package/dist/helpers/detect-rendering.d.ts.map +1 -0
  50. package/dist/helpers/detect-rendering.js +85 -0
  51. package/dist/helpers/detect-rendering.js.map +1 -0
  52. package/dist/helpers/detect-tabs.d.ts +12 -0
  53. package/dist/helpers/detect-tabs.d.ts.map +1 -0
  54. package/dist/helpers/detect-tabs.js +309 -0
  55. package/dist/helpers/detect-tabs.js.map +1 -0
  56. package/dist/helpers/fetch-page.d.ts +8 -0
  57. package/dist/helpers/fetch-page.d.ts.map +1 -0
  58. package/dist/helpers/fetch-page.js +20 -0
  59. package/dist/helpers/fetch-page.js.map +1 -0
  60. package/dist/helpers/get-page-urls.d.ts +9 -0
  61. package/dist/helpers/get-page-urls.d.ts.map +1 -1
  62. package/dist/helpers/get-page-urls.js +153 -21
  63. package/dist/helpers/get-page-urls.js.map +1 -1
  64. package/dist/helpers/index.d.ts +5 -0
  65. package/dist/helpers/index.d.ts.map +1 -1
  66. package/dist/helpers/index.js +3 -0
  67. package/dist/helpers/index.js.map +1 -1
  68. package/dist/helpers/to-md-urls.d.ts +4 -0
  69. package/dist/helpers/to-md-urls.d.ts.map +1 -1
  70. package/dist/helpers/to-md-urls.js +13 -0
  71. package/dist/helpers/to-md-urls.js.map +1 -1
  72. package/dist/runner.d.ts.map +1 -1
  73. package/dist/runner.js +1 -0
  74. package/dist/runner.js.map +1 -1
  75. package/dist/types.d.ts +19 -0
  76. package/dist/types.d.ts.map +1 -1
  77. package/package.json +2 -1
@@ -1,17 +1,251 @@
1
+ import { parse } from 'node-html-parser';
1
2
  import { registerCheck } from '../registry.js';
2
- async function check(_ctx) {
3
+ const MD_HEADING_RE = /^#{1,6}\s+(.+)$/gm;
4
+ /**
5
+ * Extract header text from content that may be HTML, markdown, or a mix (MDX).
6
+ * Tries HTML parsing first, then falls back to markdown heading regex.
7
+ */
8
+ function extractHeaders(content) {
9
+ const headers = [];
10
+ // HTML headers
11
+ const root = parse(content);
12
+ const htmlHeaders = root.querySelectorAll('h1, h2, h3, h4, h5, h6');
13
+ for (const h of htmlHeaders) {
14
+ const text = h.textContent.trim();
15
+ if (text.length > 0)
16
+ headers.push(text);
17
+ }
18
+ // Markdown headers (## Heading)
19
+ let match;
20
+ while ((match = MD_HEADING_RE.exec(content)) !== null) {
21
+ const text = match[1].trim();
22
+ if (text.length > 0)
23
+ headers.push(text);
24
+ }
25
+ return headers;
26
+ }
27
+ async function check(ctx) {
28
+ const id = 'section-header-quality';
29
+ const category = 'content-structure';
30
+ const tabResult = ctx.previousResults.get('tabbed-content-serialization');
31
+ if (!tabResult || tabResult.status === 'skip') {
32
+ return {
33
+ id,
34
+ category,
35
+ status: 'skip',
36
+ message: 'Skipped: tabbed-content-serialization did not run',
37
+ };
38
+ }
39
+ const tabbedPages = tabResult.details?.tabbedPages ?? [];
40
+ const pagesWithGroups = tabbedPages.filter((p) => p.tabGroups && p.tabGroups.length > 0);
41
+ if (pagesWithGroups.length === 0) {
42
+ return {
43
+ id,
44
+ category,
45
+ status: 'pass',
46
+ message: 'No tabbed content found; header quality check not applicable',
47
+ };
48
+ }
49
+ const analyses = [];
50
+ // Track unique headers per analysis for cross-group pass
51
+ const analysisHeaderSets = [];
52
+ for (const page of pagesWithGroups) {
53
+ for (const group of page.tabGroups) {
54
+ if (group.panels.length < 2)
55
+ continue;
56
+ // Extract headers from each panel
57
+ const panelHeaders = group.panels.map((panel) => ({
58
+ label: panel.label,
59
+ headers: extractHeaders(panel.html),
60
+ }));
61
+ // Count how many times each header text appears across panels
62
+ const headerCounts = new Map();
63
+ const uniqueHeaders = new Set();
64
+ for (const ph of panelHeaders) {
65
+ for (const h of ph.headers) {
66
+ const lower = h.toLowerCase();
67
+ headerCounts.set(lower, (headerCounts.get(lower) ?? 0) + 1);
68
+ uniqueHeaders.add(lower);
69
+ }
70
+ }
71
+ const allHeaders = panelHeaders.flatMap((ph) => ph.headers);
72
+ let genericCount = 0;
73
+ let contextualCount = 0;
74
+ for (const ph of panelHeaders) {
75
+ for (const h of ph.headers) {
76
+ const lower = h.toLowerCase();
77
+ const appearsInMultiple = (headerCounts.get(lower) ?? 0) >= 2;
78
+ // A header is contextual if it includes the panel label or is unique
79
+ const includesLabel = ph.label != null && lower.includes(ph.label.toLowerCase());
80
+ if (includesLabel || !appearsInMultiple) {
81
+ contextualCount++;
82
+ }
83
+ else {
84
+ genericCount++;
85
+ }
86
+ }
87
+ }
88
+ const totalHeaders = allHeaders.length;
89
+ const hasGenericMajority = totalHeaders > 0 && genericCount > totalHeaders / 2;
90
+ analysisHeaderSets.push(uniqueHeaders);
91
+ analyses.push({
92
+ url: page.url,
93
+ framework: group.framework,
94
+ totalHeaders,
95
+ genericHeaders: genericCount,
96
+ contextualHeaders: contextualCount,
97
+ hasGenericMajority,
98
+ hasCrossGroupGeneric: false,
99
+ });
100
+ }
101
+ }
102
+ // Cross-group analysis: detect identical headers repeated across separate tab groups
103
+ // on the same page without variant context (e.g. "Build a MongoDB Search Query"
104
+ // appearing in 7 driver-specific tab groups).
105
+ let crossGroupGenericGroupCount = 0;
106
+ let crossGroupTotalGroupCount = 0;
107
+ const crossGroupRepeatedHeaders = [];
108
+ for (const page of pagesWithGroups) {
109
+ if (page.tabGroups.length < 2)
110
+ continue;
111
+ // Collect all panel labels and unique headers per group
112
+ const allLabels = new Set();
113
+ const perGroup = [];
114
+ for (const group of page.tabGroups) {
115
+ const headers = new Set();
116
+ for (const panel of group.panels) {
117
+ if (panel.label)
118
+ allLabels.add(panel.label.toLowerCase());
119
+ for (const h of extractHeaders(panel.html))
120
+ headers.add(h.toLowerCase());
121
+ }
122
+ perGroup.push(headers);
123
+ }
124
+ // Count how many groups each header appears in
125
+ const headerGroupCount = new Map();
126
+ for (const hs of perGroup) {
127
+ for (const h of hs)
128
+ headerGroupCount.set(h, (headerGroupCount.get(h) ?? 0) + 1);
129
+ }
130
+ // A header is cross-group generic if it appears in 2+ groups and doesn't
131
+ // include any panel label (i.e. lacks variant context)
132
+ const crossGenericSet = new Set();
133
+ for (const [header, count] of headerGroupCount) {
134
+ if (count >= 2 && ![...allLabels].some((l) => header.includes(l))) {
135
+ crossGenericSet.add(header);
136
+ crossGroupRepeatedHeaders.push({ url: page.url, header, groupCount: count });
137
+ }
138
+ }
139
+ // Count groups affected by cross-group generic headers
140
+ for (const hs of perGroup) {
141
+ if (hs.size === 0)
142
+ continue;
143
+ crossGroupTotalGroupCount++;
144
+ if ([...hs].some((h) => crossGenericSet.has(h)))
145
+ crossGroupGenericGroupCount++;
146
+ }
147
+ // Update individual analyses with cross-group flag
148
+ if (crossGenericSet.size > 0) {
149
+ for (let i = 0; i < analyses.length; i++) {
150
+ if (analyses[i].url !== page.url)
151
+ continue;
152
+ if ([...analysisHeaderSets[i]].some((h) => crossGenericSet.has(h))) {
153
+ analyses[i].hasCrossGroupGeneric = true;
154
+ }
155
+ }
156
+ }
157
+ }
158
+ if (analyses.length === 0 && crossGroupTotalGroupCount === 0) {
159
+ return {
160
+ id,
161
+ category,
162
+ status: 'pass',
163
+ message: 'Tab groups have fewer than 2 panels; header quality check not applicable',
164
+ };
165
+ }
166
+ const groupsWithGenericMajority = analyses.filter((a) => a.hasGenericMajority).length;
167
+ const groupsWithHeaders = analyses.filter((a) => a.totalHeaders > 0).length;
168
+ // If no tab panels contain any section headers, we can't evaluate quality
169
+ if (groupsWithHeaders === 0 && crossGroupTotalGroupCount === 0) {
170
+ return {
171
+ id,
172
+ category,
173
+ status: 'skip',
174
+ message: `${pagesWithGroups.length} page(s) with tabs found, but no section headers inside tab panels to evaluate`,
175
+ };
176
+ }
177
+ // Identify affected pages: pages where any group has within-group or cross-group issues
178
+ const pagesWithWithinGroupIssues = new Set(analyses.filter((a) => a.hasGenericMajority).map((a) => a.url));
179
+ const pagesWithCrossGroupIssues = new Set(crossGroupRepeatedHeaders.map((h) => h.url));
180
+ const affectedPages = new Set([...pagesWithWithinGroupIssues, ...pagesWithCrossGroupIssues]);
181
+ // Count pages where we actually found headers to evaluate
182
+ const pagesWithHeaders = new Set(analyses.filter((a) => a.totalHeaders > 0).map((a) => a.url));
183
+ // Scoring: use group-level ratios for fine-grained thresholds
184
+ // Within-group: ratio of groups-with-headers that have majority-generic
185
+ let withinStatus = 'pass';
186
+ if (groupsWithHeaders > 0) {
187
+ const wRatio = groupsWithGenericMajority / groupsWithHeaders;
188
+ if (wRatio > 0.5)
189
+ withinStatus = 'fail';
190
+ else if (wRatio > 0.25)
191
+ withinStatus = 'warn';
192
+ }
193
+ // Cross-group: ratio of groups on multi-group pages that have cross-group generics
194
+ let crossGroupStatus = 'pass';
195
+ if (crossGroupTotalGroupCount > 0) {
196
+ const cRatio = crossGroupGenericGroupCount / crossGroupTotalGroupCount;
197
+ if (cRatio > 0.5)
198
+ crossGroupStatus = 'fail';
199
+ else if (cRatio > 0.25)
200
+ crossGroupStatus = 'warn';
201
+ }
202
+ // Combined status: worst of both
203
+ const statusRank = { pass: 0, skip: 0, warn: 1, fail: 2, error: 2 };
204
+ const status = statusRank[crossGroupStatus] > statusRank[withinStatus] ? crossGroupStatus : withinStatus;
205
+ // Build a page-oriented message for docs teams
206
+ let message;
207
+ if (affectedPages.size === 0) {
208
+ message = `${pagesWithHeaders.size} page(s) with tab headers checked; headers include variant context`;
209
+ }
210
+ else {
211
+ // Find the most-repeated cross-group header for a concrete example
212
+ const worstHeader = crossGroupRepeatedHeaders.length > 0
213
+ ? [...crossGroupRepeatedHeaders].sort((a, b) => b.groupCount - a.groupCount)[0]
214
+ : null;
215
+ const pageSummary = `${affectedPages.size} of ${pagesWithHeaders.size} page(s) with tab headers ` +
216
+ `don't distinguish between variants`;
217
+ if (worstHeader) {
218
+ message = `${pageSummary} (e.g. "${worstHeader.header}" repeats across ${worstHeader.groupCount} tab groups)`;
219
+ }
220
+ else {
221
+ message = pageSummary;
222
+ }
223
+ }
3
224
  return {
4
- id: 'section-header-quality',
5
- category: 'content-structure',
6
- status: 'skip',
7
- message: 'Not yet implemented',
225
+ id,
226
+ category,
227
+ status,
228
+ message,
229
+ details: {
230
+ pagesWithTabs: pagesWithGroups.length,
231
+ pagesAffected: affectedPages.size,
232
+ totalGroupsAnalyzed: analyses.length,
233
+ groupsWithHeaders,
234
+ groupsWithGenericMajority,
235
+ crossGroupGenericGroupCount,
236
+ crossGroupTotalGroupCount,
237
+ crossGroupRepeatedHeaders,
238
+ analyses,
239
+ },
8
240
  };
9
241
  }
10
242
  registerCheck({
11
243
  id: 'section-header-quality',
12
244
  category: 'content-structure',
13
245
  description: 'Whether headers in tabbed sections include variant context',
14
- dependsOn: ['tabbed-content-serialization'],
246
+ // No hard dependency: we read from previousResults if available,
247
+ // but the check handles missing data gracefully (returns skip).
248
+ dependsOn: [],
15
249
  run: check,
16
250
  });
17
251
  //# sourceMappingURL=section-header-quality.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"section-header-quality.js","sourceRoot":"","sources":["../../../src/checks/content-structure/section-header-quality.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,wBAAwB;QAC5B,QAAQ,EAAE,mBAAmB;QAC7B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,wBAAwB;IAC5B,QAAQ,EAAE,mBAAmB;IAC7B,WAAW,EAAE,4DAA4D;IACzE,SAAS,EAAE,CAAC,8BAA8B,CAAC;IAC3C,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
1
+ {"version":3,"file":"section-header-quality.js","sourceRoot":"","sources":["../../../src/checks/content-structure/section-header-quality.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,205 @@
1
1
  import { registerCheck } from '../registry.js';
2
- async function check(_ctx) {
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: 'tabbed-content-serialization',
5
- category: 'content-structure',
6
- status: 'skip',
7
- message: 'Not yet implemented',
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;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,8BAA8B;QAClC,QAAQ,EAAE,mBAAmB;QAC7B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,8BAA8B;IAClC,QAAQ,EAAE,mBAAmB;IAC7B,WAAW,EAAE,mEAAmE;IAChF,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,KAAK;CACX,CAAC,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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"}
@@ -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"}
@@ -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';
@@ -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":"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"}
1
+ {"version":3,"file":"llms-txt-exists.js","sourceRoot":"","sources":["../../../src/checks/llms-txt/llms-txt-exists.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,25 @@
1
- export {};
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"}