@cimplify/sdk 0.44.34 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/README.md +21 -16
  2. package/dist/styles.css +1 -1
  3. package/package.json +5 -9
  4. package/dist/cli/commands/deploy.mjs +0 -717
  5. package/dist/cli/commands/dev.mjs +0 -479
  6. package/dist/cli/commands/domains.mjs +0 -769
  7. package/dist/cli/commands/env.mjs +0 -705
  8. package/dist/cli/commands/link.mjs +0 -378
  9. package/dist/cli/commands/login.mjs +0 -584
  10. package/dist/cli/commands/logout.mjs +0 -75
  11. package/dist/cli/commands/logs.mjs +0 -432
  12. package/dist/cli/commands/projects.mjs +0 -473
  13. package/dist/cli/commands/repo.mjs +0 -584
  14. package/dist/cli/commands/rollback.mjs +0 -553
  15. package/dist/cli/commands/status.mjs +0 -450
  16. package/dist/cli/commands/unlink.mjs +0 -79
  17. package/dist/cli/commands/whoami.mjs +0 -285
  18. package/dist/cli.js +0 -184
  19. package/dist/dispatcher.mjs +0 -360
  20. package/registry/booking-page.json +0 -18
  21. package/registry/bookings-page.json +0 -17
  22. package/registry/service-card.json +0 -16
  23. package/registry/service-grid.json +0 -16
  24. package/templates/storefront-bakery/.claude/skills/cimplify-storefront/SKILL.md +0 -145
  25. package/templates/storefront-bakery/.cursor/rules/cimplify-storefront.mdc +0 -25
  26. package/templates/storefront-bakery/.env.example +0 -16
  27. package/templates/storefront-bakery/AGENTS.md +0 -120
  28. package/templates/storefront-bakery/CLAUDE.md +0 -22
  29. package/templates/storefront-bakery/README.md +0 -73
  30. package/templates/storefront-bakery/__tests__/brand.test.ts +0 -4
  31. package/templates/storefront-bakery/__tests__/cart-flow.test.ts +0 -4
  32. package/templates/storefront-bakery/__tests__/contract.test.ts +0 -4
  33. package/templates/storefront-bakery/app/about/page.tsx +0 -38
  34. package/templates/storefront-bakery/app/accessibility/page.tsx +0 -11
  35. package/templates/storefront-bakery/app/account/addresses/page.tsx +0 -21
  36. package/templates/storefront-bakery/app/account/orders/page.tsx +0 -21
  37. package/templates/storefront-bakery/app/account/page.tsx +0 -22
  38. package/templates/storefront-bakery/app/account/settings/page.tsx +0 -21
  39. package/templates/storefront-bakery/app/cart/page.tsx +0 -9
  40. package/templates/storefront-bakery/app/categories/[slug]/listing-client.tsx +0 -19
  41. package/templates/storefront-bakery/app/categories/[slug]/page.tsx +0 -118
  42. package/templates/storefront-bakery/app/checkout/page.tsx +0 -17
  43. package/templates/storefront-bakery/app/collections/[slug]/listing-client.tsx +0 -20
  44. package/templates/storefront-bakery/app/collections/[slug]/page.tsx +0 -118
  45. package/templates/storefront-bakery/app/contact/contact-form.tsx +0 -109
  46. package/templates/storefront-bakery/app/contact/page.tsx +0 -54
  47. package/templates/storefront-bakery/app/error.tsx +0 -60
  48. package/templates/storefront-bakery/app/faq/page.tsx +0 -46
  49. package/templates/storefront-bakery/app/globals.css +0 -47
  50. package/templates/storefront-bakery/app/layout.tsx +0 -82
  51. package/templates/storefront-bakery/app/llms.txt/route.ts +0 -94
  52. package/templates/storefront-bakery/app/login/page.tsx +0 -17
  53. package/templates/storefront-bakery/app/not-found.tsx +0 -39
  54. package/templates/storefront-bakery/app/opensearch.xml/route.ts +0 -37
  55. package/templates/storefront-bakery/app/orders/[id]/page.tsx +0 -21
  56. package/templates/storefront-bakery/app/page.tsx +0 -97
  57. package/templates/storefront-bakery/app/privacy/page.tsx +0 -44
  58. package/templates/storefront-bakery/app/returns/page.tsx +0 -11
  59. package/templates/storefront-bakery/app/robots.ts +0 -18
  60. package/templates/storefront-bakery/app/search/page.tsx +0 -38
  61. package/templates/storefront-bakery/app/search/search-client.tsx +0 -7
  62. package/templates/storefront-bakery/app/shipping/page.tsx +0 -16
  63. package/templates/storefront-bakery/app/shop/page.tsx +0 -31
  64. package/templates/storefront-bakery/app/shop/shop-client.tsx +0 -27
  65. package/templates/storefront-bakery/app/signup/page.tsx +0 -17
  66. package/templates/storefront-bakery/app/sitemap-page/page.tsx +0 -167
  67. package/templates/storefront-bakery/app/sitemap.ts +0 -62
  68. package/templates/storefront-bakery/app/terms/page.tsx +0 -44
  69. package/templates/storefront-bakery/app/track-order/page.tsx +0 -24
  70. package/templates/storefront-bakery/app/track-order/track-order-form.tsx +0 -69
  71. package/templates/storefront-bakery/components/account-iframe.tsx +0 -13
  72. package/templates/storefront-bakery/components/cart-drawer.tsx +0 -14
  73. package/templates/storefront-bakery/components/cart-pill.tsx +0 -36
  74. package/templates/storefront-bakery/components/category-grid.tsx +0 -28
  75. package/templates/storefront-bakery/components/collection-strip.tsx +0 -45
  76. package/templates/storefront-bakery/components/footer.tsx +0 -148
  77. package/templates/storefront-bakery/components/header.tsx +0 -43
  78. package/templates/storefront-bakery/components/hero.tsx +0 -25
  79. package/templates/storefront-bakery/components/nav-link.tsx +0 -20
  80. package/templates/storefront-bakery/components/policy-page.tsx +0 -49
  81. package/templates/storefront-bakery/components/product-modal.tsx +0 -104
  82. package/templates/storefront-bakery/components/providers.tsx +0 -35
  83. package/templates/storefront-bakery/components/store-product-card.tsx +0 -87
  84. package/templates/storefront-bakery/lib/brand.ts +0 -570
  85. package/templates/storefront-bakery/lib/cart.ts +0 -12
  86. package/templates/storefront-bakery/next.config.ts +0 -42
  87. package/templates/storefront-bakery/package.json +0 -35
  88. package/templates/storefront-bakery/postcss.config.mjs +0 -7
  89. package/templates/storefront-bakery/tsconfig.json +0 -23
  90. package/templates/storefront-bakery/vitest.config.ts +0 -9
  91. package/templates/storefront-fashion/.claude/skills/cimplify-storefront/SKILL.md +0 -145
  92. package/templates/storefront-fashion/.cursor/rules/cimplify-storefront.mdc +0 -25
  93. package/templates/storefront-fashion/.env.example +0 -16
  94. package/templates/storefront-fashion/AGENTS.md +0 -126
  95. package/templates/storefront-fashion/CLAUDE.md +0 -22
  96. package/templates/storefront-fashion/README.md +0 -77
  97. package/templates/storefront-fashion/__tests__/brand.test.ts +0 -4
  98. package/templates/storefront-fashion/__tests__/cart-flow.test.ts +0 -55
  99. package/templates/storefront-fashion/__tests__/contract.test.ts +0 -4
  100. package/templates/storefront-fashion/app/about/page.tsx +0 -41
  101. package/templates/storefront-fashion/app/accessibility/page.tsx +0 -11
  102. package/templates/storefront-fashion/app/account/addresses/page.tsx +0 -21
  103. package/templates/storefront-fashion/app/account/orders/page.tsx +0 -21
  104. package/templates/storefront-fashion/app/account/page.tsx +0 -22
  105. package/templates/storefront-fashion/app/account/settings/page.tsx +0 -21
  106. package/templates/storefront-fashion/app/cart/page.tsx +0 -9
  107. package/templates/storefront-fashion/app/categories/[slug]/listing-client.tsx +0 -19
  108. package/templates/storefront-fashion/app/categories/[slug]/page.tsx +0 -130
  109. package/templates/storefront-fashion/app/checkout/page.tsx +0 -17
  110. package/templates/storefront-fashion/app/collections/[slug]/listing-client.tsx +0 -20
  111. package/templates/storefront-fashion/app/collections/[slug]/page.tsx +0 -130
  112. package/templates/storefront-fashion/app/contact/contact-form.tsx +0 -109
  113. package/templates/storefront-fashion/app/contact/page.tsx +0 -54
  114. package/templates/storefront-fashion/app/error.tsx +0 -61
  115. package/templates/storefront-fashion/app/faq/page.tsx +0 -46
  116. package/templates/storefront-fashion/app/globals.css +0 -46
  117. package/templates/storefront-fashion/app/layout.tsx +0 -78
  118. package/templates/storefront-fashion/app/llms.txt/route.ts +0 -94
  119. package/templates/storefront-fashion/app/login/page.tsx +0 -17
  120. package/templates/storefront-fashion/app/lookbook/page.tsx +0 -132
  121. package/templates/storefront-fashion/app/not-found.tsx +0 -39
  122. package/templates/storefront-fashion/app/opensearch.xml/route.ts +0 -37
  123. package/templates/storefront-fashion/app/orders/[id]/page.tsx +0 -24
  124. package/templates/storefront-fashion/app/page.tsx +0 -183
  125. package/templates/storefront-fashion/app/privacy/page.tsx +0 -44
  126. package/templates/storefront-fashion/app/products/[slug]/page.tsx +0 -165
  127. package/templates/storefront-fashion/app/products/[slug]/product-detail.tsx +0 -70
  128. package/templates/storefront-fashion/app/returns/page.tsx +0 -11
  129. package/templates/storefront-fashion/app/robots.ts +0 -18
  130. package/templates/storefront-fashion/app/search/page.tsx +0 -38
  131. package/templates/storefront-fashion/app/search/search-client.tsx +0 -7
  132. package/templates/storefront-fashion/app/shipping/page.tsx +0 -16
  133. package/templates/storefront-fashion/app/shop/page.tsx +0 -63
  134. package/templates/storefront-fashion/app/shop/shop-client.tsx +0 -32
  135. package/templates/storefront-fashion/app/signup/page.tsx +0 -17
  136. package/templates/storefront-fashion/app/sitemap-page/page.tsx +0 -167
  137. package/templates/storefront-fashion/app/sitemap.ts +0 -59
  138. package/templates/storefront-fashion/app/size-guide/page.tsx +0 -155
  139. package/templates/storefront-fashion/app/terms/page.tsx +0 -44
  140. package/templates/storefront-fashion/app/track-order/page.tsx +0 -24
  141. package/templates/storefront-fashion/app/track-order/track-order-form.tsx +0 -69
  142. package/templates/storefront-fashion/components/account-iframe.tsx +0 -13
  143. package/templates/storefront-fashion/components/brand-marquee.tsx +0 -27
  144. package/templates/storefront-fashion/components/cart-drawer.tsx +0 -14
  145. package/templates/storefront-fashion/components/cart-pill.tsx +0 -36
  146. package/templates/storefront-fashion/components/category-grid.tsx +0 -28
  147. package/templates/storefront-fashion/components/category-tiles.tsx +0 -104
  148. package/templates/storefront-fashion/components/collection-strip.tsx +0 -45
  149. package/templates/storefront-fashion/components/feature-hero.tsx +0 -82
  150. package/templates/storefront-fashion/components/footer.tsx +0 -153
  151. package/templates/storefront-fashion/components/header.tsx +0 -43
  152. package/templates/storefront-fashion/components/hero.tsx +0 -28
  153. package/templates/storefront-fashion/components/nav-link.tsx +0 -20
  154. package/templates/storefront-fashion/components/newsletter.tsx +0 -50
  155. package/templates/storefront-fashion/components/policy-page.tsx +0 -49
  156. package/templates/storefront-fashion/components/promo-banner.tsx +0 -41
  157. package/templates/storefront-fashion/components/providers.tsx +0 -35
  158. package/templates/storefront-fashion/components/section-heading.tsx +0 -37
  159. package/templates/storefront-fashion/components/store-product-card.tsx +0 -87
  160. package/templates/storefront-fashion/components/trade-in-cta.tsx +0 -54
  161. package/templates/storefront-fashion/components/trust-bar.tsx +0 -66
  162. package/templates/storefront-fashion/e2e/visual.spec.ts +0 -52
  163. package/templates/storefront-fashion/lib/brand.ts +0 -518
  164. package/templates/storefront-fashion/lib/cart.ts +0 -12
  165. package/templates/storefront-fashion/next.config.ts +0 -42
  166. package/templates/storefront-fashion/package.json +0 -38
  167. package/templates/storefront-fashion/playwright.config.ts +0 -48
  168. package/templates/storefront-fashion/postcss.config.mjs +0 -7
  169. package/templates/storefront-fashion/tsconfig.json +0 -23
  170. package/templates/storefront-fashion/vitest.config.ts +0 -9
  171. package/templates/storefront-grocery/.claude/skills/cimplify-storefront/SKILL.md +0 -145
  172. package/templates/storefront-grocery/.cursor/rules/cimplify-storefront.mdc +0 -25
  173. package/templates/storefront-grocery/.env.example +0 -16
  174. package/templates/storefront-grocery/AGENTS.md +0 -96
  175. package/templates/storefront-grocery/CLAUDE.md +0 -22
  176. package/templates/storefront-grocery/README.md +0 -73
  177. package/templates/storefront-grocery/__tests__/brand.test.ts +0 -4
  178. package/templates/storefront-grocery/__tests__/cart-flow.test.ts +0 -4
  179. package/templates/storefront-grocery/__tests__/contract.test.ts +0 -4
  180. package/templates/storefront-grocery/app/about/page.tsx +0 -38
  181. package/templates/storefront-grocery/app/accessibility/page.tsx +0 -11
  182. package/templates/storefront-grocery/app/account/addresses/page.tsx +0 -21
  183. package/templates/storefront-grocery/app/account/orders/page.tsx +0 -21
  184. package/templates/storefront-grocery/app/account/page.tsx +0 -22
  185. package/templates/storefront-grocery/app/account/settings/page.tsx +0 -21
  186. package/templates/storefront-grocery/app/cart/page.tsx +0 -9
  187. package/templates/storefront-grocery/app/categories/[slug]/listing-client.tsx +0 -19
  188. package/templates/storefront-grocery/app/categories/[slug]/page.tsx +0 -118
  189. package/templates/storefront-grocery/app/checkout/page.tsx +0 -17
  190. package/templates/storefront-grocery/app/collections/[slug]/listing-client.tsx +0 -20
  191. package/templates/storefront-grocery/app/collections/[slug]/page.tsx +0 -118
  192. package/templates/storefront-grocery/app/contact/contact-form.tsx +0 -109
  193. package/templates/storefront-grocery/app/contact/page.tsx +0 -54
  194. package/templates/storefront-grocery/app/error.tsx +0 -60
  195. package/templates/storefront-grocery/app/faq/page.tsx +0 -46
  196. package/templates/storefront-grocery/app/globals.css +0 -45
  197. package/templates/storefront-grocery/app/layout.tsx +0 -77
  198. package/templates/storefront-grocery/app/llms.txt/route.ts +0 -94
  199. package/templates/storefront-grocery/app/login/page.tsx +0 -17
  200. package/templates/storefront-grocery/app/not-found.tsx +0 -39
  201. package/templates/storefront-grocery/app/opensearch.xml/route.ts +0 -37
  202. package/templates/storefront-grocery/app/orders/[id]/page.tsx +0 -21
  203. package/templates/storefront-grocery/app/page.tsx +0 -97
  204. package/templates/storefront-grocery/app/privacy/page.tsx +0 -44
  205. package/templates/storefront-grocery/app/returns/page.tsx +0 -11
  206. package/templates/storefront-grocery/app/robots.ts +0 -18
  207. package/templates/storefront-grocery/app/search/page.tsx +0 -38
  208. package/templates/storefront-grocery/app/search/search-client.tsx +0 -7
  209. package/templates/storefront-grocery/app/shipping/page.tsx +0 -16
  210. package/templates/storefront-grocery/app/shop/page.tsx +0 -31
  211. package/templates/storefront-grocery/app/shop/shop-client.tsx +0 -27
  212. package/templates/storefront-grocery/app/signup/page.tsx +0 -17
  213. package/templates/storefront-grocery/app/sitemap-page/page.tsx +0 -167
  214. package/templates/storefront-grocery/app/sitemap.ts +0 -62
  215. package/templates/storefront-grocery/app/terms/page.tsx +0 -44
  216. package/templates/storefront-grocery/app/track-order/page.tsx +0 -24
  217. package/templates/storefront-grocery/app/track-order/track-order-form.tsx +0 -69
  218. package/templates/storefront-grocery/components/account-iframe.tsx +0 -13
  219. package/templates/storefront-grocery/components/cart-drawer.tsx +0 -14
  220. package/templates/storefront-grocery/components/cart-pill.tsx +0 -36
  221. package/templates/storefront-grocery/components/category-grid.tsx +0 -28
  222. package/templates/storefront-grocery/components/collection-strip.tsx +0 -45
  223. package/templates/storefront-grocery/components/footer.tsx +0 -148
  224. package/templates/storefront-grocery/components/header.tsx +0 -43
  225. package/templates/storefront-grocery/components/hero.tsx +0 -25
  226. package/templates/storefront-grocery/components/nav-link.tsx +0 -20
  227. package/templates/storefront-grocery/components/policy-page.tsx +0 -49
  228. package/templates/storefront-grocery/components/product-modal.tsx +0 -104
  229. package/templates/storefront-grocery/components/providers.tsx +0 -35
  230. package/templates/storefront-grocery/components/store-product-card.tsx +0 -87
  231. package/templates/storefront-grocery/lib/brand.ts +0 -375
  232. package/templates/storefront-grocery/lib/cart.ts +0 -12
  233. package/templates/storefront-grocery/next.config.ts +0 -42
  234. package/templates/storefront-grocery/package.json +0 -35
  235. package/templates/storefront-grocery/postcss.config.mjs +0 -7
  236. package/templates/storefront-grocery/tsconfig.json +0 -23
  237. package/templates/storefront-grocery/vitest.config.ts +0 -9
  238. package/templates/storefront-restaurant/.claude/skills/cimplify-storefront/SKILL.md +0 -145
  239. package/templates/storefront-restaurant/.cursor/rules/cimplify-storefront.mdc +0 -25
  240. package/templates/storefront-restaurant/.env.example +0 -16
  241. package/templates/storefront-restaurant/AGENTS.md +0 -102
  242. package/templates/storefront-restaurant/CLAUDE.md +0 -22
  243. package/templates/storefront-restaurant/README.md +0 -73
  244. package/templates/storefront-restaurant/__tests__/brand.test.ts +0 -4
  245. package/templates/storefront-restaurant/__tests__/cart-flow.test.ts +0 -4
  246. package/templates/storefront-restaurant/__tests__/contract.test.ts +0 -4
  247. package/templates/storefront-restaurant/app/about/page.tsx +0 -38
  248. package/templates/storefront-restaurant/app/accessibility/page.tsx +0 -11
  249. package/templates/storefront-restaurant/app/account/addresses/page.tsx +0 -21
  250. package/templates/storefront-restaurant/app/account/orders/page.tsx +0 -21
  251. package/templates/storefront-restaurant/app/account/page.tsx +0 -22
  252. package/templates/storefront-restaurant/app/account/settings/page.tsx +0 -21
  253. package/templates/storefront-restaurant/app/cart/page.tsx +0 -9
  254. package/templates/storefront-restaurant/app/categories/[slug]/listing-client.tsx +0 -19
  255. package/templates/storefront-restaurant/app/categories/[slug]/page.tsx +0 -118
  256. package/templates/storefront-restaurant/app/checkout/page.tsx +0 -17
  257. package/templates/storefront-restaurant/app/collections/[slug]/listing-client.tsx +0 -20
  258. package/templates/storefront-restaurant/app/collections/[slug]/page.tsx +0 -118
  259. package/templates/storefront-restaurant/app/contact/contact-form.tsx +0 -109
  260. package/templates/storefront-restaurant/app/contact/page.tsx +0 -54
  261. package/templates/storefront-restaurant/app/error.tsx +0 -60
  262. package/templates/storefront-restaurant/app/faq/page.tsx +0 -46
  263. package/templates/storefront-restaurant/app/globals.css +0 -44
  264. package/templates/storefront-restaurant/app/layout.tsx +0 -82
  265. package/templates/storefront-restaurant/app/llms.txt/route.ts +0 -94
  266. package/templates/storefront-restaurant/app/login/page.tsx +0 -17
  267. package/templates/storefront-restaurant/app/not-found.tsx +0 -39
  268. package/templates/storefront-restaurant/app/opensearch.xml/route.ts +0 -37
  269. package/templates/storefront-restaurant/app/orders/[id]/page.tsx +0 -21
  270. package/templates/storefront-restaurant/app/page.tsx +0 -97
  271. package/templates/storefront-restaurant/app/privacy/page.tsx +0 -44
  272. package/templates/storefront-restaurant/app/reservations/page.tsx +0 -66
  273. package/templates/storefront-restaurant/app/reservations/reservations-client.tsx +0 -234
  274. package/templates/storefront-restaurant/app/returns/page.tsx +0 -11
  275. package/templates/storefront-restaurant/app/robots.ts +0 -18
  276. package/templates/storefront-restaurant/app/search/page.tsx +0 -38
  277. package/templates/storefront-restaurant/app/search/search-client.tsx +0 -7
  278. package/templates/storefront-restaurant/app/shipping/page.tsx +0 -16
  279. package/templates/storefront-restaurant/app/shop/page.tsx +0 -31
  280. package/templates/storefront-restaurant/app/shop/shop-client.tsx +0 -27
  281. package/templates/storefront-restaurant/app/signup/page.tsx +0 -17
  282. package/templates/storefront-restaurant/app/sitemap-page/page.tsx +0 -167
  283. package/templates/storefront-restaurant/app/sitemap.ts +0 -62
  284. package/templates/storefront-restaurant/app/terms/page.tsx +0 -44
  285. package/templates/storefront-restaurant/app/track-order/page.tsx +0 -24
  286. package/templates/storefront-restaurant/app/track-order/track-order-form.tsx +0 -69
  287. package/templates/storefront-restaurant/components/account-iframe.tsx +0 -13
  288. package/templates/storefront-restaurant/components/cart-drawer.tsx +0 -14
  289. package/templates/storefront-restaurant/components/cart-pill.tsx +0 -36
  290. package/templates/storefront-restaurant/components/category-grid.tsx +0 -28
  291. package/templates/storefront-restaurant/components/collection-strip.tsx +0 -45
  292. package/templates/storefront-restaurant/components/footer.tsx +0 -148
  293. package/templates/storefront-restaurant/components/header.tsx +0 -43
  294. package/templates/storefront-restaurant/components/hero.tsx +0 -25
  295. package/templates/storefront-restaurant/components/nav-link.tsx +0 -20
  296. package/templates/storefront-restaurant/components/policy-page.tsx +0 -49
  297. package/templates/storefront-restaurant/components/product-modal.tsx +0 -104
  298. package/templates/storefront-restaurant/components/providers.tsx +0 -35
  299. package/templates/storefront-restaurant/components/store-product-card.tsx +0 -87
  300. package/templates/storefront-restaurant/lib/brand.ts +0 -377
  301. package/templates/storefront-restaurant/lib/cart.ts +0 -12
  302. package/templates/storefront-restaurant/next.config.ts +0 -42
  303. package/templates/storefront-restaurant/package.json +0 -35
  304. package/templates/storefront-restaurant/postcss.config.mjs +0 -7
  305. package/templates/storefront-restaurant/tsconfig.json +0 -23
  306. package/templates/storefront-restaurant/vitest.config.ts +0 -9
  307. package/templates/storefront-retail/.claude/skills/cimplify-storefront/SKILL.md +0 -145
  308. package/templates/storefront-retail/.cursor/rules/cimplify-storefront.mdc +0 -25
  309. package/templates/storefront-retail/.env.example +0 -16
  310. package/templates/storefront-retail/AGENTS.md +0 -117
  311. package/templates/storefront-retail/CLAUDE.md +0 -22
  312. package/templates/storefront-retail/README.md +0 -77
  313. package/templates/storefront-retail/__tests__/brand.test.ts +0 -4
  314. package/templates/storefront-retail/__tests__/cart-flow.test.ts +0 -4
  315. package/templates/storefront-retail/__tests__/contract.test.ts +0 -4
  316. package/templates/storefront-retail/app/about/page.tsx +0 -41
  317. package/templates/storefront-retail/app/accessibility/page.tsx +0 -11
  318. package/templates/storefront-retail/app/account/addresses/page.tsx +0 -21
  319. package/templates/storefront-retail/app/account/orders/page.tsx +0 -21
  320. package/templates/storefront-retail/app/account/page.tsx +0 -22
  321. package/templates/storefront-retail/app/account/settings/page.tsx +0 -21
  322. package/templates/storefront-retail/app/cart/page.tsx +0 -9
  323. package/templates/storefront-retail/app/categories/[slug]/listing-client.tsx +0 -19
  324. package/templates/storefront-retail/app/categories/[slug]/page.tsx +0 -130
  325. package/templates/storefront-retail/app/checkout/page.tsx +0 -17
  326. package/templates/storefront-retail/app/collections/[slug]/listing-client.tsx +0 -20
  327. package/templates/storefront-retail/app/collections/[slug]/page.tsx +0 -130
  328. package/templates/storefront-retail/app/contact/contact-form.tsx +0 -109
  329. package/templates/storefront-retail/app/contact/page.tsx +0 -54
  330. package/templates/storefront-retail/app/error.tsx +0 -61
  331. package/templates/storefront-retail/app/faq/page.tsx +0 -46
  332. package/templates/storefront-retail/app/globals.css +0 -47
  333. package/templates/storefront-retail/app/layout.tsx +0 -77
  334. package/templates/storefront-retail/app/llms.txt/route.ts +0 -94
  335. package/templates/storefront-retail/app/login/page.tsx +0 -17
  336. package/templates/storefront-retail/app/not-found.tsx +0 -39
  337. package/templates/storefront-retail/app/opensearch.xml/route.ts +0 -37
  338. package/templates/storefront-retail/app/orders/[id]/page.tsx +0 -24
  339. package/templates/storefront-retail/app/page.tsx +0 -182
  340. package/templates/storefront-retail/app/privacy/page.tsx +0 -44
  341. package/templates/storefront-retail/app/products/[slug]/page.tsx +0 -165
  342. package/templates/storefront-retail/app/products/[slug]/product-detail.tsx +0 -70
  343. package/templates/storefront-retail/app/returns/page.tsx +0 -11
  344. package/templates/storefront-retail/app/robots.ts +0 -18
  345. package/templates/storefront-retail/app/search/page.tsx +0 -38
  346. package/templates/storefront-retail/app/search/search-client.tsx +0 -7
  347. package/templates/storefront-retail/app/shipping/page.tsx +0 -16
  348. package/templates/storefront-retail/app/shop/page.tsx +0 -63
  349. package/templates/storefront-retail/app/shop/shop-client.tsx +0 -32
  350. package/templates/storefront-retail/app/signup/page.tsx +0 -17
  351. package/templates/storefront-retail/app/sitemap-page/page.tsx +0 -167
  352. package/templates/storefront-retail/app/sitemap.ts +0 -59
  353. package/templates/storefront-retail/app/terms/page.tsx +0 -44
  354. package/templates/storefront-retail/app/track-order/page.tsx +0 -24
  355. package/templates/storefront-retail/app/track-order/track-order-form.tsx +0 -69
  356. package/templates/storefront-retail/components/account-iframe.tsx +0 -13
  357. package/templates/storefront-retail/components/brand-marquee.tsx +0 -27
  358. package/templates/storefront-retail/components/cart-drawer.tsx +0 -14
  359. package/templates/storefront-retail/components/cart-pill.tsx +0 -36
  360. package/templates/storefront-retail/components/category-grid.tsx +0 -28
  361. package/templates/storefront-retail/components/category-tiles.tsx +0 -104
  362. package/templates/storefront-retail/components/collection-strip.tsx +0 -45
  363. package/templates/storefront-retail/components/feature-hero.tsx +0 -84
  364. package/templates/storefront-retail/components/footer.tsx +0 -153
  365. package/templates/storefront-retail/components/header.tsx +0 -45
  366. package/templates/storefront-retail/components/hero.tsx +0 -28
  367. package/templates/storefront-retail/components/nav-link.tsx +0 -20
  368. package/templates/storefront-retail/components/newsletter.tsx +0 -50
  369. package/templates/storefront-retail/components/policy-page.tsx +0 -49
  370. package/templates/storefront-retail/components/promo-banner.tsx +0 -41
  371. package/templates/storefront-retail/components/providers.tsx +0 -35
  372. package/templates/storefront-retail/components/section-heading.tsx +0 -37
  373. package/templates/storefront-retail/components/store-product-card.tsx +0 -87
  374. package/templates/storefront-retail/components/trade-in-cta.tsx +0 -54
  375. package/templates/storefront-retail/components/trust-bar.tsx +0 -66
  376. package/templates/storefront-retail/lib/brand.ts +0 -664
  377. package/templates/storefront-retail/lib/cart.ts +0 -12
  378. package/templates/storefront-retail/next.config.ts +0 -42
  379. package/templates/storefront-retail/package.json +0 -35
  380. package/templates/storefront-retail/postcss.config.mjs +0 -7
  381. package/templates/storefront-retail/tsconfig.json +0 -23
  382. package/templates/storefront-retail/vitest.config.ts +0 -9
  383. package/templates/storefront-services/.claude/skills/cimplify-storefront/SKILL.md +0 -145
  384. package/templates/storefront-services/.cursor/rules/cimplify-storefront.mdc +0 -25
  385. package/templates/storefront-services/.env.example +0 -16
  386. package/templates/storefront-services/AGENTS.md +0 -101
  387. package/templates/storefront-services/CLAUDE.md +0 -22
  388. package/templates/storefront-services/README.md +0 -73
  389. package/templates/storefront-services/__tests__/brand.test.ts +0 -4
  390. package/templates/storefront-services/__tests__/cart-flow.test.ts +0 -4
  391. package/templates/storefront-services/__tests__/contract.test.ts +0 -4
  392. package/templates/storefront-services/app/about/page.tsx +0 -38
  393. package/templates/storefront-services/app/accessibility/page.tsx +0 -11
  394. package/templates/storefront-services/app/account/addresses/page.tsx +0 -21
  395. package/templates/storefront-services/app/account/orders/page.tsx +0 -21
  396. package/templates/storefront-services/app/account/page.tsx +0 -22
  397. package/templates/storefront-services/app/account/settings/page.tsx +0 -21
  398. package/templates/storefront-services/app/book/book-client.tsx +0 -195
  399. package/templates/storefront-services/app/book/page.tsx +0 -65
  400. package/templates/storefront-services/app/cart/page.tsx +0 -9
  401. package/templates/storefront-services/app/categories/[slug]/listing-client.tsx +0 -19
  402. package/templates/storefront-services/app/categories/[slug]/page.tsx +0 -118
  403. package/templates/storefront-services/app/checkout/page.tsx +0 -17
  404. package/templates/storefront-services/app/collections/[slug]/listing-client.tsx +0 -20
  405. package/templates/storefront-services/app/collections/[slug]/page.tsx +0 -118
  406. package/templates/storefront-services/app/contact/contact-form.tsx +0 -109
  407. package/templates/storefront-services/app/contact/page.tsx +0 -54
  408. package/templates/storefront-services/app/error.tsx +0 -60
  409. package/templates/storefront-services/app/faq/page.tsx +0 -46
  410. package/templates/storefront-services/app/globals.css +0 -45
  411. package/templates/storefront-services/app/layout.tsx +0 -82
  412. package/templates/storefront-services/app/llms.txt/route.ts +0 -94
  413. package/templates/storefront-services/app/login/page.tsx +0 -17
  414. package/templates/storefront-services/app/not-found.tsx +0 -39
  415. package/templates/storefront-services/app/opensearch.xml/route.ts +0 -37
  416. package/templates/storefront-services/app/orders/[id]/page.tsx +0 -21
  417. package/templates/storefront-services/app/page.tsx +0 -97
  418. package/templates/storefront-services/app/privacy/page.tsx +0 -44
  419. package/templates/storefront-services/app/returns/page.tsx +0 -11
  420. package/templates/storefront-services/app/robots.ts +0 -18
  421. package/templates/storefront-services/app/search/page.tsx +0 -38
  422. package/templates/storefront-services/app/search/search-client.tsx +0 -7
  423. package/templates/storefront-services/app/shipping/page.tsx +0 -16
  424. package/templates/storefront-services/app/shop/page.tsx +0 -31
  425. package/templates/storefront-services/app/shop/shop-client.tsx +0 -27
  426. package/templates/storefront-services/app/signup/page.tsx +0 -17
  427. package/templates/storefront-services/app/sitemap-page/page.tsx +0 -167
  428. package/templates/storefront-services/app/sitemap.ts +0 -62
  429. package/templates/storefront-services/app/terms/page.tsx +0 -44
  430. package/templates/storefront-services/app/track-order/page.tsx +0 -24
  431. package/templates/storefront-services/app/track-order/track-order-form.tsx +0 -69
  432. package/templates/storefront-services/components/account-iframe.tsx +0 -13
  433. package/templates/storefront-services/components/cart-drawer.tsx +0 -14
  434. package/templates/storefront-services/components/cart-pill.tsx +0 -36
  435. package/templates/storefront-services/components/category-grid.tsx +0 -28
  436. package/templates/storefront-services/components/collection-strip.tsx +0 -45
  437. package/templates/storefront-services/components/footer.tsx +0 -148
  438. package/templates/storefront-services/components/header.tsx +0 -43
  439. package/templates/storefront-services/components/hero.tsx +0 -25
  440. package/templates/storefront-services/components/nav-link.tsx +0 -20
  441. package/templates/storefront-services/components/policy-page.tsx +0 -49
  442. package/templates/storefront-services/components/product-modal.tsx +0 -104
  443. package/templates/storefront-services/components/providers.tsx +0 -35
  444. package/templates/storefront-services/components/store-product-card.tsx +0 -87
  445. package/templates/storefront-services/lib/brand.ts +0 -396
  446. package/templates/storefront-services/lib/cart.ts +0 -12
  447. package/templates/storefront-services/next.config.ts +0 -42
  448. package/templates/storefront-services/package.json +0 -35
  449. package/templates/storefront-services/postcss.config.mjs +0 -7
  450. package/templates/storefront-services/tsconfig.json +0 -23
  451. package/templates/storefront-services/vitest.config.ts +0 -9
@@ -1,705 +0,0 @@
1
- import { promises } from 'fs';
2
- import path from 'path';
3
- import os from 'os';
4
- import readline from 'readline';
5
-
6
- // src/cli/commands/env.ts
7
-
8
- // src/cli/errors.ts
9
- var CLI_ERROR_CODE = {
10
- NOT_LOGGED_IN: "NOT_LOGGED_IN",
11
- NOT_LINKED: "NOT_LINKED",
12
- NETWORK_ERROR: "NETWORK_ERROR",
13
- AUTH_FAILED: "AUTH_FAILED",
14
- PROJECT_NOT_FOUND: "PROJECT_NOT_FOUND",
15
- INVALID_INPUT: "INVALID_INPUT",
16
- ALREADY_LINKED: "ALREADY_LINKED",
17
- SERVER_ERROR: "SERVER_ERROR",
18
- ABORTED: "ABORTED",
19
- /** Operation needs interactive confirmation and the shell is non-interactive. */
20
- INTERACTIVE_REQUIRED: "INTERACTIVE_REQUIRED"
21
- };
22
- var EXIT_CODE = {
23
- ABORTED: 3,
24
- NOT_LINKED: 4,
25
- ALREADY_LINKED: 5,
26
- GIT_ERROR: 6,
27
- INTERACTIVE_REQUIRED: 7,
28
- PROJECT_NOT_FOUND: 8,
29
- NETWORK_ERROR: 10,
30
- SERVER_ERROR: 11,
31
- TIMEOUT: 12,
32
- NOT_LOGGED_IN: 20,
33
- AUTH_FAILED: 21,
34
- UNAUTHORIZED: 22,
35
- INVALID_INPUT: 30
36
- };
37
- var EXIT_CODE_FOR = {
38
- NOT_LOGGED_IN: EXIT_CODE.NOT_LOGGED_IN,
39
- NOT_LINKED: EXIT_CODE.NOT_LINKED,
40
- NETWORK_ERROR: EXIT_CODE.NETWORK_ERROR,
41
- AUTH_FAILED: EXIT_CODE.AUTH_FAILED,
42
- PROJECT_NOT_FOUND: EXIT_CODE.PROJECT_NOT_FOUND,
43
- GIT_ERROR: EXIT_CODE.GIT_ERROR,
44
- INVALID_INPUT: EXIT_CODE.INVALID_INPUT,
45
- ALREADY_LINKED: EXIT_CODE.ALREADY_LINKED,
46
- SERVER_ERROR: EXIT_CODE.SERVER_ERROR,
47
- ABORTED: EXIT_CODE.ABORTED,
48
- UNAUTHORIZED: EXIT_CODE.UNAUTHORIZED,
49
- TIMEOUT: EXIT_CODE.TIMEOUT,
50
- INTERACTIVE_REQUIRED: EXIT_CODE.INTERACTIVE_REQUIRED
51
- };
52
- var CliError = class extends Error {
53
- constructor(code, message, options = {}) {
54
- super(message);
55
- this.name = "CliError";
56
- this.code = code;
57
- this.exitCode = options.exitCode ?? EXIT_CODE_FOR[code];
58
- this.remediation = options.remediation;
59
- }
60
- };
61
-
62
- // src/cli/api-client.ts
63
- var DEFAULT_API_BASE_URL = "https://api.cimplify.io";
64
- var ENV_API_BASE_URL = "CIMPLIFY_API_URL";
65
- var DEFAULT_TIMEOUT_MS = 3e4;
66
- var HEADER_AUTHORIZATION = "Authorization";
67
- var HEADER_CONTENT_TYPE = "Content-Type";
68
- var HEADER_ACCEPT = "Accept";
69
- var HEADER_USER_AGENT = "User-Agent";
70
- var BEARER_PREFIX = "Bearer ";
71
- var CONTENT_TYPE_JSON = "application/json";
72
- var USER_AGENT = "cimplify-cli";
73
- var METHOD_GET = "GET";
74
- var METHOD_POST = "POST";
75
- var METHOD_PUT = "PUT";
76
- var METHOD_DELETE = "DELETE";
77
- var STATUS_UNAUTHORIZED = 401;
78
- var STATUS_FORBIDDEN = 403;
79
- var STATUS_NOT_FOUND = 404;
80
- var STATUS_CONFLICT = 409;
81
- var STATUS_BAD_REQUEST_MIN = 400;
82
- var STATUS_SERVER_ERROR_MIN = 500;
83
- var ApiClient = class _ApiClient {
84
- constructor(baseUrl, apiKey) {
85
- this.baseUrl = baseUrl.replace(/\/+$/, "");
86
- this.apiKey = apiKey;
87
- }
88
- static fromAuth(auth) {
89
- return new _ApiClient(auth.apiBaseUrl, auth.apiKey);
90
- }
91
- static unauthenticated(baseUrl = resolveBaseUrl()) {
92
- return new _ApiClient(baseUrl, "");
93
- }
94
- static withKey(apiKey, baseUrl = resolveBaseUrl()) {
95
- return new _ApiClient(baseUrl, apiKey);
96
- }
97
- get(pathname, options) {
98
- return this.request(METHOD_GET, pathname, void 0, options);
99
- }
100
- post(pathname, body, options) {
101
- return this.request(METHOD_POST, pathname, body, options);
102
- }
103
- put(pathname, body, options) {
104
- return this.request(METHOD_PUT, pathname, body, options);
105
- }
106
- delete(pathname, options) {
107
- return this.request(METHOD_DELETE, pathname, void 0, options);
108
- }
109
- async request(method, pathname, body, options) {
110
- const url = this.buildUrl(pathname, options?.query);
111
- const headers = {
112
- [HEADER_ACCEPT]: CONTENT_TYPE_JSON,
113
- [HEADER_USER_AGENT]: USER_AGENT
114
- };
115
- if (this.apiKey) {
116
- headers[HEADER_AUTHORIZATION] = `${BEARER_PREFIX}${this.apiKey}`;
117
- }
118
- let payload;
119
- if (body !== void 0) {
120
- headers[HEADER_CONTENT_TYPE] = CONTENT_TYPE_JSON;
121
- payload = JSON.stringify(body);
122
- }
123
- const controller = new AbortController();
124
- const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
125
- const timer = setTimeout(() => controller.abort(), timeoutMs);
126
- let response;
127
- try {
128
- response = await fetch(url, {
129
- method,
130
- headers,
131
- body: payload,
132
- signal: controller.signal
133
- });
134
- } catch (err) {
135
- clearTimeout(timer);
136
- throw toNetworkError(err);
137
- }
138
- clearTimeout(timer);
139
- return parseResponse(response);
140
- }
141
- buildUrl(pathname, query) {
142
- const base = pathname.startsWith("/") ? pathname : `/${pathname}`;
143
- const url = new URL(`${this.baseUrl}${base}`);
144
- if (query) {
145
- for (const [k, v] of Object.entries(query)) {
146
- if (v === void 0 || v === null) continue;
147
- url.searchParams.set(k, String(v));
148
- }
149
- }
150
- return url.toString();
151
- }
152
- };
153
- function resolveBaseUrl(override) {
154
- const fromEnv = process.env[ENV_API_BASE_URL];
155
- return fromEnv && fromEnv.length > 0 ? fromEnv : DEFAULT_API_BASE_URL;
156
- }
157
- async function parseResponse(response) {
158
- const text = await response.text();
159
- let body = void 0;
160
- if (text.length > 0) {
161
- try {
162
- body = JSON.parse(text);
163
- } catch {
164
- throw new CliError(
165
- CLI_ERROR_CODE.SERVER_ERROR,
166
- `Server returned non-JSON response (status ${response.status}): ${truncate(text)}`
167
- );
168
- }
169
- }
170
- if (response.ok) {
171
- if (body && typeof body === "object" && "data" in body) {
172
- return body.data;
173
- }
174
- return body;
175
- }
176
- const code = mapStatusToCode(response.status);
177
- const message = extractErrorMessage(body, response.status);
178
- throw new CliError(code, message);
179
- }
180
- function mapStatusToCode(status) {
181
- if (status === STATUS_UNAUTHORIZED) return CLI_ERROR_CODE.AUTH_FAILED;
182
- if (status === STATUS_FORBIDDEN) return CLI_ERROR_CODE.AUTH_FAILED;
183
- if (status === STATUS_NOT_FOUND) return CLI_ERROR_CODE.PROJECT_NOT_FOUND;
184
- if (status === STATUS_CONFLICT) return CLI_ERROR_CODE.ALREADY_LINKED;
185
- if (status >= STATUS_SERVER_ERROR_MIN) return CLI_ERROR_CODE.SERVER_ERROR;
186
- if (status >= STATUS_BAD_REQUEST_MIN) return CLI_ERROR_CODE.INVALID_INPUT;
187
- return CLI_ERROR_CODE.SERVER_ERROR;
188
- }
189
- function extractErrorMessage(body, status) {
190
- if (body && typeof body === "object") {
191
- const envelope = body;
192
- if (envelope.error && typeof envelope.error.error_message === "string") {
193
- return envelope.error.error_code ? `${envelope.error.error_code}: ${envelope.error.error_message}` : envelope.error.error_message;
194
- }
195
- if (typeof envelope.message === "string") return envelope.message;
196
- }
197
- return `HTTP ${status}`;
198
- }
199
- function toNetworkError(err) {
200
- if (err instanceof DOMException && err.name === "AbortError") {
201
- return new CliError(CLI_ERROR_CODE.NETWORK_ERROR, "Request timed out.");
202
- }
203
- const message = err instanceof Error ? err.message : String(err);
204
- return new CliError(CLI_ERROR_CODE.NETWORK_ERROR, `Network error: ${message}`);
205
- }
206
- function truncate(value, max = 200) {
207
- return value.length > max ? `${value.slice(0, max)}\u2026` : value;
208
- }
209
-
210
- // src/cli/args.ts
211
- function parseArgs(argv) {
212
- const positional = [];
213
- const flags = /* @__PURE__ */ new Map();
214
- for (let i = 0; i < argv.length; i++) {
215
- const arg = argv[i];
216
- if (!arg.startsWith("--")) {
217
- positional.push(arg);
218
- continue;
219
- }
220
- const eq = arg.indexOf("=");
221
- if (eq !== -1) {
222
- flags.set(arg.slice(2, eq), arg.slice(eq + 1));
223
- continue;
224
- }
225
- const name = arg.slice(2);
226
- const next = argv[i + 1];
227
- if (next !== void 0 && !next.startsWith("--")) {
228
- flags.set(name, next);
229
- i++;
230
- } else {
231
- flags.set(name, true);
232
- }
233
- }
234
- return { positional, flags };
235
- }
236
- function flagString(args, name) {
237
- const v = args.flags.get(name);
238
- return typeof v === "string" ? v : void 0;
239
- }
240
- function flagBool(args, name) {
241
- return args.flags.has(name);
242
- }
243
- var AUTH_FILE_NAME = "auth.json";
244
- var PROJECT_FILE_NAME = "project.json";
245
- var PROJECT_DIR_NAME = ".cimplify";
246
- var ENV_XDG_CONFIG_HOME = "XDG_CONFIG_HOME";
247
- var APP_CONFIG_DIR_NAME = "cimplify";
248
- var HOME_CONFIG_DIR_NAME = ".config";
249
- var ENCODING_UTF8 = "utf8";
250
- function authConfigDir() {
251
- const xdg = process.env[ENV_XDG_CONFIG_HOME];
252
- return xdg ? path.join(xdg, APP_CONFIG_DIR_NAME) : path.join(os.homedir(), HOME_CONFIG_DIR_NAME, APP_CONFIG_DIR_NAME);
253
- }
254
- function authConfigPath() {
255
- return path.join(authConfigDir(), AUTH_FILE_NAME);
256
- }
257
- function projectConfigDir(cwd = process.cwd()) {
258
- return path.join(cwd, PROJECT_DIR_NAME);
259
- }
260
- function projectConfigPath(cwd = process.cwd()) {
261
- return path.join(projectConfigDir(cwd), PROJECT_FILE_NAME);
262
- }
263
- async function readJsonFile(filePath) {
264
- try {
265
- const raw = await promises.readFile(filePath, ENCODING_UTF8);
266
- return JSON.parse(raw);
267
- } catch (err) {
268
- if (err.code === "ENOENT") return null;
269
- throw err;
270
- }
271
- }
272
- async function readAuth() {
273
- const data = await readJsonFile(authConfigPath());
274
- if (!data) {
275
- throw new CliError(
276
- CLI_ERROR_CODE.NOT_LOGGED_IN,
277
- "Not logged in. Run `cimplify login` first."
278
- );
279
- }
280
- return data;
281
- }
282
- async function readProjectLink(cwd = process.cwd()) {
283
- const data = await readJsonFile(projectConfigPath(cwd));
284
- if (!data) {
285
- throw new CliError(
286
- CLI_ERROR_CODE.NOT_LINKED,
287
- "No project linked. Run `cimplify link <project-id>` first."
288
- );
289
- }
290
- return data;
291
- }
292
-
293
- // src/cli/envfile.ts
294
- var COMMENT_CHAR = "#";
295
- var QUOTE_DOUBLE = '"';
296
- var QUOTE_SINGLE = "'";
297
- var KEY_SEPARATOR = "=";
298
- var KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
299
- function parseEnvFile(text) {
300
- const entries = [];
301
- const lines = text.split("\n");
302
- for (const raw of lines) {
303
- const line = raw.trim();
304
- if (line.length === 0) continue;
305
- if (line.startsWith(COMMENT_CHAR)) continue;
306
- const eq = line.indexOf(KEY_SEPARATOR);
307
- if (eq === -1) continue;
308
- const key = line.slice(0, eq).trim();
309
- if (!KEY_PATTERN.test(key)) continue;
310
- let value = line.slice(eq + 1).trim();
311
- if (value.length >= 2) {
312
- const first = value[0];
313
- const last = value[value.length - 1];
314
- if (first === QUOTE_DOUBLE && last === QUOTE_DOUBLE || first === QUOTE_SINGLE && last === QUOTE_SINGLE) {
315
- value = value.slice(1, -1);
316
- }
317
- }
318
- entries.push({ key, value });
319
- }
320
- return entries;
321
- }
322
- function parseKeyValueArg(input) {
323
- const eq = input.indexOf(KEY_SEPARATOR);
324
- if (eq === -1) {
325
- throw new CliError(
326
- CLI_ERROR_CODE.INVALID_INPUT,
327
- `Expected KEY=VALUE, got "${input}".`
328
- );
329
- }
330
- const key = input.slice(0, eq).trim();
331
- if (!KEY_PATTERN.test(key)) {
332
- throw new CliError(
333
- CLI_ERROR_CODE.INVALID_INPUT,
334
- `Invalid env var key "${key}". Must match ${KEY_PATTERN.source}.`
335
- );
336
- }
337
- return { key, value: input.slice(eq + 1) };
338
- }
339
- function formatEnvFile(entries) {
340
- const lines = [];
341
- for (const { key, value } of entries) {
342
- const needsQuote = /[\s"'#]/.test(value) || value.length === 0;
343
- const rendered = needsQuote ? `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"` : value;
344
- lines.push(`${key}=${rendered}`);
345
- }
346
- return lines.length === 0 ? "" : `${lines.join("\n")}
347
- `;
348
- }
349
-
350
- // src/cli/output.ts
351
- var RESET = "\x1B[0m";
352
- var BOLD_OPEN = "\x1B[1m";
353
- var DIM_OPEN = "\x1B[2m";
354
- var GREEN_OPEN = "\x1B[32m";
355
- var PREFIX_SUCCESS = "\u2713";
356
- var ENV_JSON = "CIMPLIFY_JSON";
357
- var ENV_YES = "CIMPLIFY_YES";
358
- function envFlag(name) {
359
- const v = process.env[name];
360
- return v === "1" || v === "true";
361
- }
362
- function isJsonMode() {
363
- return envFlag(ENV_JSON);
364
- }
365
- function isAutoYes() {
366
- return envFlag(ENV_YES);
367
- }
368
- function isInteractive() {
369
- return Boolean(process.stdout.isTTY) && Boolean(process.stdin.isTTY);
370
- }
371
- function wrap(open, value) {
372
- return `${open}${value}${RESET}`;
373
- }
374
- function bold(value) {
375
- return isJsonMode() ? value : wrap(BOLD_OPEN, value);
376
- }
377
- function dim(value) {
378
- return isJsonMode() ? value : wrap(DIM_OPEN, value);
379
- }
380
- function green(value) {
381
- return isJsonMode() ? value : wrap(GREEN_OPEN, value);
382
- }
383
- function success(message) {
384
- if (isJsonMode()) return;
385
- console.log(`${green(PREFIX_SUCCESS)} ${message}`);
386
- }
387
- function info(message) {
388
- if (isJsonMode()) return;
389
- console.log(message);
390
- }
391
- var ENV_EMITTED = "__CIMPLIFY_RESULT_EMITTED";
392
- function result(data) {
393
- if (!isJsonMode()) return;
394
- if (process.env[ENV_EMITTED] === "1") return;
395
- process.env[ENV_EMITTED] = "1";
396
- process.stdout.write(`${JSON.stringify({ ok: true, data })}
397
- `);
398
- }
399
- async function promptLine(question) {
400
- if (!isInteractive()) {
401
- throw new CliError(
402
- CLI_ERROR_CODE.INTERACTIVE_REQUIRED,
403
- "this operation needs interactive input but stdin is not a TTY",
404
- { remediation: "run interactively, or supply the value via a flag" }
405
- );
406
- }
407
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
408
- try {
409
- return await new Promise((resolve) => {
410
- rl.question(question, (answer) => resolve(answer));
411
- });
412
- } finally {
413
- rl.close();
414
- }
415
- }
416
- async function promptYesNo(question, defaultNo = true) {
417
- if (isAutoYes()) return true;
418
- if (!isInteractive()) {
419
- throw new CliError(
420
- CLI_ERROR_CODE.INTERACTIVE_REQUIRED,
421
- `this operation needs confirmation: ${question}`,
422
- { remediation: "re-run with --yes to accept, or run interactively" }
423
- );
424
- }
425
- const suffix = defaultNo ? " [y/N] " : " [Y/n] ";
426
- const answer = (await promptLine(`${question}${suffix}`)).trim().toLowerCase();
427
- if (answer === "") return !defaultNo;
428
- return answer === "y" || answer === "yes";
429
- }
430
-
431
- // src/cli/types.ts
432
- var ENV_SCOPE = {
433
- DEVELOPMENT: "development",
434
- PREVIEW: "preview",
435
- STAGING: "staging",
436
- PRODUCTION: "production"
437
- };
438
- var SECRET_MASK = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
439
- var PUBLIC_ENV_PREFIX = "NEXT_PUBLIC_";
440
- var REPO_PROVIDER = {
441
- FREESTYLE: "freestyle",
442
- GITHUB: "github",
443
- GITEA: "gitea",
444
- EXTERNAL: "external"
445
- };
446
- new Set(Object.values(REPO_PROVIDER));
447
-
448
- // src/cli/commands/env.ts
449
- var SUB_LS = "ls";
450
- var SUB_LIST = "list";
451
- var SUB_PULL = "pull";
452
- var SUB_PUSH = "push";
453
- var SUB_ADD = "add";
454
- var SUB_RM = "rm";
455
- var SUB_REMOVE = "remove";
456
- var FLAG_SCOPE = "scope";
457
- var FLAG_SHOW = "show";
458
- var FLAG_OUT = "out";
459
- var FLAG_FILE = "file";
460
- var FLAG_OVERWRITE = "overwrite";
461
- var FLAG_SECRET = "secret";
462
- var FLAG_PUBLIC = "public";
463
- var FLAG_YES = "yes";
464
- var DEFAULT_PULL_PATH = ".env.local";
465
- var PULL_BACKUP_SUFFIX = ".bak";
466
- var COL_GAP = " ";
467
- var COL_KEY = "KEY";
468
- var COL_SCOPE = "SCOPE";
469
- var COL_SECRET = "SECRET";
470
- var COL_VALUE = "VALUE";
471
- var VALID_SCOPES = new Set(Object.values(ENV_SCOPE));
472
- function envEndpoint(businessId, projectId) {
473
- return `/v1/businesses/${encodeURIComponent(businessId)}/projects/${encodeURIComponent(projectId)}/env-vars`;
474
- }
475
- function envItemEndpoint(businessId, projectId, id) {
476
- return `${envEndpoint(businessId, projectId)}/${encodeURIComponent(id)}`;
477
- }
478
- function bulkSetEndpoint(businessId, projectId) {
479
- return `${envEndpoint(businessId, projectId)}/bulk-set`;
480
- }
481
- function resolveScope(value, fallback = ENV_SCOPE.PREVIEW) {
482
- if (value === void 0) return fallback;
483
- if (!VALID_SCOPES.has(value)) {
484
- throw new CliError(
485
- CLI_ERROR_CODE.INVALID_INPUT,
486
- `Invalid scope "${value}". Choose one of: ${[...VALID_SCOPES].join(", ")}.`
487
- );
488
- }
489
- return value;
490
- }
491
- function classifyIsSecret(key, override) {
492
- if (override.secret && override.public) {
493
- throw new CliError(
494
- CLI_ERROR_CODE.INVALID_INPUT,
495
- "Cannot pass both --secret and --public."
496
- );
497
- }
498
- if (override.secret) return true;
499
- if (override.public) return false;
500
- return !key.startsWith(PUBLIC_ENV_PREFIX);
501
- }
502
- async function run(argv) {
503
- const args = parseArgs(argv);
504
- const sub = args.positional[0];
505
- if (!sub) {
506
- throw new CliError(
507
- CLI_ERROR_CODE.INVALID_INPUT,
508
- `Usage: cimplify env <${SUB_LS}|${SUB_PULL}|${SUB_PUSH}|${SUB_ADD}|${SUB_RM}>`
509
- );
510
- }
511
- const auth = await readAuth();
512
- const link = await readProjectLink();
513
- const client = ApiClient.fromAuth(auth);
514
- if (sub === SUB_LS || sub === SUB_LIST) {
515
- await listEnv(client, link.businessId, link.projectId, args);
516
- return;
517
- }
518
- if (sub === SUB_PULL) {
519
- await pullEnv(client, link.businessId, link.projectId, args);
520
- return;
521
- }
522
- if (sub === SUB_PUSH) {
523
- await pushEnv(client, link.businessId, link.projectId, args);
524
- return;
525
- }
526
- if (sub === SUB_ADD) {
527
- await addEnv(client, link.businessId, link.projectId, args);
528
- return;
529
- }
530
- if (sub === SUB_RM || sub === SUB_REMOVE) {
531
- await removeEnv(client, link.businessId, link.projectId, args);
532
- return;
533
- }
534
- throw new CliError(CLI_ERROR_CODE.INVALID_INPUT, `Unknown env subcommand "${sub}"`);
535
- }
536
- async function listEnv(client, businessId, projectId, args) {
537
- const scope = resolveScope(flagString(args, FLAG_SCOPE));
538
- const show = flagBool(args, FLAG_SHOW);
539
- const records = await client.get(envEndpoint(businessId, projectId), {
540
- query: { scope }
541
- });
542
- if (records.length === 0) {
543
- info(dim(`No env vars in scope "${scope}". Add one: cimplify env add KEY=VALUE`));
544
- result({ scope, vars: [] });
545
- return;
546
- }
547
- const keyWidth = Math.max(COL_KEY.length, ...records.map((r) => r.key.length));
548
- const scopeWidth = Math.max(COL_SCOPE.length, ...records.map((r) => String(r.scope).length));
549
- const secretWidth = Math.max(COL_SECRET.length, "yes".length);
550
- info(
551
- bold(
552
- [
553
- COL_KEY.padEnd(keyWidth),
554
- COL_SCOPE.padEnd(scopeWidth),
555
- COL_SECRET.padEnd(secretWidth),
556
- COL_VALUE
557
- ].join(COL_GAP)
558
- )
559
- );
560
- for (const r of records) {
561
- const value = renderValue(r, show);
562
- info(
563
- [
564
- r.key.padEnd(keyWidth),
565
- String(r.scope).padEnd(scopeWidth),
566
- (r.is_secret ? "yes" : "no").padEnd(secretWidth),
567
- value
568
- ].join(COL_GAP)
569
- );
570
- }
571
- result({
572
- scope,
573
- vars: records.map((r) => ({
574
- key: r.key,
575
- scope: r.scope,
576
- is_secret: r.is_secret,
577
- value: r.is_secret ? null : r.value ?? null
578
- }))
579
- });
580
- }
581
- function renderValue(r, show) {
582
- if (r.is_secret) return SECRET_MASK;
583
- if (r.value === null) return SECRET_MASK;
584
- if (!show) return r.value;
585
- return r.value;
586
- }
587
- async function pullEnv(client, businessId, projectId, args) {
588
- const scope = resolveScope(flagString(args, FLAG_SCOPE));
589
- const outPath = path.resolve(process.cwd(), flagString(args, FLAG_OUT) ?? DEFAULT_PULL_PATH);
590
- const records = await client.get(envEndpoint(businessId, projectId), {
591
- query: { scope }
592
- });
593
- const blockedSecrets = records.filter((r) => r.is_secret).map((r) => r.key);
594
- if (blockedSecrets.length > 0) {
595
- throw new CliError(
596
- CLI_ERROR_CODE.INVALID_INPUT,
597
- `Cannot pull secret values: ${blockedSecrets.join(", ")}.
598
- Secrets are never returned in plaintext to the CLI; use the dashboard to copy them.`
599
- );
600
- }
601
- const entries = records.filter((r) => r.value !== null).map((r) => ({ key: r.key, value: r.value }));
602
- await backupIfExists(outPath);
603
- await promises.mkdir(path.dirname(outPath), { recursive: true });
604
- await promises.writeFile(outPath, formatEnvFile(entries), "utf8");
605
- success(`Pulled ${entries.length} var${entries.length === 1 ? "" : "s"} to ${path.relative(process.cwd(), outPath) || outPath}`);
606
- result({ scope, count: entries.length, file: outPath });
607
- }
608
- async function backupIfExists(target) {
609
- try {
610
- await promises.stat(target);
611
- } catch (err) {
612
- if (err.code === "ENOENT") return;
613
- throw err;
614
- }
615
- await promises.copyFile(target, `${target}${PULL_BACKUP_SUFFIX}`);
616
- }
617
- async function pushEnv(client, businessId, projectId, args) {
618
- const scope = resolveScope(flagString(args, FLAG_SCOPE));
619
- const filePath = path.resolve(process.cwd(), flagString(args, FLAG_FILE) ?? DEFAULT_PULL_PATH);
620
- const overwrite = flagBool(args, FLAG_OVERWRITE);
621
- let raw;
622
- try {
623
- raw = await promises.readFile(filePath, "utf8");
624
- } catch (err) {
625
- if (err.code === "ENOENT") {
626
- throw new CliError(
627
- CLI_ERROR_CODE.INVALID_INPUT,
628
- `Env file not found: ${filePath}.
629
- Use --file to point at a different path.`
630
- );
631
- }
632
- throw err;
633
- }
634
- const entries = parseEnvFile(raw);
635
- if (entries.length === 0) {
636
- throw new CliError(
637
- CLI_ERROR_CODE.INVALID_INPUT,
638
- `No env vars found in ${filePath}.`
639
- );
640
- }
641
- const body = {
642
- scope,
643
- vars: entries.map((e) => ({
644
- key: e.key,
645
- value: e.value,
646
- is_secret: classifyIsSecret(e.key, { secret: false, public: false })
647
- })),
648
- overwrite
649
- };
650
- await client.post(bulkSetEndpoint(businessId, projectId), body);
651
- success(`Pushed ${entries.length} var${entries.length === 1 ? "" : "s"} to ${scope}${overwrite ? " (overwrite)" : ""}`);
652
- result({ scope, count: entries.length, overwrite });
653
- }
654
- async function addEnv(client, businessId, projectId, args) {
655
- const positional = args.positional[1];
656
- if (!positional) {
657
- throw new CliError(
658
- CLI_ERROR_CODE.INVALID_INPUT,
659
- `Usage: cimplify env ${SUB_ADD} KEY=VALUE [--scope=<scope>] [--secret|--public]`
660
- );
661
- }
662
- const { key, value } = parseKeyValueArg(positional);
663
- const scope = resolveScope(flagString(args, FLAG_SCOPE));
664
- const isSecret = classifyIsSecret(key, {
665
- secret: flagBool(args, FLAG_SECRET),
666
- public: flagBool(args, FLAG_PUBLIC)
667
- });
668
- const body = { key, value, scope, is_secret: isSecret };
669
- const created = await client.post(envEndpoint(businessId, projectId), body);
670
- success(`Added ${created.key} (${scope}, ${isSecret ? "secret" : "public"})`);
671
- result({
672
- var: { key: created.key, scope: created.scope, is_secret: created.is_secret }
673
- });
674
- }
675
- async function removeEnv(client, businessId, projectId, args) {
676
- const key = args.positional[1];
677
- if (!key) {
678
- throw new CliError(
679
- CLI_ERROR_CODE.INVALID_INPUT,
680
- `Usage: cimplify env ${SUB_RM} <KEY> [--scope=<scope>]`
681
- );
682
- }
683
- const scope = resolveScope(flagString(args, FLAG_SCOPE));
684
- const records = await client.get(envEndpoint(businessId, projectId), {
685
- query: { scope }
686
- });
687
- const target = records.find((r) => r.key === key);
688
- if (!target) {
689
- throw new CliError(
690
- CLI_ERROR_CODE.PROJECT_NOT_FOUND,
691
- `No env var "${key}" in scope "${scope}".`
692
- );
693
- }
694
- if (!flagBool(args, FLAG_YES)) {
695
- const confirmed = await promptYesNo(`Delete ${key} from ${scope}?`, true);
696
- if (!confirmed) {
697
- throw new CliError(CLI_ERROR_CODE.ABORTED, "Aborted by user.");
698
- }
699
- }
700
- await client.delete(envItemEndpoint(businessId, projectId, target.id));
701
- success(`Removed ${key} from ${scope}`);
702
- result({ removed: true, key, scope });
703
- }
704
-
705
- export { classifyIsSecret, run as default };