@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.
Files changed (330) hide show
  1. package/dist/auth/config.d.ts +20 -0
  2. package/dist/auth/config.d.ts.map +1 -0
  3. package/dist/auth/config.js +114 -0
  4. package/dist/auth/config.js.map +1 -0
  5. package/dist/auth/index.d.ts +5 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +17 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/auth/middleware.d.ts +45 -0
  10. package/dist/auth/middleware.d.ts.map +1 -0
  11. package/dist/auth/middleware.js +170 -0
  12. package/dist/auth/middleware.js.map +1 -0
  13. package/dist/auth/service.d.ts +80 -0
  14. package/dist/auth/service.d.ts.map +1 -0
  15. package/dist/auth/service.js +298 -0
  16. package/dist/auth/service.js.map +1 -0
  17. package/dist/cli/index.d.ts +6 -0
  18. package/dist/cli/index.d.ts.map +1 -0
  19. package/dist/cli/index.js +375 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/cli/mock-server.d.ts +20 -0
  22. package/dist/cli/mock-server.d.ts.map +1 -0
  23. package/dist/cli/mock-server.js +261 -0
  24. package/dist/cli/mock-server.js.map +1 -0
  25. package/dist/compliance/compliance-generator.d.ts +34 -0
  26. package/dist/compliance/compliance-generator.d.ts.map +1 -0
  27. package/dist/compliance/compliance-generator.js +320 -0
  28. package/dist/compliance/compliance-generator.js.map +1 -0
  29. package/dist/compliance/index.d.ts +8 -0
  30. package/dist/compliance/index.d.ts.map +1 -0
  31. package/dist/compliance/index.js +17 -0
  32. package/dist/compliance/index.js.map +1 -0
  33. package/dist/compliance/templates.d.ts +34 -0
  34. package/dist/compliance/templates.d.ts.map +1 -0
  35. package/{src/compliance/templates.ts → dist/compliance/templates.js} +117 -155
  36. package/dist/compliance/templates.js.map +1 -0
  37. package/dist/compliance/types.d.ts +64 -0
  38. package/dist/compliance/types.d.ts.map +1 -0
  39. package/dist/compliance/types.js +64 -0
  40. package/dist/compliance/types.js.map +1 -0
  41. package/dist/db/index.d.ts +17 -0
  42. package/dist/db/index.d.ts.map +1 -0
  43. package/dist/db/index.js +80 -0
  44. package/dist/db/index.js.map +1 -0
  45. package/dist/db/schema.d.ts +3886 -0
  46. package/dist/db/schema.d.ts.map +1 -0
  47. package/dist/db/schema.js +425 -0
  48. package/dist/db/schema.js.map +1 -0
  49. package/dist/db/utils.d.ts +252 -0
  50. package/dist/db/utils.d.ts.map +1 -0
  51. package/dist/db/utils.js +295 -0
  52. package/dist/db/utils.js.map +1 -0
  53. package/dist/feed-analyzer/feed-analyzer.d.ts +26 -0
  54. package/dist/feed-analyzer/feed-analyzer.d.ts.map +1 -0
  55. package/{src/feed-analyzer/feed-analyzer.ts → dist/feed-analyzer/feed-analyzer.js} +856 -726
  56. package/dist/feed-analyzer/feed-analyzer.js.map +1 -0
  57. package/dist/feed-analyzer/index.d.ts +8 -0
  58. package/dist/feed-analyzer/index.d.ts.map +1 -0
  59. package/dist/feed-analyzer/index.js +19 -0
  60. package/dist/feed-analyzer/index.js.map +1 -0
  61. package/dist/feed-analyzer/types.d.ts +285 -0
  62. package/dist/feed-analyzer/types.d.ts.map +1 -0
  63. package/dist/feed-analyzer/types.js +175 -0
  64. package/dist/feed-analyzer/types.js.map +1 -0
  65. package/{src/generator/index.ts → dist/generator/index.d.ts} +1 -1
  66. package/dist/generator/index.d.ts.map +1 -0
  67. package/dist/generator/index.js +13 -0
  68. package/dist/generator/index.js.map +1 -0
  69. package/dist/generator/key-generator.d.ts +24 -0
  70. package/dist/generator/key-generator.d.ts.map +1 -0
  71. package/dist/generator/key-generator.js +144 -0
  72. package/dist/generator/key-generator.js.map +1 -0
  73. package/dist/generator/profile-builder.d.ts +15 -0
  74. package/dist/generator/profile-builder.d.ts.map +1 -0
  75. package/dist/generator/profile-builder.js +338 -0
  76. package/dist/generator/profile-builder.js.map +1 -0
  77. package/dist/hosting/artifacts-generator.d.ts +10 -0
  78. package/dist/hosting/artifacts-generator.d.ts.map +1 -0
  79. package/{src/hosting/artifacts-generator.ts → dist/hosting/artifacts-generator.js} +191 -241
  80. package/dist/hosting/artifacts-generator.js.map +1 -0
  81. package/{src/hosting/index.ts → dist/hosting/index.d.ts} +1 -1
  82. package/dist/hosting/index.d.ts.map +1 -0
  83. package/dist/hosting/index.js +10 -0
  84. package/dist/hosting/index.js.map +1 -0
  85. package/dist/index.d.ts +18 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +78 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/lib/analytics.d.ts +337 -0
  90. package/dist/lib/analytics.d.ts.map +1 -0
  91. package/dist/lib/analytics.js +188 -0
  92. package/dist/lib/analytics.js.map +1 -0
  93. package/{src/security/index.ts → dist/security/index.d.ts} +8 -15
  94. package/dist/security/index.d.ts.map +1 -0
  95. package/dist/security/index.js +12 -0
  96. package/dist/security/index.js.map +1 -0
  97. package/dist/security/security-scanner.d.ts +10 -0
  98. package/dist/security/security-scanner.d.ts.map +1 -0
  99. package/dist/security/security-scanner.js +669 -0
  100. package/dist/security/security-scanner.js.map +1 -0
  101. package/dist/security/types.d.ts +80 -0
  102. package/dist/security/types.d.ts.map +1 -0
  103. package/dist/security/types.js +21 -0
  104. package/dist/security/types.js.map +1 -0
  105. package/dist/services/analytics.d.ts +114 -0
  106. package/dist/services/analytics.d.ts.map +1 -0
  107. package/dist/services/analytics.js +862 -0
  108. package/dist/services/analytics.js.map +1 -0
  109. package/dist/services/badge.d.ts +31 -0
  110. package/dist/services/badge.d.ts.map +1 -0
  111. package/dist/services/badge.js +152 -0
  112. package/dist/services/badge.js.map +1 -0
  113. package/dist/services/cron.d.ts +125 -0
  114. package/dist/services/cron.d.ts.map +1 -0
  115. package/dist/services/cron.js +613 -0
  116. package/dist/services/cron.js.map +1 -0
  117. package/dist/services/directory.d.ts +106 -0
  118. package/dist/services/directory.d.ts.map +1 -0
  119. package/dist/services/directory.js +351 -0
  120. package/dist/services/directory.js.map +1 -0
  121. package/dist/services/email.d.ts +112 -0
  122. package/dist/services/email.d.ts.map +1 -0
  123. package/dist/services/email.js +772 -0
  124. package/dist/services/email.js.map +1 -0
  125. package/dist/services/hosted-profiles.d.ts +77 -0
  126. package/dist/services/hosted-profiles.d.ts.map +1 -0
  127. package/dist/services/hosted-profiles.js +433 -0
  128. package/dist/services/hosted-profiles.js.map +1 -0
  129. package/dist/services/latency.d.ts +67 -0
  130. package/dist/services/latency.d.ts.map +1 -0
  131. package/dist/services/latency.js +274 -0
  132. package/dist/services/latency.js.map +1 -0
  133. package/dist/services/manifest-compliance.d.ts +64 -0
  134. package/dist/services/manifest-compliance.d.ts.map +1 -0
  135. package/dist/services/manifest-compliance.js +271 -0
  136. package/dist/services/manifest-compliance.js.map +1 -0
  137. package/dist/services/monitoring-diff.d.ts +31 -0
  138. package/dist/services/monitoring-diff.d.ts.map +1 -0
  139. package/dist/services/monitoring-diff.js +189 -0
  140. package/dist/services/monitoring-diff.js.map +1 -0
  141. package/dist/services/notifications.d.ts +46 -0
  142. package/dist/services/notifications.d.ts.map +1 -0
  143. package/dist/services/notifications.js +88 -0
  144. package/dist/services/notifications.js.map +1 -0
  145. package/dist/services/stripe.d.ts +93 -0
  146. package/dist/services/stripe.d.ts.map +1 -0
  147. package/dist/services/stripe.js +490 -0
  148. package/dist/services/stripe.js.map +1 -0
  149. package/dist/services/validation-history.d.ts +99 -0
  150. package/dist/services/validation-history.d.ts.map +1 -0
  151. package/dist/services/validation-history.js +344 -0
  152. package/dist/services/validation-history.js.map +1 -0
  153. package/dist/services/validation-logging.d.ts +103 -0
  154. package/dist/services/validation-logging.d.ts.map +1 -0
  155. package/dist/services/validation-logging.js +210 -0
  156. package/dist/services/validation-logging.js.map +1 -0
  157. package/dist/services/validation.d.ts +119 -0
  158. package/dist/services/validation.d.ts.map +1 -0
  159. package/dist/services/validation.js +1185 -0
  160. package/dist/services/validation.js.map +1 -0
  161. package/dist/simulator/agent-simulator.d.ts +69 -0
  162. package/dist/simulator/agent-simulator.d.ts.map +1 -0
  163. package/dist/simulator/agent-simulator.js +870 -0
  164. package/dist/simulator/agent-simulator.js.map +1 -0
  165. package/{src/simulator/index.ts → dist/simulator/index.d.ts} +7 -7
  166. package/dist/simulator/index.d.ts.map +1 -0
  167. package/dist/simulator/index.js +23 -0
  168. package/dist/simulator/index.js.map +1 -0
  169. package/{src/simulator/types.ts → dist/simulator/types.d.ts} +171 -170
  170. package/dist/simulator/types.d.ts.map +1 -0
  171. package/dist/simulator/types.js +18 -0
  172. package/dist/simulator/types.js.map +1 -0
  173. package/dist/types/acp-validation.d.ts +87 -0
  174. package/dist/types/acp-validation.d.ts.map +1 -0
  175. package/dist/types/acp-validation.js +40 -0
  176. package/dist/types/acp-validation.js.map +1 -0
  177. package/dist/types/analytics.d.ts +182 -0
  178. package/dist/types/analytics.d.ts.map +1 -0
  179. package/dist/types/analytics.js +7 -0
  180. package/dist/types/analytics.js.map +1 -0
  181. package/dist/types/generator.d.ts +106 -0
  182. package/dist/types/generator.d.ts.map +1 -0
  183. package/dist/types/generator.js +6 -0
  184. package/dist/types/generator.js.map +1 -0
  185. package/{src/types/index.ts → dist/types/index.d.ts} +1 -1
  186. package/dist/types/index.d.ts.map +1 -0
  187. package/dist/types/index.js +23 -0
  188. package/dist/types/index.js.map +1 -0
  189. package/dist/types/ucp-profile.d.ts +111 -0
  190. package/dist/types/ucp-profile.d.ts.map +1 -0
  191. package/dist/types/ucp-profile.js +45 -0
  192. package/dist/types/ucp-profile.js.map +1 -0
  193. package/dist/types/validation.d.ts +76 -0
  194. package/dist/types/validation.d.ts.map +1 -0
  195. package/dist/types/validation.js +42 -0
  196. package/dist/types/validation.js.map +1 -0
  197. package/dist/validator/acp/index.d.ts +31 -0
  198. package/dist/validator/acp/index.d.ts.map +1 -0
  199. package/dist/validator/acp/index.js +574 -0
  200. package/dist/validator/acp/index.js.map +1 -0
  201. package/dist/validator/index.d.ts +26 -0
  202. package/dist/validator/index.d.ts.map +1 -0
  203. package/dist/validator/index.js +161 -0
  204. package/dist/validator/index.js.map +1 -0
  205. package/dist/validator/network-validator.d.ts +28 -0
  206. package/dist/validator/network-validator.d.ts.map +1 -0
  207. package/dist/validator/network-validator.js +319 -0
  208. package/dist/validator/network-validator.js.map +1 -0
  209. package/dist/validator/rules-validator.d.ts +19 -0
  210. package/dist/validator/rules-validator.d.ts.map +1 -0
  211. package/dist/validator/rules-validator.js +306 -0
  212. package/dist/validator/rules-validator.js.map +1 -0
  213. package/dist/validator/sdk-validator.d.ts +58 -0
  214. package/dist/validator/sdk-validator.d.ts.map +1 -0
  215. package/{src/validator/sdk-validator.ts → dist/validator/sdk-validator.js} +273 -330
  216. package/dist/validator/sdk-validator.js.map +1 -0
  217. package/dist/validator/structural-validator.d.ts +11 -0
  218. package/dist/validator/structural-validator.d.ts.map +1 -0
  219. package/dist/validator/structural-validator.js +549 -0
  220. package/dist/validator/structural-validator.js.map +1 -0
  221. package/dist/validator/utils.d.ts +51 -0
  222. package/dist/validator/utils.d.ts.map +1 -0
  223. package/dist/validator/utils.js +132 -0
  224. package/dist/validator/utils.js.map +1 -0
  225. package/package.json +44 -12
  226. package/CLAUDE.md +0 -109
  227. package/api/analyze-feed.js +0 -140
  228. package/api/badge.js +0 -185
  229. package/api/benchmark.js +0 -177
  230. package/api/directory-stats.ts +0 -29
  231. package/api/directory.ts +0 -73
  232. package/api/generate-compliance.js +0 -143
  233. package/api/generate-schema.js +0 -457
  234. package/api/generate.js +0 -132
  235. package/api/security-scan.js +0 -133
  236. package/api/simulate.js +0 -187
  237. package/api/tsconfig.json +0 -10
  238. package/api/validate.js +0 -1351
  239. package/apify-actor/.actor/actor.json +0 -68
  240. package/apify-actor/.actor/input_schema.json +0 -32
  241. package/apify-actor/APIFY-STORE-LISTING.md +0 -412
  242. package/apify-actor/Dockerfile +0 -8
  243. package/apify-actor/README.md +0 -166
  244. package/apify-actor/main.ts +0 -111
  245. package/apify-actor/package.json +0 -17
  246. package/apify-actor/src/main.js +0 -199
  247. package/docs/BRAND-IDENTITY.md +0 -238
  248. package/docs/BRAND-STYLE-GUIDE.md +0 -356
  249. package/drizzle/0000_black_king_cobra.sql +0 -39
  250. package/drizzle/meta/0000_snapshot.json +0 -309
  251. package/drizzle/meta/_journal.json +0 -13
  252. package/drizzle.config.ts +0 -10
  253. package/public/.well-known/ucp +0 -25
  254. package/public/android-chrome-192x192.png +0 -0
  255. package/public/android-chrome-512x512.png +0 -0
  256. package/public/apple-touch-icon.png +0 -0
  257. package/public/brand.css +0 -321
  258. package/public/directory.html +0 -701
  259. package/public/favicon-16x16.png +0 -0
  260. package/public/favicon-32x32.png +0 -0
  261. package/public/favicon.ico +0 -0
  262. package/public/guides/bigcommerce.html +0 -743
  263. package/public/guides/fastucp.html +0 -838
  264. package/public/guides/magento.html +0 -779
  265. package/public/guides/shopify.html +0 -726
  266. package/public/guides/squarespace.html +0 -749
  267. package/public/guides/wix.html +0 -747
  268. package/public/guides/woocommerce.html +0 -733
  269. package/public/index.html +0 -3835
  270. package/public/learn.html +0 -396
  271. package/public/logo.jpeg +0 -0
  272. package/public/og-image-icon.png +0 -0
  273. package/public/og-image.png +0 -0
  274. package/public/robots.txt +0 -6
  275. package/public/site.webmanifest +0 -31
  276. package/public/sitemap.xml +0 -69
  277. package/public/social/linkedin-banner-1128x191.png +0 -0
  278. package/public/social/temp.PNG +0 -0
  279. package/public/social/x-header-1500x500.png +0 -0
  280. package/public/verify.html +0 -410
  281. package/scripts/generate-favicons.js +0 -44
  282. package/scripts/generate-ico.js +0 -23
  283. package/scripts/generate-og-image.js +0 -45
  284. package/scripts/reset-db.ts +0 -77
  285. package/scripts/seed-db.ts +0 -71
  286. package/scripts/setup-benchmark-db.js +0 -70
  287. package/src/api/server.ts +0 -266
  288. package/src/cli/index.ts +0 -302
  289. package/src/compliance/compliance-generator.ts +0 -452
  290. package/src/compliance/index.ts +0 -28
  291. package/src/compliance/types.ts +0 -170
  292. package/src/db/index.ts +0 -28
  293. package/src/db/schema.ts +0 -84
  294. package/src/feed-analyzer/index.ts +0 -34
  295. package/src/feed-analyzer/types.ts +0 -354
  296. package/src/generator/key-generator.ts +0 -124
  297. package/src/generator/profile-builder.ts +0 -402
  298. package/src/index.ts +0 -105
  299. package/src/security/security-scanner.ts +0 -604
  300. package/src/security/types.ts +0 -55
  301. package/src/services/directory.ts +0 -434
  302. package/src/simulator/agent-simulator.ts +0 -941
  303. package/src/types/generator.ts +0 -140
  304. package/src/types/ucp-profile.ts +0 -140
  305. package/src/types/validation.ts +0 -89
  306. package/src/validator/index.ts +0 -194
  307. package/src/validator/network-validator.ts +0 -417
  308. package/src/validator/rules-validator.ts +0 -297
  309. package/src/validator/structural-validator.ts +0 -476
  310. package/tests/fixtures/non-compliant-profile.json +0 -25
  311. package/tests/fixtures/official-sample-profile.json +0 -75
  312. package/tests/integration/benchmark.test.ts +0 -207
  313. package/tests/integration/database.test.ts +0 -163
  314. package/tests/integration/directory-api.test.ts +0 -268
  315. package/tests/integration/simulate-api.test.ts +0 -230
  316. package/tests/integration/validate-api.test.ts +0 -269
  317. package/tests/setup.ts +0 -15
  318. package/tests/unit/agent-simulator.test.ts +0 -575
  319. package/tests/unit/compliance-generator.test.ts +0 -374
  320. package/tests/unit/directory-service.test.ts +0 -272
  321. package/tests/unit/feed-analyzer.test.ts +0 -517
  322. package/tests/unit/lint-suggestions.test.ts +0 -423
  323. package/tests/unit/official-samples.test.ts +0 -211
  324. package/tests/unit/pdf-report.test.ts +0 -390
  325. package/tests/unit/sdk-validator.test.ts +0 -531
  326. package/tests/unit/security-scanner.test.ts +0 -410
  327. package/tests/unit/validation.test.ts +0 -390
  328. package/tsconfig.json +0 -20
  329. package/vercel.json +0 -34
  330. 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"}