cabloy 5.1.225 → 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.
- package/.cabloy-version +1 -1
- package/.github/workflows/vona-tsc.yml +2 -2
- package/CHANGELOG.md +15 -0
- package/package.json +3 -9
- package/repo-agent-governance/managed-assets.json +9 -9
- package/repo-agent-governance/policies/repository.md +2 -0
- package/repo-agent-governance/skills/cabloy-spec-execution/references/execution-protocol.md +6 -2
- package/repo-agent-governance/skills/cabloy-spec-generation/SKILL.md +1 -1
- package/repo-docs/ai/ai-spec-driven-development.md +6 -2
- package/repo-docs/reference/repo-scripts.md +18 -19
- package/scripts/typecheck.test.ts +107 -94
- package/scripts/typecheck.ts +1 -1
- package/vona/package.original.json +3 -4
- package/vona/packages-cli/cabloy-cli/package.json +1 -1
- 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/beans.ts +0 -2
- package/vona/packages-cli/cli-set-api/src/lib/commands.ts +0 -2
- package/vona/packages-utils/module-glob/package.json +2 -1
- package/vona/packages-utils/module-glob/src/index.ts +2 -26
- package/vona/packages-utils/module-glob/src/suites.ts +31 -0
- package/vona/packages-utils/module-glob/test/suites.test.ts +108 -0
- package/vona/packages-vona/vona/package.json +1 -1
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/product.test.ts +2 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/sku.test.ts +1 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuUniqueness.test.ts +9 -10
- package/vona/src/suite/a-commerce/modules/commerce-member/test/addressOwnership.test.ts +43 -16
- package/vona/src/suite/a-commerce/modules/commerce-member/test/addressPresentation.test.ts +7 -1
- package/vona/src/suite/a-commerce/modules/commerce-payment/test/paymentIndexes.test.ts +2 -1
- package/vona/src/suite/a-commerce/modules/commerce-promotion/test/couponReservation.test.ts +18 -9
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/cartOwnership.test.ts +28 -11
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutReservation.test.ts +33 -21
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutTransaction.test.ts +6 -5
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/orderSnapshot.test.ts +33 -25
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/paymentOutcome.test.ts +31 -20
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/refundLifecycle.test.ts +30 -30
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/reservationExpiry.test.ts +24 -26
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/shipment.test.ts +7 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/shipmentRefundRace.test.ts +15 -5
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockBalance.test.ts +7 -5
- package/vona/src/suite/a-home/modules/home-user/test/account.test.ts +2 -2
- package/vona/src/suite/a-home/modules/home-user/test/accountActivation.test.ts +2 -1
- package/vona/src/suite/a-home/modules/home-user/test/accountOpenapi.test.ts +53 -42
- package/vona/src/suite/a-home/modules/home-user/test/accountPasswordReset.test.ts +1 -0
- package/vona/src/suite/a-home/modules/home-user/test/accountPasswordSet.test.ts +2 -1
- package/vona/src/suite/a-training/modules/training-record/test/record.test.ts +12 -7
- package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +23 -11
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/test/rbacCatalogGuard.test.ts +5 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/test/ssrMenuVisibility.test.ts +3 -3
- package/vona/src/suite-vendor/a-cabloy/package.json +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-metrics/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-metrics/test/middlewareSystem.health.test.ts +33 -12
- package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/permissions.ts +3 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_crud_inner.ts +6 -2
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_crud_table.ts +4 -4
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsGroup.ts +12 -10
- package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-security/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-security/test/origin.test.ts +1 -0
- package/vona/src/suite-vendor/a-vona/package.json +1 -1
- package/vona/tsconfig.json +19 -35
- package/zova/package.original.json +4 -4
- package/zova/packages-cli/cli/package.json +3 -3
- package/zova/packages-cli/cli-set-front/package.json +3 -3
- package/zova/packages-utils/zova-vite/package.json +2 -2
- package/zova/packages-zova/zova/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/package.json +2 -2
- package/vona/packages-cli/cli-set-api/src/lib/bean/cli.bin.tsc.ts +0 -89
- package/vona/packages-cli/cli-set-api/src/lib/command/bin.tsc.ts +0 -24
- /package/{vona/packages-cli/cli-set-api/src/lib → scripts}/typescriptRunner.ts +0 -0
package/.cabloy-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
5.1.
|
|
1
|
+
5.1.226
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
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
|
+
|
|
3
18
|
## 5.1.225
|
|
4
19
|
|
|
5
20
|
### Features
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cabloy",
|
|
3
|
-
"version": "5.1.
|
|
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:
|
|
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:
|
|
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",
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
{
|
|
180
180
|
"adapter": "codex",
|
|
181
181
|
"category": "skill",
|
|
182
|
-
"sha256": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
@@ -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:
|
|
48
|
-
- `npm run tsc:
|
|
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
|
|
60
|
+
Use the root commands to select the workspace scope:
|
|
62
61
|
|
|
63
|
-
| Root command
|
|
64
|
-
|
|
|
65
|
-
| `npm run tsc`
|
|
66
|
-
| `npm run tsc:
|
|
67
|
-
| `npm run tsc:
|
|
68
|
-
| `npm run
|
|
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 `
|
|
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
|
-
|
|
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`
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
|
@@ -7,11 +7,8 @@ import path from 'node:path';
|
|
|
7
7
|
import test from 'node:test';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
resolveTypeScriptCompiler,
|
|
13
|
-
runTypeScript,
|
|
14
|
-
} from '../vona/packages-cli/cli-set-api/src/lib/typescriptRunner.ts';
|
|
10
|
+
import { commands } from '../vona/packages-cli/cli-set-api/src/lib/commands.ts';
|
|
11
|
+
import { resolveTypeScriptCompiler, runTypeScript } from './typescriptRunner.ts';
|
|
15
12
|
|
|
16
13
|
const root = fileURLToPath(new URL('../', import.meta.url));
|
|
17
14
|
|
|
@@ -65,104 +62,120 @@ test('selects exact packages, preserving compiler argv, cwd and failures', async
|
|
|
65
62
|
}
|
|
66
63
|
});
|
|
67
64
|
|
|
68
|
-
test('Vona
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
65
|
+
test('Vona command discovery omits the retired typecheck CLI and retains builds', () => {
|
|
66
|
+
assert.equal(Object.hasOwn(commands.bin, 'tsc'), false);
|
|
67
|
+
assert.equal(commands.bin.build.bean, 'bin.build');
|
|
68
|
+
assert.equal(commands.bin.buildModule.bean, 'bin.buildModule');
|
|
69
|
+
assert.equal(commands.bin.buildGeneral.bean, 'bin.buildGeneral');
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('daily checks and CI use single-project workspace defaults', () => {
|
|
73
|
+
const scripts = JSON.parse(readFileSync(path.join(root, 'package.json'), 'utf8')).scripts;
|
|
74
|
+
const vonaScripts = JSON.parse(
|
|
75
|
+
readFileSync(path.join(root, 'vona/package.original.json'), 'utf8'),
|
|
76
|
+
).scripts;
|
|
77
|
+
assert.deepEqual(
|
|
78
|
+
Object.keys(scripts)
|
|
79
|
+
.filter(name => name === 'tsc' || name.startsWith('tsc:'))
|
|
80
|
+
.sort(),
|
|
81
|
+
['tsc', 'tsc:vona', 'tsc:zova'],
|
|
82
|
+
);
|
|
83
|
+
assert.equal(scripts.tsc, 'npm run tsc:zova && npm run tsc:vona');
|
|
84
|
+
assert.equal(scripts['tsc:zova'], 'pnpm --dir zova run tsc');
|
|
85
|
+
assert.equal(scripts['tsc:vona'], 'pnpm --dir vona run tsc');
|
|
86
|
+
assert.equal(vonaScripts['tsc:native:force'], undefined);
|
|
87
|
+
for (const workspace of ['vona', 'zova']) {
|
|
88
|
+
const workspaceScripts = JSON.parse(
|
|
89
|
+
readFileSync(path.join(root, workspace, 'package.original.json'), 'utf8'),
|
|
90
|
+
).scripts;
|
|
91
|
+
const project = workspace === 'vona' ? 'tsconfig.json' : 'tsconfig.vue-tsc.json';
|
|
92
|
+
assert.equal(workspaceScripts.tsc, 'npm run tsc:native');
|
|
93
|
+
assert.equal(workspaceScripts.prerun, `npm run ${workspace} :tools:deps`);
|
|
94
|
+
for (const [variant, compiler] of [
|
|
95
|
+
['native', 'native'],
|
|
96
|
+
['legacy', 'typescript'],
|
|
97
|
+
]) {
|
|
98
|
+
assert.equal(
|
|
99
|
+
workspaceScripts[`tsc:${variant}`],
|
|
100
|
+
`npm run prerun && node ../scripts/typecheck.ts ${compiler} ${workspace} --noEmit --incremental false --project ${project}`,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
104
103
|
assert.deepEqual(
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
JSON.parse(readFileSync(path.join(root, workspace, 'package.json'), 'utf8')).scripts,
|
|
105
|
+
workspaceScripts,
|
|
107
106
|
);
|
|
108
|
-
|
|
109
|
-
for (const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
.
|
|
114
|
-
.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
args,
|
|
123
|
-
compiler: '@typescript/native',
|
|
124
|
-
})),
|
|
125
|
-
);
|
|
107
|
+
if (workspace === 'zova') {
|
|
108
|
+
for (const [name, command] of Object.entries(workspaceScripts)) {
|
|
109
|
+
if (
|
|
110
|
+
name.startsWith('dev:') ||
|
|
111
|
+
name.startsWith('build:spa') ||
|
|
112
|
+
name.startsWith('build:ssr:') ||
|
|
113
|
+
name.startsWith('build:rest:')
|
|
114
|
+
) {
|
|
115
|
+
if (name.endsWith('Batch')) continue;
|
|
116
|
+
assert.ok(
|
|
117
|
+
(command as string).startsWith('npm run prerun && '),
|
|
118
|
+
`${name} must prepare without an automatic typecheck`,
|
|
119
|
+
);
|
|
120
|
+
}
|
|
126
121
|
}
|
|
127
122
|
}
|
|
128
|
-
assert.equal(calls.length, 3, 'native must not use the legacy binary helper');
|
|
129
|
-
} finally {
|
|
130
|
-
rmSync(dir, { recursive: true, force: true });
|
|
131
123
|
}
|
|
124
|
+
const workflow = readFileSync(path.join(root, '.github/workflows/vona-tsc.yml'), 'utf8');
|
|
125
|
+
assert.match(workflow, /run: npm run tsc\s*$/m);
|
|
126
|
+
assert.doesNotMatch(workflow, /run:.*\btsc:[\w-]+/);
|
|
132
127
|
});
|
|
133
128
|
|
|
134
|
-
test('Vona
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
assert.
|
|
149
|
-
assert.equal(
|
|
150
|
-
assert.equal(
|
|
151
|
-
assert.equal(
|
|
152
|
-
assert.equal(
|
|
153
|
-
|
|
154
|
-
|
|
129
|
+
test('Vona daily config discovers source and tests without changing publication config', () => {
|
|
130
|
+
const require = createRequire(path.join(root, 'vona/package.json'));
|
|
131
|
+
const ts = require('typescript');
|
|
132
|
+
const configFile = path.join(root, 'vona/tsconfig.json');
|
|
133
|
+
const config = JSON.parse(readFileSync(configFile, 'utf8'));
|
|
134
|
+
assert.equal(config.include, undefined);
|
|
135
|
+
assert.equal(config.references, undefined);
|
|
136
|
+
const host = {
|
|
137
|
+
...ts.sys,
|
|
138
|
+
onUnRecoverableConfigFileDiagnostic(diagnostic) {
|
|
139
|
+
assert.fail(ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'));
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
const parsed = ts.getParsedCommandLineOfConfigFile(configFile, {}, host);
|
|
143
|
+
assert.deepEqual(parsed.errors, []);
|
|
144
|
+
assert.equal(parsed.projectReferences, undefined);
|
|
145
|
+
assert.equal(parsed.options.noEmit, true);
|
|
146
|
+
assert.equal(parsed.options.composite, false);
|
|
147
|
+
assert.equal(parsed.options.declaration, false);
|
|
148
|
+
assert.equal(parsed.options.declarationMap, false);
|
|
149
|
+
const files = new Set(
|
|
150
|
+
parsed.fileNames.map(file =>
|
|
151
|
+
path.relative(path.join(root, 'vona'), file).split(path.sep).join('/'),
|
|
152
|
+
),
|
|
155
153
|
);
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
154
|
+
for (const file of [
|
|
155
|
+
'src/backend/typing/modules.d.ts',
|
|
156
|
+
'src/suite/a-training/modules/training-student/src/index.ts',
|
|
157
|
+
'src/suite/a-training/modules/training-student/test/student.test.ts',
|
|
158
|
+
'src/suite-vendor/a-test/modules/test-vona/test/application.test.ts',
|
|
159
|
+
]) {
|
|
160
|
+
assert.ok(files.has(file), `${file} must be discovered`);
|
|
161
|
+
}
|
|
162
|
+
for (const file of files) {
|
|
163
|
+
assert.doesNotMatch(file, /(^|\/)(?:node_modules|dist|cli)\//);
|
|
164
|
+
assert.doesNotMatch(
|
|
165
|
+
file,
|
|
166
|
+
/^(?:packages-cli|packages-utils|packages-vona|coverage|\.app[^/]*|\.vona[^/]*|\.zova-rest)\//,
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
const publish = ts.getParsedCommandLineOfConfigFile(
|
|
170
|
+
path.join(root, 'vona/src/suite/a-training/modules/training-student/tsconfig.build.json'),
|
|
171
|
+
{},
|
|
172
|
+
host,
|
|
162
173
|
);
|
|
163
|
-
|
|
164
|
-
assert.
|
|
165
|
-
assert.
|
|
174
|
+
assert.deepEqual(publish.errors, []);
|
|
175
|
+
assert.equal(publish.options.composite, true);
|
|
176
|
+
assert.equal(publish.options.declaration, true);
|
|
177
|
+
assert.equal(publish.options.emitDeclarationOnly, true);
|
|
178
|
+
assert.equal(publish.options.noEmit, false);
|
|
166
179
|
});
|
|
167
180
|
|
|
168
181
|
test('release dry-run keeps default checks before publishing only', () => {
|
package/scripts/typecheck.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
|
|
4
|
-
import { runTypeScript } from '
|
|
4
|
+
import { runTypeScript } from './typescriptRunner.ts';
|
|
5
5
|
|
|
6
6
|
const [compiler, workspace, ...args] = process.argv.slice(2);
|
|
7
7
|
if ((compiler !== 'native' && compiler !== 'typescript') || !['vona', 'zova'].includes(workspace)) {
|
|
@@ -26,10 +26,9 @@
|
|
|
26
26
|
"dev:one": "npm run prerun && npm run vona :bin:dev -- --workers=1 --flavor=normal",
|
|
27
27
|
"test": "node ../scripts/runIsolatedTest.ts unit",
|
|
28
28
|
"cov": "node ../scripts/runIsolatedTest.ts unit --coverage",
|
|
29
|
-
"tsc": "npm run
|
|
30
|
-
"tsc:native": "npm run prerun &&
|
|
31
|
-
"tsc:
|
|
32
|
-
"tsc:legacy": "npm run prerun && npm run vona :bin:tsc -- --force",
|
|
29
|
+
"tsc": "npm run tsc:native",
|
|
30
|
+
"tsc:native": "npm run prerun && node ../scripts/typecheck.ts native vona --noEmit --incremental false --project tsconfig.json",
|
|
31
|
+
"tsc:legacy": "npm run prerun && node ../scripts/typecheck.ts typescript vona --noEmit --incremental false --project tsconfig.json",
|
|
33
32
|
"build": "npm run prerun && npm run vona :bin:build -- --flavor=normal",
|
|
34
33
|
"build:docker": "npm run prerun && npm run vona :bin:build -- --flavor=docker",
|
|
35
34
|
"start": "pnpm -C ./dist/normal install && node ./dist/normal/bootstrap.js",
|