ax-audit 3.6.0 → 4.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 +138 -0
- package/LICENSE +1 -1
- package/README.md +58 -36
- package/dist/baseline.d.ts +2 -0
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +42 -4
- package/dist/baseline.js.map +1 -1
- package/dist/check-ids.d.ts +19 -0
- package/dist/check-ids.d.ts.map +1 -0
- package/dist/check-ids.js +53 -0
- package/dist/check-ids.js.map +1 -0
- package/dist/checks/agent-access.d.ts +23 -6
- package/dist/checks/agent-access.d.ts.map +1 -1
- package/dist/checks/agent-access.js +200 -54
- package/dist/checks/agent-access.js.map +1 -1
- package/dist/checks/agent-card.d.ts +37 -0
- package/dist/checks/agent-card.d.ts.map +1 -0
- package/dist/checks/agent-card.js +352 -0
- package/dist/checks/agent-card.js.map +1 -0
- package/dist/checks/agent-operability.d.ts +66 -0
- package/dist/checks/agent-operability.d.ts.map +1 -0
- package/dist/checks/agent-operability.js +383 -0
- package/dist/checks/agent-operability.js.map +1 -0
- package/dist/checks/agent-skills.d.ts +24 -0
- package/dist/checks/agent-skills.d.ts.map +1 -0
- package/dist/checks/agent-skills.js +316 -0
- package/dist/checks/agent-skills.js.map +1 -0
- package/dist/checks/ai-catalog.d.ts +28 -0
- package/dist/checks/ai-catalog.d.ts.map +1 -0
- package/dist/checks/ai-catalog.js +254 -0
- package/dist/checks/ai-catalog.js.map +1 -0
- package/dist/checks/ai-directives.d.ts +57 -0
- package/dist/checks/ai-directives.d.ts.map +1 -0
- package/dist/checks/ai-directives.js +263 -0
- package/dist/checks/ai-directives.js.map +1 -0
- package/dist/checks/api-discovery.d.ts +26 -0
- package/dist/checks/api-discovery.d.ts.map +1 -0
- package/dist/checks/api-discovery.js +432 -0
- package/dist/checks/api-discovery.js.map +1 -0
- package/dist/checks/auth-discovery.d.ts +28 -0
- package/dist/checks/auth-discovery.d.ts.map +1 -0
- package/dist/checks/auth-discovery.js +213 -0
- package/dist/checks/auth-discovery.js.map +1 -0
- package/dist/checks/commerce-discovery.d.ts +40 -0
- package/dist/checks/commerce-discovery.d.ts.map +1 -0
- package/dist/checks/commerce-discovery.js +295 -0
- package/dist/checks/commerce-discovery.js.map +1 -0
- package/dist/checks/content-negotiation.d.ts.map +1 -1
- package/dist/checks/content-negotiation.js +135 -20
- package/dist/checks/content-negotiation.js.map +1 -1
- package/dist/checks/crawl-efficiency.d.ts +13 -1
- package/dist/checks/crawl-efficiency.d.ts.map +1 -1
- package/dist/checks/crawl-efficiency.js +65 -1
- package/dist/checks/crawl-efficiency.js.map +1 -1
- package/dist/checks/frontmatter.d.ts +34 -0
- package/dist/checks/frontmatter.d.ts.map +1 -0
- package/dist/checks/frontmatter.js +100 -0
- package/dist/checks/frontmatter.js.map +1 -0
- package/dist/checks/html-rendering.d.ts.map +1 -1
- package/dist/checks/html-rendering.js +0 -1
- package/dist/checks/html-rendering.js.map +1 -1
- package/dist/checks/html-utils.d.ts +10 -0
- package/dist/checks/html-utils.d.ts.map +1 -1
- package/dist/checks/html-utils.js +19 -0
- package/dist/checks/html-utils.js.map +1 -1
- package/dist/checks/http-headers.d.ts.map +1 -1
- package/dist/checks/http-headers.js +82 -10
- package/dist/checks/http-headers.js.map +1 -1
- package/dist/checks/http-hygiene.d.ts +26 -0
- package/dist/checks/http-hygiene.d.ts.map +1 -0
- package/dist/checks/http-hygiene.js +257 -0
- package/dist/checks/http-hygiene.js.map +1 -0
- package/dist/checks/index.d.ts.map +1 -1
- package/dist/checks/index.js +24 -8
- package/dist/checks/index.js.map +1 -1
- package/dist/checks/llms-txt.d.ts +15 -0
- package/dist/checks/llms-txt.d.ts.map +1 -1
- package/dist/checks/llms-txt.js +162 -2
- package/dist/checks/llms-txt.js.map +1 -1
- package/dist/checks/mcp-discovery.d.ts +30 -0
- package/dist/checks/mcp-discovery.d.ts.map +1 -0
- package/dist/checks/mcp-discovery.js +523 -0
- package/dist/checks/mcp-discovery.js.map +1 -0
- package/dist/checks/meta-tags.d.ts.map +1 -1
- package/dist/checks/meta-tags.js +6 -5
- package/dist/checks/meta-tags.js.map +1 -1
- package/dist/checks/robots-parser.d.ts +110 -0
- package/dist/checks/robots-parser.d.ts.map +1 -0
- package/dist/checks/robots-parser.js +277 -0
- package/dist/checks/robots-parser.js.map +1 -0
- package/dist/checks/robots-txt.d.ts +2 -20
- package/dist/checks/robots-txt.d.ts.map +1 -1
- package/dist/checks/robots-txt.js +219 -120
- package/dist/checks/robots-txt.js.map +1 -1
- package/dist/checks/rsl.d.ts +0 -2
- package/dist/checks/rsl.d.ts.map +1 -1
- package/dist/checks/rsl.js +1 -11
- package/dist/checks/rsl.js.map +1 -1
- package/dist/checks/security-txt.d.ts.map +1 -1
- package/dist/checks/security-txt.js +0 -1
- package/dist/checks/security-txt.js.map +1 -1
- package/dist/checks/seo-basics.d.ts.map +1 -1
- package/dist/checks/seo-basics.js +0 -1
- package/dist/checks/seo-basics.js.map +1 -1
- package/dist/checks/sitemap.d.ts.map +1 -1
- package/dist/checks/sitemap.js +0 -1
- package/dist/checks/sitemap.js.map +1 -1
- package/dist/checks/structured-data.d.ts.map +1 -1
- package/dist/checks/structured-data.js +215 -4
- package/dist/checks/structured-data.js.map +1 -1
- package/dist/checks/structured-fields.d.ts +46 -0
- package/dist/checks/structured-fields.d.ts.map +1 -0
- package/dist/checks/structured-fields.js +112 -0
- package/dist/checks/structured-fields.js.map +1 -0
- package/dist/checks/surface.d.ts +59 -0
- package/dist/checks/surface.d.ts.map +1 -0
- package/dist/checks/surface.js +106 -0
- package/dist/checks/surface.js.map +1 -0
- package/dist/checks/tls-https.d.ts.map +1 -1
- package/dist/checks/tls-https.js +0 -1
- package/dist/checks/tls-https.js.map +1 -1
- package/dist/checks/usage-policy.d.ts +53 -0
- package/dist/checks/usage-policy.d.ts.map +1 -0
- package/dist/checks/usage-policy.js +339 -0
- package/dist/checks/usage-policy.js.map +1 -0
- package/dist/checks/utils.d.ts +25 -1
- package/dist/checks/utils.d.ts.map +1 -1
- package/dist/checks/utils.js +33 -1
- package/dist/checks/utils.js.map +1 -1
- package/dist/checks/waf.d.ts +75 -0
- package/dist/checks/waf.d.ts.map +1 -0
- package/dist/checks/waf.js +203 -0
- package/dist/checks/waf.js.map +1 -0
- package/dist/checks/webmcp.d.ts +55 -0
- package/dist/checks/webmcp.d.ts.map +1 -0
- package/dist/checks/webmcp.js +209 -0
- package/dist/checks/webmcp.js.map +1 -0
- package/dist/checks/well-known.d.ts +38 -0
- package/dist/checks/well-known.d.ts.map +1 -0
- package/dist/checks/well-known.js +202 -0
- package/dist/checks/well-known.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +124 -4
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +195 -14
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +598 -70
- package/dist/constants.js.map +1 -1
- package/dist/fetcher.d.ts.map +1 -1
- package/dist/fetcher.js +44 -14
- package/dist/fetcher.js.map +1 -1
- package/dist/guide-urls.js +1 -1
- package/dist/guide-urls.js.map +1 -1
- 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/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +5 -1
- package/dist/orchestrator.js.map +1 -1
- package/dist/reporter/html.d.ts +9 -0
- package/dist/reporter/html.d.ts.map +1 -1
- package/dist/reporter/html.js +49 -11
- package/dist/reporter/html.js.map +1 -1
- package/dist/reporter/markdown.d.ts.map +1 -1
- package/dist/reporter/markdown.js +36 -6
- package/dist/reporter/markdown.js.map +1 -1
- package/dist/reporter/terminal.d.ts.map +1 -1
- package/dist/reporter/terminal.js +36 -1
- package/dist/reporter/terminal.js.map +1 -1
- package/dist/scorer.d.ts +10 -0
- package/dist/scorer.d.ts.map +1 -1
- package/dist/scorer.js +22 -5
- package/dist/scorer.js.map +1 -1
- package/dist/types.d.ts +90 -3
- package/dist/types.d.ts.map +1 -1
- package/docs/architecture.md +27 -11
- package/docs/checks.md +285 -52
- package/docs/cli.md +36 -0
- package/docs/concepts.md +27 -13
- package/docs/faq.md +18 -6
- package/docs/getting-started.md +20 -13
- package/docs/roadmap.md +367 -0
- package/package.json +13 -5
- 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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standing of every well-known URI and discovery convention ax-audit probes.
|
|
3
|
+
*
|
|
4
|
+
* The agent web is a mix of IETF-registered URIs, vendor conventions that are
|
|
5
|
+
* widely deployed but unregistered, and drafts that may be renamed next month.
|
|
6
|
+
* Reporting them all as equally authoritative would be misleading, so every
|
|
7
|
+
* probe carries its standing and audiences can weigh a miss accordingly:
|
|
8
|
+
*
|
|
9
|
+
* - `registered` — in the IANA Well-Known URI registry (permanent or provisional).
|
|
10
|
+
* - `convention` — no registration, but shipped by multiple independent vendors.
|
|
11
|
+
* - `draft` — an open spec PR, individual I-D, or origin-trial-era proposal.
|
|
12
|
+
* - `legacy` — superseded or abandoned; recognised so we can advise removal.
|
|
13
|
+
*
|
|
14
|
+
* Registry snapshot: https://www.iana.org/assignments/well-known-uris/well-known-uris.xhtml
|
|
15
|
+
* (last verified 2026-09-04, registry last updated 2026-08-19).
|
|
16
|
+
*/
|
|
17
|
+
export type Standing = 'registered' | 'convention' | 'draft' | 'legacy';
|
|
18
|
+
export interface WellKnownEntry {
|
|
19
|
+
/** Path as probed, root-relative. */
|
|
20
|
+
path: string;
|
|
21
|
+
standing: Standing;
|
|
22
|
+
/** Short human label used in findings. */
|
|
23
|
+
label: string;
|
|
24
|
+
/** Authoritative reference for the path. */
|
|
25
|
+
specUrl: string;
|
|
26
|
+
/** Free-text note surfaced in `detail` when the standing is not `registered`. */
|
|
27
|
+
note?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Every path ax-audit knows about, keyed by path. Checks look up their probe
|
|
31
|
+
* targets here so a rename in a draft spec is a one-line change in one file.
|
|
32
|
+
*/
|
|
33
|
+
export declare const WELL_KNOWN: Record<string, WellKnownEntry>;
|
|
34
|
+
/** Look up a path's standing, defaulting to `convention` for unknown paths. */
|
|
35
|
+
export declare function standingOf(path: string): Standing;
|
|
36
|
+
/** Human sentence describing a path's standing, for finding details. */
|
|
37
|
+
export declare function standingNote(path: string): string | undefined;
|
|
38
|
+
//# sourceMappingURL=well-known.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"well-known.d.ts","sourceRoot":"","sources":["../../src/checks/well-known.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAqLrD,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAEjD;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY7D"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every path ax-audit knows about, keyed by path. Checks look up their probe
|
|
3
|
+
* targets here so a rename in a draft spec is a one-line change in one file.
|
|
4
|
+
*/
|
|
5
|
+
export const WELL_KNOWN = {
|
|
6
|
+
/* ── IANA-registered ────────────────────────────────────────────────── */
|
|
7
|
+
'/.well-known/agent-card.json': {
|
|
8
|
+
path: '/.well-known/agent-card.json',
|
|
9
|
+
standing: 'registered',
|
|
10
|
+
label: 'A2A Agent Card',
|
|
11
|
+
specUrl: 'https://a2a-protocol.org/latest/specification/',
|
|
12
|
+
},
|
|
13
|
+
'/.well-known/api-catalog': {
|
|
14
|
+
path: '/.well-known/api-catalog',
|
|
15
|
+
standing: 'registered',
|
|
16
|
+
label: 'API Catalog (RFC 9727)',
|
|
17
|
+
specUrl: 'https://www.rfc-editor.org/rfc/rfc9727.html',
|
|
18
|
+
},
|
|
19
|
+
'/.well-known/oauth-protected-resource': {
|
|
20
|
+
path: '/.well-known/oauth-protected-resource',
|
|
21
|
+
standing: 'registered',
|
|
22
|
+
label: 'OAuth Protected Resource Metadata (RFC 9728)',
|
|
23
|
+
specUrl: 'https://www.rfc-editor.org/rfc/rfc9728.html',
|
|
24
|
+
},
|
|
25
|
+
'/.well-known/oauth-authorization-server': {
|
|
26
|
+
path: '/.well-known/oauth-authorization-server',
|
|
27
|
+
standing: 'registered',
|
|
28
|
+
label: 'OAuth Authorization Server Metadata (RFC 8414)',
|
|
29
|
+
specUrl: 'https://www.rfc-editor.org/rfc/rfc8414.html',
|
|
30
|
+
},
|
|
31
|
+
'/.well-known/openid-configuration': {
|
|
32
|
+
path: '/.well-known/openid-configuration',
|
|
33
|
+
standing: 'registered',
|
|
34
|
+
label: 'OpenID Provider Configuration',
|
|
35
|
+
specUrl: 'https://openid.net/specs/openid-connect-discovery-1_0.html',
|
|
36
|
+
},
|
|
37
|
+
'/.well-known/security.txt': {
|
|
38
|
+
path: '/.well-known/security.txt',
|
|
39
|
+
standing: 'registered',
|
|
40
|
+
label: 'security.txt (RFC 9116)',
|
|
41
|
+
specUrl: 'https://www.rfc-editor.org/rfc/rfc9116',
|
|
42
|
+
},
|
|
43
|
+
'/.well-known/tdmrep.json': {
|
|
44
|
+
path: '/.well-known/tdmrep.json',
|
|
45
|
+
standing: 'registered',
|
|
46
|
+
label: 'TDM Reservation Protocol',
|
|
47
|
+
specUrl: 'https://www.w3.org/community/reports/tdmrep/CG-FINAL-tdmrep-20240510/',
|
|
48
|
+
note: 'Provisional registration. W3C Community Group Final Report; referenced by the EU GPAI Code of Practice.',
|
|
49
|
+
},
|
|
50
|
+
'/.well-known/http-message-signatures-directory': {
|
|
51
|
+
path: '/.well-known/http-message-signatures-directory',
|
|
52
|
+
standing: 'registered',
|
|
53
|
+
label: 'Web Bot Auth key directory',
|
|
54
|
+
specUrl: 'https://datatracker.ietf.org/doc/html/draft-ietf-webbotauth-httpsig-protocol',
|
|
55
|
+
note: 'Path registered; the protocol itself was adopted by the IETF webbotauth WG on 2026-09-01.',
|
|
56
|
+
},
|
|
57
|
+
/* ── Vendor conventions (unregistered, multi-vendor) ────────────────── */
|
|
58
|
+
'/llms.txt': {
|
|
59
|
+
path: '/llms.txt',
|
|
60
|
+
standing: 'convention',
|
|
61
|
+
label: 'llms.txt',
|
|
62
|
+
specUrl: 'https://llmstxt.org/',
|
|
63
|
+
note: 'Community proposal (v2, 2026-08-10). Read by coding agents (Claude Code, Cursor, OpenCode); Google Search states it ignores the file.',
|
|
64
|
+
},
|
|
65
|
+
'/.well-known/mcp/server-card.json': {
|
|
66
|
+
path: '/.well-known/mcp/server-card.json',
|
|
67
|
+
standing: 'convention',
|
|
68
|
+
label: 'MCP Server Card (well-known path)',
|
|
69
|
+
specUrl: 'https://github.com/modelcontextprotocol/experimental-ext-server-card',
|
|
70
|
+
note: 'Served by Cloudflare and Mintlify. The MCP extension recommends <endpoint>/server-card instead.',
|
|
71
|
+
},
|
|
72
|
+
'/.well-known/skills/index.json': {
|
|
73
|
+
path: '/.well-known/skills/index.json',
|
|
74
|
+
standing: 'convention',
|
|
75
|
+
label: 'Agent Skills index (Mintlify variant)',
|
|
76
|
+
specUrl: 'https://www.mintlify.com/docs/ai/skillmd',
|
|
77
|
+
},
|
|
78
|
+
'/.well-known/ucp': {
|
|
79
|
+
path: '/.well-known/ucp',
|
|
80
|
+
standing: 'convention',
|
|
81
|
+
label: 'Universal Commerce Protocol profile',
|
|
82
|
+
specUrl: 'https://developers.google.com/merchant/ucp/guides/ucp-profile',
|
|
83
|
+
note: 'Google-led, adopted by Shopify, Etsy, Walmart and Stripe. Not IANA-registered.',
|
|
84
|
+
},
|
|
85
|
+
'/openapi.json': {
|
|
86
|
+
path: '/openapi.json',
|
|
87
|
+
standing: 'convention',
|
|
88
|
+
label: 'OpenAPI description',
|
|
89
|
+
specUrl: 'https://spec.openapis.org/oas/latest.html',
|
|
90
|
+
note: 'The OpenAPI spec recommends the file name openapi.json / openapi.yaml. No well-known path is registered.',
|
|
91
|
+
},
|
|
92
|
+
'/.well-known/openai-apps-challenge': {
|
|
93
|
+
path: '/.well-known/openai-apps-challenge',
|
|
94
|
+
standing: 'convention',
|
|
95
|
+
label: 'OpenAI Apps domain verification',
|
|
96
|
+
specUrl: 'https://developers.openai.com/plugins/deploy/submission.md',
|
|
97
|
+
},
|
|
98
|
+
'/.well-known/gpc.json': {
|
|
99
|
+
path: '/.well-known/gpc.json',
|
|
100
|
+
standing: 'registered',
|
|
101
|
+
label: 'Global Privacy Control',
|
|
102
|
+
specUrl: 'https://privacycg.github.io/gpc-spec/',
|
|
103
|
+
},
|
|
104
|
+
/* ── Drafts ─────────────────────────────────────────────────────────── */
|
|
105
|
+
'/.well-known/agent-skills/index.json': {
|
|
106
|
+
path: '/.well-known/agent-skills/index.json',
|
|
107
|
+
standing: 'draft',
|
|
108
|
+
label: 'Agent Skills discovery index',
|
|
109
|
+
specUrl: 'https://github.com/cloudflare/agent-skills-discovery-rfc',
|
|
110
|
+
note: 'Cloudflare RFC v0.2.0 (2026-03-12). Not registered; a competing shorter path (/.well-known/skills/) also ships.',
|
|
111
|
+
},
|
|
112
|
+
'/.well-known/ai-catalog.json': {
|
|
113
|
+
path: '/.well-known/ai-catalog.json',
|
|
114
|
+
standing: 'draft',
|
|
115
|
+
label: 'AI Catalog',
|
|
116
|
+
specUrl: 'https://ai-catalog.io/',
|
|
117
|
+
note: 'Linux Foundation Agent Card WG draft. Adoption pending steering-committee votes.',
|
|
118
|
+
},
|
|
119
|
+
'/.well-known/ard.json': {
|
|
120
|
+
path: '/.well-known/ard.json',
|
|
121
|
+
standing: 'draft',
|
|
122
|
+
label: 'Agentic Resource Discovery',
|
|
123
|
+
specUrl: 'https://agenticresourcediscovery.org/spec/',
|
|
124
|
+
note: 'Spec v0.91 (2026-08-26). Overlaps with ai-catalog.json; both are probed.',
|
|
125
|
+
},
|
|
126
|
+
'/.well-known/mcp/server-cards.json': {
|
|
127
|
+
path: '/.well-known/mcp/server-cards.json',
|
|
128
|
+
standing: 'draft',
|
|
129
|
+
label: 'MCP Server Cards (multi-server)',
|
|
130
|
+
specUrl: 'https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2127',
|
|
131
|
+
note: 'SEP-2127 is an open draft; the path has changed twice since 2025-10.',
|
|
132
|
+
},
|
|
133
|
+
'/.well-known/ai.txt': {
|
|
134
|
+
path: '/.well-known/ai.txt',
|
|
135
|
+
standing: 'draft',
|
|
136
|
+
label: 'ai.txt (well-known variant)',
|
|
137
|
+
specUrl: 'https://datatracker.ietf.org/doc/draft-car-ai-txt-wellknown/',
|
|
138
|
+
note: 'Individual I-D (2026-06-12), not adopted by any working group.',
|
|
139
|
+
},
|
|
140
|
+
/* ── Legacy ─────────────────────────────────────────────────────────── */
|
|
141
|
+
'/.well-known/agent.json': {
|
|
142
|
+
path: '/.well-known/agent.json',
|
|
143
|
+
standing: 'legacy',
|
|
144
|
+
label: 'A2A Agent Card (pre-0.3 path)',
|
|
145
|
+
specUrl: 'https://github.com/a2aproject/A2A/releases',
|
|
146
|
+
note: 'A2A moved the card to /.well-known/agent-card.json in v0.3.0 (2025-07-30).',
|
|
147
|
+
},
|
|
148
|
+
'/.well-known/mcp.json': {
|
|
149
|
+
path: '/.well-known/mcp.json',
|
|
150
|
+
standing: 'legacy',
|
|
151
|
+
label: 'MCP manifest (non-standard)',
|
|
152
|
+
specUrl: 'https://modelcontextprotocol.io/specification/versioning',
|
|
153
|
+
note: 'Never part of the MCP specification. Server cards superseded ad-hoc manifests.',
|
|
154
|
+
},
|
|
155
|
+
'/.well-known/ai-plugin.json': {
|
|
156
|
+
path: '/.well-known/ai-plugin.json',
|
|
157
|
+
standing: 'legacy',
|
|
158
|
+
label: 'ChatGPT plugin manifest',
|
|
159
|
+
specUrl: 'https://developers.openai.com/plugins/',
|
|
160
|
+
note: 'ChatGPT plugins were shut down on 2024-04-09 and replaced by GPT Actions, then MCP.',
|
|
161
|
+
},
|
|
162
|
+
'/agents.json': {
|
|
163
|
+
path: '/agents.json',
|
|
164
|
+
standing: 'legacy',
|
|
165
|
+
label: 'agents.json (Wildcard)',
|
|
166
|
+
specUrl: 'https://github.com/wild-card-ai/agents-json',
|
|
167
|
+
note: 'Repository dormant since 2025-08-21; no known consumer.',
|
|
168
|
+
},
|
|
169
|
+
'/.well-known/nlweb.json': {
|
|
170
|
+
path: '/.well-known/nlweb.json',
|
|
171
|
+
standing: 'legacy',
|
|
172
|
+
label: 'NLWeb manifest',
|
|
173
|
+
specUrl: 'https://github.com/nlweb-ai/NLWeb',
|
|
174
|
+
note: 'No such file exists in the NLWeb project. NLWeb exposes /ask and /mcp endpoints instead.',
|
|
175
|
+
},
|
|
176
|
+
'/.well-known/genai.txt': {
|
|
177
|
+
path: '/.well-known/genai.txt',
|
|
178
|
+
standing: 'legacy',
|
|
179
|
+
label: 'genai.txt',
|
|
180
|
+
specUrl: 'https://llmstxt.org/',
|
|
181
|
+
note: 'No specification, repository, or documented consumer was found for this file.',
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
/** Look up a path's standing, defaulting to `convention` for unknown paths. */
|
|
185
|
+
export function standingOf(path) {
|
|
186
|
+
return WELL_KNOWN[path]?.standing ?? 'convention';
|
|
187
|
+
}
|
|
188
|
+
/** Human sentence describing a path's standing, for finding details. */
|
|
189
|
+
export function standingNote(path) {
|
|
190
|
+
const entry = WELL_KNOWN[path];
|
|
191
|
+
if (!entry)
|
|
192
|
+
return undefined;
|
|
193
|
+
const prefix = entry.standing === 'registered'
|
|
194
|
+
? 'IANA-registered well-known URI.'
|
|
195
|
+
: entry.standing === 'convention'
|
|
196
|
+
? 'Vendor convention, not IANA-registered.'
|
|
197
|
+
: entry.standing === 'draft'
|
|
198
|
+
? 'Draft specification — the path may still change.'
|
|
199
|
+
: 'Legacy path.';
|
|
200
|
+
return entry.note ? `${prefix} ${entry.note}` : prefix;
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=well-known.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"well-known.js","sourceRoot":"","sources":["../../src/checks/well-known.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
|
+
import type { AuditReport, CheckCategory } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse `--fail-on-category area:score` pairs into thresholds.
|
|
4
|
+
*
|
|
5
|
+
* An overall score hides a category that is entirely broken: a site can score
|
|
6
|
+
* 80 while every access check fails, because the other four areas carry it.
|
|
7
|
+
* Per-area gates let a team say "content may drift, but access must not".
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseCategoryThresholds(raw: string): {
|
|
10
|
+
thresholds: Map<CheckCategory, number>;
|
|
11
|
+
error?: string;
|
|
12
|
+
};
|
|
13
|
+
/** Score of one report area, over the checks in it that apply. */
|
|
14
|
+
export declare function categoryScore(report: AuditReport, category: CheckCategory): number | null;
|
|
1
15
|
export declare function cli(argv: string[]): void;
|
|
2
16
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAgB,aAAa,EAAgB,MAAM,YAAY,CAAC;AAyBzF;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAuB/G;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAWzF;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4MxC"}
|
package/dist/cli.js
CHANGED
|
@@ -3,7 +3,57 @@ import { audit, batchAudit } from './orchestrator.js';
|
|
|
3
3
|
import { report, reportBatch } from './reporter/index.js';
|
|
4
4
|
import { VERSION } from './constants.js';
|
|
5
5
|
import { checks as allChecks } from './checks/index.js';
|
|
6
|
+
import { allSelectableIds } from './check-ids.js';
|
|
6
7
|
import { saveBaseline, loadBaseline, diffBaseline } from './baseline.js';
|
|
8
|
+
import { calculateOverallScore } from './scorer.js';
|
|
9
|
+
import { CHECK_CATEGORIES } from './constants.js';
|
|
10
|
+
/** Profiles that force conditional protocol checks applicable. */
|
|
11
|
+
const VALID_PROFILES = ['auto', 'api', 'mcp', 'agent', 'docs', 'commerce', 'all'];
|
|
12
|
+
/** Report areas, usable with `--category` and `--fail-on-category`. */
|
|
13
|
+
const VALID_CATEGORIES = ['content', 'discovery', 'access', 'policy', 'protocols'];
|
|
14
|
+
/**
|
|
15
|
+
* Parse `--fail-on-category area:score` pairs into thresholds.
|
|
16
|
+
*
|
|
17
|
+
* An overall score hides a category that is entirely broken: a site can score
|
|
18
|
+
* 80 while every access check fails, because the other four areas carry it.
|
|
19
|
+
* Per-area gates let a team say "content may drift, but access must not".
|
|
20
|
+
*/
|
|
21
|
+
export function parseCategoryThresholds(raw) {
|
|
22
|
+
const thresholds = new Map();
|
|
23
|
+
for (const pair of raw.split(',')) {
|
|
24
|
+
const trimmed = pair.trim();
|
|
25
|
+
if (trimmed === '')
|
|
26
|
+
continue;
|
|
27
|
+
const [name, value] = trimmed.split(':');
|
|
28
|
+
const category = (name ?? '').trim().toLowerCase();
|
|
29
|
+
if (!VALID_CATEGORIES.includes(category)) {
|
|
30
|
+
return { thresholds, error: `Unknown category "${name}". Valid: ${VALID_CATEGORIES.join(', ')}` };
|
|
31
|
+
}
|
|
32
|
+
const score = Number((value ?? '').trim());
|
|
33
|
+
if (!Number.isInteger(score) || score < 0 || score > 100) {
|
|
34
|
+
return { thresholds, error: `Threshold for "${category}" must be an integer between 0 and 100` };
|
|
35
|
+
}
|
|
36
|
+
thresholds.set(category, score);
|
|
37
|
+
}
|
|
38
|
+
if (thresholds.size === 0) {
|
|
39
|
+
return { thresholds, error: 'Expected at least one area:score pair, for example access:70' };
|
|
40
|
+
}
|
|
41
|
+
return { thresholds };
|
|
42
|
+
}
|
|
43
|
+
/** Score of one report area, over the checks in it that apply. */
|
|
44
|
+
export function categoryScore(report, category) {
|
|
45
|
+
const metas = new Map(allChecks.map((c) => [c.meta.id, c.meta]));
|
|
46
|
+
const inCategory = report.results.filter((r) => {
|
|
47
|
+
if (r.applicable === false)
|
|
48
|
+
return false;
|
|
49
|
+
const meta = metas.get(r.id);
|
|
50
|
+
return (meta?.category ?? CHECK_CATEGORIES[r.id]) === category;
|
|
51
|
+
});
|
|
52
|
+
if (inCategory.length === 0)
|
|
53
|
+
return null;
|
|
54
|
+
const metasFor = inCategory.map((r) => metas.get(r.id)).filter((m) => m !== undefined);
|
|
55
|
+
return calculateOverallScore(inCategory, metasFor);
|
|
56
|
+
}
|
|
7
57
|
export function cli(argv) {
|
|
8
58
|
const program = new Command();
|
|
9
59
|
program
|
|
@@ -22,6 +72,9 @@ export function cli(argv) {
|
|
|
22
72
|
.option('--save-baseline <path>', 'Save audit result as a baseline JSON file for future comparison')
|
|
23
73
|
.option('--baseline <path>', 'Compare against a previously saved baseline and show score deltas')
|
|
24
74
|
.option('--fail-on-regression <points>', 'Exit with code 1 if any check regresses by more than N points (requires --baseline)')
|
|
75
|
+
.option('--profile <name>', `Audit as though the site had a surface it does not yet expose: ${VALID_PROFILES.join(', ')}`, 'auto')
|
|
76
|
+
.option('--category <list>', `Only run checks in these areas: ${VALID_CATEGORIES.join(', ')}`)
|
|
77
|
+
.option('--fail-on-category <pairs>', 'Exit with code 1 when an area scores below its threshold, e.g. access:70,content:80')
|
|
25
78
|
.action(async (urls, options) => {
|
|
26
79
|
for (const url of urls) {
|
|
27
80
|
try {
|
|
@@ -42,13 +95,36 @@ export function cli(argv) {
|
|
|
42
95
|
console.error(`Error: Unknown output format "${format}". Valid: ${validFormats.join(', ')}`);
|
|
43
96
|
process.exit(1);
|
|
44
97
|
}
|
|
45
|
-
const
|
|
98
|
+
const profile = (options.profile ?? 'auto');
|
|
99
|
+
if (!VALID_PROFILES.includes(profile)) {
|
|
100
|
+
console.error(`Error: Unknown profile "${options.profile}". Valid: ${VALID_PROFILES.join(', ')}`);
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
let checks = options.checks ? options.checks.split(',').map((s) => s.trim()) : undefined;
|
|
104
|
+
if (options.category) {
|
|
105
|
+
const wanted = options.category.split(',').map((c) => c.trim().toLowerCase());
|
|
106
|
+
const unknown = wanted.filter((c) => !VALID_CATEGORIES.includes(c));
|
|
107
|
+
if (unknown.length > 0) {
|
|
108
|
+
console.error(`Error: Unknown categor(y|ies): ${unknown.join(', ')}. Valid: ${VALID_CATEGORIES.join(', ')}`);
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
const inCategory = allChecks
|
|
112
|
+
.filter((c) => wanted.includes(c.meta.category ?? CHECK_CATEGORIES[c.meta.id]))
|
|
113
|
+
.map((c) => c.meta.id);
|
|
114
|
+
// `--category` narrows an explicit `--checks` selection rather than replacing it.
|
|
115
|
+
checks = checks === undefined ? inCategory : checks.filter((id) => inCategory.includes(id));
|
|
116
|
+
if (checks.length === 0) {
|
|
117
|
+
console.error('Error: No checks match the requested category and check selection');
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
46
121
|
if (checks) {
|
|
47
|
-
|
|
48
|
-
const
|
|
122
|
+
// Former ids stay valid so CI invocations survive a rename.
|
|
123
|
+
const selectable = allSelectableIds().map((id) => id.toLowerCase());
|
|
124
|
+
const invalid = checks.filter((id) => !selectable.includes(id.toLowerCase()));
|
|
49
125
|
if (invalid.length > 0) {
|
|
50
126
|
console.error(`Error: Unknown check(s): ${invalid.join(', ')}`);
|
|
51
|
-
console.error(`Available checks: ${
|
|
127
|
+
console.error(`Available checks: ${allChecks.map((c) => c.meta.id).join(', ')}`);
|
|
52
128
|
process.exit(1);
|
|
53
129
|
}
|
|
54
130
|
}
|
|
@@ -62,11 +138,21 @@ export function cli(argv) {
|
|
|
62
138
|
console.error('Error: --concurrency must be a positive integer');
|
|
63
139
|
process.exit(1);
|
|
64
140
|
}
|
|
141
|
+
let categoryThresholds;
|
|
142
|
+
if (options.failOnCategory) {
|
|
143
|
+
const parsed = parseCategoryThresholds(options.failOnCategory);
|
|
144
|
+
if (parsed.error) {
|
|
145
|
+
console.error(`Error: --fail-on-category: ${parsed.error}`);
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
categoryThresholds = parsed.thresholds;
|
|
149
|
+
}
|
|
65
150
|
const baseOptions = {
|
|
66
151
|
checks,
|
|
67
152
|
timeout: parseInt(options.timeout, 10),
|
|
68
153
|
retries,
|
|
69
154
|
verbose: options.verbose,
|
|
155
|
+
profile,
|
|
70
156
|
};
|
|
71
157
|
// Load baseline if requested (fail fast before running the audit)
|
|
72
158
|
let baseline;
|
|
@@ -100,12 +186,19 @@ export function cli(argv) {
|
|
|
100
186
|
const output = applyOnlyFailures(result, options.onlyFailures);
|
|
101
187
|
report(output, format, diff);
|
|
102
188
|
// Determine exit code
|
|
189
|
+
if (diff?.scoringModelChanged && regressionThreshold !== undefined) {
|
|
190
|
+
console.error('Note: the baseline was written by an earlier scoring model, so regression gating is suspended for ' +
|
|
191
|
+
'this run. Re-save it with --save-baseline to resume gating.');
|
|
192
|
+
}
|
|
103
193
|
if (diff && regressionThreshold !== undefined) {
|
|
104
194
|
const worstRegression = diff.regressions.reduce((max, c) => Math.max(max, Math.abs(c.delta)), 0);
|
|
105
195
|
if (worstRegression > regressionThreshold) {
|
|
106
196
|
process.exit(1);
|
|
107
197
|
}
|
|
108
198
|
}
|
|
199
|
+
if (categoryThresholds && failsCategoryGate(result, categoryThresholds)) {
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
109
202
|
process.exit(result.overallScore >= 70 ? 0 : 1);
|
|
110
203
|
}
|
|
111
204
|
else {
|
|
@@ -119,6 +212,9 @@ export function cli(argv) {
|
|
|
119
212
|
batch.reports = batch.reports.map((r) => applyOnlyFailures(r, true));
|
|
120
213
|
}
|
|
121
214
|
reportBatch(batch, format);
|
|
215
|
+
if (categoryThresholds && batch.reports.some((r) => failsCategoryGate(r, categoryThresholds))) {
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
122
218
|
process.exit(batch.summary.failed === 0 ? 0 : 1);
|
|
123
219
|
}
|
|
124
220
|
}
|
|
@@ -130,6 +226,30 @@ export function cli(argv) {
|
|
|
130
226
|
});
|
|
131
227
|
program.parse(argv);
|
|
132
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* Report each area against its threshold and say whether the gate failed.
|
|
231
|
+
*
|
|
232
|
+
* Printed to stderr rather than the report, so it survives `--output json`
|
|
233
|
+
* being piped somewhere and reads correctly in CI logs.
|
|
234
|
+
*/
|
|
235
|
+
function failsCategoryGate(result, thresholds) {
|
|
236
|
+
let failed = false;
|
|
237
|
+
for (const [category, threshold] of thresholds) {
|
|
238
|
+
const score = categoryScore(result, category);
|
|
239
|
+
if (score === null) {
|
|
240
|
+
console.error(` ${category}: n/a (no applicable checks) — threshold ${threshold} not evaluated`);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (score < threshold) {
|
|
244
|
+
console.error(` ${category}: ${score} is below the threshold of ${threshold}`);
|
|
245
|
+
failed = true;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
console.error(` ${category}: ${score} meets the threshold of ${threshold}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return failed;
|
|
252
|
+
}
|
|
133
253
|
function applyOnlyFailures(result, onlyFailures) {
|
|
134
254
|
if (!onlyFailures)
|
|
135
255
|
return result;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|