@riverbankcms/sdk 0.6.1 → 0.7.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.
Files changed (172) hide show
  1. package/README.md +175 -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/client.d.mts +2 -2
  16. package/dist/client/client.d.ts +2 -2
  17. package/dist/client/client.js +536 -71
  18. package/dist/client/client.js.map +1 -1
  19. package/dist/client/client.mjs +536 -78
  20. package/dist/client/client.mjs.map +1 -1
  21. package/dist/client/hooks.d.mts +2 -2
  22. package/dist/client/hooks.d.ts +2 -2
  23. package/dist/client/usePage-C9tJpuKa.d.mts +6813 -0
  24. package/dist/client/usePage-Db9kzA41.d.ts +6813 -0
  25. package/dist/server/{Layout-wBtJLTVX.d.ts → Layout-Ce7PU9I5.d.ts} +1 -1
  26. package/dist/server/{Layout-B7cvis7r.d.mts → Layout-WllR8Zug.d.mts} +1 -1
  27. package/dist/server/{chunk-I7ZR2WO3.mjs → chunk-5JT452F2.mjs} +537 -76
  28. package/dist/server/chunk-5JT452F2.mjs.map +1 -0
  29. package/dist/server/{chunk-Z5ZA6Q4D.mjs → chunk-74XUVNOO.mjs} +5 -3
  30. package/dist/server/chunk-74XUVNOO.mjs.map +1 -0
  31. package/dist/server/{chunk-3B364WO2.js → chunk-7BVRA5MY.js} +4 -49
  32. package/dist/server/chunk-7BVRA5MY.js.map +1 -0
  33. package/dist/server/chunk-AET56TQX.mjs +45 -0
  34. package/dist/server/chunk-AET56TQX.mjs.map +1 -0
  35. package/dist/server/chunk-ARNCLSQT.mjs +52 -0
  36. package/dist/server/chunk-ARNCLSQT.mjs.map +1 -0
  37. package/dist/server/chunk-BNQV3PXP.js +69 -0
  38. package/dist/server/chunk-BNQV3PXP.js.map +1 -0
  39. package/dist/server/{chunk-IVHIQFJH.js → chunk-HMENX4Y7.js} +543 -82
  40. package/dist/server/chunk-HMENX4Y7.js.map +1 -0
  41. package/dist/server/{chunk-I2D7KOEA.js → chunk-JWRNMNWI.js} +5 -3
  42. package/dist/server/chunk-JWRNMNWI.js.map +1 -0
  43. package/dist/server/chunk-LQUKXIW7.mjs +13 -0
  44. package/dist/server/chunk-LQUKXIW7.mjs.map +1 -0
  45. package/dist/server/{chunk-XXFF4RVR.mjs → chunk-RBJFXNDM.mjs} +1 -46
  46. package/dist/server/chunk-RBJFXNDM.mjs.map +1 -0
  47. package/dist/server/chunk-SWYWZT3L.mjs +69 -0
  48. package/dist/server/chunk-SWYWZT3L.mjs.map +1 -0
  49. package/dist/server/chunk-T26N3P26.js +52 -0
  50. package/dist/server/chunk-T26N3P26.js.map +1 -0
  51. package/dist/server/chunk-VODFQMUW.js +45 -0
  52. package/dist/server/chunk-VODFQMUW.js.map +1 -0
  53. package/dist/server/chunk-WYNEYDXO.js +13 -0
  54. package/dist/server/chunk-WYNEYDXO.js.map +1 -0
  55. package/dist/server/{components-CICSJyp_.d.ts → components--LT61IKp.d.ts} +2 -2
  56. package/dist/server/{components-CMMwDXTW.d.mts → components-RPzRQve6.d.mts} +2 -2
  57. package/dist/server/components.d.mts +4 -4
  58. package/dist/server/components.d.ts +4 -4
  59. package/dist/server/components.js +5 -4
  60. package/dist/server/components.js.map +1 -1
  61. package/dist/server/components.mjs +5 -4
  62. package/dist/server/config-validation.js +0 -1
  63. package/dist/server/config-validation.js.map +1 -1
  64. package/dist/server/config-validation.mjs +0 -1
  65. package/dist/server/config.js +0 -1
  66. package/dist/server/config.js.map +1 -1
  67. package/dist/server/config.mjs +0 -1
  68. package/dist/server/config.mjs.map +1 -1
  69. package/dist/server/data.d.mts +1 -1
  70. package/dist/server/data.d.ts +1 -1
  71. package/dist/server/data.js +0 -1
  72. package/dist/server/data.js.map +1 -1
  73. package/dist/server/data.mjs +0 -1
  74. package/dist/server/env.d.mts +23 -0
  75. package/dist/server/env.d.ts +23 -0
  76. package/dist/server/env.js +7 -0
  77. package/dist/server/env.js.map +1 -0
  78. package/dist/server/env.mjs +7 -0
  79. package/dist/server/index-BL66CU6d.d.mts +130 -0
  80. package/dist/server/{index-Bucs6UqG.d.mts → index-Bkva0WAj.d.mts} +1 -1
  81. package/dist/server/index-CJk9iQQW.d.ts +130 -0
  82. package/dist/server/{index-Cp7tJuRt.d.ts → index-CSBWKA3r.d.ts} +1 -1
  83. package/dist/server/index.d.mts +3 -3
  84. package/dist/server/index.d.ts +3 -3
  85. package/dist/server/index.js +2 -3
  86. package/dist/server/index.js.map +1 -1
  87. package/dist/server/index.mjs +1 -2
  88. package/dist/server/index.mjs.map +1 -1
  89. package/dist/server/{loadContent-Buvmudee.d.ts → loadContent-CXUWMuzY.d.ts} +11 -3
  90. package/dist/server/{loadContent-BS-3wesN.d.mts → loadContent-F_tAS0Nl.d.mts} +11 -3
  91. package/dist/server/{loadPage-IDGVDFBB.js → loadPage-6I7F6GRF.js} +1 -2
  92. package/dist/server/loadPage-6I7F6GRF.js.map +1 -0
  93. package/dist/server/{loadPage-B8mQUUSo.d.mts → loadPage-CxlYLe5K.d.mts} +1 -1
  94. package/dist/server/{loadPage-DNQTTRHL.mjs → loadPage-JI2SML4M.mjs} +1 -2
  95. package/dist/server/{loadPage-DP3nrHBi.d.ts → loadPage-i2r-X5b9.d.ts} +1 -1
  96. package/dist/server/metadata.d.mts +8 -135
  97. package/dist/server/metadata.d.ts +8 -135
  98. package/dist/server/metadata.js +4 -65
  99. package/dist/server/metadata.js.map +1 -1
  100. package/dist/server/metadata.mjs +4 -65
  101. package/dist/server/metadata.mjs.map +1 -1
  102. package/dist/server/navigation.js +0 -1
  103. package/dist/server/navigation.js.map +1 -1
  104. package/dist/server/navigation.mjs +0 -1
  105. package/dist/server/next/revalidate.d.mts +66 -0
  106. package/dist/server/next/revalidate.d.ts +66 -0
  107. package/dist/server/next/revalidate.js +59 -0
  108. package/dist/server/next/revalidate.js.map +1 -0
  109. package/dist/server/next/revalidate.mjs +59 -0
  110. package/dist/server/next/revalidate.mjs.map +1 -0
  111. package/dist/server/next/tags.d.mts +78 -0
  112. package/dist/server/next/tags.d.ts +78 -0
  113. package/dist/server/next/tags.js +34 -0
  114. package/dist/server/next/tags.js.map +1 -0
  115. package/dist/server/next/tags.mjs +34 -0
  116. package/dist/server/next/tags.mjs.map +1 -0
  117. package/dist/server/next.d.mts +432 -0
  118. package/dist/server/next.d.ts +432 -0
  119. package/dist/server/next.js +217 -0
  120. package/dist/server/next.js.map +1 -0
  121. package/dist/server/next.mjs +217 -0
  122. package/dist/server/next.mjs.map +1 -0
  123. package/dist/server/rendering/server.d.mts +3 -3
  124. package/dist/server/rendering/server.d.ts +3 -3
  125. package/dist/server/rendering/server.js +5 -4
  126. package/dist/server/rendering/server.js.map +1 -1
  127. package/dist/server/rendering/server.mjs +5 -4
  128. package/dist/server/rendering.d.mts +6 -6
  129. package/dist/server/rendering.d.ts +6 -6
  130. package/dist/server/rendering.js +7 -6
  131. package/dist/server/rendering.js.map +1 -1
  132. package/dist/server/rendering.mjs +9 -8
  133. package/dist/server/routing.d.mts +2 -2
  134. package/dist/server/routing.d.ts +2 -2
  135. package/dist/server/routing.js +2 -4
  136. package/dist/server/routing.js.map +1 -1
  137. package/dist/server/routing.mjs +1 -3
  138. package/dist/server/routing.mjs.map +1 -1
  139. package/dist/server/server.d.mts +4 -4
  140. package/dist/server/server.d.ts +4 -4
  141. package/dist/server/server.js +4 -5
  142. package/dist/server/server.js.map +1 -1
  143. package/dist/server/server.mjs +5 -6
  144. package/dist/server/theme-bridge.js +0 -1
  145. package/dist/server/theme-bridge.js.map +1 -1
  146. package/dist/server/theme-bridge.mjs +0 -1
  147. package/dist/server/theme-bridge.mjs.map +1 -1
  148. package/dist/server/theme.js +1 -3
  149. package/dist/server/theme.js.map +1 -1
  150. package/dist/server/theme.mjs +0 -2
  151. package/dist/server/theme.mjs.map +1 -1
  152. package/dist/server/{types-BvcJU7zk.d.ts → types-DnkRh0UL.d.ts} +118 -9
  153. package/dist/server/{types-1cLz0vnq.d.mts → types-MF2AWoKv.d.mts} +118 -9
  154. package/dist/server/webhooks.d.mts +75 -0
  155. package/dist/server/webhooks.d.ts +75 -0
  156. package/dist/server/webhooks.js +11 -0
  157. package/dist/server/webhooks.js.map +1 -0
  158. package/dist/server/webhooks.mjs +11 -0
  159. package/dist/server/webhooks.mjs.map +1 -0
  160. package/package.json +33 -1
  161. package/dist/server/chunk-3B364WO2.js.map +0 -1
  162. package/dist/server/chunk-BJTO5JO5.mjs +0 -11
  163. package/dist/server/chunk-DGUM43GV.js +0 -11
  164. package/dist/server/chunk-DGUM43GV.js.map +0 -1
  165. package/dist/server/chunk-I2D7KOEA.js.map +0 -1
  166. package/dist/server/chunk-I7ZR2WO3.mjs.map +0 -1
  167. package/dist/server/chunk-IVHIQFJH.js.map +0 -1
  168. package/dist/server/chunk-XXFF4RVR.mjs.map +0 -1
  169. package/dist/server/chunk-Z5ZA6Q4D.mjs.map +0 -1
  170. package/dist/server/loadPage-IDGVDFBB.js.map +0 -1
  171. /package/dist/server/{chunk-BJTO5JO5.mjs.map → env.mjs.map} +0 -0
  172. /package/dist/server/{loadPage-DNQTTRHL.mjs.map → loadPage-JI2SML4M.mjs.map} +0 -0
package/README.md CHANGED
@@ -2530,6 +2530,179 @@ 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
+
2533
2706
  ## Additional Exports
2534
2707
 
2535
2708
  - `@riverbankcms/sdk/rendering` - Low-level rendering components
@@ -2539,5 +2712,7 @@ npx riverbankcms push-config \
2539
2712
  - `@riverbankcms/sdk/data` - Data prefetching utilities
2540
2713
  - `@riverbankcms/sdk/metadata` - Metadata generation helpers
2541
2714
  - `@riverbankcms/sdk/routing` - Route resolution helpers
2715
+ - `@riverbankcms/sdk/navigation` - Navigation helpers and types
2542
2716
  - `@riverbankcms/sdk/analytics` - Analytics tracking helpers
2543
2717
  - `@riverbankcms/sdk/config` - Site configuration utilities (includes `defineConfig`, `defineContentConfig`, `RiverbankSiteConfig`, `ContentConfig`, etc.)
2718
+ - `@riverbankcms/sdk/next` - Next.js integration utilities (`createCatchAllPage`)
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) {