@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,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* UCP Rules Validator
|
|
4
|
+
* Validates UCP-specific business rules (no network calls)
|
|
5
|
+
*
|
|
6
|
+
* Updated per UCP Specification 2026-01-11:
|
|
7
|
+
* - Namespace-to-origin binding validation (security requirement)
|
|
8
|
+
* - Extension chain validation
|
|
9
|
+
* - Transport-specific field validation (schema, endpoint requirements)
|
|
10
|
+
* - HTTPS endpoint validation
|
|
11
|
+
*
|
|
12
|
+
* Note: signing_keys and payment.handlers are now validated in structural-validator.ts
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.validateRules = validateRules;
|
|
16
|
+
const validation_js_1 = require("../types/validation.js");
|
|
17
|
+
const ucp_profile_js_1 = require("../types/ucp-profile.js");
|
|
18
|
+
const utils_js_1 = require("./utils.js");
|
|
19
|
+
/**
|
|
20
|
+
* Validate UCP business rules
|
|
21
|
+
*/
|
|
22
|
+
function validateRules(profile) {
|
|
23
|
+
const issues = [];
|
|
24
|
+
// Validate namespace/origin binding for capabilities
|
|
25
|
+
issues.push(...validateNamespaceOrigins(profile));
|
|
26
|
+
// Validate extension chains (no orphaned extends)
|
|
27
|
+
issues.push(...validateExtensions(profile));
|
|
28
|
+
// Validate endpoint rules and transport-specific requirements
|
|
29
|
+
issues.push(...validateEndpoints(profile));
|
|
30
|
+
// Note: signing_keys validation is now handled in structural validator
|
|
31
|
+
// (required for all profiles per UCP spec 2026-01-11, not just Order capability)
|
|
32
|
+
return issues;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validate namespace and URL origin binding
|
|
36
|
+
* - dev.ucp.* capabilities must have spec/schema from ucp.dev
|
|
37
|
+
* - com.vendor.* capabilities must have spec/schema from vendor's domain
|
|
38
|
+
*/
|
|
39
|
+
function validateNamespaceOrigins(profile) {
|
|
40
|
+
const issues = [];
|
|
41
|
+
const capabilities = (0, utils_js_1.normalizeCapabilities)(profile.ucp.capabilities);
|
|
42
|
+
for (let i = 0; i < capabilities.length; i++) {
|
|
43
|
+
const cap = capabilities[i];
|
|
44
|
+
const path = `$.ucp.capabilities["${cap.name}"]`;
|
|
45
|
+
// Check dev.ucp.* namespace
|
|
46
|
+
if (cap.name.startsWith(ucp_profile_js_1.CAPABILITY_NAMESPACES.UCP_OFFICIAL)) {
|
|
47
|
+
// Spec must be from ucp.dev
|
|
48
|
+
if (cap.spec && !isUcpDevOrigin(cap.spec)) {
|
|
49
|
+
issues.push({
|
|
50
|
+
severity: 'error',
|
|
51
|
+
code: validation_js_1.ValidationErrorCodes.NS_ORIGIN_MISMATCH,
|
|
52
|
+
path: `${path}.spec`,
|
|
53
|
+
message: `dev.ucp.* capability spec must be hosted on ucp.dev`,
|
|
54
|
+
hint: `Use https://ucp.dev/specification/... instead of "${cap.spec}"`,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Schema must be from ucp.dev
|
|
58
|
+
if (cap.schema && !isUcpDevOrigin(cap.schema)) {
|
|
59
|
+
issues.push({
|
|
60
|
+
severity: 'error',
|
|
61
|
+
code: validation_js_1.ValidationErrorCodes.NS_ORIGIN_MISMATCH,
|
|
62
|
+
path: `${path}.schema`,
|
|
63
|
+
message: `dev.ucp.* capability schema must be hosted on ucp.dev`,
|
|
64
|
+
hint: `Use https://ucp.dev/schemas/... instead of "${cap.schema}"`,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Check vendor namespace (com.vendor.*)
|
|
69
|
+
if (cap.name.startsWith(ucp_profile_js_1.CAPABILITY_NAMESPACES.VENDOR_PREFIX)) {
|
|
70
|
+
const vendorDomain = extractVendorDomain(cap.name);
|
|
71
|
+
if (vendorDomain) {
|
|
72
|
+
// Spec origin should match vendor domain
|
|
73
|
+
if (cap.spec && !isOriginFromDomain(cap.spec, vendorDomain)) {
|
|
74
|
+
issues.push({
|
|
75
|
+
severity: 'warn',
|
|
76
|
+
code: validation_js_1.ValidationErrorCodes.NS_ORIGIN_MISMATCH,
|
|
77
|
+
path: `${path}.spec`,
|
|
78
|
+
message: `Vendor capability spec should be hosted on vendor's domain (${vendorDomain})`,
|
|
79
|
+
hint: `Consider hosting spec at https://${vendorDomain}/...`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// Schema origin should match vendor domain
|
|
83
|
+
if (cap.schema && !isOriginFromDomain(cap.schema, vendorDomain)) {
|
|
84
|
+
issues.push({
|
|
85
|
+
severity: 'warn',
|
|
86
|
+
code: validation_js_1.ValidationErrorCodes.NS_ORIGIN_MISMATCH,
|
|
87
|
+
path: `${path}.schema`,
|
|
88
|
+
message: `Vendor capability schema should be hosted on vendor's domain (${vendorDomain})`,
|
|
89
|
+
hint: `Consider hosting schema at https://${vendorDomain}/...`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return issues;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Validate extension chains - ensure parent capabilities exist
|
|
99
|
+
*/
|
|
100
|
+
function validateExtensions(profile) {
|
|
101
|
+
const issues = [];
|
|
102
|
+
const capabilities = (0, utils_js_1.normalizeCapabilities)(profile.ucp.capabilities);
|
|
103
|
+
// Build set of capability names
|
|
104
|
+
const capabilityNames = new Set(capabilities.map(c => c.name));
|
|
105
|
+
for (const cap of capabilities) {
|
|
106
|
+
if (cap.extends) {
|
|
107
|
+
// Check if parent capability exists in this profile
|
|
108
|
+
if (!capabilityNames.has(cap.extends)) {
|
|
109
|
+
issues.push({
|
|
110
|
+
severity: 'error',
|
|
111
|
+
code: validation_js_1.ValidationErrorCodes.ORPHANED_EXTENSION,
|
|
112
|
+
path: `$.ucp.capabilities["${cap.name}"].extends`,
|
|
113
|
+
message: `Extension "${cap.name}" references non-existent parent capability "${cap.extends}"`,
|
|
114
|
+
hint: `Add "${cap.extends}" to capabilities or remove the extends field`,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return issues;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Validate endpoint rules and transport-specific requirements (per UCP spec 2026-01-11)
|
|
123
|
+
*/
|
|
124
|
+
function validateEndpoints(profile) {
|
|
125
|
+
const issues = [];
|
|
126
|
+
const normalizedServices = (0, utils_js_1.normalizeServices)(profile.ucp.services);
|
|
127
|
+
for (const { name: serviceName, service } of normalizedServices) {
|
|
128
|
+
const basePath = `$.ucp.services["${serviceName}"]`;
|
|
129
|
+
// Validate REST transport (requires schema and endpoint)
|
|
130
|
+
if (service.rest) {
|
|
131
|
+
if (!service.rest.schema) {
|
|
132
|
+
issues.push({
|
|
133
|
+
severity: 'error',
|
|
134
|
+
code: validation_js_1.ValidationErrorCodes.REST_MISSING_SCHEMA,
|
|
135
|
+
path: `${basePath}.rest.schema`,
|
|
136
|
+
message: `Service "${serviceName}" REST transport missing required "schema" field`,
|
|
137
|
+
hint: 'Add schema URL pointing to OpenAPI 3.x specification',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (!service.rest.endpoint) {
|
|
141
|
+
issues.push({
|
|
142
|
+
severity: 'error',
|
|
143
|
+
code: validation_js_1.ValidationErrorCodes.REST_MISSING_ENDPOINT,
|
|
144
|
+
path: `${basePath}.rest.endpoint`,
|
|
145
|
+
message: `Service "${serviceName}" REST transport missing required "endpoint" field`,
|
|
146
|
+
hint: 'Add endpoint URL (base URL for REST API)',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
issues.push(...validateEndpoint(service.rest.endpoint, `${basePath}.rest.endpoint`));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Validate MCP transport (requires schema and endpoint)
|
|
154
|
+
if (service.mcp) {
|
|
155
|
+
if (!service.mcp.schema) {
|
|
156
|
+
issues.push({
|
|
157
|
+
severity: 'error',
|
|
158
|
+
code: validation_js_1.ValidationErrorCodes.MCP_MISSING_SCHEMA,
|
|
159
|
+
path: `${basePath}.mcp.schema`,
|
|
160
|
+
message: `Service "${serviceName}" MCP transport missing required "schema" field`,
|
|
161
|
+
hint: 'Add schema URL pointing to OpenRPC specification',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
if (!service.mcp.endpoint) {
|
|
165
|
+
issues.push({
|
|
166
|
+
severity: 'error',
|
|
167
|
+
code: validation_js_1.ValidationErrorCodes.MCP_MISSING_ENDPOINT,
|
|
168
|
+
path: `${basePath}.mcp.endpoint`,
|
|
169
|
+
message: `Service "${serviceName}" MCP transport missing required "endpoint" field`,
|
|
170
|
+
hint: 'Add endpoint URL (base URL for MCP server)',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
issues.push(...validateEndpoint(service.mcp.endpoint, `${basePath}.mcp.endpoint`));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Validate A2A transport (requires agentCard with Agent Card URL)
|
|
178
|
+
if (service.a2a) {
|
|
179
|
+
if (!service.a2a.agentCard) {
|
|
180
|
+
issues.push({
|
|
181
|
+
severity: 'error',
|
|
182
|
+
code: validation_js_1.ValidationErrorCodes.A2A_MISSING_ENDPOINT,
|
|
183
|
+
path: `${basePath}.a2a.agentCard`,
|
|
184
|
+
message: `Service "${serviceName}" A2A transport missing required "agentCard" field`,
|
|
185
|
+
hint: 'Add agentCard URL pointing to Agent Card',
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
issues.push(...validateEndpoint(service.a2a.agentCard, `${basePath}.a2a.agentCard`));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Validate EP (Embedded/Plugin) transport (requires schema)
|
|
193
|
+
if (service.embedded) {
|
|
194
|
+
if (!service.embedded.schema) {
|
|
195
|
+
issues.push({
|
|
196
|
+
severity: 'error',
|
|
197
|
+
code: validation_js_1.ValidationErrorCodes.EP_MISSING_SCHEMA,
|
|
198
|
+
path: `${basePath}.embedded.schema`,
|
|
199
|
+
message: `Service "${serviceName}" Embedded transport missing required "schema" field`,
|
|
200
|
+
hint: 'Add schema URL pointing to OpenRPC specification',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return issues;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Validate a single endpoint URL
|
|
209
|
+
*/
|
|
210
|
+
function validateEndpoint(endpoint, path) {
|
|
211
|
+
const issues = [];
|
|
212
|
+
// Must be HTTPS
|
|
213
|
+
if (!endpoint.startsWith('https://')) {
|
|
214
|
+
issues.push({
|
|
215
|
+
severity: 'error',
|
|
216
|
+
code: validation_js_1.ValidationErrorCodes.ENDPOINT_NOT_HTTPS,
|
|
217
|
+
path,
|
|
218
|
+
message: `Endpoint must use HTTPS`,
|
|
219
|
+
hint: `Change "${endpoint}" to use https://`,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
// Should not have trailing slash
|
|
223
|
+
if (endpoint.endsWith('/')) {
|
|
224
|
+
issues.push({
|
|
225
|
+
severity: 'warn',
|
|
226
|
+
code: validation_js_1.ValidationErrorCodes.ENDPOINT_TRAILING_SLASH,
|
|
227
|
+
path,
|
|
228
|
+
message: `Endpoint should not have a trailing slash`,
|
|
229
|
+
hint: `Remove trailing slash from "${endpoint}"`,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
// Check for private IP ranges (basic check)
|
|
233
|
+
if (isPrivateIpEndpoint(endpoint)) {
|
|
234
|
+
issues.push({
|
|
235
|
+
severity: 'warn',
|
|
236
|
+
code: validation_js_1.ValidationErrorCodes.PRIVATE_IP_ENDPOINT,
|
|
237
|
+
path,
|
|
238
|
+
message: `Endpoint appears to use a private IP address`,
|
|
239
|
+
hint: `Use a public domain name for production profiles`,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
return issues;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Check if URL is from ucp.dev origin
|
|
246
|
+
*/
|
|
247
|
+
function isUcpDevOrigin(url) {
|
|
248
|
+
try {
|
|
249
|
+
const parsed = new URL(url);
|
|
250
|
+
return parsed.hostname === 'ucp.dev' || parsed.hostname.endsWith('.ucp.dev');
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Extract vendor domain from capability name
|
|
258
|
+
* e.g., "com.example.feature" -> "example.com"
|
|
259
|
+
*/
|
|
260
|
+
function extractVendorDomain(name) {
|
|
261
|
+
if (!name.startsWith('com.')) {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
const parts = name.split('.');
|
|
265
|
+
if (parts.length < 3) {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
// "com.example.feature" -> "example.com"
|
|
269
|
+
return `${parts[1]}.com`;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Check if URL origin matches expected domain
|
|
273
|
+
*/
|
|
274
|
+
function isOriginFromDomain(url, domain) {
|
|
275
|
+
try {
|
|
276
|
+
const parsed = new URL(url);
|
|
277
|
+
return parsed.hostname === domain || parsed.hostname.endsWith(`.${domain}`);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Check if endpoint uses private IP address
|
|
285
|
+
*/
|
|
286
|
+
function isPrivateIpEndpoint(endpoint) {
|
|
287
|
+
try {
|
|
288
|
+
const parsed = new URL(endpoint);
|
|
289
|
+
const hostname = parsed.hostname;
|
|
290
|
+
// Check for localhost
|
|
291
|
+
if (hostname === 'localhost' || hostname === '127.0.0.1') {
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
294
|
+
// Check for private IP ranges (simplified)
|
|
295
|
+
if (hostname.startsWith('10.') ||
|
|
296
|
+
hostname.startsWith('192.168.') ||
|
|
297
|
+
hostname.match(/^172\.(1[6-9]|2[0-9]|3[0-1])\./)) {
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=rules-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules-validator.js","sourceRoot":"","sources":["../../src/validator/rules-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK-based Validator
|
|
3
|
+
* Validates UCP profiles using the official @ucp-js/sdk Zod schemas
|
|
4
|
+
*
|
|
5
|
+
* This provides spec-compliant validation using the official UCP SDK,
|
|
6
|
+
* ensuring alignment with the latest UCP specification.
|
|
7
|
+
*/
|
|
8
|
+
import { UcpDiscoveryProfileSchema, UcpClassSchema, UcpServiceSchema, CapabilityDiscoverySchema, SigningKeySchema, type UcpDiscoveryProfile, type UcpClass, type UcpService, type CapabilityDiscovery, type SigningKey } from '@ucp-js/sdk';
|
|
9
|
+
import type { ValidationIssue } from '../types/validation.js';
|
|
10
|
+
/**
|
|
11
|
+
* SDK validation result
|
|
12
|
+
*/
|
|
13
|
+
export interface SdkValidationResult {
|
|
14
|
+
valid: boolean;
|
|
15
|
+
issues: ValidationIssue[];
|
|
16
|
+
sdkVersion: string;
|
|
17
|
+
parsedProfile?: UcpDiscoveryProfile;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the current SDK version
|
|
21
|
+
*/
|
|
22
|
+
export declare function getSdkVersion(): string;
|
|
23
|
+
/**
|
|
24
|
+
* Validate a UCP profile using the official SDK schema
|
|
25
|
+
*
|
|
26
|
+
* This uses the UcpDiscoveryProfileSchema from @ucp-js/sdk to validate
|
|
27
|
+
* the entire profile structure against the official UCP specification.
|
|
28
|
+
*/
|
|
29
|
+
export declare function validateWithSdk(profile: unknown): SdkValidationResult;
|
|
30
|
+
/**
|
|
31
|
+
* Safe parse - doesn't throw, returns result with errors
|
|
32
|
+
*/
|
|
33
|
+
export declare function safeValidateWithSdk(profile: unknown): SdkValidationResult;
|
|
34
|
+
/**
|
|
35
|
+
* Validate only the UCP object (version, services, capabilities)
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateUcpObject(ucp: unknown): SdkValidationResult;
|
|
38
|
+
/**
|
|
39
|
+
* Validate a single service definition
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateServiceWithSdk(serviceName: string, service: unknown): SdkValidationResult;
|
|
42
|
+
/**
|
|
43
|
+
* Validate a single capability definition
|
|
44
|
+
*/
|
|
45
|
+
export declare function validateCapabilityWithSdk(index: number, capability: unknown): SdkValidationResult;
|
|
46
|
+
/**
|
|
47
|
+
* Validate signing keys array
|
|
48
|
+
*/
|
|
49
|
+
export declare function validateSigningKeysWithSdk(signingKeys: unknown): SdkValidationResult;
|
|
50
|
+
/**
|
|
51
|
+
* Check if a profile passes SDK validation (quick boolean check)
|
|
52
|
+
*/
|
|
53
|
+
export declare function isSdkCompliant(profile: unknown): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Export SDK schemas for direct use
|
|
56
|
+
*/
|
|
57
|
+
export { UcpDiscoveryProfileSchema, UcpClassSchema, UcpServiceSchema, CapabilityDiscoverySchema, SigningKeySchema, type UcpDiscoveryProfile, type UcpClass, type UcpService, type CapabilityDiscovery, type SigningKey, };
|
|
58
|
+
//# sourceMappingURL=sdk-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk-validator.d.ts","sourceRoot":"","sources":["../../src/validator/sdk-validator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,yBAAyB,EACzB,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,UAAU,EAClB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAuED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAmCrE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAmBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,mBAAmB,CA2BnE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACjB,mBAAmB,CAwBrB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,GACpB,mBAAmB,CAwBrB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,WAAW,EAAE,OAAO,GACrB,mBAAmB,CA0BrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAGxD;AAED;;GAEG;AACH,OAAO,EACH,yBAAyB,EACzB,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,UAAU,GAClB,CAAC"}
|