ax-audit 2.2.1 → 2.4.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/CHANGELOG.md +13 -0
- package/README.md +57 -3
- package/dist/baseline.d.ts +22 -0
- package/dist/baseline.d.ts.map +1 -0
- package/dist/baseline.js +108 -0
- package/dist/baseline.js.map +1 -0
- package/dist/checks/agent-json.d.ts.map +1 -1
- package/dist/checks/agent-json.js +7 -0
- package/dist/checks/agent-json.js.map +1 -1
- package/dist/checks/http-headers.d.ts.map +1 -1
- package/dist/checks/http-headers.js +8 -0
- package/dist/checks/http-headers.js.map +1 -1
- package/dist/checks/llms-txt.d.ts.map +1 -1
- package/dist/checks/llms-txt.js +8 -0
- package/dist/checks/llms-txt.js.map +1 -1
- package/dist/checks/mcp.d.ts.map +1 -1
- package/dist/checks/mcp.js +12 -0
- package/dist/checks/mcp.js.map +1 -1
- package/dist/checks/meta-tags.d.ts.map +1 -1
- package/dist/checks/meta-tags.js +7 -0
- package/dist/checks/meta-tags.js.map +1 -1
- package/dist/checks/openapi.d.ts.map +1 -1
- package/dist/checks/openapi.js +9 -0
- package/dist/checks/openapi.js.map +1 -1
- package/dist/checks/robots-txt.d.ts.map +1 -1
- package/dist/checks/robots-txt.js +12 -1
- package/dist/checks/robots-txt.js.map +1 -1
- package/dist/checks/security-txt.d.ts.map +1 -1
- package/dist/checks/security-txt.js +5 -0
- package/dist/checks/security-txt.js.map +1 -1
- package/dist/checks/structured-data.d.ts.map +1 -1
- package/dist/checks/structured-data.js +9 -0
- package/dist/checks/structured-data.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +47 -1
- package/dist/cli.js.map +1 -1
- package/dist/guide-urls.d.ts +2 -0
- package/dist/guide-urls.d.ts.map +1 -0
- package/dist/guide-urls.js +5 -0
- package/dist/guide-urls.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/reporter/html.d.ts +2 -2
- package/dist/reporter/html.d.ts.map +1 -1
- package/dist/reporter/html.js +66 -7
- package/dist/reporter/html.js.map +1 -1
- package/dist/reporter/index.d.ts +2 -2
- package/dist/reporter/index.d.ts.map +1 -1
- package/dist/reporter/index.js +4 -4
- package/dist/reporter/index.js.map +1 -1
- package/dist/reporter/json.d.ts +2 -2
- package/dist/reporter/json.d.ts.map +1 -1
- package/dist/reporter/json.js +3 -2
- package/dist/reporter/json.js.map +1 -1
- package/dist/reporter/terminal.d.ts +2 -2
- package/dist/reporter/terminal.d.ts.map +1 -1
- package/dist/reporter/terminal.js +45 -3
- package/dist/reporter/terminal.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to ax-audit are documented here.
|
|
4
4
|
|
|
5
|
+
## [2.4.0] - 2026-04-16
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **Baseline comparison**: `--save-baseline <path>` saves audit results as a baseline JSON file; `--baseline <path>` compares against a previous baseline and shows per-check score deltas (▲/▼) in terminal, JSON, and HTML output
|
|
10
|
+
- **Regression gate**: `--fail-on-regression <points>` exits with code 1 if any individual check regresses by more than the specified threshold — ideal for CI/CD quality gates
|
|
11
|
+
- **Programmatic API**: new `saveBaseline()`, `loadBaseline()`, `diffBaseline()`, and `toBaselineData()` exports with full TypeScript types (`BaselineData`, `BaselineDiff`, `CheckDiff`)
|
|
12
|
+
- **15 new tests** for baseline save/load/diff logic, including edge cases for missing files, invalid JSON, removed checks, and mixed regressions/improvements
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- **Test runner glob**: `npm test` now correctly discovers test files in both `test/` root and subdirectories
|
|
17
|
+
|
|
5
18
|
## [2.0.0] - 2026-02-27
|
|
6
19
|
|
|
7
20
|
### Added
|
package/README.md
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="ax-logo.svg" alt="ax-audit logo" width="120">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">ax-audit</h1>
|
|
2
6
|
|
|
3
7
|
[](https://github.com/lucioduran/ax-audit/actions/workflows/ci.yml)
|
|
4
8
|
[](https://www.npmjs.com/package/ax-audit)
|
|
@@ -84,8 +88,51 @@ ax-audit https://example.com --verbose
|
|
|
84
88
|
|
|
85
89
|
# Only show failures and warnings (hide passing findings)
|
|
86
90
|
ax-audit https://example.com --only-failures
|
|
91
|
+
|
|
92
|
+
# Save a baseline for future comparison
|
|
93
|
+
ax-audit https://example.com --save-baseline baseline.json
|
|
94
|
+
|
|
95
|
+
# Compare against a baseline — shows per-check score deltas
|
|
96
|
+
ax-audit https://example.com --baseline baseline.json
|
|
97
|
+
|
|
98
|
+
# Fail CI if any check regresses by more than 5 points
|
|
99
|
+
ax-audit https://example.com --baseline baseline.json --fail-on-regression 5
|
|
87
100
|
```
|
|
88
101
|
|
|
102
|
+
### Baseline Comparison
|
|
103
|
+
|
|
104
|
+
Track score changes over time by saving a baseline and comparing against it in subsequent runs:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# First run — save the baseline
|
|
108
|
+
ax-audit https://example.com --save-baseline .ax-baseline.json
|
|
109
|
+
|
|
110
|
+
# Later — compare against the baseline
|
|
111
|
+
ax-audit https://example.com --baseline .ax-baseline.json
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
AX Audit Report
|
|
116
|
+
https://example.com
|
|
117
|
+
Baseline: 2026-04-15T12:00:00.000Z
|
|
118
|
+
|
|
119
|
+
████████████████████████████████░░░░░░░░ 82/100 Good ▲7
|
|
120
|
+
|
|
121
|
+
LLMs.txt (100/100) ▲20
|
|
122
|
+
Robots.txt (70/100) ▼10
|
|
123
|
+
...
|
|
124
|
+
|
|
125
|
+
Regressions
|
|
126
|
+
Robots.txt: 80 → 70 (▼10)
|
|
127
|
+
|
|
128
|
+
Improvements
|
|
129
|
+
LLMs.txt: 80 → 100 (▲20)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Works with all output formats (terminal, JSON, HTML). In JSON mode, a `baselineDiff` object is included with per-check deltas.
|
|
133
|
+
|
|
134
|
+
Use `--fail-on-regression <points>` in CI to fail the build if any individual check drops by more than the specified threshold.
|
|
135
|
+
|
|
89
136
|
### Batch Mode
|
|
90
137
|
|
|
91
138
|
Pass multiple URLs to audit them sequentially. Each gets its own full report, followed by a summary table:
|
|
@@ -137,7 +184,7 @@ console.log(batch.summary.averageScore); // Average across all URLs
|
|
|
137
184
|
console.log(batch.summary.passed); // Number of URLs scoring >= 70
|
|
138
185
|
```
|
|
139
186
|
|
|
140
|
-
Also exports `calculateOverallScore`, `getGrade`, and `
|
|
187
|
+
Also exports `calculateOverallScore`, `getGrade`, `checks`, `saveBaseline`, `loadBaseline`, `diffBaseline`, and `toBaselineData` for advanced usage.
|
|
141
188
|
|
|
142
189
|
## Scoring
|
|
143
190
|
|
|
@@ -174,6 +221,13 @@ Save the report as an artifact:
|
|
|
174
221
|
path: ax-report.json
|
|
175
222
|
```
|
|
176
223
|
|
|
224
|
+
Fail on regressions using a committed baseline:
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
- name: AX Audit (regression gate)
|
|
228
|
+
run: npx ax-audit https://your-site.com --baseline .ax-baseline.json --fail-on-regression 5
|
|
229
|
+
```
|
|
230
|
+
|
|
177
231
|
## Available Checks
|
|
178
232
|
|
|
179
233
|
| Check ID | Use with `--checks` |
|
|
@@ -194,7 +248,7 @@ Save the report as an artifact:
|
|
|
194
248
|
npm test
|
|
195
249
|
```
|
|
196
250
|
|
|
197
|
-
|
|
251
|
+
121 tests covering all 9 checks, the scorer, baseline comparison, and edge cases. Uses Node.js built-in test runner (`node:test`), no extra test dependencies.
|
|
198
252
|
|
|
199
253
|
## Tech Stack
|
|
200
254
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AuditReport, BaselineData, BaselineDiff } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract a minimal, stable snapshot from an AuditReport suitable for
|
|
4
|
+
* persistence and future comparison.
|
|
5
|
+
*/
|
|
6
|
+
export declare function toBaselineData(report: AuditReport): BaselineData;
|
|
7
|
+
/**
|
|
8
|
+
* Persist a baseline to disk as pretty-printed JSON.
|
|
9
|
+
* Creates intermediate directories if they don't exist.
|
|
10
|
+
*/
|
|
11
|
+
export declare function saveBaseline(path: string, report: AuditReport): void;
|
|
12
|
+
/**
|
|
13
|
+
* Load a previously saved baseline from disk.
|
|
14
|
+
* Throws with a clear message on missing file or invalid JSON.
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadBaseline(path: string): BaselineData;
|
|
17
|
+
/**
|
|
18
|
+
* Compare a current audit report against a stored baseline, producing
|
|
19
|
+
* per-check deltas and overall regression/improvement lists.
|
|
20
|
+
*/
|
|
21
|
+
export declare function diffBaseline(baseline: BaselineData, report: AuditReport): BaselineDiff;
|
|
22
|
+
//# sourceMappingURL=baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAa,MAAM,YAAY,CAAC;AAErF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAWhE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAIpE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAwBvD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,GAAG,YAAY,CAsCtF"}
|
package/dist/baseline.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Extract a minimal, stable snapshot from an AuditReport suitable for
|
|
5
|
+
* persistence and future comparison.
|
|
6
|
+
*/
|
|
7
|
+
export function toBaselineData(report) {
|
|
8
|
+
const checks = {};
|
|
9
|
+
for (const r of report.results) {
|
|
10
|
+
checks[r.id] = r.score;
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
url: report.url,
|
|
14
|
+
timestamp: report.timestamp,
|
|
15
|
+
overallScore: report.overallScore,
|
|
16
|
+
checks,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Persist a baseline to disk as pretty-printed JSON.
|
|
21
|
+
* Creates intermediate directories if they don't exist.
|
|
22
|
+
*/
|
|
23
|
+
export function saveBaseline(path, report) {
|
|
24
|
+
const data = toBaselineData(report);
|
|
25
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
26
|
+
writeFileSync(path, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Load a previously saved baseline from disk.
|
|
30
|
+
* Throws with a clear message on missing file or invalid JSON.
|
|
31
|
+
*/
|
|
32
|
+
export function loadBaseline(path) {
|
|
33
|
+
let raw;
|
|
34
|
+
try {
|
|
35
|
+
raw = readFileSync(path, 'utf-8');
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const code = err.code;
|
|
39
|
+
if (code === 'ENOENT') {
|
|
40
|
+
throw new Error(`Baseline file not found: ${path}`, { cause: err });
|
|
41
|
+
}
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
let data;
|
|
45
|
+
try {
|
|
46
|
+
data = JSON.parse(raw);
|
|
47
|
+
}
|
|
48
|
+
catch (cause) {
|
|
49
|
+
throw new Error(`Baseline file is not valid JSON: ${path}`, { cause });
|
|
50
|
+
}
|
|
51
|
+
if (!isBaselineData(data)) {
|
|
52
|
+
throw new Error(`Baseline file has invalid structure (expected url, timestamp, overallScore, checks): ${path}`);
|
|
53
|
+
}
|
|
54
|
+
return data;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Compare a current audit report against a stored baseline, producing
|
|
58
|
+
* per-check deltas and overall regression/improvement lists.
|
|
59
|
+
*/
|
|
60
|
+
export function diffBaseline(baseline, report) {
|
|
61
|
+
const checks = report.results.map((r) => {
|
|
62
|
+
const previous = baseline.checks[r.id] ?? 0;
|
|
63
|
+
return {
|
|
64
|
+
id: r.id,
|
|
65
|
+
name: r.name,
|
|
66
|
+
previous,
|
|
67
|
+
current: r.score,
|
|
68
|
+
delta: r.score - previous,
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
// Include checks that existed in the baseline but were removed from the current run
|
|
72
|
+
for (const [id, score] of Object.entries(baseline.checks)) {
|
|
73
|
+
if (!checks.some((c) => c.id === id)) {
|
|
74
|
+
checks.push({
|
|
75
|
+
id,
|
|
76
|
+
name: id, // no human-readable name available for removed checks
|
|
77
|
+
previous: score,
|
|
78
|
+
current: 0,
|
|
79
|
+
delta: -score,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const overallDelta = report.overallScore - baseline.overallScore;
|
|
84
|
+
return {
|
|
85
|
+
url: report.url,
|
|
86
|
+
baselineTimestamp: baseline.timestamp,
|
|
87
|
+
currentTimestamp: report.timestamp,
|
|
88
|
+
overallPrevious: baseline.overallScore,
|
|
89
|
+
overallCurrent: report.overallScore,
|
|
90
|
+
overallDelta,
|
|
91
|
+
checks,
|
|
92
|
+
regressions: checks.filter((c) => c.delta < 0),
|
|
93
|
+
improvements: checks.filter((c) => c.delta > 0),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/* ── Internal helpers ─────────────────────────────────────── */
|
|
97
|
+
function isBaselineData(value) {
|
|
98
|
+
if (typeof value !== 'object' || value === null)
|
|
99
|
+
return false;
|
|
100
|
+
const obj = value;
|
|
101
|
+
return (typeof obj.url === 'string' &&
|
|
102
|
+
typeof obj.timestamp === 'string' &&
|
|
103
|
+
typeof obj.overallScore === 'number' &&
|
|
104
|
+
typeof obj.checks === 'object' &&
|
|
105
|
+
obj.checks !== null &&
|
|
106
|
+
!Array.isArray(obj.checks));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=baseline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-json.d.ts","sourceRoot":"","sources":["../../src/checks/agent-json.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-json.d.ts","sourceRoot":"","sources":["../../src/checks/agent-json.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAGjF,eAAO,MAAM,IAAI,EAAE,SAKlB,CAAC;AAEF,wBAA8B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA+F3E"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AGENT_JSON_REQUIRED_FIELDS } from '../constants.js';
|
|
2
|
+
import { guideUrl } from '../guide-urls.js';
|
|
2
3
|
import { buildResult } from './utils.js';
|
|
3
4
|
export const meta = {
|
|
4
5
|
id: 'agent-json',
|
|
@@ -17,6 +18,7 @@ export default async function check(ctx) {
|
|
|
17
18
|
message: '/.well-known/agent.json not found',
|
|
18
19
|
detail: `HTTP ${res.status || 'network error'}`,
|
|
19
20
|
hint: "Create a /.well-known/agent.json file following the A2A (Agent-to-Agent) protocol. It should include name, description, url, and skills fields describing your site's capabilities.",
|
|
21
|
+
learnMoreUrl: guideUrl(meta.id, 'not-found'),
|
|
20
22
|
});
|
|
21
23
|
return buildResult(meta, 0, findings, start);
|
|
22
24
|
}
|
|
@@ -30,6 +32,7 @@ export default async function check(ctx) {
|
|
|
30
32
|
status: 'fail',
|
|
31
33
|
message: 'Invalid JSON',
|
|
32
34
|
hint: 'Fix the JSON syntax in your agent.json file. Validate it with a JSON linter.',
|
|
35
|
+
learnMoreUrl: guideUrl(meta.id, 'invalid-json'),
|
|
33
36
|
});
|
|
34
37
|
return buildResult(meta, 10, findings, start);
|
|
35
38
|
}
|
|
@@ -43,6 +46,7 @@ export default async function check(ctx) {
|
|
|
43
46
|
status: 'fail',
|
|
44
47
|
message: `Required field "${field}" missing`,
|
|
45
48
|
hint: `Add the "${field}" field to your agent.json. This is required by the A2A protocol specification.`,
|
|
49
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-field'),
|
|
46
50
|
});
|
|
47
51
|
score -= 15;
|
|
48
52
|
}
|
|
@@ -55,6 +59,7 @@ export default async function check(ctx) {
|
|
|
55
59
|
status: 'warn',
|
|
56
60
|
message: 'Skills array is empty',
|
|
57
61
|
hint: 'Add at least one skill to the skills array describing what your agent/site can do.',
|
|
62
|
+
learnMoreUrl: guideUrl(meta.id, 'empty-skills'),
|
|
58
63
|
});
|
|
59
64
|
score -= 10;
|
|
60
65
|
}
|
|
@@ -66,6 +71,7 @@ export default async function check(ctx) {
|
|
|
66
71
|
status: 'warn',
|
|
67
72
|
message: 'No protocolVersion field',
|
|
68
73
|
hint: 'Add "protocolVersion": "0.2.0" to your agent.json to declare A2A protocol compatibility.',
|
|
74
|
+
learnMoreUrl: guideUrl(meta.id, 'no-protocol-version'),
|
|
69
75
|
});
|
|
70
76
|
score -= 5;
|
|
71
77
|
}
|
|
@@ -88,6 +94,7 @@ export default async function check(ctx) {
|
|
|
88
94
|
status: 'warn',
|
|
89
95
|
message: 'No optional fields (capabilities, authentication, documentationUrl)',
|
|
90
96
|
hint: 'Consider adding capabilities (what protocols you support), authentication (auth requirements), and documentationUrl (link to API docs).',
|
|
97
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-optional'),
|
|
91
98
|
});
|
|
92
99
|
score -= 5;
|
|
93
100
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-json.js","sourceRoot":"","sources":["../../src/checks/agent-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-json.js","sourceRoot":"","sources":["../../src/checks/agent-json.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-headers.d.ts","sourceRoot":"","sources":["../../src/checks/http-headers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-headers.d.ts","sourceRoot":"","sources":["../../src/checks/http-headers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAGjF,UAAU,SAAS;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CA2B3D;AAoCD,eAAO,MAAM,IAAI,EAAE,SAKlB,CAAC;AAEF,wBAA8B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA4G3E"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SECURITY_HEADERS } from '../constants.js';
|
|
2
|
+
import { guideUrl } from '../guide-urls.js';
|
|
2
3
|
import { buildResult } from './utils.js';
|
|
3
4
|
/** Parse an RFC 5988 Link header into structured entries. */
|
|
4
5
|
export function parseLinkHeader(header) {
|
|
@@ -83,6 +84,7 @@ export default async function check(ctx) {
|
|
|
83
84
|
status: 'fail',
|
|
84
85
|
message: `Missing critical header: ${header.label}`,
|
|
85
86
|
hint: `Add the ${header.label} response header to your server configuration. This is a critical security header.`,
|
|
87
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-critical-header'),
|
|
86
88
|
});
|
|
87
89
|
score -= 10;
|
|
88
90
|
}
|
|
@@ -98,6 +100,7 @@ export default async function check(ctx) {
|
|
|
98
100
|
status: 'warn',
|
|
99
101
|
message: `Only ${securityCount}/${SECURITY_HEADERS.length} security headers present`,
|
|
100
102
|
hint: 'Add security headers like Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options, and Referrer-Policy to your server response.',
|
|
103
|
+
learnMoreUrl: guideUrl(meta.id, 'low-security-headers'),
|
|
101
104
|
});
|
|
102
105
|
score -= 5;
|
|
103
106
|
}
|
|
@@ -114,6 +117,7 @@ export default async function check(ctx) {
|
|
|
114
117
|
status: 'warn',
|
|
115
118
|
message: 'Link header does not reference agent.json',
|
|
116
119
|
hint: 'Add agent.json to your Link header: Link: </.well-known/agent.json>; rel="alternate"; type="application/json"',
|
|
120
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-agent-link'),
|
|
117
121
|
});
|
|
118
122
|
score -= 5;
|
|
119
123
|
}
|
|
@@ -123,6 +127,7 @@ export default async function check(ctx) {
|
|
|
123
127
|
status: 'warn',
|
|
124
128
|
message: 'Link header does not reference llms.txt',
|
|
125
129
|
hint: 'Add llms.txt to your Link header: Link: </llms.txt>; rel="alternate"; type="text/plain"',
|
|
130
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-llms-link'),
|
|
126
131
|
});
|
|
127
132
|
score -= 5;
|
|
128
133
|
}
|
|
@@ -131,6 +136,7 @@ export default async function check(ctx) {
|
|
|
131
136
|
status: 'warn',
|
|
132
137
|
message: 'Link header present but does not reference AI discovery files',
|
|
133
138
|
hint: 'Add AI discovery entries to your Link header: Link: </llms.txt>; rel="alternate"; type="text/plain", </.well-known/agent.json>; rel="alternate"; type="application/json"',
|
|
139
|
+
learnMoreUrl: guideUrl(meta.id, 'no-ai-discovery'),
|
|
134
140
|
});
|
|
135
141
|
score -= 15;
|
|
136
142
|
}
|
|
@@ -139,6 +145,7 @@ export default async function check(ctx) {
|
|
|
139
145
|
status: 'warn',
|
|
140
146
|
message: 'No Link header for AI discovery (llms.txt, agent.json)',
|
|
141
147
|
hint: 'Add a Link response header pointing to your AI discovery files: Link: </llms.txt>; rel="alternate"; type="text/plain", </.well-known/agent.json>; rel="alternate"; type="application/json"',
|
|
148
|
+
learnMoreUrl: guideUrl(meta.id, 'no-link-header'),
|
|
142
149
|
});
|
|
143
150
|
score -= 15;
|
|
144
151
|
}
|
|
@@ -153,6 +160,7 @@ export default async function check(ctx) {
|
|
|
153
160
|
status: 'warn',
|
|
154
161
|
message: 'No CORS headers on .well-known resources',
|
|
155
162
|
hint: 'Add Access-Control-Allow-Origin: * to responses from /.well-known/* so AI agents from other domains can fetch your discovery files.',
|
|
163
|
+
learnMoreUrl: guideUrl(meta.id, 'no-cors'),
|
|
156
164
|
});
|
|
157
165
|
score -= 10;
|
|
158
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-headers.js","sourceRoot":"","sources":["../../src/checks/http-headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"http-headers.js","sourceRoot":"","sources":["../../src/checks/http-headers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llms-txt.d.ts","sourceRoot":"","sources":["../../src/checks/llms-txt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"llms-txt.d.ts","sourceRoot":"","sources":["../../src/checks/llms-txt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAGjF,eAAO,MAAM,IAAI,EAAE,SAKlB,CAAC;AAEF,wBAA8B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAqG3E"}
|
package/dist/checks/llms-txt.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { guideUrl } from '../guide-urls.js';
|
|
1
2
|
import { buildResult } from './utils.js';
|
|
2
3
|
export const meta = {
|
|
3
4
|
id: 'llms-txt',
|
|
@@ -16,6 +17,7 @@ export default async function check(ctx) {
|
|
|
16
17
|
message: '/llms.txt not found',
|
|
17
18
|
detail: `HTTP ${res.status || 'network error'}`,
|
|
18
19
|
hint: 'Create a /llms.txt file at your site root following the llmstxt.org specification. It should be a Markdown file starting with "# Your Site Name" and include a description, sections, and links.',
|
|
20
|
+
learnMoreUrl: guideUrl(meta.id, 'not-found'),
|
|
19
21
|
});
|
|
20
22
|
return buildResult(meta, 0, findings, start);
|
|
21
23
|
}
|
|
@@ -30,6 +32,7 @@ export default async function check(ctx) {
|
|
|
30
32
|
status: 'warn',
|
|
31
33
|
message: 'Missing H1 heading (first line should start with "# ")',
|
|
32
34
|
hint: 'Add an H1 heading as the first line of your llms.txt file, e.g.: # Your Site Name',
|
|
35
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-h1'),
|
|
33
36
|
});
|
|
34
37
|
score -= 15;
|
|
35
38
|
}
|
|
@@ -42,6 +45,7 @@ export default async function check(ctx) {
|
|
|
42
45
|
status: 'warn',
|
|
43
46
|
message: 'No blockquote description found ("> ...")',
|
|
44
47
|
hint: 'Add a blockquote description after the H1 heading, e.g.: > A brief summary of your site for AI agents.',
|
|
48
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-blockquote'),
|
|
45
49
|
});
|
|
46
50
|
score -= 10;
|
|
47
51
|
}
|
|
@@ -54,6 +58,7 @@ export default async function check(ctx) {
|
|
|
54
58
|
status: 'warn',
|
|
55
59
|
message: 'No section headings found (## ...)',
|
|
56
60
|
hint: 'Organize your llms.txt content with ## section headings (e.g., ## About, ## API, ## Documentation).',
|
|
61
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-sections'),
|
|
57
62
|
});
|
|
58
63
|
score -= 10;
|
|
59
64
|
}
|
|
@@ -67,6 +72,7 @@ export default async function check(ctx) {
|
|
|
67
72
|
status: 'warn',
|
|
68
73
|
message: 'No Markdown links found',
|
|
69
74
|
hint: 'Add Markdown links to relevant pages: [Page Title](https://example.com/page). This helps AI agents navigate your site.',
|
|
75
|
+
learnMoreUrl: guideUrl(meta.id, 'no-links'),
|
|
70
76
|
});
|
|
71
77
|
score -= 10;
|
|
72
78
|
}
|
|
@@ -78,6 +84,7 @@ export default async function check(ctx) {
|
|
|
78
84
|
status: 'warn',
|
|
79
85
|
message: 'Content appears minimal (< 100 characters)',
|
|
80
86
|
hint: 'Expand your llms.txt with more descriptive content about your site, its purpose, and available resources.',
|
|
87
|
+
learnMoreUrl: guideUrl(meta.id, 'minimal-content'),
|
|
81
88
|
});
|
|
82
89
|
score -= 10;
|
|
83
90
|
}
|
|
@@ -91,6 +98,7 @@ export default async function check(ctx) {
|
|
|
91
98
|
status: 'warn',
|
|
92
99
|
message: '/llms-full.txt not found (optional but recommended)',
|
|
93
100
|
hint: 'Create a /llms-full.txt with expanded content — full documentation, API details, and comprehensive site information for AI agents.',
|
|
101
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-full'),
|
|
94
102
|
});
|
|
95
103
|
}
|
|
96
104
|
return buildResult(meta, score, findings, start);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llms-txt.js","sourceRoot":"","sources":["../../src/checks/llms-txt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"llms-txt.js","sourceRoot":"","sources":["../../src/checks/llms-txt.ts"],"names":[],"mappings":"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"}
|
package/dist/checks/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/checks/mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/checks/mcp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAGjF,eAAO,MAAM,IAAI,EAAE,SAKlB,CAAC;AAEF,wBAA8B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAmJ3E"}
|
package/dist/checks/mcp.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { guideUrl } from '../guide-urls.js';
|
|
1
2
|
import { buildResult } from './utils.js';
|
|
2
3
|
export const meta = {
|
|
3
4
|
id: 'mcp',
|
|
@@ -16,6 +17,7 @@ export default async function check(ctx) {
|
|
|
16
17
|
message: '/.well-known/mcp.json not found',
|
|
17
18
|
detail: `HTTP ${res.status || 'network error'}`,
|
|
18
19
|
hint: 'Create a /.well-known/mcp.json file describing your MCP server configuration. Include name, description, tools, and version fields. See https://modelcontextprotocol.io for the spec.',
|
|
20
|
+
learnMoreUrl: guideUrl(meta.id, 'not-found'),
|
|
19
21
|
});
|
|
20
22
|
return buildResult(meta, 0, findings, start);
|
|
21
23
|
}
|
|
@@ -29,6 +31,7 @@ export default async function check(ctx) {
|
|
|
29
31
|
status: 'fail',
|
|
30
32
|
message: 'Invalid JSON',
|
|
31
33
|
hint: 'Fix the JSON syntax in your mcp.json file. Validate with a JSON linter.',
|
|
34
|
+
learnMoreUrl: guideUrl(meta.id, 'invalid-json'),
|
|
32
35
|
});
|
|
33
36
|
return buildResult(meta, 10, findings, start);
|
|
34
37
|
}
|
|
@@ -41,6 +44,7 @@ export default async function check(ctx) {
|
|
|
41
44
|
status: 'warn',
|
|
42
45
|
message: 'Missing server name',
|
|
43
46
|
hint: 'Add a "name" field to your mcp.json identifying your MCP server.',
|
|
47
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-name'),
|
|
44
48
|
});
|
|
45
49
|
score -= 10;
|
|
46
50
|
}
|
|
@@ -52,6 +56,7 @@ export default async function check(ctx) {
|
|
|
52
56
|
status: 'warn',
|
|
53
57
|
message: 'Missing server description',
|
|
54
58
|
hint: 'Add a "description" field explaining what your MCP server does and what tools it provides.',
|
|
59
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-description'),
|
|
55
60
|
});
|
|
56
61
|
score -= 5;
|
|
57
62
|
}
|
|
@@ -66,6 +71,7 @@ export default async function check(ctx) {
|
|
|
66
71
|
status: 'warn',
|
|
67
72
|
message: `${toolsWithDescriptions.length}/${data.tools.length} tools have descriptions`,
|
|
68
73
|
hint: 'Add a "description" field to each tool so AI agents understand what each tool does.',
|
|
74
|
+
learnMoreUrl: guideUrl(meta.id, 'missing-tool-descriptions'),
|
|
69
75
|
});
|
|
70
76
|
score -= 5;
|
|
71
77
|
}
|
|
@@ -74,6 +80,7 @@ export default async function check(ctx) {
|
|
|
74
80
|
status: 'warn',
|
|
75
81
|
message: 'No tools have descriptions',
|
|
76
82
|
hint: 'Add a "description" field to each tool in the tools array. Descriptions help AI agents decide which tool to use.',
|
|
83
|
+
learnMoreUrl: guideUrl(meta.id, 'no-tool-descriptions'),
|
|
77
84
|
});
|
|
78
85
|
score -= 10;
|
|
79
86
|
}
|
|
@@ -83,6 +90,7 @@ export default async function check(ctx) {
|
|
|
83
90
|
status: 'warn',
|
|
84
91
|
message: 'Tools array is empty',
|
|
85
92
|
hint: 'Add at least one tool to the tools array with name, description, and inputSchema fields.',
|
|
93
|
+
learnMoreUrl: guideUrl(meta.id, 'empty-tools'),
|
|
86
94
|
});
|
|
87
95
|
score -= 15;
|
|
88
96
|
}
|
|
@@ -91,6 +99,7 @@ export default async function check(ctx) {
|
|
|
91
99
|
status: 'warn',
|
|
92
100
|
message: 'No tools array defined',
|
|
93
101
|
hint: 'Add a "tools" array to your mcp.json. Each tool should have name, description, and inputSchema.',
|
|
102
|
+
learnMoreUrl: guideUrl(meta.id, 'no-tools'),
|
|
94
103
|
});
|
|
95
104
|
score -= 15;
|
|
96
105
|
}
|
|
@@ -102,6 +111,7 @@ export default async function check(ctx) {
|
|
|
102
111
|
status: 'warn',
|
|
103
112
|
message: 'No resources defined',
|
|
104
113
|
hint: 'Add a "resources" array listing the data resources your MCP server exposes to AI agents.',
|
|
114
|
+
learnMoreUrl: guideUrl(meta.id, 'no-resources'),
|
|
105
115
|
});
|
|
106
116
|
score -= 5;
|
|
107
117
|
}
|
|
@@ -119,6 +129,7 @@ export default async function check(ctx) {
|
|
|
119
129
|
status: 'warn',
|
|
120
130
|
message: 'No protocol version specified',
|
|
121
131
|
hint: 'Add a "protocolVersion" field (e.g., "2024-11-05") to declare MCP spec compatibility.',
|
|
132
|
+
learnMoreUrl: guideUrl(meta.id, 'no-version'),
|
|
122
133
|
});
|
|
123
134
|
score -= 5;
|
|
124
135
|
}
|
|
@@ -133,6 +144,7 @@ export default async function check(ctx) {
|
|
|
133
144
|
status: 'warn',
|
|
134
145
|
message: 'No CORS headers on MCP endpoint',
|
|
135
146
|
hint: 'Add Access-Control-Allow-Origin: * to the /.well-known/mcp.json response so browser-based AI agents can fetch it.',
|
|
147
|
+
learnMoreUrl: guideUrl(meta.id, 'no-cors'),
|
|
136
148
|
});
|
|
137
149
|
score -= 10;
|
|
138
150
|
}
|
package/dist/checks/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/checks/mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/checks/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,CAAC,MAAM,IAAI,GAAc;IAC7B,EAAE,EAAE,KAAK;IACT,IAAI,EAAE,8BAA8B;IACpC,WAAW,EAAE,yDAAyD;IACtE,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,KAAK,CAAC,GAAiB;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,KAAK,GAAG,GAAG,CAAC;IAEhB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC;IAE/D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,iCAAiC;YAC1C,MAAM,EAAE,QAAQ,GAAG,CAAC,MAAM,IAAI,eAAe,EAAE;YAC/C,IAAI,EAAE,uLAAuL;YAC7L,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC;SAC7C,CAAC,CAAC;QACH,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;IAE3E,IAAI,IAA6B,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,cAAc;YACvB,IAAI,EAAE,yEAAyE;YAC/E,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC;SAChD,CAAC,CAAC;QACH,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAEzD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,qBAAqB;YAC9B,IAAI,EAAE,kEAAkE;YACxE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC;SAChD,CAAC,CAAC;QACH,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,4BAA4B;YACrC,IAAI,EAAE,4FAA4F;YAClG,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,qBAAqB,CAAC;SACvD,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;QAEnF,MAAM,qBAAqB,GAAI,IAAI,CAAC,KAAmC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACrG,IAAI,qBAAqB,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,qBAAqB,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,0BAA0B;gBACvF,IAAI,EAAE,qFAAqF;gBAC3F,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,2BAA2B,CAAC;aAC7D,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,4BAA4B;gBACrC,IAAI,EAAE,kHAAkH;gBACxH,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,sBAAsB,CAAC;aACxD,CAAC,CAAC;YACH,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,sBAAsB;YAC/B,IAAI,EAAE,0FAA0F;YAChG,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC;SAC/C,CAAC,CAAC;QACH,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,wBAAwB;YACjC,IAAI,EAAE,iGAAiG;YACvG,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC;SAC5C,CAAC,CAAC;QACH,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,sBAAsB,EAAE,CAAC,CAAC;IAC7F,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,sBAAsB;YAC/B,IAAI,EAAE,0FAA0F;YAChG,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC;SAChD,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,oBAAoB,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,qBAAqB,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE;SACrE,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,+BAA+B;YACxC,IAAI,EAAE,uFAAuF;YAC7F,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC;SAC9C,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,EAAE,CAAC;QAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,iCAAiC;YAC1C,IAAI,EAAE,mHAAmH;YACzH,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC;SAC3C,CAAC,CAAC;QACH,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta-tags.d.ts","sourceRoot":"","sources":["../../src/checks/meta-tags.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"meta-tags.d.ts","sourceRoot":"","sources":["../../src/checks/meta-tags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAGjF,eAAO,MAAM,IAAI,EAAE,SAKlB,CAAC;AAIF,wBAA8B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAiG3E"}
|