ax-audit 4.2.0 → 5.0.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 +27 -1
- package/dist/checks/html-rendering.d.ts.map +1 -1
- package/dist/checks/html-rendering.js +1 -1
- package/dist/checks/html-rendering.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/license.d.ts +7 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +71 -0
- package/dist/license.js.map +1 -0
- package/dist/licensed-checks.d.ts +4 -0
- package/dist/licensed-checks.d.ts.map +1 -0
- package/dist/licensed-checks.js +11 -0
- package/dist/licensed-checks.js.map +1 -0
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +8 -1
- package/dist/orchestrator.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/api.md +6 -3
- package/docs/ci.md +15 -0
- package/docs/cli.md +7 -0
- package/docs/getting-started.md +26 -0
- package/package.json +12 -3
- package/dist/checks/agent-json.d.ts +0 -14
- package/dist/checks/agent-json.d.ts.map +0 -1
- package/dist/checks/agent-json.js +0 -167
- package/dist/checks/agent-json.js.map +0 -1
- package/dist/checks/mcp.d.ts +0 -4
- package/dist/checks/mcp.d.ts.map +0 -1
- package/dist/checks/mcp.js +0 -162
- package/dist/checks/mcp.js.map +0 -1
- package/dist/checks/openapi.d.ts +0 -4
- package/dist/checks/openapi.d.ts.map +0 -1
- package/dist/checks/openapi.js +0 -121
- package/dist/checks/openapi.js.map +0 -1
- package/dist/checks/well-known-ai.d.ts +0 -17
- package/dist/checks/well-known-ai.d.ts.map +0 -1
- package/dist/checks/well-known-ai.js +0 -123
- package/dist/checks/well-known-ai.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.0.0
|
|
4
|
+
|
|
5
|
+
- **Breaking:** `audit`, `batchAudit` and individual exported checks require a valid AX Rush organization API key and an active paid plan. Set `AXRUSH_API_KEY` or pass `apiKey` to `audit`/`batchAudit`.
|
|
6
|
+
- Validate online before target traffic; missing/revoked keys, inactive plans and unavailable validation fail closed with `LicenseError`.
|
|
7
|
+
- Keep audits local and never send the target URL, page content or report to the validation service. No authorization cache persists between executions.
|
|
8
|
+
- Metadata, scoring utilities, report rendering, `--help` and `--version` remain available without a key. Check behavior and scoring are unchanged.
|
|
9
|
+
- Earlier releases and existing source license notices are unchanged. Local validation is not tamper-proof DRM.
|
|
10
|
+
|
|
11
|
+
|
|
3
12
|
All notable changes to ax-audit are documented here.
|
|
4
13
|
|
|
14
|
+
## [4.2.1] - 2026-09-05
|
|
15
|
+
|
|
16
|
+
**The tarball stops shipping retired checks.** `dist/` was never cleaned between builds, so the compiled remains of `agent-json`, `mcp` and `well-known-ai` — checks retired across 3.x and 4.0 — kept riding along in every publish, 4.2.0 included. They were inert (the orchestrator registers checks through the entry point alone), but they bloated the package and lied to anything that reads the shipped files as an inventory. `npm run build` now deletes `dist/` before compiling, so the tarball is the source, entirely and only.
|
|
17
|
+
|
|
5
18
|
## [4.2.0] - 2026-09-04
|
|
6
19
|
|
|
7
20
|
**Three checks stop grading the wrong thing.** Every change can raise scores; none can lower one, so baselines written by 4.1 gain no false regressions.
|
package/README.md
CHANGED
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
**Lighthouse for AI Agents.** Audit any website's AI Agent Experience (AX) readiness in seconds.
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
|
|
15
|
+
# Set AXRUSH_API_KEY using a paid account key from axrush.com/account/api
|
|
16
|
+
npx ax-audit@5 https://your-site.com
|
|
16
17
|
```
|
|
17
18
|
|
|
18
19
|
```
|
|
@@ -74,6 +75,31 @@ Protocol checks are **conditional**: a blog has no API to describe, so those rep
|
|
|
74
75
|
|
|
75
76
|
Every finding links to a step-by-step **[remediation guide](https://axrush.com/guides)**.
|
|
76
77
|
|
|
78
|
+
## AX Rush key required (v5)
|
|
79
|
+
|
|
80
|
+
Install the package normally with `npm install ax-audit`. To execute an audit,
|
|
81
|
+
you need an active paid AX Rush plan and an organization key created in
|
|
82
|
+
[Account → API keys](https://axrush.com/account/api). Set `AXRUSH_API_KEY` in
|
|
83
|
+
your local environment or your CI secret store. Do not commit it to source
|
|
84
|
+
control or put it in browser code.
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# AXRUSH_API_KEY is supplied securely by your environment or CI secrets
|
|
88
|
+
npx ax-audit@5 https://example.com
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The engine validates the key with AX Rush before each audit or batch, then runs
|
|
92
|
+
locally. Only the key is sent to AX Rush: target URLs, page content and reports
|
|
93
|
+
stay in your execution environment. Validation needs internet access and fails
|
|
94
|
+
closed if unavailable. Revocation or an inactive subscription blocks the next
|
|
95
|
+
execution; authorization is not cached between runs. Public check metadata,
|
|
96
|
+
scoring utilities and rendering existing reports need no key. Calling an
|
|
97
|
+
individual exported check requires `AXRUSH_API_KEY` too.
|
|
98
|
+
|
|
99
|
+
This is an execution requirement for the official v5 package, not tamper-proof
|
|
100
|
+
DRM. Earlier published releases remain usable, and local JavaScript can be
|
|
101
|
+
modified. The existing source license and notices are unchanged.
|
|
102
|
+
|
|
77
103
|
## Usage
|
|
78
104
|
|
|
79
105
|
```bash
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-rendering.d.ts","sourceRoot":"","sources":["../../src/checks/html-rendering.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"html-rendering.d.ts","sourceRoot":"","sources":["../../src/checks/html-rendering.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAUjF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,IAAI,EAAE,SAIlB,CAAC;AAOF,wBAA8B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA6L3E"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { guideUrl } from '../guide-urls.js';
|
|
2
|
-
import { countExecutableScripts, extractVisibleText, findOpeningTag, getMetaContent, structuralMarkupLength } from './html-utils.js';
|
|
2
|
+
import { countExecutableScripts, extractVisibleText, findOpeningTag, getMetaContent, structuralMarkupLength, } from './html-utils.js';
|
|
3
3
|
import { buildResult } from './utils.js';
|
|
4
4
|
/**
|
|
5
5
|
* "html-rendering" — does the HTML delivered to a non-JS agent actually contain content?
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-rendering.js","sourceRoot":"","sources":["../../src/checks/html-rendering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,
|
|
1
|
+
{"version":3,"file":"html-rendering.js","sourceRoot":"","sources":["../../src/checks/html-rendering.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { audit, batchAudit } from './orchestrator.js';
|
|
2
2
|
export { calculateOverallScore, categoryScore, getGrade } from './scorer.js';
|
|
3
|
-
export { checks } from './checks
|
|
3
|
+
export { checks } from './licensed-checks.js';
|
|
4
|
+
export { LicenseError } from './license.js';
|
|
5
|
+
export type { LicenseErrorCode } from './license.js';
|
|
4
6
|
export { saveBaseline, loadBaseline, diffBaseline, toBaselineData } from './baseline.js';
|
|
5
7
|
export { renderMarkdown, renderBatchMarkdown } from './reporter/markdown.js';
|
|
6
8
|
export { renderHtml, renderBatchHtml } from './reporter/html.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEjE;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,MAAM,GACP,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAElE,YAAY,EACV,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,aAAa,EACb,KAAK,EACL,YAAY,GACb,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { audit, batchAudit } from './orchestrator.js';
|
|
2
2
|
export { calculateOverallScore, categoryScore, getGrade } from './scorer.js';
|
|
3
|
-
export { checks } from './checks
|
|
3
|
+
export { checks } from './licensed-checks.js';
|
|
4
|
+
export { LicenseError } from './license.js';
|
|
4
5
|
export { saveBaseline, loadBaseline, diffBaseline, toBaselineData } from './baseline.js';
|
|
5
6
|
export { renderMarkdown, renderBatchMarkdown } from './reporter/markdown.js';
|
|
6
7
|
export { renderHtml, renderBatchHtml } from './reporter/html.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEjE;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,MAAM,GACP,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type LicenseErrorCode = 'MISSING_KEY' | 'INVALID_KEY' | 'PLAN_REQUIRED' | 'VALIDATION_UNAVAILABLE';
|
|
2
|
+
export declare class LicenseError extends Error {
|
|
3
|
+
readonly code: LicenseErrorCode;
|
|
4
|
+
constructor(code: LicenseErrorCode, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function requireLicense(apiKey?: string): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,GAAG,eAAe,GAAG,wBAAwB,CAAC;AAE1G,qBAAa,YAAa,SAAQ,KAAK;aAEnB,IAAI,EAAE,gBAAgB;gBAAtB,IAAI,EAAE,gBAAgB,EACtC,OAAO,EAAE,MAAM;CAKlB;AAiDD,wBAAsB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBnE"}
|
package/dist/license.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** License checks carry only the account key, never the target URL or report. */
|
|
2
|
+
const ENDPOINT = 'https://axrush.com/api/v1/engine/license';
|
|
3
|
+
const ACCOUNT = 'https://axrush.com/account/api';
|
|
4
|
+
export class LicenseError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(code, message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = 'LicenseError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
// Only simultaneous validations share a request. Successful responses are never
|
|
13
|
+
// cached, so a new audit observes a revoked key or an inactive subscription.
|
|
14
|
+
const pending = new Map();
|
|
15
|
+
async function validate(key) {
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
const timer = setTimeout(() => controller.abort(), 10_000);
|
|
18
|
+
try {
|
|
19
|
+
const response = await fetch(ENDPOINT, {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
headers: { authorization: `Bearer ${key}`, accept: 'application/json' },
|
|
22
|
+
redirect: 'error',
|
|
23
|
+
signal: controller.signal,
|
|
24
|
+
cache: 'no-store',
|
|
25
|
+
});
|
|
26
|
+
if (response.status === 401)
|
|
27
|
+
throw new LicenseError('INVALID_KEY', `Your AX Rush key is invalid or revoked. Create a key at ${ACCOUNT}.`);
|
|
28
|
+
if (response.status === 403)
|
|
29
|
+
throw new LicenseError('PLAN_REQUIRED', 'An active paid AX Rush plan is required. Manage your subscription at https://axrush.com/account/billing.');
|
|
30
|
+
if (!response.ok)
|
|
31
|
+
throw new Error('License service unavailable');
|
|
32
|
+
const result = await response.json();
|
|
33
|
+
if (!result ||
|
|
34
|
+
typeof result !== 'object' ||
|
|
35
|
+
!('licensed' in result) ||
|
|
36
|
+
result.licensed !== true ||
|
|
37
|
+
!('product' in result) ||
|
|
38
|
+
result.product !== 'ax-audit') {
|
|
39
|
+
throw new Error('Invalid license response');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error instanceof LicenseError)
|
|
44
|
+
throw error;
|
|
45
|
+
// Network errors can include URLs or headers. Never copy them into an error
|
|
46
|
+
// printed by the CLI, and never fall through to an unlicensed audit.
|
|
47
|
+
throw new LicenseError('VALIDATION_UNAVAILABLE', 'AX Rush could not validate your key. Check your connection and try again; no audit was started.');
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export async function requireLicense(apiKey) {
|
|
54
|
+
const key = (apiKey ?? process.env.AXRUSH_API_KEY)?.trim();
|
|
55
|
+
if (!key)
|
|
56
|
+
throw new LicenseError('MISSING_KEY', `Set AXRUSH_API_KEY to a key generated at ${ACCOUNT}. ax-audit requires an active paid AX Rush plan.`);
|
|
57
|
+
if (!/^axr_[A-Za-z0-9_-]{43}$/.test(key))
|
|
58
|
+
throw new LicenseError('INVALID_KEY', `Invalid AX Rush key format. Create a key at ${ACCOUNT}.`);
|
|
59
|
+
const existing = pending.get(key);
|
|
60
|
+
if (existing)
|
|
61
|
+
return existing;
|
|
62
|
+
const validation = validate(key);
|
|
63
|
+
pending.set(key, validation);
|
|
64
|
+
try {
|
|
65
|
+
await validation;
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
pending.delete(key);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"licensed-checks.d.ts","sourceRoot":"","sources":["../src/licensed-checks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,oFAAoF;AACpF,eAAO,MAAM,MAAM,EAAE,WAAW,EAM7B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { checks as implementations } from './checks/index.js';
|
|
2
|
+
import { requireLicense } from './license.js';
|
|
3
|
+
/** Metadata remains usable without a key; executing a public check requires one. */
|
|
4
|
+
export const checks = implementations.map((check) => ({
|
|
5
|
+
meta: check.meta,
|
|
6
|
+
async run(context) {
|
|
7
|
+
await requireLicense();
|
|
8
|
+
return check.run(context);
|
|
9
|
+
},
|
|
10
|
+
}));
|
|
11
|
+
//# sourceMappingURL=licensed-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"licensed-checks.js","sourceRoot":"","sources":["../src/licensed-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,oFAAoF;AACpF,MAAM,CAAC,MAAM,MAAM,GAAkB,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,KAAK,CAAC,GAAG,CAAC,OAAO;QACf,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;CACF,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAA6B,MAAM,YAAY,CAAC;AAEvH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAGvE;AA2DD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+BtG"}
|
package/dist/orchestrator.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
import { requireLicense } from './license.js';
|
|
1
2
|
import { createFetcher } from './fetcher.js';
|
|
2
3
|
import { checks as allChecks } from './checks/index.js';
|
|
3
4
|
import { calculateOverallScore, getGrade } from './scorer.js';
|
|
4
5
|
import { isSelected } from './check-ids.js';
|
|
5
6
|
export async function audit(options) {
|
|
7
|
+
await requireLicense(options.apiKey);
|
|
8
|
+
return runAudit(options);
|
|
9
|
+
}
|
|
10
|
+
/** Only reachable after an audit or batch has validated its account key. */
|
|
11
|
+
async function runAudit(options) {
|
|
6
12
|
const startTime = performance.now();
|
|
7
13
|
const verbose = options.verbose ?? false;
|
|
8
14
|
const log = verbose ? (msg) => console.error(` [verbose] ${msg}`) : () => { };
|
|
@@ -47,6 +53,7 @@ export async function audit(options) {
|
|
|
47
53
|
};
|
|
48
54
|
}
|
|
49
55
|
export async function batchAudit(urls, options = {}) {
|
|
56
|
+
await requireLicense(options.apiKey);
|
|
50
57
|
const startTime = performance.now();
|
|
51
58
|
const concurrency = Math.max(1, options.concurrency ?? 1);
|
|
52
59
|
// Preserve input order in the output while running up to `concurrency` audits
|
|
@@ -56,7 +63,7 @@ export async function batchAudit(urls, options = {}) {
|
|
|
56
63
|
async function worker() {
|
|
57
64
|
while (next < urls.length) {
|
|
58
65
|
const i = next++;
|
|
59
|
-
reports[i] = await
|
|
66
|
+
reports[i] = await runAudit({ ...options, url: urls[i] });
|
|
60
67
|
}
|
|
61
68
|
}
|
|
62
69
|
await Promise.all(Array.from({ length: Math.min(concurrency, urls.length) }, worker));
|
package/dist/orchestrator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -120,6 +120,8 @@ export interface AuditReport {
|
|
|
120
120
|
}
|
|
121
121
|
export interface AuditOptions {
|
|
122
122
|
url: string;
|
|
123
|
+
/** AX Rush organization key. Defaults to AXRUSH_API_KEY. Requires an active paid plan. */
|
|
124
|
+
apiKey?: string;
|
|
123
125
|
checks?: string[];
|
|
124
126
|
/**
|
|
125
127
|
* Forces protocol checks applicable. By default a check for a surface the
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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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"}
|
package/docs/api.md
CHANGED
|
@@ -11,13 +11,14 @@ The package is ESM-only (`"type": "module"`), targets Node 18+ (built-in `fetch`
|
|
|
11
11
|
|
|
12
12
|
## `audit(options): Promise<AuditReport>`
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
Validates your organization key online, then runs all (or selected) checks locally against one URL. Create the key at https://axrush.com/account/api. Only the key is sent to AX Rush; the target URL and page content are not.
|
|
15
15
|
|
|
16
16
|
```typescript
|
|
17
17
|
function audit(options: AuditOptions): Promise<AuditReport>;
|
|
18
18
|
|
|
19
19
|
interface AuditOptions {
|
|
20
20
|
url: string; // required, fully qualified (scheme included)
|
|
21
|
+
apiKey?: string; // defaults to AXRUSH_API_KEY; active paid AX Rush plan required
|
|
21
22
|
checks?: string[]; // default: all. Unknown IDs are silently ignored here
|
|
22
23
|
// (the CLI validates them; the API does not)
|
|
23
24
|
timeout?: number; // ms per request, default 10000
|
|
@@ -40,7 +41,7 @@ report.results; // CheckResult[]
|
|
|
40
41
|
report.duration; // ms
|
|
41
42
|
```
|
|
42
43
|
|
|
43
|
-
`audit` **rejects**
|
|
44
|
+
`audit` **rejects** with `LicenseError` before any target request when a key is missing, invalid/revoked, its plan is inactive, or online validation is unavailable. The error codes are `MISSING_KEY`, `INVALID_KEY`, `PLAN_REQUIRED` and `VALIDATION_UNAVAILABLE`. It can also reject for an unrecoverable setup error (e.g. an invalid `url` that can't be parsed). Network failure on the homepage fetch does not reject — it surfaces as failing checks.
|
|
44
45
|
|
|
45
46
|
## `batchAudit(urls, options?): Promise<BatchAuditReport>`
|
|
46
47
|
|
|
@@ -52,7 +53,7 @@ interface BatchOptions extends Omit<AuditOptions, 'url'> {
|
|
|
52
53
|
}
|
|
53
54
|
```
|
|
54
55
|
|
|
55
|
-
Report order always matches input order, regardless of `concurrency`. `concurrency < 1` is treated as 1.
|
|
56
|
+
A batch validates once before any target requests and shares that authorization only within the running batch. Report order always matches input order, regardless of `concurrency`. `concurrency < 1` is treated as 1.
|
|
56
57
|
|
|
57
58
|
```typescript
|
|
58
59
|
const batch = await batchAudit(urls, { concurrency: 4, retries: 2 });
|
|
@@ -254,3 +255,5 @@ Within a major version, the exported function signatures and the `AuditReport` J
|
|
|
254
255
|
## Exported types
|
|
255
256
|
|
|
256
257
|
`AuditOptions`, `BatchOptions`, `AuditReport`, `BatchAuditReport`, `CheckResult`, `CheckMeta`, `CheckContext`, `CheckModule`, `Finding`, `FindingStatus`, `FetchOptions`, `FetchResponse`, `Grade`, `OutputFormat`, `BaselineData`, `BaselineDiff`, `CheckDiff`.
|
|
258
|
+
|
|
259
|
+
`checks` exposes metadata without authorization. Calling `checks[i].run(context)` requires `AXRUSH_API_KEY`; use `audit({ apiKey, ... })` to supply a key programmatically. Keys must only be used server-side.
|
package/docs/ci.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# CI Integration
|
|
2
2
|
|
|
3
|
+
For ax-audit 5, create a paid organization API key at
|
|
4
|
+
https://axrush.com/account/api, save it as the `AXRUSH_API_KEY` repository secret,
|
|
5
|
+
and expose it only to trusted audit jobs:
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
env:
|
|
9
|
+
AXRUSH_API_KEY: ${{ secrets.AXRUSH_API_KEY }}
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Fork pull requests do not receive secrets. Skip licensed audits for those runs;
|
|
13
|
+
never use `pull_request_target` to execute untrusted checkout code with this key.
|
|
14
|
+
The job needs outbound HTTPS to axrush.com for license validation before the
|
|
15
|
+
local audit. License errors fail the command instead of publishing a score.
|
|
16
|
+
|
|
17
|
+
|
|
3
18
|
ax-audit's exit codes (see [cli.md](./cli.md)) make it a drop-in quality gate: `0` for Good/Excellent, `1` for Fair/Poor or regressions.
|
|
4
19
|
|
|
5
20
|
## GitHub Actions
|
package/docs/cli.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# CLI Reference
|
|
2
2
|
|
|
3
|
+
Version 5 requires `AXRUSH_API_KEY`, generated at https://axrush.com/account/api
|
|
4
|
+
by an owner/admin of an active paid organization. Set it through your environment
|
|
5
|
+
or CI secret store. It is never a command-line flag, target header or report field.
|
|
6
|
+
Missing, revoked or inactive keys, and unavailable validation, stop execution
|
|
7
|
+
before target requests. `--help` and `--version` work without a key.
|
|
8
|
+
|
|
9
|
+
|
|
3
10
|
```bash
|
|
4
11
|
ax-audit <urls...> [options]
|
|
5
12
|
```
|
package/docs/getting-started.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Getting Started
|
|
2
2
|
|
|
3
|
+
## AX Rush key required (v5)
|
|
4
|
+
|
|
5
|
+
Install the package normally with `npm install ax-audit`. To execute an audit,
|
|
6
|
+
you need an active paid AX Rush plan and an organization key created in
|
|
7
|
+
[Account → API keys](https://axrush.com/account/api). Set `AXRUSH_API_KEY` in
|
|
8
|
+
your local environment or your CI secret store. Do not commit it to source
|
|
9
|
+
control or put it in browser code.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# AXRUSH_API_KEY is supplied securely by your environment or CI secrets
|
|
13
|
+
npx ax-audit@5 https://example.com
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The engine validates the key with AX Rush before each audit or batch, then runs
|
|
17
|
+
locally. Only the key is sent to AX Rush: target URLs, page content and reports
|
|
18
|
+
stay in your execution environment. Validation needs internet access and fails
|
|
19
|
+
closed if unavailable. Revocation or an inactive subscription blocks the next
|
|
20
|
+
execution; authorization is not cached between runs. Public check metadata,
|
|
21
|
+
scoring utilities and rendering existing reports need no key. Calling an
|
|
22
|
+
individual exported check requires `AXRUSH_API_KEY` too.
|
|
23
|
+
|
|
24
|
+
This is an execution requirement for the official v5 package, not tamper-proof
|
|
25
|
+
DRM. Earlier published releases remain usable, and local JavaScript can be
|
|
26
|
+
modified. The existing source license and notices are unchanged.
|
|
27
|
+
|
|
28
|
+
|
|
3
29
|
This walkthrough takes you from zero to a passing AX score: run your first audit, learn to read the report, and fix findings in the order that moves your score most.
|
|
4
30
|
|
|
5
31
|
## 1. Run your first audit
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ax-audit",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Audit websites for AI Agent Experience
|
|
3
|
+
"version": "5.0.0",
|
|
4
|
+
"description": "Audit websites for AI Agent Experience readiness. Requires an active AX Rush plan and API key.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"author": "Durani Technologies (https://axrush.com)",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"node": ">=18.0.0"
|
|
58
58
|
},
|
|
59
59
|
"scripts": {
|
|
60
|
-
"build": "tsc",
|
|
60
|
+
"build": "node -e \"fs.rmSync('dist',{recursive:true,force:true})\" && tsc",
|
|
61
61
|
"start": "node bin/ax-audit.js",
|
|
62
62
|
"pretest": "npm run build",
|
|
63
63
|
"test": "node --test test/*.test.js test/**/*.test.js",
|
|
@@ -65,8 +65,15 @@
|
|
|
65
65
|
"lint:fix": "eslint src/ --fix",
|
|
66
66
|
"format": "prettier --write \"src/**/*.ts\"",
|
|
67
67
|
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
68
|
+
"prepare": "husky",
|
|
68
69
|
"prepublishOnly": "npm run build"
|
|
69
70
|
},
|
|
71
|
+
"lint-staged": {
|
|
72
|
+
"src/**/*.ts": [
|
|
73
|
+
"eslint --fix",
|
|
74
|
+
"prettier --write"
|
|
75
|
+
]
|
|
76
|
+
},
|
|
70
77
|
"dependencies": {
|
|
71
78
|
"chalk": "^5.4.1",
|
|
72
79
|
"commander": "^13.1.0"
|
|
@@ -76,6 +83,8 @@
|
|
|
76
83
|
"@types/node": "^25.3.2",
|
|
77
84
|
"eslint": "^10.0.2",
|
|
78
85
|
"eslint-config-prettier": "^10.1.8",
|
|
86
|
+
"husky": "^9.1.7",
|
|
87
|
+
"lint-staged": "^17.5.0",
|
|
79
88
|
"prettier": "^3.8.1",
|
|
80
89
|
"typescript": "^5.9.3",
|
|
81
90
|
"typescript-eslint": "^8.56.1"
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { CheckContext, CheckResult, CheckMeta } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* "agent-json" — `/.well-known/agent.json` per the A2A (Agent-to-Agent) protocol.
|
|
4
|
-
*
|
|
5
|
-
* Validates the document on three axes:
|
|
6
|
-
* 1. JSON well-formedness
|
|
7
|
-
* 2. Required fields per the A2A spec (`name`, `description`, `url`, `skills`)
|
|
8
|
-
* 3. Field semantics: `url` should resolve to the same origin as the audited site,
|
|
9
|
-
* `skills[]` should each declare an `id` and `description`, and protocol/optional
|
|
10
|
-
* fields are present where expected.
|
|
11
|
-
*/
|
|
12
|
-
export declare const meta: CheckMeta;
|
|
13
|
-
export default function check(ctx: CheckContext): Promise<CheckResult>;
|
|
14
|
-
//# sourceMappingURL=agent-json.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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;;;;;;;;;GASG;AACH,eAAO,MAAM,IAAI,EAAE,SAKlB,CAAC;AAEF,wBAA8B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA0I3E"}
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { AGENT_JSON_REQUIRED_FIELDS } from '../constants.js';
|
|
2
|
-
import { guideUrl } from '../guide-urls.js';
|
|
3
|
-
import { buildResult, checkContentType } from './utils.js';
|
|
4
|
-
/**
|
|
5
|
-
* "agent-json" — `/.well-known/agent.json` per the A2A (Agent-to-Agent) protocol.
|
|
6
|
-
*
|
|
7
|
-
* Validates the document on three axes:
|
|
8
|
-
* 1. JSON well-formedness
|
|
9
|
-
* 2. Required fields per the A2A spec (`name`, `description`, `url`, `skills`)
|
|
10
|
-
* 3. Field semantics: `url` should resolve to the same origin as the audited site,
|
|
11
|
-
* `skills[]` should each declare an `id` and `description`, and protocol/optional
|
|
12
|
-
* fields are present where expected.
|
|
13
|
-
*/
|
|
14
|
-
export const meta = {
|
|
15
|
-
id: 'agent-json',
|
|
16
|
-
name: 'Agent Card (A2A)',
|
|
17
|
-
description: 'Checks /.well-known/agent.json A2A protocol compliance',
|
|
18
|
-
weight: 7,
|
|
19
|
-
};
|
|
20
|
-
export default async function check(ctx) {
|
|
21
|
-
const start = performance.now();
|
|
22
|
-
const findings = [];
|
|
23
|
-
let score = 100;
|
|
24
|
-
const res = await ctx.fetch(`${ctx.url}/.well-known/agent.json`);
|
|
25
|
-
if (!res.ok) {
|
|
26
|
-
findings.push({
|
|
27
|
-
status: 'fail',
|
|
28
|
-
message: '/.well-known/agent.json not found',
|
|
29
|
-
detail: `HTTP ${res.status || 'network error'}`,
|
|
30
|
-
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.",
|
|
31
|
-
learnMoreUrl: guideUrl(meta.id, 'not-found'),
|
|
32
|
-
});
|
|
33
|
-
return buildResult(meta, 0, findings, start);
|
|
34
|
-
}
|
|
35
|
-
findings.push({ status: 'pass', message: '/.well-known/agent.json exists' });
|
|
36
|
-
const ctFinding = checkContentType(res, ['application/json'], {
|
|
37
|
-
checkId: meta.id,
|
|
38
|
-
resourceLabel: '/.well-known/agent.json',
|
|
39
|
-
anchor: 'wrong-content-type',
|
|
40
|
-
});
|
|
41
|
-
if (ctFinding) {
|
|
42
|
-
findings.push(ctFinding);
|
|
43
|
-
score -= 5;
|
|
44
|
-
}
|
|
45
|
-
let data;
|
|
46
|
-
try {
|
|
47
|
-
data = JSON.parse(res.body);
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
findings.push({
|
|
51
|
-
status: 'fail',
|
|
52
|
-
message: 'Invalid JSON',
|
|
53
|
-
hint: 'Fix the JSON syntax in your agent.json file. Validate it with a JSON linter.',
|
|
54
|
-
learnMoreUrl: guideUrl(meta.id, 'invalid-json'),
|
|
55
|
-
});
|
|
56
|
-
return buildResult(meta, 10, findings, start);
|
|
57
|
-
}
|
|
58
|
-
findings.push({ status: 'pass', message: 'Valid JSON' });
|
|
59
|
-
for (const field of AGENT_JSON_REQUIRED_FIELDS) {
|
|
60
|
-
if (data[field] !== undefined && data[field] !== null) {
|
|
61
|
-
findings.push({ status: 'pass', message: `Required field "${field}" present` });
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
findings.push({
|
|
65
|
-
status: 'fail',
|
|
66
|
-
message: `Required field "${field}" missing`,
|
|
67
|
-
hint: `Add the "${field}" field to your agent.json. This is required by the A2A protocol specification.`,
|
|
68
|
-
learnMoreUrl: guideUrl(meta.id, 'missing-field'),
|
|
69
|
-
});
|
|
70
|
-
score -= 15;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
if (typeof data.url === 'string' && data.url.length > 0) {
|
|
74
|
-
const sameOrigin = sameHost(data.url, ctx.url);
|
|
75
|
-
if (sameOrigin === false) {
|
|
76
|
-
findings.push({
|
|
77
|
-
status: 'warn',
|
|
78
|
-
message: `agent.json "url" points to a different origin: ${data.url}`,
|
|
79
|
-
hint: 'The url field should match the audited site origin. Pointing it elsewhere can confuse agents about the canonical agent endpoint.',
|
|
80
|
-
learnMoreUrl: guideUrl(meta.id, 'url-mismatch'),
|
|
81
|
-
});
|
|
82
|
-
score -= 5;
|
|
83
|
-
}
|
|
84
|
-
else if (sameOrigin === null) {
|
|
85
|
-
findings.push({
|
|
86
|
-
status: 'warn',
|
|
87
|
-
message: `agent.json "url" is not a valid absolute URL: ${data.url}`,
|
|
88
|
-
hint: 'Provide an absolute https:// URL for the url field.',
|
|
89
|
-
learnMoreUrl: guideUrl(meta.id, 'url-invalid'),
|
|
90
|
-
});
|
|
91
|
-
score -= 5;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
if (Array.isArray(data.skills) && data.skills.length > 0) {
|
|
95
|
-
findings.push({ status: 'pass', message: `${data.skills.length} skill(s) defined` });
|
|
96
|
-
const incomplete = data.skills.filter((s) => !s.id || !s.description);
|
|
97
|
-
if (incomplete.length === 0) {
|
|
98
|
-
findings.push({ status: 'pass', message: 'All skills have id + description' });
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
findings.push({
|
|
102
|
-
status: 'warn',
|
|
103
|
-
message: `${incomplete.length}/${data.skills.length} skill(s) missing id or description`,
|
|
104
|
-
hint: 'Each entry in skills[] should include both an id and a description so agents can address it and reason about its purpose.',
|
|
105
|
-
learnMoreUrl: guideUrl(meta.id, 'incomplete-skills'),
|
|
106
|
-
});
|
|
107
|
-
score -= 5;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
else if (Array.isArray(data.skills)) {
|
|
111
|
-
findings.push({
|
|
112
|
-
status: 'warn',
|
|
113
|
-
message: 'Skills array is empty',
|
|
114
|
-
hint: 'Add at least one skill to the skills array describing what your agent/site can do.',
|
|
115
|
-
learnMoreUrl: guideUrl(meta.id, 'empty-skills'),
|
|
116
|
-
});
|
|
117
|
-
score -= 10;
|
|
118
|
-
}
|
|
119
|
-
if (data.protocolVersion) {
|
|
120
|
-
findings.push({ status: 'pass', message: `Protocol version: ${data.protocolVersion}` });
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
findings.push({
|
|
124
|
-
status: 'warn',
|
|
125
|
-
message: 'No protocolVersion field',
|
|
126
|
-
hint: 'Add "protocolVersion": "0.2.0" to your agent.json to declare A2A protocol compatibility.',
|
|
127
|
-
learnMoreUrl: guideUrl(meta.id, 'no-protocol-version'),
|
|
128
|
-
});
|
|
129
|
-
score -= 5;
|
|
130
|
-
}
|
|
131
|
-
const optionalFields = ['capabilities', 'authentication', 'documentationUrl'];
|
|
132
|
-
const presentOptional = optionalFields.filter((f) => data[f] !== undefined);
|
|
133
|
-
if (presentOptional.length === optionalFields.length) {
|
|
134
|
-
findings.push({
|
|
135
|
-
status: 'pass',
|
|
136
|
-
message: 'All optional fields present (capabilities, authentication, documentationUrl)',
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
else if (presentOptional.length > 0) {
|
|
140
|
-
findings.push({
|
|
141
|
-
status: 'pass',
|
|
142
|
-
message: `${presentOptional.length}/${optionalFields.length} optional fields present`,
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
findings.push({
|
|
147
|
-
status: 'warn',
|
|
148
|
-
message: 'No optional fields (capabilities, authentication, documentationUrl)',
|
|
149
|
-
hint: 'Consider adding capabilities (what protocols you support), authentication (auth requirements), and documentationUrl (link to API docs).',
|
|
150
|
-
learnMoreUrl: guideUrl(meta.id, 'missing-optional'),
|
|
151
|
-
});
|
|
152
|
-
score -= 5;
|
|
153
|
-
}
|
|
154
|
-
return buildResult(meta, score, findings, start);
|
|
155
|
-
}
|
|
156
|
-
/** Returns `true` when the two URLs share host (case-insensitive), `false` if hosts differ, `null` on parse error. */
|
|
157
|
-
function sameHost(a, b) {
|
|
158
|
-
try {
|
|
159
|
-
const ua = new URL(a);
|
|
160
|
-
const ub = new URL(b);
|
|
161
|
-
return ua.host.toLowerCase() === ub.host.toLowerCase();
|
|
162
|
-
}
|
|
163
|
-
catch {
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=agent-json.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-json.js","sourceRoot":"","sources":["../../src/checks/agent-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,IAAI,GAAc;IAC7B,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,wDAAwD;IACrE,MAAM,EAAE,CAAC;CACV,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,yBAAyB,CAAC,CAAC;IAEjE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,mCAAmC;YAC5C,MAAM,EAAE,QAAQ,GAAG,CAAC,MAAM,IAAI,eAAe,EAAE;YAC/C,IAAI,EAAE,qLAAqL;YAC3L,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,gCAAgC,EAAE,CAAC,CAAC;IAE7E,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE;QAC5D,OAAO,EAAE,IAAI,CAAC,EAAE;QAChB,aAAa,EAAE,yBAAyB;QACxC,MAAM,EAAE,oBAAoB;KAC7B,CAAC,CAAC;IACH,IAAI,SAAS,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,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,8EAA8E;YACpF,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,KAAK,MAAM,KAAK,IAAI,0BAA0B,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YACtD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,KAAK,WAAW,EAAE,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,mBAAmB,KAAK,WAAW;gBAC5C,IAAI,EAAE,YAAY,KAAK,iFAAiF;gBACxG,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC;aACjD,CAAC,CAAC;YACH,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,kDAAkD,IAAI,CAAC,GAAG,EAAE;gBACrE,IAAI,EAAE,kIAAkI;gBACxI,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC;aAChD,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,iDAAiD,IAAI,CAAC,GAAG,EAAE;gBACpE,IAAI,EAAE,qDAAqD;gBAC3D,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC;aAC/C,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;QACrF,MAAM,UAAU,GAAI,IAAI,CAAC,MAAoC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACrG,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,qCAAqC;gBACxF,IAAI,EAAE,2HAA2H;gBACjI,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC;aACrD,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uBAAuB;YAChC,IAAI,EAAE,oFAAoF;YAC1F,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC;SAChD,CAAC,CAAC;QACH,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,0BAA0B;YACnC,IAAI,EAAE,0FAA0F;YAChG,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,qBAAqB,CAAC;SACvD,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAC9E,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAC5E,IAAI,eAAe,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,8EAA8E;SACxF,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,eAAe,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,0BAA0B;SACtF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,qEAAqE;YAC9E,IAAI,EAAE,yIAAyI;YAC/I,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,CAAC;SACpD,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,sHAAsH;AACtH,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/checks/mcp.d.ts
DELETED
package/dist/checks/mcp.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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,CA6J3E"}
|
package/dist/checks/mcp.js
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { guideUrl } from '../guide-urls.js';
|
|
2
|
-
import { buildResult, checkContentType } from './utils.js';
|
|
3
|
-
export const meta = {
|
|
4
|
-
id: 'mcp',
|
|
5
|
-
name: 'MCP (Model Context Protocol)',
|
|
6
|
-
description: 'Checks /.well-known/mcp.json presence and configuration',
|
|
7
|
-
weight: 7,
|
|
8
|
-
};
|
|
9
|
-
export default async function check(ctx) {
|
|
10
|
-
const start = performance.now();
|
|
11
|
-
const findings = [];
|
|
12
|
-
let score = 100;
|
|
13
|
-
const res = await ctx.fetch(`${ctx.url}/.well-known/mcp.json`);
|
|
14
|
-
if (!res.ok) {
|
|
15
|
-
findings.push({
|
|
16
|
-
status: 'fail',
|
|
17
|
-
message: '/.well-known/mcp.json not found',
|
|
18
|
-
detail: `HTTP ${res.status || 'network error'}`,
|
|
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'),
|
|
21
|
-
});
|
|
22
|
-
return buildResult(meta, 0, findings, start);
|
|
23
|
-
}
|
|
24
|
-
findings.push({ status: 'pass', message: '/.well-known/mcp.json exists' });
|
|
25
|
-
const ctFinding = checkContentType(res, ['application/json'], {
|
|
26
|
-
checkId: meta.id,
|
|
27
|
-
resourceLabel: '/.well-known/mcp.json',
|
|
28
|
-
anchor: 'wrong-content-type',
|
|
29
|
-
});
|
|
30
|
-
if (ctFinding) {
|
|
31
|
-
findings.push(ctFinding);
|
|
32
|
-
score -= 5;
|
|
33
|
-
}
|
|
34
|
-
let data;
|
|
35
|
-
try {
|
|
36
|
-
data = JSON.parse(res.body);
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
findings.push({
|
|
40
|
-
status: 'fail',
|
|
41
|
-
message: 'Invalid JSON',
|
|
42
|
-
hint: 'Fix the JSON syntax in your mcp.json file. Validate with a JSON linter.',
|
|
43
|
-
learnMoreUrl: guideUrl(meta.id, 'invalid-json'),
|
|
44
|
-
});
|
|
45
|
-
return buildResult(meta, 10, findings, start);
|
|
46
|
-
}
|
|
47
|
-
findings.push({ status: 'pass', message: 'Valid JSON' });
|
|
48
|
-
if (data.name) {
|
|
49
|
-
findings.push({ status: 'pass', message: `Server name: "${data.name}"` });
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
findings.push({
|
|
53
|
-
status: 'warn',
|
|
54
|
-
message: 'Missing server name',
|
|
55
|
-
hint: 'Add a "name" field to your mcp.json identifying your MCP server.',
|
|
56
|
-
learnMoreUrl: guideUrl(meta.id, 'missing-name'),
|
|
57
|
-
});
|
|
58
|
-
score -= 10;
|
|
59
|
-
}
|
|
60
|
-
if (data.description) {
|
|
61
|
-
findings.push({ status: 'pass', message: 'Server description present' });
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
findings.push({
|
|
65
|
-
status: 'warn',
|
|
66
|
-
message: 'Missing server description',
|
|
67
|
-
hint: 'Add a "description" field explaining what your MCP server does and what tools it provides.',
|
|
68
|
-
learnMoreUrl: guideUrl(meta.id, 'missing-description'),
|
|
69
|
-
});
|
|
70
|
-
score -= 5;
|
|
71
|
-
}
|
|
72
|
-
if (Array.isArray(data.tools) && data.tools.length > 0) {
|
|
73
|
-
findings.push({ status: 'pass', message: `${data.tools.length} tool(s) defined` });
|
|
74
|
-
const toolsWithDescriptions = data.tools.filter((t) => t.description);
|
|
75
|
-
if (toolsWithDescriptions.length === data.tools.length) {
|
|
76
|
-
findings.push({ status: 'pass', message: 'All tools have descriptions' });
|
|
77
|
-
}
|
|
78
|
-
else if (toolsWithDescriptions.length > 0) {
|
|
79
|
-
findings.push({
|
|
80
|
-
status: 'warn',
|
|
81
|
-
message: `${toolsWithDescriptions.length}/${data.tools.length} tools have descriptions`,
|
|
82
|
-
hint: 'Add a "description" field to each tool so AI agents understand what each tool does.',
|
|
83
|
-
learnMoreUrl: guideUrl(meta.id, 'missing-tool-descriptions'),
|
|
84
|
-
});
|
|
85
|
-
score -= 5;
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
findings.push({
|
|
89
|
-
status: 'warn',
|
|
90
|
-
message: 'No tools have descriptions',
|
|
91
|
-
hint: 'Add a "description" field to each tool in the tools array. Descriptions help AI agents decide which tool to use.',
|
|
92
|
-
learnMoreUrl: guideUrl(meta.id, 'no-tool-descriptions'),
|
|
93
|
-
});
|
|
94
|
-
score -= 10;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
else if (Array.isArray(data.tools)) {
|
|
98
|
-
findings.push({
|
|
99
|
-
status: 'warn',
|
|
100
|
-
message: 'Tools array is empty',
|
|
101
|
-
hint: 'Add at least one tool to the tools array with name, description, and inputSchema fields.',
|
|
102
|
-
learnMoreUrl: guideUrl(meta.id, 'empty-tools'),
|
|
103
|
-
});
|
|
104
|
-
score -= 15;
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
findings.push({
|
|
108
|
-
status: 'warn',
|
|
109
|
-
message: 'No tools array defined',
|
|
110
|
-
hint: 'Add a "tools" array to your mcp.json. Each tool should have name, description, and inputSchema.',
|
|
111
|
-
learnMoreUrl: guideUrl(meta.id, 'no-tools'),
|
|
112
|
-
});
|
|
113
|
-
score -= 15;
|
|
114
|
-
}
|
|
115
|
-
if (Array.isArray(data.resources) && data.resources.length > 0) {
|
|
116
|
-
findings.push({ status: 'pass', message: `${data.resources.length} resource(s) defined` });
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
findings.push({
|
|
120
|
-
status: 'warn',
|
|
121
|
-
message: 'No resources defined',
|
|
122
|
-
hint: 'Add a "resources" array listing the data resources your MCP server exposes to AI agents.',
|
|
123
|
-
learnMoreUrl: guideUrl(meta.id, 'no-resources'),
|
|
124
|
-
});
|
|
125
|
-
score -= 5;
|
|
126
|
-
}
|
|
127
|
-
if (Array.isArray(data.prompts) && data.prompts.length > 0) {
|
|
128
|
-
findings.push({ status: 'pass', message: `${data.prompts.length} prompt(s) defined` });
|
|
129
|
-
}
|
|
130
|
-
if (data.version || data.protocolVersion) {
|
|
131
|
-
findings.push({
|
|
132
|
-
status: 'pass',
|
|
133
|
-
message: `Protocol version: ${data.protocolVersion || data.version}`,
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
findings.push({
|
|
138
|
-
status: 'warn',
|
|
139
|
-
message: 'No protocol version specified',
|
|
140
|
-
hint: 'Add a "protocolVersion" field (e.g., "2024-11-05") to declare MCP spec compatibility.',
|
|
141
|
-
learnMoreUrl: guideUrl(meta.id, 'no-version'),
|
|
142
|
-
});
|
|
143
|
-
score -= 5;
|
|
144
|
-
}
|
|
145
|
-
if (data.authentication) {
|
|
146
|
-
findings.push({ status: 'pass', message: 'Authentication configuration present' });
|
|
147
|
-
}
|
|
148
|
-
if (res.headers['access-control-allow-origin']) {
|
|
149
|
-
findings.push({ status: 'pass', message: 'CORS enabled on MCP endpoint' });
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
findings.push({
|
|
153
|
-
status: 'warn',
|
|
154
|
-
message: 'No CORS headers on MCP endpoint',
|
|
155
|
-
hint: 'Add Access-Control-Allow-Origin: * to the /.well-known/mcp.json response so browser-based AI agents can fetch it.',
|
|
156
|
-
learnMoreUrl: guideUrl(meta.id, 'no-cors'),
|
|
157
|
-
});
|
|
158
|
-
score -= 10;
|
|
159
|
-
}
|
|
160
|
-
return buildResult(meta, score, findings, start);
|
|
161
|
-
}
|
|
162
|
-
//# sourceMappingURL=mcp.js.map
|
package/dist/checks/mcp.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/checks/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/checks/openapi.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/checks/openapi.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,CAmH3E"}
|
package/dist/checks/openapi.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { guideUrl } from '../guide-urls.js';
|
|
2
|
-
import { buildResult, checkContentType } from './utils.js';
|
|
3
|
-
export const meta = {
|
|
4
|
-
id: 'openapi',
|
|
5
|
-
name: 'OpenAPI Spec',
|
|
6
|
-
description: 'Checks /.well-known/openapi.json presence and validity',
|
|
7
|
-
weight: 6,
|
|
8
|
-
};
|
|
9
|
-
export default async function check(ctx) {
|
|
10
|
-
const start = performance.now();
|
|
11
|
-
const findings = [];
|
|
12
|
-
let score = 100;
|
|
13
|
-
const res = await ctx.fetch(`${ctx.url}/.well-known/openapi.json`);
|
|
14
|
-
if (!res.ok) {
|
|
15
|
-
findings.push({
|
|
16
|
-
status: 'fail',
|
|
17
|
-
message: '/.well-known/openapi.json not found',
|
|
18
|
-
detail: `HTTP ${res.status || 'network error'}`,
|
|
19
|
-
hint: 'Create a /.well-known/openapi.json file with your API specification following the OpenAPI 3.x standard. See https://swagger.io/specification/ for the spec.',
|
|
20
|
-
learnMoreUrl: guideUrl(meta.id, 'not-found'),
|
|
21
|
-
});
|
|
22
|
-
return buildResult(meta, 0, findings, start);
|
|
23
|
-
}
|
|
24
|
-
findings.push({ status: 'pass', message: '/.well-known/openapi.json exists' });
|
|
25
|
-
const ctFinding = checkContentType(res, ['application/json'], {
|
|
26
|
-
checkId: meta.id,
|
|
27
|
-
resourceLabel: '/.well-known/openapi.json',
|
|
28
|
-
anchor: 'wrong-content-type',
|
|
29
|
-
});
|
|
30
|
-
if (ctFinding) {
|
|
31
|
-
findings.push(ctFinding);
|
|
32
|
-
score -= 5;
|
|
33
|
-
}
|
|
34
|
-
let data;
|
|
35
|
-
try {
|
|
36
|
-
data = JSON.parse(res.body);
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
findings.push({
|
|
40
|
-
status: 'fail',
|
|
41
|
-
message: 'Invalid JSON',
|
|
42
|
-
hint: 'Fix the JSON syntax in your openapi.json file. Validate with a JSON linter.',
|
|
43
|
-
learnMoreUrl: guideUrl(meta.id, 'invalid-json'),
|
|
44
|
-
});
|
|
45
|
-
return buildResult(meta, 10, findings, start);
|
|
46
|
-
}
|
|
47
|
-
findings.push({ status: 'pass', message: 'Valid JSON' });
|
|
48
|
-
if (data.openapi) {
|
|
49
|
-
findings.push({ status: 'pass', message: `OpenAPI version: ${data.openapi}` });
|
|
50
|
-
}
|
|
51
|
-
else if (data.swagger) {
|
|
52
|
-
findings.push({
|
|
53
|
-
status: 'warn',
|
|
54
|
-
message: `Swagger version: ${data.swagger} (consider upgrading to OpenAPI 3.x)`,
|
|
55
|
-
hint: 'Upgrade from Swagger 2.x to OpenAPI 3.x for better AI agent compatibility. Use https://editor.swagger.io/ to convert.',
|
|
56
|
-
learnMoreUrl: guideUrl(meta.id, 'upgrade-swagger'),
|
|
57
|
-
});
|
|
58
|
-
score -= 10;
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
findings.push({
|
|
62
|
-
status: 'fail',
|
|
63
|
-
message: 'No openapi or swagger version field',
|
|
64
|
-
hint: 'Add "openapi": "3.1.0" to the root of your OpenAPI spec to declare the specification version.',
|
|
65
|
-
learnMoreUrl: guideUrl(meta.id, 'no-version'),
|
|
66
|
-
});
|
|
67
|
-
score -= 20;
|
|
68
|
-
}
|
|
69
|
-
const info = data.info;
|
|
70
|
-
if (info?.title) {
|
|
71
|
-
findings.push({ status: 'pass', message: `API title: "${info.title}"` });
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
findings.push({
|
|
75
|
-
status: 'warn',
|
|
76
|
-
message: 'Missing info.title',
|
|
77
|
-
hint: 'Add an "info" object with a "title" field: "info": { "title": "Your API Name", "version": "1.0.0" }',
|
|
78
|
-
learnMoreUrl: guideUrl(meta.id, 'missing-title'),
|
|
79
|
-
});
|
|
80
|
-
score -= 10;
|
|
81
|
-
}
|
|
82
|
-
if (info?.description) {
|
|
83
|
-
findings.push({ status: 'pass', message: 'API description present' });
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
findings.push({
|
|
87
|
-
status: 'warn',
|
|
88
|
-
message: 'Missing info.description',
|
|
89
|
-
hint: 'Add a "description" field inside "info" explaining what your API does and how AI agents can use it.',
|
|
90
|
-
learnMoreUrl: guideUrl(meta.id, 'missing-description'),
|
|
91
|
-
});
|
|
92
|
-
score -= 5;
|
|
93
|
-
}
|
|
94
|
-
const paths = data.paths;
|
|
95
|
-
if (paths && Object.keys(paths).length > 0) {
|
|
96
|
-
findings.push({ status: 'pass', message: `${Object.keys(paths).length} path(s) documented` });
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
findings.push({
|
|
100
|
-
status: 'warn',
|
|
101
|
-
message: 'No paths documented',
|
|
102
|
-
hint: 'Add a "paths" object documenting your API endpoints with their methods, parameters, and responses.',
|
|
103
|
-
learnMoreUrl: guideUrl(meta.id, 'no-paths'),
|
|
104
|
-
});
|
|
105
|
-
score -= 15;
|
|
106
|
-
}
|
|
107
|
-
if (Array.isArray(data.servers) && data.servers.length > 0) {
|
|
108
|
-
findings.push({ status: 'pass', message: `${data.servers.length} server(s) defined` });
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
findings.push({
|
|
112
|
-
status: 'warn',
|
|
113
|
-
message: 'No servers defined',
|
|
114
|
-
hint: 'Add a "servers" array with your API base URL: "servers": [{ "url": "https://api.example.com" }]',
|
|
115
|
-
learnMoreUrl: guideUrl(meta.id, 'no-servers'),
|
|
116
|
-
});
|
|
117
|
-
score -= 5;
|
|
118
|
-
}
|
|
119
|
-
return buildResult(meta, score, findings, start);
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=openapi.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/checks/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { CheckContext, CheckResult, CheckMeta } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* "well-known-ai" — emerging AI-specific discovery files that don't have a settled spec yet
|
|
4
|
-
* but are already published by some sites and read by some agents. Each file present is a
|
|
5
|
-
* positive signal (bonus); none of them are individually required, so a site that publishes
|
|
6
|
-
* just one or two should not be punished. The score reflects coverage of this small bundle.
|
|
7
|
-
*
|
|
8
|
-
* Files probed:
|
|
9
|
-
* - `/.well-known/ai.txt` (Spawning AI — opt-in/opt-out for AI training)
|
|
10
|
-
* - `/.well-known/genai.txt` (proposed — generative AI policy)
|
|
11
|
-
* - `/ai-plugin.json` and `/.well-known/ai-plugin.json` (legacy ChatGPT plugin manifest)
|
|
12
|
-
* - `/agents.json` (Wildcard / OpenAgents — emerging agent capability manifest)
|
|
13
|
-
* - `/.well-known/nlweb.json` (Microsoft NLWeb — natural-language site interface)
|
|
14
|
-
*/
|
|
15
|
-
export declare const meta: CheckMeta;
|
|
16
|
-
export default function check(ctx: CheckContext): Promise<CheckResult>;
|
|
17
|
-
//# sourceMappingURL=well-known-ai.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"well-known-ai.d.ts","sourceRoot":"","sources":["../../src/checks/well-known-ai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAA0B,MAAM,aAAa,CAAC;AAGhG;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,IAAI,EAAE,SAKlB,CAAC;AAmEF,wBAA8B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA+C3E"}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { guideUrl } from '../guide-urls.js';
|
|
2
|
-
import { buildResult } from './utils.js';
|
|
3
|
-
/**
|
|
4
|
-
* "well-known-ai" — emerging AI-specific discovery files that don't have a settled spec yet
|
|
5
|
-
* but are already published by some sites and read by some agents. Each file present is a
|
|
6
|
-
* positive signal (bonus); none of them are individually required, so a site that publishes
|
|
7
|
-
* just one or two should not be punished. The score reflects coverage of this small bundle.
|
|
8
|
-
*
|
|
9
|
-
* Files probed:
|
|
10
|
-
* - `/.well-known/ai.txt` (Spawning AI — opt-in/opt-out for AI training)
|
|
11
|
-
* - `/.well-known/genai.txt` (proposed — generative AI policy)
|
|
12
|
-
* - `/ai-plugin.json` and `/.well-known/ai-plugin.json` (legacy ChatGPT plugin manifest)
|
|
13
|
-
* - `/agents.json` (Wildcard / OpenAgents — emerging agent capability manifest)
|
|
14
|
-
* - `/.well-known/nlweb.json` (Microsoft NLWeb — natural-language site interface)
|
|
15
|
-
*/
|
|
16
|
-
export const meta = {
|
|
17
|
-
id: 'well-known-ai',
|
|
18
|
-
name: 'AI Well-Known',
|
|
19
|
-
description: 'Checks emerging AI-specific discovery files (ai.txt, agents.json, ai-plugin.json, nlweb)',
|
|
20
|
-
weight: 3,
|
|
21
|
-
};
|
|
22
|
-
const PROBES = [
|
|
23
|
-
{
|
|
24
|
-
paths: ['/.well-known/ai.txt'],
|
|
25
|
-
label: 'ai.txt',
|
|
26
|
-
hint: 'Publish /.well-known/ai.txt declaring opt-in/opt-out signals for AI training. See https://site.spawning.ai/spawning-ai-txt for the format.',
|
|
27
|
-
guideAnchor: 'ai-txt',
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
paths: ['/.well-known/genai.txt'],
|
|
31
|
-
label: 'genai.txt',
|
|
32
|
-
hint: 'Publish /.well-known/genai.txt declaring your generative-AI usage policy.',
|
|
33
|
-
guideAnchor: 'genai-txt',
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
paths: ['/.well-known/ai-plugin.json', '/ai-plugin.json'],
|
|
37
|
-
label: 'ai-plugin.json',
|
|
38
|
-
hint: 'Publish /ai-plugin.json (legacy ChatGPT plugin manifest). Schema: name_for_model, description_for_model, api.url. Still consumed by some agents.',
|
|
39
|
-
guideAnchor: 'ai-plugin',
|
|
40
|
-
parser: (body) => {
|
|
41
|
-
try {
|
|
42
|
-
const data = JSON.parse(body);
|
|
43
|
-
return Boolean(data.name_for_model || data.name_for_human || data.schema_version);
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
paths: ['/agents.json', '/.well-known/agents.json'],
|
|
52
|
-
label: 'agents.json',
|
|
53
|
-
hint: 'Publish /agents.json describing your site as a callable agent (OpenAgents / Wildcard emerging spec). Includes name, description, and operations[].',
|
|
54
|
-
guideAnchor: 'agents-json',
|
|
55
|
-
parser: (body) => {
|
|
56
|
-
try {
|
|
57
|
-
const data = JSON.parse(body);
|
|
58
|
-
return Boolean(data.name || data.operations || data.agents);
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
paths: ['/.well-known/nlweb.json', '/nlweb.json'],
|
|
67
|
-
label: 'nlweb.json',
|
|
68
|
-
hint: 'Publish /.well-known/nlweb.json (Microsoft NLWeb) so agents can interact with the site through a natural-language interface.',
|
|
69
|
-
guideAnchor: 'nlweb',
|
|
70
|
-
parser: (body) => {
|
|
71
|
-
try {
|
|
72
|
-
JSON.parse(body);
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
];
|
|
81
|
-
export default async function check(ctx) {
|
|
82
|
-
const start = performance.now();
|
|
83
|
-
const findings = [];
|
|
84
|
-
let presentCount = 0;
|
|
85
|
-
for (const probe of PROBES) {
|
|
86
|
-
let hit = null;
|
|
87
|
-
for (const path of probe.paths) {
|
|
88
|
-
const res = await ctx.fetch(`${ctx.url}${path}`);
|
|
89
|
-
if (res.ok && res.body.trim().length > 0) {
|
|
90
|
-
hit = { path, res };
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
if (!hit) {
|
|
95
|
-
findings.push({
|
|
96
|
-
status: 'warn',
|
|
97
|
-
message: `${probe.label} not found`,
|
|
98
|
-
detail: `Tried: ${probe.paths.join(', ')}`,
|
|
99
|
-
hint: probe.hint,
|
|
100
|
-
learnMoreUrl: guideUrl(meta.id, probe.guideAnchor),
|
|
101
|
-
});
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
if (probe.parser && !probe.parser(hit.res.body)) {
|
|
105
|
-
findings.push({
|
|
106
|
-
status: 'warn',
|
|
107
|
-
message: `${probe.label} present at ${hit.path} but does not look valid`,
|
|
108
|
-
hint: probe.hint,
|
|
109
|
-
learnMoreUrl: guideUrl(meta.id, `${probe.guideAnchor}-invalid`),
|
|
110
|
-
});
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
presentCount++;
|
|
114
|
-
findings.push({ status: 'pass', message: `${probe.label} present at ${hit.path}` });
|
|
115
|
-
}
|
|
116
|
-
const score = Math.round((presentCount / PROBES.length) * 100);
|
|
117
|
-
findings.unshift({
|
|
118
|
-
status: presentCount > 0 ? 'pass' : 'warn',
|
|
119
|
-
message: `${presentCount}/${PROBES.length} emerging AI discovery files published`,
|
|
120
|
-
});
|
|
121
|
-
return buildResult(meta, score, findings, start);
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=well-known-ai.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"well-known-ai.js","sourceRoot":"","sources":["../../src/checks/well-known-ai.ts"],"names":[],"mappings":"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"}
|