afdocs 0.1.3 → 0.2.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 +39 -21
- package/dist/checks/authentication/auth-alternative-access.d.ts +2 -0
- package/dist/checks/authentication/auth-alternative-access.d.ts.map +1 -0
- package/dist/checks/authentication/auth-alternative-access.js +17 -0
- package/dist/checks/authentication/auth-alternative-access.js.map +1 -0
- package/dist/checks/authentication/auth-gate-detection.d.ts +2 -0
- package/dist/checks/authentication/auth-gate-detection.d.ts.map +1 -0
- package/dist/checks/authentication/auth-gate-detection.js +17 -0
- package/dist/checks/authentication/auth-gate-detection.js.map +1 -0
- package/dist/checks/index.d.ts +2 -0
- package/dist/checks/index.d.ts.map +1 -1
- package/dist/checks/index.js +3 -0
- package/dist/checks/index.js.map +1 -1
- package/dist/checks/llms-txt/llms-txt-exists.js +83 -6
- package/dist/checks/llms-txt/llms-txt-exists.js.map +1 -1
- package/dist/checks/llms-txt/llms-txt-links-markdown.js +46 -21
- package/dist/checks/llms-txt/llms-txt-links-markdown.js.map +1 -1
- package/dist/checks/llms-txt/llms-txt-links-resolve.js +10 -3
- package/dist/checks/llms-txt/llms-txt-links-resolve.js.map +1 -1
- package/dist/checks/markdown-availability/content-negotiation.js +101 -5
- package/dist/checks/markdown-availability/content-negotiation.js.map +1 -1
- package/dist/checks/markdown-availability/markdown-url-support.js +82 -5
- package/dist/checks/markdown-availability/markdown-url-support.js.map +1 -1
- package/dist/checks/page-size/content-start-position.js +161 -5
- package/dist/checks/page-size/content-start-position.js.map +1 -1
- package/dist/checks/page-size/page-size-html.js +127 -5
- package/dist/checks/page-size/page-size-html.js.map +1 -1
- package/dist/checks/page-size/page-size-markdown.js +183 -5
- package/dist/checks/page-size/page-size-markdown.js.map +1 -1
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +9 -1
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/formatters/text.d.ts +4 -1
- package/dist/cli/formatters/text.d.ts.map +1 -1
- package/dist/cli/formatters/text.js +94 -1
- package/dist/cli/formatters/text.js.map +1 -1
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -1
- package/dist/helpers/detect-markdown.d.ts +10 -0
- package/dist/helpers/detect-markdown.d.ts.map +1 -0
- package/dist/helpers/detect-markdown.js +29 -0
- package/dist/helpers/detect-markdown.js.map +1 -0
- package/dist/helpers/get-page-urls.d.ts +39 -0
- package/dist/helpers/get-page-urls.d.ts.map +1 -0
- package/dist/helpers/get-page-urls.js +230 -0
- package/dist/helpers/get-page-urls.js.map +1 -0
- package/dist/helpers/html-to-markdown.d.ts +7 -0
- package/dist/helpers/html-to-markdown.d.ts.map +1 -0
- package/dist/helpers/html-to-markdown.js +11 -0
- package/dist/helpers/html-to-markdown.js.map +1 -0
- package/dist/helpers/index.d.ts +5 -0
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/index.js +4 -0
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/to-md-urls.d.ts +7 -0
- package/dist/helpers/to-md-urls.d.ts.map +1 -0
- package/dist/helpers/to-md-urls.js +24 -0
- package/dist/helpers/to-md-urls.js.map +1 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +21 -14
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +10 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { extractMarkdownLinks } from '../checks/llms-txt/llms-txt-valid.js';
|
|
2
|
+
import { MAX_SITEMAP_URLS } from '../constants.js';
|
|
3
|
+
/**
|
|
4
|
+
* Extract `<loc>` URLs from a sitemap XML string.
|
|
5
|
+
* Also returns any `<sitemap><loc>` entries from sitemap index files.
|
|
6
|
+
*/
|
|
7
|
+
export function parseSitemapUrls(xml) {
|
|
8
|
+
const urls = [];
|
|
9
|
+
const sitemapIndexUrls = [];
|
|
10
|
+
// Detect sitemap index: contains <sitemap> elements
|
|
11
|
+
const isSitemapIndex = /<sitemap[\s>]/i.test(xml);
|
|
12
|
+
if (isSitemapIndex) {
|
|
13
|
+
// Extract <loc> inside <sitemap> blocks
|
|
14
|
+
const sitemapBlockRegex = /<sitemap[\s>][\s\S]*?<\/sitemap>/gi;
|
|
15
|
+
let block;
|
|
16
|
+
while ((block = sitemapBlockRegex.exec(xml)) !== null) {
|
|
17
|
+
const locMatch = /<loc>\s*(.*?)\s*<\/loc>/i.exec(block[0]);
|
|
18
|
+
if (locMatch) {
|
|
19
|
+
sitemapIndexUrls.push(locMatch[1]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Regular sitemap: extract all <loc> entries
|
|
25
|
+
const locRegex = /<loc>\s*(.*?)\s*<\/loc>/gi;
|
|
26
|
+
let match;
|
|
27
|
+
while ((match = locRegex.exec(xml)) !== null) {
|
|
28
|
+
urls.push(match[1]);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { urls, sitemapIndexUrls };
|
|
32
|
+
}
|
|
33
|
+
function getUrlsFromCachedLlmsTxt(ctx) {
|
|
34
|
+
const existsResult = ctx.previousResults.get('llms-txt-exists');
|
|
35
|
+
const discovered = (existsResult?.details?.discoveredFiles ?? []);
|
|
36
|
+
return extractLinksFromLlmsTxtFiles(discovered);
|
|
37
|
+
}
|
|
38
|
+
function extractLinksFromLlmsTxtFiles(files) {
|
|
39
|
+
const urls = new Set();
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
const links = extractMarkdownLinks(file.content);
|
|
42
|
+
for (const link of links) {
|
|
43
|
+
if (link.url.startsWith('http://') || link.url.startsWith('https://')) {
|
|
44
|
+
urls.add(link.url);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return Array.from(urls);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Directly fetch llms.txt candidate URLs and extract links.
|
|
52
|
+
* Used when `llms-txt-exists` hasn't run (e.g. standalone check mode).
|
|
53
|
+
*/
|
|
54
|
+
async function fetchLlmsTxtUrls(ctx) {
|
|
55
|
+
const candidates = new Set();
|
|
56
|
+
candidates.add(`${ctx.baseUrl}/llms.txt`);
|
|
57
|
+
candidates.add(`${ctx.origin}/llms.txt`);
|
|
58
|
+
candidates.add(`${ctx.origin}/docs/llms.txt`);
|
|
59
|
+
const discovered = [];
|
|
60
|
+
for (const url of candidates) {
|
|
61
|
+
try {
|
|
62
|
+
const response = await ctx.http.fetch(url);
|
|
63
|
+
if (!response.ok)
|
|
64
|
+
continue;
|
|
65
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
66
|
+
if (!contentType.includes('text/'))
|
|
67
|
+
continue;
|
|
68
|
+
const content = await response.text();
|
|
69
|
+
const trimmed = content.trimStart().toLowerCase();
|
|
70
|
+
if (trimmed.startsWith('<!') || trimmed.startsWith('<html'))
|
|
71
|
+
continue;
|
|
72
|
+
if (content.trim().length === 0)
|
|
73
|
+
continue;
|
|
74
|
+
discovered.push({
|
|
75
|
+
url,
|
|
76
|
+
content,
|
|
77
|
+
status: response.status,
|
|
78
|
+
redirected: response.redirected,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Skip failed fetches
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return extractLinksFromLlmsTxtFiles(discovered);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parse `Sitemap:` directives from a robots.txt body.
|
|
89
|
+
* Returns an array of sitemap URLs found.
|
|
90
|
+
*/
|
|
91
|
+
export function parseSitemapDirectives(robotsTxt) {
|
|
92
|
+
const urls = [];
|
|
93
|
+
for (const line of robotsTxt.split('\n')) {
|
|
94
|
+
const match = /^\s*Sitemap:\s*(\S+)/i.exec(line);
|
|
95
|
+
if (match) {
|
|
96
|
+
urls.push(match[1]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return urls;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Discover sitemap URLs by checking robots.txt first, then falling back to /sitemap.xml.
|
|
103
|
+
*/
|
|
104
|
+
async function discoverSitemapUrls(ctx) {
|
|
105
|
+
// Try robots.txt for Sitemap directives
|
|
106
|
+
try {
|
|
107
|
+
const robotsResponse = await ctx.http.fetch(`${ctx.origin}/robots.txt`);
|
|
108
|
+
if (robotsResponse.ok) {
|
|
109
|
+
const body = await robotsResponse.text();
|
|
110
|
+
const directives = parseSitemapDirectives(body);
|
|
111
|
+
if (directives.length > 0)
|
|
112
|
+
return directives;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// robots.txt fetch failed; fall through
|
|
117
|
+
}
|
|
118
|
+
// Default to /sitemap.xml
|
|
119
|
+
return [`${ctx.origin}/sitemap.xml`];
|
|
120
|
+
}
|
|
121
|
+
function isGzipped(url) {
|
|
122
|
+
return /\.gz($|\?)/i.test(url);
|
|
123
|
+
}
|
|
124
|
+
async function fetchSitemap(ctx, sitemapUrl, warnings) {
|
|
125
|
+
if (isGzipped(sitemapUrl)) {
|
|
126
|
+
warnings.push(`Skipped gzipped sitemap (not supported): ${sitemapUrl}`);
|
|
127
|
+
return { urls: [], sitemapIndexUrls: [] };
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const response = await ctx.http.fetch(sitemapUrl);
|
|
131
|
+
if (!response.ok)
|
|
132
|
+
return { urls: [], sitemapIndexUrls: [] };
|
|
133
|
+
const xml = await response.text();
|
|
134
|
+
return parseSitemapUrls(xml);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return { urls: [], sitemapIndexUrls: [] };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async function getUrlsFromSitemap(ctx, warnings) {
|
|
141
|
+
const sitemapUrls = await discoverSitemapUrls(ctx);
|
|
142
|
+
const urls = [];
|
|
143
|
+
for (const sitemapUrl of sitemapUrls) {
|
|
144
|
+
if (urls.length >= MAX_SITEMAP_URLS)
|
|
145
|
+
break;
|
|
146
|
+
const parsed = await fetchSitemap(ctx, sitemapUrl, warnings);
|
|
147
|
+
// Add direct URLs (filtered to same origin)
|
|
148
|
+
for (const url of parsed.urls) {
|
|
149
|
+
if (urls.length >= MAX_SITEMAP_URLS)
|
|
150
|
+
break;
|
|
151
|
+
try {
|
|
152
|
+
const u = new URL(url);
|
|
153
|
+
if (u.origin === ctx.origin) {
|
|
154
|
+
urls.push(url);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Skip malformed URLs
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Follow one level of sitemap index
|
|
162
|
+
if (parsed.sitemapIndexUrls.length > 0 && urls.length < MAX_SITEMAP_URLS) {
|
|
163
|
+
for (const subSitemapUrl of parsed.sitemapIndexUrls) {
|
|
164
|
+
if (urls.length >= MAX_SITEMAP_URLS)
|
|
165
|
+
break;
|
|
166
|
+
const subParsed = await fetchSitemap(ctx, subSitemapUrl, warnings);
|
|
167
|
+
for (const url of subParsed.urls) {
|
|
168
|
+
if (urls.length >= MAX_SITEMAP_URLS)
|
|
169
|
+
break;
|
|
170
|
+
try {
|
|
171
|
+
const u = new URL(url);
|
|
172
|
+
if (u.origin === ctx.origin) {
|
|
173
|
+
urls.push(url);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Skip malformed URLs
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return urls;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Discover page URLs from llms.txt links, sitemap, or fall back to baseUrl.
|
|
187
|
+
*
|
|
188
|
+
* Priority:
|
|
189
|
+
* 1. llms.txt links (from previous check results)
|
|
190
|
+
* 2. Sitemap URLs (robots.txt Sitemap directives, then /sitemap.xml fallback)
|
|
191
|
+
* 3. baseUrl fallback
|
|
192
|
+
*/
|
|
193
|
+
export async function getPageUrls(ctx) {
|
|
194
|
+
const warnings = [];
|
|
195
|
+
// 1. Try llms.txt links from cached results (if llms-txt-exists ran)
|
|
196
|
+
const cachedUrls = getUrlsFromCachedLlmsTxt(ctx);
|
|
197
|
+
if (cachedUrls.length > 0)
|
|
198
|
+
return { urls: cachedUrls, warnings };
|
|
199
|
+
// 2. Try fetching llms.txt directly (standalone mode, llms-txt-exists didn't run)
|
|
200
|
+
if (!ctx.previousResults.has('llms-txt-exists')) {
|
|
201
|
+
const fetchedUrls = await fetchLlmsTxtUrls(ctx);
|
|
202
|
+
if (fetchedUrls.length > 0)
|
|
203
|
+
return { urls: fetchedUrls, warnings };
|
|
204
|
+
}
|
|
205
|
+
// 3. Try sitemap
|
|
206
|
+
const sitemapUrls = await getUrlsFromSitemap(ctx, warnings);
|
|
207
|
+
if (sitemapUrls.length > 0)
|
|
208
|
+
return { urls: sitemapUrls, warnings };
|
|
209
|
+
// 4. Fallback
|
|
210
|
+
return { urls: [ctx.baseUrl], warnings };
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Discover page URLs and sample down to maxLinksToTest if needed.
|
|
214
|
+
* Consolidates the discover+shuffle+sample pattern used by multiple checks.
|
|
215
|
+
*/
|
|
216
|
+
export async function discoverAndSamplePages(ctx) {
|
|
217
|
+
const discovery = await getPageUrls(ctx);
|
|
218
|
+
let urls = discovery.urls;
|
|
219
|
+
const totalPages = urls.length;
|
|
220
|
+
const sampled = totalPages > ctx.options.maxLinksToTest;
|
|
221
|
+
if (sampled) {
|
|
222
|
+
for (let i = urls.length - 1; i > 0; i--) {
|
|
223
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
224
|
+
[urls[i], urls[j]] = [urls[j], urls[i]];
|
|
225
|
+
}
|
|
226
|
+
urls = urls.slice(0, ctx.options.maxLinksToTest);
|
|
227
|
+
}
|
|
228
|
+
return { urls, totalPages, sampled, warnings: discovery.warnings };
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=get-page-urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-page-urls.js","sourceRoot":"","sources":["../../src/helpers/get-page-urls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert HTML to markdown using Turndown with default configuration.
|
|
3
|
+
* Matches real agent behavior per the Agent-Friendly Documentation Spec:
|
|
4
|
+
* no explicit <style>/<script> stripping, default options only.
|
|
5
|
+
*/
|
|
6
|
+
export declare function htmlToMarkdown(html: string): string;
|
|
7
|
+
//# sourceMappingURL=html-to-markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-to-markdown.d.ts","sourceRoot":"","sources":["../../src/helpers/html-to-markdown.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import TurndownService from 'turndown';
|
|
2
|
+
/**
|
|
3
|
+
* Convert HTML to markdown using Turndown with default configuration.
|
|
4
|
+
* Matches real agent behavior per the Agent-Friendly Documentation Spec:
|
|
5
|
+
* no explicit <style>/<script> stripping, default options only.
|
|
6
|
+
*/
|
|
7
|
+
export function htmlToMarkdown(html) {
|
|
8
|
+
const turndown = new TurndownService();
|
|
9
|
+
return turndown.turndown(html);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=html-to-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-to-markdown.js","sourceRoot":"","sources":["../../src/helpers/html-to-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,UAAU,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/helpers/index.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
export { loadConfig } from './config.js';
|
|
2
2
|
export { describeAgentDocs, describeAgentDocsPerCheck } from './vitest-runner.js';
|
|
3
|
+
export { looksLikeMarkdown, looksLikeHtml } from './detect-markdown.js';
|
|
4
|
+
export { getPageUrls, discoverAndSamplePages, parseSitemapUrls, parseSitemapDirectives, } from './get-page-urls.js';
|
|
5
|
+
export type { PageUrlResult, SampledPages } from './get-page-urls.js';
|
|
6
|
+
export { toMdUrls } from './to-md-urls.js';
|
|
7
|
+
export { htmlToMarkdown } from './html-to-markdown.js';
|
|
3
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/helpers/index.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
export { loadConfig } from './config.js';
|
|
2
2
|
export { describeAgentDocs, describeAgentDocsPerCheck } from './vitest-runner.js';
|
|
3
|
+
export { looksLikeMarkdown, looksLikeHtml } from './detect-markdown.js';
|
|
4
|
+
export { getPageUrls, discoverAndSamplePages, parseSitemapUrls, parseSitemapDirectives, } from './get-page-urls.js';
|
|
5
|
+
export { toMdUrls } from './to-md-urls.js';
|
|
6
|
+
export { htmlToMarkdown } from './html-to-markdown.js';
|
|
3
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate candidate .md URLs for a page URL.
|
|
3
|
+
* If the URL already ends in .md, return it as-is.
|
|
4
|
+
* Otherwise try both `/docs/guide.md` and `/docs/guide/index.md`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function toMdUrls(url: string): string[];
|
|
7
|
+
//# sourceMappingURL=to-md-urls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-md-urls.d.ts","sourceRoot":"","sources":["../../src/helpers/to-md-urls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAsB9C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate candidate .md URLs for a page URL.
|
|
3
|
+
* If the URL already ends in .md, return it as-is.
|
|
4
|
+
* Otherwise try both `/docs/guide.md` and `/docs/guide/index.md`.
|
|
5
|
+
*/
|
|
6
|
+
export function toMdUrls(url) {
|
|
7
|
+
const parsed = new URL(url);
|
|
8
|
+
// URL already points to a .md file — use it directly
|
|
9
|
+
if (parsed.pathname.endsWith('.md')) {
|
|
10
|
+
return [url];
|
|
11
|
+
}
|
|
12
|
+
const pathname = parsed.pathname.replace(/\/$/, '') || '';
|
|
13
|
+
const candidates = [];
|
|
14
|
+
// /docs/guide.md (strip .html extension if present)
|
|
15
|
+
const directMd = new URL(parsed.toString());
|
|
16
|
+
directMd.pathname = pathname.replace(/\.html?$/, '') + '.md';
|
|
17
|
+
candidates.push(directMd.toString());
|
|
18
|
+
// /docs/guide/index.md
|
|
19
|
+
const indexMd = new URL(parsed.toString());
|
|
20
|
+
indexMd.pathname = pathname + '/index.md';
|
|
21
|
+
candidates.push(indexMd.toString());
|
|
22
|
+
return candidates;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=to-md-urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-md-urls.js","sourceRoot":"","sources":["../../src/helpers/to-md-urls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAE5B,qDAAqD;IACrD,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,oDAAoD;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;IAC7D,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAErC,uBAAuB;IACvB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC1C,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEpC,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAe,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAmCzF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAe,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAmCzF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,YAAY,CAgB7F;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC/B,OAAO,CAAC,YAAY,CAAC,CAkEvB"}
|
package/dist/runner.js
CHANGED
|
@@ -18,10 +18,10 @@ function normalizeDeps(deps) {
|
|
|
18
18
|
function checkDependenciesMet(deps, previousResults) {
|
|
19
19
|
const normalized = normalizeDeps(deps);
|
|
20
20
|
for (const orGroup of normalized) {
|
|
21
|
-
// At least one check in the OR-group must have passed
|
|
21
|
+
// At least one check in the OR-group must have passed (or warned)
|
|
22
22
|
const anyPassed = orGroup.some((id) => {
|
|
23
23
|
const result = previousResults.get(id);
|
|
24
|
-
return result?.status === 'pass';
|
|
24
|
+
return result?.status === 'pass' || result?.status === 'warn';
|
|
25
25
|
});
|
|
26
26
|
if (!anyPassed)
|
|
27
27
|
return false;
|
|
@@ -41,6 +41,7 @@ export function createContext(baseUrl, options) {
|
|
|
41
41
|
maxConcurrency: merged.maxConcurrency,
|
|
42
42
|
}),
|
|
43
43
|
options: merged,
|
|
44
|
+
pageCache: new Map(),
|
|
44
45
|
};
|
|
45
46
|
}
|
|
46
47
|
export async function runChecks(baseUrl, options) {
|
|
@@ -53,18 +54,24 @@ export async function runChecks(baseUrl, options) {
|
|
|
53
54
|
if (checkIds && checkIds.length > 0 && !checkIds.includes(check.id)) {
|
|
54
55
|
continue;
|
|
55
56
|
}
|
|
56
|
-
// Check dependencies
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
57
|
+
// Check dependencies — only skip if at least one dependency actually ran and none passed.
|
|
58
|
+
// If no dependencies ran at all (e.g. filtered out via --checks), let the check handle
|
|
59
|
+
// standalone mode itself.
|
|
60
|
+
if (check.dependsOn.length > 0) {
|
|
61
|
+
const normalized = normalizeDeps(check.dependsOn);
|
|
62
|
+
const anyDepRan = normalized.some((orGroup) => orGroup.some((id) => ctx.previousResults.has(id)));
|
|
63
|
+
if (anyDepRan && !checkDependenciesMet(check.dependsOn, ctx.previousResults)) {
|
|
64
|
+
const result = {
|
|
65
|
+
id: check.id,
|
|
66
|
+
category: check.category,
|
|
67
|
+
status: 'skip',
|
|
68
|
+
message: 'Skipped: dependency check did not pass',
|
|
69
|
+
dependsOn: normalized.flat(),
|
|
70
|
+
};
|
|
71
|
+
results.push(result);
|
|
72
|
+
ctx.previousResults.set(check.id, result);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
68
75
|
}
|
|
69
76
|
try {
|
|
70
77
|
const result = await check.run(ctx);
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAA2B;IAChD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QAChC,sDAAsD;QACtD,OAAQ,IAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,IAAkB,CAAC;AAC5B,CAAC;AAED,SAAS,oBAAoB,CAC3B,IAA2B,EAC3B,eAAyC;IAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -7,6 +7,13 @@ export interface CheckResult {
|
|
|
7
7
|
details?: Record<string, unknown>;
|
|
8
8
|
dependsOn?: string[];
|
|
9
9
|
}
|
|
10
|
+
export interface CachedPage {
|
|
11
|
+
url: string;
|
|
12
|
+
markdown?: {
|
|
13
|
+
content: string;
|
|
14
|
+
source: 'md-url' | 'content-negotiation';
|
|
15
|
+
};
|
|
16
|
+
}
|
|
10
17
|
export interface CheckContext {
|
|
11
18
|
/** The base URL being checked (as provided by the user). */
|
|
12
19
|
baseUrl: string;
|
|
@@ -18,6 +25,8 @@ export interface CheckContext {
|
|
|
18
25
|
http: HttpClient;
|
|
19
26
|
/** Runtime options. */
|
|
20
27
|
options: CheckOptions;
|
|
28
|
+
/** Cached page content, keyed by original page URL. */
|
|
29
|
+
pageCache: Map<string, CachedPage>;
|
|
21
30
|
}
|
|
22
31
|
export interface CheckOptions {
|
|
23
32
|
/** Maximum concurrent HTTP requests within a single check. */
|
|
@@ -42,7 +51,7 @@ export interface CheckDefinition {
|
|
|
42
51
|
id: string;
|
|
43
52
|
category: string;
|
|
44
53
|
description: string;
|
|
45
|
-
/** Check IDs that must pass before this check runs. Array of arrays for OR-groups. */
|
|
54
|
+
/** Check IDs that must pass or warn before this check runs. Array of arrays for OR-groups. */
|
|
46
55
|
dependsOn: string[][] | string[];
|
|
47
56
|
run: CheckFunction;
|
|
48
57
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC1C,sCAAsC;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,uBAAuB;IACvB,OAAO,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "afdocs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Test your documentation site against the Agent-Friendly Documentation Spec",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -55,16 +55,18 @@
|
|
|
55
55
|
},
|
|
56
56
|
"license": "MIT",
|
|
57
57
|
"engines": {
|
|
58
|
-
"node": ">=
|
|
58
|
+
"node": ">=22"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"chalk": "^5.4.1",
|
|
62
62
|
"commander": "^13.1.0",
|
|
63
|
+
"turndown": "^7.2.2",
|
|
63
64
|
"yaml": "^2.7.0"
|
|
64
65
|
},
|
|
65
66
|
"devDependencies": {
|
|
66
67
|
"@eslint/js": "^10.0.1",
|
|
67
68
|
"@types/node": "^22.13.4",
|
|
69
|
+
"@types/turndown": "^5.0.6",
|
|
68
70
|
"@vitest/coverage-v8": "^4.0.18",
|
|
69
71
|
"eslint": "^10.0.1",
|
|
70
72
|
"husky": "^9.1.7",
|