cabloy 5.1.59 → 5.1.61
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/hooks/contract-loop-gate.ts +296 -0
- package/.claude/settings.json +16 -0
- package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -0
- package/.claude/skills/cabloy-contract-loop/SKILL.md +103 -14
- package/.claude/skills/cabloy-contract-loop/references/contract-loop-map.md +126 -12
- package/.claude/skills/cabloy-contract-loop/references/resource-custom-state-pattern.md +148 -0
- package/.claude/skills/cabloy-contract-loop/references/verification-checklist.md +49 -13
- package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +11 -0
- package/.claude/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +2 -0
- package/.claude/skills/cabloy-module-removal/SKILL.md +144 -0
- package/.claude/skills/cabloy-resource-field-update/SKILL.md +274 -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/.claude/skills/cabloy-zova-source-reading/SKILL.md +221 -0
- package/.claude/skills/cabloy-zova-source-reading/references/analysis-modes.md +91 -0
- package/.claude/skills/cabloy-zova-source-reading/references/core-reading-paths.md +117 -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 +52 -0
- package/CLAUDE.md +12 -0
- package/README.md +15 -0
- package/cabloy-docs/.vitepress/config.mjs +89 -0
- package/cabloy-docs/ai/class-placement-rule.md +2 -0
- package/cabloy-docs/ai/cli-to-skill-map.md +14 -0
- package/cabloy-docs/ai/docs-skills-rules-mapping.md +14 -0
- package/cabloy-docs/ai/future-skill-roadmap.md +27 -9
- package/cabloy-docs/ai/introduction.md +1 -0
- package/cabloy-docs/ai/playbook-backend-module.md +6 -0
- package/cabloy-docs/ai/playbook-module-removal.md +164 -0
- package/cabloy-docs/ai/skills.md +11 -0
- package/cabloy-docs/backend/bean-scene-authoring.md +350 -0
- package/cabloy-docs/backend/cli.md +26 -1
- package/cabloy-docs/backend/dto-guide.md +6 -0
- package/cabloy-docs/backend/entity-guide.md +18 -0
- package/cabloy-docs/backend/foundation.md +28 -3
- package/cabloy-docs/backend/introduction.md +10 -0
- package/cabloy-docs/backend/serialization-guide.md +10 -0
- package/cabloy-docs/backend/service-guide.md +2 -0
- package/cabloy-docs/backend/status-guide.md +271 -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/api-guide.md +2 -0
- package/cabloy-docs/frontend/bean-scene-authoring.md +374 -0
- package/cabloy-docs/frontend/behavior-guide.md +449 -0
- package/cabloy-docs/frontend/cli.md +24 -0
- package/cabloy-docs/frontend/command-scene-authoring.md +495 -0
- package/cabloy-docs/frontend/design-principles.md +6 -0
- package/cabloy-docs/frontend/fetch-interceptor-guide.md +440 -0
- package/cabloy-docs/frontend/form-guide.md +795 -0
- package/cabloy-docs/frontend/foundation.md +29 -0
- package/cabloy-docs/frontend/introduction.md +17 -1
- package/cabloy-docs/frontend/ioc-and-beans.md +16 -9
- package/cabloy-docs/frontend/mock-guide.md +1 -0
- package/cabloy-docs/frontend/model-architecture.md +252 -39
- package/cabloy-docs/frontend/model-resource-best-practices.md +379 -0
- package/cabloy-docs/frontend/model-resource-cookbook.md +505 -0
- package/cabloy-docs/frontend/model-resource-owner-pattern.md +382 -0
- package/cabloy-docs/frontend/model-resource-usage-guide.md +318 -0
- package/cabloy-docs/frontend/model-state-guide.md +366 -13
- package/cabloy-docs/frontend/openapi-sdk-guide.md +5 -2
- package/cabloy-docs/frontend/page-guide.md +6 -0
- package/cabloy-docs/frontend/quickstart.md +4 -0
- package/cabloy-docs/frontend/reading-zova-for-vue-developers.md +266 -0
- 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/server-data.md +2 -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/frontend/zova-form-source-reading-map.md +295 -0
- package/cabloy-docs/frontend/zova-form-under-the-hood.md +556 -0
- package/cabloy-docs/frontend/zova-reactivity-under-the-hood.md +320 -0
- package/cabloy-docs/frontend/zova-source-reading-map.md +327 -0
- package/cabloy-docs/frontend/zova-vs-vue3-comparison.md +308 -0
- package/cabloy-docs/fullstack/contract-loop-playbook.md +350 -0
- package/cabloy-docs/fullstack/framework-performance.md +3 -3
- package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +44 -1
- package/cabloy-docs/fullstack/introduction.md +40 -0
- package/cabloy-docs/fullstack/openapi-to-sdk.md +19 -9
- 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 +144 -0
- package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +146 -0
- package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +170 -0
- package/cabloy-docs/fullstack/tutorials-overview.md +192 -0
- package/cabloy-docs/index.md +4 -3
- package/cabloy-docs/reference/bean-scene-boilerplates.md +75 -0
- package/cabloy-docs/reference/cli-reference.md +2 -0
- package/package.json +7 -2
- package/scripts/initTestData.ts +25 -0
- package/scripts/upgrade.ts +17 -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 +226 -1091
- 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/cli/templates/openapi/config/boilerplate/module/openapi.config.ts +6 -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/bean/cli.openapi.generate.ts +34 -4
- 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 +282 -1311
- 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,91 @@
|
|
|
1
|
+
# Analysis Modes
|
|
2
|
+
|
|
3
|
+
Use this reference to choose the shortest correct analysis posture before reading Zova source deeply.
|
|
4
|
+
|
|
5
|
+
## Mode A: source-location mode
|
|
6
|
+
|
|
7
|
+
Use this mode when the user is mainly asking:
|
|
8
|
+
|
|
9
|
+
- where should I start reading?
|
|
10
|
+
- which files matter?
|
|
11
|
+
- what order should I read the source in?
|
|
12
|
+
- where is this implemented?
|
|
13
|
+
|
|
14
|
+
### Workflow
|
|
15
|
+
|
|
16
|
+
1. detect the active edition if UI-sensitive assumptions might matter
|
|
17
|
+
2. start from the public frontend docs first
|
|
18
|
+
3. pick the smallest matching thread from `cabloy-docs/frontend/zova-source-reading-map.md`
|
|
19
|
+
4. cite the initial source files in the recommended reading order
|
|
20
|
+
5. stop before tracing deeper runtime layers unless the user also wants runtime-flow analysis
|
|
21
|
+
|
|
22
|
+
### Output emphasis
|
|
23
|
+
|
|
24
|
+
- reading order
|
|
25
|
+
- key file paths
|
|
26
|
+
- why those files are the right starting points
|
|
27
|
+
|
|
28
|
+
## Mode B: runtime-flow mode
|
|
29
|
+
|
|
30
|
+
Use this mode when the user is mainly asking:
|
|
31
|
+
|
|
32
|
+
- how does this work internally?
|
|
33
|
+
- why is this reactive?
|
|
34
|
+
- where does this controller/page/component behavior come from?
|
|
35
|
+
- how does render, route state, or lifecycle enter the runtime?
|
|
36
|
+
|
|
37
|
+
### Workflow
|
|
38
|
+
|
|
39
|
+
1. read the public Zova-native explanation docs first:
|
|
40
|
+
- `reading-zova-for-vue-developers.md`
|
|
41
|
+
- `zova-reactivity-under-the-hood.md`
|
|
42
|
+
2. identify the concrete thread:
|
|
43
|
+
- page controller
|
|
44
|
+
- component controller
|
|
45
|
+
- route/state
|
|
46
|
+
- model
|
|
47
|
+
- behavior
|
|
48
|
+
- SSR
|
|
49
|
+
3. trace the smallest current-source path that confirms the runtime behavior
|
|
50
|
+
4. distinguish source-confirmed behavior from interpretation
|
|
51
|
+
5. only after the Zova-native explanation is clear, add Vue analogy if helpful
|
|
52
|
+
|
|
53
|
+
### Output emphasis
|
|
54
|
+
|
|
55
|
+
- entrypoint
|
|
56
|
+
- intermediate runtime files
|
|
57
|
+
- what triggers the behavior
|
|
58
|
+
- what is source-confirmed
|
|
59
|
+
|
|
60
|
+
## Mode C: Vue-vs-Zova comparison mode
|
|
61
|
+
|
|
62
|
+
Use this mode when the user is mainly asking:
|
|
63
|
+
|
|
64
|
+
- how should I understand this relative to Vue 3?
|
|
65
|
+
- is this just Vue with a different syntax?
|
|
66
|
+
- what is the Zova way here?
|
|
67
|
+
|
|
68
|
+
### Workflow
|
|
69
|
+
|
|
70
|
+
1. explain the Zova-native architectural role first
|
|
71
|
+
2. identify which public Zova doc best defines that role
|
|
72
|
+
3. if needed, trace one representative source path to confirm the runtime grounding
|
|
73
|
+
4. only then provide Vue analogies as approximate translations
|
|
74
|
+
5. explicitly avoid flattening Zova back into generic Vue habits
|
|
75
|
+
|
|
76
|
+
### Output emphasis
|
|
77
|
+
|
|
78
|
+
- Zova-native role
|
|
79
|
+
- closest Vue analogy
|
|
80
|
+
- what is genuinely shared underneath
|
|
81
|
+
- what changes at the authoring-model level
|
|
82
|
+
|
|
83
|
+
## Combined requests
|
|
84
|
+
|
|
85
|
+
If a request spans multiple modes, answer in this order:
|
|
86
|
+
|
|
87
|
+
1. source-location mode
|
|
88
|
+
2. runtime-flow mode
|
|
89
|
+
3. Vue-vs-Zova comparison mode
|
|
90
|
+
|
|
91
|
+
This keeps the explanation anchored in the real source path before analogy work begins.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Core Reading Paths
|
|
2
|
+
|
|
3
|
+
Use this reference to choose the shortest source path after the analysis mode is known.
|
|
4
|
+
|
|
5
|
+
## Page controller and page reactivity
|
|
6
|
+
|
|
7
|
+
Read in this order:
|
|
8
|
+
|
|
9
|
+
1. the concrete page controller source
|
|
10
|
+
2. `zova-core/src/composables/useController.ts`
|
|
11
|
+
3. `zova-core/src/bean/beanContainer.ts`
|
|
12
|
+
4. `zova-core/src/bean/beanBase.ts`
|
|
13
|
+
5. `zova-core/src/bean/beanControllerPageBase.ts`
|
|
14
|
+
6. `zova-core/src/core/context/component.ts`
|
|
15
|
+
7. router integration files such as `a-router/src/monkey.ts`
|
|
16
|
+
|
|
17
|
+
Use when the question is about:
|
|
18
|
+
|
|
19
|
+
- plain controller fields
|
|
20
|
+
- `$computed`
|
|
21
|
+
- `$params` / `$query`
|
|
22
|
+
- page render flow
|
|
23
|
+
|
|
24
|
+
## Component controller and wrapper path
|
|
25
|
+
|
|
26
|
+
Read in this order:
|
|
27
|
+
|
|
28
|
+
1. representative wrapper metadata under `src/.metadata/component/`
|
|
29
|
+
2. `zova-core/src/composables/useController.ts`
|
|
30
|
+
3. `zova-core/src/bean/beanControllerBase.ts`
|
|
31
|
+
4. `zova-core/src/core/context/component.ts`
|
|
32
|
+
5. the concrete component controller source
|
|
33
|
+
|
|
34
|
+
Use when the question is about:
|
|
35
|
+
|
|
36
|
+
- wrapper components
|
|
37
|
+
- `controllerRef`
|
|
38
|
+
- component-local controller behavior
|
|
39
|
+
|
|
40
|
+
## Bean lifecycle and helper API path
|
|
41
|
+
|
|
42
|
+
Read in this order:
|
|
43
|
+
|
|
44
|
+
1. `zova-core/src/bean/beanBase.ts`
|
|
45
|
+
2. `zova-core/src/bean/beanBaseSimple.ts`
|
|
46
|
+
3. `zova-core/src/bean/beanContainer.ts`
|
|
47
|
+
4. `zova-core/src/core/context/util.ts`
|
|
48
|
+
|
|
49
|
+
Use when the question is about:
|
|
50
|
+
|
|
51
|
+
- `__init__`
|
|
52
|
+
- `__dispose__`
|
|
53
|
+
- `$watch`
|
|
54
|
+
- `$toRef`
|
|
55
|
+
- instance scope
|
|
56
|
+
|
|
57
|
+
## Route and page-shell path
|
|
58
|
+
|
|
59
|
+
Read in this order:
|
|
60
|
+
|
|
61
|
+
1. the local `routes.ts`
|
|
62
|
+
2. `a-router/src/monkey.ts`
|
|
63
|
+
3. router utility files
|
|
64
|
+
4. page schema sources
|
|
65
|
+
5. `BeanControllerPageBase`
|
|
66
|
+
|
|
67
|
+
Use when the question is about:
|
|
68
|
+
|
|
69
|
+
- route records
|
|
70
|
+
- params/query parsing
|
|
71
|
+
- layout shell implications
|
|
72
|
+
- route-aware controller state
|
|
73
|
+
|
|
74
|
+
## Model/state ownership path
|
|
75
|
+
|
|
76
|
+
Read in this order:
|
|
77
|
+
|
|
78
|
+
1. the relevant model bean
|
|
79
|
+
2. framework model state helper files
|
|
80
|
+
3. representative built-in model beans
|
|
81
|
+
4. consuming page/controller/service code
|
|
82
|
+
|
|
83
|
+
Use when the question is about:
|
|
84
|
+
|
|
85
|
+
- model-owned state
|
|
86
|
+
- cache-oriented state
|
|
87
|
+
- async vs sync state ownership
|
|
88
|
+
|
|
89
|
+
## Behavior path
|
|
90
|
+
|
|
91
|
+
Read in this order:
|
|
92
|
+
|
|
93
|
+
1. the public behavior wrapper/controller path
|
|
94
|
+
2. the concrete behavior bean
|
|
95
|
+
3. the behavior composer/service files
|
|
96
|
+
4. host-scoped injected dependencies
|
|
97
|
+
|
|
98
|
+
Use when the question is about:
|
|
99
|
+
|
|
100
|
+
- render-time interception
|
|
101
|
+
- behavior composition
|
|
102
|
+
- Behavior vs Component vs Helper
|
|
103
|
+
|
|
104
|
+
## SSR runtime path
|
|
105
|
+
|
|
106
|
+
Read in this order:
|
|
107
|
+
|
|
108
|
+
1. the SSR site or bundle entry
|
|
109
|
+
2. SSR runtime/context files in `zova-core`
|
|
110
|
+
3. relevant page/controller/model code
|
|
111
|
+
4. Vona SSR handoff layer if needed
|
|
112
|
+
|
|
113
|
+
Use when the question is about:
|
|
114
|
+
|
|
115
|
+
- SSR entry
|
|
116
|
+
- hydration handoff
|
|
117
|
+
- whether the bug belongs to Vona or Zova
|
|
@@ -10,6 +10,8 @@ jobs:
|
|
|
10
10
|
matrix:
|
|
11
11
|
node-version: [24]
|
|
12
12
|
runs-on: ubuntu-latest
|
|
13
|
+
env:
|
|
14
|
+
PNPM_CONFIG_MINIMUM_RELEASE_AGE: 0
|
|
13
15
|
services:
|
|
14
16
|
redis:
|
|
15
17
|
image: redis:latest
|
|
@@ -25,11 +27,11 @@ jobs:
|
|
|
25
27
|
version: 11.5.2
|
|
26
28
|
- name: init
|
|
27
29
|
run: npm run init
|
|
28
|
-
- run: npm run vona :create:module demo-
|
|
30
|
+
- run: npm run vona :create:module demo-student2 -- --suite --ci
|
|
29
31
|
working-directory: vona
|
|
30
32
|
- run: npm run vona :tools:deps
|
|
31
33
|
working-directory: vona
|
|
32
|
-
- run: npm run vona :tools:crud
|
|
34
|
+
- run: npm run vona :tools:crud student2 -- --module=demo-student2
|
|
33
35
|
working-directory: vona
|
|
34
36
|
- run: npm run test
|
|
35
37
|
working-directory: vona
|
package/.gitignore
CHANGED
|
@@ -62,7 +62,6 @@ zova/.quasar
|
|
|
62
62
|
**/.vitepress/cache
|
|
63
63
|
**/.rollup.cache
|
|
64
64
|
**/.temp-dynamic-*
|
|
65
|
-
/.cabloy-version
|
|
66
65
|
vona/package.json
|
|
67
66
|
zova/package.json
|
|
68
67
|
vona/docker-compose.yml
|
|
@@ -76,6 +75,3 @@ vona/src/suite/cabloy-basic/modules/basic-siteadmin/assets/site
|
|
|
76
75
|
vona/src/suite/cabloy-basic/modules/basic-siteadmin/zovaRest
|
|
77
76
|
vona/src/suite/cabloy-basic/modules/basic-siteweb/assets/site
|
|
78
77
|
vona/src/suite/cabloy-basic/modules/basic-siteweb/zovaRest
|
|
79
|
-
|
|
80
|
-
/vona/src/module/demo-student
|
|
81
|
-
/zova/src/module/demo-student
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,57 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.1.61
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Enforce explicit OpenAPI operation filters.
|
|
8
|
+
- Remove the demo-student module and document the module-removal workflow.
|
|
9
|
+
- Add a mobile field to students and document serializer guidance.
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
- Decouple test data initialization from application initialization.
|
|
14
|
+
- Refresh the student summary after updates.
|
|
15
|
+
|
|
16
|
+
### Improvements
|
|
17
|
+
|
|
18
|
+
- Migrate the contract-loop hook to TypeScript.
|
|
19
|
+
- Harden and simplify contract-loop guidance and gate behavior.
|
|
20
|
+
- Add Zova Form documentation and navigation.
|
|
21
|
+
- Refine ModelResource guidance and examples.
|
|
22
|
+
- Add Zova command scene, fetch interceptor, frontend reading, and Status architecture guides.
|
|
23
|
+
- Update backend contract-sharing tutorial and related skill documentation.
|
|
24
|
+
|
|
25
|
+
## 5.1.60
|
|
26
|
+
|
|
27
|
+
### Features
|
|
28
|
+
|
|
29
|
+
- Add a mobile field to the demo-student example.
|
|
30
|
+
- Add demo-student summary and force-delete flows.
|
|
31
|
+
- Add a level renderer workflow to the demo-student example.
|
|
32
|
+
- Initialize test data automatically after setup.
|
|
33
|
+
- Refine router tab insertion order.
|
|
34
|
+
|
|
35
|
+
### Improvements
|
|
36
|
+
|
|
37
|
+
- Add SSR architecture and workflow guides.
|
|
38
|
+
- Add a Web Socket documentation set.
|
|
39
|
+
- Add a Zova Behavior guide.
|
|
40
|
+
- Add router tabs documentation.
|
|
41
|
+
- Add advanced bean scene authoring guides and document boilerplate variants.
|
|
42
|
+
- Add a fullstack quick start tutorial series and document core fullstack principles.
|
|
43
|
+
- Refactor the fullstack AI tutorial series and streamline quick start guidance.
|
|
44
|
+
- Clarify helper placement and strengthen contract loop examples with reusable patterns.
|
|
45
|
+
- Simplify and polish tutorial prompts, verification steps, and user workflow guidance.
|
|
46
|
+
- Unify resource-owned custom item state handling.
|
|
47
|
+
- Update `tmp` to `0.2.7` and `tar` to `7.5.16`.
|
|
48
|
+
- Disable `pnpm` `minimumReleaseAge` in CI workflows.
|
|
49
|
+
|
|
50
|
+
### Bug Fixes
|
|
51
|
+
|
|
52
|
+
- Make contract loop examples more resilient.
|
|
53
|
+
- Refine select placeholder guidance.
|
|
54
|
+
|
|
3
55
|
## 5.1.59
|
|
4
56
|
|
|
5
57
|
### Features
|
package/CLAUDE.md
CHANGED
|
@@ -42,8 +42,18 @@ Before inventing a custom implementation path:
|
|
|
42
42
|
## AI development rules
|
|
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
|
+
- The Cabloy contract-loop model applies to both Cabloy Basic and Cabloy Start; detect the edition to choose commands and output paths, not to redefine the workflow model.
|
|
46
|
+
- Treat contract-loop work as one of four branches: forward chain, reverse chain, consumer drift, or local dependency drift.
|
|
47
|
+
- For the forward chain, change backend contract truth first and regenerate frontend consumers rather than hand-patching them.
|
|
48
|
+
- After forward regeneration, keep frontend follow-up thin: prefer semantic model facades and reuse the existing resource-owner when the custom API still belongs to the same resource.
|
|
49
|
+
- For the reverse chain, when Vona consumes newly added or changed Zova Admin render/action/metadata, always run `npm run build:zova:admin` before `npm run deps:vona`. Do not treat `build:rest:cabloyBasicAdmin` alone as sufficient, because the Admin JS bundle and rest output must move together.
|
|
50
|
+
- If generated artifacts already contain the expected changes but consumers still behave stale, suspect local dependency drift before making more source edits.
|
|
51
|
+
- For Cabloy Start, apply the same reverse-chain logic but resolve the Start-specific flavor names and generated-output paths from the active Start repo before recommending commands.
|
|
45
52
|
- Treat legacy docs as input material, not as unquestioned truth. When docs conflict with source code, prefer current source code.
|
|
46
53
|
- 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.
|
|
54
|
+
- For Zova frontend analysis, do not default to generic Vue reinterpretation first. Read the code through Zova’s controller / bean / IoC architecture before mapping it to Vue concepts.
|
|
55
|
+
- For Zova source-reading or Vue-vs-Zova explanation tasks, start from the frontend reading guides and source-reading map in `cabloy-docs/frontend/` before doing framework-neutral reinterpretation.
|
|
56
|
+
- Keep repo-wide AI rules in `CLAUDE.md` short and durable; put branching Zova analysis workflows in `.claude/skills/`.
|
|
47
57
|
- 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
58
|
- 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
59
|
- 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.
|
|
@@ -54,9 +64,11 @@ Before inventing a custom implementation path:
|
|
|
54
64
|
- Service-scene runtime-anchor bases that should not register in `IBeanRecordGeneral` should prefer the `src/service/*_.ts` form.
|
|
55
65
|
- `src/bean` defines the global shorthand surface; classes that should not appear in `IBeanRecordGlobal` should move to `src/lib` or `src/service` rather than being filtered by `@Virtual()`.
|
|
56
66
|
- When backend code references `this.bean.xxx`, `ctx.bean.xxx`, or `app.bean.xxx`, use `IBeanRecordGlobal` and module `src/.metadata/index.ts` as the first static lookup surface; use `IBeanRecordGeneral` or `src/service` only when the target is not a global shorthand.
|
|
67
|
+
- When adding a persisted field to an existing backend resource, ask the user whether `vonaModule.fileVersion` should be incremented before changing `meta.version.ts` or the module schema path. If yes, add a new migration version and bump `fileVersion`. If no, keep the current `fileVersion` and fold the schema change into the current version path. Do not assume the versioning strategy without confirmation.
|
|
57
68
|
|
|
58
69
|
## Verification expectations
|
|
59
70
|
|
|
60
71
|
- For docs changes: run the docs build and verify links/navigation where practical.
|
|
61
72
|
- For code-generation or workflow guidance changes: verify that the referenced scripts and command families still exist.
|
|
62
73
|
- For code changes: prefer the narrowest meaningful verification first, then use shared root scripts when broader confidence is needed.
|
|
74
|
+
- Any change to `meta.version.ts` requires running `npm run test` so the test database is reinitialized and schema/data consistency issues surface early.
|
package/README.md
CHANGED
|
@@ -14,6 +14,21 @@ With Vona, Zova, suite-based modules, and CLI-first workflows, Cabloy turns comm
|
|
|
14
14
|
|
|
15
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
|
+
## Fullstack Principles
|
|
18
|
+
|
|
19
|
+
Cabloy’s fullstack model is built around two core principles:
|
|
20
|
+
|
|
21
|
+
1. **Frontend build output participates directly in backend SSR**
|
|
22
|
+
- Zova owns the frontend application source
|
|
23
|
+
- the generated frontend bundle and SSR-related artifacts are consumed by the Vona-side SSR flow
|
|
24
|
+
- backend rendering and frontend hydration stay on one coordinated delivery path
|
|
25
|
+
|
|
26
|
+
2. **Type information flows in both directions**
|
|
27
|
+
- **Backend -> Frontend**: Vona emits Swagger/OpenAPI contracts that Zova can use to generate SDKs and related schema-aware helpers
|
|
28
|
+
- **Frontend -> Backend**: Zova generates structural metadata and typing surfaces such as routes, components, and icons that can improve backend-side tooling and type hints
|
|
29
|
+
|
|
30
|
+
For the complete explanation, see [Fullstack Introduction](https://docs.cabloy.com/fullstack/introduction), [Vona + Zova Integration](https://docs.cabloy.com/fullstack/vona-zova-integration), [Backend OpenAPI to Frontend SDK](https://docs.cabloy.com/fullstack/openapi-to-sdk), and [Frontend Metadata Back to Backend](https://docs.cabloy.com/fullstack/frontend-metadata-to-backend).
|
|
31
|
+
|
|
17
32
|
## Get Started
|
|
18
33
|
|
|
19
34
|
### Prerequisites
|
|
@@ -23,6 +23,7 @@ const aiItems = [
|
|
|
23
23
|
{ text: 'Playbook: Backend Module', link: '/ai/playbook-backend-module' },
|
|
24
24
|
{ text: 'Playbook: Frontend Page', link: '/ai/playbook-frontend-page' },
|
|
25
25
|
{ text: 'Playbook: Contract Regeneration', link: '/ai/playbook-contract-regeneration' },
|
|
26
|
+
{ text: 'Playbook: Module Removal', link: '/ai/playbook-module-removal' },
|
|
26
27
|
{ text: 'Playbook: Metadata Refresh', link: '/ai/playbook-metadata-refresh' },
|
|
27
28
|
{ text: 'CLI for Agents', link: '/ai/cli-for-agents' },
|
|
28
29
|
{ text: 'Rules and Config', link: '/ai/rules-and-config' },
|
|
@@ -39,6 +40,30 @@ const fullstackGroups = [
|
|
|
39
40
|
{ text: 'Quickstart', link: '/fullstack/quickstart' },
|
|
40
41
|
],
|
|
41
42
|
},
|
|
43
|
+
{
|
|
44
|
+
text: 'Fullstack / Tutorials',
|
|
45
|
+
items: [
|
|
46
|
+
{ text: 'Tutorials Overview', link: '/fullstack/tutorials-overview' },
|
|
47
|
+
{ text: 'Tutorial 1: First Module', link: '/fullstack/tutorial-1-first-module' },
|
|
48
|
+
{ text: 'Tutorial 2: First CRUD', link: '/fullstack/tutorial-2-first-crud' },
|
|
49
|
+
{
|
|
50
|
+
text: 'Tutorial 3: Frontend Metadata Sharing',
|
|
51
|
+
link: '/fullstack/tutorial-3-frontend-metadata-sharing',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
text: 'Tutorial 4: Custom Form/Table Renderers for Level',
|
|
55
|
+
link: '/fullstack/tutorial-4-custom-level-renderers',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
text: 'Tutorial 5: Backend Contract Sharing',
|
|
59
|
+
link: '/fullstack/tutorial-5-backend-contract-sharing',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
text: 'Tutorial 6: One Contract Surface, Four Uses',
|
|
63
|
+
link: '/fullstack/tutorial-6-one-contract-four-uses',
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
},
|
|
42
67
|
{
|
|
43
68
|
text: 'Tooling & Workflow',
|
|
44
69
|
items: [
|
|
@@ -55,6 +80,7 @@ const fullstackGroups = [
|
|
|
55
80
|
},
|
|
56
81
|
{ text: 'Framework Performance', link: '/fullstack/framework-performance' },
|
|
57
82
|
{ text: 'Vona + Zova Integration', link: '/fullstack/vona-zova-integration' },
|
|
83
|
+
{ text: 'Contract Loop Playbook', link: '/fullstack/contract-loop-playbook' },
|
|
58
84
|
{ text: 'Backend OpenAPI to Frontend SDK', link: '/fullstack/openapi-to-sdk' },
|
|
59
85
|
{
|
|
60
86
|
text: 'Frontend Metadata Back to Backend',
|
|
@@ -75,6 +101,7 @@ const referenceGroups = [
|
|
|
75
101
|
{ text: 'Introduction', link: '/reference/introduction' },
|
|
76
102
|
{ text: 'Repo Scripts', link: '/reference/repo-scripts' },
|
|
77
103
|
{ text: 'CLI Reference', link: '/reference/cli-reference' },
|
|
104
|
+
{ text: 'Bean Scene Boilerplate Variants', link: '/reference/bean-scene-boilerplates' },
|
|
78
105
|
],
|
|
79
106
|
},
|
|
80
107
|
{
|
|
@@ -182,6 +209,7 @@ export default defineConfig({
|
|
|
182
209
|
text: 'Core Programming Model',
|
|
183
210
|
items: [
|
|
184
211
|
{ text: 'AOP Overview', link: '/backend/aop-overview' },
|
|
212
|
+
{ text: 'Bean Scene Authoring', link: '/backend/bean-scene-authoring' },
|
|
185
213
|
{ text: 'Controller Guide', link: '/backend/controller-guide' },
|
|
186
214
|
{ text: 'Controller AOP Guide', link: '/backend/controller-aop-guide' },
|
|
187
215
|
{ text: 'Internal AOP Guide', link: '/backend/internal-aop-guide' },
|
|
@@ -221,8 +249,13 @@ export default defineConfig({
|
|
|
221
249
|
{ text: 'Queue Guide', link: '/backend/queue-guide' },
|
|
222
250
|
{ text: 'Election Guide', link: '/backend/election-guide' },
|
|
223
251
|
{ text: 'Schedule Guide', link: '/backend/schedule-guide' },
|
|
252
|
+
{ text: 'Status Guide', link: '/backend/status-guide' },
|
|
224
253
|
{ text: 'Worker Guide', link: '/backend/worker-guide' },
|
|
225
254
|
{ text: 'Broadcast Guide', link: '/backend/broadcast-guide' },
|
|
255
|
+
{ text: 'Web Socket Guide', link: '/backend/websocket-guide' },
|
|
256
|
+
{ text: 'Web Socket Usage Guide', link: '/backend/websocket-usage-guide' },
|
|
257
|
+
{ text: 'Web Socket Protocol Guide', link: '/backend/websocket-protocol-guide' },
|
|
258
|
+
{ text: 'Web Socket Call Flow', link: '/backend/websocket-call-flow' },
|
|
226
259
|
{ text: 'Redlock Guide', link: '/backend/redlock-guide' },
|
|
227
260
|
],
|
|
228
261
|
},
|
|
@@ -242,12 +275,30 @@ export default defineConfig({
|
|
|
242
275
|
{ text: 'Introduction', link: '/frontend/introduction' },
|
|
243
276
|
{ text: 'Quickstart', link: '/frontend/quickstart' },
|
|
244
277
|
{ text: 'Foundation', link: '/frontend/foundation' },
|
|
278
|
+
{
|
|
279
|
+
text: 'Reading Zova for Vue Developers',
|
|
280
|
+
link: '/frontend/reading-zova-for-vue-developers',
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
text: 'Zova vs Vue 3 Comparison',
|
|
284
|
+
link: '/frontend/zova-vs-vue3-comparison',
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
text: 'Zova Reactivity Under the Hood',
|
|
288
|
+
link: '/frontend/zova-reactivity-under-the-hood',
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
text: 'Zova Source Reading Map',
|
|
292
|
+
link: '/frontend/zova-source-reading-map',
|
|
293
|
+
},
|
|
245
294
|
],
|
|
246
295
|
},
|
|
247
296
|
{
|
|
248
297
|
text: 'Architecture & Modules',
|
|
249
298
|
items: [
|
|
250
299
|
{ text: 'IoC and Beans', link: '/frontend/ioc-and-beans' },
|
|
300
|
+
{ text: 'Bean Scene Authoring', link: '/frontend/bean-scene-authoring' },
|
|
301
|
+
{ text: 'Behavior Guide', link: '/frontend/behavior-guide' },
|
|
251
302
|
{ text: 'Modules and Suites', link: '/frontend/modules-and-suites' },
|
|
252
303
|
{ text: 'Module Scope', link: '/frontend/module-scope' },
|
|
253
304
|
{ text: 'Design Principles', link: '/frontend/design-principles' },
|
|
@@ -277,6 +328,17 @@ export default defineConfig({
|
|
|
277
328
|
{ text: 'Page Params Guide', link: '/frontend/page-params-guide' },
|
|
278
329
|
{ text: 'Zod Guide', link: '/frontend/zod-guide' },
|
|
279
330
|
{ text: 'Page Route Guide', link: '/frontend/page-route-guide' },
|
|
331
|
+
{ text: 'Router Tabs Introduction', link: '/frontend/router-tabs-introduction' },
|
|
332
|
+
{ text: 'Router Tabs Overview', link: '/frontend/router-tabs-overview' },
|
|
333
|
+
{ text: 'Router Tabs Mechanism', link: '/frontend/router-tabs-mechanism' },
|
|
334
|
+
{
|
|
335
|
+
text: 'Router Tabs Route Meta Cookbook',
|
|
336
|
+
link: '/frontend/router-tabs-route-meta-cookbook',
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
text: 'Router Tabs Admin and Web Comparison',
|
|
340
|
+
link: '/frontend/router-tabs-admin-web-comparison',
|
|
341
|
+
},
|
|
280
342
|
{ text: 'Route Alias Guide', link: '/frontend/route-alias-guide' },
|
|
281
343
|
{ text: 'Navigation Guards Guide', link: '/frontend/navigation-guards-guide' },
|
|
282
344
|
],
|
|
@@ -285,6 +347,15 @@ export default defineConfig({
|
|
|
285
347
|
text: 'Components & UI',
|
|
286
348
|
items: [
|
|
287
349
|
{ text: 'Component Guide', link: '/frontend/component-guide' },
|
|
350
|
+
{ text: 'Form Guide', link: '/frontend/form-guide' },
|
|
351
|
+
{
|
|
352
|
+
text: 'Zova Form Under the Hood',
|
|
353
|
+
link: '/frontend/zova-form-under-the-hood',
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
text: 'Zova Form Source Reading Map',
|
|
357
|
+
link: '/frontend/zova-form-source-reading-map',
|
|
358
|
+
},
|
|
288
359
|
{ text: 'Component Props Guide', link: '/frontend/component-props-guide' },
|
|
289
360
|
{ text: 'Component v-model Guide', link: '/frontend/component-v-model-guide' },
|
|
290
361
|
{ text: 'Generic Component Guide', link: '/frontend/generic-component-guide' },
|
|
@@ -297,9 +368,23 @@ export default defineConfig({
|
|
|
297
368
|
text: 'Data & State',
|
|
298
369
|
items: [
|
|
299
370
|
{ text: 'Server Data', link: '/frontend/server-data' },
|
|
371
|
+
{ text: 'Fetch Interceptor Guide', link: '/frontend/fetch-interceptor-guide' },
|
|
300
372
|
{ text: 'API Guide', link: '/frontend/api-guide' },
|
|
301
373
|
{ text: 'Model Architecture', link: '/frontend/model-architecture' },
|
|
302
374
|
{ text: 'Model State Guide', link: '/frontend/model-state-guide' },
|
|
375
|
+
{ text: 'Model Resource Owner Pattern', link: '/frontend/model-resource-owner-pattern' },
|
|
376
|
+
{
|
|
377
|
+
text: 'Using ModelResource in Your Module',
|
|
378
|
+
link: '/frontend/model-resource-usage-guide',
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
text: 'Resource Model Best Practices',
|
|
382
|
+
link: '/frontend/model-resource-best-practices',
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
text: 'Resource Model Cookbook',
|
|
386
|
+
link: '/frontend/model-resource-cookbook',
|
|
387
|
+
},
|
|
303
388
|
],
|
|
304
389
|
},
|
|
305
390
|
{
|
|
@@ -313,6 +398,10 @@ export default defineConfig({
|
|
|
313
398
|
{
|
|
314
399
|
text: 'SSR',
|
|
315
400
|
items: [
|
|
401
|
+
{ text: 'SSR Architecture Overview', link: '/frontend/ssr-architecture-overview' },
|
|
402
|
+
{ text: 'SSR Build and Deploy Guide', link: '/frontend/ssr-build-deploy-guide' },
|
|
403
|
+
{ text: 'SSR Troubleshooting Guide', link: '/frontend/ssr-troubleshooting-guide' },
|
|
404
|
+
{ text: 'SSR Review Checklist', link: '/frontend/ssr-review-checklist' },
|
|
316
405
|
{ text: 'SSR Overview', link: '/frontend/ssr-overview' },
|
|
317
406
|
{ text: 'SSR Init Data', link: '/frontend/ssr-init-data' },
|
|
318
407
|
{ text: 'SSR ClientOnly', link: '/frontend/ssr-client-only' },
|
|
@@ -27,6 +27,8 @@ Recommended placement:
|
|
|
27
27
|
|
|
28
28
|
- `src/lib`
|
|
29
29
|
|
|
30
|
+
For reusable module-local helper functions that are not classes, follow the same structural idea: initialize the module `src/lib` directory and place shared pure helper functions there. For the fuller backend placement context around module-local helpers, also see [Backend Foundation](/backend/foundation).
|
|
31
|
+
|
|
30
32
|
### B1: subclass-only base
|
|
31
33
|
|
|
32
34
|
Use B1 when the class mainly exists as a superclass for concrete subclasses.
|
|
@@ -145,6 +145,20 @@ Typical skill role:
|
|
|
145
145
|
- likely CLI path: Zova `openapi:*` or REST build flows
|
|
146
146
|
- skill then verifies the right edition-specific flavor path
|
|
147
147
|
|
|
148
|
+
### Example: “Update a field on an existing backend resource”
|
|
149
|
+
|
|
150
|
+
- skill decides this is an existing-resource field-update task
|
|
151
|
+
- skill classifies persisted-field vs metadata-only refinement
|
|
152
|
+
- likely CLI path: Vona persistence verification plus Zova metadata/build flows only if renderer follow-up is required
|
|
153
|
+
- skill then verifies entity, locale, tests, `fileVersion` logic, and renderer/build/deps follow-up when applicable
|
|
154
|
+
|
|
155
|
+
### Example: “Remove an existing module cleanly”
|
|
156
|
+
|
|
157
|
+
- skill decides this is a module-removal workflow rather than scaffolding or contract evolution
|
|
158
|
+
- skill classifies backend-only vs frontend-only vs fullstack removal
|
|
159
|
+
- likely CLI path: root build/deps/typecheck scripts such as `npm run build:zova:admin`, `npm run deps:vona`, `npm run deps:zova`, and `npm run tsc`
|
|
160
|
+
- skill then verifies that source, package references, generated registrations, and stale runtime directories are handled in the correct order
|
|
161
|
+
|
|
148
162
|
## Anti-patterns
|
|
149
163
|
|
|
150
164
|
Avoid these mistakes in skills:
|
|
@@ -143,6 +143,20 @@ Use this quick rule:
|
|
|
143
143
|
- full explanation → [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk)
|
|
144
144
|
- workflow steering → skill and rules can point to the docs and choose the right CLI path
|
|
145
145
|
|
|
146
|
+
### Example: “How should AI remove an existing module cleanly?”
|
|
147
|
+
|
|
148
|
+
- public operational explanation → [Playbook: Module Removal](/ai/playbook-module-removal)
|
|
149
|
+
- maintainer rationale and pitfalls → `.docs-internal/architecture/module-removal-workflow.md`
|
|
150
|
+
- avoid putting the full workflow in `CLAUDE.md` because the task needs branching, cleanup order, generated-runtime recovery, and verification
|
|
151
|
+
- procedural decision workflow → `cabloy-module-removal` skill
|
|
152
|
+
|
|
153
|
+
### Example: “What `@Api.field(...)` ordering rule should AI preserve when mixing helpers and zod?”
|
|
154
|
+
|
|
155
|
+
- full explanation → [Entity Guide](/backend/entity-guide) and [DTO Guide](/backend/dto-guide)
|
|
156
|
+
- AI workflow reminder → [Playbook: Add a Backend Module](/ai/playbook-backend-module)
|
|
157
|
+
- procedural checklist reminder → backend scaffold skill references
|
|
158
|
+
- avoid putting the full explanation only in `CLAUDE.md` because this is a framework-specific authoring rule, not a short global behavior rule
|
|
159
|
+
|
|
146
160
|
## Anti-patterns to avoid
|
|
147
161
|
|
|
148
162
|
Avoid these mistakes:
|