cabloy 5.1.51 → 5.1.53
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 +1 -1
- package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +11 -1
- package/.claude/skills/cabloy-workflow/SKILL.md +8 -4
- package/.claude/skills/cabloy-workflow/references/edition-detection.md +3 -2
- package/.github/workflows/docs-pages.yml +2 -0
- package/CHANGELOG.md +42 -0
- package/CLAUDE.md +7 -4
- package/README.md +36 -21
- package/cabloy-docs/.vitepress/config.mjs +171 -44
- package/cabloy-docs/ai/class-placement-rule.md +1 -0
- package/cabloy-docs/ai/cli-for-agents.md +1 -1
- package/cabloy-docs/ai/docs-skills-rules-mapping.md +1 -0
- package/cabloy-docs/ai/edition-consistency-checklist.md +150 -0
- package/cabloy-docs/ai/edition-detection.md +3 -3
- package/cabloy-docs/ai/global-bean-lookup.md +1 -0
- package/cabloy-docs/ai/introduction.md +47 -3
- package/cabloy-docs/ai/repo-guidance.md +2 -2
- package/cabloy-docs/ai/rules-and-config.md +1 -1
- package/cabloy-docs/ai/skills.md +2 -0
- package/cabloy-docs/ai/verification.md +1 -0
- package/cabloy-docs/ai/virtual-decorator-guidance.md +206 -0
- package/cabloy-docs/backend/introduction.md +2 -2
- package/cabloy-docs/backend/logger-guide.md +1 -1
- package/cabloy-docs/backend/quickstart.md +3 -3
- package/cabloy-docs/editions/cabloy-basic.md +4 -3
- package/cabloy-docs/editions/cabloy-start.md +34 -3
- package/cabloy-docs/editions/choosing-between-basic-and-start.md +84 -0
- package/cabloy-docs/editions/overview.md +114 -20
- package/cabloy-docs/frontend/css-in-js-guide.md +1 -1
- package/cabloy-docs/frontend/environment-config-guide.md +28 -0
- package/cabloy-docs/frontend/foundation.md +3 -2
- package/cabloy-docs/frontend/introduction.md +73 -4
- package/cabloy-docs/frontend/navigation-guards-guide.md +1 -1
- package/cabloy-docs/frontend/quickstart.md +4 -2
- package/cabloy-docs/frontend/scripts.md +2 -2
- package/cabloy-docs/frontend/ssr-env.md +23 -0
- package/cabloy-docs/frontend/theme-guide.md +140 -7
- package/cabloy-docs/fullstack/cli.md +118 -0
- package/cabloy-docs/fullstack/comparison-with-other-frameworks.md +117 -0
- package/cabloy-docs/fullstack/edition-collaboration-differences.md +3 -2
- package/cabloy-docs/fullstack/introduction.md +84 -34
- package/cabloy-docs/fullstack/quickstart.md +7 -4
- package/cabloy-docs/fullstack/vona-zova-integration.md +2 -2
- package/cabloy-docs/fullstack/vscode-extensions.md +126 -0
- package/cabloy-docs/index.md +39 -40
- package/cabloy-docs/reference/frontend-directory-structure.md +125 -0
- package/cabloy-docs/reference/glossary.md +2 -2
- package/cabloy-docs/reference/introduction.md +47 -0
- package/cabloy-docs/reference/package-map.md +2 -0
- package/cabloy-docs/reference/repo-scripts.md +5 -3
- package/package.json +1 -1
- package/vona/README.md +1 -1
- package/vona/pnpm-lock.yaml +383 -38
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/.metadata/index.ts +49 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/controller/memoryDiag.ts +97 -0
- package/vona/src/suite-vendor/a-cabloy/package.json +1 -1
- package/zova/README.md +1 -1
- package/zova/package.original.json +4 -4
- package/zova/packages-cli/cli/package.json +2 -2
- package/zova/packages-cli/cli-set-front/package.json +2 -2
- package/zova/packages-cli/cli-set-front/src/lib/bean/cli.tools.metadata.ts +1 -1
- package/zova/packages-cli/cli-set-front/src/lib/bean/toolsMetadata/generateConfig.ts +2 -12
- package/zova/packages-utils/zova-jsx/package.json +2 -2
- package/zova/packages-utils/zova-vite/package.json +2 -2
- package/zova/packages-utils/zova-vite/templates/app/controller.tsx_ +3 -3
- package/zova/packages-zova/zova/package.json +3 -3
- package/zova/packages-zova/zova-core/package.json +2 -2
- package/zova/packages-zova/zova-core/src/bean/beanContainer.ts +3 -3
- package/zova/packages-zova/zova-core/src/bean/beanControllerPageBase.ts +1 -0
- package/zova/packages-zova/zova-core/src/core/component/module.ts +16 -16
- package/zova/packages-zova/zova-core/src/core/context/component.ts +35 -3
- package/zova/packages-zova/zova-core/src/core/context/util.ts +15 -11
- package/zova/packages-zova/zova-core/src/core/sys/config.ts +1 -1
- package/zova/pnpm-lock.yaml +1607 -1690
- package/zova/src/front/config/config/config.ts +1 -1
- package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +11 -0
- package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/locales.ts +0 -15
- package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/page/toolMinimal.ts +9 -0
- package/zova/src/suite/a-demo/modules/demo-basic/src/page/toolMinimal/controller.tsx +11 -0
- package/zova/src/suite/a-demo/modules/demo-basic/src/routes.ts +10 -0
- package/zova/src/suite/a-devui/modules/devui-adapter/src/bean/meta.themeHandler.ts +1 -0
- package/zova/src/suite/a-home/modules/home-base/src/.metadata/locales.ts +0 -15
- package/zova/src/suite/a-home/modules/home-base/src/service/routerGuards.ts +1 -1
- package/zova/src/suite/a-home/modules/home-base/src/service/ssrLayout.ts +1 -0
- package/zova/src/suite/a-home/modules/home-layoutadmin/src/.metadata/locales.ts +0 -15
- package/zova/src/suite/a-home/modules/home-layoutweb/src/.metadata/locales.ts +0 -15
- package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/controller.tsx +2 -2
- package/zova/src/suite/a-home/modules/home-login/src/.metadata/locales.ts +0 -15
- package/zova/src/suite/a-home/modules/home-passport/src/model/passport.ts +2 -2
- package/zova/src/suite/cabloy-basic/modules/basic-captcha/src/.metadata/locales.ts +0 -15
- package/zova/src/suite/cabloy-basic/modules/basic-form/src/.metadata/locales.ts +0 -15
- package/zova/src/suite/cabloy-basic/modules/basic-page/src/.metadata/locales.ts +0 -15
- package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/.metadata/locales.ts +0 -15
- package/zova/src/suite/cabloy-basic/modules/basic-table/src/.metadata/locales.ts +0 -15
- package/zova/src/suite-vendor/a-zova/modules/a-interceptor/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-interceptor/src/bean/interceptor.jwt.ts +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-model/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-model/src/service/storage.ts +4 -5
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/monkey.ts +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssr.ts +36 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrMetaStore.ts +8 -2
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/monkey.ts +3 -0
- package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/src/service/ssrHandler.ts +70 -29
- package/zova/src/suite-vendor/a-zova/modules/a-style/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-style/src/bean/bean.theme.ts +6 -3
- package/zova/src/suite-vendor/a-zova/modules/a-zod/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-zod/src/.metadata/locales.ts +0 -15
- package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/package.json +9 -9
|
@@ -139,7 +139,7 @@ Typical examples in Cabloy Basic include:
|
|
|
139
139
|
- `cd zova && npm run build:rest:cabloyBasicAdmin`
|
|
140
140
|
- `cd zova && npm run build:rest:cabloyBasicWeb`
|
|
141
141
|
|
|
142
|
-
For Cabloy Start, verify the exact Start-specific flavor names and
|
|
142
|
+
For Cabloy Start, verify the exact Start-specific flavor names, paths, SSR site baselines, and project assets in the licensed Start repo.
|
|
143
143
|
|
|
144
144
|
### Path C: Downstream frontend alignment
|
|
145
145
|
|
|
@@ -154,7 +154,17 @@ Check whether the feature needs:
|
|
|
154
154
|
- build
|
|
155
155
|
- metadata regeneration verification
|
|
156
156
|
- SSR or route-path verification
|
|
157
|
-
- edition-specific flavor verification
|
|
157
|
+
- edition-specific flavor, SSR site baseline, and project-asset verification
|
|
158
|
+
|
|
159
|
+
### SSR theme review reminder
|
|
160
|
+
|
|
161
|
+
If the frontend change is SSR theme-sensitive, apply this short review before finishing:
|
|
162
|
+
|
|
163
|
+
- detect the active edition marker and UI library before assuming SSR theme behavior
|
|
164
|
+
- do not assume Cabloy Basic and Cabloy Start use the same adapter-level SSR theme handoff
|
|
165
|
+
- in Web SSR without cookie-backed theme resolution, do not treat server reads of `$theme.dark`, `$theme.darkMode`, or `$token` as final browser truth
|
|
166
|
+
- keep theme-finalization logic inside the active theme handler or client boot path instead of duplicating it in page or component code
|
|
167
|
+
- verify both server handoff and client hydration behavior for the active adapter
|
|
158
168
|
|
|
159
169
|
### Optional backend-contract reminder
|
|
160
170
|
|
|
@@ -28,7 +28,7 @@ Interpretation:
|
|
|
28
28
|
- `__CABLOY_START__` present → this is Cabloy Start
|
|
29
29
|
- neither present → inspect the repo scripts and ask the user before making a strong edition-specific assumption
|
|
30
30
|
|
|
31
|
-
This matters most for frontend work, UI-
|
|
31
|
+
This matters most for frontend work, UI-layer assumptions, flavor names, suite/module availability, SSR site baselines, project assets, and edition-specific AI guidance.
|
|
32
32
|
|
|
33
33
|
## Step 2: Identify the task layer
|
|
34
34
|
|
|
@@ -61,7 +61,7 @@ Use the frontend path when the task is about:
|
|
|
61
61
|
|
|
62
62
|
- page, component, mock, bean
|
|
63
63
|
- SSR, Web, Admin, SPA
|
|
64
|
-
- UI-
|
|
64
|
+
- UI-layer-sensitive work
|
|
65
65
|
- OpenAPI SDK generation
|
|
66
66
|
- frontend refactors such as page params, page query, component props, or model helpers
|
|
67
67
|
|
|
@@ -236,19 +236,23 @@ When the task is frontend-sensitive or examples differ between editions, branch
|
|
|
236
236
|
|
|
237
237
|
Bias toward:
|
|
238
238
|
|
|
239
|
+
- the public framework/reference edition
|
|
239
240
|
- current public monorepo source
|
|
241
|
+
- the default `npm create cabloy` project route
|
|
240
242
|
- public docs examples
|
|
241
243
|
- the Basic repo marker
|
|
242
|
-
- current Basic frontend flavors and
|
|
244
|
+
- current Basic frontend flavors, module layout, and DaisyUI + Tailwind CSS UI assumptions
|
|
243
245
|
|
|
244
246
|
### Cabloy Start
|
|
245
247
|
|
|
246
248
|
Bias toward:
|
|
247
249
|
|
|
250
|
+
- the private commercial edition
|
|
248
251
|
- the Start repo marker
|
|
252
|
+
- the licensed private repository source
|
|
249
253
|
- Vuetify-sensitive examples
|
|
250
254
|
- Start-specific frontend flavor names
|
|
251
|
-
- Start-specific modules and private-
|
|
255
|
+
- Start-specific suites/modules, SSR site baselines, project assets, and licensed private-repo structure
|
|
252
256
|
|
|
253
257
|
Do not silently reuse Basic examples when Start-specific assumptions matter.
|
|
254
258
|
|
|
@@ -13,10 +13,11 @@ They prevent the most common category error in Cabloy AI work: assuming Cabloy B
|
|
|
13
13
|
|
|
14
14
|
That assumption is especially dangerous for:
|
|
15
15
|
|
|
16
|
-
- UI-
|
|
16
|
+
- UI-layer-sensitive examples
|
|
17
17
|
- frontend flavor names
|
|
18
18
|
- page/component workflows
|
|
19
|
-
- module availability
|
|
19
|
+
- suite/module availability
|
|
20
|
+
- SSR site baselines and project assets
|
|
20
21
|
- docs and skills that try to support both repos
|
|
21
22
|
|
|
22
23
|
## Secondary checks
|
|
@@ -34,6 +34,8 @@ jobs:
|
|
|
34
34
|
- name: install docs dependencies
|
|
35
35
|
run: pnpm --dir cabloy-docs install --frozen-lockfile
|
|
36
36
|
- name: build docs
|
|
37
|
+
env:
|
|
38
|
+
GA_MEASUREMENT_ID: ${{ vars.GA_MEASUREMENT_ID }}
|
|
37
39
|
run: pnpm --dir cabloy-docs docs:build
|
|
38
40
|
- name: setup pages
|
|
39
41
|
uses: actions/configure-pages@v5
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.1.53
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Update application functionality across core feature areas.
|
|
8
|
+
- Update configuration behavior and related integration points.
|
|
9
|
+
- Update theme configuration and controller handling.
|
|
10
|
+
|
|
11
|
+
### Improvements
|
|
12
|
+
|
|
13
|
+
- Remove the generated `$useLocale` helper.
|
|
14
|
+
- Refresh project configuration files and internal implementation details.
|
|
15
|
+
|
|
16
|
+
### Breaking Changes
|
|
17
|
+
|
|
18
|
+
- Rename the SSR cookie-disabled server flag and update related documentation.
|
|
19
|
+
|
|
20
|
+
## 5.1.52
|
|
21
|
+
|
|
22
|
+
### Features
|
|
23
|
+
|
|
24
|
+
- Add SSR memory diagnostic endpoints.
|
|
25
|
+
- Expand framework capabilities across SSR, controller, module, component, utility, and runtime integration areas.
|
|
26
|
+
- Add virtual decorator guidance to the AI documentation.
|
|
27
|
+
|
|
28
|
+
### Bug Fixes
|
|
29
|
+
|
|
30
|
+
- Correct runtime home paths in the documentation.
|
|
31
|
+
- Fix homepage scope badge layout in the documentation.
|
|
32
|
+
|
|
33
|
+
### Improvements
|
|
34
|
+
|
|
35
|
+
- Refine SSR internals and metadata handling.
|
|
36
|
+
- Polish controller and page base implementation details.
|
|
37
|
+
- Update monkey patching and runtime support code.
|
|
38
|
+
- Improve package metadata and lockfile consistency.
|
|
39
|
+
- Pass the GA measurement ID into the docs build pipeline.
|
|
40
|
+
- Add GA4 tracking support for the documentation site.
|
|
41
|
+
- Improve CLI, index, glossary, skill, and README documentation.
|
|
42
|
+
- Add and refine the Cabloy framework comparison and fullstack introduction content.
|
|
43
|
+
- Polish branding, wording, and AI vibe coding terminology across the docs.
|
|
44
|
+
|
|
3
45
|
## 5.1.51
|
|
4
46
|
|
|
5
47
|
### Features
|
package/CLAUDE.md
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
## Repository identity
|
|
4
4
|
|
|
5
|
-
This repository is **Cabloy Basic**, identified by the root marker file:
|
|
5
|
+
This repository is **Cabloy Basic**, the public framework/reference edition, identified by the root marker file:
|
|
6
6
|
|
|
7
7
|
- `__CABLOY_BASIC__`
|
|
8
8
|
|
|
9
|
-
A sibling repository named `cabloy-start` is a separate source repository and
|
|
9
|
+
A sibling repository named `cabloy-start` is the private commercial edition, delivered as a licensed separate source repository and identified by:
|
|
10
10
|
|
|
11
11
|
- `__CABLOY_START__`
|
|
12
12
|
|
|
13
|
-
Always detect the active edition before making UI-sensitive assumptions, choosing frontend examples,
|
|
13
|
+
Always detect the active edition before making UI-sensitive assumptions, choosing frontend examples, recommending module-specific workflows, or assuming the project creation path.
|
|
14
14
|
|
|
15
15
|
## Monorepo layout
|
|
16
16
|
|
|
@@ -43,7 +43,10 @@ Before inventing a custom implementation path:
|
|
|
43
43
|
|
|
44
44
|
- Prefer CLI-backed workflows over manual scaffolding whenever Vona or Zova already provides a generator, refactor, metadata, or verification command.
|
|
45
45
|
- Treat legacy docs as input material, not as unquestioned truth. When docs conflict with source code, prefer current source code.
|
|
46
|
-
- For frontend work, assume Cabloy Basic and Cabloy Start may diverge in UI
|
|
46
|
+
- For frontend work, assume Cabloy Basic and Cabloy Start share a frontend engineering layer but may diverge in UI layer, frontend flavors, suite/module availability, SSR site baselines, project assets, and generated outputs.
|
|
47
|
+
- For SSR theme-sensitive frontend work, detect the active edition marker and UI library before making assumptions. Cabloy Basic currently means DaisyUI + Tailwind CSS assumptions; Cabloy Start currently means Vuetify assumptions.
|
|
48
|
+
- In Web SSR without cookie-backed theme resolution, do not treat server reads of `$theme.dark`, `$theme.darkMode`, or `$token` as final browser truth. Keep theme-sensitive SSR branching hydration-tolerant or defer final theme-sensitive decisions to the client.
|
|
49
|
+
- Do not assume Cabloy Basic and Cabloy Start use the same adapter-level SSR theme handoff. Verify the active theme handler and client hydration path before changing SSR theme behavior.
|
|
47
50
|
- Reuse existing repo terminology: Cabloy, Vona, Zova, suite, module, bean, SSR, SPA, Web, Admin.
|
|
48
51
|
- For backend base-class placement, use the A / B1 / B2 rule from `cabloy-docs/ai/class-placement-rule.md`.
|
|
49
52
|
- Pure helper bases belong in `src/lib`; subclass-only bases should be evaluated case by case and often belong in `src/lib`.
|
package/README.md
CHANGED
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
[](https://github.com/cabloy/cabloy/blob/main/LICENSE)
|
|
4
4
|
[](https://www.npmjs.com/package/cabloy)
|
|
5
5
|
[](https://www.npmjs.com/package/cabloy)
|
|
6
|
-
[](https://
|
|
6
|
+
[](https://docs.cabloy.com)
|
|
7
7
|
[](https://cabloy.com)
|
|
8
8
|
|
|
9
9
|
Cabloy is a Node.js fullstack framework for AI vibe coding.
|
|
10
10
|
|
|
11
|
-
Use one framework
|
|
11
|
+
Use one fullstack framework instead of stitching together separate backend and frontend stacks.
|
|
12
12
|
|
|
13
|
-
With
|
|
13
|
+
With Vona, Zova, suite-based modules, and CLI-first workflows, Cabloy turns common scaffolding, metadata, refactors, and verification into explicit commands for faster, more accurate AI vibe coding.
|
|
14
14
|
|
|
15
|
-
[Documentation](https://
|
|
15
|
+
[Documentation](https://docs.cabloy.com) · [npm](https://www.npmjs.com/package/cabloy) · [Web Demo](https://cabloy.com) · [Admin Demo](https://cabloy.com/admin) · [GitHub](https://github.com/cabloy/cabloy)
|
|
16
16
|
|
|
17
17
|
## Get Started
|
|
18
18
|
|
|
@@ -38,16 +38,19 @@ Create a new Cabloy project:
|
|
|
38
38
|
npm create cabloy
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
The generated project already includes `CLAUDE.md` and the `.claude/` workspace assets. Open this project in Claude Code and start coding immediately with project-specific guidance.
|
|
41
|
+
The generated project already includes `CLAUDE.md` and the `.claude/` workspace assets. This path creates a Cabloy Basic project baseline. Open this project in Claude Code and start coding immediately with project-specific guidance.
|
|
42
|
+
|
|
43
|
+
For **Cabloy Start**, purchase access to the licensed private repository, clone `git@github.com:cabloy/cabloy-start.git`, and run `npm run init`. For the complete Start onboarding flow, read the [Cabloy Start](https://docs.cabloy.com/editions/cabloy-start) page.
|
|
42
44
|
|
|
43
45
|
Then continue with the framework docs:
|
|
44
46
|
|
|
45
|
-
- [Fullstack Quickstart](https://
|
|
46
|
-
- [Documentation](https://
|
|
47
|
-
- [Fullstack Introduction](https://
|
|
48
|
-
- [Backend Introduction](https://
|
|
49
|
-
- [Frontend Introduction](https://
|
|
50
|
-
- [Editions Overview](https://
|
|
47
|
+
- [Fullstack Quickstart](https://docs.cabloy.com/fullstack/quickstart)
|
|
48
|
+
- [Documentation](https://docs.cabloy.com)
|
|
49
|
+
- [Fullstack Introduction](https://docs.cabloy.com/fullstack/introduction)
|
|
50
|
+
- [Backend Introduction](https://docs.cabloy.com/backend/introduction)
|
|
51
|
+
- [Frontend Introduction](https://docs.cabloy.com/frontend/introduction)
|
|
52
|
+
- [Editions Overview](https://docs.cabloy.com/editions/overview)
|
|
53
|
+
- [Choosing Between Cabloy Basic and Cabloy Start](https://docs.cabloy.com/editions/choosing-between-basic-and-start)
|
|
51
54
|
|
|
52
55
|
To upgrade an existing Cabloy project:
|
|
53
56
|
|
|
@@ -57,11 +60,12 @@ npm run upgrade
|
|
|
57
60
|
|
|
58
61
|
## Highlights
|
|
59
62
|
|
|
60
|
-
- **One framework system** — build backend and frontend in one
|
|
61
|
-
- **Vona + Zova** — use aligned backend and frontend frameworks
|
|
62
|
-
- **
|
|
63
|
-
- **
|
|
64
|
-
- **
|
|
63
|
+
- **One framework system** — build backend and frontend in one fullstack architecture
|
|
64
|
+
- **Vona + Zova** — use aligned backend and frontend frameworks for code sharing, workflow reuse, and cross-stack consistency
|
|
65
|
+
- **Suite-based modular system** — organize capabilities as suites and modules so services, features, metadata, and tooling evolve in composable units
|
|
66
|
+
- **Multiple delivery modes** — deliver SSR, SPA, Web, and Admin applications with shared conventions across the stack
|
|
67
|
+
- **CLI-first workflows for AI vibe coding** — turn common scaffolding, metadata, refactors, and verification into explicit commands for faster, more accurate AI vibe coding
|
|
68
|
+
- **Monorepo-native development** — keep framework source, docs, and tooling aligned in one monorepo workflow
|
|
65
69
|
|
|
66
70
|
## Technology Stack
|
|
67
71
|
|
|
@@ -92,7 +96,16 @@ npm run upgrade
|
|
|
92
96
|
| TanStack Form | `^1.32.0` |
|
|
93
97
|
| TanStack Table | `^8.21.3` |
|
|
94
98
|
|
|
95
|
-
###
|
|
99
|
+
### Shared Frontend Engineering Layer
|
|
100
|
+
|
|
101
|
+
- Vue
|
|
102
|
+
- Vite
|
|
103
|
+
- Quasar tooling such as `quasar dev` and `quasar build`
|
|
104
|
+
- TanStack libraries where applicable
|
|
105
|
+
|
|
106
|
+
Quasar is used here for engineering tooling rather than as the edition UI component library.
|
|
107
|
+
|
|
108
|
+
### Edition-specific UI Layer
|
|
96
109
|
|
|
97
110
|
- **Cabloy Basic**: DaisyUI + Tailwind CSS
|
|
98
111
|
- **Cabloy Start**: Vuetify
|
|
@@ -113,14 +126,16 @@ npm run build
|
|
|
113
126
|
|
|
114
127
|
For more details, see:
|
|
115
128
|
|
|
116
|
-
- [
|
|
117
|
-
- [
|
|
118
|
-
- [
|
|
129
|
+
- [Editions Overview](https://docs.cabloy.com/editions/overview)
|
|
130
|
+
- [Choosing Between Cabloy Basic and Cabloy Start](https://docs.cabloy.com/editions/choosing-between-basic-and-start)
|
|
131
|
+
- [Repo Scripts](https://docs.cabloy.com/reference/repo-scripts)
|
|
132
|
+
- [Package Map](https://docs.cabloy.com/reference/package-map)
|
|
133
|
+
- [AI Development Introduction](https://docs.cabloy.com/ai/introduction)
|
|
119
134
|
|
|
120
135
|
Contribution guidelines:
|
|
121
136
|
|
|
122
137
|
- prefer CLI-backed workflows with `npm run vona` and `npm run zova`
|
|
123
|
-
- put user-facing and agent-facing guidance in [cabloy
|
|
138
|
+
- put user-facing and agent-facing guidance in [docs.cabloy.com](https://docs.cabloy.com)
|
|
124
139
|
- put maintainer rationale, architecture notes, and ADRs in [.docs-internal/](https://github.com/cabloy/cabloy/tree/main/.docs-internal)
|
|
125
140
|
- verify framework changes with the narrowest meaningful checks first, then shared root scripts when broader confidence is needed
|
|
126
141
|
|
|
@@ -2,6 +2,10 @@ import { defineConfig } from 'vitepress';
|
|
|
2
2
|
|
|
3
3
|
const editionsItems = [
|
|
4
4
|
{ text: 'Overview', link: '/editions/overview' },
|
|
5
|
+
{
|
|
6
|
+
text: 'Choosing Basic vs Start',
|
|
7
|
+
link: '/editions/choosing-between-basic-and-start',
|
|
8
|
+
},
|
|
5
9
|
{ text: 'Cabloy Basic', link: '/editions/cabloy-basic' },
|
|
6
10
|
{ text: 'Cabloy Start', link: '/editions/cabloy-start' },
|
|
7
11
|
{ text: 'Edition Detection', link: '/editions/detection' },
|
|
@@ -23,23 +27,94 @@ const aiItems = [
|
|
|
23
27
|
{ text: 'CLI for Agents', link: '/ai/cli-for-agents' },
|
|
24
28
|
{ text: 'Rules and Config', link: '/ai/rules-and-config' },
|
|
25
29
|
{ text: 'Edition Detection', link: '/ai/edition-detection' },
|
|
30
|
+
{ text: 'Edition Consistency Checklist', link: '/ai/edition-consistency-checklist' },
|
|
26
31
|
{ text: 'Verification', link: '/ai/verification' },
|
|
27
32
|
];
|
|
28
33
|
|
|
29
|
-
const
|
|
30
|
-
{
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
const fullstackGroups = [
|
|
35
|
+
{
|
|
36
|
+
text: 'Fullstack / Getting Started',
|
|
37
|
+
items: [
|
|
38
|
+
{ text: 'Introduction', link: '/fullstack/introduction' },
|
|
39
|
+
{ text: 'Quickstart', link: '/fullstack/quickstart' },
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
text: 'Tooling & Workflow',
|
|
44
|
+
items: [
|
|
45
|
+
{ text: 'CLI', link: '/fullstack/cli' },
|
|
46
|
+
{ text: 'VS Code Extensions', link: '/fullstack/vscode-extensions' },
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
text: 'Architecture & Integration',
|
|
51
|
+
items: [
|
|
52
|
+
{
|
|
53
|
+
text: 'Comparison with Other Frameworks',
|
|
54
|
+
link: '/fullstack/comparison-with-other-frameworks',
|
|
55
|
+
},
|
|
56
|
+
{ text: 'Vona + Zova Integration', link: '/fullstack/vona-zova-integration' },
|
|
57
|
+
{ text: 'Backend OpenAPI to Frontend SDK', link: '/fullstack/openapi-to-sdk' },
|
|
58
|
+
{
|
|
59
|
+
text: 'Frontend Metadata Back to Backend',
|
|
60
|
+
link: '/fullstack/frontend-metadata-to-backend',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
text: 'Edition Collaboration Differences',
|
|
64
|
+
link: '/fullstack/edition-collaboration-differences',
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
const referenceGroups = [
|
|
71
|
+
{
|
|
72
|
+
text: 'Reference / Workflow Entry',
|
|
73
|
+
items: [
|
|
74
|
+
{ text: 'Introduction', link: '/reference/introduction' },
|
|
75
|
+
{ text: 'Repo Scripts', link: '/reference/repo-scripts' },
|
|
76
|
+
{ text: 'CLI Reference', link: '/reference/cli-reference' },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
text: 'Structure & Lookup',
|
|
81
|
+
items: [
|
|
82
|
+
{ text: 'Package Map', link: '/reference/package-map' },
|
|
83
|
+
{ text: 'Backend Directory Structure', link: '/reference/backend-directory-structure' },
|
|
84
|
+
{ text: 'Frontend Directory Structure', link: '/reference/frontend-directory-structure' },
|
|
85
|
+
{ text: 'Glossary', link: '/reference/glossary' },
|
|
86
|
+
],
|
|
87
|
+
},
|
|
35
88
|
];
|
|
36
89
|
|
|
90
|
+
const GA_MEASUREMENT_ID = process.env.GA_MEASUREMENT_ID;
|
|
91
|
+
const gaHead = GA_MEASUREMENT_ID
|
|
92
|
+
? [
|
|
93
|
+
[
|
|
94
|
+
'script',
|
|
95
|
+
{
|
|
96
|
+
async: '',
|
|
97
|
+
src: `https://www.googletagmanager.com/gtag/js?id=${GA_MEASUREMENT_ID}`,
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
[
|
|
101
|
+
'script',
|
|
102
|
+
{},
|
|
103
|
+
`window.dataLayer = window.dataLayer || [];
|
|
104
|
+
function gtag(){dataLayer.push(arguments);}
|
|
105
|
+
gtag('js', new Date());
|
|
106
|
+
gtag('config', '${GA_MEASUREMENT_ID}');`,
|
|
107
|
+
],
|
|
108
|
+
]
|
|
109
|
+
: [];
|
|
110
|
+
|
|
37
111
|
export default defineConfig({
|
|
38
112
|
title: 'Cabloy',
|
|
39
113
|
description: 'Unified fullstack and AI-development documentation for the Cabloy monorepo',
|
|
40
114
|
lang: 'en-US',
|
|
41
115
|
base: '/',
|
|
42
116
|
ignoreDeadLinks: [/^https?:\/\/localhost/],
|
|
117
|
+
head: gaHead,
|
|
43
118
|
markdown: {
|
|
44
119
|
lineNumbers: true,
|
|
45
120
|
},
|
|
@@ -47,40 +122,27 @@ export default defineConfig({
|
|
|
47
122
|
nav: [
|
|
48
123
|
{ text: 'Home', link: '/' },
|
|
49
124
|
{ text: 'Fullstack', link: '/fullstack/introduction', activeMatch: '^/fullstack/' },
|
|
50
|
-
{ text: 'Backend', link: '/backend/introduction', activeMatch: '^/backend/' },
|
|
51
|
-
{ text: 'Frontend', link: '/frontend/introduction', activeMatch: '^/frontend/' },
|
|
125
|
+
{ text: 'Backend (Vona)', link: '/backend/introduction', activeMatch: '^/backend/' },
|
|
126
|
+
{ text: 'Frontend (Zova)', link: '/frontend/introduction', activeMatch: '^/frontend/' },
|
|
52
127
|
{ text: 'Editions', link: '/editions/overview', activeMatch: '^/editions/' },
|
|
53
128
|
{ text: 'AI Development', link: '/ai/introduction', activeMatch: '^/ai/' },
|
|
54
|
-
{ text: 'Reference', link: '/reference/
|
|
129
|
+
{ text: 'Reference', link: '/reference/introduction', activeMatch: '^/reference/' },
|
|
55
130
|
],
|
|
56
131
|
sidebar: {
|
|
57
|
-
'/fullstack/':
|
|
58
|
-
{
|
|
59
|
-
text: 'Fullstack',
|
|
60
|
-
items: [
|
|
61
|
-
{ text: 'Introduction', link: '/fullstack/introduction' },
|
|
62
|
-
{ text: 'Quickstart', link: '/fullstack/quickstart' },
|
|
63
|
-
{ text: 'Vona + Zova Integration', link: '/fullstack/vona-zova-integration' },
|
|
64
|
-
{ text: 'Backend OpenAPI to Frontend SDK', link: '/fullstack/openapi-to-sdk' },
|
|
65
|
-
{
|
|
66
|
-
text: 'Frontend Metadata Back to Backend',
|
|
67
|
-
link: '/fullstack/frontend-metadata-to-backend',
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
text: 'Edition Collaboration Differences',
|
|
71
|
-
link: '/fullstack/edition-collaboration-differences',
|
|
72
|
-
},
|
|
73
|
-
],
|
|
74
|
-
},
|
|
75
|
-
],
|
|
132
|
+
'/fullstack/': fullstackGroups,
|
|
76
133
|
'/backend/': [
|
|
77
134
|
{
|
|
78
|
-
text: 'Backend (Vona)',
|
|
135
|
+
text: 'Backend (Vona) / Getting Started',
|
|
79
136
|
items: [
|
|
80
137
|
{ text: 'Introduction', link: '/backend/introduction' },
|
|
81
138
|
{ text: 'Foundation', link: '/backend/foundation' },
|
|
82
139
|
{ text: 'Backend Essentials', link: '/backend/backend-essentials' },
|
|
83
140
|
{ text: 'Quickstart', link: '/backend/quickstart' },
|
|
141
|
+
],
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
text: 'Tooling & Runtime',
|
|
145
|
+
items: [
|
|
84
146
|
{ text: 'CLI', link: '/backend/cli' },
|
|
85
147
|
{ text: 'Scripts', link: '/backend/scripts' },
|
|
86
148
|
{ text: 'Runtime and Flavors', link: '/backend/runtime-and-flavors' },
|
|
@@ -90,18 +152,34 @@ export default defineConfig({
|
|
|
90
152
|
text: 'Multi-Instance and Instance Resolution',
|
|
91
153
|
link: '/backend/multi-instance-and-instance-resolution',
|
|
92
154
|
},
|
|
155
|
+
],
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
text: 'Security & Access',
|
|
159
|
+
items: [
|
|
93
160
|
{ text: 'Auth Guide', link: '/backend/auth-guide' },
|
|
94
161
|
{ text: 'Captcha Guide', link: '/backend/captcha-guide' },
|
|
95
162
|
{ text: 'User Access Guide', link: '/backend/user-access-guide' },
|
|
163
|
+
{ text: 'JWT Guide', link: '/backend/jwt-guide' },
|
|
164
|
+
{ text: 'Validation Guide', link: '/backend/validation-guide' },
|
|
165
|
+
],
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
text: 'Application Basics',
|
|
169
|
+
items: [
|
|
96
170
|
{ text: 'Menu Guide', link: '/backend/menu-guide' },
|
|
97
171
|
{ text: 'I18n Guide', link: '/backend/i18n-guide' },
|
|
98
172
|
{ text: 'Error Guide', link: '/backend/error-guide' },
|
|
99
|
-
{ text: 'JWT Guide', link: '/backend/jwt-guide' },
|
|
100
173
|
{ text: 'Event Guide', link: '/backend/event-guide' },
|
|
101
174
|
{ text: 'Logger Guide', link: '/backend/logger-guide' },
|
|
102
175
|
{ text: 'Upload Guide', link: '/backend/upload-guide' },
|
|
103
176
|
{ text: 'Mail Guide', link: '/backend/mail-guide' },
|
|
104
177
|
{ text: 'Serialization Guide', link: '/backend/serialization-guide' },
|
|
178
|
+
],
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
text: 'Core Programming Model',
|
|
182
|
+
items: [
|
|
105
183
|
{ text: 'AOP Overview', link: '/backend/aop-overview' },
|
|
106
184
|
{ text: 'Controller Guide', link: '/backend/controller-guide' },
|
|
107
185
|
{ text: 'Controller AOP Guide', link: '/backend/controller-aop-guide' },
|
|
@@ -111,10 +189,14 @@ export default defineConfig({
|
|
|
111
189
|
{ text: 'Model Guide', link: '/backend/model-guide' },
|
|
112
190
|
{ text: 'Entity Guide', link: '/backend/entity-guide' },
|
|
113
191
|
{ text: 'DTO Guide', link: '/backend/dto-guide' },
|
|
192
|
+
],
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
text: 'Data & CRUD',
|
|
196
|
+
items: [
|
|
114
197
|
{ text: 'CRUD Workflow', link: '/backend/crud-workflow' },
|
|
115
198
|
{ text: 'Migration and Changes', link: '/backend/migration-and-changes' },
|
|
116
199
|
{ text: 'Field Indexes', link: '/backend/field-indexes' },
|
|
117
|
-
{ text: 'Unit Testing', link: '/backend/unit-testing' },
|
|
118
200
|
{ text: 'ORM Guide', link: '/backend/orm-guide' },
|
|
119
201
|
{ text: 'ORM Configuration Guide', link: '/backend/orm-configuration-guide' },
|
|
120
202
|
{ text: 'ORM Select Guide', link: '/backend/orm-select-guide' },
|
|
@@ -122,6 +204,11 @@ export default defineConfig({
|
|
|
122
204
|
{ text: 'ORM Aggregate and Group Guide', link: '/backend/orm-aggregate-group-guide' },
|
|
123
205
|
{ text: 'Relations Guide', link: '/backend/relations-guide' },
|
|
124
206
|
{ text: 'Transaction Guide', link: '/backend/transaction-guide' },
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
text: 'Infrastructure & Distributed',
|
|
211
|
+
items: [
|
|
125
212
|
{ text: 'Cache Guide', link: '/backend/cache-guide' },
|
|
126
213
|
{
|
|
127
214
|
text: 'Multi-Database and Datasource Guide',
|
|
@@ -136,55 +223,100 @@ export default defineConfig({
|
|
|
136
223
|
{ text: 'Worker Guide', link: '/backend/worker-guide' },
|
|
137
224
|
{ text: 'Broadcast Guide', link: '/backend/broadcast-guide' },
|
|
138
225
|
{ text: 'Redlock Guide', link: '/backend/redlock-guide' },
|
|
139
|
-
|
|
226
|
+
],
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
text: 'API & Testing',
|
|
230
|
+
items: [
|
|
140
231
|
{ text: 'OpenAPI Guide', link: '/backend/openapi-guide' },
|
|
141
232
|
{ text: 'DTO Infer and Generation', link: '/backend/dto-infer-generation' },
|
|
233
|
+
{ text: 'Unit Testing', link: '/backend/unit-testing' },
|
|
142
234
|
],
|
|
143
235
|
},
|
|
144
236
|
],
|
|
145
237
|
'/frontend/': [
|
|
146
238
|
{
|
|
147
|
-
text: 'Frontend (Zova)',
|
|
239
|
+
text: 'Frontend (Zova) / Getting Started',
|
|
148
240
|
items: [
|
|
149
241
|
{ text: 'Introduction', link: '/frontend/introduction' },
|
|
150
242
|
{ text: 'Quickstart', link: '/frontend/quickstart' },
|
|
151
243
|
{ text: 'Foundation', link: '/frontend/foundation' },
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
text: 'Architecture & Modules',
|
|
248
|
+
items: [
|
|
152
249
|
{ text: 'IoC and Beans', link: '/frontend/ioc-and-beans' },
|
|
153
250
|
{ text: 'Modules and Suites', link: '/frontend/modules-and-suites' },
|
|
154
251
|
{ text: 'Module Scope', link: '/frontend/module-scope' },
|
|
252
|
+
{ text: 'Design Principles', link: '/frontend/design-principles' },
|
|
253
|
+
],
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
text: 'Environment & Startup',
|
|
257
|
+
items: [
|
|
155
258
|
{ text: 'Environment and Config Guide', link: '/frontend/environment-config-guide' },
|
|
156
259
|
{ text: 'App Startup Guide', link: '/frontend/app-startup-guide' },
|
|
157
260
|
{ text: 'System Startup Guide', link: '/frontend/system-startup-guide' },
|
|
261
|
+
],
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
text: 'Tooling',
|
|
265
|
+
items: [
|
|
266
|
+
{ text: 'CLI', link: '/frontend/cli' },
|
|
267
|
+
{ text: 'Scripts', link: '/frontend/scripts' },
|
|
268
|
+
{ text: 'Mock Guide', link: '/frontend/mock-guide' },
|
|
269
|
+
],
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
text: 'Pages & Routing',
|
|
273
|
+
items: [
|
|
158
274
|
{ text: 'Page Guide', link: '/frontend/page-guide' },
|
|
159
275
|
{ text: 'Page Query Guide', link: '/frontend/page-query-guide' },
|
|
160
276
|
{ text: 'Page Params Guide', link: '/frontend/page-params-guide' },
|
|
161
|
-
{ text: 'Page Route Guide', link: '/frontend/page-route-guide' },
|
|
162
277
|
{ text: 'Zod Guide', link: '/frontend/zod-guide' },
|
|
278
|
+
{ text: 'Page Route Guide', link: '/frontend/page-route-guide' },
|
|
163
279
|
{ text: 'Route Alias Guide', link: '/frontend/route-alias-guide' },
|
|
164
280
|
{ text: 'Navigation Guards Guide', link: '/frontend/navigation-guards-guide' },
|
|
281
|
+
],
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
text: 'Components & UI',
|
|
285
|
+
items: [
|
|
165
286
|
{ text: 'Component Guide', link: '/frontend/component-guide' },
|
|
166
287
|
{ text: 'Component Props Guide', link: '/frontend/component-props-guide' },
|
|
167
288
|
{ text: 'Component v-model Guide', link: '/frontend/component-v-model-guide' },
|
|
168
289
|
{ text: 'Generic Component Guide', link: '/frontend/generic-component-guide' },
|
|
169
|
-
{ text: 'CLI', link: '/frontend/cli' },
|
|
170
|
-
{ text: 'Scripts', link: '/frontend/scripts' },
|
|
171
|
-
{ text: 'Mock Guide', link: '/frontend/mock-guide' },
|
|
172
290
|
{ text: 'CSS-in-JS Guide', link: '/frontend/css-in-js-guide' },
|
|
173
291
|
{ text: 'Theme Guide', link: '/frontend/theme-guide' },
|
|
174
292
|
{ text: 'Icon Engine Guide', link: '/frontend/icon-engine-guide' },
|
|
293
|
+
],
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
text: 'Data & State',
|
|
297
|
+
items: [
|
|
175
298
|
{ text: 'Server Data', link: '/frontend/server-data' },
|
|
176
299
|
{ text: 'API Guide', link: '/frontend/api-guide' },
|
|
177
300
|
{ text: 'Model Architecture', link: '/frontend/model-architecture' },
|
|
178
301
|
{ text: 'Model State Guide', link: '/frontend/model-state-guide' },
|
|
302
|
+
],
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
text: 'API Contract & SDK',
|
|
306
|
+
items: [
|
|
179
307
|
{ text: 'OpenAPI SDK Guide', link: '/frontend/openapi-sdk-guide' },
|
|
180
308
|
{ text: 'API Schema Guide', link: '/frontend/api-schema-guide' },
|
|
181
309
|
{ text: 'SDK Guide', link: '/frontend/sdk-guide' },
|
|
310
|
+
],
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
text: 'SSR',
|
|
314
|
+
items: [
|
|
182
315
|
{ text: 'SSR Overview', link: '/frontend/ssr-overview' },
|
|
183
316
|
{ text: 'SSR Init Data', link: '/frontend/ssr-init-data' },
|
|
184
317
|
{ text: 'SSR ClientOnly', link: '/frontend/ssr-client-only' },
|
|
185
318
|
{ text: 'SSR SEO Meta', link: '/frontend/ssr-seo-meta' },
|
|
186
319
|
{ text: 'SSR Env', link: '/frontend/ssr-env' },
|
|
187
|
-
{ text: 'Design Principles', link: '/frontend/design-principles' },
|
|
188
320
|
],
|
|
189
321
|
},
|
|
190
322
|
],
|
|
@@ -200,12 +332,7 @@ export default defineConfig({
|
|
|
200
332
|
items: aiItems,
|
|
201
333
|
},
|
|
202
334
|
],
|
|
203
|
-
'/reference/':
|
|
204
|
-
{
|
|
205
|
-
text: 'Reference',
|
|
206
|
-
items: referenceItems,
|
|
207
|
-
},
|
|
208
|
-
],
|
|
335
|
+
'/reference/': referenceGroups,
|
|
209
336
|
},
|
|
210
337
|
socialLinks: [{ icon: 'github', link: 'https://github.com/cabloy/cabloy' }],
|
|
211
338
|
search: {
|
|
@@ -135,4 +135,5 @@ Read these pages together:
|
|
|
135
135
|
- [Backend Foundation](/backend/foundation)
|
|
136
136
|
- [Service Guide](/backend/service-guide)
|
|
137
137
|
- [Global Bean Lookup](/ai/global-bean-lookup)
|
|
138
|
+
- [Virtual Decorator Guidance](/ai/virtual-decorator-guidance)
|
|
138
139
|
- [Docs, Skills, Rules, and CLI Mapping](/ai/docs-skills-rules-mapping)
|
|
@@ -53,4 +53,4 @@ Typical use cases:
|
|
|
53
53
|
|
|
54
54
|
## Edition-aware CLI usage
|
|
55
55
|
|
|
56
|
-
The command families are shared, but examples and generated targets may differ between Cabloy Basic and Cabloy Start. Detect the edition before recommending a frontend-specific example.
|
|
56
|
+
The command families are shared, but examples and generated targets may differ between Cabloy Basic and Cabloy Start because the editions can diverge in UI layer, frontend flavors, suites/modules, SSR site baselines, and project assets. Detect the edition before recommending a frontend-specific example.
|