cabloy 5.1.224 → 5.1.226

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.
Files changed (83) hide show
  1. package/.cabloy-version +1 -1
  2. package/.github/workflows/vona-tsc.yml +2 -2
  3. package/CHANGELOG.md +29 -0
  4. package/CONTRIBUTING.md +2 -2
  5. package/package.json +4 -10
  6. package/repo-agent-governance/managed-assets.json +9 -9
  7. package/repo-agent-governance/policies/repository.md +2 -0
  8. package/repo-agent-governance/skills/cabloy-spec-execution/references/execution-protocol.md +6 -2
  9. package/repo-agent-governance/skills/cabloy-spec-generation/SKILL.md +1 -1
  10. package/repo-docs/ai/ai-spec-driven-development.md +6 -2
  11. package/repo-docs/backend/quickstart.md +8 -8
  12. package/repo-docs/fullstack/quickstart.md +11 -11
  13. package/repo-docs/reference/repo-scripts.md +19 -20
  14. package/scripts/init.ts +5 -6
  15. package/scripts/typecheck.test.ts +111 -97
  16. package/scripts/typecheck.ts +1 -1
  17. package/vona/docker-compose-original/docker-compose-dockerfile-app +1 -1
  18. package/vona/package.original.json +4 -5
  19. package/vona/packages-cli/cabloy-cli/package.json +1 -1
  20. package/vona/packages-cli/cli/package.json +1 -1
  21. package/vona/packages-cli/cli-set-api/package.json +1 -1
  22. package/vona/packages-cli/cli-set-api/src/lib/beans.ts +0 -2
  23. package/vona/packages-cli/cli-set-api/src/lib/commands.ts +0 -2
  24. package/vona/packages-utils/module-glob/package.json +2 -1
  25. package/vona/packages-utils/module-glob/src/index.ts +2 -26
  26. package/vona/packages-utils/module-glob/src/suites.ts +31 -0
  27. package/vona/packages-utils/module-glob/test/suites.test.ts +108 -0
  28. package/vona/packages-vona/vona/package.json +1 -1
  29. package/vona/pnpm-lock.yaml +28 -28
  30. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/product.test.ts +2 -0
  31. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/sku.test.ts +1 -0
  32. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuUniqueness.test.ts +9 -10
  33. package/vona/src/suite/a-commerce/modules/commerce-member/test/addressOwnership.test.ts +43 -16
  34. package/vona/src/suite/a-commerce/modules/commerce-member/test/addressPresentation.test.ts +7 -1
  35. package/vona/src/suite/a-commerce/modules/commerce-payment/test/paymentIndexes.test.ts +2 -1
  36. package/vona/src/suite/a-commerce/modules/commerce-promotion/test/couponReservation.test.ts +18 -9
  37. package/vona/src/suite/a-commerce/modules/commerce-trade/test/cartOwnership.test.ts +28 -11
  38. package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutReservation.test.ts +33 -21
  39. package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutTransaction.test.ts +6 -5
  40. package/vona/src/suite/a-commerce/modules/commerce-trade/test/orderSnapshot.test.ts +33 -25
  41. package/vona/src/suite/a-commerce/modules/commerce-trade/test/paymentOutcome.test.ts +31 -20
  42. package/vona/src/suite/a-commerce/modules/commerce-trade/test/refundLifecycle.test.ts +30 -30
  43. package/vona/src/suite/a-commerce/modules/commerce-trade/test/reservationExpiry.test.ts +24 -26
  44. package/vona/src/suite/a-commerce/modules/commerce-trade/test/shipment.test.ts +7 -2
  45. package/vona/src/suite/a-commerce/modules/commerce-trade/test/shipmentRefundRace.test.ts +15 -5
  46. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockBalance.test.ts +7 -5
  47. package/vona/src/suite/a-home/modules/home-user/test/account.test.ts +2 -2
  48. package/vona/src/suite/a-home/modules/home-user/test/accountActivation.test.ts +2 -1
  49. package/vona/src/suite/a-home/modules/home-user/test/accountOpenapi.test.ts +53 -42
  50. package/vona/src/suite/a-home/modules/home-user/test/accountPasswordReset.test.ts +1 -0
  51. package/vona/src/suite/a-home/modules/home-user/test/accountPasswordSet.test.ts +2 -1
  52. package/vona/src/suite/a-training/modules/training-record/test/record.test.ts +12 -7
  53. package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +23 -11
  54. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/package.json +1 -1
  55. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/test/rbacCatalogGuard.test.ts +5 -1
  56. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
  57. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/test/ssrMenuVisibility.test.ts +3 -3
  58. package/vona/src/suite-vendor/a-cabloy/package.json +2 -2
  59. package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
  60. package/vona/src/suite-vendor/a-vona/modules/a-metrics/package.json +1 -1
  61. package/vona/src/suite-vendor/a-vona/modules/a-metrics/test/middlewareSystem.health.test.ts +33 -12
  62. package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
  63. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/permissions.ts +3 -1
  64. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  65. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_crud_inner.ts +6 -2
  66. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_crud_table.ts +4 -4
  67. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsGroup.ts +12 -10
  68. package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
  69. package/vona/src/suite-vendor/a-vona/modules/a-security/package.json +1 -1
  70. package/vona/src/suite-vendor/a-vona/modules/a-security/test/origin.test.ts +1 -0
  71. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  72. package/vona/tsconfig.json +19 -35
  73. package/zova/package.original.json +5 -5
  74. package/zova/packages-cli/cli/package.json +3 -3
  75. package/zova/packages-cli/cli-set-front/package.json +3 -3
  76. package/zova/packages-utils/zova-vite/package.json +2 -2
  77. package/zova/packages-zova/zova/package.json +2 -2
  78. package/zova/pnpm-lock.yaml +2 -38
  79. package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
  80. package/zova/src/suite-vendor/a-zova/package.json +2 -2
  81. package/vona/packages-cli/cli-set-api/src/lib/bean/cli.bin.tsc.ts +0 -89
  82. package/vona/packages-cli/cli-set-api/src/lib/command/bin.tsc.ts +0 -24
  83. /package/{vona/packages-cli/cli-set-api/src/lib → scripts}/typescriptRunner.ts +0 -0
package/.cabloy-version CHANGED
@@ -1 +1 @@
1
- 5.1.224
1
+ 5.1.226
@@ -24,5 +24,5 @@ jobs:
24
24
  run: npm run init
25
25
  - name: typecheck runner tests
26
26
  run: npm run test:typecheck
27
- - name: legacy typecheck
28
- run: npm run tsc:legacy
27
+ - name: typecheck
28
+ run: npm run tsc
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.1.226
4
+
5
+ ### Features
6
+
7
+ - Add rules.
8
+
9
+ ### Bug Fixes
10
+
11
+ - Fix module glob handling on Windows.
12
+ - Correct issues in `test.ts`.
13
+
14
+ ### Improvements
15
+
16
+ - Refactor TypeScript compilation code.
17
+
18
+ ## 5.1.225
19
+
20
+ ### Features
21
+
22
+ - Apply feature updates.
23
+
24
+ ### Bug Fixes
25
+
26
+ - Fix test CI.
27
+
28
+ ### Improvements
29
+
30
+ - Update the pnpm version.
31
+
3
32
  ## 5.1.224
4
33
 
5
34
  ### 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.4.0`, pnpm `>=11.5.2`, 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`.
14
+ You need Git, Node.js `>=24.4.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
@@ -21,7 +21,7 @@ npm run init
21
21
 
22
22
  `npm run init` is more than a package install: it installs multiple workspaces, prepares generated local configuration, initializes and synchronizes Vona and Zova, and generates required frontend and backend artifacts. Run it intentionally rather than as a retry for an unrelated narrow change.
23
23
 
24
- CI workflows run after pushes to `main`; do not assume that every pull request is automatically validated. The SQLite unit-test and Chromium Basic/Commerce E2E workflows configure Ubuntu, Windows, and macOS with Node.js 24 and pnpm 11.5.2. Matrix configuration alone is not proof that the platform gates or all six Basic/Commerce E2E combinations passed. For maintained edition and onboarding guidance, see [Cabloy Editions](https://cabloy.com/editions/overview#cabloy-basic).
24
+ CI workflows run after pushes to `main`; do not assume that every pull request is automatically validated. The SQLite unit-test and Chromium Basic/Commerce E2E workflows configure Ubuntu, Windows, and macOS with Node.js 24 and pnpm 12.14.0. Matrix configuration alone is not proof that the platform gates or all six Basic/Commerce E2E combinations passed. For maintained edition and onboarding guidance, see [Cabloy Editions](https://cabloy.com/editions/overview#cabloy-basic).
25
25
 
26
26
  ## Develop and validate
27
27
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cabloy",
3
- "version": "5.1.224",
3
+ "version": "5.1.226",
4
4
  "gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
5
5
  "description": "A Node.js fullstack framework",
6
6
  "keywords": [
@@ -50,15 +50,9 @@
50
50
  "contract:generate:isolated": "node scripts/generateOpenapiIsolated.ts",
51
51
  "test:docs:e2e": "npm run docs:build && playwright test --config repo-e2e/docs/playwright.config.ts",
52
52
  "db:reset": "cd vona && npm run db:reset",
53
- "tsc": "npm run tsc:native",
54
- "tsc:force": "npm run tsc:zova:native && npm run tsc:vona:native:force",
53
+ "tsc": "npm run tsc:zova && npm run tsc:vona",
55
54
  "tsc:zova": "pnpm --dir zova run tsc",
56
- "tsc:native": "npm run tsc:zova:native && npm run tsc:vona:native",
57
- "tsc:legacy": "npm run tsc:zova:legacy && pnpm --dir vona run tsc:legacy",
58
- "tsc:zova:native": "node scripts/typecheck.ts native zova --noEmit --incremental false --project tsconfig.vue-tsc.json",
59
- "tsc:zova:legacy": "node scripts/typecheck.ts typescript zova --noEmit --incremental false --project tsconfig.vue-tsc.json",
60
- "tsc:vona:native": "pnpm --dir vona run tsc:native",
61
- "tsc:vona:native:force": "pnpm --dir vona run tsc:native:force",
55
+ "tsc:vona": "pnpm --dir vona run tsc",
62
56
  "test:typecheck": "node --test scripts/typecheck.test.ts",
63
57
  "deps:vona": "pnpm --dir vona run vona :tools:deps",
64
58
  "deps:zova": "pnpm --dir zova run zova :tools:deps",
@@ -116,7 +110,7 @@
116
110
  },
117
111
  "engines": {
118
112
  "node": ">=24.4.0",
119
- "pnpm": ">=11.5.2"
113
+ "pnpm": ">=12.14.0"
120
114
  },
121
115
  "packageManager": "pnpm@12.14.0"
122
116
  }
@@ -179,7 +179,7 @@
179
179
  {
180
180
  "adapter": "codex",
181
181
  "category": "skill",
182
- "sha256": "044824fcfceff8153b722b8239d81d939286cb05ec03f75e78cfd03afe465f5a",
182
+ "sha256": "a7aae017823a738fbf031424bb68b6cd982f0832102dfbe7320eacaf713919f8",
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
  },
@@ -249,7 +249,7 @@
249
249
  {
250
250
  "adapter": "codex",
251
251
  "category": "skill",
252
- "sha256": "846d81a0c8067900c4bcf3b9a854ca831cf4f0d2a184511fc6a01560da3b8dcb",
252
+ "sha256": "02ef6d9b6ac9f6746508b343281a2160ed55a05039f7c21677e216acde579792",
253
253
  "source": "skills/cabloy-spec-generation/SKILL.md",
254
254
  "target": ".agents/skills/cabloy-spec-generation/SKILL.md"
255
255
  },
@@ -515,7 +515,7 @@
515
515
  {
516
516
  "adapter": "claude",
517
517
  "category": "skill",
518
- "sha256": "044824fcfceff8153b722b8239d81d939286cb05ec03f75e78cfd03afe465f5a",
518
+ "sha256": "a7aae017823a738fbf031424bb68b6cd982f0832102dfbe7320eacaf713919f8",
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
  },
@@ -585,7 +585,7 @@
585
585
  {
586
586
  "adapter": "claude",
587
587
  "category": "skill",
588
- "sha256": "846d81a0c8067900c4bcf3b9a854ca831cf4f0d2a184511fc6a01560da3b8dcb",
588
+ "sha256": "02ef6d9b6ac9f6746508b343281a2160ed55a05039f7c21677e216acde579792",
589
589
  "source": "skills/cabloy-spec-generation/SKILL.md",
590
590
  "target": ".claude/skills/cabloy-spec-generation/SKILL.md"
591
591
  },
@@ -683,7 +683,7 @@
683
683
  {
684
684
  "adapter": "cursor",
685
685
  "category": "policy",
686
- "sha256": "b8453cbb90a6b75014615dea5ffb8f8e6b31be1e5c3392c1dc4bc0f4456adb57",
686
+ "sha256": "27ddaa18de3cd88e11dc20c0ad626fe07d5b6231f08243e3fbece7242dcbdc9a",
687
687
  "source": "policies/repository.md",
688
688
  "target": ".cursor/rules/cabloy-governance.mdc"
689
689
  },
@@ -865,7 +865,7 @@
865
865
  {
866
866
  "adapter": "cursor",
867
867
  "category": "skill",
868
- "sha256": "044824fcfceff8153b722b8239d81d939286cb05ec03f75e78cfd03afe465f5a",
868
+ "sha256": "a7aae017823a738fbf031424bb68b6cd982f0832102dfbe7320eacaf713919f8",
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
  },
@@ -935,7 +935,7 @@
935
935
  {
936
936
  "adapter": "cursor",
937
937
  "category": "skill",
938
- "sha256": "846d81a0c8067900c4bcf3b9a854ca831cf4f0d2a184511fc6a01560da3b8dcb",
938
+ "sha256": "02ef6d9b6ac9f6746508b343281a2160ed55a05039f7c21677e216acde579792",
939
939
  "source": "skills/cabloy-spec-generation/SKILL.md",
940
940
  "target": ".cursor/skills/cabloy-spec-generation/SKILL.md"
941
941
  },
@@ -1005,14 +1005,14 @@
1005
1005
  {
1006
1006
  "adapter": "codex",
1007
1007
  "category": "policy",
1008
- "sha256": "18d072d31b706f8eadda5d757ee3db7d69c4a7ea5e4c14dc33ab3ac307ae89e0",
1008
+ "sha256": "e5929a9b3fa63d76faa596fcd24a9faa4fc8bcadd3eae2e99507ac0b33567efe",
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": "18d072d31b706f8eadda5d757ee3db7d69c4a7ea5e4c14dc33ab3ac307ae89e0",
1015
+ "sha256": "e5929a9b3fa63d76faa596fcd24a9faa4fc8bcadd3eae2e99507ac0b33567efe",
1016
1016
  "source": "policies/repository.md",
1017
1017
  "target": "CLAUDE.md"
1018
1018
  }
@@ -71,6 +71,8 @@ Before inventing a custom implementation path:
71
71
  - Treat hooks, permissions, local settings, credentials, MCP registration, command discovery, and automatic command execution as platform-specific integrations, not portable rule or skill capabilities.
72
72
  - Plan to resolve named blockers for a bounded increment, not every future detail. Define finite exit criteria, batch related decisions, and require new facts, decision value, or explicit blocker reduction for further planning; do not substitute repeated refinement for delivery.
73
73
  - Scope blockers to their actual dependency branches and surface meaningful, independently verifiable implementation candidates elsewhere without executing them unapproved. Once the selected increment is ready, request missing execution approval or proceed within existing unchanged approval; do not repeatedly reconfirm the same scope. Preserve security gates and separate runtime evidence/release requirements; neither a planning-round quota nor empty scaffolding justifies bypass or completion.
74
+ - Prefer the smallest connected slice that delivers the approved business, framework, or tooling outcome. Justify new foundations, abstractions, and defensive mechanisms by a named existing or approved-scope consumer, or a concrete material risk; hypothetical reuse and isolated passing helper tests are not sufficient justification.
75
+ - Stop optional refinement once the approved outcome and required checks are satisfied. After user correction, redirect the approach rather than rename or repackage rejected work; correction does not authorize unrelated scope, destructive cleanup, or bypassing security and acceptance gates.
74
76
  - After implementation, do not launch broad reviews automatically; when review is needed, scope it to the current diff and report only high-confidence issues.
75
77
  - Sanitize machine-local paths before retaining or sharing evidence: preserve useful repository-relative locations, failures, exit codes, and source hashes; check the tool's supported coverage and manually review remaining sensitive data. Path sanitization is not secret scanning or acceptance proof.
76
78
  - Do not modify shared environment identity or ports merely to bypass a busy resource. For intentional parallel worktree setup, follow `repo-docs/fullstack/parallel-worktree-environment.md`; otherwise wait for the shared resource or ask the user. Create or change worktree-local environment overrides only through the explicitly invoked `cabloy-worktree-environment` skill and its confirmation phase, and only in `vona/env/.env.local` and `zova/env/.env.local`; never modify flavor-, mode-, app-mode-, or runtime-specific `.env.*.local` files. The skill derives the standard `APP_NAME`, `SERVER_LISTEN_PORT`, `DEV_SERVER_PORT`, `DEV_SERVER_HMR_PORT`, and API-derived `API_BASE_URL` tuple only from Git worktree metadata and fixed port baselines; never read or expose `.env*` content while recommending values. Admin and Web are alternative commands using this shared tuple and must not run concurrently in one worktree; use another linked worktree for concurrent use. Detect the active edition before choosing scripts, and never run `npm run init` as an automatic follow-up.
@@ -31,7 +31,7 @@ A new wrapper is a planned addition until implementation creates it in the durab
31
31
 
32
32
  ## 2. Target selection
33
33
 
34
- The normal unit of work is one WBS item. A phase may be selected only when the phase is a finite, explicitly approved batch and the WBS defines its task set and closure boundary.
34
+ The normal unit of work is one WBS item. A phase may be selected only when the phase is a finite, explicitly approved batch and the WBS defines its task set and closure boundary. Use the existing scope and authority description to identify the observable business, framework, or tooling outcome and the minimum connected implementation path that delivers it; include supporting work only where that path or a concrete material risk requires it.
35
35
 
36
36
  A valid target dossier names:
37
37
 
@@ -71,7 +71,7 @@ Before implementation, verify:
71
71
  - tenant, identity, authorization, ownership, privacy, lifecycle, transaction, concurrency, idempotency, audit, and recovery constraints are defined for the task’s risk;
72
72
  - the requested change does not broaden scope or create a competing persistence, identity, or API authority.
73
73
 
74
- Apply readiness to the selected increment and its real dependency graph. Record each blocker with its affected branch, decision owner and finite closure condition in existing records; keep future refinements and release-only questions separate. Do not require the new implementation's runtime ATP evidence before implementation starts, but retain required predecessor evidence and any specifically mandated pre-implementation qualification. When blocked, surface one meaningful, independently verifiable alternative if available, without executing it unapproved or changing formal dependencies/status to bypass the blocker. A foundation-only subincrement needs concrete integration value, checks and explicit scope approval; it does not complete the parent WBS.
74
+ Apply readiness to the selected increment and its real dependency graph. Record each blocker with its affected branch, decision owner and finite closure condition in existing records; keep future refinements and release-only questions separate. Do not require the new implementation's runtime ATP evidence before implementation starts, but retain required predecessor evidence and any specifically mandated pre-implementation qualification. When blocked, surface one meaningful, independently verifiable alternative if available, without executing it unapproved or changing formal dependencies/status to bypass the blocker. A foundation-only subincrement needs a named existing or approved-scope consumer and integration path, or a concrete invariant, defect, or material risk it addresses, plus checks and explicit scope approval. A planned consumer need not already exist in source, but hypothetical reuse and isolated passing helper tests do not establish integration value. Such work does not complete the parent WBS.
75
75
 
76
76
  When authority records conflict, stop the affected work. Update the authoritative PRD, SRS, or ADR through `cabloy-spec-generation`, then propagate the change through WBS, ATP, evidence assumptions, and progress. Do not reconcile a conflict by silently editing a downstream status or implementation plan. A return to planning must name the new fact, material authority question or blocker to resolve and its exit condition; do not restart a preparation/review cycle merely to restate accepted direction. Batch related decisions and report stalled convergence if further refinement has no justified new value.
77
77
 
@@ -143,6 +143,10 @@ The coordinator may pass the dossier to the specialist; it should not duplicate
143
143
 
144
144
  Start with the narrowest meaningful check, then execute linked ATP procedures and only the required release gates. Explicitly preserve test-owned fixture cleanup, separate `mockCtx(...)` boundaries for competing Vona operations, synthetic/redacted data, and the test plan’s database/flavor requirements.
145
145
 
146
+ Verify the approved connected outcome, not merely supporting helper behavior. Once that outcome and its applicable required checks are satisfied, stop optional abstraction, hardening, and cleanup; report remaining improvements without automatically implementing them. Keep any outstanding acceptance or release gates explicit rather than claiming full completion. This does not waive necessary security, tenant isolation, privacy, lifecycle correctness, migration, or mandatory evidence requirements.
147
+
148
+ After user correction, redirect the affected approach rather than rename, relocate, or repackage rejected work. Reassess only the affected scope and preserve valid unchanged approvals; the correction does not itself authorize destructive cleanup or a different feature.
149
+
146
150
  Stop and report rather than guessing when:
147
151
 
148
152
  - a command to run is not yet observed, or a creation path lacks the explicit approved-new design/ADR/execution boundary; future source absence alone is not a blocker for an approved creation task;
@@ -75,7 +75,7 @@ For the next bounded increment, keep a finite blocker/exit checklist in the exis
75
75
 
76
76
  Before proposing more planning, identify the blocker or material uncertainty it addresses, the new fact or decision value expected, and the exit condition or resulting implementation handoff. If another pass merely restates accepted direction or leaves the same blockers without a justified new approach, report the stalled convergence and recommend a concrete decision, bounded feasibility check or scope disposition instead of another micro-plan. Do not impose a fixed round limit or weaken security requirements to force code.
77
77
 
78
- Apply blockers only along actual dependencies, not to the whole suite by default. Surface one meaningful, independently verifiable implementation candidate on an unaffected branch when available; do not invent one or use empty scaffolding/document counts as progress. A foundation-only increment must have explicit integration value and its own checks, and must not be reported as completion of its parent feature. If none is ready, state the exact reason.
78
+ Apply blockers only along actual dependencies, not to the whole suite by default. Surface one meaningful, independently verifiable implementation candidate on an unaffected branch when available; do not invent one or use empty scaffolding/document counts as progress. Prefer a thin connected slice of the approved business, framework, or tooling outcome over horizontal infrastructure milestones. A foundation-only increment must name an existing or approved-scope consumer and integration path, or a concrete invariant, defect, or material risk it addresses, with checks demonstrating that value; hypothetical reuse and isolated passing helper tests are insufficient justification. A planned consumer need not already exist in source. Such work must not be reported as completion of its parent feature. If none is ready, state the exact reason.
79
79
 
80
80
  Stop refining when the selected increment's material contracts, dependencies, scope, safety constraints and verification plan are sufficient. Request only missing execution approval, or hand off within existing explicit approval whose scope and conditions remain valid. Reopen settled decisions only for a material change or newly observed risk. Generation/design approval alone still does not authorize implementation; runtime ATP proof and release approval remain later gates, not proof that must already exist for the new implementation to start.
81
81
 
@@ -67,7 +67,9 @@ Readiness gates, evidence gates, and release gates are also distinct:
67
67
 
68
68
  ## Deliver bounded, verified vertical increments
69
69
 
70
- The controlled execution unit is one named WBS item or an explicitly approved finite phase with a defined closure boundary—not an open-ended request to finish a suite or continue automatically.
70
+ The controlled execution unit is one named WBS item or an explicitly approved finite phase with a defined closure boundary—not an open-ended request to finish a suite or continue automatically. Prefer the smallest connected slice that delivers the approved business, framework, or tooling outcome, with supporting work limited to that path and its concrete risks.
71
+
72
+ For example, a tool integration can demonstrate discovery → guarded invocation → an existing business operation → a bounded result. An unattached configuration helper with passing isolated tests does not establish that flow. The helper can still be a valid increment when it serves a named existing or approved-scope integration, or resolves a concrete defect or material risk; a planned consumer need not already exist in source. This example does not authorize a particular tool or public endpoint.
71
73
 
72
74
  Before source work begins, an **execution dossier** makes the unit explicit: target and revision, linked authority, dependencies, scope and exclusions, safety and ownership constraints, permitted verification, expected evidence, allowed record updates, blockers, and one next action. After work, a **resumable handoff** records the implemented scope, procedures actually run, resulting evidence and status, any gap or blocker, and exactly one next action.
73
75
 
@@ -79,10 +81,12 @@ Planning should resolve the material blockers of the next bounded increment, not
79
81
 
80
82
  Before adding a planning pass, explain which blocker or material uncertainty it addresses, what new fact or decision value it should provide, and how it ends. If the next pass only restates an accepted direction without a justified new approach to the remaining blockers, report stalled convergence and recommend a concrete decision, bounded feasibility check, or scope disposition. A larger document or another review is not delivery progress by itself.
81
83
 
82
- Blockers follow actual dependencies, not the whole suite by default. A blocked identity integration does not necessarily block an independent capability whose own contracts, dependencies, safety boundary, and verification plan are ready. Conversely, a frontend change that depends on an unresolved response contract cannot bypass that dependency by calling itself an independent increment. Surface a meaningful, independently verifiable candidate for approval when available; if none exists, state why. Foundation-only work is useful only when it has explicit integration value and checks, not merely an empty scaffold presented as feature completion.
84
+ Blockers follow actual dependencies, not the whole suite by default. A blocked identity integration does not necessarily block an independent capability whose own contracts, dependencies, safety boundary, and verification plan are ready. Conversely, a frontend change that depends on an unresolved response contract cannot bypass that dependency by calling itself an independent increment. Surface a meaningful, independently verifiable candidate for approval when available; if none exists, state why. Foundation-only work needs a named existing or approved-scope consumer and integration path, or a concrete invariant, defect, or material risk it addresses, with checks demonstrating that value. Hypothetical future reuse, local elegance, document counts, or isolated passing helper tests are not enough; supporting work must not be presented as parent-feature completion.
83
85
 
84
86
  Planning is sufficient for an increment when its material contracts, dependencies, scope, safety constraints, and verification plan are settled. At that point, request any missing execution approval or proceed within valid existing approval. Reuse an unchanged approved dossier after checking current revision, worktree attribution, and evidence applicability; a skill handoff, resumed session, or ordinary implementation substep is not a reason to request the same permission again. Material changes, newly observed risks, and the approval's own conditions can require renewed approval; prior approval never covers unrelated tasks or unapproved external/destructive operations.
85
87
 
88
+ Convergence also applies during implementation: once the approved outcome and applicable required checks are satisfied, stop optional abstraction, hardening, and cleanup. Report remaining improvements without automatically executing them, and keep outstanding acceptance or release gates explicit. After user correction, redirect the affected approach rather than rename or repackage rejected work; correction does not itself authorize destructive cleanup or a different feature.
89
+
86
90
  This is not a fixed limit on planning rounds or a relaxation of security requirements. Preserve mandatory reviews, predecessor proof, and any specifically required pre-implementation qualification. The new implementation's runtime ATP proof normally follows implementation; it must not become an impossible prerequisite to writing that implementation. Evidence and release gates still control later verification and release claims. A genuine new risk can reopen planning, but the return should name the affected blocker and its exit condition rather than restart open-ended refinement.
87
91
 
88
92
  ## Contract Loop is complementary
@@ -16,14 +16,14 @@ Use this page when you are contributing backend work in the framework repository
16
16
 
17
17
  ## Prerequisites
18
18
 
19
- | Name | Version |
20
- | ---------- | -------- |
21
- | pnpm | >=11.5.2 |
22
- | Node.js | >=24.8.0 |
23
- | Redis | >=7.2.6 |
24
- | Sqlite3 | Built-in |
25
- | MySQL | >=8 |
26
- | Postgresql | >=16 |
19
+ | Name | Version |
20
+ | ---------- | --------- |
21
+ | pnpm | >=12.14.0 |
22
+ | Node.js | >=24.8.0 |
23
+ | Redis | >=7.2.6 |
24
+ | Sqlite3 | Built-in |
25
+ | MySQL | >=8 |
26
+ | Postgresql | >=16 |
27
27
 
28
28
  Notes:
29
29
 
@@ -6,14 +6,14 @@ This guide explains the fastest way to start a Cabloy fullstack project.
6
6
 
7
7
  Before creating a new Cabloy project, make sure your environment has:
8
8
 
9
- | Name | Version |
10
- | ------------ | ---------- |
11
- | `pnpm` | `>=11.5.2` |
12
- | `Node.js` | `>=24.4.0` |
13
- | `Redis` | `>=7.2.6` |
14
- | `SQLite3` | `Built-in` |
15
- | `MySQL` | `>=8` |
16
- | `PostgreSQL` | `>=16` |
9
+ | Name | Version |
10
+ | ------------ | ----------- |
11
+ | `pnpm` | `>=12.14.0` |
12
+ | `Node.js` | `>=24.4.0` |
13
+ | `Redis` | `>=7.2.6` |
14
+ | `SQLite3` | `Built-in` |
15
+ | `MySQL` | `>=8` |
16
+ | `PostgreSQL` | `>=16` |
17
17
 
18
18
  - `Redis`: powers queue, schedule, startup, broadcast, caching, two-layer cache, and redlock
19
19
  - `SQLite3`: if you use `better-sqlite3`, set up `node-gyp` before installing dependencies
@@ -36,9 +36,9 @@ For the Start onboarding distinction, read [Cabloy Editions: Cabloy Start](/edit
36
36
 
37
37
  If you are not sure which edition you are using or which one to choose, read [Cabloy Editions](/editions/overview).
38
38
 
39
- ### pnpm 11 supply-chain protection note
39
+ ### pnpm 12 supply-chain protection note
40
40
 
41
- `pnpm` 11 enables the `minimumReleaseAge` supply-chain protection by default. Newly published packages may be blocked for a short time window before `pnpm` allows installation.
41
+ `pnpm` 12 enables the `minimumReleaseAge` supply-chain protection by default. Newly published packages may be blocked for a short time window before `pnpm` allows installation.
42
42
 
43
43
  This matters for `npm create cabloy` because the command downloads Cabloy from npm and then automatically runs `npm run init`. If your environment blocks newly published packages during that flow, temporarily set `pnpm_config_minimum_release_age=0` for the current shell session and rerun the command.
44
44
 
@@ -46,7 +46,7 @@ This matters for `npm create cabloy` because the command downloads Cabloy from n
46
46
 
47
47
  ```powershell
48
48
  $env:pnpm_config_minimum_release_age = "0"
49
- npm create cabloy
49
+ npm create cabloy@latest
50
50
  ```
51
51
 
52
52
  #### Windows Command Prompt
@@ -44,9 +44,8 @@ Cabloy Basic exposes these shared root scripts:
44
44
  - `npm run contract:generate:isolated`
45
45
  - `npm run db:reset`
46
46
  - `npm run tsc`
47
- - `npm run tsc:force`
48
- - `npm run tsc:native`
49
- - `npm run tsc:legacy`
47
+ - `npm run tsc:zova`
48
+ - `npm run tsc:vona`
50
49
  - `npm run test:typecheck`
51
50
  - `npm run docs:dev`
52
51
  - `npm run docs:build`
@@ -58,28 +57,28 @@ Cabloy Basic exposes these shared root scripts:
58
57
 
59
58
  Cabloy Basic keeps two TypeScript toolchains: root `@typescript/native` is the exact npm alias `npm:typescript@7.0.2`, while classic `typescript` 5.9.3 remains available for compiler-API consumers and existing tooling. The alias changes the dependency name, not the executable name: its package still declares `bin.tsc`, not a separate `native` or `tsgo` command.
60
59
 
61
- Use the explicit root commands to select the verification toolchain:
60
+ Use the root commands to select the workspace scope:
62
61
 
63
- | Root command | Scope |
64
- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- |
65
- | `npm run tsc` / `npm run tsc:native` | Check Zova, then the complete Vona graph, with native TypeScript; reuse Vona incremental results. |
66
- | `npm run tsc:force` | Check the same scopes with native TypeScript, forcing Vona to rebuild. |
67
- | `npm run tsc:legacy` | Check the same scopes with classic TypeScript. |
68
- | `npm run tsc:zova:native` | Check Zova with native TypeScript. |
69
- | `npm run tsc:zova:legacy` | Check Zova with classic TypeScript. |
70
- | `npm run tsc:vona:native` | Check the complete Vona graph with native TypeScript, reusing incremental results. |
71
- | `npm run tsc:vona:native:force` | Force native checking of the complete Vona graph. |
72
- | `npm run test:typecheck` | Test compiler selection, argument and failure propagation, Vona graph traversal, and installed compiler versions/API availability. |
62
+ | Root command | Scope |
63
+ | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
64
+ | `npm run tsc` | Check Zova, then Vona, through their workspace defaults: single-project, no-emit checks with native TypeScript and incremental caching disabled. |
65
+ | `npm run tsc:zova` | Check Zova through its workspace `tsc` script. |
66
+ | `npm run tsc:vona` | Check Vona through its workspace `tsc` script. |
67
+ | `npm run test:typecheck` | Test compiler selection, argument and failure propagation, daily-check configuration/scripts, CLI command registration, and installed compiler versions/API availability. |
73
68
 
74
- `scripts/typecheck.ts` delegates to the package-resolving runner in `vona/packages-cli/cli-set-api/src/lib/typescriptRunner.ts`. It resolves `@typescript/native` or `typescript` from the target workspace, reads that package's `bin.tsc`, and invokes it directly with Node. Native Vona checks use the same runner. This avoids relying on `PATH` or a shared `.bin/tsc` name to identify the selected compiler.
69
+ `scripts/typecheck.ts` delegates to the package-resolving runner in `scripts/typescriptRunner.ts`. It resolves `@typescript/native` or `typescript` from the target workspace, reads that package's `bin.tsc`, and invokes it directly with Node. Native Vona checks use the same runner. This avoids relying on `PATH` or a shared `.bin/tsc` name to identify the selected compiler.
75
70
 
76
- Both explicit Zova checks use `tsconfig.vue-tsc.json` with `--noEmit --incremental false`. Native Vona checks retain build mode (`-b`), visiting the project, every local suite, and every standalone local module, rather than replacing that graph with a root-only no-emit check. The default native check omits `--force`; `tsc:force` adds it without changing the traversal scope. Zova's cache policy is unchanged, so the force distinction applies to Vona. The explicit legacy check continues to force a rebuild. Vona's emitted files and build-info artifacts are shared between compiler versions: run native and legacy checks **serially**, and coordinate them with other operations writing the same artifacts. After switching from TS5 back to native, run `npm run tsc:force` before relying on incremental checks. Forced rebuilding prevents one compiler's incremental state from standing in for verification by the other; it does not isolate their output.
71
+ Explicit native and legacy checks use `--noEmit --incremental false`: Zova selects `tsconfig.vue-tsc.json`, and Vona selects `tsconfig.json`. Vona's daily config has no `include` or project `references`; default source discovery is filtered by `exclude`, following Zova's approach. Backend/application/module source and module tests are checked together in one program. CLI tooling, package-directory roots, dependencies, distribution output, and generated runtime/REST directories are excluded from initial discovery. Exclusions are not import barriers: required framework/package source and hidden module metadata still participate through imports. Unreferenced hidden helpers and generated `.vona` bootstraps are not independent daily-check roots.
77
72
 
78
- Root `npm run tsc` delegates to incremental `tsc:native` for daily development; use `tsc:force` for full forced verification and `tsc:legacy` for comparison or fallback. The nested Vona and Zova `tsc` defaults, frontend `prerun`, build commands, package publish emitters, and REST emitters remain unchanged. Classic TypeScript remains installed for compiler-JavaScript-API consumers, including SWC configuration loading, Rollup integration, and OpenAPI generation; the existing REST native-preview emitter dependency is also retained.
73
+ Root `npm run tsc` runs `tsc:zova`, then `tsc:vona`; these are the only root `tsc` entrypoints. Compiler selection remains in the nested workspaces: use `pnpm --dir zova run tsc:legacy` or `pnpm --dir vona run tsc:legacy` for comparison or fallback, and the corresponding workspace `tsc:native` scripts for explicit native checks. The former `tsc:force`, `tsc:vona:native:force`, and nested Vona `tsc:native:force` aliases have been removed: these source checks neither run a project build nor emit declarations/build-info files. Each module's existing publication scripts remain responsible for its declaration output; there is no separate root declaration-validation workflow.
79
74
 
80
- The native alias is installed at the repository root, not in either nested workspace. Run `pnpm install` at the root after updating the checkout; a missing alias fails with an installation diagnostic rather than silently selecting the legacy compiler. A standalone Vona project using `--compiler=native` must install that alias in its project or an ancestor. Do not use a bare root `tsc`/`pnpm exec tsc` to choose a compiler, because both packages declare the same binary name.
75
+ In both nested workspaces, `npm run tsc` delegates to `npm run tsc:native`. Native and legacy checks first run `npm run prerun`, then invoke the selected compiler with incremental caching disabled. Root workspace aliases delegate to these scripts too, so dependency and generated metadata preparation is not bypassed. Each workspace's `prerun` runs only its `:tools:deps` command; it does not call `tsc`, avoiding recursive script execution. Preparation may refresh generated metadata or dependency manifests and install changed dependencies, while the compiler step itself emits no declarations or build-info files.
81
76
 
82
- The `vona-tsc` CI workflow runs root `npm run test:typecheck`, then root `npm run tsc:force`, after its existing initialization. The root release workflow also runs `tsc:force` before versioning/publishing (excluding changelog-only and GitHub-release-only runs), and its post-release compensation verification uses the same forced entrypoint. These gates retain forced verification even though daily checking is incremental. Check the active repository before assuming the same aliases or commands exist in Cabloy Start.
77
+ Zova development and build entrypoints call `npm run prerun` before Quasar or REST emission to prepare dependencies and generated metadata without automatically running a typecheck. Run `npm run tsc`, `npm run tsc:native`, or `npm run tsc:legacy` explicitly inside the Zova workspace when source typechecking is needed. The former multi-project Vona CLI command `:bin:tsc` has been removed; use the project checking scripts instead. Module publication configurations and REST emitters are unchanged. Classic TypeScript remains installed for compiler-JavaScript-API consumers, including SWC configuration loading, Rollup integration, and OpenAPI generation; the existing REST native-preview emitter dependency is also retained.
78
+
79
+ The native alias is installed at the repository root, not in either nested workspace. Run `pnpm install` at the root after updating the checkout; a missing alias fails with an installation diagnostic rather than silently selecting the legacy compiler. Do not use a bare root `tsc`/`pnpm exec tsc` to choose a compiler, because both packages declare the same binary name.
80
+
81
+ The `vona-tsc` CI workflow runs root `npm run test:typecheck`, then root `npm run tsc`, after its existing initialization. The root release workflow runs `npm run tsc` before versioning/publishing (excluding changelog-only and GitHub-release-only runs), and its post-release compensation verification uses the same default entrypoint. CI and release checks therefore both use native TypeScript source checks through the workspace defaults, with incremental caching disabled. Check the active repository before assuming the same aliases or commands exist in Cabloy Start.
83
82
 
84
83
  ## Test isolation and development data {#test-isolation-and-development-data}
85
84
 
@@ -137,7 +136,7 @@ For deliberate **dev-mode** database preparation, `npm run db:reset` is a separa
137
136
 
138
137
  <span id="native-windows-unit-tests"></span>
139
138
 
140
- The Cabloy Basic SQLite unit-test workflow and Chromium application E2E workflow configure native Windows runners alongside Ubuntu and macOS. Each E2E suite has its own three-OS matrix with `fail-fast: false`, Node.js 24, pnpm 11.5.2, and SQLite. Basic selects `cabloy-basic home-user-account`; Commerce selects `a-commerce markdown` and retains its explicit Commerce artifact build and Vona dependency synchronization. A configured matrix is not proof of a successful run: inspect the focused gates, real Windows Chromium lifecycle regressions, and all six hosted Basic/Commerce suite-and-OS results before claiming verified platform compatibility.
139
+ The Cabloy Basic SQLite unit-test workflow and Chromium application E2E workflow configure native Windows runners alongside Ubuntu and macOS. Each E2E suite has its own three-OS matrix with `fail-fast: false`, Node.js 24, pnpm 12.14.0, and SQLite. Basic selects `cabloy-basic home-user-account`; Commerce selects `a-commerce markdown` and retains its explicit Commerce artifact build and Vona dependency synchronization. A configured matrix is not proof of a successful run: inspect the focused gates, real Windows Chromium lifecycle regressions, and all six hosted Basic/Commerce suite-and-OS results before claiming verified platform compatibility.
141
140
 
142
141
  On Windows, the managed test entrypoints require Node.js with npm, PowerShell 7 (`pwsh.exe` on `PATH`), local NTFS storage, and a reachable Redis service. E2E also requires Playwright's Chromium installation and current SSR/REST artifacts with Vona dependencies synchronized. PowerShell is an internal helper dependency, not a required interactive terminal. From either CMD or PowerShell, use the same public commands:
143
142
 
package/scripts/init.ts CHANGED
@@ -19,7 +19,7 @@ const ROOT_DIR = resolve(__dirname, '..');
19
19
  const VONA_DIR = resolve(ROOT_DIR, 'vona');
20
20
  const ZOVA_DIR = resolve(ROOT_DIR, 'zova');
21
21
  const REPO_DOCS_DIR = resolve(ROOT_DIR, 'repo-docs');
22
- const PNPM_VERSION = '11.5.2';
22
+ const PNPM_VERSION = '12.14.0';
23
23
  const VERSION_MARKER_FILE = '.cabloy-version';
24
24
 
25
25
  // --- Helpers ---
@@ -52,11 +52,10 @@ function pnpmInstall(cwd = ROOT_DIR): void {
52
52
 
53
53
  function checkPnpm(): void {
54
54
  const version = execQuiet('pnpm --version').trimEnd();
55
- const [major, minor, patch] = version.split('.').map(item => Number.parseInt(item, 10) || 0);
56
- const lowerMajor = major < 11;
57
- const lowerMinor = major === 11 && minor < 5;
58
- const lowerPatch = major === 11 && minor === 5 && patch < 2;
59
- if (lowerMajor || lowerMinor || lowerPatch) {
55
+ const [major, minor] = version.split('.').map(item => Number.parseInt(item, 10) || 0);
56
+ const lowerMajor = major < 12;
57
+ const lowerMinor = major === 12 && minor < 14;
58
+ if (lowerMajor || lowerMinor) {
60
59
  throw new Error(`pnpm should >= ${PNPM_VERSION}, current: ${version}`);
61
60
  }
62
61
  }