cabloy 5.1.59 → 5.1.60
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/.claude/skills/cabloy-contract-loop/SKILL.md +16 -0
- package/.claude/skills/cabloy-contract-loop/references/contract-loop-map.md +26 -0
- package/.claude/skills/cabloy-contract-loop/references/resource-custom-state-pattern.md +144 -0
- package/.claude/skills/cabloy-contract-loop/references/verification-checklist.md +18 -0
- package/.claude/skills/cabloy-resource-field-update/SKILL.md +267 -0
- package/.claude/skills/cabloy-resource-field-update/evals/evals.json +53 -0
- package/.claude/skills/cabloy-resource-field-update/references/custom-renderer-demo-checklist.md +102 -0
- package/.claude/skills/cabloy-resource-field-update/references/field-update-decision-tree.md +120 -0
- package/.claude/skills/cabloy-resource-field-update/references/follow-up-checklist.md +80 -0
- package/.claude/skills/cabloy-resource-field-update/references/verification-checklist.md +97 -0
- package/.github/workflows/docs-pages.yml +2 -0
- package/.github/workflows/vona-cov-pg.yml +2 -0
- package/.github/workflows/vona-test-crud.yml +4 -2
- package/.github/workflows/vona-test-mysql.yml +2 -0
- package/.github/workflows/vona-test-pg.yml +2 -0
- package/.github/workflows/vona-test-sqlite3.yml +2 -0
- package/.github/workflows/vona-tsc.yml +2 -0
- package/.github/workflows/zova-ui.yml +2 -0
- package/.gitignore +0 -4
- package/CHANGELOG.md +30 -0
- package/CLAUDE.md +2 -0
- package/README.md +15 -0
- package/cabloy-docs/.vitepress/config.mjs +43 -0
- package/cabloy-docs/ai/class-placement-rule.md +2 -0
- package/cabloy-docs/ai/cli-to-skill-map.md +7 -0
- package/cabloy-docs/ai/future-skill-roadmap.md +17 -2
- package/cabloy-docs/backend/bean-scene-authoring.md +350 -0
- package/cabloy-docs/backend/cli.md +26 -1
- package/cabloy-docs/backend/foundation.md +28 -3
- package/cabloy-docs/backend/introduction.md +8 -0
- package/cabloy-docs/backend/service-guide.md +2 -0
- package/cabloy-docs/backend/websocket-call-flow.md +435 -0
- package/cabloy-docs/backend/websocket-guide.md +455 -0
- package/cabloy-docs/backend/websocket-protocol-guide.md +381 -0
- package/cabloy-docs/backend/websocket-usage-guide.md +356 -0
- package/cabloy-docs/frontend/bean-scene-authoring.md +372 -0
- package/cabloy-docs/frontend/behavior-guide.md +449 -0
- package/cabloy-docs/frontend/cli.md +12 -0
- package/cabloy-docs/frontend/introduction.md +5 -0
- package/cabloy-docs/frontend/ioc-and-beans.md +10 -9
- package/cabloy-docs/frontend/router-tabs-admin-web-comparison.md +206 -0
- package/cabloy-docs/frontend/router-tabs-introduction.md +106 -0
- package/cabloy-docs/frontend/router-tabs-mechanism.md +469 -0
- package/cabloy-docs/frontend/router-tabs-overview.md +227 -0
- package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +343 -0
- package/cabloy-docs/frontend/ssr-architecture-overview.md +211 -0
- package/cabloy-docs/frontend/ssr-build-deploy-guide.md +308 -0
- package/cabloy-docs/frontend/ssr-review-checklist.md +184 -0
- package/cabloy-docs/frontend/ssr-troubleshooting-guide.md +301 -0
- package/cabloy-docs/fullstack/framework-performance.md +3 -3
- package/cabloy-docs/fullstack/introduction.md +29 -0
- package/cabloy-docs/fullstack/quickstart.md +7 -1
- package/cabloy-docs/fullstack/tutorial-1-first-module.md +111 -0
- package/cabloy-docs/fullstack/tutorial-2-first-crud.md +122 -0
- package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +131 -0
- package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +119 -0
- package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +144 -0
- package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +168 -0
- package/cabloy-docs/fullstack/tutorials-overview.md +179 -0
- package/cabloy-docs/index.md +4 -3
- package/cabloy-docs/reference/bean-scene-boilerplates.md +73 -0
- package/cabloy-docs/reference/cli-reference.md +2 -0
- package/package.json +6 -2
- package/scripts/init.ts +18 -2
- package/vona/packages-cli/cabloy-cli/package.json +2 -2
- package/vona/packages-cli/cli/package.json +1 -1
- package/vona/packages-cli/cli-set-api/package.json +1 -1
- package/vona/packages-cli/cli-set-api/src/lib/bean/cli.create.module.ts +4 -0
- package/vona/packages-vona/vona/package.json +1 -1
- package/vona/pnpm-lock.yaml +133 -1088
- package/vona/pnpm-workspace.yaml +0 -1
- package/vona/src/suite-vendor/a-vona/modules/a-core/assets/static/img/vona.svg +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/bean.permission.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-upload/package.json +2 -2
- package/vona/src/suite-vendor/a-vona/package.json +1 -1
- package/zova/package.original.json +1 -1
- package/zova/packages-cli/cli/package.json +3 -3
- package/zova/packages-cli/cli-set-front/cli/templates/init/icon/boilerplate/icons/default/zova.svg +1 -1
- package/zova/packages-cli/cli-set-front/package.json +3 -3
- package/zova/packages-cli/cli-set-front/src/lib/bean/cli.create.module.ts +4 -0
- package/zova/packages-cli/cli-set-front/src/lib/command/create.bean.ts +5 -1
- package/zova/packages-utils/zova-vite/package.json +2 -2
- package/zova/packages-zova/zova/package.json +2 -2
- package/zova/pnpm-lock.yaml +284 -1313
- package/zova/pnpm-workspace.yaml +0 -1
- package/zova/src/suite/a-home/modules/home-icon/icons/social/cabloy.svg +1 -1
- package/zova/src/suite/a-home/modules/home-icon/icons/social/vona.svg +1 -1
- package/zova/src/suite/a-home/modules/home-icon/icons/social/zova.svg +1 -1
- package/zova/src/suite/a-home/modules/home-icon/src/.metadata/icons/groups/social.svg +3 -3
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +9 -0
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/package.json +1 -1
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts +66 -16
- package/zova/src/suite-vendor/a-cabloy/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/modules/a-routertabs/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-routertabs/src/model/tabs.ts +60 -18
- package/zova/src/suite-vendor/a-zova/modules/a-table/cli/tableActionRow/boilerplate/{{sceneName}}.{{beanName}}.tsx_ +6 -1
- package/zova/src/suite-vendor/a-zova/modules/a-table/cli/tableCell/boilerplate/{{sceneName}}.{{beanName}}.tsx_ +6 -1
- package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/package.json +4 -4
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# SSR Troubleshooting Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how to debug common SSR problems in Zova within the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## Why this page exists
|
|
6
|
+
|
|
7
|
+
The other SSR pages explain how the SSR model is supposed to work.
|
|
8
|
+
|
|
9
|
+
This page answers a different question:
|
|
10
|
+
|
|
11
|
+
- when SSR behavior is wrong, where should you look first?
|
|
12
|
+
|
|
13
|
+
That matters because SSR issues are easy to misclassify.
|
|
14
|
+
|
|
15
|
+
A symptom that looks like “frontend rendering is broken” can actually come from:
|
|
16
|
+
|
|
17
|
+
- SSR site routing on the backend side
|
|
18
|
+
- a missing or stale frontend bundle
|
|
19
|
+
- SSR-only route or data-loading behavior
|
|
20
|
+
- hydration mismatch on the client
|
|
21
|
+
- edition-specific theme assumptions
|
|
22
|
+
|
|
23
|
+
A good troubleshooting flow starts by identifying **which layer is failing** before trying to patch the symptom directly.
|
|
24
|
+
|
|
25
|
+
## Start with the four-layer model
|
|
26
|
+
|
|
27
|
+
Use the [SSR Architecture Overview](/frontend/ssr-architecture-overview) as the first mental model.
|
|
28
|
+
|
|
29
|
+
For troubleshooting, the practical layer split is:
|
|
30
|
+
|
|
31
|
+
1. **Vona SSR orchestration**
|
|
32
|
+
- request entry
|
|
33
|
+
- SSR site matching
|
|
34
|
+
- dev proxy versus built asset versus SSR render
|
|
35
|
+
2. **frontend build output**
|
|
36
|
+
- SSR entry
|
|
37
|
+
- manifest
|
|
38
|
+
- client assets
|
|
39
|
+
3. **Zova SSR server render**
|
|
40
|
+
- route resolution
|
|
41
|
+
- HTML render
|
|
42
|
+
- state/meta/preload generation
|
|
43
|
+
4. **client hydration**
|
|
44
|
+
- initial state reuse
|
|
45
|
+
- browser-only behavior
|
|
46
|
+
- final theme and DOM state
|
|
47
|
+
|
|
48
|
+
If you identify the failing layer first, most SSR debugging becomes much faster.
|
|
49
|
+
|
|
50
|
+
## Fast symptom-to-layer map
|
|
51
|
+
|
|
52
|
+
Use this quick map before diving deeper.
|
|
53
|
+
|
|
54
|
+
| Symptom | Start here |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| request does not hit the expected SSR page | Vona SSR orchestration |
|
|
57
|
+
| dev works but prod fails | frontend build output + SSR env/runtime |
|
|
58
|
+
| HTML appears but hydration is wrong | client hydration |
|
|
59
|
+
| server-rendered data is missing or refetched unexpectedly | Zova SSR server render + init data flow |
|
|
60
|
+
| SEO/meta output is missing | Zova SSR server render + meta flow |
|
|
61
|
+
| first paint theme is wrong | SSR env + theme rules |
|
|
62
|
+
| static assets 404 after SSR deploy | frontend build output |
|
|
63
|
+
|
|
64
|
+
## Symptom 1: the request does not hit the expected SSR page
|
|
65
|
+
|
|
66
|
+
Typical signs:
|
|
67
|
+
|
|
68
|
+
- a page that should be SSR-rendered falls through to another route
|
|
69
|
+
- a URL returns the wrong site
|
|
70
|
+
- SSR works for one path prefix but not another
|
|
71
|
+
|
|
72
|
+
Start with these questions:
|
|
73
|
+
|
|
74
|
+
1. is the request entering the correct SSR site at all?
|
|
75
|
+
2. is the path prefix/site selection correct?
|
|
76
|
+
3. are you expecting SSR where the route is actually a normal backend or static path?
|
|
77
|
+
|
|
78
|
+
A practical debugging order is:
|
|
79
|
+
|
|
80
|
+
- confirm the target URL and SSR site assumptions
|
|
81
|
+
- re-check the SSR architecture split in [SSR Architecture Overview](/frontend/ssr-architecture-overview)
|
|
82
|
+
- verify whether the problem is a site-entry issue rather than a page-render issue
|
|
83
|
+
|
|
84
|
+
If the request never reaches the intended SSR site, do **not** start by changing page components or hydration logic.
|
|
85
|
+
|
|
86
|
+
## Symptom 2: dev works but prod fails
|
|
87
|
+
|
|
88
|
+
Typical signs:
|
|
89
|
+
|
|
90
|
+
- SSR works through the dev server but breaks after build
|
|
91
|
+
- dev shows the page, while prod returns missing asset or render errors
|
|
92
|
+
- only built deployments show the problem
|
|
93
|
+
|
|
94
|
+
This usually means the issue is not only “SSR logic.”
|
|
95
|
+
|
|
96
|
+
It often means one of these instead:
|
|
97
|
+
|
|
98
|
+
- build output is stale or incomplete
|
|
99
|
+
- the expected frontend bundle was not generated for the target flavor
|
|
100
|
+
- SSR env/runtime assumptions differ between dev and prod
|
|
101
|
+
- asset paths or manifest assumptions are wrong after build
|
|
102
|
+
|
|
103
|
+
Start with these checks:
|
|
104
|
+
|
|
105
|
+
1. was the relevant frontend SSR build actually regenerated?
|
|
106
|
+
2. are you targeting the correct flavor for the active edition?
|
|
107
|
+
3. does the issue happen before page render, during page render, or only after hydration?
|
|
108
|
+
|
|
109
|
+
Read together:
|
|
110
|
+
|
|
111
|
+
- [SSR Architecture Overview](/frontend/ssr-architecture-overview)
|
|
112
|
+
- [SSR Environment Variables](/frontend/ssr-env)
|
|
113
|
+
- [Fullstack Vona + Zova Integration](/fullstack/vona-zova-integration)
|
|
114
|
+
|
|
115
|
+
## Symptom 3: HTML appears, but hydration is wrong
|
|
116
|
+
|
|
117
|
+
Typical signs:
|
|
118
|
+
|
|
119
|
+
- server HTML looks right at first, then changes unexpectedly on the client
|
|
120
|
+
- hydration mismatch warnings appear
|
|
121
|
+
- browser-only UI behaves differently from the server output
|
|
122
|
+
- the first screen “flashes” into a different state after load
|
|
123
|
+
|
|
124
|
+
This usually means the server render and the browser’s final state are not using exactly the same assumptions.
|
|
125
|
+
|
|
126
|
+
Common causes include:
|
|
127
|
+
|
|
128
|
+
- browser-only logic running too early
|
|
129
|
+
- client-only components not being isolated properly
|
|
130
|
+
- theme-sensitive output being treated as authoritative on the server when it is not
|
|
131
|
+
- state that was expected to transfer through SSR not being reused correctly during hydration
|
|
132
|
+
|
|
133
|
+
Start with these checks:
|
|
134
|
+
|
|
135
|
+
1. does this UI depend on browser APIs or client-only rendering behavior?
|
|
136
|
+
2. should part of the UI be wrapped in `ClientOnly`?
|
|
137
|
+
3. is the code assuming the server already knows the browser’s final theme?
|
|
138
|
+
4. is the client reusing server-provided state, or recomputing a different result?
|
|
139
|
+
|
|
140
|
+
Read together:
|
|
141
|
+
|
|
142
|
+
- [SSR ClientOnly](/frontend/ssr-client-only)
|
|
143
|
+
- [SSR Init Data](/frontend/ssr-init-data)
|
|
144
|
+
- [SSR Environment Variables](/frontend/ssr-env)
|
|
145
|
+
- [Theme Guide](/frontend/theme-guide)
|
|
146
|
+
|
|
147
|
+
## Symptom 4: server-rendered data is missing or is fetched again unexpectedly
|
|
148
|
+
|
|
149
|
+
Typical signs:
|
|
150
|
+
|
|
151
|
+
- the page renders without expected data on the server
|
|
152
|
+
- the client repeats the first data fetch that should have been prepared already
|
|
153
|
+
- loading behavior is different between SSR and client navigation
|
|
154
|
+
|
|
155
|
+
A better default in Zova is:
|
|
156
|
+
|
|
157
|
+
- prepare SSR data through the intended model/controller flow
|
|
158
|
+
- let hydration reuse that prepared state on the client
|
|
159
|
+
|
|
160
|
+
Start with these checks:
|
|
161
|
+
|
|
162
|
+
1. is the data prepared in the intended SSR lifecycle rather than in an ad hoc client path?
|
|
163
|
+
2. is the data-loading logic aligned with the model-based SSR flow?
|
|
164
|
+
3. are you accidentally bypassing the existing hydration reuse path?
|
|
165
|
+
|
|
166
|
+
Read together:
|
|
167
|
+
|
|
168
|
+
- [SSR Init Data](/frontend/ssr-init-data)
|
|
169
|
+
- [Server Data](/frontend/server-data)
|
|
170
|
+
- [Model State Guide](/frontend/model-state-guide)
|
|
171
|
+
|
|
172
|
+
## Symptom 5: SEO/meta output is missing or inconsistent
|
|
173
|
+
|
|
174
|
+
Typical signs:
|
|
175
|
+
|
|
176
|
+
- page title is wrong after SSR
|
|
177
|
+
- expected meta tags are missing in server-rendered HTML
|
|
178
|
+
- metadata looks correct on the client but not in the initial server response
|
|
179
|
+
|
|
180
|
+
This usually means the metadata is not being produced through the intended SSR-aware path.
|
|
181
|
+
|
|
182
|
+
Start with these checks:
|
|
183
|
+
|
|
184
|
+
1. are you using `$useMeta` instead of a parallel custom mechanism?
|
|
185
|
+
2. is the metadata available during SSR rather than only after client boot?
|
|
186
|
+
3. are multiple metadata layers overwriting each other intentionally or accidentally?
|
|
187
|
+
|
|
188
|
+
Read together:
|
|
189
|
+
|
|
190
|
+
- [SSR SEO Meta](/frontend/ssr-seo-meta)
|
|
191
|
+
- [SSR Architecture Overview](/frontend/ssr-architecture-overview)
|
|
192
|
+
|
|
193
|
+
## Symptom 6: theme or dark-mode behavior is wrong on first paint
|
|
194
|
+
|
|
195
|
+
Typical signs:
|
|
196
|
+
|
|
197
|
+
- server output uses one theme, then the browser switches to another immediately
|
|
198
|
+
- dark/light SSR output looks unstable
|
|
199
|
+
- the result differs between Web SSR and Admin SSR
|
|
200
|
+
|
|
201
|
+
This area is especially sensitive because SSR theme authority is not identical in every flavor.
|
|
202
|
+
|
|
203
|
+
Start with these checks:
|
|
204
|
+
|
|
205
|
+
1. are you treating the server’s theme-sensitive read as final browser truth?
|
|
206
|
+
2. does the active flavor support cookie-backed SSR theme resolution?
|
|
207
|
+
3. are you applying a Basic-specific theme assumption to a different edition or adapter?
|
|
208
|
+
|
|
209
|
+
Read together:
|
|
210
|
+
|
|
211
|
+
- [SSR Environment Variables](/frontend/ssr-env)
|
|
212
|
+
- [Theme Guide](/frontend/theme-guide)
|
|
213
|
+
- [SSR Architecture Overview](/frontend/ssr-architecture-overview)
|
|
214
|
+
|
|
215
|
+
A practical rule is:
|
|
216
|
+
|
|
217
|
+
- if exact browser theme matching matters, keep the output hydration-tolerant unless the active SSR path provides a stronger server-side guarantee
|
|
218
|
+
|
|
219
|
+
## Symptom 7: static assets 404 after SSR deploy
|
|
220
|
+
|
|
221
|
+
Typical signs:
|
|
222
|
+
|
|
223
|
+
- HTML response appears, but CSS or JS assets do not load
|
|
224
|
+
- SSR page shell renders without expected styling or scripts
|
|
225
|
+
- built deployment fails while local dev works
|
|
226
|
+
|
|
227
|
+
This usually points to bundle output or deployment-path issues rather than page logic.
|
|
228
|
+
|
|
229
|
+
Start with these checks:
|
|
230
|
+
|
|
231
|
+
1. was the correct frontend build generated?
|
|
232
|
+
2. are the expected client assets present for the deployed bundle?
|
|
233
|
+
3. does the deployment path still match the built asset assumptions?
|
|
234
|
+
|
|
235
|
+
Read together:
|
|
236
|
+
|
|
237
|
+
- [Fullstack Vona + Zova Integration](/fullstack/vona-zova-integration)
|
|
238
|
+
- [Environment and Config Guide](/frontend/environment-config-guide)
|
|
239
|
+
- [SSR Architecture Overview](/frontend/ssr-architecture-overview)
|
|
240
|
+
|
|
241
|
+
## A safe debugging order
|
|
242
|
+
|
|
243
|
+
When SSR breaks and the failure is unclear, use this order.
|
|
244
|
+
|
|
245
|
+
### Step 1: identify the first broken stage
|
|
246
|
+
|
|
247
|
+
Ask:
|
|
248
|
+
|
|
249
|
+
- is the request entering the intended SSR site?
|
|
250
|
+
- is the server returning HTML at all?
|
|
251
|
+
- is the HTML already wrong before hydration?
|
|
252
|
+
- does it only go wrong after the browser starts running?
|
|
253
|
+
|
|
254
|
+
### Step 2: separate server-render problems from hydration problems
|
|
255
|
+
|
|
256
|
+
This split removes a lot of confusion.
|
|
257
|
+
|
|
258
|
+
- if the initial HTML is wrong, focus on SSR entry, route resolution, render, data, or meta
|
|
259
|
+
- if the initial HTML is right but the browser changes it incorrectly, focus on hydration, client-only boundaries, theme authority, or client state reuse
|
|
260
|
+
|
|
261
|
+
### Step 3: check edition-sensitive assumptions
|
|
262
|
+
|
|
263
|
+
Especially for theme or UI-sensitive work, confirm:
|
|
264
|
+
|
|
265
|
+
- active edition
|
|
266
|
+
- active UI layer
|
|
267
|
+
- whether the rule is shared across editions or adapter-specific
|
|
268
|
+
|
|
269
|
+
### Step 4: reuse the framework’s intended abstractions
|
|
270
|
+
|
|
271
|
+
Before adding custom fixes, ask whether the framework already provides the right surface:
|
|
272
|
+
|
|
273
|
+
- `ClientOnly` for browser-only UI
|
|
274
|
+
- model/controller SSR init flow for data preparation
|
|
275
|
+
- `$useMeta` for SEO/meta
|
|
276
|
+
- existing theme/env rules for theme-sensitive SSR behavior
|
|
277
|
+
|
|
278
|
+
## Recommended reading order for troubleshooting
|
|
279
|
+
|
|
280
|
+
Use this path when SSR behavior is wrong and you need to narrow the problem quickly:
|
|
281
|
+
|
|
282
|
+
1. this page for symptom triage
|
|
283
|
+
2. [SSR Architecture Overview](/frontend/ssr-architecture-overview)
|
|
284
|
+
3. [SSR Overview](/frontend/ssr-overview)
|
|
285
|
+
4. [SSR Init Data](/frontend/ssr-init-data)
|
|
286
|
+
5. [SSR ClientOnly](/frontend/ssr-client-only)
|
|
287
|
+
6. [SSR SEO Meta](/frontend/ssr-seo-meta)
|
|
288
|
+
7. [SSR Environment Variables](/frontend/ssr-env)
|
|
289
|
+
8. [Theme Guide](/frontend/theme-guide)
|
|
290
|
+
9. [Fullstack Vona + Zova Integration](/fullstack/vona-zova-integration)
|
|
291
|
+
|
|
292
|
+
## Implementation checks for SSR troubleshooting
|
|
293
|
+
|
|
294
|
+
Before finalizing an SSR fix, ask:
|
|
295
|
+
|
|
296
|
+
1. did I identify the failing SSR layer before changing code?
|
|
297
|
+
2. is this actually a server-render issue, or a hydration issue?
|
|
298
|
+
3. am I reusing the intended framework abstraction instead of adding a parallel workaround?
|
|
299
|
+
4. does the fix accidentally assume an edition-specific UI or theme rule is universal?
|
|
300
|
+
|
|
301
|
+
That keeps SSR debugging aligned with the Cabloy fullstack model and reduces one-off fixes that solve only the symptom.
|
|
@@ -42,17 +42,17 @@ For the current public explanation of this backend capability, see [Cache Guide]
|
|
|
42
42
|
|
|
43
43
|
This is the kind of result Cabloy is designed to support: a framework that stays operationally calm even when the system keeps running for long periods.
|
|
44
44
|
|
|
45
|
-
One internally generated project was kept running continuously for **
|
|
45
|
+
One internally generated project was kept running continuously for **2 days**. At one representative PM2 snapshot, the process looked like this:
|
|
46
46
|
|
|
47
47
|
```text
|
|
48
48
|
┌────┬─────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
|
|
49
49
|
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
|
|
50
50
|
├────┼─────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
|
|
51
|
-
│ 0 │
|
|
51
|
+
│ 0 │ cabloy_*** │ default │ N/A │ cluster │ 226947 │ 2D │ 17 │ online │ 0% │ 376.2mb │ ubuntu │ disabled │
|
|
52
52
|
└────┴─────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
For this
|
|
55
|
+
For this 2-day continuous run, the observed result was **0 memory leak**.
|
|
56
56
|
|
|
57
57
|
The value of this example is not that it is a synthetic micro-benchmark. The value is that it reflects a real long-running project process with a clear, inspectable runtime footprint.
|
|
58
58
|
|
|
@@ -62,6 +62,35 @@ Use this path when the task depends on edition boundaries, UI assumptions, or cr
|
|
|
62
62
|
|
|
63
63
|
This combination keeps backend and frontend development close enough for code sharing, workflow reuse, and AI vibe coding workflows.
|
|
64
64
|
|
|
65
|
+
## Cabloy fullstack framework principles
|
|
66
|
+
|
|
67
|
+
Cabloy’s fullstack model can be understood through two core principles.
|
|
68
|
+
|
|
69
|
+
### 1. Frontend build output participates directly in backend SSR
|
|
70
|
+
|
|
71
|
+
Zova owns the frontend application, but its build output is not treated as a completely separate artifact that the backend ignores.
|
|
72
|
+
|
|
73
|
+
In Cabloy’s fullstack flow:
|
|
74
|
+
|
|
75
|
+
- the frontend is built from Zova source
|
|
76
|
+
- the generated bundle and related SSR output are consumed by the Vona-side SSR runtime
|
|
77
|
+
- backend rendering and frontend hydration stay in one coordinated SSR path rather than two unrelated systems
|
|
78
|
+
|
|
79
|
+
In earlier standalone-repo explanations, this was often described as placing the frontend bundle into the backend for direct SSR rendering. In the current monorepo, the important principle stays the same while the workflow is cleaner: shared scripts and integrated repository structure let frontend build artifacts flow into the backend-side SSR process.
|
|
80
|
+
|
|
81
|
+
For the integration workflow and current monorepo shape, see [Vona + Zova Integration](/fullstack/vona-zova-integration) and [SSR Overview](/frontend/ssr-overview).
|
|
82
|
+
|
|
83
|
+
### 2. Type information flows in both directions
|
|
84
|
+
|
|
85
|
+
Cabloy does not treat type sharing as backend-to-frontend only. The collaboration loop is bidirectional:
|
|
86
|
+
|
|
87
|
+
- **Backend → Frontend**: Vona emits Swagger/OpenAPI contracts that Zova uses to generate frontend SDKs and related schema-aware helpers
|
|
88
|
+
- **Frontend → Backend**: Zova generates structural metadata and types such as routes, components, and icons, which can be reflected back into backend-side tooling and type hints
|
|
89
|
+
|
|
90
|
+
This two-way contract loop reduces duplicate declarations and lets backend and frontend evolve from generated source truth instead of hand-maintained memory.
|
|
91
|
+
|
|
92
|
+
For the two directions in more detail, see [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk) and [Frontend Metadata Back to Backend](/fullstack/frontend-metadata-to-backend).
|
|
93
|
+
|
|
65
94
|
## How the fullstack system stays connected
|
|
66
95
|
|
|
67
96
|
At the repository level, shared scripts, shared terminology, and CLI-first workflows keep Vona and Zova aligned as one framework system.
|
|
@@ -92,7 +92,13 @@ npm run zova :create
|
|
|
92
92
|
|
|
93
93
|
Then narrow into the specific command family you need.
|
|
94
94
|
|
|
95
|
-
## 8.
|
|
95
|
+
## 8. Next step: follow the quick start tutorials
|
|
96
|
+
|
|
97
|
+
If you want a beginner-friendly path that connects modules, CRUD, bidirectional contract sharing, and schema-driven workflows into one story, continue with:
|
|
98
|
+
|
|
99
|
+
- [Fullstack Quick Start Tutorials](/fullstack/tutorials-overview)
|
|
100
|
+
|
|
101
|
+
## 9. Shared verification commands for deeper workflow checks
|
|
96
102
|
|
|
97
103
|
If you are validating framework-aware changes or a broader workflow, use the shared project scripts before declaring a workflow correct:
|
|
98
104
|
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Tutorial 1: Create Your First Module
|
|
2
|
+
|
|
3
|
+
<Badge type="info" text="Basic" />
|
|
4
|
+
|
|
5
|
+
In this tutorial, one prompt lets AI create the first backend and frontend module skeleton for the **Student Training Center** story through a CLI-first workflow.
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
By the end of this tutorial, you will understand:
|
|
10
|
+
|
|
11
|
+
- when to use Vona and when to use Zova
|
|
12
|
+
- how to inspect the CLI before creating files
|
|
13
|
+
- how a Cabloy business capability starts as a module on both sides of the stack
|
|
14
|
+
|
|
15
|
+
## AI Prompt
|
|
16
|
+
|
|
17
|
+
Give AI a prompt like this:
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
I'm building a Student Training Center project. Please create a demo-student module for both the backend and frontend.
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Why this step matters
|
|
24
|
+
|
|
25
|
+
This is the right first step because Cabloy treats the module as the unit that owns business code, metadata, generated assets, and docs.
|
|
26
|
+
|
|
27
|
+
If AI jumps directly into CRUD, contracts, or rendering before the module boundary exists, the work loses its natural owner. This step keeps the rest of the Student Training Center story aligned from the start.
|
|
28
|
+
|
|
29
|
+
## CLI commands to inspect/use
|
|
30
|
+
|
|
31
|
+
Work from the repo root, not from `vona/` or `zova/` directly.
|
|
32
|
+
|
|
33
|
+
Inspect the CLI surface first:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm run vona :
|
|
37
|
+
npm run zova :
|
|
38
|
+
|
|
39
|
+
npm run vona :create
|
|
40
|
+
npm run zova :create
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Representative module-generation commands:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm run vona :create:module demo-student -- --suite=
|
|
47
|
+
npm run zova :create:module demo-student -- --suite=
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Usage notes:
|
|
51
|
+
|
|
52
|
+
- use `npm run vona :create:module` for the backend module boundary
|
|
53
|
+
- use `npm run zova :create:module` for the frontend module boundary
|
|
54
|
+
- use an empty `--suite=` when you want an independent module rather than a suite-owned module
|
|
55
|
+
- rerun `npm run dev` after module creation so the local workflow picks up the new modules cleanly
|
|
56
|
+
|
|
57
|
+
## Generated or affected files
|
|
58
|
+
|
|
59
|
+
After both generators run, inspect the generated module roots before editing anything else.
|
|
60
|
+
|
|
61
|
+
Typical paths in this repo are:
|
|
62
|
+
|
|
63
|
+
- backend module root: `vona/src/module/<module>/`
|
|
64
|
+
- frontend module root without suite placement: `zova/src/module/<module>/`
|
|
65
|
+
- frontend module root with suite placement: `zova/src/suite/<suite>/modules/<module>/`
|
|
66
|
+
|
|
67
|
+
In this series, the target module roots are:
|
|
68
|
+
|
|
69
|
+
- `vona/src/module/demo-student/`
|
|
70
|
+
- `zova/src/module/demo-student/`
|
|
71
|
+
|
|
72
|
+
A minimal frontend module usually starts with files like:
|
|
73
|
+
|
|
74
|
+
- `zova/src/module/demo-student/package.json`
|
|
75
|
+
- `zova/src/module/demo-student/src/index.ts`
|
|
76
|
+
- `zova/src/module/demo-student/src/.metadata/index.ts`
|
|
77
|
+
|
|
78
|
+
## What those files mean in the business thread
|
|
79
|
+
|
|
80
|
+
At this stage, the key idea is ownership, not business logic yet.
|
|
81
|
+
|
|
82
|
+
- the backend module root is where the Student resource, entity, DTOs, controller, tests, and backend metadata will live later
|
|
83
|
+
- the frontend module root is where generated OpenAPI output, model helpers, render resources, and frontend metadata will live later
|
|
84
|
+
- the frontend `.metadata` entrypoint is part of how the module exposes its local registration surface
|
|
85
|
+
|
|
86
|
+
A good beginner rule is: do not rush into editing business logic until you can explain which module roots were created and why they will own the next tutorials.
|
|
87
|
+
|
|
88
|
+
## Verification
|
|
89
|
+
|
|
90
|
+
1. make sure the local dev workflow is running:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npm run dev
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
2. confirm that both module roots now exist
|
|
97
|
+
3. inspect the generated files before editing them
|
|
98
|
+
4. confirm that the generated module roots match the target paths for this series:
|
|
99
|
+
- `vona/src/module/demo-student/`
|
|
100
|
+
- `zova/src/module/demo-student/`
|
|
101
|
+
|
|
102
|
+
## Read more
|
|
103
|
+
|
|
104
|
+
- [Fullstack CLI](/fullstack/cli)
|
|
105
|
+
- [CLI Reference](/reference/cli-reference)
|
|
106
|
+
- [Backend Quickstart](/backend/quickstart)
|
|
107
|
+
- [Frontend Quickstart](/frontend/quickstart)
|
|
108
|
+
|
|
109
|
+
## Next step
|
|
110
|
+
|
|
111
|
+
Continue to [Tutorial 2: Create Your First CRUD](/fullstack/tutorial-2-first-crud).
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Tutorial 2: Create Your First CRUD
|
|
2
|
+
|
|
3
|
+
<Badge type="info" text="Basic" />
|
|
4
|
+
|
|
5
|
+
In this tutorial, one prompt lets AI turn the new module into its first real business thread by generating a `student` CRUD workflow.
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
By the end of this tutorial, you will understand:
|
|
10
|
+
|
|
11
|
+
- why Cabloy prefers CRUD generation over hand-written boilerplate
|
|
12
|
+
- what the generated backend thread usually includes
|
|
13
|
+
- how the generated entity and DTO surface becomes the contract foundation for later tutorials
|
|
14
|
+
- why this step does not generate any frontend code, but already gives you a complete CRUD admin page through Cabloy’s existing schema-driven surface
|
|
15
|
+
|
|
16
|
+
## AI Prompt
|
|
17
|
+
|
|
18
|
+
Give AI a prompt like this:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
Please generate the first CRUD flow for the Student resource.
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Why this step matters
|
|
25
|
+
|
|
26
|
+
Once the module exists, this is the next useful step because the prompt can drive the CRUD generator instead of hand-building controller, service, model, entity, DTO, metadata, locale, and tests one by one.
|
|
27
|
+
|
|
28
|
+
That keeps the conversation focused on the generated business thread rather than on repetitive scaffolding details.
|
|
29
|
+
|
|
30
|
+
## CLI commands to inspect/use
|
|
31
|
+
|
|
32
|
+
Inspect the CRUD family first:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm run vona :tools
|
|
36
|
+
npm run vona :tools:crud --help
|
|
37
|
+
npm run vona :tools:crudBasic --help
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Generate the `student` CRUD thread:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm run vona :tools:crud student -- --module=demo-student
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Equivalent Basic-specific entrypoint:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm run vona :tools:crudBasic student -- --module=demo-student
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Usage notes:
|
|
53
|
+
|
|
54
|
+
- `:tools:crud` is the public entrypoint beginners should prefer
|
|
55
|
+
- `:tools:crudBasic` is useful when you want to inspect the Basic-specific underlying path directly
|
|
56
|
+
- after generation, verify the result from the admin UI instead of stopping at file inspection
|
|
57
|
+
|
|
58
|
+
## Generated or affected files
|
|
59
|
+
|
|
60
|
+
After generation, inspect the resulting backend thread before refining anything.
|
|
61
|
+
|
|
62
|
+
By the end of this tutorial, your `demo-student` backend thread should have a representative shape under `vona/src/module/demo-student/src/`:
|
|
63
|
+
|
|
64
|
+
- `controller/student.ts`
|
|
65
|
+
- `service/student.ts`
|
|
66
|
+
- `model/student.ts`
|
|
67
|
+
- `entity/student.tsx`
|
|
68
|
+
- `dto/studentCreate.tsx`
|
|
69
|
+
- `dto/studentUpdate.tsx`
|
|
70
|
+
- `dto/studentView.tsx`
|
|
71
|
+
- `dto/studentSelectReq.tsx`
|
|
72
|
+
- `dto/studentSelectRes.tsx`
|
|
73
|
+
- `dto/studentSelectResItem.tsx`
|
|
74
|
+
- `bean/meta.version.ts`
|
|
75
|
+
|
|
76
|
+
There is also a test anchor at:
|
|
77
|
+
|
|
78
|
+
- `vona/src/module/demo-student/test/student.test.ts`
|
|
79
|
+
|
|
80
|
+
## What those files mean in the business thread
|
|
81
|
+
|
|
82
|
+
As you inspect the generated files, pay attention to the division of responsibility:
|
|
83
|
+
|
|
84
|
+
1. `controller/student.ts` exposes the HTTP contract
|
|
85
|
+
2. `service/student.ts` owns orchestration
|
|
86
|
+
3. `model/student.ts` owns persistence behavior
|
|
87
|
+
4. `entity/student.tsx` defines the field-oriented contract surface
|
|
88
|
+
5. the DTO files define operation-specific request and response contracts
|
|
89
|
+
6. `bean/meta.version.ts` anchors the module schema/version thread
|
|
90
|
+
7. `test/student.test.ts` gives you a verification anchor for the generated backend flow
|
|
91
|
+
|
|
92
|
+
This is the backend contract thread that later tutorials will extend with `level`, `mobile`, render metadata, OpenAPI output, and row actions.
|
|
93
|
+
|
|
94
|
+
## Verification
|
|
95
|
+
|
|
96
|
+
1. make sure the local dev workflow is running:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npm run dev
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
2. open `http://localhost:7102/admin/`
|
|
103
|
+
3. enter the **Student** list page from the **Student** menu
|
|
104
|
+
4. trigger create, read, update, and delete operations from the page
|
|
105
|
+
5. inspect the generated backend files and confirm that the CRUD layers are present:
|
|
106
|
+
- `vona/src/module/demo-student/src/entity/student.tsx`
|
|
107
|
+
- `vona/src/module/demo-student/src/controller/student.ts`
|
|
108
|
+
- `vona/src/module/demo-student/src/dto/studentSelectResItem.tsx`
|
|
109
|
+
|
|
110
|
+
## Read more
|
|
111
|
+
|
|
112
|
+
- [CRUD Workflow](/backend/crud-workflow)
|
|
113
|
+
- [Controller Guide](/backend/controller-guide)
|
|
114
|
+
- [Service Guide](/backend/service-guide)
|
|
115
|
+
- [Model Guide](/backend/model-guide)
|
|
116
|
+
- [Entity Guide](/backend/entity-guide)
|
|
117
|
+
- [DTO Guide](/backend/dto-guide)
|
|
118
|
+
- [Validation Guide](/backend/validation-guide)
|
|
119
|
+
|
|
120
|
+
## Next step
|
|
121
|
+
|
|
122
|
+
Continue to [Tutorial 3: Frontend Metadata Sharing](/fullstack/tutorial-3-frontend-metadata-sharing).
|