@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
@@ -1,726 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
-
4
- <head>
5
- <!-- Google Analytics -->
6
- <script async src="https://www.googletagmanager.com/gtag/js?id=G-J5JSHV7H1E"></script>
7
- <script>
8
- window.dataLayer = window.dataLayer || [];
9
- function gtag() { dataLayer.push(arguments); }
10
- gtag('js', new Date());
11
- gtag('config', 'G-J5JSHV7H1E');
12
- </script>
13
- <meta charset="UTF-8">
14
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
15
- <title>Shopify UCP Implementation Guide - AI Commerce Ready | UCP Tools</title>
16
- <meta name="description"
17
- content="Step-by-step guide to implementing UCP (Universal Commerce Protocol) on your Shopify store. Make your store AI-ready for ChatGPT, Google AI Mode, and AI shopping agents.">
18
- <link rel="canonical" href="https://ucptools.dev/guides/shopify">
19
- <link rel="icon" type="image/x-icon" href="/favicon.ico">
20
- <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
21
- <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
22
- <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
23
- <link rel="manifest" href="/site.webmanifest">
24
- <meta name="theme-color" content="#96BF48">
25
- <meta property="og:title" content="Shopify UCP Implementation Guide - AI Commerce Ready">
26
- <meta property="og:description"
27
- content="Make your Shopify store AI-ready with UCP. Step-by-step implementation guide.">
28
- <meta property="og:image" content="/og-image.png">
29
- <meta property="og:type" content="article">
30
-
31
- <!-- Google Fonts -->
32
- <link rel="preconnect" href="https://fonts.googleapis.com">
33
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
34
- <link
35
- href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap"
36
- rel="stylesheet">
37
-
38
- <style>
39
- :root {
40
- --brand-blue: #2E86AB;
41
- --brand-teal: #36B5A2;
42
- --brand-green: #47C97A;
43
- --brand-gradient: linear-gradient(135deg, #2E86AB 0%, #36B5A2 50%, #47C97A 100%);
44
- --platform-color: #96BF48;
45
- --platform-dark: #5E8E3E;
46
- --color-dark: #1A2B3C;
47
- --color-medium: #5A6978;
48
- --color-light: #94A3B8;
49
- --color-border: #E2E8F0;
50
- --color-background: #F8FAFC;
51
- --color-card: #FFFFFF;
52
- --color-success: #47C97A;
53
- --color-warning: #F59E0B;
54
- --color-error: #EF4444;
55
- --color-info: #2E86AB;
56
- }
57
-
58
- * { box-sizing: border-box; margin: 0; padding: 0; }
59
-
60
- body {
61
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
62
- background: var(--color-background);
63
- color: var(--color-dark);
64
- line-height: 1.6;
65
- min-height: 100vh;
66
- }
67
-
68
- a { color: var(--brand-blue); text-decoration: none; }
69
- a:hover { text-decoration: underline; }
70
-
71
- .container { max-width: 1200px; margin: 0 auto; padding: 0 20px; }
72
-
73
- /* Header */
74
- header {
75
- background: var(--color-card);
76
- border-bottom: 1px solid var(--color-border);
77
- padding: 16px 0;
78
- position: sticky;
79
- top: 0;
80
- z-index: 1000;
81
- }
82
-
83
- .header-inner {
84
- display: flex;
85
- justify-content: space-between;
86
- align-items: center;
87
- max-width: 1200px;
88
- margin: 0 auto;
89
- padding: 0 20px;
90
- }
91
-
92
- .logo {
93
- display: flex;
94
- align-items: center;
95
- gap: 12px;
96
- font-size: 24px;
97
- font-weight: 700;
98
- text-decoration: none;
99
- }
100
-
101
- .logo:hover { text-decoration: none; }
102
-
103
- .logo-icon { width: 40px; height: 40px; border-radius: 8px; }
104
-
105
- .logo-text {
106
- background: var(--brand-gradient);
107
- -webkit-background-clip: text;
108
- -webkit-text-fill-color: transparent;
109
- background-clip: text;
110
- }
111
-
112
- .logo-suffix { font-weight: 400; -webkit-text-fill-color: var(--color-medium); }
113
-
114
- nav { display: flex; gap: 8px; }
115
-
116
- nav a {
117
- padding: 8px 16px;
118
- color: var(--color-medium);
119
- text-decoration: none;
120
- font-weight: 500;
121
- border-radius: 6px;
122
- transition: all 0.2s;
123
- }
124
-
125
- nav a:hover {
126
- color: var(--brand-blue);
127
- background: rgba(46, 134, 171, 0.08);
128
- text-decoration: none;
129
- }
130
-
131
- nav a.active {
132
- color: var(--brand-blue);
133
- background: rgba(46, 134, 171, 0.12);
134
- }
135
-
136
- /* Hero */
137
- .guide-hero {
138
- background: linear-gradient(135deg, #5E8E3E 0%, #96BF48 100%);
139
- color: white;
140
- padding: 80px 0;
141
- }
142
-
143
- .guide-hero .container { max-width: 800px; }
144
-
145
- .guide-hero h1 {
146
- font-size: 2.75rem;
147
- font-weight: 700;
148
- margin-bottom: 16px;
149
- line-height: 1.2;
150
- }
151
-
152
- .guide-hero p {
153
- font-size: 1.25rem;
154
- opacity: 0.9;
155
- line-height: 1.6;
156
- margin-bottom: 24px;
157
- }
158
-
159
- .guide-badges { display: flex; gap: 12px; flex-wrap: wrap; }
160
-
161
- .guide-badge {
162
- background: rgba(255, 255, 255, 0.15);
163
- backdrop-filter: blur(10px);
164
- padding: 8px 16px;
165
- border-radius: 24px;
166
- font-size: 0.9rem;
167
- font-weight: 500;
168
- border: 1px solid rgba(255, 255, 255, 0.1);
169
- }
170
-
171
- /* Content Layout */
172
- .guide-content {
173
- display: grid;
174
- grid-template-columns: 1fr 260px;
175
- gap: 60px;
176
- max-width: 1100px;
177
- margin: 0 auto;
178
- padding: 60px 20px;
179
- }
180
-
181
- @media (max-width: 968px) {
182
- .guide-content { grid-template-columns: 1fr; gap: 40px; }
183
- .guide-sidebar { order: -1; }
184
- }
185
-
186
- @media (max-width: 600px) {
187
- .guide-hero h1 { font-size: 2rem; }
188
- .guide-hero p { font-size: 1.1rem; }
189
- .header-inner { flex-direction: column; gap: 16px; }
190
- nav { flex-wrap: wrap; justify-content: center; }
191
- }
192
-
193
- /* Main Content */
194
- .guide-main section { margin-bottom: 48px; }
195
-
196
- .guide-main h2 {
197
- color: var(--color-dark);
198
- font-size: 1.75rem;
199
- font-weight: 700;
200
- margin-bottom: 20px;
201
- padding-bottom: 12px;
202
- border-bottom: 2px solid var(--color-border);
203
- }
204
-
205
- .guide-main h3 {
206
- font-size: 1.25rem;
207
- font-weight: 600;
208
- margin: 32px 0 16px;
209
- color: var(--color-dark);
210
- }
211
-
212
- .guide-main p {
213
- margin-bottom: 16px;
214
- color: var(--color-medium);
215
- font-size: 1.05rem;
216
- line-height: 1.7;
217
- }
218
-
219
- .guide-main ul, .guide-main ol { margin-bottom: 20px; padding-left: 24px; }
220
-
221
- .guide-main li {
222
- margin-bottom: 10px;
223
- color: var(--color-medium);
224
- line-height: 1.6;
225
- }
226
-
227
- .guide-main li strong { color: var(--color-dark); }
228
-
229
- /* Code */
230
- pre {
231
- background: #1e1e1e;
232
- color: #d4d4d4;
233
- padding: 24px;
234
- border-radius: 12px;
235
- overflow-x: auto;
236
- margin: 20px 0;
237
- font-family: 'Fira Code', 'Monaco', 'Consolas', monospace;
238
- font-size: 0.9rem;
239
- line-height: 1.6;
240
- border: 1px solid #333;
241
- }
242
-
243
- code { font-family: 'Fira Code', 'Monaco', 'Consolas', monospace; }
244
-
245
- :not(pre)>code {
246
- background: #EEF2F6;
247
- padding: 3px 8px;
248
- border-radius: 6px;
249
- font-size: 0.9em;
250
- color: var(--platform-dark);
251
- font-weight: 500;
252
- }
253
-
254
- /* Steps */
255
- .step-number {
256
- display: inline-flex;
257
- align-items: center;
258
- justify-content: center;
259
- width: 32px;
260
- height: 32px;
261
- background: var(--platform-color);
262
- color: white;
263
- border-radius: 50%;
264
- font-weight: 700;
265
- font-size: 0.9rem;
266
- margin-right: 12px;
267
- }
268
-
269
- .step-title {
270
- display: flex;
271
- align-items: center;
272
- font-size: 1.25rem;
273
- font-weight: 600;
274
- margin: 32px 0 16px;
275
- color: var(--color-dark);
276
- }
277
-
278
- /* Tip boxes */
279
- .tip-box {
280
- background: #EFF6FF;
281
- border-left: 4px solid var(--brand-blue);
282
- padding: 20px 24px;
283
- border-radius: 0 12px 12px 0;
284
- margin: 24px 0;
285
- }
286
-
287
- .tip-box.warning {
288
- background: #FEF3C7;
289
- border-color: var(--color-warning);
290
- }
291
-
292
- .tip-box.success {
293
- background: #DCFCE7;
294
- border-color: var(--color-success);
295
- }
296
-
297
- .tip-box.platform {
298
- background: #F0F7E6;
299
- border-color: var(--platform-color);
300
- }
301
-
302
- .tip-box strong {
303
- display: block;
304
- margin-bottom: 6px;
305
- color: var(--color-dark);
306
- font-size: 1rem;
307
- }
308
-
309
- .tip-box p, .tip-box { color: var(--color-medium); font-size: 0.95rem; }
310
-
311
- /* CTA */
312
- .cta-box {
313
- background: var(--brand-gradient);
314
- color: white;
315
- padding: 40px;
316
- border-radius: 16px;
317
- text-align: center;
318
- margin: 32px 0;
319
- box-shadow: 0 8px 32px rgba(46, 134, 171, 0.25);
320
- }
321
-
322
- .cta-box h3 { color: white; font-size: 1.5rem; margin-bottom: 12px; }
323
-
324
- .cta-box p { color: rgba(255, 255, 255, 0.9); margin-bottom: 24px; font-size: 1.05rem; }
325
-
326
- .cta-box .btn {
327
- background: white;
328
- color: var(--brand-blue);
329
- padding: 14px 32px;
330
- border-radius: 8px;
331
- text-decoration: none;
332
- font-weight: 600;
333
- font-size: 1rem;
334
- display: inline-block;
335
- transition: all 0.2s;
336
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
337
- }
338
-
339
- .cta-box .btn:hover {
340
- transform: translateY(-2px);
341
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
342
- text-decoration: none;
343
- }
344
-
345
- /* Tables */
346
- table {
347
- width: 100%;
348
- border-collapse: collapse;
349
- margin: 20px 0;
350
- background: var(--color-card);
351
- border-radius: 12px;
352
- overflow: hidden;
353
- border: 1px solid var(--color-border);
354
- }
355
-
356
- th, td {
357
- text-align: left;
358
- padding: 16px 20px;
359
- border-bottom: 1px solid var(--color-border);
360
- }
361
-
362
- th { background: var(--color-background); font-weight: 600; color: var(--color-dark); }
363
-
364
- tr:last-child td { border-bottom: none; }
365
-
366
- td code { background: #EEF2F6; padding: 4px 8px; border-radius: 4px; }
367
-
368
- /* Sidebar */
369
- .guide-sidebar { position: sticky; top: 100px; align-self: start; }
370
-
371
- .sidebar-toc {
372
- background: var(--color-card);
373
- border: 1px solid var(--color-border);
374
- border-radius: 12px;
375
- padding: 24px;
376
- }
377
-
378
- .sidebar-toc h4 {
379
- font-size: 0.8rem;
380
- text-transform: uppercase;
381
- letter-spacing: 1px;
382
- color: var(--color-light);
383
- margin-bottom: 16px;
384
- font-weight: 600;
385
- }
386
-
387
- .sidebar-toc ul { list-style: none; padding: 0; margin: 0; }
388
-
389
- .sidebar-toc li { margin-bottom: 0; }
390
-
391
- .sidebar-toc a {
392
- display: block;
393
- padding: 10px 12px;
394
- color: var(--color-medium);
395
- text-decoration: none;
396
- font-size: 0.9rem;
397
- border-radius: 6px;
398
- transition: all 0.2s;
399
- }
400
-
401
- .sidebar-toc a:hover {
402
- color: var(--platform-color);
403
- background: rgba(150, 191, 72, 0.08);
404
- text-decoration: none;
405
- }
406
-
407
- /* Other guides */
408
- .other-guides {
409
- margin-top: 24px;
410
- padding-top: 24px;
411
- border-top: 1px solid var(--color-border);
412
- }
413
-
414
- .other-guides h4 {
415
- font-size: 0.8rem;
416
- text-transform: uppercase;
417
- letter-spacing: 1px;
418
- color: var(--color-light);
419
- margin-bottom: 12px;
420
- font-weight: 600;
421
- }
422
-
423
- .other-guides a {
424
- display: block;
425
- padding: 8px 12px;
426
- color: var(--color-medium);
427
- font-size: 0.85rem;
428
- border-radius: 6px;
429
- transition: all 0.2s;
430
- }
431
-
432
- .other-guides a:hover {
433
- color: var(--brand-blue);
434
- background: rgba(46, 134, 171, 0.08);
435
- text-decoration: none;
436
- }
437
-
438
- /* Footer */
439
- footer {
440
- background: var(--color-dark);
441
- color: white;
442
- padding: 48px 0;
443
- margin-top: 60px;
444
- text-align: center;
445
- }
446
-
447
- footer p { margin: 0; opacity: 0.9; }
448
- footer a { color: var(--brand-teal); }
449
- footer a:hover { color: var(--brand-green); }
450
- .footer-links { margin-top: 12px; opacity: 0.7; }
451
- </style>
452
- </head>
453
-
454
- <body>
455
- <header>
456
- <div class="header-inner">
457
- <a href="/" class="logo">
458
- <img src="/logo.jpeg" alt="UCP.tools logo" class="logo-icon">
459
- <span class="logo-text">UCP<span class="logo-suffix">.tools</span></span>
460
- </a>
461
- <nav>
462
- <a href="/">Validator</a>
463
- <a href="/learn">Learn</a>
464
- <a href="/directory">Directory</a>
465
- <a href="/guides/shopify" class="active">Shopify</a>
466
- </nav>
467
- </div>
468
- </header>
469
-
470
- <div class="guide-hero">
471
- <div class="container">
472
- <h1>🛒 Shopify UCP Implementation</h1>
473
- <p>Make your Shopify store AI-ready. Enable ChatGPT, Google AI Mode, and autonomous shopping agents to discover and transact with your products.</p>
474
- <div class="guide-badges">
475
- <span class="guide-badge">🤖 AI Agent Ready</span>
476
- <span class="guide-badge">⚡ 15 min setup</span>
477
- <span class="guide-badge">📱 No coding required</span>
478
- <span class="guide-badge">🔒 Secure</span>
479
- </div>
480
- </div>
481
- </div>
482
-
483
- <div class="guide-content">
484
- <main class="guide-main">
485
- <section id="overview">
486
- <h2>Why Add UCP to Your Shopify Store?</h2>
487
- <p>
488
- The Universal Commerce Protocol (UCP) is an open standard that allows AI agents to discover, browse, and purchase from your store. With AI shopping assistants like ChatGPT, Google AI Mode, and Microsoft Copilot becoming mainstream, UCP-enabled stores have a significant advantage.
489
- </p>
490
- <ul>
491
- <li><strong>AI Discovery:</strong> Your products appear in AI-powered shopping recommendations</li>
492
- <li><strong>Autonomous Checkout:</strong> AI agents can complete purchases on behalf of customers</li>
493
- <li><strong>Structured Data:</strong> Machine-readable product and policy information</li>
494
- <li><strong>Future-Proof:</strong> Ready for the AI commerce revolution</li>
495
- </ul>
496
-
497
- <div class="tip-box platform">
498
- <strong>🛍️ Shopify Advantage</strong>
499
- Shopify's flexible file hosting and theme customization make UCP implementation straightforward. You can add a UCP profile without any apps or coding.
500
- </div>
501
- </section>
502
-
503
- <section id="prerequisites">
504
- <h2>Prerequisites</h2>
505
- <ul>
506
- <li>A Shopify store (any plan)</li>
507
- <li>Admin access to your store</li>
508
- <li>Your store's domain (e.g., <code>yourstore.myshopify.com</code> or custom domain)</li>
509
- <li>Basic understanding of your store's policies (returns, shipping, etc.)</li>
510
- </ul>
511
- </section>
512
-
513
- <section id="implementation">
514
- <h2>Step-by-Step Implementation</h2>
515
-
516
- <div class="step-title"><span class="step-number">1</span>Generate Your UCP Profile</div>
517
- <p>
518
- First, use the UCP Tools generator to create a UCP profile customized for your store. This will create a JSON file with your store's capabilities, policies, and product information.
519
- </p>
520
-
521
- <div class="cta-box">
522
- <h3>Generate Your UCP Profile</h3>
523
- <p>Enter your store details and we'll create a UCP-compliant profile for you.</p>
524
- <a href="/#generate" class="btn">Open Generator →</a>
525
- </div>
526
-
527
- <p>When generating, you'll need:</p>
528
- <ul>
529
- <li>Your store name and description</li>
530
- <li>Store URL (your Shopify domain)</li>
531
- <li>Return policy URL (usually <code>/policies/refund-policy</code>)</li>
532
- <li>Shipping policy URL (usually <code>/policies/shipping-policy</code>)</li>
533
- <li>Contact email for customer support</li>
534
- </ul>
535
-
536
- <div class="step-title"><span class="step-number">2</span>Create the .well-known Folder</div>
537
- <p>
538
- Shopify doesn't have a native way to serve files from <code>/.well-known/</code>, but you can use a workaround with theme files and a redirect.
539
- </p>
540
-
541
- <h3>Option A: Using Shopify Files (Recommended)</h3>
542
- <ol>
543
- <li>Go to <strong>Settings → Files</strong> in your Shopify admin</li>
544
- <li>Click <strong>Upload files</strong></li>
545
- <li>Upload your <code>ucp.json</code> file (generated in Step 1)</li>
546
- <li>Copy the file URL (it will look like <code>https://cdn.shopify.com/s/files/...</code>)</li>
547
- </ol>
548
-
549
- <div class="step-title"><span class="step-number">3</span>Add the Redirect</div>
550
- <p>
551
- Now create a redirect so AI agents can find your UCP profile at the standard location.
552
- </p>
553
- <ol>
554
- <li>Go to <strong>Online Store → Navigation</strong></li>
555
- <li>Scroll down to <strong>URL Redirects</strong></li>
556
- <li>Click <strong>Add URL redirect</strong></li>
557
- <li>Set the redirect:
558
- <ul>
559
- <li><strong>Redirect from:</strong> <code>/.well-known/ucp</code></li>
560
- <li><strong>Redirect to:</strong> Your CDN file URL from Step 2</li>
561
- </ul>
562
- </li>
563
- <li>Click <strong>Save redirect</strong></li>
564
- </ol>
565
-
566
- <div class="tip-box warning">
567
- <strong>⚠️ Important: CORS Headers</strong>
568
- Shopify's CDN automatically serves files with proper CORS headers, so AI agents from different origins can access your UCP profile.
569
- </div>
570
-
571
- <h3>Option B: Using Theme Liquid (Advanced)</h3>
572
- <p>For more control, you can serve the UCP profile directly from your theme:</p>
573
- <ol>
574
- <li>Go to <strong>Online Store → Themes → Edit code</strong></li>
575
- <li>Create a new template: <strong>Templates → Add a new template</strong></li>
576
- <li>Select <strong>page</strong> as the type and name it <code>ucp</code></li>
577
- <li>Replace the content with:</li>
578
- </ol>
579
-
580
- <pre><span style="color:#808080">{%- layout none -%}</span>
581
- <span style="color:#808080">{%- comment -%}</span>
582
- UCP Profile - Universal Commerce Protocol
583
- Generated by UCP Tools
584
- <span style="color:#808080">{%- endcomment -%}</span>
585
- {
586
- <span style="color:#9CDCFE">"profile_version"</span>: <span style="color:#CE9178">"1.0"</span>,
587
- <span style="color:#9CDCFE">"merchant"</span>: {
588
- <span style="color:#9CDCFE">"name"</span>: <span style="color:#CE9178">"{{ shop.name }}"</span>,
589
- <span style="color:#9CDCFE">"url"</span>: <span style="color:#CE9178">"{{ shop.url }}"</span>,
590
- <span style="color:#9CDCFE">"contact"</span>: {
591
- <span style="color:#9CDCFE">"email"</span>: <span style="color:#CE9178">"{{ shop.email }}"</span>
592
- }
593
- },
594
- <span style="color:#9CDCFE">"capabilities"</span>: [<span style="color:#CE9178">"browse"</span>, <span style="color:#CE9178">"search"</span>],
595
- <span style="color:#9CDCFE">"policies"</span>: {
596
- <span style="color:#9CDCFE">"returns_url"</span>: <span style="color:#CE9178">"{{ shop.url }}/policies/refund-policy"</span>,
597
- <span style="color:#9CDCFE">"shipping_url"</span>: <span style="color:#CE9178">"{{ shop.url }}/policies/shipping-policy"</span>,
598
- <span style="color:#9CDCFE">"privacy_url"</span>: <span style="color:#CE9178">"{{ shop.url }}/policies/privacy-policy"</span>
599
- }
600
- }</pre>
601
-
602
- <ol start="5">
603
- <li>Create a page with the handle <code>well-known-ucp</code></li>
604
- <li>Add the redirect from <code>/.well-known/ucp</code> to <code>/pages/well-known-ucp</code></li>
605
- </ol>
606
-
607
- <div class="step-title"><span class="step-number">4</span>Add Schema.org Markup</div>
608
- <p>
609
- For maximum AI compatibility, add Schema.org markup to your product pages. Shopify themes often include this by default, but verify it's present.
610
- </p>
611
- <p>Go to <strong>Online Store → Themes → Edit code</strong> and check <code>product.liquid</code> or <code>main-product.liquid</code> for JSON-LD structured data.</p>
612
-
613
- <div class="tip-box">
614
- <strong>💡 Pro Tip</strong>
615
- Use <a href="https://search.google.com/test/rich-results" target="_blank">Google's Rich Results Test</a> to verify your Schema.org markup is correct.
616
- </div>
617
-
618
- <div class="step-title"><span class="step-number">5</span>Validate Your Implementation</div>
619
- <p>After setup, validate your UCP profile to ensure everything is working correctly.</p>
620
-
621
- <div class="cta-box">
622
- <h3>Validate Your Shopify Store</h3>
623
- <p>Enter your store URL to check AI commerce readiness.</p>
624
- <a href="/" class="btn">Run Validation →</a>
625
- </div>
626
- </section>
627
-
628
- <section id="common-issues">
629
- <h2>Common Issues & Solutions</h2>
630
-
631
- <table>
632
- <tr>
633
- <th>Issue</th>
634
- <th>Solution</th>
635
- </tr>
636
- <tr>
637
- <td>404 on <code>/.well-known/ucp</code></td>
638
- <td>Check that your redirect is active and the target file exists</td>
639
- </tr>
640
- <tr>
641
- <td>CORS errors</td>
642
- <td>Shopify CDN should handle this; try re-uploading the file</td>
643
- </tr>
644
- <tr>
645
- <td>Invalid JSON</td>
646
- <td>Re-generate your UCP profile using the generator tool</td>
647
- </tr>
648
- <tr>
649
- <td>Missing policies</td>
650
- <td>Ensure all policy pages exist and are published in Shopify</td>
651
- </tr>
652
- </table>
653
- </section>
654
-
655
- <section id="shopify-apps">
656
- <h2>Shopify Apps for UCP</h2>
657
- <p>While you can implement UCP manually, there are apps that simplify the process:</p>
658
-
659
- <div class="tip-box platform">
660
- <strong>🔌 Coming Soon</strong>
661
- We're working with Shopify app developers to create dedicated UCP apps. Check back soon or <a href="mailto:hello@ucptools.dev">contact us</a> for updates.
662
- </div>
663
-
664
- <p>In the meantime, manual implementation is straightforward and gives you full control over your UCP profile.</p>
665
- </section>
666
-
667
- <section id="testing">
668
- <h2>🤖 Test with AI Agents</h2>
669
- <p>After implementation, test how AI shopping agents will interact with your store:</p>
670
-
671
- <div class="cta-box">
672
- <h3>Run AI Agent Simulation</h3>
673
- <p>Test the full AI shopping experience on your Shopify store.</p>
674
- <a href="/#simulate" class="btn">Open Simulator →</a>
675
- </div>
676
- </section>
677
-
678
- <section id="resources">
679
- <h2>Resources</h2>
680
- <ul>
681
- <li><a href="https://ucp.dev" target="_blank">Official UCP Specification</a></li>
682
- <li><a href="https://help.shopify.com/en/manual/online-store/themes/theme-structure/extend/files" target="_blank">Shopify Files Documentation</a></li>
683
- <li><a href="https://help.shopify.com/en/manual/online-store/menus-and-links/url-redirect" target="_blank">Shopify URL Redirects Guide</a></li>
684
- <li><a href="/learn">UCP Learning Center</a></li>
685
- </ul>
686
- </section>
687
- </main>
688
-
689
- <aside class="guide-sidebar">
690
- <div class="sidebar-toc">
691
- <h4>On This Page</h4>
692
- <ul>
693
- <li><a href="#overview">Why Add UCP?</a></li>
694
- <li><a href="#prerequisites">Prerequisites</a></li>
695
- <li><a href="#implementation">Implementation Steps</a></li>
696
- <li><a href="#common-issues">Common Issues</a></li>
697
- <li><a href="#shopify-apps">Shopify Apps</a></li>
698
- <li><a href="#testing">Test with AI Agents</a></li>
699
- <li><a href="#resources">Resources</a></li>
700
- </ul>
701
- </div>
702
-
703
- <div class="other-guides">
704
- <h4>Other Platforms</h4>
705
- <a href="/guides/woocommerce">WooCommerce</a>
706
- <a href="/guides/magento">Magento</a>
707
- <a href="/guides/wix">Wix</a>
708
- <a href="/guides/bigcommerce">BigCommerce</a>
709
- <a href="/guides/squarespace">Squarespace</a>
710
- </div>
711
- </aside>
712
- </div>
713
-
714
- <footer>
715
- <div class="container">
716
- <p>UCP Tools — Built for the AI Commerce era</p>
717
- <p class="footer-links">
718
- <a href="https://github.com/Nolpak14/ucp-tools" target="_blank">GitHub</a> ·
719
- <a href="https://ucp.dev" target="_blank">UCP Spec</a> ·
720
- <a href="/">Validator</a>
721
- </p>
722
- </div>
723
- </footer>
724
- </body>
725
-
726
- </html>