@riverbankcms/sdk 0.82.0 → 0.84.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 (206) hide show
  1. package/README.md +16 -0
  2. package/dist/{PreviewEditorSidebar-LHGK6RIO.mjs → PreviewEditorSidebar-X7RLMEI6.mjs} +330 -11
  3. package/dist/{PreviewEditorUI-AXZG2SDC.mjs → PreviewEditorUI-CT67N4O3.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-EIMQ3S2V.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +200 -0
  6. package/dist/_dts/api/src/blocks.d.ts +36 -0
  7. package/dist/_dts/api/src/contentRuntime.d.ts +46 -0
  8. package/dist/_dts/api/src/endpoints.d.ts +40 -0
  9. package/dist/_dts/api/src/index.d.ts +2 -2
  10. package/dist/_dts/api/src/sdk-event-pricing.d.ts +61 -0
  11. package/dist/_dts/api/src/sdk-event-schedule.d.ts +52 -0
  12. package/dist/_dts/api/src/sdk-event-upsert.d.ts +50 -0
  13. package/dist/_dts/api/src/sdkContracts.d.ts +67 -33
  14. package/dist/_dts/api/src/shared-contracts.d.ts +13 -0
  15. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +22 -36
  16. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +46 -1
  17. package/dist/_dts/block-form/src/backend/useBackendWatch.d.ts +6 -1
  18. package/dist/_dts/block-form/src/utils/evaluateVisibility.d.ts +3 -2
  19. package/dist/_dts/block-form/src/utils/visibleWhen.d.ts +7 -0
  20. package/dist/_dts/blocks/src/PageRenderer.d.ts +11 -0
  21. package/dist/_dts/blocks/src/bindings/index.d.ts +1 -1
  22. package/dist/_dts/blocks/src/client/site-chrome.d.ts +1 -1
  23. package/dist/_dts/blocks/src/client.d.ts +4 -0
  24. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +16 -4
  25. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -2016
  26. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -2016
  27. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -2016
  28. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -2016
  29. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -2016
  30. package/dist/_dts/blocks/src/system/blocks/contact-newsletter.d.ts +171 -0
  31. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +288 -2016
  32. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -2016
  33. package/dist/_dts/blocks/src/system/blocks/hero.d.ts +3 -2
  34. package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
  35. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -7
  36. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +2534 -151
  37. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -2016
  38. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -2016
  39. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -2016
  40. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +36 -3
  41. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +2 -2
  42. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  43. package/dist/_dts/blocks/src/system/fields/aspectRatio.d.ts +4 -1
  44. package/dist/_dts/blocks/src/system/fields/imageShape.d.ts +30 -0
  45. package/dist/_dts/blocks/src/system/fragments/library/heroLayoutControls.d.ts +25 -0
  46. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +35 -161
  47. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +24 -6
  48. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +12 -3
  49. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +33 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizard.d.ts +0 -2
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/constants.d.ts +1 -0
  52. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +275 -0
  53. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.override.d.ts +10 -0
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.planning.d.ts +22 -0
  55. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.state.d.ts +3 -0
  56. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +20 -1
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +13 -4
  58. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +1 -1
  59. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +28 -6
  60. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +14 -0
  61. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +1 -1
  62. package/dist/_dts/content-editor/src/controller/buildBlockPublishedBaselines.d.ts +1 -1
  63. package/dist/_dts/content-editor/src/controller/seedDraftBaselinesFromBlocks.d.ts +1 -1
  64. package/dist/_dts/content-editor/src/controller/useBlocksList.d.ts +1 -1
  65. package/dist/_dts/content-editor/src/controller/useInvalidBlockRecovery.d.ts +1 -1
  66. package/dist/_dts/content-editor/src/primitives/PreviewRichTextEditor.d.ts +2 -1
  67. package/dist/_dts/content-editor/src/primitives/PreviewTextEditor.d.ts +1 -0
  68. package/dist/_dts/content-model/src/entry-slots/index.d.ts +1 -0
  69. package/dist/_dts/content-model/src/entry-slots/types.d.ts +356 -0
  70. package/dist/_dts/content-model/src/index.d.ts +1 -0
  71. package/dist/_dts/content-model/src/templates/defaults.d.ts +7 -0
  72. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +100 -5
  73. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +6 -1
  74. package/dist/_dts/editor-blocks/src/BlockForm.d.ts +7 -5
  75. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockCreation.d.ts +3 -2
  76. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockDuplication.d.ts +3 -2
  77. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockReorder.d.ts +3 -2
  78. package/dist/_dts/editor-blocks/src/block-editor/owner.d.ts +27 -0
  79. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  80. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +8 -0
  81. package/dist/_dts/media-core/src/mediaUsageProjection.d.ts +37 -3
  82. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +4 -2
  83. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  84. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +3 -1
  85. package/dist/_dts/preview-next/src/client/preview/EntrySlotBlockEditorPanel.d.ts +19 -0
  86. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +8 -0
  87. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -1
  88. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +1 -1
  89. package/dist/_dts/preview-next/src/client/preview/linkedEntryEditEvents.d.ts +9 -0
  90. package/dist/_dts/preview-next/src/client/preview/previewCustomizeControls.d.ts +9 -8
  91. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +10 -1
  92. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +5 -1
  93. package/dist/_dts/sdk/src/bookings/index.d.ts +5 -4
  94. package/dist/_dts/sdk/src/bookings/types.d.ts +2 -2
  95. package/dist/_dts/sdk/src/cli/content/reader.d.ts +9 -8
  96. package/dist/_dts/sdk/src/cli/content/writer.d.ts +6 -1
  97. package/dist/_dts/sdk/src/cli/helpers.d.ts +10 -5
  98. package/dist/_dts/sdk/src/cli/merge-remote/entryLocal.d.ts +2 -2
  99. package/dist/_dts/sdk/src/cli/merge-remote/entryMerge.d.ts +2 -1
  100. package/dist/_dts/sdk/src/cli/merge-remote/entrySnapshots.d.ts +2 -2
  101. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -1
  102. package/dist/_dts/sdk/src/client/management/types.d.ts +40 -10
  103. package/dist/_dts/sdk/src/config/field-definitions.d.ts +13 -7
  104. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +26 -3
  105. package/dist/_dts/sdk/src/public-api/contracts.d.ts +13 -0
  106. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +1 -0
  107. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +6 -1
  108. package/dist/_dts/sdk/src/rendering/overrides.d.ts +6 -1
  109. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  110. package/dist/_dts/sdk/src/version.d.ts +1 -1
  111. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  112. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  113. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  114. package/dist/_dts/theme-core/src/buttons/personalities/ornate-ritual.d.ts +16 -0
  115. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +1 -1
  116. package/dist/_dts/theme-core/src/buttons/types.d.ts +3 -3
  117. package/dist/_dts/theme-core/src/cards/types.d.ts +15 -15
  118. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  119. package/dist/_dts/theme-core/src/inputs/types.d.ts +1 -1
  120. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +33 -33
  121. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  122. package/dist/_dts/theme-core/src/palette/variants/warm-dark.d.ts +16 -0
  123. package/dist/_dts/theme-core/src/schema.d.ts +30 -25
  124. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  125. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +141 -1
  126. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -0
  127. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +110 -5
  128. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  129. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  130. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +5 -1
  131. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  132. package/dist/_dts/theme-core/src/site-styles/types.d.ts +1 -1
  133. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +16 -1
  134. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +1 -0
  135. package/dist/_dts/theme-core/src/utils/colorStyles.d.ts +6 -6
  136. package/dist/{chunk-2BUMISSH.mjs → chunk-3LXFQS7T.mjs} +1 -1
  137. package/dist/{chunk-FIREV57T.mjs → chunk-LBBPD2IW.mjs} +40 -0
  138. package/dist/{chunk-XQR6THQJ.mjs → chunk-O62NDCTI.mjs} +3390 -1331
  139. package/dist/{chunk-6FWNF3DJ.mjs → chunk-QRKJDWT7.mjs} +158 -20
  140. package/dist/{chunk-HKB6XVIP.mjs → chunk-RCTJAZSK.mjs} +2 -2
  141. package/dist/{chunk-G35HOQEN.mjs → chunk-X5ZCSU6F.mjs} +132 -46
  142. package/dist/cli/index.mjs +2925 -577
  143. package/dist/cli/init-docs/content/agents-section.md +5 -0
  144. package/dist/cli/init-docs/content/cli-reference.md +13 -0
  145. package/dist/cli/init-docs/content/content-management.md +31 -0
  146. package/dist/cli/init-docs/content/getting-started.md +14 -0
  147. package/dist/cli/init-docs/content/workflow-add-block.md +3 -1
  148. package/dist/cli/init-docs/content/workflow-agent-safe-sync.md +81 -0
  149. package/dist/cli/init-docs/content/workflow-create-page.md +13 -3
  150. package/dist/cli/init-docs/content/workflow-custom-block.md +9 -0
  151. package/dist/cli/init-docs/content/workflow-templates.md +107 -2
  152. package/dist/client/{accordion-G34C45TW.mjs → accordion-2UZPBMYM.mjs} +2 -2
  153. package/dist/client/{bookingForm-BLBVKSAQ.mjs → bookingForm-DYXT6YB6.mjs} +5 -5
  154. package/dist/client/bookings.mjs +3477 -186
  155. package/dist/client/{carousel-7ZVTBRMD.mjs → carousel-QH77HR6X.mjs} +3 -3
  156. package/dist/client/{cart-Q6S6LZUO.mjs → cart-X4YK4FTW.mjs} +6 -6
  157. package/dist/client/{checkout-5QJLDE4I.mjs → checkout-OM2BEPWD.mjs} +6 -6
  158. package/dist/client/{chunk-ZF4XEWDM.mjs → chunk-3DTWLTXM.mjs} +1 -1
  159. package/dist/client/{chunk-5PQH4Y75.mjs → chunk-4OXKTA3D.mjs} +2 -2
  160. package/dist/client/{chunk-WJFHDTYF.mjs → chunk-52CGCQ7B.mjs} +5 -5
  161. package/dist/client/{chunk-CHAB5ACD.mjs → chunk-7UCLJ5SP.mjs} +2 -2
  162. package/dist/client/{chunk-U2EW7RSR.mjs → chunk-F5VRX5Y6.mjs} +1 -1
  163. package/dist/client/{chunk-SBBSMFFG.mjs → chunk-SYIJ5JO2.mjs} +1 -1
  164. package/dist/client/{chunk-EQKYMX4N.mjs → chunk-UHDWIXVR.mjs} +180 -157
  165. package/dist/client/{chunk-RJHTCTCZ.mjs → chunk-VGDBVNOO.mjs} +429 -15
  166. package/dist/client/{chunk-S3MKFGOG.mjs → chunk-ZE5G642V.mjs} +1 -1
  167. package/dist/client/{chunk-CSZGLBYR.mjs → chunk-ZKUO52W3.mjs} +1 -1
  168. package/dist/client/client.mjs +2685 -847
  169. package/dist/client/{courseRegistration-VUG2JJDB.mjs → courseRegistration-YBOGURTA.mjs} +5 -5
  170. package/dist/client/{eventCalendar-E7D2LD4N.mjs → eventCalendar-K4QJVCMD.mjs} +7 -7
  171. package/dist/client/{eventCombined-FUZ2Z3CS.mjs → eventCombined-MTXGMTCZ.mjs} +7 -7
  172. package/dist/client/{eventDetails-QRITJAOW.mjs → eventDetails-3PC4NL3U.mjs} +7 -7
  173. package/dist/client/{eventListing-INMQMJZ5.mjs → eventListing-TFJET6DN.mjs} +7 -7
  174. package/dist/client/{eventRegistration-TOOJD4WU.mjs → eventRegistration-QGPBGJTW.mjs} +7 -7
  175. package/dist/client/{form-BOWN7ZNQ.mjs → form-MDKR4FNB.mjs} +2 -2
  176. package/dist/client/{headerSection-HFQNZOUU.mjs → headerSection-Y5TMR3TW.mjs} +3 -3
  177. package/dist/client/hooks.mjs +2077 -546
  178. package/dist/client/{locationMap-VUZGC7Y5.mjs → locationMap-RH2LG7FZ.mjs} +2 -2
  179. package/dist/client/{newsletterForm-X2XQTPCB.mjs → newsletterForm-ZR5UDGBT.mjs} +2 -2
  180. package/dist/client/{productDetail-TA7D2G2B.mjs → productDetail-OIGDR4YE.mjs} +6 -6
  181. package/dist/client/{productList-AZOLOZKM.mjs → productList-4MA5S2CX.mjs} +6 -6
  182. package/dist/client/rendering/client.mjs +2560 -1205
  183. package/dist/client/rendering/islands.mjs +19 -19
  184. package/dist/client/rendering.mjs +2932 -1021
  185. package/dist/client/{shop-ZDLO7IIG.mjs → shop-WXSYV5QO.mjs} +6 -6
  186. package/dist/preview-next/before-render.mjs +40 -0
  187. package/dist/preview-next/client/runtime.mjs +5 -5
  188. package/dist/preview-next/middleware.mjs +40 -0
  189. package/dist/{sdk-runtime-CTWKNBDQ.mjs → sdk-runtime-7HJYPRWQ.mjs} +6 -6
  190. package/dist/server/components.mjs +2232 -534
  191. package/dist/server/config-validation.mjs +2068 -536
  192. package/dist/server/config.mjs +2068 -536
  193. package/dist/server/data.mjs +2077 -546
  194. package/dist/server/index.mjs +42 -1
  195. package/dist/server/next.mjs +2345 -574
  196. package/dist/server/page-converter.mjs +2684 -1220
  197. package/dist/server/prebuild.mjs +1 -1
  198. package/dist/server/rendering/server.mjs +2244 -546
  199. package/dist/server/rendering.mjs +2323 -552
  200. package/dist/server/routing.mjs +2012 -420
  201. package/dist/server/server.mjs +2153 -549
  202. package/dist/server/theme-bridge.mjs +1180 -101
  203. package/dist/server/theme.mjs +92 -1
  204. package/dist/styles/index.css +292 -36
  205. package/package.json +1 -1
  206. package/dist/SdkPreviewModeRuntime-RNVRHFFR.mjs +0 -8
@@ -25,6 +25,7 @@ Detailed documentation is available in `.riverbank/docs/`:
25
25
  - `block-types.md` - Available block types (auto-generated)
26
26
  - `theme-schema.md` - Theme schema reference (auto-generated from Zod)
27
27
  - `workflows/` - Step-by-step guides for common tasks, including editor workflows
28
+ - `workflows/agent-safe-sync.md` - Agent-safe dry-run, scoped push, and `--env` guidance
28
29
  - `site-workflows/` - Site-specific workflows and customizations
29
30
 
30
31
  ### Quick Commands
@@ -36,6 +37,8 @@ riverbankcms push # Push local changes to CMS
36
37
  riverbankcms push-config # Sync riverbank.config.ts schema/config to CMS
37
38
  ```
38
39
 
40
+ Use CLI `--env=remote` / `--env=local` for CMS commands rather than relying on `RIVERBANK_ENV=...` shell prefixes. Site `.env.local` files may set `RIVERBANK_ENV`, and the CLI flag is the explicit source of truth for sync operations.
41
+
39
42
  ### Working with Content
40
43
 
41
44
  1. **Pull latest**: `riverbankcms pull` downloads content to `content/` directory
@@ -43,6 +46,8 @@ riverbankcms push-config # Sync riverbank.config.ts schema/config to CMS
43
46
  3. **Preview**: `riverbankcms push --dry-run` shows what would change
44
47
  4. **Push**: `riverbankcms push` applies changes to CMS
45
48
 
49
+ For narrow edits, push the narrowest scope possible, for example `riverbankcms push pages privacy-policy --env=remote --dry-run`. If broad local content is stale or contains unrelated differences, see `.riverbank/docs/workflows/agent-safe-sync.md`.
50
+
46
51
  ### Editing Page Content Directly
47
52
 
48
53
  Page content lives in `content/pages/[identifier].json`. Each page has a `blocks` array containing the actual content. To edit copy:
@@ -25,6 +25,8 @@ All commands support these options:
25
25
  - Remote operations default to dry-run and require `--yes` to execute
26
26
  - When using `--env=both`, local runs first, then remote with the same safety rules
27
27
 
28
+ Prefer the CLI `--env` flag over shell prefixes such as `RIVERBANK_ENV=remote riverbankcms ...`. Site `.env.local` files may define `RIVERBANK_ENV`, and command-specific `--env` is the reliable way to target local or remote CMS sync.
29
+
28
30
  ## Environment Variables
29
31
 
30
32
  ### Local Environment (default)
@@ -148,6 +150,15 @@ riverbankcms push --dry-run --json-diff=summary
148
150
  riverbankcms push --dry-run --json-diff=full
149
151
  ```
150
152
 
153
+ **Agent-safe scoped push example:**
154
+
155
+ ```bash
156
+ riverbankcms push pages privacy-policy --env=remote --dry-run
157
+ riverbankcms push pages privacy-policy --env=remote --yes
158
+ ```
159
+
160
+ If unrelated local files would be included by a broad scope, stage a temporary content directory containing only the intended file(s) and use `--content-dir`; see `workflows/agent-safe-sync.md`.
161
+
151
162
  **Options:**
152
163
 
153
164
  | Option | Description |
@@ -284,6 +295,8 @@ riverbankcms push-config --config ./src/riverbank.config.ts
284
295
 
285
296
  Syncs SDK schema/config surfaces such as custom blocks, block field options/extensions, content type definitions/templates, SDK-managed site settings, and footer blocks. Pages, entries, and navigation menus are synced with explicit `riverbankcms push` scopes.
286
297
 
298
+ If `push-config` returns template binding validation errors, treat them as schema feedback. For example, a content type `reference` field should bind to a custom block `reference` field with the same `referenceKind`, not to a plain `text` field.
299
+
287
300
  This syncs:
288
301
 
289
302
  - Custom blocks
@@ -314,6 +314,35 @@ riverbankcms push --dry-run
314
314
  riverbankcms push
315
315
  ```
316
316
 
317
+ For agent work, prefer scoped pushes over broad pushes:
318
+
319
+ ```bash
320
+ # One page
321
+ riverbankcms push pages privacy-policy --env=remote --dry-run
322
+ riverbankcms push pages privacy-policy --env=remote --yes
323
+
324
+ # One content type or entry
325
+ riverbankcms push entries blog-post --env=remote --dry-run
326
+ riverbankcms push entries blog-post welcome --env=remote --dry-run
327
+ ```
328
+
329
+ Use CLI `--env=local` / `--env=remote` rather than `RIVERBANK_ENV=...` shell prefixes for sync commands. Site `.env.local` files may set `RIVERBANK_ENV`, while the CLI flag explicitly selects the sync target.
330
+
331
+ If local files include unrelated page or entry differences, isolate the changed files with `--content-dir`:
332
+
333
+ ```bash
334
+ tmpdir=$(mktemp -d)
335
+ mkdir -p "$tmpdir/pages"
336
+ cp content/pages/privacy-policy.json "$tmpdir/pages/privacy-policy.json"
337
+
338
+ riverbankcms push pages --content-dir "$tmpdir" --env=remote --dry-run
339
+ riverbankcms push pages --content-dir "$tmpdir" --env=remote --yes
340
+
341
+ rm -rf "$tmpdir"
342
+ ```
343
+
344
+ See `workflows/agent-safe-sync.md` for the full safe-push checklist.
345
+
317
346
  ### Sync Configuration
318
347
 
319
348
  Configure sync behavior in `riverbank.config.ts`:
@@ -328,6 +357,8 @@ export default defineConfig({
328
357
  });
329
358
  ```
330
359
 
360
+ `push-config` syncs schema/config surfaces such as custom blocks, block extensions/options, content type schemas/templates, SDK-managed settings, and footer blocks. It does not replace `push pages`, `push entries`, or `push navigation` for file-backed content.
361
+
331
362
  | Option | Values | Description |
332
363
  | ----------------- | ---------------- | -------------------------------------------- |
333
364
  | `existingEntries` | `skip`, `update` | Whether to update entries that already exist |
@@ -80,6 +80,8 @@ riverbankcms push
80
80
 
81
81
  If your SDK site uses `createCatchAllPage()`, you can render with local theme objects (and switch themes at runtime) without pushing theme changes to the CMS. See `cli-reference.md` for theme pull/push commands and the SDK README for the `createCatchAllPage({ themes, themeSwitch })` API.
82
82
 
83
+ Event registration blocks need both the SDK base stylesheet and a runtime theme scope. Generated SDK pages that render inside `Layout` get `ThemeScope` by default. Standalone `Page` or `Block` usage should wrap registration content in `ThemeBridgeProvider` or manual `generateThemeBridgeCss` with a `data-theme-scope="sdk"` wrapper; keep visual changes in scoped CSS variables instead of forking booking logic.
84
+
83
85
  ## Key Documentation
84
86
 
85
87
  | Document | Purpose |
@@ -90,6 +92,7 @@ If your SDK site uses `createCatchAllPage()`, you can render with local theme ob
90
92
  | `block-types.md` | Available block types (auto-generated) |
91
93
  | `theme-schema.md` | Theme schema reference (auto-generated from Zod) |
92
94
  | `workflows/` | Step-by-step guides for common tasks, including editor workflows |
95
+ | `workflows/agent-safe-sync.md` | Agent-safe dry-run, scoped push, and stale-content handling |
93
96
 
94
97
  ## Common Tasks
95
98
 
@@ -136,6 +139,17 @@ riverbankcms push --env=remote --yes
136
139
 
137
140
  **Safety note:** Remote push requires `--yes` flag to prevent accidental production changes.
138
141
 
142
+ Prefer the CLI `--env` flag over shell prefixes such as `RIVERBANK_ENV=remote riverbankcms ...`. Site `.env.local` files often contain their own `RIVERBANK_ENV` value, while `--env=remote` is explicit and reliable for CLI sync commands.
143
+
144
+ For narrow production edits, dry-run and apply the smallest scope:
145
+
146
+ ```bash
147
+ riverbankcms push pages privacy-policy --env=remote --dry-run
148
+ riverbankcms push pages privacy-policy --env=remote --yes
149
+ ```
150
+
151
+ If local content includes unrelated differences, see `workflows/agent-safe-sync.md` for the temporary `--content-dir` pattern.
152
+
139
153
  ## Media Safety (Avoid Broken Images)
140
154
 
141
155
  - Portable content JSON should store media as **identifier-only** (no `assetId` / storage paths / `src`).
@@ -25,6 +25,8 @@ View built-in blocks in `block-types.md`. Common block kinds:
25
25
 
26
26
  Check `schema.md` for custom blocks specific to this site.
27
27
 
28
+ Prefer built-in blocks before creating a custom block. For a simple policy/terms/about page, use `block.body-text` and put the page title, intro, and section headings in the rich text body. Only create a custom block when the needed structure or behavior cannot be represented by built-in blocks plus styling.
29
+
28
30
  ### 2. List Existing Blocks
29
31
 
30
32
  See what blocks are already on the page:
@@ -62,7 +64,7 @@ Add a body text block:
62
64
  ```bash
63
65
  riverbankcms block upsert home intro-content \
64
66
  --kind block.body-text \
65
- --data '{"content": "<p>Welcome to our site. We offer...</p>"}'
67
+ --data '{"body": {"type": "doc", "content": [{"type": "paragraph", "content": [{"type": "text", "text": "Welcome to our site. We offer..."}]}]}}'
66
68
  ```
67
69
 
68
70
  Add an image block:
@@ -0,0 +1,81 @@
1
+ # Workflow: Agent-Safe Sync
2
+
3
+ Use this workflow when an agent needs to push a narrow CMS change without overwriting unrelated dashboard edits.
4
+
5
+ ## Golden Rules
6
+
7
+ 1. Prefer the CLI `--env` flag over shell environment overrides.
8
+ 2. Dry-run the exact scope you plan to apply.
9
+ 3. Push the narrowest possible content scope.
10
+ 4. Treat stale-content warnings as evidence of unrelated remote edits.
11
+ 5. Use `push-config` for schema/config only; use `push` for pages, entries, navigation, settings, and other content files.
12
+
13
+ ## Environment Targeting
14
+
15
+ Use the CLI environment flag:
16
+
17
+ ```bash
18
+ riverbankcms pull --env=remote
19
+ riverbankcms push pages privacy-policy --env=remote --dry-run
20
+ riverbankcms push-config --env=remote
21
+ ```
22
+
23
+ Do not rely on `RIVERBANK_ENV=remote riverbankcms ...` for CLI sync commands. Site projects often load `.env.local`, and an existing `RIVERBANK_ENV=local` value can override the shell value in config-loading paths. The CLI `--env` flag is explicit and survives project env defaults.
24
+
25
+ ## Narrow Page Push
26
+
27
+ For a single page, push the page identifier rather than all pages:
28
+
29
+ ```bash
30
+ riverbankcms push pages privacy-policy --env=remote --dry-run --force
31
+ riverbankcms push pages privacy-policy --env=remote --yes --force
32
+ ```
33
+
34
+ If you need to isolate a local file snapshot from the rest of `content/pages`, use a temporary content directory:
35
+
36
+ ```bash
37
+ tmpdir=$(mktemp -d)
38
+ mkdir -p "$tmpdir/pages"
39
+ cp content/pages/privacy-policy.json "$tmpdir/pages/privacy-policy.json"
40
+
41
+ riverbankcms push pages --content-dir "$tmpdir" --env=remote --dry-run --force
42
+ riverbankcms push pages --content-dir "$tmpdir" --env=remote --yes --force
43
+
44
+ rm -rf "$tmpdir"
45
+ ```
46
+
47
+ This is useful when local content files include older or unrelated page differences that should not be pushed.
48
+
49
+ ## Stale Content
50
+
51
+ If a push aborts because unrelated remote content is newer:
52
+
53
+ - Do not blindly run a broad `push --force`.
54
+ - Prefer pushing the exact changed page, entry, or navigation scope.
55
+ - Use `--force` only after a dry-run confirms the planned changes are limited to the intended objects.
56
+ - If you truly need the latest remote state, run a scoped pull first, for example `riverbankcms pull pages privacy-policy --env=remote`.
57
+
58
+ ## Content vs Config
59
+
60
+ Use these commands for different surfaces:
61
+
62
+ ```bash
63
+ # Pages, entries, navigation, settings, forms, footer content, themes
64
+ riverbankcms push <scope> ...
65
+
66
+ # Custom blocks, block extensions/options, content type schemas/templates,
67
+ # SDK-managed settings, footer blocks/layout config
68
+ riverbankcms push-config ...
69
+ ```
70
+
71
+ `push-config` does not replace `push pages` or `push entries`; it syncs schema/config surfaces. If config validation fails, read the field errors as schema feedback before working around them in the site.
72
+
73
+ ## Before Applying
74
+
75
+ Checklist:
76
+
77
+ - [ ] I used `--env=local`, `--env=remote`, or `--env=both` explicitly.
78
+ - [ ] I ran a dry-run for the same scope and target environment.
79
+ - [ ] The dry-run contains only intended creates/updates/deletes.
80
+ - [ ] I understand any stale-content warnings.
81
+ - [ ] For remote writes, I included `--yes` only after reviewing the dry-run.
@@ -10,6 +10,16 @@ This workflow guides you through creating a new page in the CMS.
10
10
 
11
11
  ## Steps
12
12
 
13
+ ### Before You Add Custom Blocks
14
+
15
+ For simple content pages such as privacy policies, terms pages, FAQs, about copy, and editorial articles, start with built-in blocks:
16
+
17
+ - `block.body-text` for long-form rich text
18
+ - `block.hero` only when the page genuinely needs a visual/intro hero
19
+ - `block.cta-full` or existing CTA blocks for action strips
20
+
21
+ Check `block-types.md` before creating a custom block. A plain content page should usually be one `block.body-text` block with an `h1` and intro paragraph in the rich text body, not a site-specific custom block.
22
+
13
23
  ### 1. Create the Page
14
24
 
15
25
  ```bash
@@ -45,7 +55,7 @@ Add a body text block:
45
55
  ```bash
46
56
  riverbankcms block upsert contact intro-text \
47
57
  --kind block.body-text \
48
- --data '{"content": "<p>Reach out using the form below or email us directly.</p>"}'
58
+ --data '{"body": {"type": "doc", "content": [{"type": "heading", "attrs": {"level": 1}, "content": [{"type": "text", "text": "Contact Us"}]}, {"type": "paragraph", "content": [{"type": "text", "text": "Reach out using the form below or email us directly."}]}]}}'
49
59
  ```
50
60
 
51
61
  Add more blocks as needed. See `block-types.md` for available block types.
@@ -159,12 +169,12 @@ riverbankcms block upsert about hero \
159
169
  # 3. Add introduction text
160
170
  riverbankcms block upsert about intro \
161
171
  --kind block.body-text \
162
- --data '{"content": "<p>Founded in 2020, we have been...</p>"}'
172
+ --data '{"body": {"type": "doc", "content": [{"type": "paragraph", "content": [{"type": "text", "text": "Founded in 2020, we have been..."}]}]}}'
163
173
 
164
174
  # 4. Add team section (if using a team block)
165
175
  riverbankcms block upsert about team \
166
176
  --kind block.body-text \
167
- --data '{"content": "<h2>Our Team</h2><p>Meet the people behind the company.</p>"}'
177
+ --data '{"body": {"type": "doc", "content": [{"type": "heading", "attrs": {"level": 2}, "content": [{"type": "text", "text": "Our Team"}]}, {"type": "paragraph", "content": [{"type": "text", "text": "Meet the people behind the company."}]}]}}'
168
178
 
169
179
  # 5. Verify
170
180
  riverbankcms page get about
@@ -4,6 +4,15 @@ Create a site-specific block with custom fields and rendering when system blocks
4
4
 
5
5
  ## When to Use Custom Blocks
6
6
 
7
+ Before creating a custom block, check `block-types.md` and the site `schema.md`. Many content needs are already covered by system blocks:
8
+
9
+ - `block.body-text` for policy pages, terms pages, simple articles, and editorial copy
10
+ - `block.hero` for page intros and visual mastheads
11
+ - `block.cta-full` / CTA blocks for call-to-action sections
12
+ - `block.image-gallery`, `block.media-text`, and similar media/content patterns
13
+
14
+ Do not create a custom block just to get “a rich text area with different spacing.” Use a built-in block and add scoped site CSS or block field extensions when that is enough.
15
+
7
16
  **Use custom blocks when:**
8
17
  - You need a completely unique block structure
9
18
  - The functionality doesn't map to any system block
@@ -11,8 +11,8 @@ Define default template blocks for content types that generate pages. Templates
11
11
 
12
12
  **Templates vs manual blocks:**
13
13
  - Templates define the *default* blocks for new entries
14
- - Editors can still modify blocks after entry creation
15
- - SDK always wins on sync—templates overwrite manual changes
14
+ - Entry slots let editors add per-entry Page Content inside a shared template
15
+ - SDK config owns the template structure; entry slot blocks belong to each entry
16
16
 
17
17
  ## Prerequisites
18
18
 
@@ -92,6 +92,97 @@ Each template block has a scope that determines how its content is sourced:
92
92
  }
93
93
  ```
94
94
 
95
+ ### Page Content Slots
96
+
97
+ Use `system.entry-slot` when every entry should keep the same outer template but needs its own editable Page Content area. The slot must be template-scoped, and it only renders blocks for entries whose current template declares that slot key.
98
+
99
+ ```typescript
100
+ {
101
+ key: 'article',
102
+ name: 'Article',
103
+ hasPages: true,
104
+ routePattern: '/articles/{slug}',
105
+ fields: [
106
+ { id: 'summary', type: 'text', label: 'Summary', multiline: true },
107
+ ],
108
+ template: {
109
+ blocks: [
110
+ {
111
+ identifier: 'article-header',
112
+ kind: 'block.hero',
113
+ scope: 'entry',
114
+ bindings: {
115
+ headline: { source: 'meta', path: 'title' },
116
+ subheadline: { source: 'field', path: 'summary' },
117
+ },
118
+ },
119
+ {
120
+ identifier: 'main-content',
121
+ kind: 'system.entry-slot',
122
+ scope: 'template',
123
+ content: {
124
+ slotKey: 'main',
125
+ label: 'Page content',
126
+ allowedBlocks: ['block.body-text', 'block.rich-text', 'custom.article-callout'],
127
+ },
128
+ },
129
+ ],
130
+ },
131
+ }
132
+ ```
133
+
134
+ Event templates use the same primitive. Keep native event data in event blocks, then place editorial content in the slot:
135
+
136
+ ```typescript
137
+ {
138
+ key: 'event',
139
+ name: 'Event',
140
+ hasPages: true,
141
+ routePattern: '/events/{slug}',
142
+ template: {
143
+ blocks: [
144
+ { identifier: 'event-hero', kind: 'block.hero', scope: 'entry' },
145
+ { identifier: 'event-details', kind: 'block.event-details', scope: 'template' },
146
+ {
147
+ identifier: 'event-page-content',
148
+ kind: 'system.entry-slot',
149
+ scope: 'template',
150
+ content: {
151
+ slotKey: 'main',
152
+ label: 'Page content',
153
+ allowedBlocks: ['block.body-text', 'block.image-gallery', 'block.cta-full'],
154
+ },
155
+ },
156
+ { identifier: 'registration', kind: 'block.event-registration', scope: 'template' },
157
+ ],
158
+ },
159
+ }
160
+ ```
161
+
162
+ For entry content files, use the `blocks` object keyed by slot:
163
+
164
+ ```typescript
165
+ {
166
+ identifier: 'gentle-essay',
167
+ contentType: 'article',
168
+ slug: 'gentle-essay',
169
+ data: { summary: 'A short introduction.' },
170
+ blocks: {
171
+ main: [
172
+ {
173
+ identifier: 'intro',
174
+ kind: 'block.body-text',
175
+ content: { body: 'The editable article body starts here.' },
176
+ },
177
+ ],
178
+ },
179
+ }
180
+ ```
181
+
182
+ If `allowedBlocks` is omitted, the slot uses the curated Page Content palette. An empty array means the slot is locked and editors cannot add blocks. Template-only system blocks such as event registration are not allowed inside slots; keep those in the outer template.
183
+
184
+ Use entry fields for structured metadata that code needs to query or validate, such as retreat level, arrival time, teacher references, or event booking settings. Entry slots are for editorial page composition; extending built-in event metadata is a separate structured-data concern.
185
+
95
186
  **Template-scoped blocks** have fixed content:
96
187
  ```typescript
97
188
  {
@@ -119,6 +210,19 @@ Bindings map block fields to data sources. Available binding sources:
119
210
 
120
211
  **Valid meta paths:** `title`, `slug`, `publishedAt`, `createdAt`, `updatedAt`
121
212
 
213
+ ### Binding Type Compatibility
214
+
215
+ Template bindings must connect compatible source and target field types. `push-config` validates this and will reject mismatches before they reach the dashboard.
216
+
217
+ Common examples:
218
+
219
+ - `richText` entry field -> `richText` block field
220
+ - `media` entry field -> `media` block field
221
+ - `reference` entry field -> `reference` block field with the same `referenceKind`
222
+ - `text` entry field -> `text` block field
223
+
224
+ Do not bind a `reference` source into a `text` target just because the renderer eventually wants an identifier string. Make the custom block field a `reference` too, then convert/normalize the rendered value in code if needed. This keeps the block schema honest and allows dashboard validation/editor UI to work correctly.
225
+
122
226
  ### Step 4: Push Configuration
123
227
 
124
228
  Push the template to sync it with the CMS:
@@ -274,3 +378,4 @@ When you first push a template to a content type that has existing entries:
274
378
  - Check binding keys match block field IDs
275
379
  - Verify field paths exist in content type fields
276
380
  - Ensure block kinds are valid system or custom blocks
381
+ - Ensure source and target field types are compatible, especially `reference` fields
@@ -1,5 +1,5 @@
1
- import { defineIslandPropsDecoder } from './chunk-RJHTCTCZ.mjs';
2
- import './chunk-S3MKFGOG.mjs';
1
+ import { defineIslandPropsDecoder } from './chunk-VGDBVNOO.mjs';
2
+ import './chunk-ZE5G642V.mjs';
3
3
 
4
4
  // src/rendering/islands/enhancers/accordion.ts
5
5
  var decode = defineIslandPropsDecoder("accordion");
@@ -1,16 +1,16 @@
1
1
  "use client";
2
- import { usePolling } from './chunk-CSZGLBYR.mjs';
3
- import { SpinnerNode } from './chunk-SBBSMFFG.mjs';
2
+ import { usePolling } from './chunk-ZKUO52W3.mjs';
3
+ import { SpinnerNode } from './chunk-SYIJ5JO2.mjs';
4
4
  import { useDiscountCodeUi } from './chunk-ZFHRN6W2.mjs';
5
5
  import { buildRouteIslandApiConfig } from './chunk-L4J5Y62O.mjs';
6
- import { scrollToBlock, buildCheckoutReturnUrls, DiscountCodeDisclosure, formatPrice } from './chunk-CHAB5ACD.mjs';
6
+ import { scrollToBlock, buildCheckoutReturnUrls, DiscountCodeDisclosure, formatPrice } from './chunk-7UCLJ5SP.mjs';
7
7
  import { FieldValidationMessage, getFieldValidationControlProps } from './chunk-3DCJ45Z2.mjs';
8
8
  import './chunk-DVNUDUVT.mjs';
9
9
  import { isSpamProtectionEnabled, getChallengeUrl, AltchaWidget } from './chunk-GFSQNTRW.mjs';
10
10
  import { BlockApiProvider, useBlockApi, FeedbackMessage } from './chunk-UDNSI5PY.mjs';
11
11
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
12
- import { defineIslandPropsDecoder, resolveBookingSiteId, resolveDefaultBookingServiceId, getBookingRedirectStateFromLocation, deriveBookingFormViewState, logger, getBookingSuccessMessage, resolveAppointmentCheckoutVerificationState, themeButtonClassName, toSelectedCollectionOptionKind, assertNever11, prepareBookingSubmission, formatBookingSubmissionPreparationError, resolveBookingPaymentStep, BOOKING_FORM_DATA_RESERVED_KEYS, clearWorkflowFeedback, reportWorkflowError, reportWorkflowSuccess, okWith2, err2 } from './chunk-RJHTCTCZ.mjs';
13
- import { resolveBookingTimeZoneId, DEFAULT_BOOKING_TIME_ZONE, unsafeAsFormId, unsafeAsAppointmentResourceId, unsafeAsCustomerPassId, unsafeAsAppointmentServiceId, formatLocalScheduleDate, addLocalScheduleDays, parseBookingLocalDate, resolveFlexibleBalanceInitialPaymentCents, resolveFlexibleBalanceDueAt, getBookingInstalmentDepositRefundability, unsafeAsPassId, splitAmountWithRemainderInFirst, addIntervalPreservingMonthAnchor, clampConfiguredAmount, getBookingInstalmentPlanIntervalCount, omitZeroAmountFutureRows, formatBookingInstant } from './chunk-S3MKFGOG.mjs';
12
+ import { defineIslandPropsDecoder, resolveBookingSiteId, resolveDefaultBookingServiceId, getBookingRedirectStateFromLocation, deriveBookingFormViewState, logger, getBookingSuccessMessage, resolveAppointmentCheckoutVerificationState, themeButtonClassName, toSelectedCollectionOptionKind, assertNever11, prepareBookingSubmission, formatBookingSubmissionPreparationError, resolveBookingPaymentStep, BOOKING_FORM_DATA_RESERVED_KEYS, clearWorkflowFeedback, reportWorkflowError, reportWorkflowSuccess, okWith2, err2 } from './chunk-VGDBVNOO.mjs';
13
+ import { resolveBookingTimeZoneId, DEFAULT_BOOKING_TIME_ZONE, unsafeAsFormId, unsafeAsAppointmentResourceId, unsafeAsCustomerPassId, unsafeAsAppointmentServiceId, formatLocalScheduleDate, addLocalScheduleDays, parseBookingLocalDate, resolveFlexibleBalanceInitialPaymentCents, resolveFlexibleBalanceDueAt, getBookingInstalmentDepositRefundability, unsafeAsPassId, splitAmountWithRemainderInFirst, addIntervalPreservingMonthAnchor, clampConfiguredAmount, getBookingInstalmentPlanIntervalCount, omitZeroAmountFutureRows, formatBookingInstant } from './chunk-ZE5G642V.mjs';
14
14
  import React2, { useRef, useState, useMemo, useReducer, useEffect, useCallback, useLayoutEffect } from 'react';
15
15
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
16
16