@ucptools/validator 1.0.0 → 1.0.1

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 (236) hide show
  1. package/.claude/settings.local.json +60 -0
  2. package/.vercel/README.txt +11 -0
  3. package/.vercel/project.json +1 -0
  4. package/dist/cli/index.d.ts +6 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +279 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/compliance/compliance-generator.d.ts +34 -0
  9. package/dist/compliance/compliance-generator.d.ts.map +1 -0
  10. package/dist/compliance/compliance-generator.js +320 -0
  11. package/dist/compliance/compliance-generator.js.map +1 -0
  12. package/dist/compliance/index.d.ts +8 -0
  13. package/dist/compliance/index.d.ts.map +1 -0
  14. package/dist/compliance/index.js +17 -0
  15. package/dist/compliance/index.js.map +1 -0
  16. package/dist/compliance/templates.d.ts +34 -0
  17. package/dist/compliance/templates.d.ts.map +1 -0
  18. package/{src/compliance/templates.ts → dist/compliance/templates.js} +117 -155
  19. package/dist/compliance/templates.js.map +1 -0
  20. package/dist/compliance/types.d.ts +64 -0
  21. package/dist/compliance/types.d.ts.map +1 -0
  22. package/dist/compliance/types.js +64 -0
  23. package/dist/compliance/types.js.map +1 -0
  24. package/dist/db/index.d.ts +11 -0
  25. package/dist/db/index.d.ts.map +1 -0
  26. package/dist/db/index.js +63 -0
  27. package/dist/db/index.js.map +1 -0
  28. package/dist/db/schema.d.ts +444 -0
  29. package/dist/db/schema.d.ts.map +1 -0
  30. package/dist/db/schema.js +65 -0
  31. package/dist/db/schema.js.map +1 -0
  32. package/dist/feed-analyzer/feed-analyzer.d.ts +26 -0
  33. package/dist/feed-analyzer/feed-analyzer.d.ts.map +1 -0
  34. package/{src/feed-analyzer/feed-analyzer.ts → dist/feed-analyzer/feed-analyzer.js} +642 -726
  35. package/dist/feed-analyzer/feed-analyzer.js.map +1 -0
  36. package/dist/feed-analyzer/index.d.ts +8 -0
  37. package/dist/feed-analyzer/index.d.ts.map +1 -0
  38. package/dist/feed-analyzer/index.js +19 -0
  39. package/dist/feed-analyzer/index.js.map +1 -0
  40. package/dist/feed-analyzer/types.d.ts +204 -0
  41. package/dist/feed-analyzer/types.d.ts.map +1 -0
  42. package/dist/feed-analyzer/types.js +162 -0
  43. package/dist/feed-analyzer/types.js.map +1 -0
  44. package/{src/generator/index.ts → dist/generator/index.d.ts} +1 -1
  45. package/dist/generator/index.d.ts.map +1 -0
  46. package/dist/generator/index.js +13 -0
  47. package/dist/generator/index.js.map +1 -0
  48. package/dist/generator/key-generator.d.ts +24 -0
  49. package/dist/generator/key-generator.d.ts.map +1 -0
  50. package/dist/generator/key-generator.js +144 -0
  51. package/dist/generator/key-generator.js.map +1 -0
  52. package/dist/generator/profile-builder.d.ts +15 -0
  53. package/dist/generator/profile-builder.d.ts.map +1 -0
  54. package/dist/generator/profile-builder.js +338 -0
  55. package/dist/generator/profile-builder.js.map +1 -0
  56. package/dist/hosting/artifacts-generator.d.ts +10 -0
  57. package/dist/hosting/artifacts-generator.d.ts.map +1 -0
  58. package/{src/hosting/artifacts-generator.ts → dist/hosting/artifacts-generator.js} +191 -241
  59. package/dist/hosting/artifacts-generator.js.map +1 -0
  60. package/{src/hosting/index.ts → dist/hosting/index.d.ts} +1 -1
  61. package/dist/hosting/index.d.ts.map +1 -0
  62. package/dist/hosting/index.js +10 -0
  63. package/dist/hosting/index.js.map +1 -0
  64. package/dist/index.d.ts +18 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +78 -0
  67. package/dist/index.js.map +1 -0
  68. package/{src/security/index.ts → dist/security/index.d.ts} +8 -15
  69. package/dist/security/index.d.ts.map +1 -0
  70. package/dist/security/index.js +12 -0
  71. package/dist/security/index.js.map +1 -0
  72. package/dist/security/security-scanner.d.ts +10 -0
  73. package/dist/security/security-scanner.d.ts.map +1 -0
  74. package/dist/security/security-scanner.js +541 -0
  75. package/dist/security/security-scanner.js.map +1 -0
  76. package/dist/security/types.d.ts +48 -0
  77. package/dist/security/types.d.ts.map +1 -0
  78. package/dist/security/types.js +21 -0
  79. package/dist/security/types.js.map +1 -0
  80. package/dist/services/directory.d.ts +104 -0
  81. package/dist/services/directory.d.ts.map +1 -0
  82. package/dist/services/directory.js +333 -0
  83. package/dist/services/directory.js.map +1 -0
  84. package/dist/simulator/agent-simulator.d.ts +69 -0
  85. package/dist/simulator/agent-simulator.d.ts.map +1 -0
  86. package/{src/simulator/agent-simulator.ts → dist/simulator/agent-simulator.js} +650 -941
  87. package/dist/simulator/agent-simulator.js.map +1 -0
  88. package/{src/simulator/index.ts → dist/simulator/index.d.ts} +7 -7
  89. package/dist/simulator/index.d.ts.map +1 -0
  90. package/dist/simulator/index.js +23 -0
  91. package/dist/simulator/index.js.map +1 -0
  92. package/{src/simulator/types.ts → dist/simulator/types.d.ts} +145 -170
  93. package/dist/simulator/types.d.ts.map +1 -0
  94. package/dist/simulator/types.js +18 -0
  95. package/dist/simulator/types.js.map +1 -0
  96. package/dist/types/generator.d.ts +106 -0
  97. package/dist/types/generator.d.ts.map +1 -0
  98. package/dist/types/generator.js +6 -0
  99. package/dist/types/generator.js.map +1 -0
  100. package/{src/types/index.ts → dist/types/index.d.ts} +1 -1
  101. package/dist/types/index.d.ts.map +1 -0
  102. package/dist/types/index.js +23 -0
  103. package/dist/types/index.js.map +1 -0
  104. package/dist/types/ucp-profile.d.ts +103 -0
  105. package/dist/types/ucp-profile.d.ts.map +1 -0
  106. package/dist/types/ucp-profile.js +45 -0
  107. package/dist/types/ucp-profile.js.map +1 -0
  108. package/dist/types/validation.d.ts +68 -0
  109. package/dist/types/validation.d.ts.map +1 -0
  110. package/dist/types/validation.js +32 -0
  111. package/dist/types/validation.js.map +1 -0
  112. package/dist/validator/index.d.ts +26 -0
  113. package/dist/validator/index.d.ts.map +1 -0
  114. package/dist/validator/index.js +161 -0
  115. package/dist/validator/index.js.map +1 -0
  116. package/dist/validator/network-validator.d.ts +28 -0
  117. package/dist/validator/network-validator.d.ts.map +1 -0
  118. package/dist/validator/network-validator.js +319 -0
  119. package/dist/validator/network-validator.js.map +1 -0
  120. package/dist/validator/rules-validator.d.ts +11 -0
  121. package/dist/validator/rules-validator.d.ts.map +1 -0
  122. package/dist/validator/rules-validator.js +257 -0
  123. package/dist/validator/rules-validator.js.map +1 -0
  124. package/dist/validator/sdk-validator.d.ts +58 -0
  125. package/dist/validator/sdk-validator.d.ts.map +1 -0
  126. package/{src/validator/sdk-validator.ts → dist/validator/sdk-validator.js} +273 -330
  127. package/dist/validator/sdk-validator.js.map +1 -0
  128. package/dist/validator/structural-validator.d.ts +11 -0
  129. package/dist/validator/structural-validator.d.ts.map +1 -0
  130. package/dist/validator/structural-validator.js +415 -0
  131. package/dist/validator/structural-validator.js.map +1 -0
  132. package/package.json +1 -1
  133. package/publish-output.txt +0 -0
  134. package/CLAUDE.md +0 -109
  135. package/api/analyze-feed.js +0 -140
  136. package/api/badge.js +0 -185
  137. package/api/benchmark.js +0 -177
  138. package/api/directory-stats.ts +0 -29
  139. package/api/directory.ts +0 -73
  140. package/api/generate-compliance.js +0 -143
  141. package/api/generate-schema.js +0 -457
  142. package/api/generate.js +0 -132
  143. package/api/security-scan.js +0 -133
  144. package/api/simulate.js +0 -187
  145. package/api/tsconfig.json +0 -10
  146. package/api/validate.js +0 -1351
  147. package/apify-actor/.actor/actor.json +0 -68
  148. package/apify-actor/.actor/input_schema.json +0 -32
  149. package/apify-actor/APIFY-STORE-LISTING.md +0 -412
  150. package/apify-actor/Dockerfile +0 -8
  151. package/apify-actor/README.md +0 -166
  152. package/apify-actor/main.ts +0 -111
  153. package/apify-actor/package.json +0 -17
  154. package/apify-actor/src/main.js +0 -199
  155. package/docs/BRAND-IDENTITY.md +0 -238
  156. package/docs/BRAND-STYLE-GUIDE.md +0 -356
  157. package/drizzle/0000_black_king_cobra.sql +0 -39
  158. package/drizzle/meta/0000_snapshot.json +0 -309
  159. package/drizzle/meta/_journal.json +0 -13
  160. package/drizzle.config.ts +0 -10
  161. package/public/.well-known/ucp +0 -25
  162. package/public/android-chrome-192x192.png +0 -0
  163. package/public/android-chrome-512x512.png +0 -0
  164. package/public/apple-touch-icon.png +0 -0
  165. package/public/brand.css +0 -321
  166. package/public/directory.html +0 -701
  167. package/public/favicon-16x16.png +0 -0
  168. package/public/favicon-32x32.png +0 -0
  169. package/public/favicon.ico +0 -0
  170. package/public/guides/bigcommerce.html +0 -743
  171. package/public/guides/fastucp.html +0 -838
  172. package/public/guides/magento.html +0 -779
  173. package/public/guides/shopify.html +0 -726
  174. package/public/guides/squarespace.html +0 -749
  175. package/public/guides/wix.html +0 -747
  176. package/public/guides/woocommerce.html +0 -733
  177. package/public/index.html +0 -3835
  178. package/public/learn.html +0 -396
  179. package/public/logo.jpeg +0 -0
  180. package/public/og-image-icon.png +0 -0
  181. package/public/og-image.png +0 -0
  182. package/public/robots.txt +0 -6
  183. package/public/site.webmanifest +0 -31
  184. package/public/sitemap.xml +0 -69
  185. package/public/social/linkedin-banner-1128x191.png +0 -0
  186. package/public/social/temp.PNG +0 -0
  187. package/public/social/x-header-1500x500.png +0 -0
  188. package/public/verify.html +0 -410
  189. package/scripts/generate-favicons.js +0 -44
  190. package/scripts/generate-ico.js +0 -23
  191. package/scripts/generate-og-image.js +0 -45
  192. package/scripts/reset-db.ts +0 -77
  193. package/scripts/seed-db.ts +0 -71
  194. package/scripts/setup-benchmark-db.js +0 -70
  195. package/src/api/server.ts +0 -266
  196. package/src/cli/index.ts +0 -302
  197. package/src/compliance/compliance-generator.ts +0 -452
  198. package/src/compliance/index.ts +0 -28
  199. package/src/compliance/types.ts +0 -170
  200. package/src/db/index.ts +0 -28
  201. package/src/db/schema.ts +0 -84
  202. package/src/feed-analyzer/index.ts +0 -34
  203. package/src/feed-analyzer/types.ts +0 -354
  204. package/src/generator/key-generator.ts +0 -124
  205. package/src/generator/profile-builder.ts +0 -402
  206. package/src/index.ts +0 -105
  207. package/src/security/security-scanner.ts +0 -604
  208. package/src/security/types.ts +0 -55
  209. package/src/services/directory.ts +0 -434
  210. package/src/types/generator.ts +0 -140
  211. package/src/types/ucp-profile.ts +0 -140
  212. package/src/types/validation.ts +0 -89
  213. package/src/validator/index.ts +0 -194
  214. package/src/validator/network-validator.ts +0 -417
  215. package/src/validator/rules-validator.ts +0 -297
  216. package/src/validator/structural-validator.ts +0 -476
  217. package/tests/fixtures/non-compliant-profile.json +0 -25
  218. package/tests/fixtures/official-sample-profile.json +0 -75
  219. package/tests/integration/benchmark.test.ts +0 -207
  220. package/tests/integration/database.test.ts +0 -163
  221. package/tests/integration/directory-api.test.ts +0 -268
  222. package/tests/integration/simulate-api.test.ts +0 -230
  223. package/tests/integration/validate-api.test.ts +0 -269
  224. package/tests/setup.ts +0 -15
  225. package/tests/unit/agent-simulator.test.ts +0 -575
  226. package/tests/unit/compliance-generator.test.ts +0 -374
  227. package/tests/unit/directory-service.test.ts +0 -272
  228. package/tests/unit/feed-analyzer.test.ts +0 -517
  229. package/tests/unit/lint-suggestions.test.ts +0 -423
  230. package/tests/unit/official-samples.test.ts +0 -211
  231. package/tests/unit/pdf-report.test.ts +0 -390
  232. package/tests/unit/sdk-validator.test.ts +0 -531
  233. package/tests/unit/security-scanner.test.ts +0 -410
  234. package/tests/unit/validation.test.ts +0 -390
  235. package/vercel.json +0 -34
  236. package/vitest.config.ts +0 -22
@@ -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"}
@@ -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;AAQ9D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,CA8CrE"}