afdocs 0.1.3 → 0.3.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 (76) hide show
  1. package/README.md +48 -24
  2. package/dist/checks/authentication/auth-alternative-access.d.ts +2 -0
  3. package/dist/checks/authentication/auth-alternative-access.d.ts.map +1 -0
  4. package/dist/checks/authentication/auth-alternative-access.js +17 -0
  5. package/dist/checks/authentication/auth-alternative-access.js.map +1 -0
  6. package/dist/checks/authentication/auth-gate-detection.d.ts +2 -0
  7. package/dist/checks/authentication/auth-gate-detection.d.ts.map +1 -0
  8. package/dist/checks/authentication/auth-gate-detection.js +175 -0
  9. package/dist/checks/authentication/auth-gate-detection.js.map +1 -0
  10. package/dist/checks/content-structure/markdown-code-fence-validity.js +119 -5
  11. package/dist/checks/content-structure/markdown-code-fence-validity.js.map +1 -1
  12. package/dist/checks/index.d.ts +2 -0
  13. package/dist/checks/index.d.ts.map +1 -1
  14. package/dist/checks/index.js +3 -0
  15. package/dist/checks/index.js.map +1 -1
  16. package/dist/checks/llms-txt/llms-txt-exists.js +83 -6
  17. package/dist/checks/llms-txt/llms-txt-exists.js.map +1 -1
  18. package/dist/checks/llms-txt/llms-txt-links-markdown.js +46 -21
  19. package/dist/checks/llms-txt/llms-txt-links-markdown.js.map +1 -1
  20. package/dist/checks/llms-txt/llms-txt-links-resolve.js +10 -3
  21. package/dist/checks/llms-txt/llms-txt-links-resolve.js.map +1 -1
  22. package/dist/checks/markdown-availability/content-negotiation.js +101 -5
  23. package/dist/checks/markdown-availability/content-negotiation.js.map +1 -1
  24. package/dist/checks/markdown-availability/markdown-url-support.js +82 -5
  25. package/dist/checks/markdown-availability/markdown-url-support.js.map +1 -1
  26. package/dist/checks/observability/cache-header-hygiene.js +200 -5
  27. package/dist/checks/observability/cache-header-hygiene.js.map +1 -1
  28. package/dist/checks/page-size/content-start-position.js +161 -5
  29. package/dist/checks/page-size/content-start-position.js.map +1 -1
  30. package/dist/checks/page-size/page-size-html.js +127 -5
  31. package/dist/checks/page-size/page-size-html.js.map +1 -1
  32. package/dist/checks/page-size/page-size-markdown.js +100 -5
  33. package/dist/checks/page-size/page-size-markdown.js.map +1 -1
  34. package/dist/checks/url-stability/http-status-codes.js +106 -5
  35. package/dist/checks/url-stability/http-status-codes.js.map +1 -1
  36. package/dist/cli/commands/check.d.ts.map +1 -1
  37. package/dist/cli/commands/check.js +9 -1
  38. package/dist/cli/commands/check.js.map +1 -1
  39. package/dist/cli/formatters/text.d.ts +4 -1
  40. package/dist/cli/formatters/text.d.ts.map +1 -1
  41. package/dist/cli/formatters/text.js +94 -1
  42. package/dist/cli/formatters/text.js.map +1 -1
  43. package/dist/constants.d.ts +6 -0
  44. package/dist/constants.d.ts.map +1 -1
  45. package/dist/constants.js +3 -0
  46. package/dist/constants.js.map +1 -1
  47. package/dist/helpers/detect-markdown.d.ts +10 -0
  48. package/dist/helpers/detect-markdown.d.ts.map +1 -0
  49. package/dist/helpers/detect-markdown.js +29 -0
  50. package/dist/helpers/detect-markdown.js.map +1 -0
  51. package/dist/helpers/get-markdown-content.d.ts +23 -0
  52. package/dist/helpers/get-markdown-content.d.ts.map +1 -0
  53. package/dist/helpers/get-markdown-content.js +93 -0
  54. package/dist/helpers/get-markdown-content.js.map +1 -0
  55. package/dist/helpers/get-page-urls.d.ts +42 -0
  56. package/dist/helpers/get-page-urls.d.ts.map +1 -0
  57. package/dist/helpers/get-page-urls.js +236 -0
  58. package/dist/helpers/get-page-urls.js.map +1 -0
  59. package/dist/helpers/html-to-markdown.d.ts +7 -0
  60. package/dist/helpers/html-to-markdown.d.ts.map +1 -0
  61. package/dist/helpers/html-to-markdown.js +11 -0
  62. package/dist/helpers/html-to-markdown.js.map +1 -0
  63. package/dist/helpers/index.d.ts +5 -0
  64. package/dist/helpers/index.d.ts.map +1 -1
  65. package/dist/helpers/index.js +4 -0
  66. package/dist/helpers/index.js.map +1 -1
  67. package/dist/helpers/to-md-urls.d.ts +7 -0
  68. package/dist/helpers/to-md-urls.d.ts.map +1 -0
  69. package/dist/helpers/to-md-urls.js +24 -0
  70. package/dist/helpers/to-md-urls.js.map +1 -0
  71. package/dist/runner.d.ts.map +1 -1
  72. package/dist/runner.js +21 -14
  73. package/dist/runner.js.map +1 -1
  74. package/dist/types.d.ts +13 -1
  75. package/dist/types.d.ts.map +1 -1
  76. package/package.json +4 -2
@@ -0,0 +1,93 @@
1
+ import { looksLikeMarkdown } from './detect-markdown.js';
2
+ import { discoverAndSamplePages } from './get-page-urls.js';
3
+ import { toMdUrls } from './to-md-urls.js';
4
+ /**
5
+ * Get markdown content for analysis, either from dependency cache or by fetching directly.
6
+ *
7
+ * When markdown-url-support or content-negotiation have already run, reads from
8
+ * ctx.pageCache (fast). Otherwise, discovers pages and probes for markdown itself.
9
+ * Always includes llms.txt content when available.
10
+ */
11
+ export async function getMarkdownContent(ctx) {
12
+ const mdUrlResult = ctx.previousResults.get('markdown-url-support');
13
+ const cnResult = ctx.previousResults.get('content-negotiation');
14
+ const depRan = mdUrlResult || cnResult;
15
+ const llmsTxtPages = collectLlmsTxtContent(ctx);
16
+ if (depRan) {
17
+ const depPassed = (mdUrlResult && (mdUrlResult.status === 'pass' || mdUrlResult.status === 'warn')) ||
18
+ (cnResult && (cnResult.status === 'pass' || cnResult.status === 'warn'));
19
+ const cachedPages = collectCachedPages(ctx);
20
+ return { mode: 'cached', pages: [...cachedPages, ...llmsTxtPages], depPassed: !!depPassed };
21
+ }
22
+ // Standalone mode: fetch markdown ourselves
23
+ const fetchedPages = await fetchMarkdownPages(ctx);
24
+ return { mode: 'standalone', pages: [...fetchedPages, ...llmsTxtPages] };
25
+ }
26
+ function collectCachedPages(ctx) {
27
+ const pages = [];
28
+ for (const [url, cached] of ctx.pageCache) {
29
+ if (cached.markdown?.content) {
30
+ pages.push({ url, content: cached.markdown.content, source: cached.markdown.source });
31
+ }
32
+ }
33
+ return pages;
34
+ }
35
+ function collectLlmsTxtContent(ctx) {
36
+ const existsResult = ctx.previousResults.get('llms-txt-exists');
37
+ const discovered = (existsResult?.details?.discoveredFiles ?? []);
38
+ const pages = [];
39
+ for (const file of discovered) {
40
+ if (file.content) {
41
+ pages.push({ url: file.url, content: file.content, source: 'llms-txt' });
42
+ }
43
+ }
44
+ return pages;
45
+ }
46
+ async function fetchMarkdownPages(ctx) {
47
+ const pages = [];
48
+ const { urls: pageUrls } = await discoverAndSamplePages(ctx);
49
+ const concurrency = ctx.options.maxConcurrency;
50
+ for (let i = 0; i < pageUrls.length; i += concurrency) {
51
+ const batch = pageUrls.slice(i, i + concurrency);
52
+ const batchResults = await Promise.all(batch.map(async (url) => {
53
+ // Try .md URL candidates
54
+ const candidates = toMdUrls(url);
55
+ for (const candidateUrl of candidates) {
56
+ try {
57
+ const response = await ctx.http.fetch(candidateUrl);
58
+ if (!response.ok)
59
+ continue;
60
+ const body = await response.text();
61
+ if (looksLikeMarkdown(body)) {
62
+ return { url: candidateUrl, content: body, source: 'standalone-md-url' };
63
+ }
64
+ }
65
+ catch {
66
+ // Try next candidate
67
+ }
68
+ }
69
+ // Try content negotiation
70
+ try {
71
+ const response = await ctx.http.fetch(url, {
72
+ headers: { Accept: 'text/markdown' },
73
+ });
74
+ if (response.ok) {
75
+ const body = await response.text();
76
+ if (looksLikeMarkdown(body)) {
77
+ return { url, content: body, source: 'standalone-content-negotiation' };
78
+ }
79
+ }
80
+ }
81
+ catch {
82
+ // No markdown available for this page
83
+ }
84
+ return null;
85
+ }));
86
+ for (const r of batchResults) {
87
+ if (r)
88
+ pages.push(r);
89
+ }
90
+ }
91
+ return pages;
92
+ }
93
+ //# sourceMappingURL=get-markdown-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-markdown-content.js","sourceRoot":"","sources":["../../src/helpers/get-markdown-content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { CheckContext } from '../types.js';
2
+ /**
3
+ * Extract `<loc>` URLs from a sitemap XML string.
4
+ * Also returns any `<sitemap><loc>` entries from sitemap index files.
5
+ */
6
+ export declare function parseSitemapUrls(xml: string): {
7
+ urls: string[];
8
+ sitemapIndexUrls: string[];
9
+ };
10
+ /**
11
+ * Parse `Sitemap:` directives from a robots.txt body.
12
+ * Returns an array of sitemap URLs found.
13
+ */
14
+ export declare function parseSitemapDirectives(robotsTxt: string): string[];
15
+ export interface PageUrlResult {
16
+ urls: string[];
17
+ warnings: string[];
18
+ }
19
+ /**
20
+ * Discover page URLs from llms.txt links, sitemap, or fall back to baseUrl.
21
+ *
22
+ * Priority:
23
+ * 1. llms.txt links (from previous check results)
24
+ * 2. Sitemap URLs (robots.txt Sitemap directives, then /sitemap.xml fallback)
25
+ * 3. baseUrl fallback
26
+ */
27
+ export declare function getPageUrls(ctx: CheckContext): Promise<PageUrlResult>;
28
+ export interface SampledPages {
29
+ urls: string[];
30
+ totalPages: number;
31
+ sampled: boolean;
32
+ warnings: string[];
33
+ }
34
+ /**
35
+ * Discover page URLs and sample down to maxLinksToTest if needed.
36
+ * Consolidates the discover+shuffle+sample pattern used by multiple checks.
37
+ *
38
+ * The result is cached on ctx so that all checks within a single run
39
+ * share the same sampled page list, avoiding inconsistent results.
40
+ */
41
+ export declare function discoverAndSamplePages(ctx: CheckContext): Promise<SampledPages>;
42
+ //# sourceMappingURL=get-page-urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-page-urls.d.ts","sourceRoot":"","sources":["../../src/helpers/get-page-urls.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CA2B5F;AAyDD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CASlE;AAsBD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAyED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAmB3E;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBrF"}
@@ -0,0 +1,236 @@
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
+ * The result is cached on ctx so that all checks within a single run
217
+ * share the same sampled page list, avoiding inconsistent results.
218
+ */
219
+ export async function discoverAndSamplePages(ctx) {
220
+ if (ctx._sampledPages)
221
+ return ctx._sampledPages;
222
+ const discovery = await getPageUrls(ctx);
223
+ let urls = discovery.urls;
224
+ const totalPages = urls.length;
225
+ const sampled = totalPages > ctx.options.maxLinksToTest;
226
+ if (sampled) {
227
+ for (let i = urls.length - 1; i > 0; i--) {
228
+ const j = Math.floor(Math.random() * (i + 1));
229
+ [urls[i], urls[j]] = [urls[j], urls[i]];
230
+ }
231
+ urls = urls.slice(0, ctx.options.maxLinksToTest);
232
+ }
233
+ ctx._sampledPages = { urls, totalPages, sampled, warnings: discovery.warnings };
234
+ return ctx._sampledPages;
235
+ }
236
+ //# 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"}
@@ -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"}
@@ -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"}
@@ -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,CAe7F;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC/B,OAAO,CAAC,YAAY,CAAC,CA0DvB"}
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
- if (check.dependsOn.length > 0 && !checkDependenciesMet(check.dependsOn, ctx.previousResults)) {
58
- const result = {
59
- id: check.id,
60
- category: check.category,
61
- status: 'skip',
62
- message: 'Skipped: dependency check did not pass',
63
- dependsOn: normalizeDeps(check.dependsOn).flat(),
64
- };
65
- results.push(result);
66
- ctx.previousResults.set(check.id, result);
67
- continue;
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);
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { SampledPages } from './helpers/get-page-urls.js';
1
2
  export type CheckStatus = 'pass' | 'warn' | 'fail' | 'skip' | 'error';
2
3
  export interface CheckResult {
3
4
  id: string;
@@ -7,6 +8,13 @@ export interface CheckResult {
7
8
  details?: Record<string, unknown>;
8
9
  dependsOn?: string[];
9
10
  }
11
+ export interface CachedPage {
12
+ url: string;
13
+ markdown?: {
14
+ content: string;
15
+ source: 'md-url' | 'content-negotiation';
16
+ };
17
+ }
10
18
  export interface CheckContext {
11
19
  /** The base URL being checked (as provided by the user). */
12
20
  baseUrl: string;
@@ -18,6 +26,10 @@ export interface CheckContext {
18
26
  http: HttpClient;
19
27
  /** Runtime options. */
20
28
  options: CheckOptions;
29
+ /** Cached page content, keyed by original page URL. */
30
+ pageCache: Map<string, CachedPage>;
31
+ /** Cached sampled pages result, shared across checks within a single run. */
32
+ _sampledPages?: SampledPages;
21
33
  }
22
34
  export interface CheckOptions {
23
35
  /** Maximum concurrent HTTP requests within a single check. */
@@ -42,7 +54,7 @@ export interface CheckDefinition {
42
54
  id: string;
43
55
  category: string;
44
56
  description: string;
45
- /** Check IDs that must pass before this check runs. Array of arrays for OR-groups. */
57
+ /** Check IDs that must pass or warn before this check runs. Array of arrays for OR-groups. */
46
58
  dependsOn: string[][] | string[];
47
59
  run: CheckFunction;
48
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}