@ucptools/validator 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/config.d.ts +20 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +114 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +17 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +45 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +170 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/service.d.ts +80 -0
- package/dist/auth/service.d.ts.map +1 -0
- package/dist/auth/service.js +298 -0
- package/dist/auth/service.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +375 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mock-server.d.ts +20 -0
- package/dist/cli/mock-server.d.ts.map +1 -0
- package/dist/cli/mock-server.js +261 -0
- package/dist/cli/mock-server.js.map +1 -0
- package/dist/compliance/compliance-generator.d.ts +34 -0
- package/dist/compliance/compliance-generator.d.ts.map +1 -0
- package/dist/compliance/compliance-generator.js +320 -0
- package/dist/compliance/compliance-generator.js.map +1 -0
- package/dist/compliance/index.d.ts +8 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +17 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/templates.d.ts +34 -0
- package/dist/compliance/templates.d.ts.map +1 -0
- package/{src/compliance/templates.ts → dist/compliance/templates.js} +117 -155
- package/dist/compliance/templates.js.map +1 -0
- package/dist/compliance/types.d.ts +64 -0
- package/dist/compliance/types.d.ts.map +1 -0
- package/dist/compliance/types.js +64 -0
- package/dist/compliance/types.js.map +1 -0
- package/dist/db/index.d.ts +17 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +80 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +3886 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +425 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/utils.d.ts +252 -0
- package/dist/db/utils.d.ts.map +1 -0
- package/dist/db/utils.js +295 -0
- package/dist/db/utils.js.map +1 -0
- package/dist/feed-analyzer/feed-analyzer.d.ts +26 -0
- package/dist/feed-analyzer/feed-analyzer.d.ts.map +1 -0
- package/{src/feed-analyzer/feed-analyzer.ts → dist/feed-analyzer/feed-analyzer.js} +856 -726
- package/dist/feed-analyzer/feed-analyzer.js.map +1 -0
- package/dist/feed-analyzer/index.d.ts +8 -0
- package/dist/feed-analyzer/index.d.ts.map +1 -0
- package/dist/feed-analyzer/index.js +19 -0
- package/dist/feed-analyzer/index.js.map +1 -0
- package/dist/feed-analyzer/types.d.ts +285 -0
- package/dist/feed-analyzer/types.d.ts.map +1 -0
- package/dist/feed-analyzer/types.js +175 -0
- package/dist/feed-analyzer/types.js.map +1 -0
- package/{src/generator/index.ts → dist/generator/index.d.ts} +1 -1
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +13 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/key-generator.d.ts +24 -0
- package/dist/generator/key-generator.d.ts.map +1 -0
- package/dist/generator/key-generator.js +144 -0
- package/dist/generator/key-generator.js.map +1 -0
- package/dist/generator/profile-builder.d.ts +15 -0
- package/dist/generator/profile-builder.d.ts.map +1 -0
- package/dist/generator/profile-builder.js +338 -0
- package/dist/generator/profile-builder.js.map +1 -0
- package/dist/hosting/artifacts-generator.d.ts +10 -0
- package/dist/hosting/artifacts-generator.d.ts.map +1 -0
- package/{src/hosting/artifacts-generator.ts → dist/hosting/artifacts-generator.js} +191 -241
- package/dist/hosting/artifacts-generator.js.map +1 -0
- package/{src/hosting/index.ts → dist/hosting/index.d.ts} +1 -1
- package/dist/hosting/index.d.ts.map +1 -0
- package/dist/hosting/index.js +10 -0
- package/dist/hosting/index.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/analytics.d.ts +337 -0
- package/dist/lib/analytics.d.ts.map +1 -0
- package/dist/lib/analytics.js +188 -0
- package/dist/lib/analytics.js.map +1 -0
- package/{src/security/index.ts → dist/security/index.d.ts} +8 -15
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +12 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/security-scanner.d.ts +10 -0
- package/dist/security/security-scanner.d.ts.map +1 -0
- package/dist/security/security-scanner.js +669 -0
- package/dist/security/security-scanner.js.map +1 -0
- package/dist/security/types.d.ts +80 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/types.js +21 -0
- package/dist/security/types.js.map +1 -0
- package/dist/services/analytics.d.ts +114 -0
- package/dist/services/analytics.d.ts.map +1 -0
- package/dist/services/analytics.js +862 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/badge.d.ts +31 -0
- package/dist/services/badge.d.ts.map +1 -0
- package/dist/services/badge.js +152 -0
- package/dist/services/badge.js.map +1 -0
- package/dist/services/cron.d.ts +125 -0
- package/dist/services/cron.d.ts.map +1 -0
- package/dist/services/cron.js +613 -0
- package/dist/services/cron.js.map +1 -0
- package/dist/services/directory.d.ts +106 -0
- package/dist/services/directory.d.ts.map +1 -0
- package/dist/services/directory.js +351 -0
- package/dist/services/directory.js.map +1 -0
- package/dist/services/email.d.ts +112 -0
- package/dist/services/email.d.ts.map +1 -0
- package/dist/services/email.js +772 -0
- package/dist/services/email.js.map +1 -0
- package/dist/services/hosted-profiles.d.ts +77 -0
- package/dist/services/hosted-profiles.d.ts.map +1 -0
- package/dist/services/hosted-profiles.js +433 -0
- package/dist/services/hosted-profiles.js.map +1 -0
- package/dist/services/latency.d.ts +67 -0
- package/dist/services/latency.d.ts.map +1 -0
- package/dist/services/latency.js +274 -0
- package/dist/services/latency.js.map +1 -0
- package/dist/services/manifest-compliance.d.ts +64 -0
- package/dist/services/manifest-compliance.d.ts.map +1 -0
- package/dist/services/manifest-compliance.js +271 -0
- package/dist/services/manifest-compliance.js.map +1 -0
- package/dist/services/monitoring-diff.d.ts +31 -0
- package/dist/services/monitoring-diff.d.ts.map +1 -0
- package/dist/services/monitoring-diff.js +189 -0
- package/dist/services/monitoring-diff.js.map +1 -0
- package/dist/services/notifications.d.ts +46 -0
- package/dist/services/notifications.d.ts.map +1 -0
- package/dist/services/notifications.js +88 -0
- package/dist/services/notifications.js.map +1 -0
- package/dist/services/stripe.d.ts +93 -0
- package/dist/services/stripe.d.ts.map +1 -0
- package/dist/services/stripe.js +490 -0
- package/dist/services/stripe.js.map +1 -0
- package/dist/services/validation-history.d.ts +99 -0
- package/dist/services/validation-history.d.ts.map +1 -0
- package/dist/services/validation-history.js +344 -0
- package/dist/services/validation-history.js.map +1 -0
- package/dist/services/validation-logging.d.ts +103 -0
- package/dist/services/validation-logging.d.ts.map +1 -0
- package/dist/services/validation-logging.js +210 -0
- package/dist/services/validation-logging.js.map +1 -0
- package/dist/services/validation.d.ts +119 -0
- package/dist/services/validation.d.ts.map +1 -0
- package/dist/services/validation.js +1185 -0
- package/dist/services/validation.js.map +1 -0
- package/dist/simulator/agent-simulator.d.ts +69 -0
- package/dist/simulator/agent-simulator.d.ts.map +1 -0
- package/dist/simulator/agent-simulator.js +870 -0
- package/dist/simulator/agent-simulator.js.map +1 -0
- package/{src/simulator/index.ts → dist/simulator/index.d.ts} +7 -7
- package/dist/simulator/index.d.ts.map +1 -0
- package/dist/simulator/index.js +23 -0
- package/dist/simulator/index.js.map +1 -0
- package/{src/simulator/types.ts → dist/simulator/types.d.ts} +171 -170
- package/dist/simulator/types.d.ts.map +1 -0
- package/dist/simulator/types.js +18 -0
- package/dist/simulator/types.js.map +1 -0
- package/dist/types/acp-validation.d.ts +87 -0
- package/dist/types/acp-validation.d.ts.map +1 -0
- package/dist/types/acp-validation.js +40 -0
- package/dist/types/acp-validation.js.map +1 -0
- package/dist/types/analytics.d.ts +182 -0
- package/dist/types/analytics.d.ts.map +1 -0
- package/dist/types/analytics.js +7 -0
- package/dist/types/analytics.js.map +1 -0
- package/dist/types/generator.d.ts +106 -0
- package/dist/types/generator.d.ts.map +1 -0
- package/dist/types/generator.js +6 -0
- package/dist/types/generator.js.map +1 -0
- package/{src/types/index.ts → dist/types/index.d.ts} +1 -1
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/ucp-profile.d.ts +111 -0
- package/dist/types/ucp-profile.d.ts.map +1 -0
- package/dist/types/ucp-profile.js +45 -0
- package/dist/types/ucp-profile.js.map +1 -0
- package/dist/types/validation.d.ts +76 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +42 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/validator/acp/index.d.ts +31 -0
- package/dist/validator/acp/index.d.ts.map +1 -0
- package/dist/validator/acp/index.js +574 -0
- package/dist/validator/acp/index.js.map +1 -0
- package/dist/validator/index.d.ts +26 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +161 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/network-validator.d.ts +28 -0
- package/dist/validator/network-validator.d.ts.map +1 -0
- package/dist/validator/network-validator.js +319 -0
- package/dist/validator/network-validator.js.map +1 -0
- package/dist/validator/rules-validator.d.ts +19 -0
- package/dist/validator/rules-validator.d.ts.map +1 -0
- package/dist/validator/rules-validator.js +306 -0
- package/dist/validator/rules-validator.js.map +1 -0
- package/dist/validator/sdk-validator.d.ts +58 -0
- package/dist/validator/sdk-validator.d.ts.map +1 -0
- package/{src/validator/sdk-validator.ts → dist/validator/sdk-validator.js} +273 -330
- package/dist/validator/sdk-validator.js.map +1 -0
- package/dist/validator/structural-validator.d.ts +11 -0
- package/dist/validator/structural-validator.d.ts.map +1 -0
- package/dist/validator/structural-validator.js +549 -0
- package/dist/validator/structural-validator.js.map +1 -0
- package/dist/validator/utils.d.ts +51 -0
- package/dist/validator/utils.d.ts.map +1 -0
- package/dist/validator/utils.js +132 -0
- package/dist/validator/utils.js.map +1 -0
- package/package.json +44 -12
- package/CLAUDE.md +0 -109
- package/api/analyze-feed.js +0 -140
- package/api/badge.js +0 -185
- package/api/benchmark.js +0 -177
- package/api/directory-stats.ts +0 -29
- package/api/directory.ts +0 -73
- package/api/generate-compliance.js +0 -143
- package/api/generate-schema.js +0 -457
- package/api/generate.js +0 -132
- package/api/security-scan.js +0 -133
- package/api/simulate.js +0 -187
- package/api/tsconfig.json +0 -10
- package/api/validate.js +0 -1351
- package/apify-actor/.actor/actor.json +0 -68
- package/apify-actor/.actor/input_schema.json +0 -32
- package/apify-actor/APIFY-STORE-LISTING.md +0 -412
- package/apify-actor/Dockerfile +0 -8
- package/apify-actor/README.md +0 -166
- package/apify-actor/main.ts +0 -111
- package/apify-actor/package.json +0 -17
- package/apify-actor/src/main.js +0 -199
- package/docs/BRAND-IDENTITY.md +0 -238
- package/docs/BRAND-STYLE-GUIDE.md +0 -356
- package/drizzle/0000_black_king_cobra.sql +0 -39
- package/drizzle/meta/0000_snapshot.json +0 -309
- package/drizzle/meta/_journal.json +0 -13
- package/drizzle.config.ts +0 -10
- package/public/.well-known/ucp +0 -25
- package/public/android-chrome-192x192.png +0 -0
- package/public/android-chrome-512x512.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/brand.css +0 -321
- package/public/directory.html +0 -701
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/guides/bigcommerce.html +0 -743
- package/public/guides/fastucp.html +0 -838
- package/public/guides/magento.html +0 -779
- package/public/guides/shopify.html +0 -726
- package/public/guides/squarespace.html +0 -749
- package/public/guides/wix.html +0 -747
- package/public/guides/woocommerce.html +0 -733
- package/public/index.html +0 -3835
- package/public/learn.html +0 -396
- package/public/logo.jpeg +0 -0
- package/public/og-image-icon.png +0 -0
- package/public/og-image.png +0 -0
- package/public/robots.txt +0 -6
- package/public/site.webmanifest +0 -31
- package/public/sitemap.xml +0 -69
- package/public/social/linkedin-banner-1128x191.png +0 -0
- package/public/social/temp.PNG +0 -0
- package/public/social/x-header-1500x500.png +0 -0
- package/public/verify.html +0 -410
- package/scripts/generate-favicons.js +0 -44
- package/scripts/generate-ico.js +0 -23
- package/scripts/generate-og-image.js +0 -45
- package/scripts/reset-db.ts +0 -77
- package/scripts/seed-db.ts +0 -71
- package/scripts/setup-benchmark-db.js +0 -70
- package/src/api/server.ts +0 -266
- package/src/cli/index.ts +0 -302
- package/src/compliance/compliance-generator.ts +0 -452
- package/src/compliance/index.ts +0 -28
- package/src/compliance/types.ts +0 -170
- package/src/db/index.ts +0 -28
- package/src/db/schema.ts +0 -84
- package/src/feed-analyzer/index.ts +0 -34
- package/src/feed-analyzer/types.ts +0 -354
- package/src/generator/key-generator.ts +0 -124
- package/src/generator/profile-builder.ts +0 -402
- package/src/index.ts +0 -105
- package/src/security/security-scanner.ts +0 -604
- package/src/security/types.ts +0 -55
- package/src/services/directory.ts +0 -434
- package/src/simulator/agent-simulator.ts +0 -941
- package/src/types/generator.ts +0 -140
- package/src/types/ucp-profile.ts +0 -140
- package/src/types/validation.ts +0 -89
- package/src/validator/index.ts +0 -194
- package/src/validator/network-validator.ts +0 -417
- package/src/validator/rules-validator.ts +0 -297
- package/src/validator/structural-validator.ts +0 -476
- package/tests/fixtures/non-compliant-profile.json +0 -25
- package/tests/fixtures/official-sample-profile.json +0 -75
- package/tests/integration/benchmark.test.ts +0 -207
- package/tests/integration/database.test.ts +0 -163
- package/tests/integration/directory-api.test.ts +0 -268
- package/tests/integration/simulate-api.test.ts +0 -230
- package/tests/integration/validate-api.test.ts +0 -269
- package/tests/setup.ts +0 -15
- package/tests/unit/agent-simulator.test.ts +0 -575
- package/tests/unit/compliance-generator.test.ts +0 -374
- package/tests/unit/directory-service.test.ts +0 -272
- package/tests/unit/feed-analyzer.test.ts +0 -517
- package/tests/unit/lint-suggestions.test.ts +0 -423
- package/tests/unit/official-samples.test.ts +0 -211
- package/tests/unit/pdf-report.test.ts +0 -390
- package/tests/unit/sdk-validator.test.ts +0 -531
- package/tests/unit/security-scanner.test.ts +0 -410
- package/tests/unit/validation.test.ts +0 -390
- package/tsconfig.json +0 -20
- package/vercel.json +0 -34
- package/vitest.config.ts +0 -22
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP Readiness Checker
|
|
3
|
+
*
|
|
4
|
+
* Checks how ready a merchant's site is for the Agentic Commerce Protocol (ACP).
|
|
5
|
+
* Unlike UCP validation (which checks a specific /.well-known/ucp file), ACP readiness
|
|
6
|
+
* is assessed by analyzing the merchant's site for:
|
|
7
|
+
*
|
|
8
|
+
* 1. Platform (Shopify/Etsy = auto-eligible for ChatGPT Instant Checkout)
|
|
9
|
+
* 2. Payment infrastructure (Stripe detection = easier ACP integration via SPT)
|
|
10
|
+
* 3. Policy pages (required in ACP checkout session `links` array: terms, privacy, return)
|
|
11
|
+
* 4. Security (HTTPS with TLS 1.2+ required by ACP spec for all endpoints)
|
|
12
|
+
*
|
|
13
|
+
* Note: ACP is a server-to-server REST API (5 checkout endpoints + delegate_payment).
|
|
14
|
+
* We cannot validate the actual API without merchant credentials, so this checker
|
|
15
|
+
* assesses surface-level readiness signals from the merchant's public site.
|
|
16
|
+
*
|
|
17
|
+
* Note: ACP product data comes from merchant-submitted feeds (CSV/JSON),
|
|
18
|
+
* not crawled homepage markup. Product data scoring is handled by the Feed Analyzer.
|
|
19
|
+
*
|
|
20
|
+
* Based on ACP spec v2026-01-30:
|
|
21
|
+
* https://github.com/agentic-commerce-protocol/agentic-commerce-protocol
|
|
22
|
+
*/
|
|
23
|
+
import type { AcpReadinessReport } from '../../types/acp-validation.js';
|
|
24
|
+
export interface AcpCheckOptions {
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check a domain's ACP readiness
|
|
29
|
+
*/
|
|
30
|
+
export declare function checkAcpReadiness(domain: string, options?: AcpCheckOptions): Promise<AcpReadinessReport>;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/validator/acp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAKnB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAyK7B"}
|
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ACP Readiness Checker
|
|
4
|
+
*
|
|
5
|
+
* Checks how ready a merchant's site is for the Agentic Commerce Protocol (ACP).
|
|
6
|
+
* Unlike UCP validation (which checks a specific /.well-known/ucp file), ACP readiness
|
|
7
|
+
* is assessed by analyzing the merchant's site for:
|
|
8
|
+
*
|
|
9
|
+
* 1. Platform (Shopify/Etsy = auto-eligible for ChatGPT Instant Checkout)
|
|
10
|
+
* 2. Payment infrastructure (Stripe detection = easier ACP integration via SPT)
|
|
11
|
+
* 3. Policy pages (required in ACP checkout session `links` array: terms, privacy, return)
|
|
12
|
+
* 4. Security (HTTPS with TLS 1.2+ required by ACP spec for all endpoints)
|
|
13
|
+
*
|
|
14
|
+
* Note: ACP is a server-to-server REST API (5 checkout endpoints + delegate_payment).
|
|
15
|
+
* We cannot validate the actual API without merchant credentials, so this checker
|
|
16
|
+
* assesses surface-level readiness signals from the merchant's public site.
|
|
17
|
+
*
|
|
18
|
+
* Note: ACP product data comes from merchant-submitted feeds (CSV/JSON),
|
|
19
|
+
* not crawled homepage markup. Product data scoring is handled by the Feed Analyzer.
|
|
20
|
+
*
|
|
21
|
+
* Based on ACP spec v2026-01-30:
|
|
22
|
+
* https://github.com/agentic-commerce-protocol/agentic-commerce-protocol
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.checkAcpReadiness = checkAcpReadiness;
|
|
26
|
+
/**
|
|
27
|
+
* Check a domain's ACP readiness
|
|
28
|
+
*/
|
|
29
|
+
async function checkAcpReadiness(domain, options = {}) {
|
|
30
|
+
const timeoutMs = options.timeoutMs || 15000;
|
|
31
|
+
const findings = [];
|
|
32
|
+
let platformDetected = null;
|
|
33
|
+
let stripeDetected = false;
|
|
34
|
+
// Fetch the homepage
|
|
35
|
+
let html = '';
|
|
36
|
+
let statusCode = 0;
|
|
37
|
+
let isHttps = false;
|
|
38
|
+
let fetchError = null;
|
|
39
|
+
try {
|
|
40
|
+
const controller = new AbortController();
|
|
41
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
42
|
+
const url = `https://${domain}`;
|
|
43
|
+
const response = await fetch(url, {
|
|
44
|
+
signal: controller.signal,
|
|
45
|
+
headers: {
|
|
46
|
+
'User-Agent': 'UCPtools-ACP-Checker/1.0 (https://ucptools.dev)',
|
|
47
|
+
'Accept': 'text/html,application/xhtml+xml',
|
|
48
|
+
},
|
|
49
|
+
redirect: 'follow',
|
|
50
|
+
});
|
|
51
|
+
clearTimeout(timer);
|
|
52
|
+
statusCode = response.status;
|
|
53
|
+
isHttps = response.url.startsWith('https://');
|
|
54
|
+
html = await response.text();
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error.name === 'AbortError') {
|
|
58
|
+
fetchError = 'timeout';
|
|
59
|
+
findings.push({
|
|
60
|
+
severity: 'error',
|
|
61
|
+
code: 'ACP_SITE_TIMEOUT',
|
|
62
|
+
category: 'security',
|
|
63
|
+
message: `Site did not respond within ${timeoutMs / 1000}s`,
|
|
64
|
+
hint: 'Ensure your server responds quickly — ACP checkout sessions require low-latency responses',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
fetchError = error.message || 'unreachable';
|
|
69
|
+
findings.push({
|
|
70
|
+
severity: 'error',
|
|
71
|
+
code: 'ACP_SITE_UNREACHABLE',
|
|
72
|
+
category: 'security',
|
|
73
|
+
message: `Could not reach ${domain} over HTTPS`,
|
|
74
|
+
hint: 'ACP requires HTTPS with TLS 1.2+. Ensure your site is accessible via https://',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (!fetchError) {
|
|
79
|
+
// === HTTPS Check ===
|
|
80
|
+
if (isHttps) {
|
|
81
|
+
findings.push({
|
|
82
|
+
severity: 'info',
|
|
83
|
+
code: 'ACP_HTTPS_OK',
|
|
84
|
+
category: 'security',
|
|
85
|
+
message: 'Site is served over HTTPS',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
findings.push({
|
|
90
|
+
severity: 'error',
|
|
91
|
+
code: 'ACP_HTTPS_MISSING',
|
|
92
|
+
category: 'security',
|
|
93
|
+
message: 'Site is not served over HTTPS',
|
|
94
|
+
hint: 'ACP spec requires all endpoints use HTTPS with TLS 1.2+',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// === Platform Detection ===
|
|
98
|
+
platformDetected = detectPlatform(html);
|
|
99
|
+
if (platformDetected === 'shopify') {
|
|
100
|
+
findings.push({
|
|
101
|
+
severity: 'info',
|
|
102
|
+
code: 'ACP_PLATFORM_SHOPIFY',
|
|
103
|
+
category: 'platform',
|
|
104
|
+
message: 'Shopify platform detected — auto-eligible for ChatGPT Instant Checkout',
|
|
105
|
+
hint: 'Shopify merchants can enable Instant Checkout through the Shopify admin — no custom ACP integration needed',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else if (platformDetected === 'etsy') {
|
|
109
|
+
findings.push({
|
|
110
|
+
severity: 'info',
|
|
111
|
+
code: 'ACP_PLATFORM_ETSY',
|
|
112
|
+
category: 'platform',
|
|
113
|
+
message: 'Etsy platform detected — already integrated with ChatGPT Instant Checkout',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
else if (platformDetected) {
|
|
117
|
+
findings.push({
|
|
118
|
+
severity: 'info',
|
|
119
|
+
code: 'ACP_PLATFORM_OTHER',
|
|
120
|
+
category: 'platform',
|
|
121
|
+
message: `${platformDetected} platform detected — custom ACP integration required`,
|
|
122
|
+
hint: 'You\'ll need to implement the Agentic Checkout API endpoints and submit a merchant application at chatgpt.com/merchants',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
findings.push({
|
|
127
|
+
severity: 'info',
|
|
128
|
+
code: 'ACP_PLATFORM_UNKNOWN',
|
|
129
|
+
category: 'platform',
|
|
130
|
+
message: 'Platform not detected — custom ACP integration required',
|
|
131
|
+
hint: 'Implement the Agentic Checkout API (5 REST endpoints) and apply at chatgpt.com/merchants',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// === Stripe Detection ===
|
|
135
|
+
stripeDetected = detectStripe(html);
|
|
136
|
+
if (stripeDetected) {
|
|
137
|
+
findings.push({
|
|
138
|
+
severity: 'info',
|
|
139
|
+
code: 'ACP_STRIPE_DETECTED',
|
|
140
|
+
category: 'payment',
|
|
141
|
+
message: 'Stripe payment infrastructure detected',
|
|
142
|
+
hint: 'Stripe is the first PSP with ACP Delegated Payment support — you can enable agentic payments with minimal code changes',
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
findings.push({
|
|
147
|
+
severity: 'warn',
|
|
148
|
+
code: 'ACP_STRIPE_NOT_DETECTED',
|
|
149
|
+
category: 'payment',
|
|
150
|
+
message: 'Stripe not detected on this page',
|
|
151
|
+
hint: 'ACP works with any PSP that implements the Delegated Payment spec — Stripe and PayPal are current partners, but Stripe\'s SPT is the easiest path',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// === Policy Pages ===
|
|
155
|
+
const policies = analyzePolicies(html, domain);
|
|
156
|
+
findings.push(...policies);
|
|
157
|
+
// === Checkout Readiness ===
|
|
158
|
+
const checkout = analyzeCheckoutReadiness(html);
|
|
159
|
+
findings.push(...checkout);
|
|
160
|
+
// === No Commerce Signals Detection ===
|
|
161
|
+
const hasAnyCommerceSignal = platformDetected || stripeDetected ||
|
|
162
|
+
findings.some(f => f.code === 'ACP_CHECKOUT_FORM_FOUND') ||
|
|
163
|
+
findings.some(f => ['ACP_TERMS_FOUND', 'ACP_PRIVACY_FOUND', 'ACP_RETURN_FOUND'].includes(f.code));
|
|
164
|
+
if (!hasAnyCommerceSignal) {
|
|
165
|
+
findings.push({
|
|
166
|
+
severity: 'info',
|
|
167
|
+
code: 'ACP_NO_COMMERCE_SIGNALS',
|
|
168
|
+
category: 'platform',
|
|
169
|
+
message: 'No e-commerce signals detected on this site',
|
|
170
|
+
hint: 'ACP readiness checks are designed for e-commerce sites with checkout functionality',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Calculate scores
|
|
175
|
+
const scoreBreakdown = calculateScores(findings, platformDetected, stripeDetected);
|
|
176
|
+
const grade = calculateGrade(scoreBreakdown.total);
|
|
177
|
+
const label = getLabel(grade);
|
|
178
|
+
const recommendations = generateRecommendations(findings, platformDetected, stripeDetected);
|
|
179
|
+
return {
|
|
180
|
+
ok: scoreBreakdown.total >= 40,
|
|
181
|
+
domain,
|
|
182
|
+
score: scoreBreakdown.total,
|
|
183
|
+
grade,
|
|
184
|
+
label,
|
|
185
|
+
score_breakdown: scoreBreakdown,
|
|
186
|
+
findings,
|
|
187
|
+
platform_detected: platformDetected,
|
|
188
|
+
stripe_detected: stripeDetected,
|
|
189
|
+
checked_at: new Date().toISOString(),
|
|
190
|
+
recommendations,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// --- Detection Helpers ---
|
|
194
|
+
function detectPlatform(html) {
|
|
195
|
+
const lower = html.toLowerCase();
|
|
196
|
+
// Require 2+ corroborating structural signals per platform.
|
|
197
|
+
// Single mentions in content text (guides, comparisons) must NOT trigger detection.
|
|
198
|
+
// Shopify: CDN, template markers, JS globals
|
|
199
|
+
const shopifySignals = [
|
|
200
|
+
lower.includes('cdn.shopify.com'),
|
|
201
|
+
lower.includes('myshopify.com'),
|
|
202
|
+
/Shopify\.theme/i.test(html),
|
|
203
|
+
lower.includes('shopify-section'),
|
|
204
|
+
/Shopify\.shop\s*=/i.test(html),
|
|
205
|
+
];
|
|
206
|
+
if (shopifySignals.filter(Boolean).length >= 2)
|
|
207
|
+
return 'shopify';
|
|
208
|
+
// Etsy: CDN + listing/shop URLs
|
|
209
|
+
const etsySignals = [
|
|
210
|
+
lower.includes('etsystatic.com'),
|
|
211
|
+
lower.includes('etsy.me'),
|
|
212
|
+
/etsy\.com\/listing/i.test(html),
|
|
213
|
+
/etsy\.com\/shop/i.test(html),
|
|
214
|
+
];
|
|
215
|
+
if (etsySignals.filter(Boolean).length >= 2)
|
|
216
|
+
return 'etsy';
|
|
217
|
+
// WooCommerce: plugin paths, WC CSS classes, REST API
|
|
218
|
+
const wooSignals = [
|
|
219
|
+
lower.includes('wp-content/plugins/woocommerce'),
|
|
220
|
+
lower.includes('wc-block-'),
|
|
221
|
+
/class="[^"]*woocommerce[^"]*"/i.test(html),
|
|
222
|
+
lower.includes('wc_ajax'),
|
|
223
|
+
lower.includes('wp-json/wc/'),
|
|
224
|
+
];
|
|
225
|
+
if (wooSignals.filter(Boolean).length >= 2)
|
|
226
|
+
return 'WooCommerce';
|
|
227
|
+
// BigCommerce: CDN + structural markers
|
|
228
|
+
const bigcommerceSignals = [
|
|
229
|
+
lower.includes('cdn11.bigcommerce.com'),
|
|
230
|
+
lower.includes('bigcommerce.com/s-'),
|
|
231
|
+
/data-content-region/i.test(html),
|
|
232
|
+
];
|
|
233
|
+
if (bigcommerceSignals.filter(Boolean).length >= 2)
|
|
234
|
+
return 'BigCommerce';
|
|
235
|
+
// Magento: framework-specific markers
|
|
236
|
+
const magentoSignals = [
|
|
237
|
+
lower.includes('mage-init'),
|
|
238
|
+
lower.includes('requirejs/require'),
|
|
239
|
+
lower.includes('/static/version'),
|
|
240
|
+
lower.includes('catalog/product/view'),
|
|
241
|
+
];
|
|
242
|
+
if (magentoSignals.filter(Boolean).length >= 2)
|
|
243
|
+
return 'Magento';
|
|
244
|
+
// Squarespace: CDN domains + structural CSS
|
|
245
|
+
const squarespaceSignals = [
|
|
246
|
+
lower.includes('static1.squarespace.com'),
|
|
247
|
+
lower.includes('squarespace-cdn.com'),
|
|
248
|
+
/class="[^"]*sqs-block[^"]*"/i.test(html),
|
|
249
|
+
];
|
|
250
|
+
if (squarespaceSignals.filter(Boolean).length >= 2)
|
|
251
|
+
return 'Squarespace';
|
|
252
|
+
// Wix: CDN domains + SDK
|
|
253
|
+
const wixSignals = [
|
|
254
|
+
lower.includes('parastorage.com'),
|
|
255
|
+
lower.includes('wixsite.com'),
|
|
256
|
+
lower.includes('static.wixstatic.com'),
|
|
257
|
+
lower.includes('wix-code-sdk'),
|
|
258
|
+
];
|
|
259
|
+
if (wixSignals.filter(Boolean).length >= 2)
|
|
260
|
+
return 'Wix';
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
function detectStripe(html) {
|
|
264
|
+
// Only match actual Stripe.js integration signals, not generic CSS classes
|
|
265
|
+
if (html.includes('js.stripe.com'))
|
|
266
|
+
return true;
|
|
267
|
+
if (html.includes('Stripe(') && html.includes('data-stripe'))
|
|
268
|
+
return true;
|
|
269
|
+
if (html.includes('stripe-payment-element') || html.includes('stripe-card-element'))
|
|
270
|
+
return true;
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
function analyzePolicies(html, _domain) {
|
|
274
|
+
const findings = [];
|
|
275
|
+
const lower = html.toLowerCase();
|
|
276
|
+
// ACP spec requires links array with terms_of_use, privacy_policy, return_policy
|
|
277
|
+
// Anchor href patterns to terminal path segments to avoid false positives
|
|
278
|
+
const termsPatterns = [
|
|
279
|
+
/terms[- ]of[- ](use|service)/i,
|
|
280
|
+
/terms[- ]and[- ]conditions/i,
|
|
281
|
+
/href=["'][^"']*\/(terms-of-(use|service)|terms-and-conditions|tos)\/?["']/i,
|
|
282
|
+
/href=["'][^"']*\/terms\/?["']/i,
|
|
283
|
+
];
|
|
284
|
+
const hasTOS = termsPatterns.some(p => p.test(html));
|
|
285
|
+
if (hasTOS) {
|
|
286
|
+
findings.push({
|
|
287
|
+
severity: 'info',
|
|
288
|
+
code: 'ACP_TERMS_FOUND',
|
|
289
|
+
category: 'policies',
|
|
290
|
+
message: 'Terms of Use/Service page detected',
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
findings.push({
|
|
295
|
+
severity: 'warn',
|
|
296
|
+
code: 'ACP_TERMS_MISSING',
|
|
297
|
+
category: 'policies',
|
|
298
|
+
message: 'No Terms of Use/Service link found',
|
|
299
|
+
hint: 'ACP checkout sessions require a "terms_of_use" link in the response — ensure you have a terms page',
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
const privacyPatterns = [
|
|
303
|
+
/privacy[- ]policy/i,
|
|
304
|
+
/href=["'][^"']*\/(privacy-policy|privacy)\/?["']/i,
|
|
305
|
+
];
|
|
306
|
+
const hasPrivacy = privacyPatterns.some(p => p.test(html));
|
|
307
|
+
if (hasPrivacy) {
|
|
308
|
+
findings.push({
|
|
309
|
+
severity: 'info',
|
|
310
|
+
code: 'ACP_PRIVACY_FOUND',
|
|
311
|
+
category: 'policies',
|
|
312
|
+
message: 'Privacy Policy page detected',
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
findings.push({
|
|
317
|
+
severity: 'warn',
|
|
318
|
+
code: 'ACP_PRIVACY_MISSING',
|
|
319
|
+
category: 'policies',
|
|
320
|
+
message: 'No Privacy Policy link found',
|
|
321
|
+
hint: 'ACP checkout sessions include a "privacy_policy" link — ensure you have a privacy policy page',
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
const returnPatterns = [
|
|
325
|
+
/return[- ]policy/i,
|
|
326
|
+
/refund[- ]policy/i,
|
|
327
|
+
/returns[- ](&|and)[- ]exchanges/i,
|
|
328
|
+
/href=["'][^"']*\/(return-policy|refund-policy|returns|refunds)\/?["']/i,
|
|
329
|
+
];
|
|
330
|
+
const hasReturn = returnPatterns.some(p => p.test(html));
|
|
331
|
+
if (hasReturn) {
|
|
332
|
+
findings.push({
|
|
333
|
+
severity: 'info',
|
|
334
|
+
code: 'ACP_RETURN_FOUND',
|
|
335
|
+
category: 'policies',
|
|
336
|
+
message: 'Return/Refund Policy page detected',
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
findings.push({
|
|
341
|
+
severity: 'warn',
|
|
342
|
+
code: 'ACP_RETURN_MISSING',
|
|
343
|
+
category: 'policies',
|
|
344
|
+
message: 'No Return/Refund Policy link found',
|
|
345
|
+
hint: 'ACP checkout sessions include a "return_policy" link — ensure you have a return policy page',
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
return findings;
|
|
349
|
+
}
|
|
350
|
+
function analyzeCheckoutReadiness(html) {
|
|
351
|
+
const findings = [];
|
|
352
|
+
const lower = html.toLowerCase();
|
|
353
|
+
// Require structural HTML signals (attributes, form actions, platform-specific classes)
|
|
354
|
+
// NOT content text that merely mentions checkout/cart
|
|
355
|
+
const hasCheckout = /class="[^"]*add[_-]to[_-]cart[^"]*"/i.test(html) ||
|
|
356
|
+
/id="[^"]*add[_-]to[_-]cart[^"]*"/i.test(html) ||
|
|
357
|
+
/name="add_to_cart"/i.test(html) ||
|
|
358
|
+
lower.includes('action="/cart') ||
|
|
359
|
+
lower.includes('action="/checkout') ||
|
|
360
|
+
/data-action="[^"]*add[_-]to[_-]cart[^"]*"/i.test(html) ||
|
|
361
|
+
lower.includes('wc-block-cart') ||
|
|
362
|
+
lower.includes('shopify-buy-button');
|
|
363
|
+
if (hasCheckout) {
|
|
364
|
+
findings.push({
|
|
365
|
+
severity: 'info',
|
|
366
|
+
code: 'ACP_CHECKOUT_FORM_FOUND',
|
|
367
|
+
category: 'checkout',
|
|
368
|
+
message: 'E-commerce checkout functionality detected',
|
|
369
|
+
hint: 'Your site has checkout capabilities — the ACP Agentic Checkout Spec defines 5 REST endpoints you need to implement',
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
findings.push({
|
|
374
|
+
severity: 'warn',
|
|
375
|
+
code: 'ACP_CHECKOUT_FORM_MISSING',
|
|
376
|
+
category: 'checkout',
|
|
377
|
+
message: 'No checkout functionality detected on homepage',
|
|
378
|
+
hint: 'ACP requires checkout endpoints (POST /checkout_sessions, etc.) — ensure your site has e-commerce functionality',
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
return findings;
|
|
382
|
+
}
|
|
383
|
+
// --- Scoring ---
|
|
384
|
+
function calculateScores(findings, platform, stripe) {
|
|
385
|
+
// Security: always calculated first (needed for early return)
|
|
386
|
+
let securityScore = 0;
|
|
387
|
+
let securityStatus = 'Issues';
|
|
388
|
+
let securityDetails = 'Security issues detected';
|
|
389
|
+
const hasHttps = findings.some(f => f.code === 'ACP_HTTPS_OK');
|
|
390
|
+
const isUnreachable = findings.some(f => f.code === 'ACP_SITE_UNREACHABLE' || f.code === 'ACP_SITE_TIMEOUT');
|
|
391
|
+
if (hasHttps) {
|
|
392
|
+
securityScore = 20;
|
|
393
|
+
securityStatus = 'OK';
|
|
394
|
+
securityDetails = 'HTTPS enabled with TLS';
|
|
395
|
+
}
|
|
396
|
+
else if (isUnreachable) {
|
|
397
|
+
securityStatus = 'Unreachable';
|
|
398
|
+
securityDetails = 'Site could not be reached';
|
|
399
|
+
}
|
|
400
|
+
// Check for policies (needed for no-commerce-signals check)
|
|
401
|
+
const hasTOS = findings.some(f => f.code === 'ACP_TERMS_FOUND');
|
|
402
|
+
const hasPrivacy = findings.some(f => f.code === 'ACP_PRIVACY_FOUND');
|
|
403
|
+
const hasReturn = findings.some(f => f.code === 'ACP_RETURN_FOUND');
|
|
404
|
+
const foundPolicies = [hasTOS, hasPrivacy, hasReturn].filter(Boolean).length;
|
|
405
|
+
// If no commerce signals at all, cap score to security only
|
|
406
|
+
const hasCheckoutSignal = findings.some(f => f.code === 'ACP_CHECKOUT_FORM_FOUND');
|
|
407
|
+
if (!platform && !stripe && !hasCheckoutSignal && foundPolicies === 0) {
|
|
408
|
+
return {
|
|
409
|
+
platform: { score: 0, maxScore: 25, status: 'Not detected', details: 'No e-commerce platform detected' },
|
|
410
|
+
payment: { score: 0, maxScore: 30, status: 'Not detected', details: 'No payment infrastructure detected' },
|
|
411
|
+
policies: { score: 0, maxScore: 25, status: 'Missing', details: 'No policy pages found' },
|
|
412
|
+
security: { score: securityScore, maxScore: 20, status: securityStatus, details: securityDetails },
|
|
413
|
+
total: securityScore,
|
|
414
|
+
maxTotal: 100,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
// Platform: 0-25 points
|
|
418
|
+
let platformScore = 0;
|
|
419
|
+
let platformStatus = 'Not detected';
|
|
420
|
+
let platformDetails = 'Unknown platform — custom ACP integration required';
|
|
421
|
+
if (platform === 'shopify') {
|
|
422
|
+
platformScore = 25;
|
|
423
|
+
platformStatus = 'Auto-eligible';
|
|
424
|
+
platformDetails = 'Shopify — auto-eligible for ChatGPT Instant Checkout';
|
|
425
|
+
}
|
|
426
|
+
else if (platform === 'etsy') {
|
|
427
|
+
platformScore = 25;
|
|
428
|
+
platformStatus = 'Integrated';
|
|
429
|
+
platformDetails = 'Etsy — already integrated with ChatGPT';
|
|
430
|
+
}
|
|
431
|
+
else if (platform) {
|
|
432
|
+
platformScore = 12;
|
|
433
|
+
platformStatus = 'Detected';
|
|
434
|
+
platformDetails = `${platform} — custom ACP integration needed`;
|
|
435
|
+
}
|
|
436
|
+
// Payment: 0-30 points
|
|
437
|
+
let paymentScore = 0;
|
|
438
|
+
let paymentStatus = 'Not detected';
|
|
439
|
+
let paymentDetails = 'No Stripe integration detected';
|
|
440
|
+
if (stripe) {
|
|
441
|
+
paymentScore = 30;
|
|
442
|
+
paymentStatus = 'Ready';
|
|
443
|
+
paymentDetails = 'Stripe detected — Shared Payment Token ready';
|
|
444
|
+
}
|
|
445
|
+
else if (platform === 'shopify' || platform === 'etsy') {
|
|
446
|
+
// Shopify/Etsy handle payment through their platform
|
|
447
|
+
paymentScore = 24;
|
|
448
|
+
paymentStatus = 'Platform-managed';
|
|
449
|
+
paymentDetails = 'Payment handled by platform';
|
|
450
|
+
}
|
|
451
|
+
// Policies: 0-25 points (hasTOS, hasPrivacy, hasReturn, foundPolicies already computed above)
|
|
452
|
+
let policyScore = 0;
|
|
453
|
+
let policyStatus = 'Missing';
|
|
454
|
+
let policyDetails = 'No policy pages found';
|
|
455
|
+
policyScore = foundPolicies * 8;
|
|
456
|
+
if (foundPolicies === 3) {
|
|
457
|
+
policyScore = 25; // Bonus point for having all three
|
|
458
|
+
policyStatus = 'Complete';
|
|
459
|
+
policyDetails = 'Terms, privacy, and return policies found';
|
|
460
|
+
}
|
|
461
|
+
else if (foundPolicies > 0) {
|
|
462
|
+
policyStatus = 'Partial';
|
|
463
|
+
const missing = [];
|
|
464
|
+
if (!hasTOS)
|
|
465
|
+
missing.push('terms');
|
|
466
|
+
if (!hasPrivacy)
|
|
467
|
+
missing.push('privacy');
|
|
468
|
+
if (!hasReturn)
|
|
469
|
+
missing.push('return');
|
|
470
|
+
policyDetails = `Missing: ${missing.join(', ')} policy`;
|
|
471
|
+
}
|
|
472
|
+
// Security: already computed above (securityScore, securityStatus, securityDetails)
|
|
473
|
+
const total = platformScore + paymentScore + policyScore + securityScore;
|
|
474
|
+
return {
|
|
475
|
+
platform: { score: platformScore, maxScore: 25, status: platformStatus, details: platformDetails },
|
|
476
|
+
payment: { score: paymentScore, maxScore: 30, status: paymentStatus, details: paymentDetails },
|
|
477
|
+
policies: { score: policyScore, maxScore: 25, status: policyStatus, details: policyDetails },
|
|
478
|
+
security: { score: securityScore, maxScore: 20, status: securityStatus, details: securityDetails },
|
|
479
|
+
total,
|
|
480
|
+
maxTotal: 100,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
function calculateGrade(score) {
|
|
484
|
+
if (score >= 80)
|
|
485
|
+
return 'A';
|
|
486
|
+
if (score >= 60)
|
|
487
|
+
return 'B';
|
|
488
|
+
if (score >= 40)
|
|
489
|
+
return 'C';
|
|
490
|
+
if (score >= 20)
|
|
491
|
+
return 'D';
|
|
492
|
+
return 'F';
|
|
493
|
+
}
|
|
494
|
+
function getLabel(grade) {
|
|
495
|
+
switch (grade) {
|
|
496
|
+
case 'A': return 'ACP Ready';
|
|
497
|
+
case 'B': return 'Mostly Ready';
|
|
498
|
+
case 'C': return 'Partially Ready';
|
|
499
|
+
case 'D': return 'Significant Gaps';
|
|
500
|
+
case 'F': return 'Not Ready';
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
function generateRecommendations(findings, platform, stripe) {
|
|
504
|
+
// Short-circuit for non-commerce sites
|
|
505
|
+
const hasAnyCommerceSignal = findings.some(f => ['ACP_PLATFORM_SHOPIFY', 'ACP_PLATFORM_ETSY', 'ACP_PLATFORM_OTHER',
|
|
506
|
+
'ACP_STRIPE_DETECTED', 'ACP_CHECKOUT_FORM_FOUND'].includes(f.code));
|
|
507
|
+
if (!hasAnyCommerceSignal) {
|
|
508
|
+
return [{
|
|
509
|
+
priority: 'low',
|
|
510
|
+
title: 'Not an e-commerce site',
|
|
511
|
+
description: 'No e-commerce platform, payment processor, or checkout functionality was detected.',
|
|
512
|
+
action: 'ACP readiness is designed for online stores. If this is a store, ensure your homepage includes platform-specific markup.',
|
|
513
|
+
}];
|
|
514
|
+
}
|
|
515
|
+
const recs = [];
|
|
516
|
+
// Platform-specific recommendations
|
|
517
|
+
if (platform === 'shopify') {
|
|
518
|
+
recs.push({
|
|
519
|
+
priority: 'high',
|
|
520
|
+
title: 'Enable ChatGPT Instant Checkout in Shopify',
|
|
521
|
+
description: 'As a Shopify merchant, you\'re auto-eligible for ChatGPT Instant Checkout. Enable it through your Shopify admin panel.',
|
|
522
|
+
action: 'Go to Shopify Admin → Sales Channels to enable ChatGPT integration',
|
|
523
|
+
link: 'https://chatgpt.com/merchants/',
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
else if (platform !== 'etsy') {
|
|
527
|
+
recs.push({
|
|
528
|
+
priority: 'critical',
|
|
529
|
+
title: 'Apply for ChatGPT Instant Checkout',
|
|
530
|
+
description: 'Non-platform merchants need to submit a merchant application to OpenAI and implement the Agentic Checkout API.',
|
|
531
|
+
action: 'Apply at chatgpt.com/merchants and implement the 5 ACP checkout endpoints',
|
|
532
|
+
link: 'https://chatgpt.com/merchants/',
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
// Payment recommendations
|
|
536
|
+
if (!stripe && platform !== 'shopify' && platform !== 'etsy') {
|
|
537
|
+
recs.push({
|
|
538
|
+
priority: 'high',
|
|
539
|
+
title: 'Set up Stripe for delegated payments',
|
|
540
|
+
description: 'Stripe\'s Shared Payment Token is the first implementation of the ACP Delegated Payment spec. Merchants already on Stripe can enable agentic payments with minimal code.',
|
|
541
|
+
action: 'Set up Stripe Connect and enable operator payment delegation',
|
|
542
|
+
link: 'https://docs.stripe.com/agentic-commerce',
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
// Product feed recommendation (ACP uses merchant-submitted feeds, not crawled data)
|
|
546
|
+
recs.push({
|
|
547
|
+
priority: 'medium',
|
|
548
|
+
title: 'Prepare your product feed',
|
|
549
|
+
description: 'ChatGPT uses merchant-submitted product feeds (CSV/JSON) — not crawled website data. Submit your feed through chatgpt.com/merchants.',
|
|
550
|
+
action: 'Prepare a product feed with titles, prices, images, and availability, then submit via the merchant portal',
|
|
551
|
+
link: 'https://developers.openai.com/commerce/guides/get-started/',
|
|
552
|
+
});
|
|
553
|
+
// Policy recommendations
|
|
554
|
+
const missingPolicies = findings.filter(f => f.category === 'policies' && f.severity === 'warn');
|
|
555
|
+
if (missingPolicies.length > 0) {
|
|
556
|
+
recs.push({
|
|
557
|
+
priority: 'medium',
|
|
558
|
+
title: 'Add missing policy pages',
|
|
559
|
+
description: 'ACP checkout responses must include links to terms of use, privacy policy, and return policy.',
|
|
560
|
+
action: `Create and link the missing policy page(s): ${missingPolicies.map(f => f.code.replace('ACP_', '').replace('_MISSING', '')).join(', ').toLowerCase()}`,
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
// HTTPS recommendation
|
|
564
|
+
if (findings.some(f => f.code === 'ACP_HTTPS_MISSING')) {
|
|
565
|
+
recs.push({
|
|
566
|
+
priority: 'critical',
|
|
567
|
+
title: 'Enable HTTPS',
|
|
568
|
+
description: 'ACP requires all endpoints to use HTTPS with TLS 1.2 or higher. Your site is not accessible via HTTPS.',
|
|
569
|
+
action: 'Install an SSL certificate and redirect all HTTP traffic to HTTPS',
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
return recs;
|
|
573
|
+
}
|
|
574
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validator/acp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UCP Profile Validator
|
|
3
|
+
* Main entry point combining structural, rules, and network validation
|
|
4
|
+
*/
|
|
5
|
+
import type { ValidationReport, ValidationOptions } from '../types/validation.js';
|
|
6
|
+
export { validateStructure } from './structural-validator.js';
|
|
7
|
+
export { validateRules } from './rules-validator.js';
|
|
8
|
+
export { validateNetwork, validateRemoteProfile, clearSchemaCache } from './network-validator.js';
|
|
9
|
+
export { safeValidateWithSdk, validateWithSdk, getSdkVersion, isSdkCompliant, validateServiceWithSdk, validateCapabilityWithSdk, validateSigningKeysWithSdk, } from './sdk-validator.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validate a UCP profile (local JSON)
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateProfile(profile: unknown, options?: ValidationOptions): Promise<ValidationReport>;
|
|
14
|
+
/**
|
|
15
|
+
* Validate a remote UCP profile (fetches from domain)
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateRemote(domain: string, options?: ValidationOptions): Promise<ValidationReport>;
|
|
18
|
+
/**
|
|
19
|
+
* Quick validation (structural + rules only, no network)
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateQuick(profile: unknown): ValidationReport;
|
|
22
|
+
/**
|
|
23
|
+
* Parse and validate JSON string
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateJsonString(json: string, options?: ValidationOptions): Promise<ValidationReport>;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|