afdocs 0.1.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/LICENSE +21 -0
- package/README.md +201 -0
- package/bin/afdocs.mjs +3 -0
- package/dist/checks/agent-discoverability/llms-txt-directive.d.ts +2 -0
- package/dist/checks/agent-discoverability/llms-txt-directive.d.ts.map +1 -0
- package/dist/checks/agent-discoverability/llms-txt-directive.js +17 -0
- package/dist/checks/agent-discoverability/llms-txt-directive.js.map +1 -0
- package/dist/checks/content-structure/markdown-code-fence-validity.d.ts +2 -0
- package/dist/checks/content-structure/markdown-code-fence-validity.d.ts.map +1 -0
- package/dist/checks/content-structure/markdown-code-fence-validity.js +17 -0
- package/dist/checks/content-structure/markdown-code-fence-validity.js.map +1 -0
- package/dist/checks/content-structure/section-header-quality.d.ts +2 -0
- package/dist/checks/content-structure/section-header-quality.d.ts.map +1 -0
- package/dist/checks/content-structure/section-header-quality.js +17 -0
- package/dist/checks/content-structure/section-header-quality.js.map +1 -0
- package/dist/checks/content-structure/tabbed-content-serialization.d.ts +2 -0
- package/dist/checks/content-structure/tabbed-content-serialization.d.ts.map +1 -0
- package/dist/checks/content-structure/tabbed-content-serialization.js +17 -0
- package/dist/checks/content-structure/tabbed-content-serialization.js.map +1 -0
- package/dist/checks/index.d.ts +22 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +30 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/llms-txt/llms-txt-exists.d.ts +2 -0
- package/dist/checks/llms-txt/llms-txt-exists.d.ts.map +1 -0
- package/dist/checks/llms-txt/llms-txt-exists.js +107 -0
- package/dist/checks/llms-txt/llms-txt-exists.js.map +1 -0
- package/dist/checks/llms-txt/llms-txt-links-markdown.d.ts +2 -0
- package/dist/checks/llms-txt/llms-txt-links-markdown.d.ts.map +1 -0
- package/dist/checks/llms-txt/llms-txt-links-markdown.js +144 -0
- package/dist/checks/llms-txt/llms-txt-links-markdown.js.map +1 -0
- package/dist/checks/llms-txt/llms-txt-links-resolve.d.ts +2 -0
- package/dist/checks/llms-txt/llms-txt-links-resolve.d.ts.map +1 -0
- package/dist/checks/llms-txt/llms-txt-links-resolve.js +116 -0
- package/dist/checks/llms-txt/llms-txt-links-resolve.js.map +1 -0
- package/dist/checks/llms-txt/llms-txt-size.d.ts +2 -0
- package/dist/checks/llms-txt/llms-txt-size.d.ts.map +1 -0
- package/dist/checks/llms-txt/llms-txt-size.js +56 -0
- package/dist/checks/llms-txt/llms-txt-size.js.map +1 -0
- package/dist/checks/llms-txt/llms-txt-valid.d.ts +6 -0
- package/dist/checks/llms-txt/llms-txt-valid.d.ts.map +1 -0
- package/dist/checks/llms-txt/llms-txt-valid.js +89 -0
- package/dist/checks/llms-txt/llms-txt-valid.js.map +1 -0
- package/dist/checks/markdown-availability/content-negotiation.d.ts +2 -0
- package/dist/checks/markdown-availability/content-negotiation.d.ts.map +1 -0
- package/dist/checks/markdown-availability/content-negotiation.js +17 -0
- package/dist/checks/markdown-availability/content-negotiation.js.map +1 -0
- package/dist/checks/markdown-availability/markdown-url-support.d.ts +2 -0
- package/dist/checks/markdown-availability/markdown-url-support.d.ts.map +1 -0
- package/dist/checks/markdown-availability/markdown-url-support.js +17 -0
- package/dist/checks/markdown-availability/markdown-url-support.js.map +1 -0
- package/dist/checks/observability/cache-header-hygiene.d.ts +2 -0
- package/dist/checks/observability/cache-header-hygiene.d.ts.map +1 -0
- package/dist/checks/observability/cache-header-hygiene.js +17 -0
- package/dist/checks/observability/cache-header-hygiene.js.map +1 -0
- package/dist/checks/observability/llms-txt-freshness.d.ts +2 -0
- package/dist/checks/observability/llms-txt-freshness.d.ts.map +1 -0
- package/dist/checks/observability/llms-txt-freshness.js +17 -0
- package/dist/checks/observability/llms-txt-freshness.js.map +1 -0
- package/dist/checks/observability/markdown-content-parity.d.ts +2 -0
- package/dist/checks/observability/markdown-content-parity.d.ts.map +1 -0
- package/dist/checks/observability/markdown-content-parity.js +17 -0
- package/dist/checks/observability/markdown-content-parity.js.map +1 -0
- package/dist/checks/page-size/content-start-position.d.ts +2 -0
- package/dist/checks/page-size/content-start-position.d.ts.map +1 -0
- package/dist/checks/page-size/content-start-position.js +17 -0
- package/dist/checks/page-size/content-start-position.js.map +1 -0
- package/dist/checks/page-size/page-size-html.d.ts +2 -0
- package/dist/checks/page-size/page-size-html.d.ts.map +1 -0
- package/dist/checks/page-size/page-size-html.js +17 -0
- package/dist/checks/page-size/page-size-html.js.map +1 -0
- package/dist/checks/page-size/page-size-markdown.d.ts +2 -0
- package/dist/checks/page-size/page-size-markdown.d.ts.map +1 -0
- package/dist/checks/page-size/page-size-markdown.js +17 -0
- package/dist/checks/page-size/page-size-markdown.js.map +1 -0
- package/dist/checks/registry.d.ts +7 -0
- package/dist/checks/registry.d.ts.map +1 -0
- package/dist/checks/registry.js +20 -0
- package/dist/checks/registry.js.map +1 -0
- package/dist/checks/url-stability/http-status-codes.d.ts +2 -0
- package/dist/checks/url-stability/http-status-codes.d.ts.map +1 -0
- package/dist/checks/url-stability/http-status-codes.js +17 -0
- package/dist/checks/url-stability/http-status-codes.js.map +1 -0
- package/dist/checks/url-stability/redirect-behavior.d.ts +2 -0
- package/dist/checks/url-stability/redirect-behavior.d.ts.map +1 -0
- package/dist/checks/url-stability/redirect-behavior.js +17 -0
- package/dist/checks/url-stability/redirect-behavior.js.map +1 -0
- package/dist/cli/commands/check.d.ts +4 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +38 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/formatters/json.d.ts +3 -0
- package/dist/cli/formatters/json.d.ts.map +1 -0
- package/dist/cli/formatters/json.js +4 -0
- package/dist/cli/formatters/json.js.map +1 -0
- package/dist/cli/formatters/text.d.ts +3 -0
- package/dist/cli/formatters/text.d.ts.map +1 -0
- package/dist/cli/formatters/text.js +59 -0
- package/dist/cli/formatters/text.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +12 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/constants.d.ts +36 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +24 -0
- package/dist/constants.js.map +1 -0
- package/dist/helpers/config.d.ts +3 -0
- package/dist/helpers/config.d.ts.map +1 -0
- package/dist/helpers/config.js +25 -0
- package/dist/helpers/config.js.map +1 -0
- package/dist/helpers/index.d.ts +3 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +3 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/vitest-runner.d.ts +23 -0
- package/dist/helpers/vitest-runner.d.ts.map +1 -0
- package/dist/helpers/vitest-runner.js +67 -0
- package/dist/helpers/vitest-runner.js.map +1 -0
- package/dist/http.d.ts +9 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +49 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/runner.d.ts +4 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +100 -0
- package/dist/runner.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Dachary Carey
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# afdocs
|
|
2
|
+
|
|
3
|
+
Test your documentation site against the [Agent-Friendly Documentation Spec](https://agentdocsspec.com).
|
|
4
|
+
|
|
5
|
+
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.
|
|
6
|
+
|
|
7
|
+
afdocs runs 19 checks across 7 categories to evaluate how well your docs serve agent consumers.
|
|
8
|
+
|
|
9
|
+
## Quick start
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx afdocs check https://docs.example.com
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Example output:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Agent-Friendly Docs Check: https://react.dev
|
|
19
|
+
|
|
20
|
+
llms-txt
|
|
21
|
+
✓ llms-txt-exists: llms.txt found at 1 location(s)
|
|
22
|
+
✓ llms-txt-valid: llms.txt follows the proposed structure
|
|
23
|
+
✓ llms-txt-size: llms.txt is 14,347 characters (under 50,000 threshold)
|
|
24
|
+
✓ llms-txt-links-resolve: All 50 tested links resolve (177 total links)
|
|
25
|
+
✓ llms-txt-links-markdown: 50/50 links point to markdown content (100%)
|
|
26
|
+
|
|
27
|
+
Summary
|
|
28
|
+
5 passed, 14 skipped (19 total)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Install
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install afdocs
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## CLI usage
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Run all checks
|
|
41
|
+
afdocs check https://docs.example.com
|
|
42
|
+
|
|
43
|
+
# Run specific checks
|
|
44
|
+
afdocs check https://docs.example.com --checks llms-txt-exists,llms-txt-valid,llms-txt-size
|
|
45
|
+
|
|
46
|
+
# JSON output
|
|
47
|
+
afdocs check https://docs.example.com --format json
|
|
48
|
+
|
|
49
|
+
# Adjust thresholds
|
|
50
|
+
afdocs check https://docs.example.com --pass-threshold 30000 --fail-threshold 80000
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Options
|
|
54
|
+
|
|
55
|
+
| Option | Default | Description |
|
|
56
|
+
| ----------------------- | -------- | ------------------------------------ |
|
|
57
|
+
| `--format <format>` | `text` | Output format: `text` or `json` |
|
|
58
|
+
| `--checks <ids>` | all | Comma-separated list of check IDs |
|
|
59
|
+
| `--max-concurrency <n>` | `3` | Maximum concurrent HTTP requests |
|
|
60
|
+
| `--request-delay <ms>` | `200` | Delay between requests |
|
|
61
|
+
| `--max-links <n>` | `50` | Maximum links to test in link checks |
|
|
62
|
+
| `--pass-threshold <n>` | `50000` | Size pass threshold (characters) |
|
|
63
|
+
| `--fail-threshold <n>` | `100000` | Size fail threshold (characters) |
|
|
64
|
+
|
|
65
|
+
### Exit codes
|
|
66
|
+
|
|
67
|
+
- `0` if all checks pass or warn
|
|
68
|
+
- `1` if any check fails
|
|
69
|
+
|
|
70
|
+
## Programmatic API
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import { runChecks, createContext, getCheck } from 'afdocs';
|
|
74
|
+
|
|
75
|
+
// Run all checks
|
|
76
|
+
const report = await runChecks('https://docs.example.com');
|
|
77
|
+
|
|
78
|
+
// Run a single check
|
|
79
|
+
const ctx = createContext('https://docs.example.com');
|
|
80
|
+
const check = getCheck('llms-txt-exists')!;
|
|
81
|
+
const result = await check.run(ctx);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Test helpers
|
|
85
|
+
|
|
86
|
+
afdocs includes vitest helpers so you can add agent-friendliness checks to your docs site's test suite.
|
|
87
|
+
|
|
88
|
+
### Config-driven
|
|
89
|
+
|
|
90
|
+
Create `agent-docs.config.yml`:
|
|
91
|
+
|
|
92
|
+
```yaml
|
|
93
|
+
url: https://docs.example.com
|
|
94
|
+
checks:
|
|
95
|
+
- llms-txt-exists
|
|
96
|
+
- llms-txt-valid
|
|
97
|
+
- llms-txt-size
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Then in your test file:
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
import { describeAgentDocs } from 'afdocs/helpers';
|
|
104
|
+
|
|
105
|
+
describeAgentDocs();
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
This reads the config and generates one test assertion covering all specified checks.
|
|
109
|
+
|
|
110
|
+
### Direct imports
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
import { createContext, getCheck } from 'afdocs';
|
|
114
|
+
import { describe, it, expect } from 'vitest';
|
|
115
|
+
|
|
116
|
+
describe('agent-friendliness', () => {
|
|
117
|
+
it('has a valid llms.txt', async () => {
|
|
118
|
+
const ctx = createContext('https://docs.example.com');
|
|
119
|
+
const check = getCheck('llms-txt-exists')!;
|
|
120
|
+
const result = await check.run(ctx);
|
|
121
|
+
expect(result.status).toBe('pass');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Checks
|
|
127
|
+
|
|
128
|
+
19 checks across 7 categories. Checks marked with \* are not yet implemented and will return `skip`.
|
|
129
|
+
|
|
130
|
+
### Category 1: llms.txt
|
|
131
|
+
|
|
132
|
+
| Check | Description |
|
|
133
|
+
| ------------------------- | --------------------------------------------------------- |
|
|
134
|
+
| `llms-txt-exists` | Whether `llms.txt` is discoverable at candidate locations |
|
|
135
|
+
| `llms-txt-valid` | Whether `llms.txt` follows the llmstxt.org structure |
|
|
136
|
+
| `llms-txt-size` | Whether `llms.txt` fits within agent truncation limits |
|
|
137
|
+
| `llms-txt-links-resolve` | Whether URLs in `llms.txt` return 200 |
|
|
138
|
+
| `llms-txt-links-markdown` | Whether URLs in `llms.txt` point to markdown content |
|
|
139
|
+
|
|
140
|
+
### Category 2: Markdown Availability
|
|
141
|
+
|
|
142
|
+
| Check | Description |
|
|
143
|
+
| ------------------------- | ------------------------------------------------- |
|
|
144
|
+
| `markdown-url-support` \* | Whether `.md` URL variants return markdown |
|
|
145
|
+
| `content-negotiation` \* | Whether the server honors `Accept: text/markdown` |
|
|
146
|
+
|
|
147
|
+
### Category 3: Page Size and Truncation Risk
|
|
148
|
+
|
|
149
|
+
| Check | Description |
|
|
150
|
+
| --------------------------- | ------------------------------------------------ |
|
|
151
|
+
| `page-size-markdown` \* | Character count when served as markdown |
|
|
152
|
+
| `page-size-html` \* | Character count of HTML and post-conversion size |
|
|
153
|
+
| `content-start-position` \* | How far into the response actual content begins |
|
|
154
|
+
|
|
155
|
+
### Category 4: Content Structure
|
|
156
|
+
|
|
157
|
+
| Check | Description |
|
|
158
|
+
| --------------------------------- | -------------------------------------------------- |
|
|
159
|
+
| `tabbed-content-serialization` \* | Whether tabbed content creates oversized output |
|
|
160
|
+
| `section-header-quality` \* | Whether headers in tabbed sections include context |
|
|
161
|
+
| `markdown-code-fence-validity` \* | Whether markdown has unclosed code fences |
|
|
162
|
+
|
|
163
|
+
### Category 5: URL Stability and Redirects
|
|
164
|
+
|
|
165
|
+
| Check | Description |
|
|
166
|
+
| ---------------------- | ----------------------------------------------- |
|
|
167
|
+
| `http-status-codes` \* | Whether error pages return correct status codes |
|
|
168
|
+
| `redirect-behavior` \* | Whether redirects are same-host HTTP redirects |
|
|
169
|
+
|
|
170
|
+
### Category 6: Agent Discoverability Directives
|
|
171
|
+
|
|
172
|
+
| Check | Description |
|
|
173
|
+
| ----------------------- | -------------------------------------------------------- |
|
|
174
|
+
| `llms-txt-directive` \* | Whether pages include a directive pointing to `llms.txt` |
|
|
175
|
+
|
|
176
|
+
### Category 7: Observability and Content Health
|
|
177
|
+
|
|
178
|
+
| Check | Description |
|
|
179
|
+
| ---------------------------- | ---------------------------------------------- |
|
|
180
|
+
| `llms-txt-freshness` \* | Whether `llms.txt` reflects current site state |
|
|
181
|
+
| `markdown-content-parity` \* | Whether markdown and HTML versions match |
|
|
182
|
+
| `cache-header-hygiene` \* | Whether cache headers allow timely updates |
|
|
183
|
+
|
|
184
|
+
## Check dependencies
|
|
185
|
+
|
|
186
|
+
Some checks depend on others. If a dependency doesn't pass, the dependent check is skipped automatically.
|
|
187
|
+
|
|
188
|
+
- `llms-txt-valid`, `llms-txt-size`, `llms-txt-links-resolve`, `llms-txt-links-markdown` require `llms-txt-exists`
|
|
189
|
+
- `page-size-markdown` requires `markdown-url-support` or `content-negotiation`
|
|
190
|
+
- `section-header-quality` requires `tabbed-content-serialization`
|
|
191
|
+
- `markdown-code-fence-validity` requires `markdown-url-support` or `content-negotiation`
|
|
192
|
+
- `llms-txt-freshness` requires `llms-txt-exists`
|
|
193
|
+
- `markdown-content-parity` requires `markdown-url-support` or `content-negotiation`
|
|
194
|
+
|
|
195
|
+
## Responsible use
|
|
196
|
+
|
|
197
|
+
afdocs makes HTTP requests to the sites it checks. It enforces delays between requests (200ms default), caps concurrent connections, and honors `Retry-After` headers. The goal is to help documentation teams improve agent accessibility, not to load-test their infrastructure.
|
|
198
|
+
|
|
199
|
+
## License
|
|
200
|
+
|
|
201
|
+
MIT
|
package/bin/afdocs.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llms-txt-directive.d.ts","sourceRoot":"","sources":["../../../src/checks/agent-discoverability/llms-txt-directive.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { registerCheck } from '../registry.js';
|
|
2
|
+
async function check(_ctx) {
|
|
3
|
+
return {
|
|
4
|
+
id: 'llms-txt-directive',
|
|
5
|
+
category: 'agent-discoverability',
|
|
6
|
+
status: 'skip',
|
|
7
|
+
message: 'Not yet implemented',
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
registerCheck({
|
|
11
|
+
id: 'llms-txt-directive',
|
|
12
|
+
category: 'agent-discoverability',
|
|
13
|
+
description: 'Whether pages include a directive pointing to llms.txt',
|
|
14
|
+
dependsOn: [],
|
|
15
|
+
run: check,
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=llms-txt-directive.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-code-fence-validity.d.ts","sourceRoot":"","sources":["../../../src/checks/content-structure/markdown-code-fence-validity.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { registerCheck } from '../registry.js';
|
|
2
|
+
async function check(_ctx) {
|
|
3
|
+
return {
|
|
4
|
+
id: 'markdown-code-fence-validity',
|
|
5
|
+
category: 'content-structure',
|
|
6
|
+
status: 'skip',
|
|
7
|
+
message: 'Not yet implemented',
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
registerCheck({
|
|
11
|
+
id: 'markdown-code-fence-validity',
|
|
12
|
+
category: 'content-structure',
|
|
13
|
+
description: 'Whether markdown contains unclosed code fences',
|
|
14
|
+
dependsOn: [['markdown-url-support', 'content-negotiation']],
|
|
15
|
+
run: check,
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=markdown-code-fence-validity.js.map
|
|
@@ -0,0 +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;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,8BAA8B;QAClC,QAAQ,EAAE,mBAAmB;QAC7B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,8BAA8B;IAClC,QAAQ,EAAE,mBAAmB;IAC7B,WAAW,EAAE,gDAAgD;IAC7D,SAAS,EAAE,CAAC,CAAC,sBAAsB,EAAE,qBAAqB,CAAC,CAAC;IAC5D,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-header-quality.d.ts","sourceRoot":"","sources":["../../../src/checks/content-structure/section-header-quality.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { registerCheck } from '../registry.js';
|
|
2
|
+
async function check(_ctx) {
|
|
3
|
+
return {
|
|
4
|
+
id: 'section-header-quality',
|
|
5
|
+
category: 'content-structure',
|
|
6
|
+
status: 'skip',
|
|
7
|
+
message: 'Not yet implemented',
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
registerCheck({
|
|
11
|
+
id: 'section-header-quality',
|
|
12
|
+
category: 'content-structure',
|
|
13
|
+
description: 'Whether headers in tabbed sections include variant context',
|
|
14
|
+
dependsOn: ['tabbed-content-serialization'],
|
|
15
|
+
run: check,
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=section-header-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-header-quality.js","sourceRoot":"","sources":["../../../src/checks/content-structure/section-header-quality.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,wBAAwB;QAC5B,QAAQ,EAAE,mBAAmB;QAC7B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,wBAAwB;IAC5B,QAAQ,EAAE,mBAAmB;IAC7B,WAAW,EAAE,4DAA4D;IACzE,SAAS,EAAE,CAAC,8BAA8B,CAAC;IAC3C,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabbed-content-serialization.d.ts","sourceRoot":"","sources":["../../../src/checks/content-structure/tabbed-content-serialization.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { registerCheck } from '../registry.js';
|
|
2
|
+
async function check(_ctx) {
|
|
3
|
+
return {
|
|
4
|
+
id: 'tabbed-content-serialization',
|
|
5
|
+
category: 'content-structure',
|
|
6
|
+
status: 'skip',
|
|
7
|
+
message: 'Not yet implemented',
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
registerCheck({
|
|
11
|
+
id: 'tabbed-content-serialization',
|
|
12
|
+
category: 'content-structure',
|
|
13
|
+
description: 'Whether tabbed/accordion content serializes into oversized output',
|
|
14
|
+
dependsOn: [],
|
|
15
|
+
run: check,
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=tabbed-content-serialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabbed-content-serialization.js","sourceRoot":"","sources":["../../../src/checks/content-structure/tabbed-content-serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,8BAA8B;QAClC,QAAQ,EAAE,mBAAmB;QAC7B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,8BAA8B;IAClC,QAAQ,EAAE,mBAAmB;IAC7B,WAAW,EAAE,mEAAmE;IAChF,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import './llms-txt/llms-txt-exists.js';
|
|
2
|
+
import './llms-txt/llms-txt-valid.js';
|
|
3
|
+
import './llms-txt/llms-txt-size.js';
|
|
4
|
+
import './llms-txt/llms-txt-links-resolve.js';
|
|
5
|
+
import './llms-txt/llms-txt-links-markdown.js';
|
|
6
|
+
import './markdown-availability/markdown-url-support.js';
|
|
7
|
+
import './markdown-availability/content-negotiation.js';
|
|
8
|
+
import './page-size/page-size-markdown.js';
|
|
9
|
+
import './page-size/page-size-html.js';
|
|
10
|
+
import './page-size/content-start-position.js';
|
|
11
|
+
import './content-structure/tabbed-content-serialization.js';
|
|
12
|
+
import './content-structure/section-header-quality.js';
|
|
13
|
+
import './content-structure/markdown-code-fence-validity.js';
|
|
14
|
+
import './url-stability/http-status-codes.js';
|
|
15
|
+
import './url-stability/redirect-behavior.js';
|
|
16
|
+
import './agent-discoverability/llms-txt-directive.js';
|
|
17
|
+
import './observability/llms-txt-freshness.js';
|
|
18
|
+
import './observability/markdown-content-parity.js';
|
|
19
|
+
import './observability/cache-header-hygiene.js';
|
|
20
|
+
export { getCheck, getAllChecks, getChecksSorted } from './registry.js';
|
|
21
|
+
export { extractMarkdownLinks } from './llms-txt/llms-txt-valid.js';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAGA,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,uCAAuC,CAAC;AAG/C,OAAO,iDAAiD,CAAC;AACzD,OAAO,gDAAgD,CAAC;AAGxD,OAAO,mCAAmC,CAAC;AAC3C,OAAO,+BAA+B,CAAC;AACvC,OAAO,uCAAuC,CAAC;AAG/C,OAAO,qDAAqD,CAAC;AAC7D,OAAO,+CAA+C,CAAC;AACvD,OAAO,qDAAqD,CAAC;AAG7D,OAAO,sCAAsC,CAAC;AAC9C,OAAO,sCAAsC,CAAC;AAG9C,OAAO,+CAA+C,CAAC;AAGvD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,4CAA4C,CAAC;AACpD,OAAO,yCAAyC,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Import all check modules to trigger registration
|
|
2
|
+
// Category 1: llms.txt
|
|
3
|
+
import './llms-txt/llms-txt-exists.js';
|
|
4
|
+
import './llms-txt/llms-txt-valid.js';
|
|
5
|
+
import './llms-txt/llms-txt-size.js';
|
|
6
|
+
import './llms-txt/llms-txt-links-resolve.js';
|
|
7
|
+
import './llms-txt/llms-txt-links-markdown.js';
|
|
8
|
+
// Category 2: Markdown Availability
|
|
9
|
+
import './markdown-availability/markdown-url-support.js';
|
|
10
|
+
import './markdown-availability/content-negotiation.js';
|
|
11
|
+
// Category 3: Page Size
|
|
12
|
+
import './page-size/page-size-markdown.js';
|
|
13
|
+
import './page-size/page-size-html.js';
|
|
14
|
+
import './page-size/content-start-position.js';
|
|
15
|
+
// Category 4: Content Structure
|
|
16
|
+
import './content-structure/tabbed-content-serialization.js';
|
|
17
|
+
import './content-structure/section-header-quality.js';
|
|
18
|
+
import './content-structure/markdown-code-fence-validity.js';
|
|
19
|
+
// Category 5: URL Stability
|
|
20
|
+
import './url-stability/http-status-codes.js';
|
|
21
|
+
import './url-stability/redirect-behavior.js';
|
|
22
|
+
// Category 6: Agent Discoverability
|
|
23
|
+
import './agent-discoverability/llms-txt-directive.js';
|
|
24
|
+
// Category 7: Observability
|
|
25
|
+
import './observability/llms-txt-freshness.js';
|
|
26
|
+
import './observability/markdown-content-parity.js';
|
|
27
|
+
import './observability/cache-header-hygiene.js';
|
|
28
|
+
export { getCheck, getAllChecks, getChecksSorted } from './registry.js';
|
|
29
|
+
export { extractMarkdownLinks } from './llms-txt/llms-txt-valid.js';
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,uBAAuB;AACvB,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,uCAAuC,CAAC;AAE/C,oCAAoC;AACpC,OAAO,iDAAiD,CAAC;AACzD,OAAO,gDAAgD,CAAC;AAExD,wBAAwB;AACxB,OAAO,mCAAmC,CAAC;AAC3C,OAAO,+BAA+B,CAAC;AACvC,OAAO,uCAAuC,CAAC;AAE/C,gCAAgC;AAChC,OAAO,qDAAqD,CAAC;AAC7D,OAAO,+CAA+C,CAAC;AACvD,OAAO,qDAAqD,CAAC;AAE7D,4BAA4B;AAC5B,OAAO,sCAAsC,CAAC;AAC9C,OAAO,sCAAsC,CAAC;AAE9C,oCAAoC;AACpC,OAAO,+CAA+C,CAAC;AAEvD,4BAA4B;AAC5B,OAAO,uCAAuC,CAAC;AAC/C,OAAO,4CAA4C,CAAC;AACpD,OAAO,yCAAyC,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llms-txt-exists.d.ts","sourceRoot":"","sources":["../../../src/checks/llms-txt/llms-txt-exists.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { registerCheck } from '../registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build candidate URLs for llms.txt discovery.
|
|
4
|
+
* Per spec: {base_url}/llms.txt, {origin}/llms.txt, {origin}/docs/llms.txt
|
|
5
|
+
* Deduplicates.
|
|
6
|
+
*/
|
|
7
|
+
function getCandidateUrls(baseUrl, origin) {
|
|
8
|
+
const candidates = new Set();
|
|
9
|
+
candidates.add(`${baseUrl}/llms.txt`);
|
|
10
|
+
candidates.add(`${origin}/llms.txt`);
|
|
11
|
+
candidates.add(`${origin}/docs/llms.txt`);
|
|
12
|
+
return Array.from(candidates);
|
|
13
|
+
}
|
|
14
|
+
function isCrossHostRedirect(originalUrl, finalUrl) {
|
|
15
|
+
try {
|
|
16
|
+
const original = new URL(originalUrl);
|
|
17
|
+
const final_ = new URL(finalUrl);
|
|
18
|
+
return original.host !== final_.host;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function checkLlmsTxtExists(ctx) {
|
|
25
|
+
const candidates = getCandidateUrls(ctx.baseUrl, ctx.origin);
|
|
26
|
+
const discovered = [];
|
|
27
|
+
const checkedUrls = [];
|
|
28
|
+
for (const url of candidates) {
|
|
29
|
+
try {
|
|
30
|
+
const response = await ctx.http.fetch(url);
|
|
31
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
32
|
+
const isText = contentType.includes('text/');
|
|
33
|
+
checkedUrls.push({
|
|
34
|
+
url,
|
|
35
|
+
status: response.status,
|
|
36
|
+
redirected: response.redirected,
|
|
37
|
+
finalUrl: response.redirected ? response.url : undefined,
|
|
38
|
+
});
|
|
39
|
+
if (response.ok && isText) {
|
|
40
|
+
const content = await response.text();
|
|
41
|
+
// Check it's not an HTML error page
|
|
42
|
+
const looksLikeHtml = content.trimStart().startsWith('<!') || content.trimStart().startsWith('<html');
|
|
43
|
+
if (!looksLikeHtml && content.trim().length > 0) {
|
|
44
|
+
const crossHost = response.redirected && isCrossHostRedirect(url, response.url);
|
|
45
|
+
discovered.push({
|
|
46
|
+
url,
|
|
47
|
+
content,
|
|
48
|
+
status: response.status,
|
|
49
|
+
redirected: response.redirected,
|
|
50
|
+
redirectUrl: response.redirected ? response.url : undefined,
|
|
51
|
+
crossHostRedirect: crossHost,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
checkedUrls.push({ url, status: 0, redirected: false });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Store discovered files for downstream checks
|
|
61
|
+
const details = {
|
|
62
|
+
candidateUrls: checkedUrls,
|
|
63
|
+
discoveredFiles: discovered,
|
|
64
|
+
};
|
|
65
|
+
if (discovered.length === 0) {
|
|
66
|
+
return {
|
|
67
|
+
id: 'llms-txt-exists',
|
|
68
|
+
category: 'llms-txt',
|
|
69
|
+
status: 'fail',
|
|
70
|
+
message: `No llms.txt found at any candidate location (${candidates.join(', ')})`,
|
|
71
|
+
details,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Check if any discovered files were only reachable via cross-host redirect
|
|
75
|
+
const allCrossHost = discovered.every((f) => f.crossHostRedirect);
|
|
76
|
+
if (allCrossHost) {
|
|
77
|
+
return {
|
|
78
|
+
id: 'llms-txt-exists',
|
|
79
|
+
category: 'llms-txt',
|
|
80
|
+
status: 'warn',
|
|
81
|
+
message: 'llms.txt found but only reachable via cross-host redirect (agents may not follow it)',
|
|
82
|
+
details,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Note if multiple locations serve different content
|
|
86
|
+
if (discovered.length > 1) {
|
|
87
|
+
const contents = discovered.map((f) => f.content);
|
|
88
|
+
const allSame = contents.every((c) => c === contents[0]);
|
|
89
|
+
details.multipleLocations = true;
|
|
90
|
+
details.sameContent = allSame;
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
id: 'llms-txt-exists',
|
|
94
|
+
category: 'llms-txt',
|
|
95
|
+
status: 'pass',
|
|
96
|
+
message: `llms.txt found at ${discovered.length} location(s)`,
|
|
97
|
+
details,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
registerCheck({
|
|
101
|
+
id: 'llms-txt-exists',
|
|
102
|
+
category: 'llms-txt',
|
|
103
|
+
description: 'Whether llms.txt is discoverable at any of the candidate locations',
|
|
104
|
+
dependsOn: [],
|
|
105
|
+
run: checkLlmsTxtExists,
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=llms-txt-exists.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llms-txt-exists.js","sourceRoot":"","sources":["../../../src/checks/llms-txt/llms-txt-exists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,MAAc;IACvD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,WAAW,CAAC,CAAC;IACtC,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC;IACrC,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,gBAAgB,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,mBAAmB,CAAC,WAAmB,EAAE,QAAgB;IAChE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,OAAO,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,GAAiB;IACjD,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,WAAW,GAKZ,EAAE,CAAC;IAER,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAE7C,WAAW,CAAC,IAAI,CAAC;gBACf,GAAG;gBACH,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;aACzD,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACtC,oCAAoC;gBACpC,MAAM,aAAa,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAClF,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,IAAI,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAChF,UAAU,CAAC,IAAI,CAAC;wBACd,GAAG;wBACH,OAAO;wBACP,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;wBAC3D,iBAAiB,EAAE,SAAS;qBAC7B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,OAAO,GAA4B;QACvC,aAAa,EAAE,WAAW;QAC1B,eAAe,EAAE,UAAU;KAC5B,CAAC;IAEF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,EAAE,EAAE,iBAAiB;YACrB,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,gDAAgD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACjF,OAAO;SACR,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAClE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;YACL,EAAE,EAAE,iBAAiB;YACrB,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,MAAM;YACd,OAAO,EACL,sFAAsF;YACxF,OAAO;SACR,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;QACjC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,OAAO;QACL,EAAE,EAAE,iBAAiB;QACrB,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB,UAAU,CAAC,MAAM,cAAc;QAC7D,OAAO;KACR,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,iBAAiB;IACrB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,oEAAoE;IACjF,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,kBAAkB;CACxB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llms-txt-links-markdown.d.ts","sourceRoot":"","sources":["../../../src/checks/llms-txt/llms-txt-links-markdown.ts"],"names":[],"mappings":""}
|