@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.
- package/README.md +229 -0
- package/dist/cli/index.js +42 -95
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init-docs/content/agents-section.md +50 -0
- package/dist/cli/init-docs/content/cli-reference.md +574 -0
- package/dist/cli/init-docs/content/content-management.md +384 -0
- package/dist/cli/init-docs/content/context-brand.md +125 -0
- package/dist/cli/init-docs/content/context-brief.md +77 -0
- package/dist/cli/init-docs/content/context-knowledge.md +111 -0
- package/dist/cli/init-docs/content/getting-started.md +130 -0
- package/dist/cli/init-docs/content/site-workflows-readme.md +96 -0
- package/dist/cli/init-docs/content/workflow-add-block.md +228 -0
- package/dist/cli/init-docs/content/workflow-create-page.md +193 -0
- package/dist/cli/init-docs/content/workflow-publish.md +280 -0
- package/dist/client/bookings.d.mts +2 -0
- package/dist/client/bookings.d.ts +2 -0
- package/dist/client/bookings.js +2956 -104
- package/dist/client/bookings.js.map +1 -1
- package/dist/client/bookings.mjs +2929 -70
- package/dist/client/bookings.mjs.map +1 -1
- package/dist/client/client.d.mts +2 -2
- package/dist/client/client.d.ts +2 -2
- package/dist/client/client.js +602 -68
- package/dist/client/client.js.map +1 -1
- package/dist/client/client.mjs +602 -68
- package/dist/client/client.mjs.map +1 -1
- package/dist/client/hooks.d.mts +2 -2
- package/dist/client/hooks.d.ts +2 -2
- package/dist/client/rendering/client.js +3070 -259
- package/dist/client/rendering/client.js.map +1 -1
- package/dist/client/rendering/client.mjs +3212 -395
- package/dist/client/rendering/client.mjs.map +1 -1
- package/dist/client/spam-protection.d.mts +55 -0
- package/dist/client/spam-protection.d.ts +55 -0
- package/dist/client/spam-protection.js +2915 -0
- package/dist/client/spam-protection.js.map +1 -0
- package/dist/client/spam-protection.mjs +2893 -0
- package/dist/client/spam-protection.mjs.map +1 -0
- package/dist/client/{usePage-BiOReg0_.d.ts → usePage-BYmJCCm1.d.ts} +132 -11
- package/dist/client/{usePage-BXjk8BhD.d.mts → usePage-DZtrWajy.d.mts} +132 -11
- package/dist/server/{Layout-wBtJLTVX.d.ts → Layout-Yluyb6sK.d.ts} +1 -1
- package/dist/server/{Layout-B7cvis7r.d.mts → Layout-qWLdVm5-.d.mts} +1 -1
- package/dist/server/chunk-2IZ6S225.js +122 -0
- package/dist/server/chunk-2IZ6S225.js.map +1 -0
- package/dist/server/chunk-4CV4JOE5.js +27 -0
- package/dist/server/chunk-4CV4JOE5.js.map +1 -0
- package/dist/server/chunk-5LRR64Y6.mjs +72 -0
- package/dist/server/chunk-5LRR64Y6.mjs.map +1 -0
- package/dist/server/chunk-NBTRDLCM.js +72 -0
- package/dist/server/chunk-NBTRDLCM.js.map +1 -0
- package/dist/server/chunk-NFEGQTCC.mjs +27 -0
- package/dist/server/{chunk-7FIJSGHU.mjs → chunk-NFQLH5IA.mjs} +856 -74
- package/dist/server/chunk-NFQLH5IA.mjs.map +1 -0
- package/dist/server/chunk-PPHZV6YD.mjs +122 -0
- package/dist/server/chunk-PPHZV6YD.mjs.map +1 -0
- package/dist/server/{chunk-P7UVAMK6.js → chunk-VLXTNB2C.js} +866 -84
- package/dist/server/chunk-VLXTNB2C.js.map +1 -0
- package/dist/server/{components-CMMwDXTW.d.mts → components-DNHfSCML.d.mts} +3 -3
- package/dist/server/{components-CICSJyp_.d.ts → components-Di5ME6He.d.ts} +3 -3
- package/dist/server/components.d.mts +5 -5
- package/dist/server/components.d.ts +5 -5
- package/dist/server/components.js +1 -1
- package/dist/server/components.mjs +1 -1
- package/dist/server/config-validation.js +1 -1
- package/dist/server/config-validation.mjs +1 -1
- package/dist/server/config.js +1 -1
- package/dist/server/config.mjs +1 -1
- package/dist/server/data.d.mts +2 -2
- package/dist/server/data.d.ts +2 -2
- package/dist/server/data.js +1 -1
- package/dist/server/data.mjs +1 -1
- package/dist/server/env.d.mts +109 -0
- package/dist/server/env.d.ts +109 -0
- package/dist/server/env.js +14 -0
- package/dist/server/env.js.map +1 -0
- package/dist/server/env.mjs +14 -0
- package/dist/server/{index-DI_qlYx3.d.mts → index--Oyunk_B.d.mts} +2 -2
- package/dist/server/{index-BTwWvSBu.d.ts → index-C9Ra8dza.d.ts} +2 -2
- package/dist/server/{index-Bucs6UqG.d.mts → index-Clm3skz_.d.mts} +1 -1
- package/dist/server/{index-Cp7tJuRt.d.ts → index-DLvNddi-.d.ts} +1 -1
- package/dist/server/index.d.mts +216 -5
- package/dist/server/index.d.ts +216 -5
- package/dist/server/index.js +301 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +301 -4
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/{loadContent-DmgpFcFC.d.ts → loadContent-D7LQwI0o.d.ts} +3 -3
- package/dist/server/{loadContent-C-YYUKQa.d.mts → loadContent-DVfuBLiZ.d.mts} +3 -3
- package/dist/server/{loadPage-IDGVDFBB.js → loadPage-AXNAERDS.js} +2 -2
- package/dist/server/{loadPage-IDGVDFBB.js.map → loadPage-AXNAERDS.js.map} +1 -1
- package/dist/server/{loadPage-DP3nrHBi.d.ts → loadPage-BmYJCe_V.d.ts} +2 -2
- package/dist/server/{loadPage-B8mQUUSo.d.mts → loadPage-BucnLHmE.d.mts} +2 -2
- package/dist/server/{loadPage-DNQTTRHL.mjs → loadPage-XR7ORQ2E.mjs} +2 -2
- package/dist/server/loadPage-XR7ORQ2E.mjs.map +1 -0
- package/dist/server/metadata.d.mts +4 -4
- package/dist/server/metadata.d.ts +4 -4
- package/dist/server/metadata.js +1 -1
- package/dist/server/metadata.mjs +1 -1
- package/dist/server/navigation.d.mts +2 -2
- package/dist/server/navigation.d.ts +2 -2
- package/dist/server/navigation.js +1 -1
- package/dist/server/navigation.mjs +1 -1
- package/dist/server/next/revalidate.d.mts +66 -0
- package/dist/server/next/revalidate.d.ts +66 -0
- package/dist/server/next/revalidate.js +60 -0
- package/dist/server/next/revalidate.js.map +1 -0
- package/dist/server/next/revalidate.mjs +60 -0
- package/dist/server/next/revalidate.mjs.map +1 -0
- package/dist/server/next/tags.d.mts +81 -0
- package/dist/server/next/tags.d.ts +81 -0
- package/dist/server/next/tags.js +36 -0
- package/dist/server/next/tags.js.map +1 -0
- package/dist/server/next/tags.mjs +36 -0
- package/dist/server/next/tags.mjs.map +1 -0
- package/dist/server/next.d.mts +164 -6
- package/dist/server/next.d.ts +164 -6
- package/dist/server/next.js +79 -11
- package/dist/server/next.js.map +1 -1
- package/dist/server/next.mjs +76 -8
- package/dist/server/next.mjs.map +1 -1
- package/dist/server/rendering/server.d.mts +4 -4
- package/dist/server/rendering/server.d.ts +4 -4
- package/dist/server/rendering/server.js +1 -1
- package/dist/server/rendering/server.mjs +1 -1
- package/dist/server/rendering.d.mts +7 -7
- package/dist/server/rendering.d.ts +7 -7
- package/dist/server/rendering.js +3 -3
- package/dist/server/rendering.js.map +1 -1
- package/dist/server/rendering.mjs +4 -4
- package/dist/server/routing.d.mts +3 -3
- package/dist/server/routing.d.ts +3 -3
- package/dist/server/routing.js +2 -2
- package/dist/server/routing.mjs +2 -2
- package/dist/server/server.d.mts +5 -5
- package/dist/server/server.d.ts +5 -5
- package/dist/server/server.js +5 -5
- package/dist/server/server.js.map +1 -1
- package/dist/server/server.mjs +5 -5
- package/dist/server/theme-bridge.js +1 -1
- package/dist/server/theme-bridge.mjs +1 -1
- package/dist/server/theme.js +1 -1
- package/dist/server/theme.mjs +1 -1
- package/dist/server/{types-BvcJU7zk.d.ts → types-BRQyLrQU.d.ts} +132 -11
- package/dist/server/{types-Dsu9wsUh.d.mts → types-BSV6Vc-P.d.mts} +2 -2
- package/dist/server/{types-1cLz0vnq.d.mts → types-C-LShyIg.d.mts} +132 -11
- package/dist/server/{types-CVykEqXN.d.ts → types-Dt98DeYa.d.ts} +2 -2
- package/dist/server/webhooks.d.mts +81 -0
- package/dist/server/webhooks.d.ts +81 -0
- package/dist/server/webhooks.js +12 -0
- package/dist/server/webhooks.js.map +1 -0
- package/dist/server/webhooks.mjs +12 -0
- package/dist/server/webhooks.mjs.map +1 -0
- package/package.json +29 -3
- package/dist/client/resolver-BhueZVxZ.d.mts +0 -61
- package/dist/client/resolver-BhueZVxZ.d.ts +0 -61
- package/dist/client/usePage--fGlyrgj.d.mts +0 -6439
- package/dist/client/usePage-BBcFCxOU.d.ts +0 -6297
- package/dist/client/usePage-BC8Q2E3t.d.mts +0 -6431
- package/dist/client/usePage-BTPnCuWC.d.mts +0 -6511
- package/dist/client/usePage-BafOS9UT.d.mts +0 -6512
- package/dist/client/usePage-BcjWPXvh.d.mts +0 -6388
- package/dist/client/usePage-Bnx-kA6x.d.mts +0 -6670
- package/dist/client/usePage-BvKAa3Zw.d.mts +0 -366
- package/dist/client/usePage-BvKAa3Zw.d.ts +0 -366
- package/dist/client/usePage-BydHcMYB.d.mts +0 -6297
- package/dist/client/usePage-C3ZKNwY7.d.mts +0 -6393
- package/dist/client/usePage-CE7X5NcN.d.ts +0 -6439
- package/dist/client/usePage-CHEybPMD.d.ts +0 -6429
- package/dist/client/usePage-CrKw1H6Y.d.ts +0 -6338
- package/dist/client/usePage-CyYpOJud.d.ts +0 -6388
- package/dist/client/usePage-D4fxZbRR.d.mts +0 -6429
- package/dist/client/usePage-DMI8ImsU.d.mts +0 -6338
- package/dist/client/usePage-DoPI6b8V.d.ts +0 -6511
- package/dist/client/usePage-DpRNZUtP.d.ts +0 -6431
- package/dist/client/usePage-QNWArrVO.d.ts +0 -6670
- package/dist/client/usePage-fBgPB6Oq.d.ts +0 -6512
- package/dist/client/usePage-gpVaeWDy.d.ts +0 -6393
- package/dist/server/chunk-7FIJSGHU.mjs.map +0 -1
- package/dist/server/chunk-BJTO5JO5.mjs +0 -11
- package/dist/server/chunk-DGUM43GV.js +0 -11
- package/dist/server/chunk-DGUM43GV.js.map +0 -1
- package/dist/server/chunk-P7UVAMK6.js.map +0 -1
- /package/dist/server/{chunk-BJTO5JO5.mjs.map → chunk-NFEGQTCC.mjs.map} +0 -0
- /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
|
|
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, "
|
|
8509
|
-
await writeFileIfMissing(path9__namespace.join(docsDir, "
|
|
8510
|
-
await writeFileIfMissing(
|
|
8511
|
-
|
|
8512
|
-
|
|
8513
|
-
|
|
8514
|
-
await writeFileIfMissing(
|
|
8515
|
-
|
|
8516
|
-
|
|
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 =
|
|
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) {
|