ax-audit 3.1.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 +198 -0
- package/LICENSE +1 -1
- package/README.md +89 -231
- 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 +33 -0
- package/dist/checks/agent-access.d.ts.map +1 -0
- package/dist/checks/agent-access.js +256 -0
- package/dist/checks/agent-access.js.map +1 -0
- 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 +16 -0
- package/dist/checks/crawl-efficiency.d.ts.map +1 -0
- package/dist/checks/crawl-efficiency.js +186 -0
- package/dist/checks/crawl-efficiency.js.map +1 -0
- 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 +30 -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 -0
- package/dist/checks/robots-txt.d.ts.map +1 -1
- package/dist/checks/robots-txt.js +252 -45
- package/dist/checks/robots-txt.js.map +1 -1
- package/dist/checks/{mcp.d.ts → rsl.d.ts} +1 -1
- package/dist/checks/rsl.d.ts.map +1 -0
- package/dist/checks/rsl.js +242 -0
- package/dist/checks/rsl.js.map +1 -0
- 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 +144 -6
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +212 -14
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +625 -59
- package/dist/constants.js.map +1 -1
- package/dist/fetcher.d.ts +5 -1
- package/dist/fetcher.d.ts.map +1 -1
- package/dist/fetcher.js +62 -27
- 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 +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/orchestrator.d.ts +2 -2
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +18 -7
- 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/index.d.ts.map +1 -1
- package/dist/reporter/index.js +7 -0
- package/dist/reporter/index.js.map +1 -1
- package/dist/reporter/markdown.d.ts +8 -0
- package/dist/reporter/markdown.d.ts.map +1 -0
- package/dist/reporter/markdown.js +106 -0
- package/dist/reporter/markdown.js.map +1 -0
- 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 +96 -3
- package/dist/types.d.ts.map +1 -1
- package/docs/api.md +200 -0
- package/docs/architecture.md +104 -0
- package/docs/checks.md +555 -0
- package/docs/ci.md +89 -0
- package/docs/cli.md +103 -0
- package/docs/concepts.md +101 -0
- package/docs/faq.md +89 -0
- package/docs/getting-started.md +108 -0
- package/docs/roadmap.md +367 -0
- package/package.json +14 -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.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,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
|
|
@@ -12,14 +62,19 @@ export function cli(argv) {
|
|
|
12
62
|
.version(VERSION, '-v, --version')
|
|
13
63
|
.argument('<urls...>', 'One or more URLs to audit (e.g., https://example.com)')
|
|
14
64
|
.option('--json', 'Output results as JSON')
|
|
15
|
-
.option('--output <format>', 'Output format: terminal, json, html', 'terminal')
|
|
65
|
+
.option('--output <format>', 'Output format: terminal, json, html, markdown', 'terminal')
|
|
16
66
|
.option('--checks <list>', 'Comma-separated list of checks to run')
|
|
17
67
|
.option('--timeout <ms>', 'Per-request timeout in milliseconds', '10000')
|
|
68
|
+
.option('--retries <n>', 'Retry attempts for transient fetch failures (timeouts, 5xx)', '2')
|
|
69
|
+
.option('--concurrency <n>', 'Max URLs to audit in parallel (batch mode)', '1')
|
|
18
70
|
.option('--verbose', 'Show detailed request and check execution logs')
|
|
19
71
|
.option('--only-failures', 'Only show checks/findings with failures or warnings')
|
|
20
72
|
.option('--save-baseline <path>', 'Save audit result as a baseline JSON file for future comparison')
|
|
21
73
|
.option('--baseline <path>', 'Compare against a previously saved baseline and show score deltas')
|
|
22
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')
|
|
23
78
|
.action(async (urls, options) => {
|
|
24
79
|
for (const url of urls) {
|
|
25
80
|
try {
|
|
@@ -35,20 +90,69 @@ export function cli(argv) {
|
|
|
35
90
|
process.exit(1);
|
|
36
91
|
}
|
|
37
92
|
const format = (options.json ? 'json' : options.output);
|
|
38
|
-
const
|
|
93
|
+
const validFormats = ['terminal', 'json', 'html', 'markdown'];
|
|
94
|
+
if (!validFormats.includes(format)) {
|
|
95
|
+
console.error(`Error: Unknown output format "${format}". Valid: ${validFormats.join(', ')}`);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
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
|
+
}
|
|
39
121
|
if (checks) {
|
|
40
|
-
|
|
41
|
-
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()));
|
|
42
125
|
if (invalid.length > 0) {
|
|
43
126
|
console.error(`Error: Unknown check(s): ${invalid.join(', ')}`);
|
|
44
|
-
console.error(`Available checks: ${
|
|
127
|
+
console.error(`Available checks: ${allChecks.map((c) => c.meta.id).join(', ')}`);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const retries = parseInt(options.retries, 10);
|
|
132
|
+
if (isNaN(retries) || retries < 0) {
|
|
133
|
+
console.error('Error: --retries must be a non-negative integer');
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
const concurrency = parseInt(options.concurrency, 10);
|
|
137
|
+
if (isNaN(concurrency) || concurrency < 1) {
|
|
138
|
+
console.error('Error: --concurrency must be a positive integer');
|
|
139
|
+
process.exit(1);
|
|
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}`);
|
|
45
146
|
process.exit(1);
|
|
46
147
|
}
|
|
148
|
+
categoryThresholds = parsed.thresholds;
|
|
47
149
|
}
|
|
48
150
|
const baseOptions = {
|
|
49
151
|
checks,
|
|
50
152
|
timeout: parseInt(options.timeout, 10),
|
|
153
|
+
retries,
|
|
51
154
|
verbose: options.verbose,
|
|
155
|
+
profile,
|
|
52
156
|
};
|
|
53
157
|
// Load baseline if requested (fail fast before running the audit)
|
|
54
158
|
let baseline;
|
|
@@ -82,12 +186,19 @@ export function cli(argv) {
|
|
|
82
186
|
const output = applyOnlyFailures(result, options.onlyFailures);
|
|
83
187
|
report(output, format, diff);
|
|
84
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
|
+
}
|
|
85
193
|
if (diff && regressionThreshold !== undefined) {
|
|
86
194
|
const worstRegression = diff.regressions.reduce((max, c) => Math.max(max, Math.abs(c.delta)), 0);
|
|
87
195
|
if (worstRegression > regressionThreshold) {
|
|
88
196
|
process.exit(1);
|
|
89
197
|
}
|
|
90
198
|
}
|
|
199
|
+
if (categoryThresholds && failsCategoryGate(result, categoryThresholds)) {
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
91
202
|
process.exit(result.overallScore >= 70 ? 0 : 1);
|
|
92
203
|
}
|
|
93
204
|
else {
|
|
@@ -96,11 +207,14 @@ export function cli(argv) {
|
|
|
96
207
|
console.error('Error: --baseline is not supported with multiple URLs. Run single-URL audits for baseline comparison.');
|
|
97
208
|
process.exit(1);
|
|
98
209
|
}
|
|
99
|
-
const batch = await batchAudit(urls, baseOptions);
|
|
210
|
+
const batch = await batchAudit(urls, { ...baseOptions, concurrency });
|
|
100
211
|
if (options.onlyFailures) {
|
|
101
212
|
batch.reports = batch.reports.map((r) => applyOnlyFailures(r, true));
|
|
102
213
|
}
|
|
103
214
|
reportBatch(batch, format);
|
|
215
|
+
if (categoryThresholds && batch.reports.some((r) => failsCategoryGate(r, categoryThresholds))) {
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
104
218
|
process.exit(batch.summary.failed === 0 ? 0 : 1);
|
|
105
219
|
}
|
|
106
220
|
}
|
|
@@ -112,6 +226,30 @@ export function cli(argv) {
|
|
|
112
226
|
});
|
|
113
227
|
program.parse(argv);
|
|
114
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
|
+
}
|
|
115
253
|
function applyOnlyFailures(result, onlyFailures) {
|
|
116
254
|
if (!onlyFailures)
|
|
117
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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"}
|