@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,743 +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>BigCommerce 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 BigCommerce. Make your store AI-ready for ChatGPT and AI shopping agents.">
18
- <link rel="canonical" href="https://ucptools.dev/guides/bigcommerce">
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="#121118">
25
- <meta property="og:title" content="BigCommerce UCP Implementation Guide - AI Commerce Ready">
26
- <meta property="og:description"
27
- content="Make your BigCommerce store AI-ready with UCP. Complete 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: #121118;
45
- --platform-accent: #5C5CE0;
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
- background: var(--color-card);
75
- border-bottom: 1px solid var(--color-border);
76
- padding: 16px 0;
77
- position: sticky;
78
- top: 0;
79
- z-index: 1000;
80
- }
81
-
82
- .header-inner {
83
- display: flex;
84
- justify-content: space-between;
85
- align-items: center;
86
- max-width: 1200px;
87
- margin: 0 auto;
88
- padding: 0 20px;
89
- }
90
-
91
- .logo {
92
- display: flex;
93
- align-items: center;
94
- gap: 12px;
95
- font-size: 24px;
96
- font-weight: 700;
97
- text-decoration: none;
98
- }
99
-
100
- .logo:hover { text-decoration: none; }
101
- .logo-icon { width: 40px; height: 40px; border-radius: 8px; }
102
-
103
- .logo-text {
104
- background: var(--brand-gradient);
105
- -webkit-background-clip: text;
106
- -webkit-text-fill-color: transparent;
107
- background-clip: text;
108
- }
109
-
110
- .logo-suffix { font-weight: 400; -webkit-text-fill-color: var(--color-medium); }
111
-
112
- nav { display: flex; gap: 8px; }
113
-
114
- nav a {
115
- padding: 8px 16px;
116
- color: var(--color-medium);
117
- text-decoration: none;
118
- font-weight: 500;
119
- border-radius: 6px;
120
- transition: all 0.2s;
121
- }
122
-
123
- nav a:hover {
124
- color: var(--brand-blue);
125
- background: rgba(46, 134, 171, 0.08);
126
- text-decoration: none;
127
- }
128
-
129
- nav a.active {
130
- color: var(--brand-blue);
131
- background: rgba(46, 134, 171, 0.12);
132
- }
133
-
134
- .guide-hero {
135
- background: linear-gradient(135deg, #121118 0%, #2a2838 50%, #5C5CE0 100%);
136
- color: white;
137
- padding: 80px 0;
138
- }
139
-
140
- .guide-hero .container { max-width: 800px; }
141
-
142
- .guide-hero h1 {
143
- font-size: 2.75rem;
144
- font-weight: 700;
145
- margin-bottom: 16px;
146
- line-height: 1.2;
147
- }
148
-
149
- .guide-hero p {
150
- font-size: 1.25rem;
151
- opacity: 0.9;
152
- line-height: 1.6;
153
- margin-bottom: 24px;
154
- }
155
-
156
- .guide-badges { display: flex; gap: 12px; flex-wrap: wrap; }
157
-
158
- .guide-badge {
159
- background: rgba(255, 255, 255, 0.15);
160
- backdrop-filter: blur(10px);
161
- padding: 8px 16px;
162
- border-radius: 24px;
163
- font-size: 0.9rem;
164
- font-weight: 500;
165
- border: 1px solid rgba(255, 255, 255, 0.1);
166
- }
167
-
168
- .guide-content {
169
- display: grid;
170
- grid-template-columns: 1fr 260px;
171
- gap: 60px;
172
- max-width: 1100px;
173
- margin: 0 auto;
174
- padding: 60px 20px;
175
- }
176
-
177
- @media (max-width: 968px) {
178
- .guide-content { grid-template-columns: 1fr; gap: 40px; }
179
- .guide-sidebar { order: -1; }
180
- }
181
-
182
- @media (max-width: 600px) {
183
- .guide-hero h1 { font-size: 2rem; }
184
- .guide-hero p { font-size: 1.1rem; }
185
- .header-inner { flex-direction: column; gap: 16px; }
186
- nav { flex-wrap: wrap; justify-content: center; }
187
- }
188
-
189
- .guide-main section { margin-bottom: 48px; }
190
-
191
- .guide-main h2 {
192
- color: var(--color-dark);
193
- font-size: 1.75rem;
194
- font-weight: 700;
195
- margin-bottom: 20px;
196
- padding-bottom: 12px;
197
- border-bottom: 2px solid var(--color-border);
198
- }
199
-
200
- .guide-main h3 {
201
- font-size: 1.25rem;
202
- font-weight: 600;
203
- margin: 32px 0 16px;
204
- color: var(--color-dark);
205
- }
206
-
207
- .guide-main p {
208
- margin-bottom: 16px;
209
- color: var(--color-medium);
210
- font-size: 1.05rem;
211
- line-height: 1.7;
212
- }
213
-
214
- .guide-main ul, .guide-main ol { margin-bottom: 20px; padding-left: 24px; }
215
-
216
- .guide-main li {
217
- margin-bottom: 10px;
218
- color: var(--color-medium);
219
- line-height: 1.6;
220
- }
221
-
222
- .guide-main li strong { color: var(--color-dark); }
223
-
224
- pre {
225
- background: #1e1e1e;
226
- color: #d4d4d4;
227
- padding: 24px;
228
- border-radius: 12px;
229
- overflow-x: auto;
230
- margin: 20px 0;
231
- font-family: 'Fira Code', 'Monaco', 'Consolas', monospace;
232
- font-size: 0.9rem;
233
- line-height: 1.6;
234
- border: 1px solid #333;
235
- }
236
-
237
- code { font-family: 'Fira Code', 'Monaco', 'Consolas', monospace; }
238
-
239
- :not(pre)>code {
240
- background: #EEF2F6;
241
- padding: 3px 8px;
242
- border-radius: 6px;
243
- font-size: 0.9em;
244
- color: var(--platform-accent);
245
- font-weight: 500;
246
- }
247
-
248
- .step-number {
249
- display: inline-flex;
250
- align-items: center;
251
- justify-content: center;
252
- width: 32px;
253
- height: 32px;
254
- background: var(--platform-accent);
255
- color: white;
256
- border-radius: 50%;
257
- font-weight: 700;
258
- font-size: 0.9rem;
259
- margin-right: 12px;
260
- }
261
-
262
- .step-title {
263
- display: flex;
264
- align-items: center;
265
- font-size: 1.25rem;
266
- font-weight: 600;
267
- margin: 32px 0 16px;
268
- color: var(--color-dark);
269
- }
270
-
271
- .tip-box {
272
- background: #EFF6FF;
273
- border-left: 4px solid var(--brand-blue);
274
- padding: 20px 24px;
275
- border-radius: 0 12px 12px 0;
276
- margin: 24px 0;
277
- }
278
-
279
- .tip-box.warning { background: #FEF3C7; border-color: var(--color-warning); }
280
- .tip-box.success { background: #DCFCE7; border-color: var(--color-success); }
281
- .tip-box.platform { background: #F0F0FF; border-color: var(--platform-accent); }
282
-
283
- .tip-box strong {
284
- display: block;
285
- margin-bottom: 6px;
286
- color: var(--color-dark);
287
- font-size: 1rem;
288
- }
289
-
290
- .tip-box p, .tip-box { color: var(--color-medium); font-size: 0.95rem; }
291
-
292
- .cta-box {
293
- background: var(--brand-gradient);
294
- color: white;
295
- padding: 40px;
296
- border-radius: 16px;
297
- text-align: center;
298
- margin: 32px 0;
299
- box-shadow: 0 8px 32px rgba(46, 134, 171, 0.25);
300
- }
301
-
302
- .cta-box h3 { color: white; font-size: 1.5rem; margin-bottom: 12px; }
303
- .cta-box p { color: rgba(255, 255, 255, 0.9); margin-bottom: 24px; font-size: 1.05rem; }
304
-
305
- .cta-box .btn {
306
- background: white;
307
- color: var(--brand-blue);
308
- padding: 14px 32px;
309
- border-radius: 8px;
310
- text-decoration: none;
311
- font-weight: 600;
312
- font-size: 1rem;
313
- display: inline-block;
314
- transition: all 0.2s;
315
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
316
- }
317
-
318
- .cta-box .btn:hover {
319
- transform: translateY(-2px);
320
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
321
- text-decoration: none;
322
- }
323
-
324
- table {
325
- width: 100%;
326
- border-collapse: collapse;
327
- margin: 20px 0;
328
- background: var(--color-card);
329
- border-radius: 12px;
330
- overflow: hidden;
331
- border: 1px solid var(--color-border);
332
- }
333
-
334
- th, td {
335
- text-align: left;
336
- padding: 16px 20px;
337
- border-bottom: 1px solid var(--color-border);
338
- }
339
-
340
- th { background: var(--color-background); font-weight: 600; color: var(--color-dark); }
341
- tr:last-child td { border-bottom: none; }
342
- td code { background: #EEF2F6; padding: 4px 8px; border-radius: 4px; }
343
-
344
- .guide-sidebar { position: sticky; top: 100px; align-self: start; }
345
-
346
- .sidebar-toc {
347
- background: var(--color-card);
348
- border: 1px solid var(--color-border);
349
- border-radius: 12px;
350
- padding: 24px;
351
- }
352
-
353
- .sidebar-toc h4 {
354
- font-size: 0.8rem;
355
- text-transform: uppercase;
356
- letter-spacing: 1px;
357
- color: var(--color-light);
358
- margin-bottom: 16px;
359
- font-weight: 600;
360
- }
361
-
362
- .sidebar-toc ul { list-style: none; padding: 0; margin: 0; }
363
- .sidebar-toc li { margin-bottom: 0; }
364
-
365
- .sidebar-toc a {
366
- display: block;
367
- padding: 10px 12px;
368
- color: var(--color-medium);
369
- text-decoration: none;
370
- font-size: 0.9rem;
371
- border-radius: 6px;
372
- transition: all 0.2s;
373
- }
374
-
375
- .sidebar-toc a:hover {
376
- color: var(--platform-accent);
377
- background: rgba(92, 92, 224, 0.08);
378
- text-decoration: none;
379
- }
380
-
381
- .other-guides {
382
- margin-top: 24px;
383
- padding-top: 24px;
384
- border-top: 1px solid var(--color-border);
385
- }
386
-
387
- .other-guides h4 {
388
- font-size: 0.8rem;
389
- text-transform: uppercase;
390
- letter-spacing: 1px;
391
- color: var(--color-light);
392
- margin-bottom: 12px;
393
- font-weight: 600;
394
- }
395
-
396
- .other-guides a {
397
- display: block;
398
- padding: 8px 12px;
399
- color: var(--color-medium);
400
- font-size: 0.85rem;
401
- border-radius: 6px;
402
- transition: all 0.2s;
403
- }
404
-
405
- .other-guides a:hover {
406
- color: var(--brand-blue);
407
- background: rgba(46, 134, 171, 0.08);
408
- text-decoration: none;
409
- }
410
-
411
- footer {
412
- background: var(--color-dark);
413
- color: white;
414
- padding: 48px 0;
415
- margin-top: 60px;
416
- text-align: center;
417
- }
418
-
419
- footer p { margin: 0; opacity: 0.9; }
420
- footer a { color: var(--brand-teal); }
421
- footer a:hover { color: var(--brand-green); }
422
- .footer-links { margin-top: 12px; opacity: 0.7; }
423
- </style>
424
- </head>
425
-
426
- <body>
427
- <header>
428
- <div class="header-inner">
429
- <a href="/" class="logo">
430
- <img src="/logo.jpeg" alt="UCP.tools logo" class="logo-icon">
431
- <span class="logo-text">UCP<span class="logo-suffix">.tools</span></span>
432
- </a>
433
- <nav>
434
- <a href="/">Validator</a>
435
- <a href="/learn">Learn</a>
436
- <a href="/directory">Directory</a>
437
- <a href="/guides/bigcommerce" class="active">BigCommerce</a>
438
- </nav>
439
- </div>
440
- </header>
441
-
442
- <div class="guide-hero">
443
- <div class="container">
444
- <h1>🛍️ BigCommerce UCP Implementation</h1>
445
- <p>Make your BigCommerce store AI-ready. Enable ChatGPT, Google AI Mode, and AI shopping agents to discover and transact with your products.</p>
446
- <div class="guide-badges">
447
- <span class="guide-badge">🤖 AI Agent Ready</span>
448
- <span class="guide-badge">📡 REST API</span>
449
- <span class="guide-badge">⚙️ Stencil Themes</span>
450
- <span class="guide-badge">🔒 Enterprise Ready</span>
451
- </div>
452
- </div>
453
- </div>
454
-
455
- <div class="guide-content">
456
- <main class="guide-main">
457
- <section id="overview">
458
- <h2>Why Add UCP to BigCommerce?</h2>
459
- <p>
460
- BigCommerce is a leading enterprise eCommerce platform with powerful APIs and headless capabilities. Adding UCP support positions your store for AI-driven commerce and enables AI agents to discover and purchase products.
461
- </p>
462
- <ul>
463
- <li><strong>Powerful APIs:</strong> BigCommerce's REST and GraphQL APIs integrate naturally with UCP</li>
464
- <li><strong>Headless Ready:</strong> Perfect for headless commerce implementations</li>
465
- <li><strong>Multi-Storefront:</strong> Support multiple storefronts with separate UCP profiles</li>
466
- <li><strong>B2B Capabilities:</strong> Expose B2B pricing and catalogs to AI agents</li>
467
- </ul>
468
-
469
- <div class="tip-box platform">
470
- <strong>🏢 Enterprise Feature</strong>
471
- BigCommerce's Script Manager and WebDAV access make UCP implementation straightforward without custom app development.
472
- </div>
473
- </section>
474
-
475
- <section id="methods">
476
- <h2>Implementation Methods</h2>
477
-
478
- <table>
479
- <tr>
480
- <th>Method</th>
481
- <th>Difficulty</th>
482
- <th>Best For</th>
483
- </tr>
484
- <tr>
485
- <td><strong>WebDAV Upload</strong></td>
486
- <td>Easy</td>
487
- <td>Quick setup, static profile</td>
488
- </tr>
489
- <tr>
490
- <td><strong>Stencil Theme</strong></td>
491
- <td>Medium</td>
492
- <td>Dynamic profile from store data</td>
493
- </tr>
494
- <tr>
495
- <td><strong>Custom App</strong></td>
496
- <td>Advanced</td>
497
- <td>Full control, enterprise needs</td>
498
- </tr>
499
- </table>
500
- </section>
501
-
502
- <section id="webdav-method">
503
- <h2>Method 1: WebDAV Upload (Easiest)</h2>
504
- <p>Upload your UCP profile directly to BigCommerce using WebDAV.</p>
505
-
506
- <div class="step-title"><span class="step-number">1</span>Generate Your UCP Profile</div>
507
-
508
- <div class="cta-box">
509
- <h3>Generate Your UCP Profile</h3>
510
- <p>Create a customized UCP profile for your BigCommerce store.</p>
511
- <a href="/#generate" class="btn">Open Generator →</a>
512
- </div>
513
-
514
- <div class="step-title"><span class="step-number">2</span>Get WebDAV Credentials</div>
515
- <ol>
516
- <li>In your BigCommerce admin, go to <strong>Server Settings → File Access (WebDAV)</strong></li>
517
- <li>Note your WebDAV URL, username, and password</li>
518
- </ol>
519
-
520
- <div class="step-title"><span class="step-number">3</span>Connect via WebDAV</div>
521
- <p>Use a WebDAV client (Cyberduck, WinSCP, or Finder on Mac):</p>
522
-
523
- <pre><span style="color:#6A9955"># WebDAV URL format</span>
524
- https://store-XXXXX.mybigcommerce.com/dav
525
-
526
- <span style="color:#6A9955"># Or using command line</span>
527
- cadaver https://store-XXXXX.mybigcommerce.com/dav</pre>
528
-
529
- <div class="step-title"><span class="step-number">4</span>Upload UCP Profile</div>
530
- <ol>
531
- <li>Navigate to the <code>/content/</code> folder</li>
532
- <li>Create a folder named <code>.well-known</code></li>
533
- <li>Upload your <code>ucp.json</code> file as <code>ucp</code> (no extension)</li>
534
- </ol>
535
-
536
- <div class="tip-box">
537
- <strong>💡 File Path</strong>
538
- The final path should be: <code>/content/.well-known/ucp</code>
539
- </div>
540
-
541
- <div class="step-title"><span class="step-number">5</span>Configure Server</div>
542
- <p>BigCommerce serves files from <code>/content/</code> at the root. Your UCP profile will be accessible at:</p>
543
- <pre>https://yourstore.com/.well-known/ucp</pre>
544
-
545
- <div class="tip-box warning">
546
- <strong>⚠️ Content Type</strong>
547
- If your file isn't served as JSON, you may need to create a redirect or use the Stencil method below.
548
- </div>
549
- </section>
550
-
551
- <section id="stencil-method">
552
- <h2>Method 2: Stencil Theme</h2>
553
- <p>For dynamic UCP profiles that pull data from your store settings.</p>
554
-
555
- <div class="step-title"><span class="step-number">1</span>Set Up Stencil CLI</div>
556
- <pre><span style="color:#6A9955"># Install Stencil CLI</span>
557
- npm install -g @bigcommerce/stencil-cli
558
-
559
- <span style="color:#6A9955"># Clone your theme</span>
560
- stencil init</pre>
561
-
562
- <div class="step-title"><span class="step-number">2</span>Create UCP Template</div>
563
- <p>Create a new template file <code>templates/pages/custom/ucp.html</code>:</p>
564
-
565
- <pre><span style="color:#808080">---</span>
566
- <span style="color:#9CDCFE">layout</span>: <span style="color:#CE9178">false</span>
567
- <span style="color:#808080">---</span>
568
- {
569
- <span style="color:#9CDCFE">"profile_version"</span>: <span style="color:#CE9178">"1.0"</span>,
570
- <span style="color:#9CDCFE">"merchant"</span>: {
571
- <span style="color:#9CDCFE">"name"</span>: <span style="color:#CE9178">"{{settings.store_name}}"</span>,
572
- <span style="color:#9CDCFE">"url"</span>: <span style="color:#CE9178">"{{settings.base_url}}"</span>,
573
- <span style="color:#9CDCFE">"contact"</span>: {
574
- <span style="color:#9CDCFE">"email"</span>: <span style="color:#CE9178">"{{settings.store_email}}"</span>,
575
- <span style="color:#9CDCFE">"phone"</span>: <span style="color:#CE9178">"{{settings.store_phone}}"</span>
576
- }
577
- },
578
- <span style="color:#9CDCFE">"capabilities"</span>: [<span style="color:#CE9178">"browse"</span>, <span style="color:#CE9178">"search"</span>],
579
- <span style="color:#9CDCFE">"policies"</span>: {
580
- <span style="color:#9CDCFE">"returns_url"</span>: <span style="color:#CE9178">"{{settings.base_url}}/returns-policy/"</span>,
581
- <span style="color:#9CDCFE">"shipping_url"</span>: <span style="color:#CE9178">"{{settings.base_url}}/shipping/"</span>,
582
- <span style="color:#9CDCFE">"privacy_url"</span>: <span style="color:#CE9178">"{{settings.base_url}}/privacy-policy/"</span>
583
- },
584
- <span style="color:#9CDCFE">"service_bindings"</span>: [
585
- {
586
- <span style="color:#9CDCFE">"type"</span>: <span style="color:#CE9178">"REST"</span>,
587
- <span style="color:#9CDCFE">"base_url"</span>: <span style="color:#CE9178">"https://api.bigcommerce.com/stores/{{settings.store_hash}}/v3"</span>
588
- }
589
- ]
590
- }</pre>
591
-
592
- <div class="step-title"><span class="step-number">3</span>Add Route</div>
593
- <p>In <code>config.json</code>, add a custom route:</p>
594
-
595
- <pre>{
596
- <span style="color:#9CDCFE">"routes"</span>: {
597
- <span style="color:#9CDCFE">"custom"</span>: {
598
- <span style="color:#9CDCFE">".well-known/ucp"</span>: <span style="color:#CE9178">"pages/custom/ucp"</span>
599
- }
600
- }
601
- }</pre>
602
-
603
- <div class="step-title"><span class="step-number">4</span>Deploy Theme</div>
604
- <pre><span style="color:#6A9955"># Bundle and push theme</span>
605
- stencil bundle
606
- stencil push</pre>
607
- </section>
608
-
609
- <section id="api-integration">
610
- <h2>BigCommerce API Integration</h2>
611
- <p>
612
- BigCommerce's APIs work well with UCP. Expose your API endpoints in the UCP profile for AI agents.
613
- </p>
614
-
615
- <h3>Useful API Endpoints</h3>
616
- <table>
617
- <tr>
618
- <th>Endpoint</th>
619
- <th>Purpose</th>
620
- </tr>
621
- <tr>
622
- <td><code>/v3/catalog/products</code></td>
623
- <td>Product catalog browsing</td>
624
- </tr>
625
- <tr>
626
- <td><code>/v3/catalog/categories</code></td>
627
- <td>Category navigation</td>
628
- </tr>
629
- <tr>
630
- <td><code>/v3/carts</code></td>
631
- <td>Shopping cart management</td>
632
- </tr>
633
- <tr>
634
- <td><code>/v3/checkouts</code></td>
635
- <td>Checkout process</td>
636
- </tr>
637
- </table>
638
-
639
- <div class="tip-box">
640
- <strong>💡 API Tokens</strong>
641
- For AI agents to use your API, you'll need to provide appropriate authentication. Consider creating read-only tokens for product discovery.
642
- </div>
643
- </section>
644
-
645
- <section id="validation">
646
- <h2>Validate Your Implementation</h2>
647
-
648
- <div class="cta-box">
649
- <h3>Validate Your BigCommerce Store</h3>
650
- <p>Check your UCP implementation and AI commerce readiness.</p>
651
- <a href="/" class="btn">Run Validation →</a>
652
- </div>
653
- </section>
654
-
655
- <section id="common-issues">
656
- <h2>Common Issues & Solutions</h2>
657
-
658
- <table>
659
- <tr>
660
- <th>Issue</th>
661
- <th>Solution</th>
662
- </tr>
663
- <tr>
664
- <td>404 on <code>/.well-known/ucp</code></td>
665
- <td>Check WebDAV file path or Stencil route config</td>
666
- </tr>
667
- <tr>
668
- <td>Wrong content type</td>
669
- <td>Use Stencil with <code>layout: false</code> for JSON response</td>
670
- </tr>
671
- <tr>
672
- <td>CDN caching issues</td>
673
- <td>Purge CDN cache after uploading new profile</td>
674
- </tr>
675
- <tr>
676
- <td>CORS errors</td>
677
- <td>BigCommerce handles CORS for content files automatically</td>
678
- </tr>
679
- </table>
680
- </section>
681
-
682
- <section id="testing">
683
- <h2>🤖 Test with AI Agents</h2>
684
-
685
- <div class="cta-box">
686
- <h3>Run AI Agent Simulation</h3>
687
- <p>Test how AI shopping agents will interact with your BigCommerce store.</p>
688
- <a href="/#simulate" class="btn">Open Simulator →</a>
689
- </div>
690
- </section>
691
-
692
- <section id="resources">
693
- <h2>Resources</h2>
694
- <ul>
695
- <li><a href="https://ucp.dev" target="_blank">Official UCP Specification</a></li>
696
- <li><a href="https://developer.bigcommerce.com/docs/rest-catalog" target="_blank">BigCommerce Catalog API</a></li>
697
- <li><a href="https://developer.bigcommerce.com/docs/storefront/stencil" target="_blank">Stencil Theme Development</a></li>
698
- <li><a href="https://support.bigcommerce.com/s/article/File-Access-WebDAV" target="_blank">BigCommerce WebDAV Guide</a></li>
699
- <li><a href="/learn">UCP Learning Center</a></li>
700
- </ul>
701
- </section>
702
- </main>
703
-
704
- <aside class="guide-sidebar">
705
- <div class="sidebar-toc">
706
- <h4>On This Page</h4>
707
- <ul>
708
- <li><a href="#overview">Why Add UCP?</a></li>
709
- <li><a href="#methods">Implementation Methods</a></li>
710
- <li><a href="#webdav-method">WebDAV Upload</a></li>
711
- <li><a href="#stencil-method">Stencil Theme</a></li>
712
- <li><a href="#api-integration">API Integration</a></li>
713
- <li><a href="#validation">Validation</a></li>
714
- <li><a href="#common-issues">Common Issues</a></li>
715
- <li><a href="#testing">Test with AI</a></li>
716
- <li><a href="#resources">Resources</a></li>
717
- </ul>
718
- </div>
719
-
720
- <div class="other-guides">
721
- <h4>Other Platforms</h4>
722
- <a href="/guides/shopify">Shopify</a>
723
- <a href="/guides/woocommerce">WooCommerce</a>
724
- <a href="/guides/magento">Magento</a>
725
- <a href="/guides/wix">Wix</a>
726
- <a href="/guides/squarespace">Squarespace</a>
727
- </div>
728
- </aside>
729
- </div>
730
-
731
- <footer>
732
- <div class="container">
733
- <p>UCP Tools — Built for the AI Commerce era</p>
734
- <p class="footer-links">
735
- <a href="https://github.com/Nolpak14/ucp-tools" target="_blank">GitHub</a> ·
736
- <a href="https://ucp.dev" target="_blank">UCP Spec</a> ·
737
- <a href="/">Validator</a>
738
- </p>
739
- </div>
740
- </footer>
741
- </body>
742
-
743
- </html>