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
package/README.md CHANGED
@@ -7,12 +7,12 @@ Test your documentation site against the [Agent-Friendly Documentation Spec](htt
7
7
 
8
8
  Agents don't use docs like humans. They hit truncation limits, get walls of CSS instead of content, can't follow cross-host redirects, and don't know about quality-of-life improvements like `llms.txt` or `.md` docs pages that would make life swell. Maybe this is because the industry has lacked guidance - until now.
9
9
 
10
- afdocs runs 21 checks across 8 categories to evaluate how well your docs serve agent consumers. 14 are fully implemented; the rest return `skip` until completed.
10
+ afdocs runs 22 checks across 8 categories to evaluate how well your docs serve agent consumers.
11
11
 
12
12
  > **Status: Early development (0.x)**
13
13
  > This project is under active development. Check IDs, CLI flags, and output formats may change between minor versions. Feel free to try it out, but don't build automation against specific output until 1.0.
14
14
  >
15
- > Implements [spec v0.1.0](https://agentdocsspec.com/spec) (2026-02-22).
15
+ > Implements [spec v0.2.1](https://agentdocsspec.com/spec) (2026-03-15).
16
16
 
17
17
  ## Quick start
18
18
 
@@ -43,7 +43,7 @@ Authentication
43
43
  ✓ auth-gate-detection: All 50 sampled pages are publicly accessible
44
44
 
45
45
  Summary
46
- 9 passed, 3 failed, 9 skipped (21 total)
46
+ 9 passed, 3 failed, 10 skipped (22 total)
47
47
  ```
48
48
 
49
49
  ## Install
@@ -75,12 +75,34 @@ afdocs check https://docs.example.com --pass-threshold 30000 --fail-threshold 80
75
75
  | `--format <format>` | `text` | Output format: `text` or `json` |
76
76
  | `-v, --verbose` | | Show per-page details for checks with issues |
77
77
  | `--checks <ids>` | all | Comma-separated list of check IDs |
78
+ | `--sampling <strategy>` | `random` | URL sampling strategy (see below) |
78
79
  | `--max-concurrency <n>` | `3` | Maximum concurrent HTTP requests |
79
80
  | `--request-delay <ms>` | `200` | Delay between requests |
80
81
  | `--max-links <n>` | `50` | Maximum links to test in link checks |
81
82
  | `--pass-threshold <n>` | `50000` | Size pass threshold (characters) |
82
83
  | `--fail-threshold <n>` | `100000` | Size fail threshold (characters) |
83
84
 
85
+ ### Sampling strategies
86
+
87
+ By default, afdocs discovers pages from your site (via `llms.txt`, sitemap, or both) and randomly samples up to `--max-links` pages to check. The `--sampling` flag gives you control over how that sample is selected.
88
+
89
+ | Strategy | Behavior |
90
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
91
+ | `random` | Shuffle discovered URLs and take the first N. Fast and broad, but results vary between runs. |
92
+ | `deterministic` | Sort discovered URLs alphabetically, then pick every Nth URL for an even spread. Produces the same sample on repeated runs as long as the URL set is stable. |
93
+ | `none` | Skip discovery entirely. Only check the URL you pass on the command line. |
94
+
95
+ ```bash
96
+ # Reproducible runs for CI or iteration (same pages every time)
97
+ afdocs check https://docs.example.com --sampling deterministic
98
+
99
+ # Check a single page without any discovery
100
+ afdocs check https://docs.example.com/api/auth --sampling none
101
+
102
+ # Check a single page with specific checks
103
+ afdocs check https://docs.example.com/api/auth --sampling none --checks page-size-html,redirect-behavior
104
+ ```
105
+
84
106
  ### Exit codes
85
107
 
86
108
  - `0` if all checks pass or warn
@@ -144,7 +166,7 @@ describe('agent-friendliness', () => {
144
166
 
145
167
  ## Checks
146
168
 
147
- 21 checks across 8 categories. Checks marked with \* are not yet implemented and return `skip`.
169
+ 22 checks across 8 categories.
148
170
 
149
171
  ### Category 1: llms.txt
150
172
 
@@ -165,47 +187,48 @@ describe('agent-friendliness', () => {
165
187
 
166
188
  ### Category 3: Page Size and Truncation Risk
167
189
 
168
- | Check | Description |
169
- | ------------------------ | ------------------------------------------------ |
170
- | `page-size-markdown` | Character count when served as markdown |
171
- | `page-size-html` | Character count of HTML and post-conversion size |
172
- | `content-start-position` | How far into the response actual content begins |
190
+ | Check | Description |
191
+ | ------------------------ | --------------------------------------------------------------- |
192
+ | `rendering-strategy` | Whether pages contain server-rendered content or are SPA shells |
193
+ | `page-size-markdown` | Character count when served as markdown |
194
+ | `page-size-html` | Character count of HTML and post-conversion size |
195
+ | `content-start-position` | How far into the response actual content begins |
173
196
 
174
197
  ### Category 4: Content Structure
175
198
 
176
- | Check | Description |
177
- | --------------------------------- | -------------------------------------------------- |
178
- | `tabbed-content-serialization` \* | Whether tabbed content creates oversized output |
179
- | `section-header-quality` \* | Whether headers in tabbed sections include context |
180
- | `markdown-code-fence-validity` | Whether markdown has unclosed code fences |
199
+ | Check | Description |
200
+ | ------------------------------ | -------------------------------------------------- |
201
+ | `tabbed-content-serialization` | Whether tabbed content creates oversized output |
202
+ | `section-header-quality` | Whether headers in tabbed sections include context |
203
+ | `markdown-code-fence-validity` | Whether markdown has unclosed code fences |
181
204
 
182
205
  ### Category 5: URL Stability and Redirects
183
206
 
184
- | Check | Description |
185
- | ---------------------- | ----------------------------------------------- |
186
- | `http-status-codes` | Whether error pages return correct status codes |
187
- | `redirect-behavior` \* | Whether redirects are same-host HTTP redirects |
207
+ | Check | Description |
208
+ | ------------------- | ----------------------------------------------- |
209
+ | `http-status-codes` | Whether error pages return correct status codes |
210
+ | `redirect-behavior` | Whether redirects are same-host HTTP redirects |
188
211
 
189
212
  ### Category 6: Agent Discoverability Directives
190
213
 
191
- | Check | Description |
192
- | ----------------------- | -------------------------------------------------------- |
193
- | `llms-txt-directive` \* | Whether pages include a directive pointing to `llms.txt` |
214
+ | Check | Description |
215
+ | -------------------- | -------------------------------------------------------- |
216
+ | `llms-txt-directive` | Whether pages include a directive pointing to `llms.txt` |
194
217
 
195
218
  ### Category 7: Observability and Content Health
196
219
 
197
- | Check | Description |
198
- | ---------------------------- | ---------------------------------------------- |
199
- | `llms-txt-freshness` \* | Whether `llms.txt` reflects current site state |
200
- | `markdown-content-parity` \* | Whether markdown and HTML versions match |
201
- | `cache-header-hygiene` | Whether cache headers allow timely updates |
220
+ | Check | Description |
221
+ | ------------------------- | ---------------------------------------------- |
222
+ | `llms-txt-freshness` | Whether `llms.txt` reflects current site state |
223
+ | `markdown-content-parity` | Whether markdown and HTML versions match |
224
+ | `cache-header-hygiene` | Whether cache headers allow timely updates |
202
225
 
203
226
  ### Category 8: Authentication and Access
204
227
 
205
- | Check | Description |
206
- | ---------------------------- | -------------------------------------------------------------------- |
207
- | `auth-gate-detection` | Whether documentation pages require authentication to access content |
208
- | `auth-alternative-access` \* | Whether auth-gated sites provide alternative access paths for agents |
228
+ | Check | Description |
229
+ | ------------------------- | -------------------------------------------------------------------- |
230
+ | `auth-gate-detection` | Whether documentation pages require authentication to access content |
231
+ | `auth-alternative-access` | Whether auth-gated sites provide alternative access paths for agents |
209
232
 
210
233
  ## Check dependencies
211
234
 
@@ -1,10 +1,211 @@
1
1
  import { registerCheck } from '../registry.js';
2
- async function check(_ctx) {
2
+ import { discoverAndSamplePages } from '../../helpers/get-page-urls.js';
3
+ /**
4
+ * Patterns that indicate an agent-facing directive pointing to llms.txt.
5
+ *
6
+ * HTML pattern matches:
7
+ * - Links whose href contains "llms.txt"
8
+ * - Text mentioning "llms.txt" in prose
9
+ *
10
+ * Markdown pattern matches:
11
+ * - Markdown links to llms.txt (e.g., [index](/llms.txt))
12
+ * - Plain text mentioning "llms.txt"
13
+ */
14
+ const HTML_DIRECTIVE_PATTERN = /(?:<a\s[^>]*href\s*=\s*["'][^"']*llms\.txt[^"']*["'][^>]*>[\s\S]*?<\/a>|llms\.txt)/gi;
15
+ const MARKDOWN_DIRECTIVE_PATTERN = /llms\.txt/gi;
16
+ /** Percentage threshold: directive in the first 10% is "near the top". */
17
+ const TOP_THRESHOLD = 0.1;
18
+ /** Percentage threshold: directive past 50% is "buried deep". */
19
+ const DEEP_THRESHOLD = 0.5;
20
+ /**
21
+ * Extract the HTML body content (between <body> and </body>), or fall
22
+ * back to the full HTML if no body tags are found.
23
+ */
24
+ function extractBody(html) {
25
+ const openMatch = /<body[\s>]/i.exec(html);
26
+ if (!openMatch)
27
+ return { body: html, offset: 0 };
28
+ const bodyStart = html.indexOf('>', openMatch.index + openMatch[0].length - 1) + 1;
29
+ const closeMatch = /<\/body\s*>/i.exec(html.slice(bodyStart));
30
+ const bodyEnd = closeMatch ? bodyStart + closeMatch.index : html.length;
31
+ return { body: html.slice(bodyStart, bodyEnd), offset: bodyStart };
32
+ }
33
+ /**
34
+ * Convert a markdown URL back to its HTML equivalent.
35
+ * Strips trailing `.md` extension or `/index.md` suffix.
36
+ */
37
+ function toHtmlUrl(url) {
38
+ try {
39
+ const u = new URL(url);
40
+ if (u.pathname.endsWith('.md')) {
41
+ u.pathname = u.pathname.replace(/(?:\/index)?\.md$/, '') || '/';
42
+ // Ensure trailing slash for directory-style URLs
43
+ if (u.pathname !== '/' && !u.pathname.includes('.')) {
44
+ u.pathname = u.pathname.replace(/\/?$/, '/');
45
+ }
46
+ return u.toString();
47
+ }
48
+ }
49
+ catch {
50
+ // Fall through to return original
51
+ }
52
+ return url;
53
+ }
54
+ function searchContent(content, pattern) {
55
+ const match = pattern.exec(content);
56
+ pattern.lastIndex = 0;
57
+ if (!match)
58
+ return null;
59
+ return { position: match.index, matchText: match[0].slice(0, 200) };
60
+ }
61
+ async function check(ctx) {
62
+ const id = 'llms-txt-directive';
63
+ const category = 'agent-discoverability';
64
+ const { urls: pageUrls, totalPages, sampled, warnings } = await discoverAndSamplePages(ctx);
65
+ const results = [];
66
+ const concurrency = ctx.options.maxConcurrency;
67
+ for (let i = 0; i < pageUrls.length; i += concurrency) {
68
+ const batch = pageUrls.slice(i, i + concurrency);
69
+ const batchResults = await Promise.all(batch.map(async (url) => {
70
+ try {
71
+ // Try the HTML version of the page first
72
+ const htmlUrl = toHtmlUrl(url);
73
+ const response = await ctx.http.fetch(htmlUrl);
74
+ if (!response.ok) {
75
+ return { url: htmlUrl, found: false, error: `HTTP ${response.status}` };
76
+ }
77
+ const contentType = response.headers.get('content-type') ?? '';
78
+ const text = await response.text();
79
+ // Determine if we got HTML or markdown
80
+ const isHtml = contentType.includes('text/html') || text.trimStart().startsWith('<');
81
+ if (isHtml) {
82
+ const { body } = extractBody(text);
83
+ const hit = searchContent(body, HTML_DIRECTIVE_PATTERN);
84
+ if (hit) {
85
+ const positionPercent = body.length > 0 ? hit.position / body.length : 0;
86
+ return {
87
+ url: htmlUrl,
88
+ found: true,
89
+ source: 'html',
90
+ position: hit.position,
91
+ positionPercent,
92
+ matchText: hit.matchText,
93
+ };
94
+ }
95
+ }
96
+ else {
97
+ // Got markdown content; search it directly
98
+ const hit = searchContent(text, MARKDOWN_DIRECTIVE_PATTERN);
99
+ if (hit) {
100
+ const positionPercent = text.length > 0 ? hit.position / text.length : 0;
101
+ return {
102
+ url: htmlUrl,
103
+ found: true,
104
+ source: 'markdown',
105
+ position: hit.position,
106
+ positionPercent,
107
+ matchText: hit.matchText,
108
+ };
109
+ }
110
+ }
111
+ // If the original URL was different (a .md URL), also check it
112
+ if (url !== htmlUrl) {
113
+ try {
114
+ const mdResponse = await ctx.http.fetch(url);
115
+ if (mdResponse.ok) {
116
+ const mdText = await mdResponse.text();
117
+ const hit = searchContent(mdText, MARKDOWN_DIRECTIVE_PATTERN);
118
+ if (hit) {
119
+ const positionPercent = mdText.length > 0 ? hit.position / mdText.length : 0;
120
+ return {
121
+ url,
122
+ found: true,
123
+ source: 'markdown',
124
+ position: hit.position,
125
+ positionPercent,
126
+ matchText: hit.matchText,
127
+ };
128
+ }
129
+ }
130
+ }
131
+ catch {
132
+ // Markdown fetch failed; that's fine, we already checked HTML
133
+ }
134
+ }
135
+ return { url: htmlUrl, found: false };
136
+ }
137
+ catch (err) {
138
+ return {
139
+ url,
140
+ found: false,
141
+ error: err instanceof Error ? err.message : String(err),
142
+ };
143
+ }
144
+ }));
145
+ results.push(...batchResults);
146
+ }
147
+ const tested = results.filter((r) => !r.error);
148
+ const fetchErrors = results.filter((r) => r.error).length;
149
+ const found = results.filter((r) => r.found);
150
+ const notFound = tested.filter((r) => !r.found);
151
+ if (tested.length === 0) {
152
+ return {
153
+ id,
154
+ category,
155
+ status: 'fail',
156
+ message: `Could not test any pages${fetchErrors > 0 ? `; ${fetchErrors} failed to fetch` : ''}`,
157
+ details: {
158
+ totalPages,
159
+ testedPages: results.length,
160
+ sampled,
161
+ fetchErrors,
162
+ pageResults: results,
163
+ discoveryWarnings: warnings,
164
+ },
165
+ };
166
+ }
167
+ // Classify pages with directives by position
168
+ const nearTop = found.filter((r) => (r.positionPercent ?? 1) <= TOP_THRESHOLD);
169
+ const buried = found.filter((r) => (r.positionPercent ?? 0) > DEEP_THRESHOLD);
170
+ let status;
171
+ let message;
172
+ const pageLabel = sampled ? 'sampled pages' : 'pages';
173
+ const suffix = fetchErrors > 0 ? `; ${fetchErrors} failed to fetch` : '';
174
+ if (found.length === 0) {
175
+ status = 'fail';
176
+ message = `No llms.txt directive found in any of ${tested.length} ${pageLabel}${suffix}`;
177
+ }
178
+ else if (buried.length > 0 && nearTop.length === 0) {
179
+ // All found directives are buried deep
180
+ status = 'warn';
181
+ message = `llms.txt directive found in ${found.length} of ${tested.length} ${pageLabel}, but buried deep in the page (past ${Math.round(DEEP_THRESHOLD * 100)}%)${suffix}`;
182
+ }
183
+ else if (notFound.length > 0) {
184
+ // Some pages have directives, some don't
185
+ status = 'warn';
186
+ message = `llms.txt directive found in ${found.length} of ${tested.length} ${pageLabel} (${notFound.length} missing)${suffix}`;
187
+ }
188
+ else {
189
+ status = 'pass';
190
+ message = `llms.txt directive found in all ${tested.length} ${pageLabel}${nearTop.length > 0 ? ', near the top of content' : ''}${suffix}`;
191
+ }
3
192
  return {
4
- id: 'llms-txt-directive',
5
- category: 'agent-discoverability',
6
- status: 'skip',
7
- message: 'Not yet implemented',
193
+ id,
194
+ category,
195
+ status,
196
+ message,
197
+ details: {
198
+ totalPages,
199
+ testedPages: tested.length,
200
+ sampled,
201
+ foundCount: found.length,
202
+ notFoundCount: notFound.length,
203
+ nearTopCount: nearTop.length,
204
+ buriedCount: buried.length,
205
+ fetchErrors,
206
+ pageResults: results,
207
+ discoveryWarnings: warnings,
208
+ },
8
209
  };
9
210
  }
10
211
  registerCheck({
@@ -1 +1 @@
1
- {"version":3,"file":"llms-txt-directive.js","sourceRoot":"","sources":["../../../src/checks/agent-discoverability/llms-txt-directive.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,uBAAuB;QACjC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,oBAAoB;IACxB,QAAQ,EAAE,uBAAuB;IACjC,WAAW,EAAE,wDAAwD;IACrE,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
1
+ {"version":3,"file":"llms-txt-directive.js","sourceRoot":"","sources":["../../../src/checks/agent-discoverability/llms-txt-directive.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,120 @@
1
1
  import { registerCheck } from '../registry.js';
2
- async function check(_ctx) {
2
+ async function check(ctx) {
3
+ const id = 'auth-alternative-access';
4
+ const category = 'authentication';
5
+ // Read auth-gate-detection result; skip if it didn't run or docs are all public
6
+ const authResult = ctx.previousResults.get('auth-gate-detection');
7
+ if (!authResult) {
8
+ return {
9
+ id,
10
+ category,
11
+ status: 'skip',
12
+ message: 'auth-gate-detection did not run',
13
+ };
14
+ }
15
+ if (authResult.status === 'pass') {
16
+ return {
17
+ id,
18
+ category,
19
+ status: 'skip',
20
+ message: 'All docs pages are publicly accessible; no alternative access paths needed',
21
+ };
22
+ }
23
+ if (authResult.status === 'skip' || authResult.status === 'error') {
24
+ return {
25
+ id,
26
+ category,
27
+ status: 'skip',
28
+ message: `auth-gate-detection ${authResult.status === 'error' ? 'errored' : 'was skipped'}; cannot assess alternative access`,
29
+ };
30
+ }
31
+ // Auth-gate-detection returned warn or fail — look for alternative access paths
32
+ const authDetails = (authResult.details ?? {});
33
+ const gatedCount = (authDetails.authRequired ?? 0) +
34
+ (authDetails.softAuthGate ?? 0) +
35
+ (authDetails.authRedirect ?? 0);
36
+ const accessibleCount = authDetails.accessible ?? 0;
37
+ const testedCount = authDetails.testedPages ?? 0;
38
+ const detectedPaths = [];
39
+ // 1. Check for public llms.txt
40
+ const llmsResult = ctx.previousResults.get('llms-txt-exists');
41
+ if (llmsResult?.status === 'pass' || llmsResult?.status === 'warn') {
42
+ detectedPaths.push({
43
+ type: 'public-llms-txt',
44
+ description: 'Site serves a public llms.txt file, giving agents a navigational index even though docs pages are gated',
45
+ });
46
+ }
47
+ // 2. Check for publicly accessible markdown
48
+ const mdUrlResult = ctx.previousResults.get('markdown-url-support');
49
+ const cnResult = ctx.previousResults.get('content-negotiation');
50
+ if (mdUrlResult?.status === 'pass' || mdUrlResult?.status === 'warn') {
51
+ detectedPaths.push({
52
+ type: 'public-markdown',
53
+ description: 'Some pages serve markdown via .md URLs, providing agent-readable content without authentication',
54
+ });
55
+ }
56
+ else if (cnResult?.status === 'pass' || cnResult?.status === 'warn') {
57
+ detectedPaths.push({
58
+ type: 'public-markdown',
59
+ description: 'Some pages serve markdown via content negotiation, providing agent-readable content without authentication',
60
+ });
61
+ }
62
+ // 3. Check for partially accessible pages (from auth-gate-detection itself)
63
+ if (accessibleCount > 0 && gatedCount > 0) {
64
+ const pct = Math.round((accessibleCount / testedCount) * 100);
65
+ detectedPaths.push({
66
+ type: 'partial-public-access',
67
+ description: `${accessibleCount} of ${testedCount} tested pages (${pct}%) are publicly accessible without authentication`,
68
+ });
69
+ }
70
+ // Determine status
71
+ const manualOnlyNote = 'Some access paths cannot be detected automatically: bundled SDK docs, CLI doc commands, and MCP servers';
72
+ let status;
73
+ let message;
74
+ if (detectedPaths.length === 0) {
75
+ status = 'fail';
76
+ message = `No alternative access paths detected for ${gatedCount} auth-gated pages. ${manualOnlyNote}`;
77
+ }
78
+ else {
79
+ // Pass if we found a full-content path (llms.txt + markdown, or most pages accessible).
80
+ // Warn if we only found partial paths (llms.txt alone is just an index, not content).
81
+ const hasContentPath = detectedPaths.some((p) => p.type === 'public-markdown');
82
+ const hasHighAccessibility = accessibleCount > 0 && testedCount > 0 && accessibleCount / testedCount >= 0.5;
83
+ if (hasContentPath || hasHighAccessibility) {
84
+ status = 'pass';
85
+ }
86
+ else {
87
+ status = 'warn';
88
+ }
89
+ const pathSummary = detectedPaths.map((p) => p.type).join(', ');
90
+ message =
91
+ status === 'pass'
92
+ ? `Alternative access detected (${pathSummary}) for site with ${gatedCount} auth-gated pages`
93
+ : `Partial alternative access detected (${pathSummary}) for site with ${gatedCount} auth-gated pages. ${manualOnlyNote}`;
94
+ }
3
95
  return {
4
- id: 'auth-alternative-access',
5
- category: 'authentication',
6
- status: 'skip',
7
- message: 'Not yet implemented',
96
+ id,
97
+ category,
98
+ status,
99
+ message,
100
+ details: {
101
+ gatedPages: gatedCount,
102
+ accessiblePages: accessibleCount,
103
+ testedPages: testedCount,
104
+ detectedPaths,
105
+ manualVerificationNeeded: [
106
+ 'Bundled documentation (docs shipped in package/SDK)',
107
+ 'CLI-based doc access (e.g. `yourproduct docs search "topic"`)',
108
+ 'MCP server providing doc access through tool calls',
109
+ ],
110
+ },
8
111
  };
9
112
  }
10
113
  registerCheck({
11
114
  id: 'auth-alternative-access',
12
115
  category: 'authentication',
13
116
  description: 'Whether an auth-gated documentation site provides alternative access paths for agents',
14
- dependsOn: [['auth-gate-detection']],
117
+ dependsOn: [],
15
118
  run: check,
16
119
  });
17
120
  //# sourceMappingURL=auth-alternative-access.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-alternative-access.js","sourceRoot":"","sources":["../../../src/checks/authentication/auth-alternative-access.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,yBAAyB;QAC7B,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,yBAAyB;IAC7B,QAAQ,EAAE,gBAAgB;IAC1B,WAAW,EACT,uFAAuF;IACzF,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACpC,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
1
+ {"version":3,"file":"auth-alternative-access.js","sourceRoot":"","sources":["../../../src/checks/authentication/auth-alternative-access.ts"],"names":[],"mappings":"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"}
@@ -25,11 +25,16 @@ function detectLoginForm(body) {
25
25
  if (sample.includes('<input') && sample.includes('type="password"')) {
26
26
  return 'Contains password input field';
27
27
  }
28
- // Check page title for login indicators
28
+ // Check page title for login indicators.
29
+ // Only match titles that suggest the page IS a login form, not pages that
30
+ // mention login as a topic (e.g. "unable to login" in a knowledge base article).
31
+ // We require the login keyword to appear at the start or after a separator.
29
32
  const titleMatch = /<title[^>]*>(.*?)<\/title>/i.exec(sample);
30
33
  if (titleMatch) {
31
- const title = titleMatch[1].toLowerCase();
32
- if (/sign\s*in|log\s*in|authenticate/i.test(title)) {
34
+ const title = titleMatch[1].toLowerCase().trim();
35
+ if (/^(sign\s*in|log\s*in)\b/.test(title) ||
36
+ /[|\-–—:]\s*(sign\s*in|log\s*in)\s*$/i.test(title) ||
37
+ /^authenticate\b/.test(title)) {
33
38
  return `Page title suggests login: "${titleMatch[1].trim()}"`;
34
39
  }
35
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auth-gate-detection.js","sourceRoot":"","sources":["../../../src/checks/authentication/auth-gate-detection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAexE,MAAM,WAAW,GAAG;IAClB,UAAU;IACV,WAAW;IACX,2BAA2B;IAC3B,qBAAqB;IACrB,sBAAsB;IACtB,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;CACT,CAAC;AAEF,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACrD,OAAO,WAAW,CAAC,IAAI,CACrB,CAAC,MAAM,EAAE,EAAE,CACT,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CACxF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAElD,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpE,OAAO,+BAA+B,CAAC;IACzC,CAAC;IAED,wCAAwC;IACxC,MAAM,UAAU,GAAG,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,kCAAkC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,+BAA+B,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;QAChE,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,4EAA4E,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9F,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,GAAiB;IACpC,MAAM,EAAE,GAAG,qBAAqB,CAAC;IACjC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IAElC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAE5F,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC;IAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAuB,EAAE;YAC3C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAE/B,6BAA6B;gBAC7B,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACrC,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;gBAC1D,CAAC;gBAED,4CAA4C;gBAC5C,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;oBAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBAClD,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;4BAClD,CAAC,CAAC,QAAQ;4BACV,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;wBACtC,MAAM,SAAS,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;wBAChD,IAAI,SAAS,EAAE,CAAC;4BACd,OAAO;gCACL,GAAG;gCACH,cAAc,EAAE,eAAe;gCAC/B,MAAM;gCACN,WAAW,EAAE,gBAAgB;gCAC7B,SAAS;6BACV,CAAC;wBACJ,CAAC;oBACH,CAAC;oBACD,2DAA2D;oBAC3D,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;gBACvD,CAAC;gBAED,8CAA8C;gBAC9C,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACnB,IAAI,IAAY,CAAC;oBACjB,IAAI,CAAC;wBACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAC/B,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;oBACvD,CAAC;oBAED,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;oBACxC,IAAI,SAAS,EAAE,CAAC;wBACd,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;oBAC5E,CAAC;oBAED,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;gBACvD,CAAC;gBAED,2CAA2C;gBAC3C,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;YACvD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,GAAG;oBACH,cAAc,EAAE,YAAY;oBAC5B,MAAM,EAAE,IAAI;oBACZ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAE/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,EAAE;YACF,QAAQ;YACR,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,oDAAoD,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;YACxH,OAAO,EAAE;gBACP,UAAU;gBACV,WAAW,EAAE,OAAO,CAAC,MAAM;gBAC3B,OAAO;gBACP,WAAW;gBACX,WAAW,EAAE,OAAO;gBACpB,iBAAiB,EAAE,QAAQ;aAC5B;SACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,YAAY,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,eAAe,CAAC,CAAC;IAChF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,gBAAgB,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,eAAe,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;IAEnF,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC,CAAC,CAAC;IAElG,IAAI,MAAgC,CAAC;IACrC,IAAI,OAAe,CAAC;IACpB,MAAM,MAAM,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;IAEtD,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,MAAM,CAAC;QAChB,OAAO,GAAG,OAAO,UAAU,CAAC,MAAM,IAAI,SAAS,2BAA2B,MAAM,EAAE,CAAC;IACrF,CAAC;SAAM,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,GAAG,MAAM,CAAC;QAChB,OAAO,GAAG,GAAG,UAAU,OAAO,MAAM,CAAC,MAAM,IAAI,SAAS,4BAA4B,UAAU,CAAC,MAAM,eAAe,MAAM,EAAE,CAAC;IAC/H,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC;QAChB,OAAO,GAAG,OAAO,MAAM,CAAC,MAAM,IAAI,SAAS,0BAA0B,MAAM,EAAE,CAAC;IAChF,CAAC;IAED,OAAO;QACL,EAAE;QACF,QAAQ;QACR,MAAM;QACN,OAAO;QACP,OAAO,EAAE;YACP,UAAU;YACV,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,OAAO;YACP,UAAU,EAAE,UAAU,CAAC,MAAM;YAC7B,YAAY,EAAE,YAAY,CAAC,MAAM;YACjC,YAAY,EAAE,YAAY,CAAC,MAAM;YACjC,YAAY,EAAE,YAAY,CAAC,MAAM;YACjC,UAAU;YACV,WAAW;YACX,WAAW,EAAE,OAAO;YACpB,iBAAiB,EAAE,QAAQ;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,qBAAqB;IACzB,QAAQ,EAAE,gBAAgB;IAC1B,WAAW,EAAE,sEAAsE;IACnF,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
1
+ {"version":3,"file":"auth-gate-detection.js","sourceRoot":"","sources":["../../../src/checks/authentication/auth-gate-detection.ts"],"names":[],"mappings":"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"}
@@ -104,7 +104,7 @@ registerCheck({
104
104
  id: 'markdown-code-fence-validity',
105
105
  category: 'content-structure',
106
106
  description: 'Whether markdown contains unclosed code fences',
107
- dependsOn: [['markdown-url-support', 'content-negotiation']],
107
+ dependsOn: [],
108
108
  run: check,
109
109
  });
110
110
  //# sourceMappingURL=markdown-code-fence-validity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-code-fence-validity.js","sourceRoot":"","sources":["../../../src/checks/content-structure/markdown-code-fence-validity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown-code-fence-validity.js","sourceRoot":"","sources":["../../../src/checks/content-structure/markdown-code-fence-validity.ts"],"names":[],"mappings":"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"}