@riverbankcms/sdk 0.7.0 → 0.7.3

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 (184) hide show
  1. package/README.md +229 -0
  2. package/dist/cli/index.js +42 -95
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/cli/init-docs/content/agents-section.md +50 -0
  5. package/dist/cli/init-docs/content/cli-reference.md +574 -0
  6. package/dist/cli/init-docs/content/content-management.md +384 -0
  7. package/dist/cli/init-docs/content/context-brand.md +125 -0
  8. package/dist/cli/init-docs/content/context-brief.md +77 -0
  9. package/dist/cli/init-docs/content/context-knowledge.md +111 -0
  10. package/dist/cli/init-docs/content/getting-started.md +130 -0
  11. package/dist/cli/init-docs/content/site-workflows-readme.md +96 -0
  12. package/dist/cli/init-docs/content/workflow-add-block.md +228 -0
  13. package/dist/cli/init-docs/content/workflow-create-page.md +193 -0
  14. package/dist/cli/init-docs/content/workflow-publish.md +280 -0
  15. package/dist/client/bookings.d.mts +2 -0
  16. package/dist/client/bookings.d.ts +2 -0
  17. package/dist/client/bookings.js +2956 -104
  18. package/dist/client/bookings.js.map +1 -1
  19. package/dist/client/bookings.mjs +2929 -70
  20. package/dist/client/bookings.mjs.map +1 -1
  21. package/dist/client/client.d.mts +2 -2
  22. package/dist/client/client.d.ts +2 -2
  23. package/dist/client/client.js +602 -68
  24. package/dist/client/client.js.map +1 -1
  25. package/dist/client/client.mjs +602 -68
  26. package/dist/client/client.mjs.map +1 -1
  27. package/dist/client/hooks.d.mts +2 -2
  28. package/dist/client/hooks.d.ts +2 -2
  29. package/dist/client/rendering/client.js +3070 -259
  30. package/dist/client/rendering/client.js.map +1 -1
  31. package/dist/client/rendering/client.mjs +3212 -395
  32. package/dist/client/rendering/client.mjs.map +1 -1
  33. package/dist/client/spam-protection.d.mts +55 -0
  34. package/dist/client/spam-protection.d.ts +55 -0
  35. package/dist/client/spam-protection.js +2915 -0
  36. package/dist/client/spam-protection.js.map +1 -0
  37. package/dist/client/spam-protection.mjs +2893 -0
  38. package/dist/client/spam-protection.mjs.map +1 -0
  39. package/dist/client/{usePage-BiOReg0_.d.ts → usePage-BYmJCCm1.d.ts} +132 -11
  40. package/dist/client/{usePage-BXjk8BhD.d.mts → usePage-DZtrWajy.d.mts} +132 -11
  41. package/dist/server/{Layout-wBtJLTVX.d.ts → Layout-Yluyb6sK.d.ts} +1 -1
  42. package/dist/server/{Layout-B7cvis7r.d.mts → Layout-qWLdVm5-.d.mts} +1 -1
  43. package/dist/server/chunk-2IZ6S225.js +122 -0
  44. package/dist/server/chunk-2IZ6S225.js.map +1 -0
  45. package/dist/server/chunk-4CV4JOE5.js +27 -0
  46. package/dist/server/chunk-4CV4JOE5.js.map +1 -0
  47. package/dist/server/chunk-5LRR64Y6.mjs +72 -0
  48. package/dist/server/chunk-5LRR64Y6.mjs.map +1 -0
  49. package/dist/server/chunk-NBTRDLCM.js +72 -0
  50. package/dist/server/chunk-NBTRDLCM.js.map +1 -0
  51. package/dist/server/chunk-NFEGQTCC.mjs +27 -0
  52. package/dist/server/{chunk-7FIJSGHU.mjs → chunk-NFQLH5IA.mjs} +856 -74
  53. package/dist/server/chunk-NFQLH5IA.mjs.map +1 -0
  54. package/dist/server/chunk-PPHZV6YD.mjs +122 -0
  55. package/dist/server/chunk-PPHZV6YD.mjs.map +1 -0
  56. package/dist/server/{chunk-P7UVAMK6.js → chunk-VLXTNB2C.js} +866 -84
  57. package/dist/server/chunk-VLXTNB2C.js.map +1 -0
  58. package/dist/server/{components-CMMwDXTW.d.mts → components-DNHfSCML.d.mts} +3 -3
  59. package/dist/server/{components-CICSJyp_.d.ts → components-Di5ME6He.d.ts} +3 -3
  60. package/dist/server/components.d.mts +5 -5
  61. package/dist/server/components.d.ts +5 -5
  62. package/dist/server/components.js +1 -1
  63. package/dist/server/components.mjs +1 -1
  64. package/dist/server/config-validation.js +1 -1
  65. package/dist/server/config-validation.mjs +1 -1
  66. package/dist/server/config.js +1 -1
  67. package/dist/server/config.mjs +1 -1
  68. package/dist/server/data.d.mts +2 -2
  69. package/dist/server/data.d.ts +2 -2
  70. package/dist/server/data.js +1 -1
  71. package/dist/server/data.mjs +1 -1
  72. package/dist/server/env.d.mts +109 -0
  73. package/dist/server/env.d.ts +109 -0
  74. package/dist/server/env.js +14 -0
  75. package/dist/server/env.js.map +1 -0
  76. package/dist/server/env.mjs +14 -0
  77. package/dist/server/{index-DI_qlYx3.d.mts → index--Oyunk_B.d.mts} +2 -2
  78. package/dist/server/{index-BTwWvSBu.d.ts → index-C9Ra8dza.d.ts} +2 -2
  79. package/dist/server/{index-Bucs6UqG.d.mts → index-Clm3skz_.d.mts} +1 -1
  80. package/dist/server/{index-Cp7tJuRt.d.ts → index-DLvNddi-.d.ts} +1 -1
  81. package/dist/server/index.d.mts +216 -5
  82. package/dist/server/index.d.ts +216 -5
  83. package/dist/server/index.js +301 -4
  84. package/dist/server/index.js.map +1 -1
  85. package/dist/server/index.mjs +301 -4
  86. package/dist/server/index.mjs.map +1 -1
  87. package/dist/server/{loadContent-DmgpFcFC.d.ts → loadContent-D7LQwI0o.d.ts} +3 -3
  88. package/dist/server/{loadContent-C-YYUKQa.d.mts → loadContent-DVfuBLiZ.d.mts} +3 -3
  89. package/dist/server/{loadPage-IDGVDFBB.js → loadPage-AXNAERDS.js} +2 -2
  90. package/dist/server/{loadPage-IDGVDFBB.js.map → loadPage-AXNAERDS.js.map} +1 -1
  91. package/dist/server/{loadPage-DP3nrHBi.d.ts → loadPage-BmYJCe_V.d.ts} +2 -2
  92. package/dist/server/{loadPage-B8mQUUSo.d.mts → loadPage-BucnLHmE.d.mts} +2 -2
  93. package/dist/server/{loadPage-DNQTTRHL.mjs → loadPage-XR7ORQ2E.mjs} +2 -2
  94. package/dist/server/loadPage-XR7ORQ2E.mjs.map +1 -0
  95. package/dist/server/metadata.d.mts +4 -4
  96. package/dist/server/metadata.d.ts +4 -4
  97. package/dist/server/metadata.js +1 -1
  98. package/dist/server/metadata.mjs +1 -1
  99. package/dist/server/navigation.d.mts +2 -2
  100. package/dist/server/navigation.d.ts +2 -2
  101. package/dist/server/navigation.js +1 -1
  102. package/dist/server/navigation.mjs +1 -1
  103. package/dist/server/next/revalidate.d.mts +66 -0
  104. package/dist/server/next/revalidate.d.ts +66 -0
  105. package/dist/server/next/revalidate.js +60 -0
  106. package/dist/server/next/revalidate.js.map +1 -0
  107. package/dist/server/next/revalidate.mjs +60 -0
  108. package/dist/server/next/revalidate.mjs.map +1 -0
  109. package/dist/server/next/tags.d.mts +81 -0
  110. package/dist/server/next/tags.d.ts +81 -0
  111. package/dist/server/next/tags.js +36 -0
  112. package/dist/server/next/tags.js.map +1 -0
  113. package/dist/server/next/tags.mjs +36 -0
  114. package/dist/server/next/tags.mjs.map +1 -0
  115. package/dist/server/next.d.mts +164 -6
  116. package/dist/server/next.d.ts +164 -6
  117. package/dist/server/next.js +79 -11
  118. package/dist/server/next.js.map +1 -1
  119. package/dist/server/next.mjs +76 -8
  120. package/dist/server/next.mjs.map +1 -1
  121. package/dist/server/rendering/server.d.mts +4 -4
  122. package/dist/server/rendering/server.d.ts +4 -4
  123. package/dist/server/rendering/server.js +1 -1
  124. package/dist/server/rendering/server.mjs +1 -1
  125. package/dist/server/rendering.d.mts +7 -7
  126. package/dist/server/rendering.d.ts +7 -7
  127. package/dist/server/rendering.js +3 -3
  128. package/dist/server/rendering.js.map +1 -1
  129. package/dist/server/rendering.mjs +4 -4
  130. package/dist/server/routing.d.mts +3 -3
  131. package/dist/server/routing.d.ts +3 -3
  132. package/dist/server/routing.js +2 -2
  133. package/dist/server/routing.mjs +2 -2
  134. package/dist/server/server.d.mts +5 -5
  135. package/dist/server/server.d.ts +5 -5
  136. package/dist/server/server.js +5 -5
  137. package/dist/server/server.js.map +1 -1
  138. package/dist/server/server.mjs +5 -5
  139. package/dist/server/theme-bridge.js +1 -1
  140. package/dist/server/theme-bridge.mjs +1 -1
  141. package/dist/server/theme.js +1 -1
  142. package/dist/server/theme.mjs +1 -1
  143. package/dist/server/{types-BvcJU7zk.d.ts → types-BRQyLrQU.d.ts} +132 -11
  144. package/dist/server/{types-Dsu9wsUh.d.mts → types-BSV6Vc-P.d.mts} +2 -2
  145. package/dist/server/{types-1cLz0vnq.d.mts → types-C-LShyIg.d.mts} +132 -11
  146. package/dist/server/{types-CVykEqXN.d.ts → types-Dt98DeYa.d.ts} +2 -2
  147. package/dist/server/webhooks.d.mts +81 -0
  148. package/dist/server/webhooks.d.ts +81 -0
  149. package/dist/server/webhooks.js +12 -0
  150. package/dist/server/webhooks.js.map +1 -0
  151. package/dist/server/webhooks.mjs +12 -0
  152. package/dist/server/webhooks.mjs.map +1 -0
  153. package/package.json +29 -3
  154. package/dist/client/resolver-BhueZVxZ.d.mts +0 -61
  155. package/dist/client/resolver-BhueZVxZ.d.ts +0 -61
  156. package/dist/client/usePage--fGlyrgj.d.mts +0 -6439
  157. package/dist/client/usePage-BBcFCxOU.d.ts +0 -6297
  158. package/dist/client/usePage-BC8Q2E3t.d.mts +0 -6431
  159. package/dist/client/usePage-BTPnCuWC.d.mts +0 -6511
  160. package/dist/client/usePage-BafOS9UT.d.mts +0 -6512
  161. package/dist/client/usePage-BcjWPXvh.d.mts +0 -6388
  162. package/dist/client/usePage-Bnx-kA6x.d.mts +0 -6670
  163. package/dist/client/usePage-BvKAa3Zw.d.mts +0 -366
  164. package/dist/client/usePage-BvKAa3Zw.d.ts +0 -366
  165. package/dist/client/usePage-BydHcMYB.d.mts +0 -6297
  166. package/dist/client/usePage-C3ZKNwY7.d.mts +0 -6393
  167. package/dist/client/usePage-CE7X5NcN.d.ts +0 -6439
  168. package/dist/client/usePage-CHEybPMD.d.ts +0 -6429
  169. package/dist/client/usePage-CrKw1H6Y.d.ts +0 -6338
  170. package/dist/client/usePage-CyYpOJud.d.ts +0 -6388
  171. package/dist/client/usePage-D4fxZbRR.d.mts +0 -6429
  172. package/dist/client/usePage-DMI8ImsU.d.mts +0 -6338
  173. package/dist/client/usePage-DoPI6b8V.d.ts +0 -6511
  174. package/dist/client/usePage-DpRNZUtP.d.ts +0 -6431
  175. package/dist/client/usePage-QNWArrVO.d.ts +0 -6670
  176. package/dist/client/usePage-fBgPB6Oq.d.ts +0 -6512
  177. package/dist/client/usePage-gpVaeWDy.d.ts +0 -6393
  178. package/dist/server/chunk-7FIJSGHU.mjs.map +0 -1
  179. package/dist/server/chunk-BJTO5JO5.mjs +0 -11
  180. package/dist/server/chunk-DGUM43GV.js +0 -11
  181. package/dist/server/chunk-DGUM43GV.js.map +0 -1
  182. package/dist/server/chunk-P7UVAMK6.js.map +0 -1
  183. /package/dist/server/{chunk-BJTO5JO5.mjs.map → chunk-NFEGQTCC.mjs.map} +0 -0
  184. /package/dist/server/{loadPage-DNQTTRHL.mjs.map → env.mjs.map} +0 -0
package/README.md CHANGED
@@ -2530,6 +2530,232 @@ npx riverbankcms push-config \
2530
2530
  --dashboard https://www.riverbankcms.com
2531
2531
  ```
2532
2532
 
2533
+ ## Next.js Catch-All Page Factory
2534
+
2535
+ The SDK provides a `createCatchAllPage()` factory that dramatically reduces boilerplate for Next.js catch-all routes. It handles page/entry routing, preview mode, metadata generation, and error handling in ~10 lines.
2536
+
2537
+ ### Basic Usage
2538
+
2539
+ ```tsx
2540
+ // src/app/[[...slug]]/page.tsx
2541
+ import { createCatchAllPage } from '@riverbankcms/sdk/next';
2542
+ import { getRiverbankClient } from '@/lib/builder-client';
2543
+ import config from '@/riverbank.config';
2544
+
2545
+ const { Page, generateMetadata } = createCatchAllPage({
2546
+ getClient: getRiverbankClient,
2547
+ config,
2548
+ blockOverrides: { /* custom block components */ },
2549
+ });
2550
+
2551
+ export default Page;
2552
+ export { generateMetadata };
2553
+ ```
2554
+
2555
+ This single call replaces ~160 lines of typical boilerplate that handles:
2556
+ - Path resolution from URL slugs
2557
+ - Content loading (pages and entries)
2558
+ - Preview mode detection
2559
+ - Template rendering for entries
2560
+ - SEO metadata generation
2561
+ - 404 handling
2562
+
2563
+ ### Preview Mode
2564
+
2565
+ Preview mode is detected via the `RIVERBANK_PREVIEW_MODE` environment variable:
2566
+
2567
+ ```bash
2568
+ # In your preview/staging environment
2569
+ RIVERBANK_PREVIEW_MODE=true
2570
+ ```
2571
+
2572
+ When enabled, `loadContent()` fetches draft/unpublished content instead of published content.
2573
+
2574
+ ### Escape Hatches
2575
+
2576
+ For customization beyond the defaults, use these options:
2577
+
2578
+ #### `beforeRender` - Maintenance Mode, Access Control
2579
+
2580
+ Intercept before rendering to implement maintenance mode, authentication, etc. Return a React node to short-circuit rendering, or `null` to continue.
2581
+
2582
+ ```tsx
2583
+ const { Page, generateMetadata } = createCatchAllPage({
2584
+ getClient,
2585
+ config,
2586
+ beforeRender: async ({ content, path, preview, searchParams }) => {
2587
+ // Maintenance mode
2588
+ if (process.env.MAINTENANCE_MODE === 'true') {
2589
+ return <MaintenancePage />;
2590
+ }
2591
+
2592
+ // Access control for protected paths
2593
+ if (path.startsWith('/members')) {
2594
+ const session = await getSession();
2595
+ if (!session) {
2596
+ return <LoginPage redirect={path} />;
2597
+ }
2598
+ }
2599
+
2600
+ // Continue with normal rendering
2601
+ return null;
2602
+ },
2603
+ });
2604
+ ```
2605
+
2606
+ #### `customMetadata` - Custom SEO Logic
2607
+
2608
+ Replace default metadata generation with custom logic:
2609
+
2610
+ ```tsx
2611
+ createCatchAllPage({
2612
+ getClient,
2613
+ config,
2614
+ customMetadata: async ({ content, path, preview, searchParams }) => {
2615
+ if (isEntryContent(content) && content.entry.type === 'product') {
2616
+ return {
2617
+ title: `${content.entry.title} | Shop`,
2618
+ openGraph: {
2619
+ type: 'product',
2620
+ // ... product-specific OG tags
2621
+ },
2622
+ };
2623
+ }
2624
+
2625
+ // Fall back to default for other content
2626
+ return generatePageMetadata({
2627
+ page: content.page,
2628
+ site: content.site,
2629
+ path,
2630
+ siteUrl: 'https://example.com',
2631
+ });
2632
+ },
2633
+ });
2634
+ ```
2635
+
2636
+ #### `wrapper` - Analytics, Error Boundaries
2637
+
2638
+ Wrap all rendered content with a component:
2639
+
2640
+ ```tsx
2641
+ createCatchAllPage({
2642
+ getClient,
2643
+ config,
2644
+ wrapper: ({ children }) => (
2645
+ <>
2646
+ {children}
2647
+ <AnalyticsScript siteId={config.siteId} />
2648
+ </>
2649
+ ),
2650
+ });
2651
+ ```
2652
+
2653
+ ### Configuration Options
2654
+
2655
+ | Option | Type | Required | Description |
2656
+ |--------|------|----------|-------------|
2657
+ | `getClient` | `() => RiverbankClient` | Yes | Factory function returning a configured client |
2658
+ | `config` | `RiverbankSiteConfig` | Yes | Site config from `defineConfig()` |
2659
+ | `blockOverrides` | `BlockOverrides` | No | Custom block component overrides |
2660
+ | `siteUrl` | `string` | No | Override site URL for metadata (uses `config.liveUrl`/`previewUrl` as fallback) |
2661
+ | `beforeRender` | `function` | No | Intercept before rendering |
2662
+ | `customMetadata` | `function` | No | Custom metadata generation |
2663
+ | `wrapper` | `ComponentType` | No | Wrapper component for rendered content |
2664
+
2665
+ ### Context Available in Escape Hatches
2666
+
2667
+ Both `beforeRender` and `customMetadata` receive a context object:
2668
+
2669
+ ```typescript
2670
+ type CatchAllContext = {
2671
+ content: LoadContentResult; // Page or entry data (includes site data)
2672
+ path: string; // Resolved path (e.g., '/blog/my-post')
2673
+ preview: boolean; // Whether preview mode is enabled
2674
+ searchParams: Record<string, string | string[] | undefined>; // URL search params
2675
+ };
2676
+ ```
2677
+
2678
+ ### Full Control - Use Lower-Level Helpers
2679
+
2680
+ For maximum customization, skip `createCatchAllPage` and use the underlying helpers:
2681
+
2682
+ ```tsx
2683
+ import { loadContent, isPageContent, Page } from '@riverbankcms/sdk/rendering';
2684
+ import { generatePageMetadata } from '@riverbankcms/sdk/metadata';
2685
+
2686
+ export default async function CustomPage({ params }) {
2687
+ const { slug } = await params;
2688
+ const path = `/${slug?.join('/') || ''}`;
2689
+
2690
+ const content = await loadContent({
2691
+ client: getClient(),
2692
+ siteId: config.siteId,
2693
+ path,
2694
+ preview: process.env.RIVERBANK_PREVIEW_MODE === 'true',
2695
+ });
2696
+
2697
+ if (isPageContent(content)) {
2698
+ return <Page {...content} />;
2699
+ }
2700
+
2701
+ // Custom entry rendering
2702
+ return <CustomEntryRenderer entry={content.entry} theme={content.theme} />;
2703
+ }
2704
+ ```
2705
+
2706
+ ## Spam Protection
2707
+
2708
+ Add ALTCHA proof-of-work spam protection to forms. The widget runs entirely client-side and requires no API keys.
2709
+
2710
+ ### Setup
2711
+
2712
+ ```tsx
2713
+ 'use client'
2714
+
2715
+ import { useSpamProtection, getChallengeUrl } from '@riverbankcms/sdk/spam-protection'
2716
+
2717
+ function ContactForm() {
2718
+ const { solution, isReady, reset, Widget } = useSpamProtection(getChallengeUrl())
2719
+
2720
+ const handleSubmit = async (e: React.FormEvent) => {
2721
+ e.preventDefault()
2722
+ if (!isReady) return
2723
+
2724
+ await fetch('/api/contact', {
2725
+ method: 'POST',
2726
+ body: JSON.stringify({
2727
+ ...formData,
2728
+ altchaSolution: solution, // Include with submission
2729
+ }),
2730
+ })
2731
+ reset() // Reset for another submission
2732
+ }
2733
+
2734
+ return (
2735
+ <form onSubmit={handleSubmit}>
2736
+ {/* form fields */}
2737
+ <Widget />
2738
+ <button disabled={!isReady}>Submit</button>
2739
+ </form>
2740
+ )
2741
+ }
2742
+ ```
2743
+
2744
+ ### Environment
2745
+
2746
+ Set `NEXT_PUBLIC_DASHBOARD_URL` so `getChallengeUrl()` resolves correctly.
2747
+
2748
+ ### Exports
2749
+
2750
+ ```tsx
2751
+ import {
2752
+ useSpamProtection, // Hook for solution state management
2753
+ getChallengeUrl, // Returns challenge endpoint URL
2754
+ hasSpamProtection, // Check if spam protection is enabled (server-only)
2755
+ AltchaWidget, // Low-level widget component
2756
+ } from '@riverbankcms/sdk/spam-protection'
2757
+ ```
2758
+
2533
2759
  ## Additional Exports
2534
2760
 
2535
2761
  - `@riverbankcms/sdk/rendering` - Low-level rendering components
@@ -2539,5 +2765,8 @@ npx riverbankcms push-config \
2539
2765
  - `@riverbankcms/sdk/data` - Data prefetching utilities
2540
2766
  - `@riverbankcms/sdk/metadata` - Metadata generation helpers
2541
2767
  - `@riverbankcms/sdk/routing` - Route resolution helpers
2768
+ - `@riverbankcms/sdk/navigation` - Navigation helpers and types
2542
2769
  - `@riverbankcms/sdk/analytics` - Analytics tracking helpers
2543
2770
  - `@riverbankcms/sdk/config` - Site configuration utilities (includes `defineConfig`, `defineContentConfig`, `RiverbankSiteConfig`, `ContentConfig`, etc.)
2771
+ - `@riverbankcms/sdk/next` - Next.js integration utilities (`createCatchAllPage`)
2772
+ - `@riverbankcms/sdk/spam-protection` - ALTCHA spam protection (`useSpamProtection`, `getChallengeUrl`, `AltchaWidget`)
package/dist/cli/index.js CHANGED
@@ -8495,25 +8495,56 @@ function renderOptionsList(options, depth) {
8495
8495
  // src/cli/init-docs/index.ts
8496
8496
  var AGENTS_START = "<!-- RIVERBANK-CONTEXT-START -->";
8497
8497
  var AGENTS_END = "<!-- RIVERBANK-CONTEXT-END -->";
8498
+ function getContentDir() {
8499
+ const isBundled = __dirname.includes("/dist/cli") || __dirname.endsWith("/dist/cli");
8500
+ if (isBundled) {
8501
+ return path9__namespace.join(__dirname, "init-docs", "content");
8502
+ }
8503
+ return path9__namespace.join(__dirname, "content");
8504
+ }
8505
+ function loadTemplate(name) {
8506
+ const contentDir = getContentDir();
8507
+ const filePath = path9__namespace.join(contentDir, `${name}.md`);
8508
+ return fs.readFileSync(filePath, "utf-8");
8509
+ }
8498
8510
  async function initDocs(options) {
8499
- const { rootDir, configPath, agentsPath, output } = options;
8511
+ const { rootDir, configPath, agentsPath } = options;
8500
8512
  const docsDir = path9__namespace.join(rootDir, "docs");
8501
8513
  const contextDir = path9__namespace.join(rootDir, "context");
8502
8514
  const workflowsDir = path9__namespace.join(docsDir, "workflows");
8515
+ const siteWorkflowsDir = path9__namespace.join(docsDir, "site-workflows");
8503
8516
  const knowledgeDir = path9__namespace.join(contextDir, "knowledge");
8504
8517
  const brandDir = path9__namespace.join(contextDir, "brand");
8505
8518
  await ensureDir2(workflowsDir);
8519
+ await ensureDir2(siteWorkflowsDir);
8506
8520
  await ensureDir2(knowledgeDir);
8507
8521
  await ensureDir2(brandDir);
8508
- await writeFileIfMissing(path9__namespace.join(docsDir, "cli-reference.md"), cliReferenceTemplate());
8509
- await writeFileIfMissing(path9__namespace.join(docsDir, "content-management.md"), contentManagementTemplate());
8510
- await writeFileIfMissing(path9__namespace.join(workflowsDir, "create-page.md"), workflowCreatePageTemplate());
8511
- await writeFileIfMissing(path9__namespace.join(workflowsDir, "add-block.md"), workflowAddBlockTemplate());
8512
- await writeFileIfMissing(path9__namespace.join(workflowsDir, "publish-workflow.md"), workflowPublishTemplate());
8513
- await writeFileIfMissing(path9__namespace.join(contextDir, "brief.md"), briefTemplate());
8514
- await writeFileIfMissing(path9__namespace.join(knowledgeDir, "README.md"), knowledgeTemplate());
8515
- await writeFileIfMissing(path9__namespace.join(brandDir, "README.md"), brandTemplate());
8516
- const { config: config3, errorMessage } = await loadConfig(configPath, output);
8522
+ await writeFileIfMissing(path9__namespace.join(docsDir, "getting-started.md"), loadTemplate("getting-started"));
8523
+ await writeFileIfMissing(path9__namespace.join(docsDir, "cli-reference.md"), loadTemplate("cli-reference"));
8524
+ await writeFileIfMissing(
8525
+ path9__namespace.join(docsDir, "content-management.md"),
8526
+ loadTemplate("content-management")
8527
+ );
8528
+ await writeFileIfMissing(
8529
+ path9__namespace.join(workflowsDir, "create-page.md"),
8530
+ loadTemplate("workflow-create-page")
8531
+ );
8532
+ await writeFileIfMissing(
8533
+ path9__namespace.join(workflowsDir, "add-block.md"),
8534
+ loadTemplate("workflow-add-block")
8535
+ );
8536
+ await writeFileIfMissing(
8537
+ path9__namespace.join(workflowsDir, "publish-workflow.md"),
8538
+ loadTemplate("workflow-publish")
8539
+ );
8540
+ await writeFileIfMissing(
8541
+ path9__namespace.join(siteWorkflowsDir, "README.md"),
8542
+ loadTemplate("site-workflows-readme")
8543
+ );
8544
+ await writeFileIfMissing(path9__namespace.join(contextDir, "brief.md"), loadTemplate("context-brief"));
8545
+ await writeFileIfMissing(path9__namespace.join(knowledgeDir, "README.md"), loadTemplate("context-knowledge"));
8546
+ await writeFileIfMissing(path9__namespace.join(brandDir, "README.md"), loadTemplate("context-brand"));
8547
+ const { config: config3, errorMessage } = await loadConfig(configPath, options.output);
8517
8548
  await upsertGeneratedDoc(
8518
8549
  path9__namespace.join(docsDir, "schema.md"),
8519
8550
  buildSchemaTemplate({ config: config3, errorMessage }),
@@ -8587,94 +8618,10 @@ ${after}`;
8587
8618
  }
8588
8619
  async function upsertAgentsSection(filePath) {
8589
8620
  const content = await readFileOrTemplate(filePath, "# AGENTS.md\n");
8590
- const section2 = agentsSectionTemplate();
8621
+ const section2 = loadTemplate("agents-section");
8591
8622
  const updated = replaceMarkedSection(content, AGENTS_START, AGENTS_END, section2);
8592
8623
  await fs3__namespace.writeFile(filePath, updated, "utf-8");
8593
8624
  }
8594
- function cliReferenceTemplate() {
8595
- return [
8596
- "# CLI Reference",
8597
- "",
8598
- "Describe the SDK CLI commands available to agents.",
8599
- "",
8600
- "Include usage patterns, required flags, and common examples.",
8601
- ""
8602
- ].join("\n");
8603
- }
8604
- function contentManagementTemplate() {
8605
- return [
8606
- "# Content Management",
8607
- "",
8608
- "Describe how content is structured, edited, and published for this site.",
8609
- ""
8610
- ].join("\n");
8611
- }
8612
- function workflowCreatePageTemplate() {
8613
- return [
8614
- "# Workflow: Create a Page",
8615
- "",
8616
- "Describe the steps to create a page for this site.",
8617
- "",
8618
- "Include any required content types or blocks.",
8619
- ""
8620
- ].join("\n");
8621
- }
8622
- function workflowAddBlockTemplate() {
8623
- return [
8624
- "# Workflow: Add a Block",
8625
- "",
8626
- "Describe how to add blocks to an existing page.",
8627
- ""
8628
- ].join("\n");
8629
- }
8630
- function workflowPublishTemplate() {
8631
- return [
8632
- "# Workflow: Publish Content",
8633
- "",
8634
- "Describe how to publish content safely for this site.",
8635
- ""
8636
- ].join("\n");
8637
- }
8638
- function briefTemplate() {
8639
- return [
8640
- "# Site Brief",
8641
- "",
8642
- "Summarize the brand, tone, and goals for this site.",
8643
- ""
8644
- ].join("\n");
8645
- }
8646
- function knowledgeTemplate() {
8647
- return [
8648
- "# Knowledge Base",
8649
- "",
8650
- "Add domain knowledge, FAQs, and reference links for the site.",
8651
- ""
8652
- ].join("\n");
8653
- }
8654
- function brandTemplate() {
8655
- return [
8656
- "# Brand Assets",
8657
- "",
8658
- "List or link the brand assets available for this site.",
8659
- ""
8660
- ].join("\n");
8661
- }
8662
- function agentsSectionTemplate() {
8663
- return [
8664
- "## Riverbank SDK Context",
8665
- "",
8666
- "- This repo contains both the CMS and the SDK used by this site.",
8667
- "- Agents can suggest or implement CMS changes when needed, not just local workarounds.",
8668
- "- Use riverbank.config.ts as the source of truth for site schema and custom blocks.",
8669
- "",
8670
- "## Code Quality Guidelines (SDK + CMS)",
8671
- "",
8672
- "- Prefer functional, composable helpers over large classes.",
8673
- "- Keep changes small and DRY; remove old code instead of shimming.",
8674
- "- Keep route handlers thin and use helpers/services.",
8675
- "- Use typed API clients; avoid hardcoded URLs."
8676
- ].join("\n");
8677
- }
8678
8625
 
8679
8626
  // src/cli/commands/init-docs.ts
8680
8627
  async function runInitDocs(options, command) {