cabloy 5.1.194 → 5.1.196
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/.cabloy-version +1 -1
- package/.github/workflows/agent-governance.yml +1 -0
- package/CHANGELOG.md +22 -0
- package/README.md +13 -24
- package/package.json +2 -1
- package/repo-agent-governance/managed-assets.json +138 -33
- package/repo-agent-governance/scripts/pack-check.mjs +17 -0
- package/repo-agent-governance/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -0
- package/repo-agent-governance/skills/cabloy-domain-planning/SKILL.md +5 -3
- package/repo-agent-governance/skills/cabloy-spec-execution/SKILL.md +13 -8
- package/repo-agent-governance/skills/cabloy-spec-execution/evals/evals.json +108 -12
- package/repo-agent-governance/skills/cabloy-spec-execution/evals/files/scenarios.json +84 -0
- package/repo-agent-governance/skills/cabloy-spec-execution/evals/protocol.md +9 -0
- package/repo-agent-governance/skills/cabloy-spec-execution/references/execution-protocol.md +21 -5
- package/repo-agent-governance/skills/cabloy-spec-execution/references/status-and-evidence.md +5 -3
- package/repo-agent-governance/skills/cabloy-spec-generation/SKILL.md +78 -168
- package/repo-agent-governance/skills/cabloy-spec-generation/evals/evals.json +165 -17
- package/repo-agent-governance/skills/cabloy-spec-generation/evals/files/scenarios.json +114 -0
- package/repo-agent-governance/skills/cabloy-spec-generation/evals/protocol.md +44 -0
- package/repo-agent-governance/skills/cabloy-spec-generation/references/canonical-spec-input.md +145 -0
- package/repo-agent-governance/skills/cabloy-spec-generation/references/repo-aware-discovery.md +55 -57
- package/repo-agent-governance/skills/cabloy-spec-generation/references/repo-specs-document-set.md +6 -4
- package/repo-agent-governance/skills/cabloy-spec-generation/references/traceability-and-status-rules.md +12 -8
- package/repo-agent-governance/tests/governance.test.mjs +10 -1
- package/repo-agent-governance/tests/spec-audit.test.mjs +255 -0
- package/repo-agent-governance/tools/spec-audit/audit.mjs +427 -0
- package/repo-agent-governance/tools/spec-charts/generate-implementation-charts.mjs +97 -408
- package/repo-agent-governance/tools/spec-charts/generate-implementation-charts.test.mjs +462 -1
- package/repo-agent-governance/tools/spec-charts/spec-parser.mjs +561 -0
- package/repo-docs/.vitepress/config.mjs +54 -29
- package/repo-docs/ai/playbook-spec-execution.md +10 -4
- package/repo-docs/ai/playbook-spec-generation.md +40 -3
- package/repo-docs/ai/skills.md +3 -3
- package/repo-docs/backend/controller-aop-guide.md +10 -0
- package/repo-docs/backend/field-indexes.md +25 -0
- package/repo-docs/blogs/cabloy-fullstack-resource-addressing/index.md +1 -1
- package/repo-docs/fullstack/contract-loop-playbook.md +1 -1
- package/repo-docs/fullstack/development-history.md +24 -0
- package/repo-docs/fullstack/introduction.md +25 -156
- package/repo-docs/fullstack/quickstart.md +1 -1
- package/repo-docs/fullstack/ssr-entry-modes.md +52 -0
- package/repo-docs/fullstack/ssr-site-and-flavor-setup.md +3 -1
- package/repo-docs/fullstack/tutorial-5-backend-contract-sharing.md +13 -7
- package/repo-docs/fullstack/tutorial-6-one-contract-four-uses.md +11 -15
- package/repo-docs/fullstack/tutorials-overview.md +2 -2
- package/repo-docs/index.md +23 -45
- package/repo-docs/public/cabloy.png +0 -0
- package/repo-docs/public/cabloy.svg +3 -0
- package/repo-docs/public/favicon.svg +3 -0
- package/repo-docs/reference/repo-scripts.md +6 -1
- package/repo-e2e/specs/home-user-account.spec.ts +311 -207
- package/scripts/bootstrapAgentGovernance.mjs +1 -0
- package/scripts/upgrade.ts +1 -0
- package/vona/packages-cli/cli/package.json +1 -1
- package/vona/packages-cli/cli-set-api/cli/templates/tools/crudBasic/snippets/2-meta.index.ts +4 -10
- package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/snippets/2-meta.index.ts +4 -10
- package/vona/packages-cli/cli-set-api/package.json +8 -2
- package/vona/packages-cli/cli-set-api/src/index.ts +1 -0
- package/vona/packages-cli/cli-set-api/src/lib/bean/cli.tools.masterDetail.ts +9 -12
- package/vona/packages-cli/cli-set-api/src/lib/mergeMetaIndex.ts +121 -0
- package/vona/packages-cli/cli-set-api/test/indexSnippets.test.ts +41 -0
- package/vona/packages-cli/cli-set-api/test/mergeMetaIndex.test.ts +78 -0
- package/vona/packages-vona/vona/package.json +1 -1
- package/vona/pnpm-lock.yaml +6 -6
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/sku.ts +25 -4
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuUniqueness.test.ts +161 -0
- package/vona/src/suite/a-commerce/modules/commerce-payment/src/bean/meta.index.ts +21 -20
- package/vona/src/suite/a-commerce/modules/commerce-payment/test/paymentIndexes.test.ts +165 -0
- package/vona/src/suite/a-commerce/modules/commerce-promotion/src/bean/meta.index.ts +16 -13
- package/vona/src/suite/a-commerce/modules/commerce-promotion/test/promotionIndexes.test.ts +82 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/meta.index.ts +23 -21
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/tradeIndexes.test.ts +86 -0
- package/vona/src/suite/a-home/modules/home-user/src/.metadata/index.ts +379 -376
- package/vona/src/suite/a-home/modules/home-user/src/controller/passportTest.ts +60 -0
- package/vona/src/suite/a-home/modules/home-user/test/passportTest.test.ts +164 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/package.json +2 -2
- package/vona/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/meta.index.ts +35 -26
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/package.json +5 -5
- package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transactionFiber_.ts +6 -2
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transaction_.ts +4 -1
- package/vona/src/suite-vendor/a-vona/modules/a-ormutils/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-ormutils/src/lib/columns.ts +3 -1
- package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/package.json +1 -1
- /package/repo-docs/{.vitepress/public → public}/CNAME +0 -0
|
@@ -69,6 +69,7 @@ const fullstackGroups = [
|
|
|
69
69
|
text: 'Fullstack / Getting Started',
|
|
70
70
|
items: [
|
|
71
71
|
{ text: 'Introduction', link: '/fullstack/introduction' },
|
|
72
|
+
{ text: 'Development History', link: '/fullstack/development-history' },
|
|
72
73
|
{ text: 'Quickstart', link: '/fullstack/quickstart' },
|
|
73
74
|
{ text: 'Suites and Modules', link: '/fullstack/suites-and-modules' },
|
|
74
75
|
],
|
|
@@ -98,7 +99,7 @@ const fullstackGroups = [
|
|
|
98
99
|
link: '/fullstack/tutorial-5-backend-contract-sharing',
|
|
99
100
|
},
|
|
100
101
|
{
|
|
101
|
-
text: 'Tutorial 6: One Contract
|
|
102
|
+
text: 'Tutorial 6: One Contract Model, Four Uses',
|
|
102
103
|
link: '/fullstack/tutorial-6-one-contract-four-uses',
|
|
103
104
|
},
|
|
104
105
|
],
|
|
@@ -115,7 +116,7 @@ const fullstackGroups = [
|
|
|
115
116
|
],
|
|
116
117
|
},
|
|
117
118
|
{
|
|
118
|
-
text: 'Architecture &
|
|
119
|
+
text: 'Architecture & Editions',
|
|
119
120
|
items: [
|
|
120
121
|
{
|
|
121
122
|
text: 'Comparison with Other Frameworks',
|
|
@@ -123,18 +124,27 @@ const fullstackGroups = [
|
|
|
123
124
|
},
|
|
124
125
|
{ text: 'Framework Performance', link: '/fullstack/framework-performance' },
|
|
125
126
|
{ text: 'Vona + Zova Integration', link: '/fullstack/vona-zova-integration' },
|
|
126
|
-
{ text: 'SSR Site and Flavor Setup', link: '/fullstack/ssr-site-and-flavor-setup' },
|
|
127
|
-
{ text: 'A-Pay Payment Suite', link: '/fullstack/a-pay-payment-suite' },
|
|
128
127
|
{
|
|
129
|
-
text: '
|
|
130
|
-
link: '/fullstack/
|
|
128
|
+
text: 'Edition Collaboration Differences',
|
|
129
|
+
link: '/fullstack/edition-collaboration-differences',
|
|
131
130
|
},
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
text: 'Contracts & Integration',
|
|
135
|
+
items: [
|
|
132
136
|
{ text: 'Contract Loop Playbook', link: '/fullstack/contract-loop-playbook' },
|
|
133
137
|
{ text: 'Semantic Presentation Contract', link: '/fullstack/semantic-presentation-contract' },
|
|
138
|
+
{ text: 'Backend OpenAPI to Frontend SDK', link: '/fullstack/openapi-to-sdk' },
|
|
134
139
|
{
|
|
135
|
-
text: '
|
|
136
|
-
link: '/fullstack/
|
|
140
|
+
text: 'Frontend Metadata Back to Backend',
|
|
141
|
+
link: '/fullstack/frontend-metadata-to-backend',
|
|
137
142
|
},
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
text: 'Metadata-Driven UI',
|
|
147
|
+
items: [
|
|
138
148
|
{
|
|
139
149
|
text: 'Backend Metadata to Frontend Table Actions',
|
|
140
150
|
link: '/fullstack/backend-metadata-to-frontend-table-actions',
|
|
@@ -151,20 +161,32 @@ const fullstackGroups = [
|
|
|
151
161
|
text: 'Backend Metadata to Frontend Table Actions Source Reading Map',
|
|
152
162
|
link: '/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map',
|
|
153
163
|
},
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
text: 'Resource & SSR Patterns',
|
|
168
|
+
items: [
|
|
169
|
+
{ text: 'Vona Integrated SSR vs Zova Standalone SSR', link: '/fullstack/ssr-entry-modes' },
|
|
170
|
+
{ text: 'SSR Site and Flavor Setup', link: '/fullstack/ssr-site-and-flavor-setup' },
|
|
157
171
|
{
|
|
158
|
-
text: '
|
|
159
|
-
link: '/fullstack/
|
|
172
|
+
text: 'Admin Resource and Web Self-Service',
|
|
173
|
+
link: '/fullstack/admin-resource-and-web-self-service',
|
|
160
174
|
},
|
|
161
175
|
{
|
|
162
176
|
text: 'One-to-One Companion Resource',
|
|
163
177
|
link: '/fullstack/one-to-one-companion-resource-guide',
|
|
164
178
|
},
|
|
179
|
+
],
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
text: 'Media & Payments',
|
|
183
|
+
items: [
|
|
184
|
+
{ text: 'Fullstack Image Workflow', link: '/fullstack/image-workflow' },
|
|
185
|
+
{ text: 'Fullstack File Workflow', link: '/fullstack/file-workflow' },
|
|
186
|
+
{ text: 'A-Pay Payment Suite', link: '/fullstack/a-pay-payment-suite' },
|
|
165
187
|
{
|
|
166
|
-
text: '
|
|
167
|
-
link: '/fullstack/
|
|
188
|
+
text: 'Payment Provider Sandbox Configuration',
|
|
189
|
+
link: '/fullstack/payment-sandbox-configuration',
|
|
168
190
|
},
|
|
169
191
|
],
|
|
170
192
|
},
|
|
@@ -194,22 +216,22 @@ const referenceGroups = [
|
|
|
194
216
|
const GA_MEASUREMENT_ID = 'G-2NYR9RGRL4'; // process.env.GA_MEASUREMENT_ID;
|
|
195
217
|
const gaHead = GA_MEASUREMENT_ID
|
|
196
218
|
? [
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
219
|
+
[
|
|
220
|
+
'script',
|
|
221
|
+
{
|
|
222
|
+
async: '',
|
|
223
|
+
src: `https://www.googletagmanager.com/gtag/js?id=${GA_MEASUREMENT_ID}`,
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
[
|
|
227
|
+
'script',
|
|
228
|
+
{},
|
|
229
|
+
`window.dataLayer = window.dataLayer || [];
|
|
208
230
|
function gtag(){dataLayer.push(arguments);}
|
|
209
231
|
gtag('js', new Date());
|
|
210
232
|
gtag('config', '${GA_MEASUREMENT_ID}');`,
|
|
211
|
-
|
|
212
|
-
|
|
233
|
+
],
|
|
234
|
+
]
|
|
213
235
|
: [];
|
|
214
236
|
|
|
215
237
|
export default defineConfig({
|
|
@@ -218,7 +240,10 @@ export default defineConfig({
|
|
|
218
240
|
lang: 'en-US',
|
|
219
241
|
base: '/',
|
|
220
242
|
ignoreDeadLinks: [/^https?:\/\/localhost/],
|
|
221
|
-
head:
|
|
243
|
+
head: [
|
|
244
|
+
['link', { rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' }],
|
|
245
|
+
...gaHead,
|
|
246
|
+
],
|
|
222
247
|
transformPageData(pageData) {
|
|
223
248
|
if (!/^blogs\/[^/]+\/index\.md$/.test(pageData.relativePath)) return;
|
|
224
249
|
|
|
@@ -33,7 +33,7 @@ Use [Generate a Cabloy Suite Specification](/ai/playbook-spec-generation) instea
|
|
|
33
33
|
|
|
34
34
|
## Establish the execution boundary first
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
Inspect the active root, current revision, working tree, and edition markers. Exactly one marker selects Basic or Start; both mean stop as invalid/ambiguous. If neither marker is present, inspect the owning package/structure and ask before edition-sensitive execution. Then build the selected increment's dossier.
|
|
37
37
|
|
|
38
38
|
The dossier identifies:
|
|
39
39
|
|
|
@@ -46,7 +46,11 @@ The dossier identifies:
|
|
|
46
46
|
- approved verification procedures, expected redacted evidence, and allowed record updates
|
|
47
47
|
- blockers, unresolved `TODO(confirm)` items, excluded unsafe operations, and one next action
|
|
48
48
|
|
|
49
|
-
Require explicit approval
|
|
49
|
+
Require explicit dossier approval before source changes, meaningful verification, evidence/status updates, or specialist execution. Generation approval, concrete design/ADR acceptance, and execution approval are separate. Do not reserve a task by marking it `in-progress` before approved work starts.
|
|
50
|
+
|
|
51
|
+
Classify targets as **observed existing**, **proposed new**, or **explicitly approved new**, as in [spec generation](/ai/playbook-spec-generation#existing-facts-and-new-designs). An approved new site/flavor tuple may be created before its future source exists if framework constraints and collisions were checked, you explicitly approved the concrete design, and its governing ADR is `Accepted`. Cite accepted design authority and planned paths/manifests in the dossier. Shared integration still requires an observed owner. Controlling TODOs, unaccepted ADRs, and blocked gates remain blockers; absence of future source alone is not one.
|
|
52
|
+
|
|
53
|
+
A new wrapper is a planned addition: create it within approved scope, inspect its durable manifest and paired SSR/REST outputs, then run it. Do not treat the proposed command as already runnable.
|
|
50
54
|
|
|
51
55
|
## Read authority before implementation
|
|
52
56
|
|
|
@@ -58,7 +62,9 @@ Read the suite records in this order:
|
|
|
58
62
|
4. linked ATP procedures and release gates in `test-plan.md`
|
|
59
63
|
5. `progress.md` for derived status, blockers, waivers, evidence pointers, and next proof
|
|
60
64
|
6. linked evidence, runbooks, presentation records, or rollout records when they apply
|
|
61
|
-
7.
|
|
65
|
+
7. applicable implementation charts, checking freshness only with complete supported inputs; report incomplete lightweight/legacy inputs rather than forcing new business declarations
|
|
66
|
+
|
|
67
|
+
Keep planning authority audit (`npm run spec:check -- <suite>`, with `--lightweight` only for agreed limited scope), chart model/freshness, and human approval/evidence as three separate gates. Compatible catalogue tables can define legacy ATPs in their owning role; matrices and evidence cannot. A static pass does not clear a controlling TODO, accept an ADR, or prove ATP execution.
|
|
62
68
|
|
|
63
69
|
When records conflict, return to [Generate a Cabloy Suite Specification](/ai/playbook-spec-generation) before implementation. Do not resolve an authority contradiction through an execution note, a chart edit, or a source workaround.
|
|
64
70
|
|
|
@@ -111,7 +117,7 @@ A successful build, generation command, hook, manual walkthrough, screenshot, or
|
|
|
111
117
|
|
|
112
118
|
## Refresh derived charts last
|
|
113
119
|
|
|
114
|
-
After evidence and progress are accurate, refresh
|
|
120
|
+
After evidence and progress are accurate, refresh both derived views only when complete supported README/WBS/ATP/progress inputs follow the [chart input contract](/reference/repo-scripts#chart-input-contract). Refresh again when README title/language changes. If legacy/lightweight inputs are incomplete, report the precise omission and route necessary authority repair through planning; never invent business definitions to force chart generation. Find progress rows by `WBS ID` and `Status` headers, not fixed column positions.
|
|
115
121
|
|
|
116
122
|
```bash
|
|
117
123
|
npm run spec:charts -- <suite>
|
|
@@ -31,7 +31,7 @@ Use a different path when the task is already an approved bounded WBS increment,
|
|
|
31
31
|
## What happens after you invoke it
|
|
32
32
|
|
|
33
33
|
1. **AI checks the current repository.** It detects the active Cabloy edition, reads the relevant repository guidance and existing suite records, and distinguishes observed source facts from your confirmed decisions, proposals, and unresolved items.
|
|
34
|
-
2. **AI identifies the planning scope.** It
|
|
34
|
+
2. **AI identifies the planning scope.** It chooses a complete new baseline, incremental maintenance of an existing set, or explicitly approved lightweight planning. An existing directory is normally the update destination, not a conflict or reset request. Basic and Start share the model, but runtime details come from the active edition. Both edition markers mean stop; if neither marker is present, inspect the owning package/structure and ask before edition-sensitive planning.
|
|
35
35
|
3. **AI asks focused questions.** You provide only the decisions that are needed to make the plan coherent. AI can recommend a boundary, but it identifies a recommendation as a proposal rather than treating it as confirmed input.
|
|
36
36
|
4. **AI presents a confirmation summary.** The summary states what will be created or changed, what remains unresolved, and which decisions or WBS branches remain gated.
|
|
37
37
|
5. **You approve or revise the summary.** No specification file is generated, replaced, or treated as approved merely because a question was asked or left unanswered. A confirmation to generate records also does not accept a durable ADR; a decision remains proposed until it is explicitly accepted.
|
|
@@ -48,7 +48,19 @@ The initial business description can be short. During the conversation, AI may a
|
|
|
48
48
|
- delivery, release, and verification expectations
|
|
49
49
|
- unresolved durable decisions, the WBS branches they block, justified optional records, and the initial delivery status
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
AI asks only for missing decisions. If the existing strategy still governs, it does not repeat a Web/Admin four-way choice; a single unresolved audience gets a focused question. Unresolved naming takes a naming-only detour through `cabloy-domain-planning`, then returns here without scaffolding.
|
|
52
|
+
|
|
53
|
+
## Existing facts and new designs
|
|
54
|
+
|
|
55
|
+
Targets have three distinct states:
|
|
56
|
+
|
|
57
|
+
- **Observed existing**: source/configuration was inspected and cited. Shared-site integration requires an observed owner.
|
|
58
|
+
- **Proposed new**: a deliberately new design, not a claim that source already exists.
|
|
59
|
+
- **Explicitly approved new**: the concrete tuple passed framework-constraint and collision checks, you explicitly approved the design, and its governing ADR is `Accepted`.
|
|
60
|
+
|
|
61
|
+
For a new independent SSR site, validate site ID, public path, flavor, configuration ownership, site module/registration, copied bundle, generated REST package, and paired SSR/REST commands together. The target need not exist before approval: a bounded execution task may create an explicitly approved new tuple after its own dossier approval. Unknown or unchecked values remain `TODO(confirm)`; they block only dependent work. A new wrapper is a **planned addition**, not a current command to run. See [Independent SSR Site and Flavor Setup](/fullstack/ssr-site-and-flavor-setup).
|
|
62
|
+
|
|
63
|
+
Keep approval domains separate: approval to generate records does not accept a durable ADR or authorize source execution. Site-strategy selection approves only that input; design/ADR acceptance and bounded execution approval remain explicit.
|
|
52
64
|
|
|
53
65
|
## What gets generated or updated
|
|
54
66
|
|
|
@@ -77,7 +89,7 @@ repo-specs/<suite>/
|
|
|
77
89
|
| `test-plan.md` | Acceptance procedures, expected proof, and release gates |
|
|
78
90
|
| `progress.md` and charts | Derived delivery status and planning views, not upstream authority |
|
|
79
91
|
|
|
80
|
-
AI adds presentation contracts,
|
|
92
|
+
Charts are generated only after complete supported README/WBS/ATP/progress inputs exist. A deliberately lightweight set agrees on selected records and omissions instead of forcing a complete baseline or charts. AI adds presentation contracts, rollout records, runbooks, extra ADRs, or evidence only when justified; it never creates empty evidence to imply execution.
|
|
81
93
|
|
|
82
94
|
For an existing suite, the workflow updates the owning upstream authority before dependent records. It preserves existing identifiers, accepted decisions, history, and evidence conventions rather than silently overwriting them or creating a parallel planning set.
|
|
83
95
|
|
|
@@ -105,6 +117,31 @@ A product or technical change belongs in its PRD, SRS, or accepted ADR before it
|
|
|
105
117
|
|
|
106
118
|
Planning records and derived charts do not establish `implementation-complete` or `verified`. `verified` requires the applicable acceptance procedure and retained, redacted observed evidence. A generated plan, planned command, scaffold, screenshot, or unrelated check is not automatically sufficient proof.
|
|
107
119
|
|
|
120
|
+
## Check planning without claiming implementation
|
|
121
|
+
|
|
122
|
+
Use three independent gates:
|
|
123
|
+
|
|
124
|
+
1. **Planning authority audit** checks formal definitions, exact references, declared PRD → SRS → WBS → ATP associations, and local links:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
npm run spec:check -- <suite>
|
|
128
|
+
# Only for explicitly limited planning scope:
|
|
129
|
+
npm run spec:check -- <suite> --lightweight
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Lightweight mode reports omitted owners/chain coverage; it does not permit dangling references. If progress is present, its WBS owner is still needed.
|
|
133
|
+
2. **Chart model/freshness** checks supported WBS/dependency/ATP/progress consistency and generated-view freshness, only with complete supported inputs:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
npm run spec:charts -- <suite>
|
|
137
|
+
npm run spec:charts:check -- <suite>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Regenerate after WBS, test-plan, progress, or README title/language changes. With incomplete lightweight/legacy inputs, report the precise chart gap; do not invent business definitions or status to make a generator pass.
|
|
141
|
+
3. **Human approval/evidence review** retains ADR acceptance, controlling TODOs, bounded execution approval, and observed ATP proof as separate requirements. Neither static check approves a design or establishes `verified`.
|
|
142
|
+
|
|
143
|
+
New specs use atomic `- **PRD-...**: <body>` / `- **SRS-...**: <body>` declarations, phase/task WBS headings with explicit Dependencies, Traceability, Tasks, and Acceptance checks, and `### ATP-...: <title>` scenarios under `## Acceptance Scenario Catalogue` with Setup, Procedure, Expected result, Minimum proof, and Traceability. Resolve progress columns by `WBS ID` and `Status` headers rather than fixed positions. Compatible legacy catalogue tables remain supported; matrices and evidence are not definitions. Report legacy gaps without silently rewriting business meaning. See [Repo Scripts](/reference/repo-scripts) for the active deterministic command contracts.
|
|
144
|
+
|
|
108
145
|
## What happens next
|
|
109
146
|
|
|
110
147
|
After the specification set is coherent and one bounded WBS increment is approved, execute that increment in Claude Code:
|
package/repo-docs/ai/skills.md
CHANGED
|
@@ -51,9 +51,9 @@ For edition-aware skills, use [Cabloy Editions: For AI Development](/editions/ov
|
|
|
51
51
|
The repository currently authors these cross-stack and monorepo-wide workflows in `repo-agent-governance/skills/` and renders them to root platform adapters; Codex and Cursor discovery remains subject to external client validation:
|
|
52
52
|
|
|
53
53
|
- `cabloy-workflow` for choosing the correct Cabloy work path before implementation
|
|
54
|
-
- `cabloy-domain-planning` for
|
|
55
|
-
- `cabloy-spec-generation` for
|
|
56
|
-
- `cabloy-spec-execution` for
|
|
54
|
+
- `cabloy-domain-planning` for confirming providerId, suite, and capability names; a naming-only detour from specification generation returns there without scaffolding
|
|
55
|
+
- `cabloy-spec-generation` for complete new baselines, incremental maintenance, or explicitly lightweight planning; it separates generation approval, design/ADR acceptance, and bounded execution approval, audits authority, and refreshes charts only with complete supported inputs; see [Generate a Cabloy Suite Specification](/ai/playbook-spec-generation)
|
|
56
|
+
- `cabloy-spec-execution` for one explicitly approved WBS increment, including creation of an approved new target whose future source does not exist yet; it preserves controlling gates, specialist implementation, retained evidence, and conditional derived-view updates; see [Execute an Approved Cabloy Specification Increment](/ai/playbook-spec-execution)
|
|
57
57
|
- `cabloy-contract-loop` for backend/frontend contract regeneration and drift diagnosis; see [Contract Loop Playbook](/fullstack/contract-loop-playbook)
|
|
58
58
|
- `cabloy-resource-field-update` for updating an existing backend resource field thread; see [Existing Resource Field Update](/backend/resource-field-update)
|
|
59
59
|
- `cabloy-module-removal` for removing a backend, frontend, or fullstack module cleanly, including generated-runtime cleanup, stale-residue recovery, and verification; see [Module Removal](/ai/playbook-module-removal)
|
|
@@ -115,6 +115,16 @@ These shorthands still map back to the generic aspect model.
|
|
|
115
115
|
|
|
116
116
|
The global Passport guard is the baseline for controller actions: without a local Passport decorator, an action requires an authenticated and activated user. It is not public.
|
|
117
117
|
|
|
118
|
+
`@Passport.activated(...)` changes the activation requirement for an authenticated user:
|
|
119
|
+
|
|
120
|
+
| Value | Requirement | Typical use |
|
|
121
|
+
| --- | --- | --- |
|
|
122
|
+
| `true` | The user must be activated; this is the default. | Ordinary protected actions. |
|
|
123
|
+
| `false` | The user must **not** be activated. This does not mean “skip the check.” | An account-activation action. |
|
|
124
|
+
| `'noCheck'` | Do not check activation state; both activated and unactivated users can proceed. | Logout, including for an unactivated account. |
|
|
125
|
+
|
|
126
|
+
All three values still require authentication by default. An unauthenticated request is rejected; use `@Passport.public()` only if anonymous access is intended. A disabled account is still rejected regardless of the activation setting. The guard returns `403` when an authenticated user fails the account-status or activation check.
|
|
127
|
+
|
|
118
128
|
Use a local Passport or domain guard when an action needs a policy beyond that baseline:
|
|
119
129
|
|
|
120
130
|
- use `@Passport.public()` only when anonymous access is intentional
|
|
@@ -60,6 +60,29 @@ class MetaIndex {}
|
|
|
60
60
|
|
|
61
61
|
This is especially valuable for maintainability because it reduces stringly-typed drift.
|
|
62
62
|
|
|
63
|
+
### Multiple indexes on one table
|
|
64
|
+
|
|
65
|
+
Declare each table only once in an `indexes` object, whether using direct properties or `$tableColumns`. The helper returns one property keyed by the table name; spreading multiple calls for the same table overwrites earlier values rather than combining them. Put all specifications for that table in one array:
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
@Meta({
|
|
69
|
+
indexes: {
|
|
70
|
+
...$tableColumns('payPaymentSession', [
|
|
71
|
+
'businessReference',
|
|
72
|
+
'providerCorrelationReference',
|
|
73
|
+
'state+expiresAt',
|
|
74
|
+
]),
|
|
75
|
+
},
|
|
76
|
+
})
|
|
77
|
+
class MetaIndex {}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Each array entry defines a separate index. In this example, the first two entries are independent single-column indexes; `state+expiresAt` defines one composite index, with `state` as its leading column. An array such as `['state', 'expiresAt']` would instead define two single-column indexes. The typed helper accepts arrays containing both single-column fields and two-column `+` specifications.
|
|
81
|
+
|
|
82
|
+
### Generated names and verification
|
|
83
|
+
|
|
84
|
+
The current index reconciler names an index `idx_<table>_<first-column>` and checks existing indexes by that leading column. Two intended indexes with the same leading column, such as `state+expiresAt` and `state+nextAttemptAt`, can therefore collide or leave one uncreated. Do not change column order merely to avoid a naming collision: order is part of the query access pattern. Inspect the resulting definitions, not just whether initialization succeeded.
|
|
85
|
+
|
|
63
86
|
## App-config override support
|
|
64
87
|
|
|
65
88
|
Field indexes can also be configured through app config.
|
|
@@ -84,6 +107,8 @@ Also ask:
|
|
|
84
107
|
2. should the index belong in `meta.index`?
|
|
85
108
|
3. does a business key need tenant-scoped uniqueness, to be enforced in tenant-aware business logic rather than with `table.unique(...)`?
|
|
86
109
|
4. is the typed style a better fit than raw string declarations?
|
|
110
|
+
5. does each table have one effective declaration containing every intended index specification, without conflicting leading columns?
|
|
111
|
+
6. do the resulting database indexes have the intended columns in the intended order? Check both registered metadata and physical index definitions; a passing type check or successful initialization alone does not establish this.
|
|
87
112
|
|
|
88
113
|
That leads to backend changes that are more production-aware and more aligned with Vona’s module metadata model.
|
|
89
114
|
|
|
@@ -187,7 +187,7 @@ If this field needs specialized controls instead of the default Renderer, it can
|
|
|
187
187
|
|
|
188
188
|
That does not mean each field automatically grows a complete UI, nor that every presentation decision belongs in the backend. It means the field’s business meaning, data contract, and permitted exposure do not have to be copied into backend DTOs, frontend request types, form rules, table columns, and response post-processing—and then manually kept aligned.
|
|
189
189
|
|
|
190
|
-
In this **forward contract chain**, backend Controllers, DTOs, Entities, and validation rules are the source of truth. Vona generates OpenAPI; Zova then generates or consumes SDK/Schema contract material. When a backend contract changes, the recommended path is to propagate that truth forward rather than hand-edit multiple frontend copies. [Backend OpenAPI to Frontend SDK](https://cabloy.com/fullstack/openapi-to-sdk) and [One Contract
|
|
190
|
+
In this **forward contract chain**, backend Controllers, DTOs, Entities, and validation rules are the source of truth. Vona generates OpenAPI; Zova then generates or consumes SDK/Schema contract material. When a backend contract changes, the recommended path is to propagate that truth forward rather than hand-edit multiple frontend copies. [Backend OpenAPI to Frontend SDK](https://cabloy.com/fullstack/openapi-to-sdk) and [One Contract Model, Four Uses](https://cabloy.com/fullstack/tutorial-6-one-contract-four-uses) describe the boundary of that chain.
|
|
191
191
|
|
|
192
192
|
## Coordinate five: routes choose a UI scene; Resource identities choose business context
|
|
193
193
|
|
|
@@ -358,7 +358,7 @@ Use the tutorial series as examples of the two chains:
|
|
|
358
358
|
- [Tutorial 3: Frontend Metadata Sharing](/fullstack/tutorial-3-frontend-metadata-sharing) — reverse chain, built-in metadata branch
|
|
359
359
|
- [Tutorial 4: Custom Form/Table Renderers for Level](/fullstack/tutorial-4-custom-level-renderers) — reverse chain, custom resource handoff branch
|
|
360
360
|
- [Tutorial 5: Backend Contract Sharing](/fullstack/tutorial-5-backend-contract-sharing) — forward chain, backend-emitted contract branch
|
|
361
|
-
- [Tutorial 6: One Contract
|
|
361
|
+
- [Tutorial 6: One Contract Model, Four Uses](/fullstack/tutorial-6-one-contract-four-uses) — two field examples spanning validation, OpenAPI, rendering, and serialization
|
|
362
362
|
|
|
363
363
|
## Related docs
|
|
364
364
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# CabloyJS Development History
|
|
2
|
+
|
|
3
|
+
CabloyJS has evolved from a JavaScript-based Node.js fullstack framework into a TypeScript-based system built on Vona and Zova. Three milestones explain the transition.
|
|
4
|
+
|
|
5
|
+
## 2016 onward: V1–V4
|
|
6
|
+
|
|
7
|
+
Development began in 2016. Across V1, V2, V3, and V4, CabloyJS refined its fullstack architecture and accumulated the conventions that led some developers to describe it as a “textbook-like framework.”
|
|
8
|
+
|
|
9
|
+
Feedback also pointed toward a new direction: TypeScript support and a clearer separation between frontend and backend development. These ideas shaped the next major redesign.
|
|
10
|
+
|
|
11
|
+
## 2023: The V5 redesign
|
|
12
|
+
|
|
13
|
+
In 2023, work began on a redesigned V5 architecture. Rather than incrementally adapting the earlier JavaScript framework, the project adopted TypeScript and a frontend/backend separation model built around two frameworks:
|
|
14
|
+
|
|
15
|
+
- **ZovaJS** provides the frontend framework. Its programming model brings together Vue 3 reactivity, TSX authoring, and inversion of control (IoC).
|
|
16
|
+
- **VonaJS** provides the backend framework and fullstack integration. It connects backend contracts with frontend applications across SSR, SPA, Web, and Admin use cases.
|
|
17
|
+
|
|
18
|
+
The two layers remain connected through [bidirectional contract workflows](/fullstack/contract-loop-playbook), including backend OpenAPI contracts consumed by the frontend and frontend metadata consumed by backend tooling.
|
|
19
|
+
|
|
20
|
+
## April 13, 2026: V5 release
|
|
21
|
+
|
|
22
|
+
ZovaJS V5 and VonaJS V5 were officially released on April 13, 2026. Built on these foundations, CabloyJS V5 continues the goal behind the “textbook-like framework” description: make fullstack architecture understandable, consistent, and productive in day-to-day development.
|
|
23
|
+
|
|
24
|
+
For the current architecture and edition-specific project baselines, continue with the [Fullstack Introduction](/fullstack/introduction) and [Editions Overview](/editions/overview).
|
|
@@ -1,178 +1,47 @@
|
|
|
1
1
|
# Fullstack Introduction
|
|
2
2
|
|
|
3
|
-
Cabloy is a Node.js fullstack framework for AI vibe coding, with AI Spec-Driven Development
|
|
4
|
-
|
|
5
|
-
**One fullstack system for AI vibe coding—bidirectional type sync, CLI-first workflows, docs, skills, and traceable delivery from product intent to verifiable evidence.**
|
|
6
|
-
|
|
7
|
-
Instead of stitching separate backend and frontend stacks together, Cabloy keeps their contracts, tooling, and guidance connected in one repository. Vona, Zova, and suite-based modules are the aligned architecture behind that workflow.
|
|
8
|
-
|
|
9
|
-
## What Cabloy emphasizes
|
|
10
|
-
|
|
11
|
-
- **One fullstack system** — build backend and frontend together instead of assembling separate stacks
|
|
12
|
-
- **Bidirectional type sync** — use the contract loop to keep backend contracts and frontend metadata aligned in both directions
|
|
13
|
-
- **CLI-first workflows** — use explicit commands for scaffolding, generation, refactors, and verification
|
|
14
|
-
- **Docs and skills** — give people and AI agents reusable, source-grounded guidance for the current repository
|
|
15
|
-
- **AI Spec-Driven Development** — use Traceable Spec Delivery to connect product intent, contracts, bounded work, acceptance procedures, and verifiable evidence
|
|
16
|
-
- **Vona + Zova** — use aligned backend and frontend layers for code sharing and cross-stack consistency
|
|
17
|
-
- **Modular delivery** — organize capabilities as suites and modules, then deliver SSR, SPA, Web, and Admin applications with shared conventions
|
|
18
|
-
|
|
19
|
-
## How to approach fullstack work
|
|
20
|
-
|
|
21
|
-
For contributor and automation workflows in this repository, prefer this order:
|
|
22
|
-
|
|
23
|
-
1. inspect the root `package.json` and shared monorepo scripts first
|
|
24
|
-
2. inspect `npm run vona`, `npm run zova`, and the shared fullstack CLI workflow before inventing custom steps
|
|
25
|
-
3. detect the active edition before making UI-sensitive or flavor-sensitive assumptions
|
|
26
|
-
4. explain shared cross-stack concepts once, then isolate edition-specific notes only where the editions intentionally diverge
|
|
27
|
-
|
|
28
|
-
## Fullstack reading paths
|
|
29
|
-
|
|
30
|
-
Use this page as the main fullstack hub, then choose the path that matches your task.
|
|
31
|
-
|
|
32
|
-
### Getting started path
|
|
33
|
-
|
|
34
|
-
Start here when you want the shortest route to a working monorepo mental model:
|
|
35
|
-
|
|
36
|
-
- [Quickstart](/fullstack/quickstart)
|
|
37
|
-
- [Suites and Modules](/fullstack/suites-and-modules)
|
|
38
|
-
- [CLI](/fullstack/cli)
|
|
39
|
-
- [VS Code Extensions](/fullstack/vscode-extensions)
|
|
40
|
-
|
|
41
|
-
### Architecture and integration path
|
|
42
|
-
|
|
43
|
-
Use this path when the task is about how backend and frontend stay aligned inside one framework system:
|
|
44
|
-
|
|
45
|
-
- [Comparison with Other Frameworks](/fullstack/comparison-with-other-frameworks)
|
|
46
|
-
- [Framework Performance](/fullstack/framework-performance)
|
|
47
|
-
- [Vona + Zova Integration](/fullstack/vona-zova-integration)
|
|
48
|
-
- [Contract Loop Playbook](/fullstack/contract-loop-playbook)
|
|
49
|
-
- [Semantic Presentation Contract](/fullstack/semantic-presentation-contract)
|
|
50
|
-
- [Admin Resource and Web Self-Service](/fullstack/admin-resource-and-web-self-service)
|
|
51
|
-
- [Backend Metadata to Frontend Table Actions](/fullstack/backend-metadata-to-frontend-table-actions)
|
|
52
|
-
- [Fullstack Image Workflow](/fullstack/image-workflow)
|
|
53
|
-
- [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk)
|
|
54
|
-
- [Frontend Metadata Back to Backend](/fullstack/frontend-metadata-to-backend)
|
|
55
|
-
|
|
56
|
-
### Edition-aware collaboration path
|
|
57
|
-
|
|
58
|
-
Use this path when the task depends on edition boundaries, UI assumptions, or cross-repo delivery differences:
|
|
59
|
-
|
|
60
|
-
- [Edition Collaboration Differences](/fullstack/edition-collaboration-differences)
|
|
61
|
-
- [Cabloy Editions](/editions/overview#choosing-an-edition)
|
|
3
|
+
Cabloy is a Node.js fullstack framework for AI vibe coding, with AI Spec-Driven Development guiding work from confirmed specs to verifiable delivery.
|
|
62
4
|
|
|
63
5
|
## Shared architecture
|
|
64
6
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
- **Vona** provides the backend framework and runtime capabilities.
|
|
68
|
-
- **Zova** provides the frontend framework and application capabilities.
|
|
69
|
-
- Root scripts, shared terminology, and CLI-first workflows keep the layers aligned within each edition repository.
|
|
70
|
-
|
|
71
|
-
Cabloy Basic and Cabloy Start are related, complete edition baselines built on this shared architecture, not alternatives to the Vona and Zova layers. They intentionally compose UI, flavors, modules, SSR sites, and project assets differently. See [Editions Overview](/editions/overview) for the complete relationship and edition differences.
|
|
72
|
-
|
|
73
|
-
This combination keeps backend and frontend development close enough for code sharing, workflow reuse, and AI vibe coding workflows.
|
|
74
|
-
|
|
75
|
-
## Traceable delivery and contract synchronization
|
|
76
|
-
|
|
77
|
-
[AI Spec-Driven Development](/ai/ai-spec-driven-development) governs how confirmed product intent becomes contracts, bounded WBS work, acceptance procedures, and evidence-backed status. Its precise engineering method is Traceable Spec Delivery.
|
|
78
|
-
|
|
79
|
-
The [Contract Loop](/fullstack/contract-loop-playbook) is complementary rather than interchangeable: it synchronizes Vona↔Zova contract sources, generated handoffs, and consumers when an approved increment crosses the fullstack contract boundary. A completed synchronization does not establish product authority or close ATP evidence.
|
|
80
|
-
|
|
81
|
-
When an approved scene needs schema-driven presentation, use the [Semantic Presentation Contract](/fullstack/semantic-presentation-contract) to translate audience, task, scene, and DTO boundaries into renderer decisions without changing security or ownership authority.
|
|
82
|
-
|
|
83
|
-
## Cabloy fullstack framework principles
|
|
84
|
-
|
|
85
|
-
Cabloy’s fullstack model can be understood through two core principles.
|
|
86
|
-
|
|
87
|
-
### 1. Frontend build output participates directly in backend SSR
|
|
88
|
-
|
|
89
|
-
Zova owns the frontend application, but its build output is not treated as a completely separate artifact that the backend ignores.
|
|
90
|
-
|
|
91
|
-
In Cabloy’s fullstack flow:
|
|
92
|
-
|
|
93
|
-
- the frontend is built from Zova source
|
|
94
|
-
- the generated bundle and related SSR output are consumed by the Vona-side SSR runtime
|
|
95
|
-
- backend rendering and frontend hydration stay in one coordinated SSR path rather than two unrelated systems
|
|
96
|
-
|
|
97
|
-
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.
|
|
98
|
-
|
|
99
|
-
For the integration workflow and current monorepo shape, see [Vona + Zova Integration](/fullstack/vona-zova-integration) and [SSR Overview](/frontend/ssr-overview).
|
|
100
|
-
|
|
101
|
-
### 2. Bidirectional type sync through the contract loop
|
|
102
|
-
|
|
103
|
-
Cabloy does not treat type sharing as backend-to-frontend only. The collaboration loop provides bidirectional type sync:
|
|
104
|
-
|
|
105
|
-
- **Backend → Frontend**: Vona emits Swagger/OpenAPI contracts that Zova uses to generate frontend SDKs and related schema-aware helpers
|
|
106
|
-
- **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
|
|
107
|
-
|
|
108
|
-
This two-way contract loop reduces duplicate declarations and lets backend and frontend evolve from generated source truth instead of hand-maintained memory.
|
|
109
|
-
|
|
110
|
-
Start with the canonical [Contract Loop Playbook](/fullstack/contract-loop-playbook), then use the directional deep dives [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk) and [Frontend Metadata Back to Backend](/fullstack/frontend-metadata-to-backend).
|
|
111
|
-
|
|
112
|
-
Use the playbook to distinguish four cases clearly:
|
|
113
|
-
|
|
114
|
-
- forward chain
|
|
115
|
-
- reverse chain
|
|
116
|
-
- consumer drift
|
|
117
|
-
- local dependency drift
|
|
118
|
-
|
|
119
|
-
The contract-loop model is shared across Cabloy Basic and Cabloy Start. Detect the edition to choose concrete flavor commands and generated-output paths, not to redefine the workflow model.
|
|
120
|
-
|
|
121
|
-
When the reverse direction involves newly added frontend resources that backend tooling or backend metadata will consume, treat that as an operational handoff rather than a conceptual one: refresh generated frontend output, run the relevant flavor build, then run `npm run deps:vona`, and if the generated `.zova-rest` artifacts already contain the expected changes but Vona still sees stale shared types, rebuild `vona/node_modules` and reinstall dependencies.
|
|
122
|
-
|
|
123
|
-
## How the fullstack system stays connected
|
|
124
|
-
|
|
125
|
-
At the repository level, shared scripts, shared terminology, and CLI-first workflows keep Vona and Zova aligned as one framework system.
|
|
7
|
+
Vona provides the backend framework and runtime. Zova provides the frontend framework and application layer. Suites and modules organize capabilities across Admin, Web, SSR, and SPA applications. Root scripts and CLI workflows connect these layers within each edition repository.
|
|
126
8
|
|
|
127
|
-
|
|
9
|
+
Cabloy Basic and Cabloy Start are complete, separate project baselines built on this architecture. They share the Vona + Zova engineering model but can differ in UI layer, frontend flavors, modules, SSR sites, and project assets. See [Editions Overview](/editions/overview) before choosing edition-specific commands or UI conventions.
|
|
128
10
|
|
|
129
|
-
##
|
|
11
|
+
## How Vona and Zova connect
|
|
130
12
|
|
|
131
|
-
|
|
13
|
+
### Vona integrated SSR
|
|
132
14
|
|
|
133
|
-
|
|
134
|
-
- how backend OpenAPI and DTO output feeds frontend SDK generation
|
|
135
|
-
- how common concepts can be documented once before edition-specific notes branch out
|
|
136
|
-
- how Vona and Zova CLI capabilities can be reused instead of rebuilding scaffolding by hand
|
|
15
|
+
Zova builds the frontend application and SSR artifacts. In Vona integrated SSR, Vona consumes those artifacts to render the page, and the frontend hydrates it in the browser.
|
|
137
16
|
|
|
138
|
-
|
|
17
|
+
Zova standalone SSR is a separate development-server entry point for frontend work. Opening it directly does not verify the Vona integration path. See [Vona + Zova Integration](/fullstack/vona-zova-integration) and [SSR Overview](/frontend/ssr-overview) for the two layers in more detail.
|
|
139
18
|
|
|
140
|
-
###
|
|
19
|
+
### Bidirectional contract loop
|
|
141
20
|
|
|
142
|
-
|
|
143
|
-
| ---------- | -------- |
|
|
144
|
-
| TypeScript | `^5.9.3` |
|
|
145
|
-
| Zod | `^4.3.6` |
|
|
21
|
+
Type information moves in both directions, with a different source of truth on each side:
|
|
146
22
|
|
|
147
|
-
|
|
23
|
+
- **Backend to frontend:** Vona emits OpenAPI contracts that Zova uses to generate SDKs and schema-aware helpers.
|
|
24
|
+
- **Frontend to backend:** Zova generates metadata and types for routes, components, and icons that backend tooling and type hints can consume.
|
|
148
25
|
|
|
149
|
-
|
|
150
|
-
| -------------------------------- | --------- |
|
|
151
|
-
| Koa | `^3.2.0` |
|
|
152
|
-
| Knex | `^3.2.9` |
|
|
153
|
-
| Redis Client (`ioredis`) | `^5.10.1` |
|
|
154
|
-
| SQLite Driver (`better-sqlite3`) | `^12.9.0` |
|
|
26
|
+
The [Contract Loop Playbook](/fullstack/contract-loop-playbook) explains the generation, handoff, and verification steps for each direction, including recovery when generated output or local dependencies are stale.
|
|
155
27
|
|
|
156
|
-
|
|
28
|
+
## How spec-driven delivery fits
|
|
157
29
|
|
|
158
|
-
|
|
159
|
-
| -------------- | ----------- |
|
|
160
|
-
| Vue | `^3.5.32` |
|
|
161
|
-
| Vite | `^8.0.14` |
|
|
162
|
-
| Quasar | `^2.19.3` |
|
|
163
|
-
| TanStack Query | `^5.100.10` |
|
|
164
|
-
| TanStack Form | `^1.32.0` |
|
|
165
|
-
| TanStack Table | `^8.21.3` |
|
|
30
|
+
[AI Spec-Driven Development](/ai/ai-spec-driven-development) uses Traceable Spec Delivery to carry confirmed product intent into bounded work and verifiable evidence. The contract loop keeps Vona and Zova consumers aligned when that work changes a fullstack contract. Contract synchronization alone does not establish product approval or complete acceptance.
|
|
166
31
|
|
|
167
|
-
|
|
32
|
+
For schema-driven UI decisions, the [Semantic Presentation Contract](/fullstack/semantic-presentation-contract) connects the approved audience and task to the appropriate renderer without changing security or ownership authority.
|
|
168
33
|
|
|
169
|
-
|
|
170
|
-
- **Cabloy Start**: Vuetify
|
|
34
|
+
## Technology layers
|
|
171
35
|
|
|
172
|
-
|
|
36
|
+
- **Backend:** Vona uses Koa, Knex, Redis, and database drivers.
|
|
37
|
+
- **Frontend:** Zova uses Vue, Vite, Quasar tooling, and TanStack libraries. Quasar is part of the engineering toolchain, not the edition UI component library.
|
|
38
|
+
- **Edition UI:** Cabloy Basic uses DaisyUI + Tailwind CSS; Cabloy Start uses Vuetify.
|
|
173
39
|
|
|
174
|
-
|
|
40
|
+
For exact versions, inspect `vona/package.json` and `zova/package.json` in the active edition checkout.
|
|
175
41
|
|
|
176
|
-
|
|
42
|
+
## Continue reading
|
|
177
43
|
|
|
178
|
-
|
|
44
|
+
- **Explore the framework's origins:** [CabloyJS Development History](/fullstack/development-history).
|
|
45
|
+
- **Start a project:** [choose an edition](/editions/overview#choosing-an-edition), then follow the [Fullstack Quickstart](/fullstack/quickstart).
|
|
46
|
+
- **Build a feature:** use the [Fullstack Tutorials](/fullstack/tutorials-overview) and [Fullstack CLI](/fullstack/cli).
|
|
47
|
+
- **Work with AI agents:** start with the [AI Development Introduction](/ai/introduction) for repository guidance and skills.
|
|
@@ -107,7 +107,7 @@ The two commands start different SSR entry points. Choose the one that matches t
|
|
|
107
107
|
| **Vona integrated SSR** | `7102` | Fullstack development, site access, and browser acceptance | Vona API handling, SSR site matching, built artifact handoff, and the integrated HTTP response path |
|
|
108
108
|
| **Zova standalone SSR** | `9000` | Frontend development, hot reload, isolated debugging, and page/route/hydration iteration | Zova SSR rendering and frontend behavior without proving the Vona integration boundary |
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
Directly opening `9000` does not replace validation through Vona at `7102`. For acceptance or deployment-oriented checks, build the required SSR/REST artifacts, synchronize them with Vona, and access the site through Vona. For the request flows and guidance on choosing an entry, see [Vona Integrated SSR and Zova Standalone SSR](/fullstack/ssr-entry-modes).
|
|
111
111
|
|
|
112
112
|
## 6. Run with Docker Compose
|
|
113
113
|
|