@riverbankcms/sdk 0.7.0 → 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.
- package/README.md +175 -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/client.d.mts +2 -2
- package/dist/client/client.d.ts +2 -2
- package/dist/client/client.js +536 -71
- package/dist/client/client.js.map +1 -1
- package/dist/client/client.mjs +536 -78
- 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/usePage-C9tJpuKa.d.mts +6813 -0
- package/dist/client/usePage-Db9kzA41.d.ts +6813 -0
- package/dist/server/{Layout-wBtJLTVX.d.ts → Layout-Ce7PU9I5.d.ts} +1 -1
- package/dist/server/{Layout-B7cvis7r.d.mts → Layout-WllR8Zug.d.mts} +1 -1
- package/dist/server/{chunk-7FIJSGHU.mjs → chunk-5JT452F2.mjs} +537 -76
- package/dist/server/chunk-5JT452F2.mjs.map +1 -0
- package/dist/server/chunk-AET56TQX.mjs +45 -0
- package/dist/server/chunk-AET56TQX.mjs.map +1 -0
- package/dist/server/{chunk-P7UVAMK6.js → chunk-HMENX4Y7.js} +543 -82
- package/dist/server/chunk-HMENX4Y7.js.map +1 -0
- package/dist/server/chunk-LQUKXIW7.mjs +13 -0
- package/dist/server/chunk-LQUKXIW7.mjs.map +1 -0
- package/dist/server/chunk-VODFQMUW.js +45 -0
- package/dist/server/chunk-VODFQMUW.js.map +1 -0
- package/dist/server/chunk-WYNEYDXO.js +13 -0
- package/dist/server/chunk-WYNEYDXO.js.map +1 -0
- package/dist/server/{components-CICSJyp_.d.ts → components--LT61IKp.d.ts} +2 -2
- package/dist/server/{components-CMMwDXTW.d.mts → components-RPzRQve6.d.mts} +2 -2
- package/dist/server/components.d.mts +4 -4
- package/dist/server/components.d.ts +4 -4
- package/dist/server/components.js +0 -1
- package/dist/server/components.js.map +1 -1
- package/dist/server/components.mjs +0 -1
- package/dist/server/config-validation.js +0 -1
- package/dist/server/config-validation.js.map +1 -1
- package/dist/server/config-validation.mjs +0 -1
- package/dist/server/config.js +0 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs +0 -1
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/data.d.mts +1 -1
- package/dist/server/data.d.ts +1 -1
- package/dist/server/data.js +0 -1
- package/dist/server/data.js.map +1 -1
- package/dist/server/data.mjs +0 -1
- package/dist/server/env.d.mts +23 -0
- package/dist/server/env.d.ts +23 -0
- package/dist/server/env.js +7 -0
- package/dist/server/env.js.map +1 -0
- package/dist/server/env.mjs +7 -0
- package/dist/server/{index-DI_qlYx3.d.mts → index-BL66CU6d.d.mts} +2 -2
- package/dist/server/{index-Bucs6UqG.d.mts → index-Bkva0WAj.d.mts} +1 -1
- package/dist/server/{index-BTwWvSBu.d.ts → index-CJk9iQQW.d.ts} +2 -2
- package/dist/server/{index-Cp7tJuRt.d.ts → index-CSBWKA3r.d.ts} +1 -1
- package/dist/server/index.d.mts +3 -3
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +2 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +1 -2
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/{loadContent-DmgpFcFC.d.ts → loadContent-CXUWMuzY.d.ts} +2 -2
- package/dist/server/{loadContent-C-YYUKQa.d.mts → loadContent-F_tAS0Nl.d.mts} +2 -2
- package/dist/server/{loadPage-IDGVDFBB.js → loadPage-6I7F6GRF.js} +1 -2
- package/dist/server/loadPage-6I7F6GRF.js.map +1 -0
- package/dist/server/{loadPage-B8mQUUSo.d.mts → loadPage-CxlYLe5K.d.mts} +1 -1
- package/dist/server/{loadPage-DNQTTRHL.mjs → loadPage-JI2SML4M.mjs} +1 -2
- package/dist/server/{loadPage-DP3nrHBi.d.ts → loadPage-i2r-X5b9.d.ts} +1 -1
- package/dist/server/metadata.d.mts +3 -3
- package/dist/server/metadata.d.ts +3 -3
- package/dist/server/metadata.js +0 -1
- package/dist/server/metadata.js.map +1 -1
- package/dist/server/metadata.mjs +0 -1
- package/dist/server/navigation.js +0 -1
- package/dist/server/navigation.js.map +1 -1
- package/dist/server/navigation.mjs +0 -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 +59 -0
- package/dist/server/next/revalidate.js.map +1 -0
- package/dist/server/next/revalidate.mjs +59 -0
- package/dist/server/next/revalidate.mjs.map +1 -0
- package/dist/server/next/tags.d.mts +78 -0
- package/dist/server/next/tags.d.ts +78 -0
- package/dist/server/next/tags.js +34 -0
- package/dist/server/next/tags.js.map +1 -0
- package/dist/server/next/tags.mjs +34 -0
- package/dist/server/next/tags.mjs.map +1 -0
- package/dist/server/next.d.mts +163 -5
- package/dist/server/next.d.ts +163 -5
- package/dist/server/next.js +78 -11
- package/dist/server/next.js.map +1 -1
- package/dist/server/next.mjs +75 -8
- package/dist/server/next.mjs.map +1 -1
- package/dist/server/rendering/server.d.mts +3 -3
- package/dist/server/rendering/server.d.ts +3 -3
- package/dist/server/rendering/server.js +0 -1
- package/dist/server/rendering/server.js.map +1 -1
- package/dist/server/rendering/server.mjs +0 -1
- package/dist/server/rendering.d.mts +6 -6
- package/dist/server/rendering.d.ts +6 -6
- package/dist/server/rendering.js +2 -3
- package/dist/server/rendering.js.map +1 -1
- package/dist/server/rendering.mjs +3 -4
- package/dist/server/routing.d.mts +2 -2
- package/dist/server/routing.d.ts +2 -2
- package/dist/server/routing.js +2 -4
- package/dist/server/routing.js.map +1 -1
- package/dist/server/routing.mjs +1 -3
- package/dist/server/routing.mjs.map +1 -1
- package/dist/server/server.d.mts +4 -4
- package/dist/server/server.d.ts +4 -4
- package/dist/server/server.js +4 -5
- package/dist/server/server.js.map +1 -1
- package/dist/server/server.mjs +4 -5
- package/dist/server/theme-bridge.js +0 -1
- package/dist/server/theme-bridge.js.map +1 -1
- package/dist/server/theme-bridge.mjs +0 -1
- package/dist/server/theme-bridge.mjs.map +1 -1
- package/dist/server/theme.js +1 -3
- package/dist/server/theme.js.map +1 -1
- package/dist/server/theme.mjs +0 -2
- package/dist/server/theme.mjs.map +1 -1
- package/dist/server/{types-BvcJU7zk.d.ts → types-DnkRh0UL.d.ts} +118 -9
- package/dist/server/{types-1cLz0vnq.d.mts → types-MF2AWoKv.d.mts} +118 -9
- package/dist/server/webhooks.d.mts +75 -0
- package/dist/server/webhooks.d.ts +75 -0
- package/dist/server/webhooks.js +11 -0
- package/dist/server/webhooks.js.map +1 -0
- package/dist/server/webhooks.mjs +11 -0
- package/dist/server/webhooks.mjs.map +1 -0
- package/package.json +23 -3
- 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/loadPage-IDGVDFBB.js.map +0 -1
- /package/dist/server/{chunk-BJTO5JO5.mjs.map → env.mjs.map} +0 -0
- /package/dist/server/{loadPage-DNQTTRHL.mjs.map → loadPage-JI2SML4M.mjs.map} +0 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
# Content Management Guide
|
|
2
|
+
|
|
3
|
+
This guide explains the RiverbankCMS content model and how to work with content via the SDK.
|
|
4
|
+
|
|
5
|
+
## Content Model Overview
|
|
6
|
+
|
|
7
|
+
RiverbankCMS organizes content into four main types:
|
|
8
|
+
|
|
9
|
+
### 1. Entries
|
|
10
|
+
|
|
11
|
+
Content items for a specific content type (e.g., blog posts, products, team members).
|
|
12
|
+
|
|
13
|
+
- Defined by content types in `riverbank.config.ts`
|
|
14
|
+
- Each entry has an identifier, slug, and type-specific data
|
|
15
|
+
- Can be draft or published
|
|
16
|
+
|
|
17
|
+
**Local file structure:**
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
content/
|
|
21
|
+
entries/
|
|
22
|
+
blog-post.json # All blog-post entries
|
|
23
|
+
product.json # All product entries
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 2. Pages
|
|
27
|
+
|
|
28
|
+
Standalone pages that contain blocks.
|
|
29
|
+
|
|
30
|
+
- Have a path (URL), title, and SEO metadata
|
|
31
|
+
- Contain an ordered list of blocks
|
|
32
|
+
- Can be draft or published
|
|
33
|
+
|
|
34
|
+
**Local file structure:**
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
content/
|
|
38
|
+
pages/
|
|
39
|
+
home.json # Home page with blocks
|
|
40
|
+
about.json # About page with blocks
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 3. Blocks
|
|
44
|
+
|
|
45
|
+
Content components within pages.
|
|
46
|
+
|
|
47
|
+
- Each block has a kind (e.g., `block.hero`, `block.bodyText`)
|
|
48
|
+
- Contains kind-specific content data
|
|
49
|
+
- Ordered by position within a page
|
|
50
|
+
|
|
51
|
+
**Common block kinds:**
|
|
52
|
+
|
|
53
|
+
| Kind | Description |
|
|
54
|
+
|------|-------------|
|
|
55
|
+
| `block.hero` | Hero/banner sections with heading, image, CTA |
|
|
56
|
+
| `block.bodyText` | Rich text content |
|
|
57
|
+
| `block.image` | Image with caption |
|
|
58
|
+
| `block.cta` | Call-to-action buttons |
|
|
59
|
+
| `block.embed` | Embedded content (videos, etc.) |
|
|
60
|
+
|
|
61
|
+
See `block-types.md` for the full list.
|
|
62
|
+
|
|
63
|
+
### 4. Navigation
|
|
64
|
+
|
|
65
|
+
Menu structures for site navigation.
|
|
66
|
+
|
|
67
|
+
- Named menus (e.g., "main", "footer")
|
|
68
|
+
- Hierarchical items with labels, URLs, and children
|
|
69
|
+
|
|
70
|
+
**Local file structure:**
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
content/
|
|
74
|
+
navigation.json # All navigation menus
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Working with Identifiers
|
|
80
|
+
|
|
81
|
+
Identifiers are stable, human-readable names for content:
|
|
82
|
+
|
|
83
|
+
- Used by the SDK to reference content reliably
|
|
84
|
+
- Should be kebab-case (e.g., `my-blog-post`, `about-us`)
|
|
85
|
+
- Are idempotent - upserting with same identifier updates existing content
|
|
86
|
+
- Allow content to be tracked across environments
|
|
87
|
+
|
|
88
|
+
**Examples:**
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# Entry identifier
|
|
92
|
+
riverbankcms entry upsert blog-post my-first-post --data '...'
|
|
93
|
+
|
|
94
|
+
# Page identifier
|
|
95
|
+
riverbankcms page upsert about --title "About Us" --path /about
|
|
96
|
+
|
|
97
|
+
# Block identifier (within a page)
|
|
98
|
+
riverbankcms block upsert about hero-section --kind block.hero --data '...'
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Backfill identifiers for legacy content:**
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
riverbankcms identifiers backfill
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Draft vs Published
|
|
110
|
+
|
|
111
|
+
All content has a publication status:
|
|
112
|
+
|
|
113
|
+
| Status | Visibility |
|
|
114
|
+
|--------|------------|
|
|
115
|
+
| Draft | Only visible in preview mode |
|
|
116
|
+
| Published | Visible on the live site |
|
|
117
|
+
|
|
118
|
+
New content is created as a draft by default.
|
|
119
|
+
|
|
120
|
+
### Checking Status
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# Check entry status
|
|
124
|
+
riverbankcms entry get blog-post my-post
|
|
125
|
+
|
|
126
|
+
# Check page status
|
|
127
|
+
riverbankcms page get about
|
|
128
|
+
|
|
129
|
+
# List with JSON to see status field
|
|
130
|
+
riverbankcms entry list blog-post --json | jq '.items[] | {identifier, status}'
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Publishing Content
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# Publish entry
|
|
137
|
+
riverbankcms entry publish blog-post my-post
|
|
138
|
+
|
|
139
|
+
# Publish page
|
|
140
|
+
riverbankcms page publish about
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Unpublishing Content
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# Unpublish entry (revert to draft)
|
|
147
|
+
riverbankcms entry unpublish blog-post my-post
|
|
148
|
+
|
|
149
|
+
# Unpublish page
|
|
150
|
+
riverbankcms page unpublish about
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Unpublished Changes
|
|
154
|
+
|
|
155
|
+
When you modify published content, it stays published but gains unpublished changes. The live site shows the last published version until you publish again.
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# Check for unpublished changes
|
|
159
|
+
riverbankcms entry get blog-post my-post --json | jq '.hasUnpublishedChanges'
|
|
160
|
+
|
|
161
|
+
# Publish to apply pending changes
|
|
162
|
+
riverbankcms entry publish blog-post my-post
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Content Sync Workflow
|
|
168
|
+
|
|
169
|
+
### Pulling Content
|
|
170
|
+
|
|
171
|
+
Downloads CMS content to local JSON files:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# Pull all content
|
|
175
|
+
riverbankcms pull
|
|
176
|
+
|
|
177
|
+
# Pull specific types
|
|
178
|
+
riverbankcms pull entries
|
|
179
|
+
riverbankcms pull entries blog-post
|
|
180
|
+
riverbankcms pull pages
|
|
181
|
+
riverbankcms pull navigation
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Output directory structure:**
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
content/
|
|
188
|
+
├── entries/
|
|
189
|
+
│ ├── blog-post.json
|
|
190
|
+
│ └── product.json
|
|
191
|
+
├── pages/
|
|
192
|
+
│ ├── home.json
|
|
193
|
+
│ └── about.json
|
|
194
|
+
└── navigation.json
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Pushing Content
|
|
198
|
+
|
|
199
|
+
Uploads local changes to the CMS:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Preview changes (recommended)
|
|
203
|
+
riverbankcms push --dry-run
|
|
204
|
+
|
|
205
|
+
# Apply changes
|
|
206
|
+
riverbankcms push
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Sync Configuration
|
|
210
|
+
|
|
211
|
+
Configure sync behavior in `riverbank.config.ts`:
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
export default defineConfig({
|
|
215
|
+
siteId: '...',
|
|
216
|
+
sync: {
|
|
217
|
+
// How to handle existing entries during push
|
|
218
|
+
existingEntries: 'update', // 'skip' (default) or 'update'
|
|
219
|
+
|
|
220
|
+
// Target state for pushed content
|
|
221
|
+
contentTarget: 'draft', // 'draft' (default) or 'publish'
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
| Option | Values | Description |
|
|
227
|
+
|--------|--------|-------------|
|
|
228
|
+
| `existingEntries` | `skip`, `update` | Whether to update entries that already exist |
|
|
229
|
+
| `contentTarget` | `draft`, `publish` | Whether pushed content should be draft or published |
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Local Content Files
|
|
234
|
+
|
|
235
|
+
### Entry File Format
|
|
236
|
+
|
|
237
|
+
`content/entries/blog-post.json`:
|
|
238
|
+
|
|
239
|
+
```json
|
|
240
|
+
[
|
|
241
|
+
{
|
|
242
|
+
"identifier": "my-first-post",
|
|
243
|
+
"slug": "my-first-post",
|
|
244
|
+
"data": {
|
|
245
|
+
"title": "My First Post",
|
|
246
|
+
"content": "<p>Hello world!</p>",
|
|
247
|
+
"publishedAt": "2024-01-15"
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"identifier": "another-post",
|
|
252
|
+
"slug": "another-post",
|
|
253
|
+
"data": {
|
|
254
|
+
"title": "Another Post",
|
|
255
|
+
"content": "<p>More content...</p>"
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
]
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Page File Format
|
|
262
|
+
|
|
263
|
+
`content/pages/home.json`:
|
|
264
|
+
|
|
265
|
+
```json
|
|
266
|
+
{
|
|
267
|
+
"identifier": "home",
|
|
268
|
+
"title": "Home",
|
|
269
|
+
"path": "/",
|
|
270
|
+
"seo": {
|
|
271
|
+
"title": "Welcome | My Site",
|
|
272
|
+
"description": "The home page"
|
|
273
|
+
},
|
|
274
|
+
"blocks": [
|
|
275
|
+
{
|
|
276
|
+
"identifier": "hero-main",
|
|
277
|
+
"kind": "block.hero",
|
|
278
|
+
"content": {
|
|
279
|
+
"heading": "Welcome to My Site",
|
|
280
|
+
"subheading": "We build great things"
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"identifier": "intro-text",
|
|
285
|
+
"kind": "block.bodyText",
|
|
286
|
+
"content": {
|
|
287
|
+
"content": "<p>Introduction text here...</p>"
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
]
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Navigation File Format
|
|
295
|
+
|
|
296
|
+
`content/navigation.json`:
|
|
297
|
+
|
|
298
|
+
```json
|
|
299
|
+
{
|
|
300
|
+
"main": [
|
|
301
|
+
{ "label": "Home", "url": "/" },
|
|
302
|
+
{ "label": "About", "url": "/about" },
|
|
303
|
+
{
|
|
304
|
+
"label": "Products",
|
|
305
|
+
"url": "/products",
|
|
306
|
+
"children": [
|
|
307
|
+
{ "label": "Category A", "url": "/products/a" },
|
|
308
|
+
{ "label": "Category B", "url": "/products/b" }
|
|
309
|
+
]
|
|
310
|
+
}
|
|
311
|
+
],
|
|
312
|
+
"footer": [
|
|
313
|
+
{ "label": "Privacy", "url": "/privacy" },
|
|
314
|
+
{ "label": "Terms", "url": "/terms" }
|
|
315
|
+
]
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## Configuration Reference
|
|
322
|
+
|
|
323
|
+
### riverbank.config.ts
|
|
324
|
+
|
|
325
|
+
Main SDK configuration:
|
|
326
|
+
|
|
327
|
+
```typescript
|
|
328
|
+
import { defineConfig } from '@riverbankcms/sdk';
|
|
329
|
+
|
|
330
|
+
export default defineConfig({
|
|
331
|
+
// Required: Your site ID
|
|
332
|
+
siteId: 'your-site-id',
|
|
333
|
+
|
|
334
|
+
// Custom blocks (see schema.md)
|
|
335
|
+
customBlocks: [...],
|
|
336
|
+
|
|
337
|
+
// Extend built-in blocks with new fields
|
|
338
|
+
blockFieldExtensions: {...},
|
|
339
|
+
|
|
340
|
+
// Override select field options
|
|
341
|
+
blockFieldOptions: {...},
|
|
342
|
+
|
|
343
|
+
// Content scaffolding
|
|
344
|
+
content: {
|
|
345
|
+
contentTypes: [...],
|
|
346
|
+
pages: [...],
|
|
347
|
+
entries: {...},
|
|
348
|
+
navigation: {...},
|
|
349
|
+
},
|
|
350
|
+
|
|
351
|
+
// Sync settings
|
|
352
|
+
sync: {
|
|
353
|
+
existingEntries: 'update',
|
|
354
|
+
contentTarget: 'draft',
|
|
355
|
+
},
|
|
356
|
+
});
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### Environment Variables
|
|
360
|
+
|
|
361
|
+
Local development (default):
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
RIVERBANK_LOCAL_SITE_ID=your-site-id
|
|
365
|
+
RIVERBANK_LOCAL_DASHBOARD_URL=http://localhost:4000
|
|
366
|
+
RIVERBANK_LOCAL_MGMT_API_KEY=bld_mgmt_sk_...
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Production (`--remote` flag):
|
|
370
|
+
|
|
371
|
+
```bash
|
|
372
|
+
RIVERBANK_REMOTE_SITE_ID=your-site-id
|
|
373
|
+
RIVERBANK_REMOTE_DASHBOARD_URL=https://your-dashboard.riverbankcms.com
|
|
374
|
+
RIVERBANK_REMOTE_MGMT_API_KEY=bld_mgmt_sk_...
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## Related Documentation
|
|
380
|
+
|
|
381
|
+
- `cli-reference.md` - Full CLI command reference
|
|
382
|
+
- `schema.md` - This site's content types and custom blocks
|
|
383
|
+
- `block-types.md` - Available block types
|
|
384
|
+
- `workflows/` - Step-by-step guides for common tasks
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Brand Assets
|
|
2
|
+
|
|
3
|
+
This document helps AI agents understand the visual brand identity for consistent content creation.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Document brand assets and guidelines including:
|
|
8
|
+
|
|
9
|
+
- Logo usage and variations
|
|
10
|
+
- Color palette
|
|
11
|
+
- Typography
|
|
12
|
+
- Image and illustration style
|
|
13
|
+
- Design patterns
|
|
14
|
+
|
|
15
|
+
## Color Palette
|
|
16
|
+
|
|
17
|
+
Define the brand colors:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Primary: #______ (e.g., #0066CC - main brand color)
|
|
21
|
+
Secondary: #______ (e.g., #00CC66 - accent color)
|
|
22
|
+
Accent: #______ (e.g., #CC6600 - highlight color)
|
|
23
|
+
|
|
24
|
+
Neutrals:
|
|
25
|
+
- Dark: #______ (e.g., #1A1A1A - headings, body text)
|
|
26
|
+
- Medium: #______ (e.g., #666666 - secondary text)
|
|
27
|
+
- Light: #______ (e.g., #F5F5F5 - backgrounds)
|
|
28
|
+
- White: #FFFFFF
|
|
29
|
+
|
|
30
|
+
Status:
|
|
31
|
+
- Success: #______ (e.g., #22C55E)
|
|
32
|
+
- Warning: #______ (e.g., #F59E0B)
|
|
33
|
+
- Error: #______ (e.g., #EF4444)
|
|
34
|
+
- Info: #______ (e.g., #3B82F6)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Typography
|
|
38
|
+
|
|
39
|
+
Define the font families:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
Headings: [Font Name], [weight] (e.g., Inter, bold)
|
|
43
|
+
Body: [Font Name], [weight] (e.g., Inter, regular)
|
|
44
|
+
Code: [Font Name] (e.g., JetBrains Mono)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Heading sizes:**
|
|
48
|
+
- H1: (e.g., 48px / 3rem)
|
|
49
|
+
- H2: (e.g., 36px / 2.25rem)
|
|
50
|
+
- H3: (e.g., 24px / 1.5rem)
|
|
51
|
+
- H4: (e.g., 20px / 1.25rem)
|
|
52
|
+
|
|
53
|
+
**Body text:** (e.g., 16px / 1rem, line-height 1.6)
|
|
54
|
+
|
|
55
|
+
## Logo Files
|
|
56
|
+
|
|
57
|
+
Reference paths to logo files:
|
|
58
|
+
|
|
59
|
+
| Variant | Path | Usage |
|
|
60
|
+
|---------|------|-------|
|
|
61
|
+
| Primary | `/public/logo.svg` | Main logo for light backgrounds |
|
|
62
|
+
| Dark mode | `/public/logo-dark.svg` | For dark backgrounds |
|
|
63
|
+
| Icon only | `/public/logo-icon.svg` | Favicon, small spaces |
|
|
64
|
+
| Full width | `/public/logo-full.svg` | Header, large displays |
|
|
65
|
+
|
|
66
|
+
**Logo usage guidelines:**
|
|
67
|
+
- Minimum clear space: (e.g., equal to the height of the logomark)
|
|
68
|
+
- Minimum size: (e.g., 100px width for full logo, 24px for icon)
|
|
69
|
+
- Don't stretch, rotate, or alter colors
|
|
70
|
+
|
|
71
|
+
## Image Style
|
|
72
|
+
|
|
73
|
+
Guidelines for imagery:
|
|
74
|
+
|
|
75
|
+
**Photography:**
|
|
76
|
+
- Style: (e.g., bright and modern, lifestyle-focused, professional)
|
|
77
|
+
- Subjects: (e.g., people using products, workspace shots, abstract)
|
|
78
|
+
- Avoid: (e.g., stock photo cliches, outdated imagery)
|
|
79
|
+
|
|
80
|
+
**Illustrations:**
|
|
81
|
+
- Style: (e.g., flat design, 3D, hand-drawn, geometric)
|
|
82
|
+
- Color usage: (e.g., use brand colors only, limited palette)
|
|
83
|
+
|
|
84
|
+
**Aspect ratios:**
|
|
85
|
+
- Hero images: (e.g., 16:9, 1920x1080 minimum)
|
|
86
|
+
- Blog thumbnails: (e.g., 3:2, 1200x800)
|
|
87
|
+
- Social sharing: (e.g., 1.91:1 for Open Graph)
|
|
88
|
+
|
|
89
|
+
## Icons
|
|
90
|
+
|
|
91
|
+
Icon style and sources:
|
|
92
|
+
|
|
93
|
+
- **Icon set**: (e.g., Lucide, Heroicons, custom)
|
|
94
|
+
- **Style**: (e.g., outline, solid, duotone)
|
|
95
|
+
- **Size**: (e.g., 24px default, 16px small, 32px large)
|
|
96
|
+
- **Color**: (e.g., inherit from text, or specific brand color)
|
|
97
|
+
|
|
98
|
+
## Example Completed Section
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
## Color Palette
|
|
102
|
+
|
|
103
|
+
Primary: #2563EB (Blue - main brand color)
|
|
104
|
+
Secondary: #10B981 (Green - success states, CTAs)
|
|
105
|
+
Accent: #8B5CF6 (Purple - highlights)
|
|
106
|
+
|
|
107
|
+
Neutrals:
|
|
108
|
+
- Dark: #111827 (Gray 900 - headings)
|
|
109
|
+
- Medium: #6B7280 (Gray 500 - body text)
|
|
110
|
+
- Light: #F9FAFB (Gray 50 - backgrounds)
|
|
111
|
+
- White: #FFFFFF
|
|
112
|
+
|
|
113
|
+
## Typography
|
|
114
|
+
|
|
115
|
+
Headings: Inter, semibold (600)
|
|
116
|
+
Body: Inter, regular (400)
|
|
117
|
+
Code: Fira Code, regular
|
|
118
|
+
|
|
119
|
+
## Image Style
|
|
120
|
+
|
|
121
|
+
Photography: Clean, bright, professional. Real people in real workspaces.
|
|
122
|
+
Illustrations: Flat design with brand colors. Simple, modern, friendly.
|
|
123
|
+
|
|
124
|
+
Avoid: Dark/moody imagery, overly complex graphics, generic stock photos.
|
|
125
|
+
```
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Site Brief
|
|
2
|
+
|
|
3
|
+
This document helps AI agents understand the brand, tone, and goals for this site. Fill in the sections below to provide context for content creation.
|
|
4
|
+
|
|
5
|
+
## Brand Voice
|
|
6
|
+
|
|
7
|
+
Describe how the brand communicates:
|
|
8
|
+
|
|
9
|
+
- **Tone**: (e.g., professional, friendly, technical, casual, authoritative)
|
|
10
|
+
- **Personality**: (e.g., helpful, innovative, trustworthy, playful)
|
|
11
|
+
- **Language style**: (e.g., simple and direct, detailed and thorough, conversational)
|
|
12
|
+
|
|
13
|
+
**Words/phrases to use:**
|
|
14
|
+
- (Add brand-appropriate terminology)
|
|
15
|
+
|
|
16
|
+
**Words/phrases to avoid:**
|
|
17
|
+
- (Add terms that don't fit the brand)
|
|
18
|
+
|
|
19
|
+
## Target Audience
|
|
20
|
+
|
|
21
|
+
Who is this site for?
|
|
22
|
+
|
|
23
|
+
- **Primary audience**: (e.g., small business owners, developers, enterprise teams)
|
|
24
|
+
- **Secondary audience**: (if applicable)
|
|
25
|
+
- **Technical level**: (e.g., beginner, intermediate, expert)
|
|
26
|
+
- **Key pain points**: (what problems are they trying to solve?)
|
|
27
|
+
|
|
28
|
+
## Site Purpose
|
|
29
|
+
|
|
30
|
+
What is this site meant to achieve?
|
|
31
|
+
|
|
32
|
+
- **Primary goal**: (e.g., generate leads, sell products, provide information)
|
|
33
|
+
- **Secondary goals**: (e.g., build brand awareness, support customers)
|
|
34
|
+
- **Key user journeys**: (what should visitors do on the site?)
|
|
35
|
+
|
|
36
|
+
## Content Guidelines
|
|
37
|
+
|
|
38
|
+
Standards for content creation:
|
|
39
|
+
|
|
40
|
+
- **Preferred content length**: (e.g., blog posts 800-1200 words)
|
|
41
|
+
- **Heading style**: (e.g., sentence case, title case)
|
|
42
|
+
- **Image requirements**: (e.g., minimum resolution, preferred aspect ratios)
|
|
43
|
+
- **SEO focus areas**: (key topics or keywords)
|
|
44
|
+
|
|
45
|
+
## Example
|
|
46
|
+
|
|
47
|
+
```markdown
|
|
48
|
+
## Brand Voice
|
|
49
|
+
|
|
50
|
+
- **Tone**: Professional but approachable
|
|
51
|
+
- **Personality**: Helpful, knowledgeable, straightforward
|
|
52
|
+
- **Language style**: Clear and concise, avoid jargon unless necessary
|
|
53
|
+
|
|
54
|
+
**Words to use:** streamline, efficient, simple, powerful, reliable
|
|
55
|
+
**Words to avoid:** synergy, leverage, disrupt, revolutionary
|
|
56
|
+
|
|
57
|
+
## Target Audience
|
|
58
|
+
|
|
59
|
+
- **Primary**: Small to medium business owners looking for a CMS
|
|
60
|
+
- **Technical level**: Intermediate - comfortable with technology but not developers
|
|
61
|
+
- **Pain points**: Current CMS is too complex, need better content management
|
|
62
|
+
|
|
63
|
+
## Site Purpose
|
|
64
|
+
|
|
65
|
+
- **Primary goal**: Convert visitors to trial signups
|
|
66
|
+
- **Key journeys**:
|
|
67
|
+
1. Learn about features → Start free trial
|
|
68
|
+
2. Read case studies → Request demo
|
|
69
|
+
3. Check pricing → Choose plan
|
|
70
|
+
|
|
71
|
+
## Content Guidelines
|
|
72
|
+
|
|
73
|
+
- Blog posts: 1000-1500 words
|
|
74
|
+
- All headings in sentence case
|
|
75
|
+
- Include at least one image per blog post
|
|
76
|
+
- Focus on "headless CMS" and "content management" keywords
|
|
77
|
+
```
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Knowledge Base
|
|
2
|
+
|
|
3
|
+
This directory stores domain knowledge, reference information, and facts that AI agents need when working with this site's content.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Help agents understand:
|
|
8
|
+
|
|
9
|
+
- Industry terminology and definitions
|
|
10
|
+
- Product or service details
|
|
11
|
+
- Technical specifications
|
|
12
|
+
- Frequently asked questions
|
|
13
|
+
- Reference data and statistics
|
|
14
|
+
|
|
15
|
+
## Suggested Organization
|
|
16
|
+
|
|
17
|
+
Create files for different knowledge areas:
|
|
18
|
+
|
|
19
|
+
| File | Purpose |
|
|
20
|
+
|------|---------|
|
|
21
|
+
| `products.md` | Product catalog, features, specifications |
|
|
22
|
+
| `services.md` | Service offerings and descriptions |
|
|
23
|
+
| `faq.md` | Common questions and answers |
|
|
24
|
+
| `glossary.md` | Industry terms and definitions |
|
|
25
|
+
| `competitors.md` | Competitive landscape and differentiation |
|
|
26
|
+
| `stats.md` | Key statistics and data points |
|
|
27
|
+
|
|
28
|
+
## Example File Format
|
|
29
|
+
|
|
30
|
+
### products.md
|
|
31
|
+
|
|
32
|
+
```markdown
|
|
33
|
+
# Products
|
|
34
|
+
|
|
35
|
+
## Product: Widget Pro
|
|
36
|
+
|
|
37
|
+
- **SKU**: WP-001
|
|
38
|
+
- **Category**: Automation Tools
|
|
39
|
+
- **Price**: $99/month
|
|
40
|
+
- **Target customer**: Small business teams
|
|
41
|
+
|
|
42
|
+
### Key Features
|
|
43
|
+
- Feature A: Description of what it does
|
|
44
|
+
- Feature B: Description of what it does
|
|
45
|
+
- Feature C: Description of what it does
|
|
46
|
+
|
|
47
|
+
### Use Cases
|
|
48
|
+
- Scenario 1: How customers use this
|
|
49
|
+
- Scenario 2: Another common use case
|
|
50
|
+
|
|
51
|
+
### Comparison to Widget Basic
|
|
52
|
+
- Pro has X, Basic doesn't
|
|
53
|
+
- Pro supports Y users, Basic supports Z
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### glossary.md
|
|
57
|
+
|
|
58
|
+
```markdown
|
|
59
|
+
# Glossary
|
|
60
|
+
|
|
61
|
+
## A
|
|
62
|
+
|
|
63
|
+
**API (Application Programming Interface)**
|
|
64
|
+
A set of protocols that allows different software applications to communicate.
|
|
65
|
+
|
|
66
|
+
**Authentication**
|
|
67
|
+
The process of verifying user identity before granting access.
|
|
68
|
+
|
|
69
|
+
## B
|
|
70
|
+
|
|
71
|
+
**Block**
|
|
72
|
+
A modular content component in RiverbankCMS (e.g., hero, text, image).
|
|
73
|
+
|
|
74
|
+
## C
|
|
75
|
+
|
|
76
|
+
**CMS (Content Management System)**
|
|
77
|
+
Software for creating, managing, and publishing digital content.
|
|
78
|
+
|
|
79
|
+
**Content Type**
|
|
80
|
+
A defined structure for a category of content (e.g., blog posts, products).
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### faq.md
|
|
84
|
+
|
|
85
|
+
```markdown
|
|
86
|
+
# Frequently Asked Questions
|
|
87
|
+
|
|
88
|
+
## General
|
|
89
|
+
|
|
90
|
+
**Q: What is [Product Name]?**
|
|
91
|
+
A: [Product Name] is a [brief description]. It helps [target audience] to [main benefit].
|
|
92
|
+
|
|
93
|
+
**Q: How much does it cost?**
|
|
94
|
+
A: Pricing starts at $X/month. See our pricing page for full details.
|
|
95
|
+
|
|
96
|
+
## Technical
|
|
97
|
+
|
|
98
|
+
**Q: What integrations are available?**
|
|
99
|
+
A: We integrate with [List of integrations]. Custom integrations are available via our API.
|
|
100
|
+
|
|
101
|
+
**Q: Is there a free trial?**
|
|
102
|
+
A: Yes, we offer a 14-day free trial with full access to all features.
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Best Practices
|
|
106
|
+
|
|
107
|
+
- Keep information factual and up-to-date
|
|
108
|
+
- Use consistent formatting across files
|
|
109
|
+
- Include dates when information might become outdated
|
|
110
|
+
- Cross-reference related topics
|
|
111
|
+
- Update when products, services, or facts change
|