cabloy 5.1.202 → 5.1.203
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 +11 -0
- package/CONTRIBUTING.md +18 -17
- package/README.md +2 -2
- package/package.json +2 -3
- package/repo-agent-governance/managed-assets.json +12 -12
- package/repo-agent-governance/policies/repository.md +1 -0
- package/repo-agent-governance/skills/cabloy-workflow/SKILL.md +2 -2
- package/repo-agent-governance/skills/cabloy-workflow/evals/evals.json +1 -1
- package/repo-agent-governance/skills/cabloy-worktree-environment/SKILL.md +5 -5
- package/repo-docs/assets/img/cabloy-admin-ssr-cover-en.png +0 -0
- package/repo-docs/assets/img/cabloy-admin-tabs-cover-en.png +0 -0
- package/repo-docs/assets/img/cabloy-ai-crud-cover-en.png +0 -0
- package/repo-docs/demo.md +14 -0
- package/repo-docs/frontend/scripts.md +10 -18
- package/repo-docs/fullstack/parallel-worktree-environment.md +2 -2
- package/repo-docs/index.md +2 -2
- package/repo-docs/reference/repo-scripts.md +15 -31
- package/repo-e2e/config/playwright.config.ts +14 -19
- package/repo-e2e/scripts/e2e.test.ts +17 -0
- package/repo-e2e/scripts/e2e.ts +5 -1
- package/repo-e2e/scripts/runE2e.ts +3 -15
- package/repo-e2e/scripts/runE2eArgs.test.ts +21 -17
- package/repo-e2e/scripts/runE2eArgs.ts +16 -29
- package/repo-e2e/scripts/startE2eVona.ts +20 -9
- package/repo-e2e/specs/a-commerce.spec.ts +232 -31
- package/repo-e2e/specs/cabloy-basic.spec.ts +39 -12
- package/repo-e2e/specs/home-user-account.spec.ts +9 -2
- package/scripts/upgrade.test.ts +147 -0
- package/scripts/upgrade.ts +49 -27
- package/vona/packages-cli/cli/package.json +1 -1
- package/vona/packages-cli/cli-set-api/package.json +1 -1
- package/vona/packages-cli/cli-set-api/src/lib/bean/cli.bin.dev.ts +51 -5
- package/vona/packages-cli/cli-set-api/src/lib/command/bin.dev.ts +6 -1
- package/vona/packages-cli/cli-set-api/test/binDevMode.test.ts +52 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +41 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/controller/e2eFixture.ts +52 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/lib/e2eFixture.ts +224 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/e2eFixture.ts +694 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/e2eFixture.test.ts +434 -0
package/.cabloy-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
5.1.
|
|
1
|
+
5.1.203
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.1.203
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
- Update application features.
|
|
7
|
+
|
|
8
|
+
### Improvements
|
|
9
|
+
- Refactor end-to-end tests.
|
|
10
|
+
- Clarify managed E2E resource authorization documentation.
|
|
11
|
+
- Add a video demonstrating second-level tabs for admin multitasking.
|
|
12
|
+
- Update the demo documentation.
|
|
13
|
+
|
|
3
14
|
## 5.1.202
|
|
4
15
|
|
|
5
16
|
### Features
|
package/CONTRIBUTING.md
CHANGED
|
@@ -27,23 +27,24 @@ Current CI workflows run on Ubuntu with Node.js 24 after pushes to `main`; do no
|
|
|
27
27
|
|
|
28
28
|
Start with the narrowest meaningful check, then broaden validation when a change crosses a shared boundary.
|
|
29
29
|
|
|
30
|
-
| Purpose
|
|
31
|
-
|
|
|
32
|
-
| Start Vona development
|
|
33
|
-
| Start one Vona development process
|
|
34
|
-
| Start Basic Admin SSR development
|
|
35
|
-
| Start Basic Web SSR development
|
|
36
|
-
| Check formatting
|
|
37
|
-
| Lint
|
|
38
|
-
| Type-check Vona and Zova
|
|
39
|
-
| Run backend tests
|
|
40
|
-
| Run the
|
|
41
|
-
|
|
|
42
|
-
| Build
|
|
43
|
-
| Build Basic
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
30
|
+
| Purpose | Command |
|
|
31
|
+
| ----------------------------------------- | -------------------------- |
|
|
32
|
+
| Start Vona development | `npm run dev` |
|
|
33
|
+
| Start one Vona development process | `npm run dev:one` |
|
|
34
|
+
| Start Basic Admin SSR development | `npm run dev:zova:admin` |
|
|
35
|
+
| Start Basic Web SSR development | `npm run dev:zova:web` |
|
|
36
|
+
| Check formatting | `npm run format` |
|
|
37
|
+
| Lint | `npm run lint` |
|
|
38
|
+
| Type-check Vona and Zova | `npm run tsc` |
|
|
39
|
+
| Run backend tests | `npm run test` |
|
|
40
|
+
| Run the managed local test-mode E2E suite | `npm run test:e2e` |
|
|
41
|
+
| Build required Basic artifacts | `npm run build` |
|
|
42
|
+
| Build Basic Admin SSR and REST artifacts | `npm run build:zova:admin` |
|
|
43
|
+
| Build Basic Web SSR and REST artifacts | `npm run build:zova:web` |
|
|
44
|
+
| Synchronize Zova dependencies into Vona | `npm run deps:vona` |
|
|
45
|
+
| Build the public documentation site | `npm run docs:build` |
|
|
46
|
+
|
|
47
|
+
`npm run test:e2e` starts a fresh runner-managed local Vona worker in test mode and runs Playwright against Vona integrated SSR. Select flat spec basenames directly after the script, for example `npm run test:e2e a-commerce`; place Playwright filters after npm's `--` delimiter, for example `npm run test:e2e a-commerce -- --tag @smoke`. Browser commands consume existing SSR/REST artifacts and do not rebuild them. Confirm exclusive ownership of the effective test database, local Redis namespace, public/runtime paths, application identity, API origin, and listener before starting a test-mode runtime; an available port alone is not sufficient. Externally managed `E2E_BASE_URL` targets are unsupported.
|
|
47
48
|
|
|
48
49
|
The tracked pre-commit hook runs `lint-staged`. It may format staged Markdown and configuration files, and may lint-fix and format staged source files. Review the resulting staged changes and run the relevant explicit checks before submitting.
|
|
49
50
|
|
package/README.md
CHANGED
|
@@ -38,9 +38,9 @@ See the [AI Spec-Driven Development](https://cabloy.com/ai/ai-spec-driven-develo
|
|
|
38
38
|
|
|
39
39
|
## Demonstrations(Videos)
|
|
40
40
|
|
|
41
|
-
### 1.
|
|
41
|
+
### 1. AI Coding in Action: One Prompt for CRUD, SSR & Multitasking (Duration: 3:50)
|
|
42
42
|
|
|
43
|
-
[](https://youtu.be/PV9_By08hDM)
|
|
44
44
|
|
|
45
45
|
## Editions
|
|
46
46
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cabloy",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.203",
|
|
4
4
|
"gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
|
|
5
5
|
"description": "A Node.js fullstack framework",
|
|
6
6
|
"keywords": [
|
|
@@ -45,8 +45,7 @@
|
|
|
45
45
|
"start": "cd vona && npm run start",
|
|
46
46
|
"start:one": "cd vona && npm run start:one",
|
|
47
47
|
"test": "cd vona && npm run test",
|
|
48
|
-
"test:e2e": "node repo-e2e/scripts/runE2e.ts
|
|
49
|
-
"test:e2e:fast": "node repo-e2e/scripts/runE2e.ts --fast",
|
|
48
|
+
"test:e2e": "node repo-e2e/scripts/runE2e.ts",
|
|
50
49
|
"test:docs:e2e": "npm run docs:build && playwright test --config repo-e2e/docs/playwright.config.ts",
|
|
51
50
|
"db:reset": "cd vona && npm run db:reset",
|
|
52
51
|
"tsc": "npm run tsc:zova && pnpm --dir vona run tsc",
|
|
@@ -256,7 +256,7 @@
|
|
|
256
256
|
{
|
|
257
257
|
"adapter": "codex",
|
|
258
258
|
"category": "skill",
|
|
259
|
-
"sha256": "
|
|
259
|
+
"sha256": "0d1901134f7222902cfc702275ed7bd83a4e3a1d72c3543a77c8ab5d7cabaa55",
|
|
260
260
|
"source": "skills/cabloy-workflow/evals/evals.json",
|
|
261
261
|
"target": ".agents/skills/cabloy-workflow/evals/evals.json"
|
|
262
262
|
},
|
|
@@ -277,7 +277,7 @@
|
|
|
277
277
|
{
|
|
278
278
|
"adapter": "codex",
|
|
279
279
|
"category": "skill",
|
|
280
|
-
"sha256": "
|
|
280
|
+
"sha256": "ff0760f6fa7c24f561fdcfa07094d9d6e8d82fcef358458a36ff0c38a30ea89e",
|
|
281
281
|
"source": "skills/cabloy-workflow/SKILL.md",
|
|
282
282
|
"target": ".agents/skills/cabloy-workflow/SKILL.md"
|
|
283
283
|
},
|
|
@@ -291,7 +291,7 @@
|
|
|
291
291
|
{
|
|
292
292
|
"adapter": "codex",
|
|
293
293
|
"category": "skill",
|
|
294
|
-
"sha256": "
|
|
294
|
+
"sha256": "791dd8e89b63dfd0714538b3b15d0b4750b6889f538b65f7137bb93f091e02d9",
|
|
295
295
|
"source": "skills/cabloy-worktree-environment/SKILL.md",
|
|
296
296
|
"target": ".agents/skills/cabloy-worktree-environment/SKILL.md"
|
|
297
297
|
},
|
|
@@ -592,7 +592,7 @@
|
|
|
592
592
|
{
|
|
593
593
|
"adapter": "claude",
|
|
594
594
|
"category": "skill",
|
|
595
|
-
"sha256": "
|
|
595
|
+
"sha256": "0d1901134f7222902cfc702275ed7bd83a4e3a1d72c3543a77c8ab5d7cabaa55",
|
|
596
596
|
"source": "skills/cabloy-workflow/evals/evals.json",
|
|
597
597
|
"target": ".claude/skills/cabloy-workflow/evals/evals.json"
|
|
598
598
|
},
|
|
@@ -613,7 +613,7 @@
|
|
|
613
613
|
{
|
|
614
614
|
"adapter": "claude",
|
|
615
615
|
"category": "skill",
|
|
616
|
-
"sha256": "
|
|
616
|
+
"sha256": "ff0760f6fa7c24f561fdcfa07094d9d6e8d82fcef358458a36ff0c38a30ea89e",
|
|
617
617
|
"source": "skills/cabloy-workflow/SKILL.md",
|
|
618
618
|
"target": ".claude/skills/cabloy-workflow/SKILL.md"
|
|
619
619
|
},
|
|
@@ -627,7 +627,7 @@
|
|
|
627
627
|
{
|
|
628
628
|
"adapter": "claude",
|
|
629
629
|
"category": "skill",
|
|
630
|
-
"sha256": "
|
|
630
|
+
"sha256": "791dd8e89b63dfd0714538b3b15d0b4750b6889f538b65f7137bb93f091e02d9",
|
|
631
631
|
"source": "skills/cabloy-worktree-environment/SKILL.md",
|
|
632
632
|
"target": ".claude/skills/cabloy-worktree-environment/SKILL.md"
|
|
633
633
|
},
|
|
@@ -683,7 +683,7 @@
|
|
|
683
683
|
{
|
|
684
684
|
"adapter": "cursor",
|
|
685
685
|
"category": "policy",
|
|
686
|
-
"sha256": "
|
|
686
|
+
"sha256": "db2467e225f30b74efb312c45572324f75a6a81077e19b7723ffd640a45793f9",
|
|
687
687
|
"source": "policies/repository.md",
|
|
688
688
|
"target": ".cursor/rules/cabloy-governance.mdc"
|
|
689
689
|
},
|
|
@@ -942,7 +942,7 @@
|
|
|
942
942
|
{
|
|
943
943
|
"adapter": "cursor",
|
|
944
944
|
"category": "skill",
|
|
945
|
-
"sha256": "
|
|
945
|
+
"sha256": "0d1901134f7222902cfc702275ed7bd83a4e3a1d72c3543a77c8ab5d7cabaa55",
|
|
946
946
|
"source": "skills/cabloy-workflow/evals/evals.json",
|
|
947
947
|
"target": ".cursor/skills/cabloy-workflow/evals/evals.json"
|
|
948
948
|
},
|
|
@@ -963,7 +963,7 @@
|
|
|
963
963
|
{
|
|
964
964
|
"adapter": "cursor",
|
|
965
965
|
"category": "skill",
|
|
966
|
-
"sha256": "
|
|
966
|
+
"sha256": "ff0760f6fa7c24f561fdcfa07094d9d6e8d82fcef358458a36ff0c38a30ea89e",
|
|
967
967
|
"source": "skills/cabloy-workflow/SKILL.md",
|
|
968
968
|
"target": ".cursor/skills/cabloy-workflow/SKILL.md"
|
|
969
969
|
},
|
|
@@ -977,7 +977,7 @@
|
|
|
977
977
|
{
|
|
978
978
|
"adapter": "cursor",
|
|
979
979
|
"category": "skill",
|
|
980
|
-
"sha256": "
|
|
980
|
+
"sha256": "791dd8e89b63dfd0714538b3b15d0b4750b6889f538b65f7137bb93f091e02d9",
|
|
981
981
|
"source": "skills/cabloy-worktree-environment/SKILL.md",
|
|
982
982
|
"target": ".cursor/skills/cabloy-worktree-environment/SKILL.md"
|
|
983
983
|
},
|
|
@@ -1005,14 +1005,14 @@
|
|
|
1005
1005
|
{
|
|
1006
1006
|
"adapter": "codex",
|
|
1007
1007
|
"category": "policy",
|
|
1008
|
-
"sha256": "
|
|
1008
|
+
"sha256": "307edb0409d7d723c213c534713d2477ba000f19571e054d5498aeb9578b22bb",
|
|
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": "307edb0409d7d723c213c534713d2477ba000f19571e054d5498aeb9578b22bb",
|
|
1016
1016
|
"source": "policies/repository.md",
|
|
1017
1017
|
"target": "CLAUDE.md"
|
|
1018
1018
|
}
|
|
@@ -71,6 +71,7 @@ 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
|
- After implementation, do not launch broad reviews automatically; when review is needed, scope it to the current diff and report only high-confidence issues.
|
|
73
73
|
- 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.
|
|
74
|
+
- Before `npm run test:e2e`, verify exclusive use of the effective test-database cleanup scope, Redis cleanup namespace, public/runtime paths, and listener; a free port or separate worktree alone is insufficient. If a standing authorization covers this checkout and its resources remain exclusively assigned with no conflicting process, do not repeatedly ask to run the managed suite; if scope or ownership changes or is uncertain, wait or ask. This does not authorize manual resets, broader cleanup, or changing shared configuration. See `repo-docs/reference/repo-scripts.md`.
|
|
74
75
|
- For SSR theme-sensitive frontend work, detect the active edition marker and UI library before making assumptions. Cabloy Basic currently means DaisyUI + Tailwind CSS assumptions; Cabloy Start currently means Vuetify assumptions.
|
|
75
76
|
- In Web SSR without cookie-backed theme resolution, do not treat server reads of `$theme.dark`, `$theme.darkMode`, or `$token` as final browser truth. Keep theme-sensitive SSR branching hydration-tolerant or defer final theme-sensitive decisions to the client.
|
|
76
77
|
- Do not assume Cabloy Basic and Cabloy Start use the same adapter-level SSR theme handoff. Verify the active theme handler and client hydration path before changing SSR theme behavior.
|
|
@@ -107,11 +107,11 @@ The reason is simple: these files are where Cabloy already encodes its real work
|
|
|
107
107
|
|
|
108
108
|
### Parallel worktree environment setup
|
|
109
109
|
|
|
110
|
-
When a request involves a second worktree, concurrent Vona/Zova development, isolated ordinary tests, or managed
|
|
110
|
+
When a request involves a second worktree, concurrent Vona/Zova development, isolated ordinary tests, or managed E2E, classify it as fullstack workflow setup. Read [Parallel Worktree Environment](../../../repo-docs/fullstack/parallel-worktree-environment.md), the canonical shared recipe maintained in Cabloy Basic for both editions.
|
|
111
111
|
|
|
112
112
|
This routing skill provides read-only guidance only. Do not infer an `APP_NAME` or ports, edit local overrides, or run `npm run init` from a generic worktree request. When the user wants confirmation-gated local environment setup, ask them to explicitly invoke `/cabloy-worktree-environment`.
|
|
113
113
|
|
|
114
|
-
The invoked skill detects Basic or Start to select the active root scripts and managed
|
|
114
|
+
The invoked skill detects Basic or Start to select the active root scripts and managed E2E command. It uses Git worktree metadata, fixed Vona/Zova port baselines, and the worktree basename to recommend the complete standard tuple for confirmation: `APP_NAME`, `SERVER_LISTEN_PORT`, `DEV_SERVER_PORT`, `DEV_SERVER_HMR_PORT`, and an `API_BASE_URL` derived from the Vona port. After confirmation, it writes both `vona/env/.env.local` and `zova/env/.env.local`; never use flavor-, mode-, app-mode-, or runtime-specific `.env.*.local` files. It does not inspect environment-file content or allocate/reserve a live port. The shared environment is Vona + Zova development: Admin and Web are alternative commands using the same configuration, and they must not run concurrently in one worktree. Concurrent use requires separately configured linked worktrees.
|
|
115
115
|
|
|
116
116
|
## Step 4: Prefer CLI-first workflows
|
|
117
117
|
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
41
|
"id": 7,
|
|
42
|
-
"prompt": "I created a linked Cabloy Start worktree and need isolated Vona, Zova Web, and managed
|
|
42
|
+
"prompt": "I created a linked Cabloy Start worktree and need isolated Vona, Zova Web, and managed E2E. Which workflow should I use?",
|
|
43
43
|
"expected_output": "Routes to the canonical shared guide and explicitly invoked /cabloy-worktree-environment skill. It recognizes that the invoked skill selects the Start command npm run test:e2e while retaining read-only generic routing, a deterministic Git-metadata recommendation, no environment-content inspection, no automatic initialization, and the universal five-setting tuple written to both permitted broad local files only after confirmation.",
|
|
44
44
|
"files": []
|
|
45
45
|
},
|
|
@@ -29,10 +29,10 @@ Before proposing configuration values or writing files:
|
|
|
29
29
|
|
|
30
30
|
Interpretation:
|
|
31
31
|
|
|
32
|
-
| Marker | Edition | Managed
|
|
33
|
-
| ----------------------- | ------------ |
|
|
34
|
-
| `__CABLOY_BASIC__` only | Cabloy Basic | `npm run test:e2e`
|
|
35
|
-
| `__CABLOY_START__` only | Cabloy Start | `npm run test:e2e`
|
|
32
|
+
| Marker | Edition | Managed E2E command |
|
|
33
|
+
| ----------------------- | ------------ | ------------------- |
|
|
34
|
+
| `__CABLOY_BASIC__` only | Cabloy Basic | `npm run test:e2e` |
|
|
35
|
+
| `__CABLOY_START__` only | Cabloy Start | `npm run test:e2e` |
|
|
36
36
|
|
|
37
37
|
Stop without edits when both markers are present, neither marker is present, the checkout is primary/unregistered, required environment directories are missing, or the selected edition's required scripts are unavailable.
|
|
38
38
|
|
|
@@ -178,7 +178,7 @@ npm run dev:zova:web
|
|
|
178
178
|
npm run test
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
-
Run the edition-appropriate managed
|
|
181
|
+
Run the edition-appropriate managed E2E command:
|
|
182
182
|
|
|
183
183
|
```bash
|
|
184
184
|
# Cabloy Basic or Cabloy Start
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/repo-docs/demo.md
CHANGED
|
@@ -10,3 +10,17 @@ Explore the Cabloy demonstration sites:
|
|
|
10
10
|
| ---------- | ---------------------------------------------------------------- |
|
|
11
11
|
| Web site | [https://demo.cabloy.com/](https://demo.cabloy.com/) |
|
|
12
12
|
| Admin site | [https://demo.cabloy.com/admin/](https://demo.cabloy.com/admin/) |
|
|
13
|
+
|
|
14
|
+
## Videos
|
|
15
|
+
|
|
16
|
+
### 1. Can an Admin Site Use SSR? CabloyJS in Three Practical Demos (Duration: 1:16)
|
|
17
|
+
|
|
18
|
+
[](https://youtu.be/786IQhRdr1I)
|
|
19
|
+
|
|
20
|
+
### 2. A First: Second-Level Tabs for Admin Multitasking (Duration: 1:50)
|
|
21
|
+
|
|
22
|
+
[](https://youtu.be/L6DxD-JfztQ)
|
|
23
|
+
|
|
24
|
+
### 3. AI Coding in Action: One Prompt for CRUD, SSR & Multitasking (Duration: 3:50)
|
|
25
|
+
|
|
26
|
+
[](https://youtu.be/PV9_By08hDM)
|
|
@@ -68,23 +68,16 @@ npm run deps:vona
|
|
|
68
68
|
npm run test:e2e cabloy-basic home-user-account
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
The managed
|
|
72
|
-
|
|
73
|
-
The unified runner uses two commands:
|
|
74
|
-
|
|
75
|
-
```text
|
|
76
|
-
npm run test:e2e clean local run with database reset
|
|
77
|
-
npm run test:e2e:fast fast run without automatic reset
|
|
78
|
-
```
|
|
71
|
+
The sole managed `npm run test:e2e` command starts a fresh local Vona worker with `--workers=1 --flavor=normal --mode=test`, then runs the selected specs against Vona integrated SSR. Test-mode startup initializes test resources without a separate `db:reset`; browser commands consume already-built artifacts and do not rebuild them. Confirm exclusive ownership of the effective test database, `_local` Redis namespace, public/runtime paths, `APP_NAME`, API origin, and listener before startup; a free port alone is insufficient.
|
|
79
72
|
|
|
80
73
|
Place flat spec basenames directly after the npm script name. Use npm's `--` delimiter before Playwright options. With no names, every spec in `repo-e2e/specs` runs. Native `--grep` and `--grep-invert` remain available, and repeatable `--tag` values require all listed tags:
|
|
81
74
|
|
|
82
75
|
```bash
|
|
83
76
|
npm run test:e2e cabloy-basic home-user-account -- --grep @flow
|
|
84
|
-
npm run test:e2e
|
|
77
|
+
npm run test:e2e a-commerce -- --tag @web --tag @smoke
|
|
85
78
|
```
|
|
86
79
|
|
|
87
|
-
For the complete tag vocabulary
|
|
80
|
+
For the complete Basic tag vocabulary and managed-runner argument boundaries, see [Repo Scripts](/reference/repo-scripts#ssr-browser-checks). `E2E_BASE_URL` must be unset: externally managed targets are unsupported.
|
|
88
81
|
|
|
89
82
|
## Cabloy Start root wrappers
|
|
90
83
|
|
|
@@ -102,7 +95,7 @@ Cabloy Start does not expose the Basic Commerce wrapper family.
|
|
|
102
95
|
|
|
103
96
|
## Start SSR browser acceptance
|
|
104
97
|
|
|
105
|
-
The Start Web and Admin browser baseline
|
|
98
|
+
The Start Web and Admin browser baseline exercises Vona integrated SSR dispatch at the effective local test-mode server port. Prepare current SSR and REST artifacts, then use the managed local command:
|
|
106
99
|
|
|
107
100
|
```bash
|
|
108
101
|
npm run build:zova
|
|
@@ -110,23 +103,22 @@ npm run deps:vona
|
|
|
110
103
|
npm run test:e2e
|
|
111
104
|
```
|
|
112
105
|
|
|
113
|
-
Start uses
|
|
106
|
+
Start uses one E2E command and one fresh managed local test-mode lifecycle:
|
|
114
107
|
|
|
115
108
|
```text
|
|
116
|
-
npm run test:e2e managed
|
|
117
|
-
npm run test:e2e:fast fast rerun without an automatic reset
|
|
109
|
+
npm run test:e2e fresh managed local test-mode suite run
|
|
118
110
|
```
|
|
119
111
|
|
|
120
112
|
Select flat spec basenames and filter scenarios or surfaces with runner tags and native Playwright arguments. Current Start scenarios use tags including `@web`, `@admin`, `@smoke`, `@layout`, `@cabloy-admin`, `@account`, `@ssr`, and `@flow`:
|
|
121
113
|
|
|
122
114
|
```bash
|
|
123
115
|
npm run test:e2e cabloy-start
|
|
124
|
-
npm run test:e2e
|
|
125
|
-
npm run test:e2e
|
|
126
|
-
npm run test:e2e
|
|
116
|
+
npm run test:e2e cabloy-start -- --tag @web
|
|
117
|
+
npm run test:e2e cabloy-admin -- --tag @admin --tag @cabloy-admin
|
|
118
|
+
npm run test:e2e cabloy-start -- --grep ATP-START-FLOW-01
|
|
127
119
|
```
|
|
128
120
|
|
|
129
|
-
|
|
121
|
+
Start does not support externally managed E2E targets: `E2E_BASE_URL` must be unset. The command requires the configured local port to be available and starts one Vona worker with `--flavor=normal --mode=test`; Playwright does not reuse an existing process. Test-mode startup initializes test state. Confirm exclusive ownership of the test database, Redis namespace, and public/runtime paths before running it. The command does not replace the paired build/dependency-sync prerequisite; do not change shared environment identity or ports to avoid a busy resource.
|
|
130
122
|
|
|
131
123
|
## Zova script model
|
|
132
124
|
|
|
@@ -77,12 +77,12 @@ For privacy, the skill writes only to absent or empty permitted broad local file
|
|
|
77
77
|
|
|
78
78
|
Use commands from the active repository root.
|
|
79
79
|
|
|
80
|
-
| Edition | Marker | Frontend command | Managed
|
|
80
|
+
| Edition | Marker | Frontend command | Managed E2E |
|
|
81
81
|
| ------------ | ------------------ | -------------------------------------------------- | ------------------ |
|
|
82
82
|
| Cabloy Basic | `__CABLOY_BASIC__` | `npm run dev:zova:admin` or `npm run dev:zova:web` | `npm run test:e2e` |
|
|
83
83
|
| Cabloy Start | `__CABLOY_START__` | `npm run dev:zova:admin` or `npm run dev:zova:web` | `npm run test:e2e` |
|
|
84
84
|
|
|
85
|
-
Run one frontend command, not both, in each worktree. Both managed
|
|
85
|
+
Run one frontend command, not both, in each worktree. Both managed E2E workflows read Vona's effective local `SERVER_LISTEN_PORT` and start one fresh Vona test-mode worker; startup initializes test resources without a separate reset. Before either command, confirm exclusive ownership of the effective test database, `_local` Redis namespace, public/runtime paths, `APP_NAME`, API origin, and listener. A free port alone does not establish ownership. Do not change shared identity or ports to bypass a collision, and leave `E2E_BASE_URL` unset: externally managed targets are unsupported.
|
|
86
86
|
|
|
87
87
|
## What this isolates
|
|
88
88
|
|
package/repo-docs/index.md
CHANGED
|
@@ -32,9 +32,9 @@ features:
|
|
|
32
32
|
|
|
33
33
|
## Demonstrations(Videos)
|
|
34
34
|
|
|
35
|
-
### 1.
|
|
35
|
+
### 1. AI Coding in Action: One Prompt for CRUD, SSR & Multitasking (Duration: 3:50)
|
|
36
36
|
|
|
37
|
-
[](https://youtu.be/PV9_By08hDM)
|
|
38
38
|
|
|
39
39
|
## Choose a reading path
|
|
40
40
|
|
|
@@ -40,9 +40,7 @@ Cabloy Basic exposes these shared root scripts:
|
|
|
40
40
|
- `npm run start`
|
|
41
41
|
- `npm run start:one`
|
|
42
42
|
- `npm run test`
|
|
43
|
-
- `npm run db:reset`
|
|
44
43
|
- `npm run test:e2e`
|
|
45
|
-
- `npm run test:e2e:fast`
|
|
46
44
|
- `npm run tsc`
|
|
47
45
|
- `npm run docs:dev`
|
|
48
46
|
- `npm run docs:build`
|
|
@@ -117,7 +115,6 @@ Cabloy Start exposes the equivalent Start repository surface:
|
|
|
117
115
|
- `npm run test`
|
|
118
116
|
- `npm run db:reset`
|
|
119
117
|
- `npm run test:e2e`
|
|
120
|
-
- `npm run test:e2e:fast`
|
|
121
118
|
- `npm run tsc`
|
|
122
119
|
|
|
123
120
|
Cabloy Start does not expose Basic Commerce or root documentation wrappers.
|
|
@@ -138,7 +135,7 @@ repo-e2e/specs/home-user-account.spec.ts
|
|
|
138
135
|
repo-e2e/specs/a-commerce.spec.ts
|
|
139
136
|
```
|
|
140
137
|
|
|
141
|
-
It
|
|
138
|
+
It reconciles the single framework-owned `test:e2e` script and the `@playwright/test` development dependency. The retired `test:e2e:fast` script is removed only if its value matches the known old framework command; a customized project alias is preserved. Keep additional project browser specs under other filenames in `repo-e2e/specs`; the upgrader updates only the listed framework files. The current fresh baseline is required and is not repaired for unsupported legacy project layouts.
|
|
142
139
|
|
|
143
140
|
### Cabloy Start repository
|
|
144
141
|
|
|
@@ -154,31 +151,28 @@ The public-package upgrade flow does not source or reconcile the Start-owned bas
|
|
|
154
151
|
|
|
155
152
|
## SSR browser checks
|
|
156
153
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
- `npm run test:e2e`: clean local run; checks the managed Vona port, resets the database, starts one development Vona worker, and runs Playwright.
|
|
160
|
-
- `npm run test:e2e:fast`: skips the reset for quick reruns and may target either the local managed Vona server or an externally managed `E2E_BASE_URL`.
|
|
154
|
+
Cabloy Basic and Cabloy Start each use a single managed local `npm run test:e2e` command. In Basic, the runner checks the effective `normal/test/local` Vona listener port and starts one fresh `--workers=1 --flavor=normal --mode=test` worker. Test-mode startup initializes test resources; the runner does not invoke a separate `db:reset` or a development-mode server. Playwright does not reuse an existing process. Confirm exclusive ownership of the effective test database, `_local` Redis namespace, public/runtime paths, `APP_NAME`, API origin, and listener before starting it; port availability alone is insufficient.
|
|
161
155
|
|
|
162
|
-
|
|
156
|
+
Both editions' browser checks target Vona integrated SSR. In the Cabloy Basic default environment, the Vona listener is `7102`; the Zova standalone SSR development server uses `9000` and is not an acceptance target.
|
|
163
157
|
|
|
164
158
|
Place spec basenames directly after the npm script name; use npm's `--` delimiter only before Playwright options. Multiple spec names are allowed. With no names, every spec in `repo-e2e/specs` is discovered:
|
|
165
159
|
|
|
166
160
|
```bash
|
|
167
161
|
npm run test:e2e cabloy-basic home-user-account
|
|
168
162
|
npm run test:e2e a-commerce
|
|
169
|
-
npm run test:e2e
|
|
170
|
-
npm run test:e2e
|
|
171
|
-
npm run test:e2e
|
|
163
|
+
npm run test:e2e home-user-account
|
|
164
|
+
npm run test:e2e a-commerce -- --grep ATP-SSR
|
|
165
|
+
npm run test:e2e a-commerce -- --grep-invert @admin
|
|
172
166
|
```
|
|
173
167
|
|
|
174
168
|
Tags remain independent from filenames. Repeat `--tag` to require all tags, while native `--grep` and `--grep-invert` remain available:
|
|
175
169
|
|
|
176
170
|
```bash
|
|
177
|
-
npm run test:e2e
|
|
178
|
-
npm run test:e2e
|
|
171
|
+
npm run test:e2e a-commerce -- --tag @web --tag @smoke
|
|
172
|
+
npm run test:e2e home-user-account -- --grep @flow --tag @web
|
|
179
173
|
```
|
|
180
174
|
|
|
181
|
-
The existing tags include `@web`, `@admin`, `@smoke`, `@flow`, `@ssr`, `@theme`, and the business tags used by Commerce such as `@cart`, `@payment`, `@shipment`, and `@refund`. No suite tag is required.
|
|
175
|
+
The existing Basic tags include `@web`, `@admin`, `@smoke`, `@flow`, `@ssr`, `@theme`, and the business tags used by Commerce such as `@cart`, `@payment`, `@shipment`, and `@refund`. No suite tag is required. In Cabloy Basic, `E2E_BASE_URL` must be unset: external targets and a fast/no-reset mode are unsupported.
|
|
182
176
|
|
|
183
177
|
### Cabloy Basic and Commerce
|
|
184
178
|
|
|
@@ -198,15 +192,9 @@ npm run deps:vona
|
|
|
198
192
|
npm run test:e2e a-commerce
|
|
199
193
|
```
|
|
200
194
|
|
|
201
|
-
For a separately managed target, use the fast command:
|
|
202
|
-
|
|
203
|
-
```bash
|
|
204
|
-
E2E_BASE_URL=http://127.0.0.1:7102 npm run test:e2e:fast a-commerce -- --tag @smoke
|
|
205
|
-
```
|
|
206
|
-
|
|
207
195
|
### Cabloy Start
|
|
208
196
|
|
|
209
|
-
The Start suite exercises Web at `/` and Admin at `/admin` through Vona integrated SSR dispatch. Prepare current Start artifacts before a managed local run:
|
|
197
|
+
The Start suite exercises Web at `/` and Admin at `/admin` through Vona integrated SSR dispatch. Prepare current Start artifacts before a managed local run. The runner uses the effective local `normal`-flavor, test-mode Vona listener, rather than assuming a fixed port:
|
|
210
198
|
|
|
211
199
|
```bash
|
|
212
200
|
npm run build:zova
|
|
@@ -216,20 +204,16 @@ npm run test:e2e
|
|
|
216
204
|
|
|
217
205
|
```bash
|
|
218
206
|
# Exact acceptance scenario
|
|
219
|
-
npm run test:e2e
|
|
207
|
+
npm run test:e2e cabloy-start -- --grep ATP-START-FLOW-01
|
|
220
208
|
|
|
221
209
|
# Category or surface selection
|
|
222
|
-
npm run test:e2e
|
|
223
|
-
npm run test:e2e
|
|
210
|
+
npm run test:e2e cabloy-start -- --tag @smoke
|
|
211
|
+
npm run test:e2e cabloy-admin -- --tag @admin --tag @cabloy-admin
|
|
224
212
|
```
|
|
225
213
|
|
|
226
|
-
|
|
214
|
+
In Cabloy Start, the sole `npm run test:e2e` command checks the configured local port and starts a fresh runner-managed Vona target with `--workers=1 --flavor=normal --mode=test`. Playwright never reuses an existing server. Test-mode startup initializes test resources; the runner does not invoke a separate `db:reset`. Confirm ownership of the test database, Redis namespace, and public/runtime paths before running it; do not change shared environment identity or ports to bypass a busy resource.
|
|
227
215
|
|
|
228
|
-
|
|
229
|
-
E2E_BASE_URL=http://127.0.0.1:7102 npm run test:e2e:fast
|
|
230
|
-
E2E_BASE_URL=http://127.0.0.1:7102 npm run test:e2e:fast cabloy-admin -- --tag @admin
|
|
231
|
-
E2E_BASE_URL=http://127.0.0.1:7102 npm run test:e2e:fast cabloy-start -- --tag @web
|
|
232
|
-
```
|
|
216
|
+
`E2E_BASE_URL` is unsupported in Cabloy Start and must be unset, even for a local URL. Externally managed targets are not supported.
|
|
233
217
|
|
|
234
218
|
Browser commands consume existing SSR and REST artifacts; they never rebuild them. Install Chromium once when needed with `npx playwright install chromium`.
|
|
235
219
|
|
|
@@ -2,9 +2,6 @@ import { defineConfig } from '@playwright/test';
|
|
|
2
2
|
|
|
3
3
|
import { E2E_LOCAL_BASE_URL, E2E_ROOT_DIR } from '../scripts/e2e.ts';
|
|
4
4
|
|
|
5
|
-
const externalBaseURL = process.env.E2E_BASE_URL;
|
|
6
|
-
const baseURL = externalBaseURL || E2E_LOCAL_BASE_URL;
|
|
7
|
-
|
|
8
5
|
export default defineConfig({
|
|
9
6
|
testDir: `${E2E_ROOT_DIR}/repo-e2e/specs`,
|
|
10
7
|
fullyParallel: false,
|
|
@@ -13,22 +10,20 @@ export default defineConfig({
|
|
|
13
10
|
retries: process.env.CI ? 2 : 0,
|
|
14
11
|
reporter: process.env.CI ? [['html', { open: 'never' }], ['list']] : 'list',
|
|
15
12
|
use: {
|
|
16
|
-
baseURL,
|
|
13
|
+
baseURL: E2E_LOCAL_BASE_URL,
|
|
17
14
|
trace: 'on-first-retry',
|
|
18
15
|
},
|
|
19
|
-
webServer:
|
|
20
|
-
|
|
21
|
-
:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
},
|
|
33
|
-
},
|
|
16
|
+
webServer: {
|
|
17
|
+
command: 'node repo-e2e/scripts/startE2eVona.ts',
|
|
18
|
+
cwd: E2E_ROOT_DIR,
|
|
19
|
+
url: `${E2E_LOCAL_BASE_URL}/health/ready`,
|
|
20
|
+
timeout: 180_000,
|
|
21
|
+
reuseExistingServer: false,
|
|
22
|
+
stdout: 'pipe',
|
|
23
|
+
stderr: 'pipe',
|
|
24
|
+
gracefulShutdown: {
|
|
25
|
+
signal: 'SIGINT',
|
|
26
|
+
timeout: 10_000,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
34
29
|
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
|
|
6
|
+
test('rejects a defined E2E_BASE_URL before loading local configuration', () => {
|
|
7
|
+
const entrypoint = fileURLToPath(new URL('./e2e.ts', import.meta.url));
|
|
8
|
+
for (const value of ['', 'http://127.0.0.1:7102']) {
|
|
9
|
+
const result = spawnSync(process.execPath, [entrypoint], {
|
|
10
|
+
env: { ...process.env, E2E_BASE_URL: value },
|
|
11
|
+
encoding: 'utf8',
|
|
12
|
+
});
|
|
13
|
+
assert.notEqual(result.status, 0);
|
|
14
|
+
assert.match(result.stderr, /E2E_BASE_URL is unsupported/);
|
|
15
|
+
assert.doesNotMatch(result.stderr, /SERVER_LISTEN_PORT/);
|
|
16
|
+
}
|
|
17
|
+
});
|
package/repo-e2e/scripts/e2e.ts
CHANGED
|
@@ -4,8 +4,12 @@ import { fileURLToPath } from 'node:url';
|
|
|
4
4
|
|
|
5
5
|
export const E2E_ROOT_DIR = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
6
6
|
|
|
7
|
+
if (process.env.E2E_BASE_URL !== undefined) {
|
|
8
|
+
throw new Error('E2E_BASE_URL is unsupported; the E2E runner manages a local test-mode target.');
|
|
9
|
+
}
|
|
10
|
+
|
|
7
11
|
const vonaEnv = dotenv.loadEnvs(
|
|
8
|
-
{ flavor: 'normal', mode: '
|
|
12
|
+
{ flavor: 'normal', mode: 'test', local: 'local' },
|
|
9
13
|
resolve(E2E_ROOT_DIR, 'vona', 'env'),
|
|
10
14
|
'.env',
|
|
11
15
|
);
|
|
@@ -34,16 +34,7 @@ async function assertPortAvailable(): Promise<void> {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
const parsed = parseE2eArgs(process.argv.slice(2), E2E_SPECS_DIR);
|
|
37
|
-
|
|
38
|
-
throw new Error(
|
|
39
|
-
'The clean E2E run manages the local target and cannot be used with E2E_BASE_URL. Use test:e2e:fast for an external target.',
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (parsed.mode === 'clean') {
|
|
44
|
-
await assertPortAvailable();
|
|
45
|
-
run('npm', ['run', 'db:reset']);
|
|
46
|
-
}
|
|
37
|
+
await assertPortAvailable();
|
|
47
38
|
|
|
48
39
|
const playwrightCommand = resolve(
|
|
49
40
|
E2E_ROOT_DIR,
|
|
@@ -55,8 +46,5 @@ const specPaths = parsed.specNames.map(name => resolve(E2E_SPECS_DIR, `${name}.s
|
|
|
55
46
|
const playwrightArgs = combineGreps(parsed.playwrightArgs, parsed.tags);
|
|
56
47
|
run(playwrightCommand, ['test', '--config', E2E_CONFIG_FILE, ...specPaths, ...playwrightArgs]);
|
|
57
48
|
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
// eslint-disable-next-line no-console
|
|
61
|
-
console.log(`E2E target: ${E2E_LOCAL_BASE_URL}`);
|
|
62
|
-
}
|
|
49
|
+
// eslint-disable-next-line no-console
|
|
50
|
+
console.log(`E2E target: ${E2E_LOCAL_BASE_URL}`);
|