@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
@@ -1,330 +1,273 @@
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
-
9
- import {
10
- UcpDiscoveryProfileSchema,
11
- UcpClassSchema,
12
- UcpServiceSchema,
13
- CapabilityDiscoverySchema,
14
- SigningKeySchema,
15
- type UcpDiscoveryProfile,
16
- type UcpClass,
17
- type UcpService,
18
- type CapabilityDiscovery,
19
- type SigningKey,
20
- } from '@ucp-js/sdk';
21
- import { z, ZodError, ZodIssue } from 'zod';
22
- import type { ValidationIssue } from '../types/validation.js';
23
- import { ValidationErrorCodes } from '../types/validation.js';
24
-
25
- /**
26
- * SDK validation result
27
- */
28
- export interface SdkValidationResult {
29
- valid: boolean;
30
- issues: ValidationIssue[];
31
- sdkVersion: string;
32
- parsedProfile?: UcpDiscoveryProfile;
33
- }
34
-
35
- /**
36
- * Get the current SDK version
37
- */
38
- export function getSdkVersion(): string {
39
- // Note: In production, this would be read from package.json
40
- return '0.1.0';
41
- }
42
-
43
- /**
44
- * Map Zod error path to JSON path string
45
- */
46
- function zodPathToJsonPath(path: (string | number)[]): string {
47
- if (path.length === 0) return '$';
48
-
49
- return '$.' + path.map((segment) => {
50
- if (typeof segment === 'number') {
51
- return `[${segment}]`;
52
- }
53
- // Handle keys with special characters
54
- if (/[.\[\]"]/.test(segment)) {
55
- return `["${segment}"]`;
56
- }
57
- return segment;
58
- }).join('.').replace(/\.\[/g, '[');
59
- }
60
-
61
- /**
62
- * Convert Zod issue to ValidationIssue
63
- */
64
- function zodIssueToValidationIssue(issue: ZodIssue): ValidationIssue {
65
- const path = zodPathToJsonPath(issue.path);
66
-
67
- // Map Zod error codes to our validation codes
68
- let code: string = ValidationErrorCodes.INVALID_SERVICE_STRUCTURE;
69
- let hint: string | undefined;
70
-
71
- switch (issue.code) {
72
- case 'invalid_type':
73
- if (issue.path.includes('version')) {
74
- code = ValidationErrorCodes.INVALID_VERSION_FORMAT;
75
- hint = 'Use YYYY-MM-DD format (e.g., "2026-01-11")';
76
- } else if (issue.path.includes('services')) {
77
- code = ValidationErrorCodes.INVALID_SERVICE_STRUCTURE;
78
- } else if (issue.path.includes('capabilities')) {
79
- code = ValidationErrorCodes.INVALID_CAPABILITY_STRUCTURE;
80
- } else if (issue.path.includes('signing_keys')) {
81
- code = ValidationErrorCodes.INVALID_SIGNING_KEY;
82
- }
83
- break;
84
- case 'invalid_string':
85
- case 'invalid_enum_value':
86
- if (issue.path.includes('version')) {
87
- code = ValidationErrorCodes.INVALID_VERSION_FORMAT;
88
- }
89
- break;
90
- case 'unrecognized_keys':
91
- // SDK allows extra keys, just warn
92
- return {
93
- severity: 'warn',
94
- code: code as any,
95
- path,
96
- message: `Unrecognized field(s): ${(issue as any).keys?.join(', ')}`,
97
- hint: 'Extra fields are allowed but may not be used by UCP clients',
98
- };
99
- default:
100
- break;
101
- }
102
-
103
- return {
104
- severity: 'error',
105
- code: code as any,
106
- path,
107
- message: issue.message,
108
- hint,
109
- };
110
- }
111
-
112
- /**
113
- * Validate a UCP profile using the official SDK schema
114
- *
115
- * This uses the UcpDiscoveryProfileSchema from @ucp-js/sdk to validate
116
- * the entire profile structure against the official UCP specification.
117
- */
118
- export function validateWithSdk(profile: unknown): SdkValidationResult {
119
- const issues: ValidationIssue[] = [];
120
-
121
- try {
122
- // Parse with the official SDK schema (strict mode)
123
- const parsed = UcpDiscoveryProfileSchema.parse(profile);
124
-
125
- return {
126
- valid: true,
127
- issues: [],
128
- sdkVersion: getSdkVersion(),
129
- parsedProfile: parsed,
130
- };
131
- } catch (error) {
132
- if (error instanceof ZodError) {
133
- // Convert Zod errors to our validation issues
134
- for (const issue of error.issues) {
135
- issues.push(zodIssueToValidationIssue(issue));
136
- }
137
- } else {
138
- // Unexpected error
139
- issues.push({
140
- severity: 'error',
141
- code: ValidationErrorCodes.MISSING_UCP_OBJECT,
142
- path: '$',
143
- message: error instanceof Error ? error.message : 'Unknown validation error',
144
- });
145
- }
146
-
147
- return {
148
- valid: false,
149
- issues,
150
- sdkVersion: getSdkVersion(),
151
- };
152
- }
153
- }
154
-
155
- /**
156
- * Safe parse - doesn't throw, returns result with errors
157
- */
158
- export function safeValidateWithSdk(profile: unknown): SdkValidationResult {
159
- const result = UcpDiscoveryProfileSchema.safeParse(profile);
160
-
161
- if (result.success) {
162
- return {
163
- valid: true,
164
- issues: [],
165
- sdkVersion: getSdkVersion(),
166
- parsedProfile: result.data,
167
- };
168
- }
169
-
170
- const issues = result.error.issues.map(zodIssueToValidationIssue);
171
-
172
- return {
173
- valid: false,
174
- issues,
175
- sdkVersion: getSdkVersion(),
176
- };
177
- }
178
-
179
- /**
180
- * Validate only the UCP object (version, services, capabilities)
181
- */
182
- export function validateUcpObject(ucp: unknown): SdkValidationResult {
183
- const issues: ValidationIssue[] = [];
184
-
185
- const result = UcpClassSchema.safeParse(ucp);
186
-
187
- if (result.success) {
188
- return {
189
- valid: true,
190
- issues: [],
191
- sdkVersion: getSdkVersion(),
192
- };
193
- }
194
-
195
- for (const issue of result.error.issues) {
196
- const validationIssue = zodIssueToValidationIssue(issue);
197
- // Prefix path with $.ucp
198
- validationIssue.path = validationIssue.path === '$'
199
- ? '$.ucp'
200
- : validationIssue.path.replace('$', '$.ucp');
201
- issues.push(validationIssue);
202
- }
203
-
204
- return {
205
- valid: false,
206
- issues,
207
- sdkVersion: getSdkVersion(),
208
- };
209
- }
210
-
211
- /**
212
- * Validate a single service definition
213
- */
214
- export function validateServiceWithSdk(
215
- serviceName: string,
216
- service: unknown
217
- ): SdkValidationResult {
218
- const result = UcpServiceSchema.safeParse(service);
219
-
220
- if (result.success) {
221
- return {
222
- valid: true,
223
- issues: [],
224
- sdkVersion: getSdkVersion(),
225
- };
226
- }
227
-
228
- const issues = result.error.issues.map(issue => {
229
- const validationIssue = zodIssueToValidationIssue(issue);
230
- validationIssue.path = validationIssue.path === '$'
231
- ? `$.ucp.services["${serviceName}"]`
232
- : validationIssue.path.replace('$', `$.ucp.services["${serviceName}"]`);
233
- return validationIssue;
234
- });
235
-
236
- return {
237
- valid: false,
238
- issues,
239
- sdkVersion: getSdkVersion(),
240
- };
241
- }
242
-
243
- /**
244
- * Validate a single capability definition
245
- */
246
- export function validateCapabilityWithSdk(
247
- index: number,
248
- capability: unknown
249
- ): SdkValidationResult {
250
- const result = CapabilityDiscoverySchema.safeParse(capability);
251
-
252
- if (result.success) {
253
- return {
254
- valid: true,
255
- issues: [],
256
- sdkVersion: getSdkVersion(),
257
- };
258
- }
259
-
260
- const issues = result.error.issues.map(issue => {
261
- const validationIssue = zodIssueToValidationIssue(issue);
262
- validationIssue.path = validationIssue.path === '$'
263
- ? `$.ucp.capabilities[${index}]`
264
- : validationIssue.path.replace('$', `$.ucp.capabilities[${index}]`);
265
- return validationIssue;
266
- });
267
-
268
- return {
269
- valid: false,
270
- issues,
271
- sdkVersion: getSdkVersion(),
272
- };
273
- }
274
-
275
- /**
276
- * Validate signing keys array
277
- */
278
- export function validateSigningKeysWithSdk(
279
- signingKeys: unknown
280
- ): SdkValidationResult {
281
- // SDK expects signing_keys as an array of SigningKey objects
282
- const SigningKeysArraySchema = z.array(SigningKeySchema);
283
- const result = SigningKeysArraySchema.safeParse(signingKeys);
284
-
285
- if (result.success) {
286
- return {
287
- valid: true,
288
- issues: [],
289
- sdkVersion: getSdkVersion(),
290
- };
291
- }
292
-
293
- const issues = result.error.issues.map(issue => {
294
- const validationIssue = zodIssueToValidationIssue(issue);
295
- validationIssue.path = validationIssue.path === '$'
296
- ? '$.signing_keys'
297
- : validationIssue.path.replace('$', '$.signing_keys');
298
- return validationIssue;
299
- });
300
-
301
- return {
302
- valid: false,
303
- issues,
304
- sdkVersion: getSdkVersion(),
305
- };
306
- }
307
-
308
- /**
309
- * Check if a profile passes SDK validation (quick boolean check)
310
- */
311
- export function isSdkCompliant(profile: unknown): boolean {
312
- const result = UcpDiscoveryProfileSchema.safeParse(profile);
313
- return result.success;
314
- }
315
-
316
- /**
317
- * Export SDK schemas for direct use
318
- */
319
- export {
320
- UcpDiscoveryProfileSchema,
321
- UcpClassSchema,
322
- UcpServiceSchema,
323
- CapabilityDiscoverySchema,
324
- SigningKeySchema,
325
- type UcpDiscoveryProfile,
326
- type UcpClass,
327
- type UcpService,
328
- type CapabilityDiscovery,
329
- type SigningKey,
330
- };
1
+ "use strict";
2
+ /**
3
+ * SDK-based Validator
4
+ * Validates UCP profiles using the official @ucp-js/sdk Zod schemas
5
+ *
6
+ * This provides spec-compliant validation using the official UCP SDK,
7
+ * ensuring alignment with the latest UCP specification.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SigningKeySchema = exports.CapabilityDiscoverySchema = exports.UcpServiceSchema = exports.UcpClassSchema = exports.UcpDiscoveryProfileSchema = void 0;
11
+ exports.getSdkVersion = getSdkVersion;
12
+ exports.validateWithSdk = validateWithSdk;
13
+ exports.safeValidateWithSdk = safeValidateWithSdk;
14
+ exports.validateUcpObject = validateUcpObject;
15
+ exports.validateServiceWithSdk = validateServiceWithSdk;
16
+ exports.validateCapabilityWithSdk = validateCapabilityWithSdk;
17
+ exports.validateSigningKeysWithSdk = validateSigningKeysWithSdk;
18
+ exports.isSdkCompliant = isSdkCompliant;
19
+ const sdk_1 = require("@ucp-js/sdk");
20
+ Object.defineProperty(exports, "UcpDiscoveryProfileSchema", { enumerable: true, get: function () { return sdk_1.UcpDiscoveryProfileSchema; } });
21
+ Object.defineProperty(exports, "UcpClassSchema", { enumerable: true, get: function () { return sdk_1.UcpClassSchema; } });
22
+ Object.defineProperty(exports, "UcpServiceSchema", { enumerable: true, get: function () { return sdk_1.UcpServiceSchema; } });
23
+ Object.defineProperty(exports, "CapabilityDiscoverySchema", { enumerable: true, get: function () { return sdk_1.CapabilityDiscoverySchema; } });
24
+ Object.defineProperty(exports, "SigningKeySchema", { enumerable: true, get: function () { return sdk_1.SigningKeySchema; } });
25
+ const zod_1 = require("zod");
26
+ const validation_js_1 = require("../types/validation.js");
27
+ /**
28
+ * Get the current SDK version
29
+ */
30
+ function getSdkVersion() {
31
+ // Note: In production, this would be read from package.json
32
+ return '0.1.0';
33
+ }
34
+ /**
35
+ * Map Zod error path to JSON path string
36
+ */
37
+ function zodPathToJsonPath(path) {
38
+ if (path.length === 0)
39
+ return '$';
40
+ return '$.' + path.map((segment) => {
41
+ if (typeof segment === 'number') {
42
+ return `[${segment}]`;
43
+ }
44
+ // Handle keys with special characters
45
+ if (/[.\[\]"]/.test(segment)) {
46
+ return `["${segment}"]`;
47
+ }
48
+ return segment;
49
+ }).join('.').replace(/\.\[/g, '[');
50
+ }
51
+ /**
52
+ * Convert Zod issue to ValidationIssue
53
+ */
54
+ function zodIssueToValidationIssue(issue) {
55
+ const path = zodPathToJsonPath(issue.path);
56
+ // Map Zod error codes to our validation codes
57
+ let code = validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE;
58
+ let hint;
59
+ switch (issue.code) {
60
+ case 'invalid_type':
61
+ if (issue.path.includes('version')) {
62
+ code = validation_js_1.ValidationErrorCodes.INVALID_VERSION_FORMAT;
63
+ hint = 'Use YYYY-MM-DD format (e.g., "2026-01-11")';
64
+ }
65
+ else if (issue.path.includes('services')) {
66
+ code = validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE;
67
+ }
68
+ else if (issue.path.includes('capabilities')) {
69
+ code = validation_js_1.ValidationErrorCodes.INVALID_CAPABILITY_STRUCTURE;
70
+ }
71
+ else if (issue.path.includes('signing_keys')) {
72
+ code = validation_js_1.ValidationErrorCodes.INVALID_SIGNING_KEY;
73
+ }
74
+ break;
75
+ case 'invalid_string':
76
+ case 'invalid_enum_value':
77
+ if (issue.path.includes('version')) {
78
+ code = validation_js_1.ValidationErrorCodes.INVALID_VERSION_FORMAT;
79
+ }
80
+ break;
81
+ case 'unrecognized_keys':
82
+ // SDK allows extra keys, just warn
83
+ return {
84
+ severity: 'warn',
85
+ code: code,
86
+ path,
87
+ message: `Unrecognized field(s): ${issue.keys?.join(', ')}`,
88
+ hint: 'Extra fields are allowed but may not be used by UCP clients',
89
+ };
90
+ default:
91
+ break;
92
+ }
93
+ return {
94
+ severity: 'error',
95
+ code: code,
96
+ path,
97
+ message: issue.message,
98
+ hint,
99
+ };
100
+ }
101
+ /**
102
+ * Validate a UCP profile using the official SDK schema
103
+ *
104
+ * This uses the UcpDiscoveryProfileSchema from @ucp-js/sdk to validate
105
+ * the entire profile structure against the official UCP specification.
106
+ */
107
+ function validateWithSdk(profile) {
108
+ const issues = [];
109
+ try {
110
+ // Parse with the official SDK schema (strict mode)
111
+ const parsed = sdk_1.UcpDiscoveryProfileSchema.parse(profile);
112
+ return {
113
+ valid: true,
114
+ issues: [],
115
+ sdkVersion: getSdkVersion(),
116
+ parsedProfile: parsed,
117
+ };
118
+ }
119
+ catch (error) {
120
+ if (error instanceof zod_1.ZodError) {
121
+ // Convert Zod errors to our validation issues
122
+ for (const issue of error.issues) {
123
+ issues.push(zodIssueToValidationIssue(issue));
124
+ }
125
+ }
126
+ else {
127
+ // Unexpected error
128
+ issues.push({
129
+ severity: 'error',
130
+ code: validation_js_1.ValidationErrorCodes.MISSING_UCP_OBJECT,
131
+ path: '$',
132
+ message: error instanceof Error ? error.message : 'Unknown validation error',
133
+ });
134
+ }
135
+ return {
136
+ valid: false,
137
+ issues,
138
+ sdkVersion: getSdkVersion(),
139
+ };
140
+ }
141
+ }
142
+ /**
143
+ * Safe parse - doesn't throw, returns result with errors
144
+ */
145
+ function safeValidateWithSdk(profile) {
146
+ const result = sdk_1.UcpDiscoveryProfileSchema.safeParse(profile);
147
+ if (result.success) {
148
+ return {
149
+ valid: true,
150
+ issues: [],
151
+ sdkVersion: getSdkVersion(),
152
+ parsedProfile: result.data,
153
+ };
154
+ }
155
+ const issues = result.error.issues.map(zodIssueToValidationIssue);
156
+ return {
157
+ valid: false,
158
+ issues,
159
+ sdkVersion: getSdkVersion(),
160
+ };
161
+ }
162
+ /**
163
+ * Validate only the UCP object (version, services, capabilities)
164
+ */
165
+ function validateUcpObject(ucp) {
166
+ const issues = [];
167
+ const result = sdk_1.UcpClassSchema.safeParse(ucp);
168
+ if (result.success) {
169
+ return {
170
+ valid: true,
171
+ issues: [],
172
+ sdkVersion: getSdkVersion(),
173
+ };
174
+ }
175
+ for (const issue of result.error.issues) {
176
+ const validationIssue = zodIssueToValidationIssue(issue);
177
+ // Prefix path with $.ucp
178
+ validationIssue.path = validationIssue.path === '$'
179
+ ? '$.ucp'
180
+ : validationIssue.path.replace('$', '$.ucp');
181
+ issues.push(validationIssue);
182
+ }
183
+ return {
184
+ valid: false,
185
+ issues,
186
+ sdkVersion: getSdkVersion(),
187
+ };
188
+ }
189
+ /**
190
+ * Validate a single service definition
191
+ */
192
+ function validateServiceWithSdk(serviceName, service) {
193
+ const result = sdk_1.UcpServiceSchema.safeParse(service);
194
+ if (result.success) {
195
+ return {
196
+ valid: true,
197
+ issues: [],
198
+ sdkVersion: getSdkVersion(),
199
+ };
200
+ }
201
+ const issues = result.error.issues.map(issue => {
202
+ const validationIssue = zodIssueToValidationIssue(issue);
203
+ validationIssue.path = validationIssue.path === '$'
204
+ ? `$.ucp.services["${serviceName}"]`
205
+ : validationIssue.path.replace('$', `$.ucp.services["${serviceName}"]`);
206
+ return validationIssue;
207
+ });
208
+ return {
209
+ valid: false,
210
+ issues,
211
+ sdkVersion: getSdkVersion(),
212
+ };
213
+ }
214
+ /**
215
+ * Validate a single capability definition
216
+ */
217
+ function validateCapabilityWithSdk(index, capability) {
218
+ const result = sdk_1.CapabilityDiscoverySchema.safeParse(capability);
219
+ if (result.success) {
220
+ return {
221
+ valid: true,
222
+ issues: [],
223
+ sdkVersion: getSdkVersion(),
224
+ };
225
+ }
226
+ const issues = result.error.issues.map(issue => {
227
+ const validationIssue = zodIssueToValidationIssue(issue);
228
+ validationIssue.path = validationIssue.path === '$'
229
+ ? `$.ucp.capabilities[${index}]`
230
+ : validationIssue.path.replace('$', `$.ucp.capabilities[${index}]`);
231
+ return validationIssue;
232
+ });
233
+ return {
234
+ valid: false,
235
+ issues,
236
+ sdkVersion: getSdkVersion(),
237
+ };
238
+ }
239
+ /**
240
+ * Validate signing keys array
241
+ */
242
+ function validateSigningKeysWithSdk(signingKeys) {
243
+ // SDK expects signing_keys as an array of SigningKey objects
244
+ const SigningKeysArraySchema = zod_1.z.array(sdk_1.SigningKeySchema);
245
+ const result = SigningKeysArraySchema.safeParse(signingKeys);
246
+ if (result.success) {
247
+ return {
248
+ valid: true,
249
+ issues: [],
250
+ sdkVersion: getSdkVersion(),
251
+ };
252
+ }
253
+ const issues = result.error.issues.map(issue => {
254
+ const validationIssue = zodIssueToValidationIssue(issue);
255
+ validationIssue.path = validationIssue.path === '$'
256
+ ? '$.signing_keys'
257
+ : validationIssue.path.replace('$', '$.signing_keys');
258
+ return validationIssue;
259
+ });
260
+ return {
261
+ valid: false,
262
+ issues,
263
+ sdkVersion: getSdkVersion(),
264
+ };
265
+ }
266
+ /**
267
+ * Check if a profile passes SDK validation (quick boolean check)
268
+ */
269
+ function isSdkCompliant(profile) {
270
+ const result = sdk_1.UcpDiscoveryProfileSchema.safeParse(profile);
271
+ return result.success;
272
+ }
273
+ //# sourceMappingURL=sdk-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-validator.js","sourceRoot":"","sources":["../../src/validator/sdk-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Structural Validator
3
+ * Validates UCP Profile JSON structure (no network calls)
4
+ */
5
+ import type { ValidationIssue } from '../types/validation.js';
6
+ /**
7
+ * Validate the structural integrity of a UCP profile
8
+ * Returns an array of validation issues
9
+ */
10
+ export declare function validateStructure(profile: unknown): ValidationIssue[];
11
+ //# sourceMappingURL=structural-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-validator.d.ts","sourceRoot":"","sources":["../../src/validator/structural-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAS9D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,CAyDrE"}