riverbankcms 0.2.2 → 0.4.2

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.
@@ -203,7 +203,6 @@ riverbankcms pull --output ./src/content
203
203
  | `--yes` | Skip confirmation prompt |
204
204
  | `--local-media` | Download media referenced by identifiers to content/media |
205
205
  | `--sync-media` | Sync media files between environments |
206
- | `--overwrite-media` | When using `--sync-media`, overwrite target media on checksum mismatch |
207
206
  | `--with-theme` | Also pull theme when pulling all content |
208
207
  | `--name <name>` | Theme name for `pull theme` / `pull --with-theme` (default: current) |
209
208
  | `--no-meta` | Skip writing `.meta/` and media manifest files (content files still written) |
@@ -265,14 +264,12 @@ If unrelated local files would be included by a broad scope, stage a temporary c
265
264
  | `--dry-run` | Show changes without applying |
266
265
  | `--yes` | Skip confirmation (required for `--env=remote` or `--env=both`) |
267
266
  | `--force` | Push even if remote is newer (skip stale check) |
268
- | `--force-update-asset` | Replace CMS media when identifiers conflict (local media sync only) |
269
267
  | `--allow-truncated` | Push even if remote content was truncated (may cause incomplete sync) |
270
268
  | `--diff-detail <mode>` | Diff verbosity carried in the `--json` envelope: `summary` (default) or `full` |
271
269
  | `--json-diff [mode]` | **[Deprecated]** Alias of `--diff-detail`; folded into the `--json` envelope (warns on stderr) |
272
270
  | `--with-config` | Push SDK schema/config before dependent file content |
273
271
  | `--with-theme` | Also push theme when pushing all content |
274
272
  | `--sync-media` | Sync media files from local to remote environment |
275
- | `--overwrite-media` | When using `--sync-media`, overwrite target media on checksum mismatch |
276
273
  | `--merge-remote` | Plan an entries/pages three-way merge for `--env=remote` that preserves remote edits |
277
274
  | `--delete-orphaned` | Delete CMS entries not present in local files |
278
275
  | `--auto-pull-stale` | Automatically pull stale content and retry push |
@@ -420,6 +417,42 @@ export default defineConfig({
420
417
 
421
418
  **Status Sync**: Push automatically syncs draft/published status based on the `status` field in your local content files. If local content is "published" but remote is "draft", push will publish it. If local is "draft" but remote is "published", push will unpublish it.
422
419
 
420
+ ### settings booking configure
421
+
422
+ Configure the site's booking vertical and selected presets through the
423
+ purpose-built settings operation:
424
+
425
+ ```bash
426
+ # Ask the server for an authoritative preview; do not write
427
+ riverbankcms settings booking configure \
428
+ --vertical fitness_pt \
429
+ --preset fitness_pt.group_training \
430
+ --dry-run --json
431
+
432
+ # Apply locally, or target production with --env=remote --yes
433
+ riverbankcms settings booking configure \
434
+ --vertical fitness_pt \
435
+ --preset fitness_pt.group_training \
436
+ --yes
437
+ ```
438
+
439
+ Options:
440
+
441
+ | Option | Description |
442
+ | --- | --- |
443
+ | `--vertical <vertical>` | Required canonical booking vertical identifier |
444
+ | `--preset <preset>` | Required preset identifier; repeat for multiple presets |
445
+ | `--dry-run` | Show the server-authoritative preview without writing |
446
+ | `--yes` | Skip confirmation; required for JSON/non-interactive writes |
447
+
448
+ The command validates the selection locally, previews on the server, and
449
+ revalidates immediately before applying. `--env=both` preflights both targets,
450
+ then applies local before remote. Changing the vertical does not rewrite
451
+ existing offerings or their stored presets. The declarative equivalent is
452
+ `verticalConfig` in `content/settings.json` followed by `riverbankcms push
453
+ settings`; `riverbankcms pull settings` writes the canonical configuration
454
+ back to that file.
455
+
423
456
  ### push-config
424
457
 
425
458
  Push SDK configuration to the CMS dashboard.
@@ -232,6 +232,42 @@ Notes:
232
232
  - `riverbankcms pull settings` warns and omits `logoIdentifier` / `faviconIdentifier` if the current CMS branding asset has no media identifier yet
233
233
  - Dashboard branding edits and CLI pushes both update the same site settings row, so treat them as last-write-wins and pull before pushing after dashboard-side edits
234
234
 
235
+ ### Configure the booking vertical
236
+
237
+ Booking vertical selection is a purpose-built settings operation rather than a
238
+ generic `settings.update` field. The CLI validates the vertical and every
239
+ preset against the canonical catalog before contacting the CMS:
240
+
241
+ ```bash
242
+ # Preview the server-authoritative result without changing the site
243
+ riverbankcms settings booking configure \
244
+ --vertical fitness_pt \
245
+ --preset fitness_pt.group_training \
246
+ --dry-run --json
247
+
248
+ # Apply the same configuration to the local CMS
249
+ riverbankcms settings booking configure \
250
+ --vertical fitness_pt \
251
+ --preset fitness_pt.group_training \
252
+ --yes
253
+ ```
254
+
255
+ Repeat `--preset` to select more than one preset. Use `--env=remote` or
256
+ `--env=both --yes` to target the other project environment. The command asks
257
+ the server for a preview before applying and revalidates that preview
258
+ immediately before the write; `--dry-run` reports that authoritative preview
259
+ without writing anything. JSON and other non-interactive writes require
260
+ `--yes`.
261
+
262
+ Changing the vertical does not rewrite existing offerings. Their stored
263
+ presets remain unchanged; this operation only changes the site-level booking
264
+ configuration.
265
+
266
+ The declarative equivalent is to add `verticalConfig` to
267
+ `content/settings.json` and run `riverbankcms push settings` (or the relevant
268
+ scope of `riverbankcms push`). Pulling settings writes the canonical vertical
269
+ and preset order back to that file.
270
+
235
271
  ---
236
272
 
237
273
  ## Draft vs Published
@@ -432,14 +468,12 @@ Use this when you explicitly want to copy media bytes between environments witho
432
468
  # Remote storage -> local storage (identifier + checksum based)
433
469
  riverbankcms pull --env=remote --sync-media --yes
434
470
 
435
- # Fail-safe by default: checksum mismatches abort unless you explicitly overwrite
436
- riverbankcms pull --env=remote --sync-media --overwrite-media --yes
471
+ # Checksum mismatches abort; delete the target asset first or use a new identifier
437
472
  ```
438
473
 
439
474
  Notes:
440
475
 
441
- - `--sync-media` is **identifier + checksum** based. If the target already has an identifier with different bytes, the command fails unless you pass `--overwrite-media`.
442
- - When pulling from remote, `--sync-media` may need to **write to the source CMS** to backfill missing identifiers, so remote sync requires `--yes`.
476
+ - `--sync-media` is **identifier + checksum** based. If the target already has an identifier with different bytes, the command fails without modifying either asset.
443
477
  - Local media bytes live under `content/media/`, which is treated as cache/migration working data by default in generated SDK sites.
444
478
 
445
479
  #### Promote local files → production CMS
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { a as classifySdkEventPricing, i as classifySdkEventSchedule, o as classifySdkEventPaymentTerms, r as sdkEventUpsertOptionalFieldSchemas } from "./sdk-event-upsert-BCZUdIrL.mjs";
2
+ import { c as EVENT_PRESET_VALUES } from "./src-BRAF1Dee.mjs";
3
+ import { a as classifySdkEventPricing, i as classifySdkEventSchedule, o as classifySdkEventPaymentTerms, r as sdkEventUpsertOptionalFieldSchemas } from "./sdk-event-upsert-C6zsxDcf.mjs";
3
4
  import { z } from "zod";
4
5
 
5
6
  //#region ../blocks/src/lib/typeGuards.ts
@@ -2070,6 +2071,10 @@ const EVENT_CONTENT_TYPE_SCHEMA = {
2070
2071
  kind: "event-occurrence",
2071
2072
  segmentType: "uuid-or-date",
2072
2073
  precedence: "subroute-first"
2074
+ }, {
2075
+ kind: "event-run",
2076
+ segmentType: "slug",
2077
+ precedence: "content-first"
2073
2078
  }]
2074
2079
  },
2075
2080
  labels: {
@@ -4913,15 +4918,7 @@ const eventUpsertInputSchema = z.object({
4913
4918
  slug: z.string().min(1).optional(),
4914
4919
  content: z.record(z.string(), z.unknown()).optional(),
4915
4920
  blocks: sdkEntrySlotBlocksInputSchema.optional(),
4916
- preset: z.enum([
4917
- "event",
4918
- "class",
4919
- "course",
4920
- "term",
4921
- "workshop",
4922
- "retreat",
4923
- "performance"
4924
- ]),
4921
+ preset: z.enum(EVENT_PRESET_VALUES),
4925
4922
  runRefs: z.tuple([z.string().min(1)], z.string().min(1)),
4926
4923
  runs: z.tuple([eventRunInputSchema], eventRunInputSchema)
4927
4924
  }).superRefine((input, ctx) => input.runs.forEach((run, index) => {
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { n as assertCompatibleSdkPeer } from "./sdk-peer-DiZYsNXj.mjs";
2
+ import { n as assertCompatibleSdkPeer } from "./sdk-peer-C6kOODEY.mjs";
3
3
  import { dirname, resolve } from "path";
4
4
  import { createJiti } from "jiti";
5
5
  import { existsSync } from "fs";
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import "./sdk-peer-C6kOODEY.mjs";
3
+ import { t as loadConfigFile } from "./load-config-CCaUI4HN.mjs";
4
+
5
+ export { loadConfigFile };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { K as parseSiteId, bt as ok, yt as err } from "./src-XEJYAKbQ.mjs";
2
+ import { At as ok, kt as err, nt as parseSiteId } from "./src-BRAF1Dee.mjs";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { dirname, isAbsolute, join, parse, relative, resolve, sep } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import "../src-XEJYAKbQ.mjs";
3
- import { a as prepareScaffoldExecution, d as loadGeneratedPackageRanges, i as preflightScaffoldTargets, l as deriveGeneratedPackageRanges, o as writeScaffoldFiles, r as preflightScaffoldPlan, s as deriveScaffoldLocalManifest, t as deriveScaffoldPlan, u as findPackageManifestPath } from "../plan-2c4zVtlW.mjs";
2
+ import "../src-BRAF1Dee.mjs";
3
+ import { a as prepareScaffoldExecution, d as loadGeneratedPackageRanges, i as preflightScaffoldTargets, l as deriveGeneratedPackageRanges, o as writeScaffoldFiles, r as preflightScaffoldPlan, s as deriveScaffoldLocalManifest, t as deriveScaffoldPlan, u as findPackageManifestPath } from "../plan-CaWqAqfn.mjs";
4
4
 
5
5
  export { deriveGeneratedPackageRanges, deriveScaffoldLocalManifest, deriveScaffoldPlan, findPackageManifestPath, loadGeneratedPackageRanges, preflightScaffoldPlan, preflightScaffoldTargets, prepareScaffoldExecution, writeScaffoldFiles };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { A as parseUtcIsoDateTimeString, P as parseBookingTimeZone } from "./src-XEJYAKbQ.mjs";
2
+ import { B as parseUtcIsoDateTimeString, W as parseBookingTimeZone } from "./src-BRAF1Dee.mjs";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region ../api/src/sdk-event-payment-terms.ts
@@ -3,7 +3,7 @@ import { existsSync, readFileSync } from "node:fs";
3
3
  import { dirname, join, parse } from "node:path";
4
4
 
5
5
  //#region package.json
6
- var version = "0.2.2";
6
+ var version = "0.4.2";
7
7
  var peerDependencies = { "@riverbankcms/sdk": ">=0.130.0 <1.0.0" };
8
8
  var package_default = {
9
9
  name: "riverbankcms",
@@ -79,7 +79,7 @@ var package_default = {
79
79
  //#endregion
80
80
  //#region src/version.ts
81
81
  /** The package manifest is the source-run fallback; builds inject this value. */
82
- const CLI_VERSION = typeof "0.2.2" === "string" ? "0.2.2" : version;
82
+ const CLI_VERSION = typeof "0.4.2" === "string" ? "0.4.2" : version;
83
83
  /**
84
84
  * The CLI's SDK peer range is bundled from the CLI manifest alongside its
85
85
  * version. Runtime config loading uses this value as the single compatibility