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.
- package/README.md +53 -30
- package/dist/checks/agent-discoverability/llms-txt-directive.js +206 -5
- package/dist/checks/agent-discoverability/llms-txt-directive.js.map +1 -1
- 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/checks/url-stability/redirect-behavior.js +127 -5
- package/dist/checks/url-stability/redirect-behavior.js.map +1 -1
- 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 +13 -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.map +1 -1
- package/dist/constants.js +1 -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 +1 -0
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -1
- 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
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
-
| `
|
|
171
|
-
| `page-size-
|
|
172
|
-
| `
|
|
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
|
|
177
|
-
|
|
|
178
|
-
| `tabbed-content-serialization`
|
|
179
|
-
| `section-header-quality`
|
|
180
|
-
| `markdown-code-fence-validity`
|
|
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
|
|
185
|
-
|
|
|
186
|
-
| `http-status-codes`
|
|
187
|
-
| `redirect-behavior`
|
|
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
|
|
192
|
-
|
|
|
193
|
-
| `llms-txt-directive`
|
|
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
|
|
198
|
-
|
|
|
199
|
-
| `llms-txt-freshness`
|
|
200
|
-
| `markdown-content-parity`
|
|
201
|
-
| `cache-header-hygiene`
|
|
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
|
|
206
|
-
|
|
|
207
|
-
| `auth-gate-detection`
|
|
208
|
-
| `auth-alternative-access`
|
|
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
|
-
|
|
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
|
|
5
|
-
category
|
|
6
|
-
status
|
|
7
|
-
message
|
|
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;
|
|
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(
|
|
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
|
|
5
|
-
category
|
|
6
|
-
status
|
|
7
|
-
message
|
|
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: [
|
|
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;
|
|
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 (
|
|
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,
|
|
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: [
|
|
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":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAiB3E;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,mFAAmF;AACnF,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AAEpD,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAA0D,IAAI,CAAC;IAE5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,wEAAwE;QACxE,sFAAsF;QACtF,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAErC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAClC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAE7C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,gBAAgB;YAChB,SAAS,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC1C,UAAU,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,uEAAuE;YACvE,0EAA0E;YAC1E,0EAA0E;YAC1E,uDAAuD;YACvD,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC1D,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,WAAW,CAAC,QAAuB;IAC1C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,GAAiB;IACpC,MAAM,EAAE,GAAG,8BAA8B,CAAC;IAC1C,MAAM,QAAQ,GAAG,mBAAmB,CAAC;IAErC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAE/C,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACtD,OAAO;gBACL,EAAE;gBACF,QAAQ;gBACR,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,0DAA0D;aACpE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GACR,QAAQ,CAAC,IAAI,KAAK,YAAY;YAC5B,CAAC,CAAC,uEAAuE;YACzE,CAAC,CAAC,EAAE,CAAC;QACT,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,IAAI,EAAE,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,OAAO,GAAsB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QACjF,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAgB,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAE1D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE3E,MAAM,OAAO,GACX,aAAa,KAAK,MAAM;QACtB,CAAC,CAAC,OAAO,WAAW,uCAAuC,OAAO,CAAC,MAAM,QAAQ;QACjF,CAAC,CAAC,GAAG,aAAa,sCAAsC,OAAO,CAAC,MAAM,QAAQ,CAAC;IAEnF,OAAO;QACL,EAAE;QACF,QAAQ;QACR,MAAM,EAAE,aAAa;QACrB,OAAO;QACP,OAAO,EAAE;YACP,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,WAAW;YACX,aAAa;YACb,WAAW,EAAE,OAAO;SACrB;KACF,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,8BAA8B;IAClC,QAAQ,EAAE,mBAAmB;IAC7B,WAAW,EAAE,gDAAgD;IAC7D,SAAS,EAAE,
|
|
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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"}
|