cabloy 5.1.227 → 5.1.228
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/CHANGELOG.md +16 -0
- package/CONTRIBUTING.md +1 -1
- package/package.json +2 -2
- package/repo-agent-governance/managed-assets.json +30 -30
- package/repo-agent-governance/policies/repository.md +1 -1
- package/repo-agent-governance/skills/cabloy-backend-scaffold/SKILL.md +3 -3
- package/repo-agent-governance/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +2 -2
- package/repo-agent-governance/skills/cabloy-frontend-scaffold/SKILL.md +1 -0
- package/repo-agent-governance/skills/cabloy-master-detail/SKILL.md +2 -1
- package/repo-agent-governance/skills/cabloy-resource-field-update/SKILL.md +2 -0
- package/repo-agent-governance/skills/cabloy-resource-field-update/references/follow-up-checklist.md +11 -5
- package/repo-agent-governance/skills/cabloy-resource-field-update/references/verification-checklist.md +10 -14
- package/repo-agent-governance/skills/cabloy-spec-execution/evals/evals.json +4 -2
- package/repo-agent-governance/skills/cabloy-spec-execution/references/execution-protocol.md +1 -1
- package/repo-agent-governance/tests/evidence-paths.test.mjs +84 -13
- package/repo-agent-governance/tools/evidence-paths/sanitize.mjs +38 -8
- package/repo-docs/backend/migration-and-changes.md +21 -14
- package/repo-docs/backend/quickstart.md +1 -1
- package/repo-docs/backend/resource-field-update.md +3 -2
- package/repo-docs/backend/unit-testing.md +9 -3
- package/repo-docs/frontend/table-cell-cookbook.md +32 -0
- package/repo-docs/fullstack/quickstart.md +1 -1
- package/repo-docs/reference/repo-scripts.md +2 -2
- package/repo-e2e/specs/a-commerce.spec.ts +83 -9
- package/scripts/init.ts +14 -0
- package/vona/pnpm-lock.yaml +25 -82
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +2 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +2 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderShip.tsx +4 -2
- package/zova/package.original.json +1 -1
- package/zova/packages-cli/cli/package.json +5 -2
- package/zova/packages-cli/cli-set-front/package.json +5 -2
- package/zova/packages-cli/cli-set-front/src/lib/bean/cli.bin.buildRest.ts +5 -1
- package/zova/pnpm-lock.yaml +434 -276
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +23 -23
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +28 -12
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +245 -85
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/component/tableCellActionAdjustStock/controller.tsx +3 -2
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/component/tableCellActionShip/controller.tsx +82 -34
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +1 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +1 -0
package/.cabloy-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
5.1.
|
|
1
|
+
5.1.228
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.1.228
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Add trade ship order support.
|
|
8
|
+
- Update node-related functionality.
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
- Ensure the commerce locale schema is ready before opening dialogs.
|
|
13
|
+
|
|
14
|
+
### Improvements
|
|
15
|
+
|
|
16
|
+
- Clarify isolated migration verification and development database updates in the documentation.
|
|
17
|
+
- Update CLI REST build tooling.
|
|
18
|
+
|
|
3
19
|
## 5.1.227
|
|
4
20
|
|
|
5
21
|
### Features
|
package/CONTRIBUTING.md
CHANGED
|
@@ -11,7 +11,7 @@ Contributions to Cabloy Basic source, tests, tooling, and documentation are welc
|
|
|
11
11
|
|
|
12
12
|
## Set up a development checkout
|
|
13
13
|
|
|
14
|
-
You need Git, Node.js `>=24.
|
|
14
|
+
You need Git, Node.js `>=24.11.0`, pnpm `>=12.14.0`, Redis `>=7.2.6`, and one documented development database baseline: SQLite, MySQL `>=8`, or PostgreSQL `>=16`. SQLite setups using `better-sqlite3` may also require a native build toolchain for `node-gyp`.
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
17
|
git clone https://github.com/cabloy/cabloy.git
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cabloy",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.228",
|
|
4
4
|
"gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
|
|
5
5
|
"description": "A Node.js fullstack framework",
|
|
6
6
|
"keywords": [
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
"typescript": "^5.9.3"
|
|
110
110
|
},
|
|
111
111
|
"engines": {
|
|
112
|
-
"node": ">=24.
|
|
112
|
+
"node": ">=24.11.0",
|
|
113
113
|
"pnpm": ">=12.14.0"
|
|
114
114
|
},
|
|
115
115
|
"packageManager": "pnpm@12.14.0"
|
|
@@ -18,14 +18,14 @@
|
|
|
18
18
|
{
|
|
19
19
|
"adapter": "codex",
|
|
20
20
|
"category": "skill",
|
|
21
|
-
"sha256": "
|
|
21
|
+
"sha256": "5b5aaee730fbc585388840327de41cd8cdfd2fc6419a1dc99a9c32c2fa9676bb",
|
|
22
22
|
"source": "skills/cabloy-backend-scaffold/references/follow-up-checklist.md",
|
|
23
23
|
"target": ".agents/skills/cabloy-backend-scaffold/references/follow-up-checklist.md"
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
"adapter": "codex",
|
|
27
27
|
"category": "skill",
|
|
28
|
-
"sha256": "
|
|
28
|
+
"sha256": "ad7d88df6dc9bd7196ce894883f292537754aefe7c037d05330d6c02d0420e98",
|
|
29
29
|
"source": "skills/cabloy-backend-scaffold/SKILL.md",
|
|
30
30
|
"target": ".agents/skills/cabloy-backend-scaffold/SKILL.md"
|
|
31
31
|
},
|
|
@@ -95,14 +95,14 @@
|
|
|
95
95
|
{
|
|
96
96
|
"adapter": "codex",
|
|
97
97
|
"category": "skill",
|
|
98
|
-
"sha256": "
|
|
98
|
+
"sha256": "b883f2b01ab79d51b23e899be43a1c90a821db916490f50c4b28958eedf36b6e",
|
|
99
99
|
"source": "skills/cabloy-frontend-scaffold/SKILL.md",
|
|
100
100
|
"target": ".agents/skills/cabloy-frontend-scaffold/SKILL.md"
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
103
|
"adapter": "codex",
|
|
104
104
|
"category": "skill",
|
|
105
|
-
"sha256": "
|
|
105
|
+
"sha256": "ec828440c4169b2c0235531744ded554db24a71b18082c2b96788c25e4c23ded",
|
|
106
106
|
"source": "skills/cabloy-master-detail/SKILL.md",
|
|
107
107
|
"target": ".agents/skills/cabloy-master-detail/SKILL.md"
|
|
108
108
|
},
|
|
@@ -137,28 +137,28 @@
|
|
|
137
137
|
{
|
|
138
138
|
"adapter": "codex",
|
|
139
139
|
"category": "skill",
|
|
140
|
-
"sha256": "
|
|
140
|
+
"sha256": "7922a45b7f9553e5b7a405b41b5d8f173d39481dff38a08d34fb7d99a5979ebb",
|
|
141
141
|
"source": "skills/cabloy-resource-field-update/references/follow-up-checklist.md",
|
|
142
142
|
"target": ".agents/skills/cabloy-resource-field-update/references/follow-up-checklist.md"
|
|
143
143
|
},
|
|
144
144
|
{
|
|
145
145
|
"adapter": "codex",
|
|
146
146
|
"category": "skill",
|
|
147
|
-
"sha256": "
|
|
147
|
+
"sha256": "980550915f494cf8e6a5110f84bd518a51378111a3cef49a2772ff62c60dd715",
|
|
148
148
|
"source": "skills/cabloy-resource-field-update/references/verification-checklist.md",
|
|
149
149
|
"target": ".agents/skills/cabloy-resource-field-update/references/verification-checklist.md"
|
|
150
150
|
},
|
|
151
151
|
{
|
|
152
152
|
"adapter": "codex",
|
|
153
153
|
"category": "skill",
|
|
154
|
-
"sha256": "
|
|
154
|
+
"sha256": "3423b7bbce2662acbd7d8f31a3607f14fcaee31470b0156cca33b4bfe0a1ab3c",
|
|
155
155
|
"source": "skills/cabloy-resource-field-update/SKILL.md",
|
|
156
156
|
"target": ".agents/skills/cabloy-resource-field-update/SKILL.md"
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
159
|
"adapter": "codex",
|
|
160
160
|
"category": "skill",
|
|
161
|
-
"sha256": "
|
|
161
|
+
"sha256": "780105ec2e56a5460664836aab98b6dfc610ca1f9951becc165c524f80d52ff6",
|
|
162
162
|
"source": "skills/cabloy-spec-execution/evals/evals.json",
|
|
163
163
|
"target": ".agents/skills/cabloy-spec-execution/evals/evals.json"
|
|
164
164
|
},
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
{
|
|
180
180
|
"adapter": "codex",
|
|
181
181
|
"category": "skill",
|
|
182
|
-
"sha256": "
|
|
182
|
+
"sha256": "4f1b4b87b2c0d2ff485c58c8f891189fd3dc7914d66af806c1a808d22cd94124",
|
|
183
183
|
"source": "skills/cabloy-spec-execution/references/execution-protocol.md",
|
|
184
184
|
"target": ".agents/skills/cabloy-spec-execution/references/execution-protocol.md"
|
|
185
185
|
},
|
|
@@ -354,14 +354,14 @@
|
|
|
354
354
|
{
|
|
355
355
|
"adapter": "claude",
|
|
356
356
|
"category": "skill",
|
|
357
|
-
"sha256": "
|
|
357
|
+
"sha256": "5b5aaee730fbc585388840327de41cd8cdfd2fc6419a1dc99a9c32c2fa9676bb",
|
|
358
358
|
"source": "skills/cabloy-backend-scaffold/references/follow-up-checklist.md",
|
|
359
359
|
"target": ".claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md"
|
|
360
360
|
},
|
|
361
361
|
{
|
|
362
362
|
"adapter": "claude",
|
|
363
363
|
"category": "skill",
|
|
364
|
-
"sha256": "
|
|
364
|
+
"sha256": "ad7d88df6dc9bd7196ce894883f292537754aefe7c037d05330d6c02d0420e98",
|
|
365
365
|
"source": "skills/cabloy-backend-scaffold/SKILL.md",
|
|
366
366
|
"target": ".claude/skills/cabloy-backend-scaffold/SKILL.md"
|
|
367
367
|
},
|
|
@@ -431,14 +431,14 @@
|
|
|
431
431
|
{
|
|
432
432
|
"adapter": "claude",
|
|
433
433
|
"category": "skill",
|
|
434
|
-
"sha256": "
|
|
434
|
+
"sha256": "b883f2b01ab79d51b23e899be43a1c90a821db916490f50c4b28958eedf36b6e",
|
|
435
435
|
"source": "skills/cabloy-frontend-scaffold/SKILL.md",
|
|
436
436
|
"target": ".claude/skills/cabloy-frontend-scaffold/SKILL.md"
|
|
437
437
|
},
|
|
438
438
|
{
|
|
439
439
|
"adapter": "claude",
|
|
440
440
|
"category": "skill",
|
|
441
|
-
"sha256": "
|
|
441
|
+
"sha256": "ec828440c4169b2c0235531744ded554db24a71b18082c2b96788c25e4c23ded",
|
|
442
442
|
"source": "skills/cabloy-master-detail/SKILL.md",
|
|
443
443
|
"target": ".claude/skills/cabloy-master-detail/SKILL.md"
|
|
444
444
|
},
|
|
@@ -473,28 +473,28 @@
|
|
|
473
473
|
{
|
|
474
474
|
"adapter": "claude",
|
|
475
475
|
"category": "skill",
|
|
476
|
-
"sha256": "
|
|
476
|
+
"sha256": "7922a45b7f9553e5b7a405b41b5d8f173d39481dff38a08d34fb7d99a5979ebb",
|
|
477
477
|
"source": "skills/cabloy-resource-field-update/references/follow-up-checklist.md",
|
|
478
478
|
"target": ".claude/skills/cabloy-resource-field-update/references/follow-up-checklist.md"
|
|
479
479
|
},
|
|
480
480
|
{
|
|
481
481
|
"adapter": "claude",
|
|
482
482
|
"category": "skill",
|
|
483
|
-
"sha256": "
|
|
483
|
+
"sha256": "980550915f494cf8e6a5110f84bd518a51378111a3cef49a2772ff62c60dd715",
|
|
484
484
|
"source": "skills/cabloy-resource-field-update/references/verification-checklist.md",
|
|
485
485
|
"target": ".claude/skills/cabloy-resource-field-update/references/verification-checklist.md"
|
|
486
486
|
},
|
|
487
487
|
{
|
|
488
488
|
"adapter": "claude",
|
|
489
489
|
"category": "skill",
|
|
490
|
-
"sha256": "
|
|
490
|
+
"sha256": "3423b7bbce2662acbd7d8f31a3607f14fcaee31470b0156cca33b4bfe0a1ab3c",
|
|
491
491
|
"source": "skills/cabloy-resource-field-update/SKILL.md",
|
|
492
492
|
"target": ".claude/skills/cabloy-resource-field-update/SKILL.md"
|
|
493
493
|
},
|
|
494
494
|
{
|
|
495
495
|
"adapter": "claude",
|
|
496
496
|
"category": "skill",
|
|
497
|
-
"sha256": "
|
|
497
|
+
"sha256": "780105ec2e56a5460664836aab98b6dfc610ca1f9951becc165c524f80d52ff6",
|
|
498
498
|
"source": "skills/cabloy-spec-execution/evals/evals.json",
|
|
499
499
|
"target": ".claude/skills/cabloy-spec-execution/evals/evals.json"
|
|
500
500
|
},
|
|
@@ -515,7 +515,7 @@
|
|
|
515
515
|
{
|
|
516
516
|
"adapter": "claude",
|
|
517
517
|
"category": "skill",
|
|
518
|
-
"sha256": "
|
|
518
|
+
"sha256": "4f1b4b87b2c0d2ff485c58c8f891189fd3dc7914d66af806c1a808d22cd94124",
|
|
519
519
|
"source": "skills/cabloy-spec-execution/references/execution-protocol.md",
|
|
520
520
|
"target": ".claude/skills/cabloy-spec-execution/references/execution-protocol.md"
|
|
521
521
|
},
|
|
@@ -683,7 +683,7 @@
|
|
|
683
683
|
{
|
|
684
684
|
"adapter": "cursor",
|
|
685
685
|
"category": "policy",
|
|
686
|
-
"sha256": "
|
|
686
|
+
"sha256": "162dc7bf2d01964a249bc11b29c429af2d379e29c2d61c748ce332f35a224a8e",
|
|
687
687
|
"source": "policies/repository.md",
|
|
688
688
|
"target": ".cursor/rules/cabloy-governance.mdc"
|
|
689
689
|
},
|
|
@@ -704,14 +704,14 @@
|
|
|
704
704
|
{
|
|
705
705
|
"adapter": "cursor",
|
|
706
706
|
"category": "skill",
|
|
707
|
-
"sha256": "
|
|
707
|
+
"sha256": "5b5aaee730fbc585388840327de41cd8cdfd2fc6419a1dc99a9c32c2fa9676bb",
|
|
708
708
|
"source": "skills/cabloy-backend-scaffold/references/follow-up-checklist.md",
|
|
709
709
|
"target": ".cursor/skills/cabloy-backend-scaffold/references/follow-up-checklist.md"
|
|
710
710
|
},
|
|
711
711
|
{
|
|
712
712
|
"adapter": "cursor",
|
|
713
713
|
"category": "skill",
|
|
714
|
-
"sha256": "
|
|
714
|
+
"sha256": "ad7d88df6dc9bd7196ce894883f292537754aefe7c037d05330d6c02d0420e98",
|
|
715
715
|
"source": "skills/cabloy-backend-scaffold/SKILL.md",
|
|
716
716
|
"target": ".cursor/skills/cabloy-backend-scaffold/SKILL.md"
|
|
717
717
|
},
|
|
@@ -781,14 +781,14 @@
|
|
|
781
781
|
{
|
|
782
782
|
"adapter": "cursor",
|
|
783
783
|
"category": "skill",
|
|
784
|
-
"sha256": "
|
|
784
|
+
"sha256": "b883f2b01ab79d51b23e899be43a1c90a821db916490f50c4b28958eedf36b6e",
|
|
785
785
|
"source": "skills/cabloy-frontend-scaffold/SKILL.md",
|
|
786
786
|
"target": ".cursor/skills/cabloy-frontend-scaffold/SKILL.md"
|
|
787
787
|
},
|
|
788
788
|
{
|
|
789
789
|
"adapter": "cursor",
|
|
790
790
|
"category": "skill",
|
|
791
|
-
"sha256": "
|
|
791
|
+
"sha256": "ec828440c4169b2c0235531744ded554db24a71b18082c2b96788c25e4c23ded",
|
|
792
792
|
"source": "skills/cabloy-master-detail/SKILL.md",
|
|
793
793
|
"target": ".cursor/skills/cabloy-master-detail/SKILL.md"
|
|
794
794
|
},
|
|
@@ -823,28 +823,28 @@
|
|
|
823
823
|
{
|
|
824
824
|
"adapter": "cursor",
|
|
825
825
|
"category": "skill",
|
|
826
|
-
"sha256": "
|
|
826
|
+
"sha256": "7922a45b7f9553e5b7a405b41b5d8f173d39481dff38a08d34fb7d99a5979ebb",
|
|
827
827
|
"source": "skills/cabloy-resource-field-update/references/follow-up-checklist.md",
|
|
828
828
|
"target": ".cursor/skills/cabloy-resource-field-update/references/follow-up-checklist.md"
|
|
829
829
|
},
|
|
830
830
|
{
|
|
831
831
|
"adapter": "cursor",
|
|
832
832
|
"category": "skill",
|
|
833
|
-
"sha256": "
|
|
833
|
+
"sha256": "980550915f494cf8e6a5110f84bd518a51378111a3cef49a2772ff62c60dd715",
|
|
834
834
|
"source": "skills/cabloy-resource-field-update/references/verification-checklist.md",
|
|
835
835
|
"target": ".cursor/skills/cabloy-resource-field-update/references/verification-checklist.md"
|
|
836
836
|
},
|
|
837
837
|
{
|
|
838
838
|
"adapter": "cursor",
|
|
839
839
|
"category": "skill",
|
|
840
|
-
"sha256": "
|
|
840
|
+
"sha256": "3423b7bbce2662acbd7d8f31a3607f14fcaee31470b0156cca33b4bfe0a1ab3c",
|
|
841
841
|
"source": "skills/cabloy-resource-field-update/SKILL.md",
|
|
842
842
|
"target": ".cursor/skills/cabloy-resource-field-update/SKILL.md"
|
|
843
843
|
},
|
|
844
844
|
{
|
|
845
845
|
"adapter": "cursor",
|
|
846
846
|
"category": "skill",
|
|
847
|
-
"sha256": "
|
|
847
|
+
"sha256": "780105ec2e56a5460664836aab98b6dfc610ca1f9951becc165c524f80d52ff6",
|
|
848
848
|
"source": "skills/cabloy-spec-execution/evals/evals.json",
|
|
849
849
|
"target": ".cursor/skills/cabloy-spec-execution/evals/evals.json"
|
|
850
850
|
},
|
|
@@ -865,7 +865,7 @@
|
|
|
865
865
|
{
|
|
866
866
|
"adapter": "cursor",
|
|
867
867
|
"category": "skill",
|
|
868
|
-
"sha256": "
|
|
868
|
+
"sha256": "4f1b4b87b2c0d2ff485c58c8f891189fd3dc7914d66af806c1a808d22cd94124",
|
|
869
869
|
"source": "skills/cabloy-spec-execution/references/execution-protocol.md",
|
|
870
870
|
"target": ".cursor/skills/cabloy-spec-execution/references/execution-protocol.md"
|
|
871
871
|
},
|
|
@@ -1005,14 +1005,14 @@
|
|
|
1005
1005
|
{
|
|
1006
1006
|
"adapter": "codex",
|
|
1007
1007
|
"category": "policy",
|
|
1008
|
-
"sha256": "
|
|
1008
|
+
"sha256": "af4c50c261114d494961bd30a75c2a7baf999a43644d0aa9c218fbd8ad83c53d",
|
|
1009
1009
|
"source": "policies/repository.md",
|
|
1010
1010
|
"target": "AGENTS.md"
|
|
1011
1011
|
},
|
|
1012
1012
|
{
|
|
1013
1013
|
"adapter": "claude",
|
|
1014
1014
|
"category": "policy",
|
|
1015
|
-
"sha256": "
|
|
1015
|
+
"sha256": "af4c50c261114d494961bd30a75c2a7baf999a43644d0aa9c218fbd8ad83c53d",
|
|
1016
1016
|
"source": "policies/repository.md",
|
|
1017
1017
|
"target": "CLAUDE.md"
|
|
1018
1018
|
}
|
|
@@ -109,4 +109,4 @@ Before inventing a custom implementation path:
|
|
|
109
109
|
- For code-generation or workflow guidance changes: verify that the referenced scripts and command families still exist.
|
|
110
110
|
- For code changes: prefer the narrowest meaningful verification first, then use shared root scripts when broader confidence is needed.
|
|
111
111
|
- Keep frontend and backend verification proportional to the change: cover critical behavior using existing infrastructure, not exhaustive upfront test matrices or bespoke source-evaluation/mock harnesses. Prefer a few critical-flow E2E scenarios for frontend work and the smallest meaningful service/model/API/integration tests for backend work; add focused regressions for actual defects. Preserve applicable security, SSR, data-consistency, migration, and acceptance requirements.
|
|
112
|
-
-
|
|
112
|
+
- Verify changes to migration, initialization, or seed behavior through the managed isolated test entrypoint, preferably with focused tests covering the affected behavior. Do not require the full suite solely because `meta.version.ts` changed; expand coverage according to actual impact. Isolated tests do not update development databases: apply pending migrations through normal startup, require explicit approval to reset disposable dev data when replaying an already-applied positive-numbered branch, and use a new migration when existing data must be preserved.
|
|
@@ -200,7 +200,7 @@ For persisted test data, classify each record as a durable module seed or a test
|
|
|
200
200
|
Check whether the feature needs:
|
|
201
201
|
|
|
202
202
|
- unit tests
|
|
203
|
-
-
|
|
203
|
+
- managed isolated migration verification and a separate development-database update decision
|
|
204
204
|
- controller action testing
|
|
205
205
|
- broader `test` / `tsc` / `build` checks
|
|
206
206
|
|
|
@@ -239,7 +239,7 @@ Always end with a verification path that matches the scope of the backend change
|
|
|
239
239
|
|
|
240
240
|
Prefer focused tests of critical business behavior using the existing Vona testing infrastructure. Choose the smallest meaningful service/model, controller/API, or integration boundary for the changed contract; browser E2E is not the default backend test layer. Avoid exhaustive upfront mock/fake matrices and bespoke harnesses. Add focused regression coverage when actual defects are fixed; targeted unit and framework tests remain useful when they directly prove new or changed behavior.
|
|
241
241
|
|
|
242
|
-
Keep relevant static checks scope-dependent and preserve applicable authentication/authorization, tenant-isolation, transaction, concurrency, idempotency, migration, and acceptance requirements. These are selected by the affected behavior, not a mandatory matrix for every change. Retain `mockCtx(...)` ownership, test-resource isolation, precise fixture cleanup,
|
|
242
|
+
Keep relevant static checks scope-dependent and preserve applicable authentication/authorization, tenant-isolation, transaction, concurrency, idempotency, migration, and acceptance requirements. These are selected by the affected behavior, not a mandatory matrix for every change. Retain `mockCtx(...)` ownership, test-resource isolation, and precise fixture cleanup. Verify migration, initialization, or seed changes through managed isolated tests covering the affected behavior; focused tests still prepare the test database, so a `meta.version.ts` edit alone does not require the full suite. Tests do not update development databases; decide the development migration/reset path separately using [Migration and Changes](../../../repo-docs/backend/migration-and-changes.md#local-development-workflow). Missing runtime access is a reported gap, not permission to reset resources or invent substitute test machinery. See [Unit Testing](../../../repo-docs/backend/unit-testing.md).
|
|
243
243
|
|
|
244
244
|
Shared checks, when applicable, include:
|
|
245
245
|
|
|
@@ -251,7 +251,7 @@ Narrower checks may include:
|
|
|
251
251
|
|
|
252
252
|
- module test updates
|
|
253
253
|
- route/controller action verification
|
|
254
|
-
- migration reset
|
|
254
|
+
- focused managed migration tests; development reset only with separate explicit approval
|
|
255
255
|
- CRUD workflow test coverage
|
|
256
256
|
|
|
257
257
|
## Response pattern
|
package/repo-agent-governance/skills/cabloy-backend-scaffold/references/follow-up-checklist.md
CHANGED
|
@@ -83,8 +83,8 @@ When the active edition and installed modules provide `@Passport.rbac(...)` and
|
|
|
83
83
|
- focused regressions for actual defects; avoid exhaustive upfront mock/fake matrices and bespoke harnesses
|
|
84
84
|
- applicable authentication/authorization, tenant-isolation, transaction, concurrency, idempotency, migration, and acceptance checks
|
|
85
85
|
- relevant format, lint, and type checks using the smallest supported scope
|
|
86
|
-
-
|
|
87
|
-
-
|
|
86
|
+
- managed isolated tests for affected migration, initialization, and seed behavior, preferably focused; expand to the full suite for actual impact, not merely a `meta.version.ts` edit
|
|
87
|
+
- a separate development-database decision: normal startup applies pending migrations, while replaying an already-applied positive-numbered branch on disposable dev data requires an explicitly approved `db:reset`; preserve existing data with a new migration
|
|
88
88
|
- `npm run build` only when the affected artifact or acceptance boundary requires it
|
|
89
89
|
|
|
90
90
|
## Escalation rule
|
|
@@ -205,6 +205,7 @@ Check whether the feature needs:
|
|
|
205
205
|
- style/theme/icon updates
|
|
206
206
|
- wrapper usage review
|
|
207
207
|
- async interaction ownership: for a button-only action, return or await the complete action through `ZButton onPerform`, choose one error presentation owner rather than combining its generic alert with local query/error UI, and do not mirror the same lifecycle with button-local `loading` / `disabled` state; retain explicit state only for independently initiated or broader shared work
|
|
208
|
+
- business row actions that require additional input: prefer a compact trigger and a focused dialog unless deliberate inline editing is intended; follow the [TableCell dialog pattern](../../../repo-docs/frontend/table-cell-cookbook.md#collect-input-for-a-business-row-action-in-a-dialog) for schema-backed forms where suitable, existing mutation ownership, success-only closure, failure input retention, and dialog-scoped E2E verification
|
|
208
209
|
- async-loading or controllerRef implications
|
|
209
210
|
|
|
210
211
|
### Verification
|
|
@@ -194,7 +194,8 @@ Typical checks include:
|
|
|
194
194
|
- confirm detail schema/index support is present
|
|
195
195
|
- confirm both modules’ `.metadata/index.ts` outputs reflect the expected nested detail DTOs
|
|
196
196
|
- if standalone mode applies, confirm the detail module still exposes its standalone resource surface
|
|
197
|
-
-
|
|
197
|
+
- verify migration, initialization, or seed changes through managed isolated tests covering the affected aggregate and detail behavior; focused runs still prepare the test database, so a `meta.version.ts` edit alone does not require the full suite
|
|
198
|
+
- decide development-database updates separately: isolated tests do not update dev data, normal startup applies pending migrations, and replaying an already-applied positive-numbered branch on disposable dev data requires explicit reset approval; use a new migration to preserve existing data
|
|
198
199
|
|
|
199
200
|
## Response pattern
|
|
200
201
|
|
|
@@ -115,6 +115,8 @@ Then:
|
|
|
115
115
|
2. fold the schema change into the current version path
|
|
116
116
|
3. do not create a new migration branch
|
|
117
117
|
|
|
118
|
+
An already-applied positive-numbered migration branch does not replay during normal startup. Managed focused tests exercise the edited branch on a fresh isolated test database, not the development database. Recreating disposable dev data requires separate explicit reset approval; a no-bump decision does not grant it. If existing data must be preserved, resolve a new incremental migration strategy instead. See [Migration and Changes](../../../repo-docs/backend/migration-and-changes.md#local-development-workflow).
|
|
119
|
+
|
|
118
120
|
## Step 4: Inspect the current backend thread first
|
|
119
121
|
|
|
120
122
|
Before proposing or making edits, inspect the existing thread:
|
package/repo-agent-governance/skills/cabloy-resource-field-update/references/follow-up-checklist.md
CHANGED
|
@@ -55,14 +55,20 @@ Apply when the user explicitly wants to demonstrate custom renderer development:
|
|
|
55
55
|
|
|
56
56
|
## Verification follow-up
|
|
57
57
|
|
|
58
|
-
###
|
|
58
|
+
### Backend checks
|
|
59
59
|
|
|
60
|
-
- `npm run
|
|
60
|
+
- relevant typecheck, such as `cd vona && npm run tsc`
|
|
61
|
+
- focused managed tests, such as `npm run test -- 'src/module/<module-name>/test/**/*.ts'` from the repository root; resolve the actual path for suite-owned modules
|
|
62
|
+
- if persistence, initialization, or seed behavior changed, cover that behavior in the managed run; focused tests still prepare a fresh isolated test database, so a `meta.version.ts` edit alone does not require the full suite
|
|
63
|
+
- expand coverage according to actual impact, including upgrade behavior when applicable
|
|
61
64
|
|
|
62
|
-
###
|
|
65
|
+
### Development-database follow-up
|
|
63
66
|
|
|
64
|
-
-
|
|
65
|
-
-
|
|
67
|
+
- isolated tests do not update development data
|
|
68
|
+
- normal startup applies pending migrations to existing prepared databases
|
|
69
|
+
- an already-applied positive-numbered migration branch does not replay on startup; recreating disposable dev data requires separate explicit reset approval, even after a no-bump decision
|
|
70
|
+
- use a new incremental migration when existing data must be preserved
|
|
71
|
+
- see [Migration and Changes](../../../../repo-docs/backend/migration-and-changes.md#local-development-workflow) for lifecycle and reset safety
|
|
66
72
|
|
|
67
73
|
### If custom frontend renderers were introduced
|
|
68
74
|
|
|
@@ -11,32 +11,28 @@ This means the task changed storage shape, such as:
|
|
|
11
11
|
- `meta.version.ts`
|
|
12
12
|
- module `fileVersion`
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
Verify affected migration, initialization, or seed behavior through the managed isolated test entrypoint. Prefer focused tests that cover the changed resource:
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
npm run test
|
|
17
|
+
npm run test -- 'src/module/<module-name>/test/**/*.ts'
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Resolve the actual test path for suite-owned modules. A focused managed run still recreates its isolated test database and runs migrations, initialization, and seeds; a `meta.version.ts` edit alone does not require the full suite. Expand coverage according to actual impact, including upgrade behavior when applicable; fresh-database preparation alone does not prove an existing-data upgrade.
|
|
21
21
|
|
|
22
|
-
-
|
|
22
|
+
Development-database updates are a separate decision. Tests do not update dev data. Normal startup applies pending migrations to existing prepared databases, but does not replay an already-applied positive-numbered branch. Recreating disposable dev data requires explicit reset approval; a no-bump decision is not authorization. Use a new incremental migration when data must be preserved. See [Migration and Changes](../../../../repo-docs/backend/migration-and-changes.md#local-development-workflow).
|
|
23
23
|
|
|
24
|
-
## 2.
|
|
24
|
+
## 2. For all backend field changes
|
|
25
25
|
|
|
26
|
-
Start with the narrowest meaningful checks
|
|
26
|
+
Start with the narrowest meaningful checks, including when persistence changed.
|
|
27
27
|
|
|
28
|
-
Typical sequence:
|
|
28
|
+
Typical root-level sequence:
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
npm run tsc:vona
|
|
32
|
+
npm run test -- 'src/module/<module-name>/test/**/*.ts'
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
- validation-only refinement
|
|
38
|
-
- locale updates for a field
|
|
39
|
-
- renderer metadata changes on an existing persisted field
|
|
35
|
+
For validation-only refinements, locale updates, or renderer metadata changes on an existing field, select relevant checks without inventing a migration requirement.
|
|
40
36
|
|
|
41
37
|
## 3. If custom frontend renderers were introduced
|
|
42
38
|
|
|
@@ -35,11 +35,13 @@
|
|
|
35
35
|
{
|
|
36
36
|
"id": 4,
|
|
37
37
|
"prompt": "Implement WBS-ABC-30-01, which adds a persisted field to an existing entity. Just choose the migration version that seems consistent with nearby modules and continue.",
|
|
38
|
-
"expected_output": "Requires an explicit decision about whether vonaModule.fileVersion increments before editing migration metadata, does not invent migration history, and
|
|
38
|
+
"expected_output": "Requires an explicit decision about whether vonaModule.fileVersion increments before editing migration metadata, does not invent migration history, and plans managed isolated verification of affected migration behavior, preferably with focused tests. Separates development-database updates from test verification and preserves explicit reset approval.",
|
|
39
39
|
"files": ["files/scenarios.json"],
|
|
40
40
|
"expectations": [
|
|
41
41
|
"Asks direct fileVersion strategy before migration edits.",
|
|
42
|
-
"
|
|
42
|
+
"Plans managed focused tests for affected migration behavior without requiring the full suite solely for a meta.version.ts edit.",
|
|
43
|
+
"States that isolated tests do not update dev data; normal startup applies pending migrations, not already-applied positive-numbered branches.",
|
|
44
|
+
"Keeps reset approval separate from the fileVersion decision and uses a new migration when data must be preserved."
|
|
43
45
|
]
|
|
44
46
|
},
|
|
45
47
|
{
|
|
@@ -79,7 +79,7 @@ When authority records conflict, stop the affected work. Update the authoritativ
|
|
|
79
79
|
|
|
80
80
|
### Persisted schema and file version
|
|
81
81
|
|
|
82
|
-
If implementation may add or alter a persisted field, table, relation, index, or `meta.version.ts` path, ask before editing whether `vonaModule.fileVersion` should increment. Do not infer the answer from neighboring modules.
|
|
82
|
+
If implementation may add or alter a persisted field, table, relation, index, or `meta.version.ts` path, ask before editing whether `vonaModule.fileVersion` should increment. Do not infer the answer from neighboring modules. Include managed isolated verification of affected migration, initialization, or seed behavior in the dossier and evidence plan; focused tests still prepare the test database, and a `meta.version.ts` edit alone does not require the full suite. Record development-database updates separately: tests do not update dev data, normal startup applies pending migrations, and replaying an already-applied positive-numbered branch on disposable dev data requires separate explicit reset approval. A no-bump decision is not reset authorization; use a new migration when existing data must be preserved.
|
|
83
83
|
|
|
84
84
|
### Contract loop
|
|
85
85
|
|
|
@@ -369,24 +369,95 @@ test('stream fatal UTF-8 and line limit never emit raw fragments of the failing
|
|
|
369
369
|
test('stream rejects binary control bytes on complete and final lines without raw fragments', async () => {
|
|
370
370
|
for (const byte of [0, 1, 27, 127]) {
|
|
371
371
|
for (const ending of ['', '\n']) {
|
|
372
|
-
const
|
|
373
|
-
Buffer.
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
372
|
+
for (const prefix of ['', '/Users/Secret/file ']) {
|
|
373
|
+
const bytes = Buffer.concat([
|
|
374
|
+
Buffer.from(prefix),
|
|
375
|
+
Buffer.from([byte]),
|
|
376
|
+
Buffer.from(ending),
|
|
377
|
+
]);
|
|
378
|
+
const bytePosition = Buffer.byteLength(prefix) + 1;
|
|
379
|
+
const output = sink();
|
|
380
|
+
await assert.rejects(
|
|
381
|
+
sanitizeStream(Readable.from([bytes]), output.stream, { matcher }),
|
|
382
|
+
error => {
|
|
383
|
+
assert.equal(String(error), 'Error: BINARY');
|
|
384
|
+
assert.equal(error.code, 'BINARY');
|
|
385
|
+
assert.deepEqual(error.details, { byte, line: 1, bytePosition });
|
|
386
|
+
return true;
|
|
387
|
+
},
|
|
388
|
+
);
|
|
389
|
+
assert.equal(output.text(), '');
|
|
390
|
+
const result = cli(['sanitize'], bytes);
|
|
391
|
+
assert.equal(result.status, 2);
|
|
392
|
+
assert.equal(result.stdout, '');
|
|
393
|
+
assert.equal(
|
|
394
|
+
result.stderr,
|
|
395
|
+
`evidence-paths: BINARY byte=${byte} line=1 byte-position=${bytePosition}\n`,
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
assert.equal(await streamed([Buffer.from('plain\ttext\f\r\n')]), 'plain\ttext\f\r\n');
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
test('binary diagnostics use original byte positions across chunks and input lines', async () => {
|
|
404
|
+
for (const ending of ['', '\n']) {
|
|
405
|
+
const bytes = Buffer.concat([
|
|
406
|
+
Buffer.from('ok\r\n\r\né🙂'),
|
|
407
|
+
Buffer.from([27, 0]),
|
|
408
|
+
Buffer.from('/Users/Secret/file'),
|
|
409
|
+
Buffer.from(ending),
|
|
410
|
+
]);
|
|
411
|
+
for (const chunks of [[bytes], Array.from(bytes, byte => Buffer.from([byte]))]) {
|
|
377
412
|
const output = sink();
|
|
378
413
|
await assert.rejects(
|
|
379
|
-
sanitizeStream(Readable.from(
|
|
380
|
-
|
|
414
|
+
sanitizeStream(Readable.from(chunks), output.stream, { matcher }),
|
|
415
|
+
error => {
|
|
416
|
+
assert.equal(String(error), 'Error: BINARY');
|
|
417
|
+
assert.equal(error.code, 'BINARY');
|
|
418
|
+
assert.deepEqual(error.details, { byte: 27, line: 3, bytePosition: 7 });
|
|
419
|
+
return true;
|
|
420
|
+
},
|
|
381
421
|
);
|
|
382
|
-
assert.equal(output.text(), '');
|
|
383
|
-
const
|
|
384
|
-
|
|
385
|
-
assert.equal(
|
|
386
|
-
|
|
422
|
+
assert.equal(output.text(), 'ok\r\n\r\n');
|
|
423
|
+
const cliOutput = sink();
|
|
424
|
+
const errors = sink();
|
|
425
|
+
assert.equal(
|
|
426
|
+
await runCli(['sanitize'], {
|
|
427
|
+
input: Readable.from(chunks),
|
|
428
|
+
output: cliOutput.stream,
|
|
429
|
+
error: errors.stream,
|
|
430
|
+
}),
|
|
431
|
+
2,
|
|
432
|
+
);
|
|
433
|
+
assert.equal(cliOutput.text(), 'ok\r\n\r\n');
|
|
434
|
+
assert.equal(errors.text(), 'evidence-paths: BINARY byte=27 line=3 byte-position=7\n');
|
|
387
435
|
}
|
|
436
|
+
const result = cli(['sanitize'], bytes);
|
|
437
|
+
assert.equal(result.status, 2);
|
|
438
|
+
assert.equal(result.stdout, 'ok\r\n\r\n');
|
|
439
|
+
assert.equal(result.stderr, 'evidence-paths: BINARY byte=27 line=3 byte-position=7\n');
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
test('line limits retain precedence over binary diagnostics', async () => {
|
|
444
|
+
for (const ending of ['', '\n']) {
|
|
445
|
+
const bytes = Buffer.concat([
|
|
446
|
+
Buffer.from([27]),
|
|
447
|
+
Buffer.alloc(LINE_LIMIT, 97),
|
|
448
|
+
Buffer.from(ending),
|
|
449
|
+
]);
|
|
450
|
+
const output = sink();
|
|
451
|
+
await assert.rejects(
|
|
452
|
+
sanitizeStream(Readable.from([bytes]), output.stream, { matcher }),
|
|
453
|
+
/^Error: LINE_LIMIT$/u,
|
|
454
|
+
);
|
|
455
|
+
assert.equal(output.text(), '');
|
|
456
|
+
const result = cli(['sanitize'], bytes);
|
|
457
|
+
assert.equal(result.status, 2);
|
|
458
|
+
assert.equal(result.stdout, '');
|
|
459
|
+
assert.equal(result.stderr, 'evidence-paths: LINE_LIMIT\n');
|
|
388
460
|
}
|
|
389
|
-
assert.equal(await streamed([Buffer.from('plain\ttext\f\r\n')]), 'plain\ttext\f\r\n');
|
|
390
461
|
});
|
|
391
462
|
|
|
392
463
|
test('stream input/output failures and CLI diagnostics never expose raw exception text or stacks', async () => {
|