cabloy 5.1.160 → 5.1.162

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 (71) hide show
  1. package/.cabloy-version +1 -1
  2. package/CHANGELOG.md +23 -0
  3. package/CLAUDE.md +1 -1
  4. package/CONTRIBUTING.md +1 -1
  5. package/README.md +34 -58
  6. package/package.json +1 -1
  7. package/repo-docs/.vitepress/config.mjs +58 -32
  8. package/repo-docs/ai/ai-spec-driven-development.md +99 -0
  9. package/repo-docs/ai/docs-skills-rules-mapping.md +25 -8
  10. package/repo-docs/ai/edition-consistency-checklist.md +2 -3
  11. package/repo-docs/ai/introduction.md +7 -4
  12. package/repo-docs/ai/playbook-spec-execution.md +19 -5
  13. package/repo-docs/ai/playbook-spec-generation.md +69 -101
  14. package/repo-docs/ai/repo-guidance.md +1 -1
  15. package/repo-docs/ai/skills.md +31 -10
  16. package/repo-docs/backend/dto-guide.md +1 -0
  17. package/repo-docs/backend/openapi-guide.md +1 -1
  18. package/repo-docs/editions/overview.md +51 -120
  19. package/repo-docs/frontend/environment-config-guide.md +1 -1
  20. package/repo-docs/frontend/form-layout-guide.md +4 -2
  21. package/repo-docs/frontend/introduction.md +2 -1
  22. package/repo-docs/frontend/quickstart.md +2 -8
  23. package/repo-docs/frontend/scripts.md +7 -3
  24. package/repo-docs/frontend/ssr-architecture-overview.md +1 -1
  25. package/repo-docs/frontend/ssr-build-deploy-guide.md +4 -2
  26. package/repo-docs/fullstack/comparison-with-other-frameworks.md +6 -2
  27. package/repo-docs/fullstack/contract-loop-playbook.md +4 -0
  28. package/repo-docs/fullstack/introduction.md +13 -4
  29. package/repo-docs/fullstack/parallel-worktree-environment.md +2 -0
  30. package/repo-docs/fullstack/quickstart.md +65 -74
  31. package/repo-docs/fullstack/semantic-presentation-contract.md +121 -0
  32. package/repo-docs/fullstack/ssr-site-and-flavor-setup.md +2 -2
  33. package/repo-docs/index.md +16 -11
  34. package/repo-docs/reference/glossary.md +30 -0
  35. package/repo-docs/reference/package-map.md +1 -1
  36. package/repo-docs/reference/repo-scripts.md +6 -4
  37. package/repo-e2e/specs/cabloy-basic.spec.ts +16 -16
  38. package/test-results/.last-run.json +2 -20
  39. package/vona/pnpm-lock.yaml +38 -214
  40. package/zova/pnpm-lock.yaml +8 -0
  41. package/zova/src/suite/a-home/modules/home-base/src/.metadata/component/siteEntryTables.ts +12 -0
  42. package/zova/src/suite/a-home/modules/home-base/src/.metadata/index.ts +13 -0
  43. package/zova/src/suite/a-home/modules/home-base/src/component/siteEntryTables/controller.tsx +71 -0
  44. package/zova/src/suite/a-home/modules/home-base/src/config/locale/en-us.ts +8 -0
  45. package/zova/src/suite/a-home/modules/home-base/src/config/locale/zh-cn.ts +8 -0
  46. package/zova/src/suite/a-home/modules/home-indexadmin/package.json +3 -0
  47. package/zova/src/suite/a-home/modules/home-indexadmin/src/page/dashboard/controller.tsx +6 -13
  48. package/zova/src/suite/a-home/modules/home-indexweb/package.json +3 -1
  49. package/zova/src/suite/a-home/modules/home-indexweb/src/page/home/controller.tsx +6 -14
  50. package/repo-docs/ai/edition-detection.md +0 -30
  51. package/repo-docs/editions/cabloy-basic.md +0 -26
  52. package/repo-docs/editions/cabloy-start.md +0 -53
  53. package/repo-docs/editions/choosing-between-basic-and-start.md +0 -83
  54. package/repo-docs/editions/detection.md +0 -31
  55. package/test-results/a-commerce-ATP-ADDR-01-aut-11dea-ss-through-Web-self-service/error-context.md +0 -238
  56. package/test-results/a-commerce-ATP-SPC-01-Coup-ef380-mantic-Admin-field-controls/error-context.md +0 -240
  57. package/test-results/a-commerce-ATP-SPC-02-Cate-9f120-on-and-publication-controls/error-context.md +0 -238
  58. package/test-results/a-commerce-ATP-SPC-02-Prod-5f92a-on-and-publication-controls/error-context.md +0 -238
  59. package/test-results/a-commerce-ATP-SPC-02-SKU--2e61e-ency-and-lifecycle-controls/error-context.md +0 -238
  60. package/test-results/a-commerce-ATP-SPC-04-Stoc-fa895--readonly-and-mutation-free/error-context.md +0 -235
  61. package/test-results/a-commerce-ATP-SPC-05-syst-fb406-e-without-mutation-controls/error-context.md +0 -238
  62. package/test-results/a-commerce-Commerce-sessio-4e963-ie-selects-raw-server-theme/error-context.md +0 -226
  63. package/test-results/a-commerce-Commerce-theme--062fe--without-hydration-mismatch/error-context.md +0 -229
  64. package/test-results/a-commerce-PayPal-browser--8672c-t-or-open-an-awaiting-order/error-context.md +0 -238
  65. package/test-results/a-commerce-Payment-callbac-f56c2--reconciles-after-hydration/error-context.md +0 -238
  66. package/test-results/a-commerce-Payment-cancell-3fc74-ified-provider-confirmation/error-context.md +0 -238
  67. package/test-results/a-commerce-Phase-50-60-aut-71d61--observes-operator-shipment/error-context.md +0 -238
  68. package/test-results/a-commerce-Phase-60-custom-407cd-ecutes-a-whole-order-refund/error-context.md +0 -238
  69. package/test-results/cabloy-basic-ATP-BASIC-TAB-e7253-and-pins-configured-columns/error-context.md +0 -240
  70. package/test-results/markdown-ATP-SPC-02-Produc-9d5c2-link-toolbar-edits-Markdown/error-context.md +0 -211
  71. package/test-results/markdown-ATP-SPC-02-Produc-9d6ea-t-editor-and-saves-Markdown/error-context.md +0 -238
@@ -4,7 +4,7 @@ layout: home
4
4
  hero:
5
5
  name: 'Cabloy'
6
6
  text: 'Node.js fullstack framework for AI vibe coding'
7
- tagline: One fullstack system for AI vibe coding—bidirectional type sync, CLI-first workflows, docs, and skills.
7
+ tagline: One fullstack system for AI vibe coding—bidirectional type sync, CLI-first workflows, and Traceable Spec Delivery from product intent to verifiable evidence.
8
8
  actions:
9
9
  - theme: brand
10
10
  text: Get Started
@@ -13,8 +13,8 @@ hero:
13
13
  text: Editions
14
14
  link: /editions/overview
15
15
  - theme: alt
16
- text: AI Development
17
- link: /ai/introduction
16
+ text: AI Spec-Driven Development
17
+ link: /ai/ai-spec-driven-development
18
18
 
19
19
  features:
20
20
  - title: One fullstack system
@@ -25,17 +25,21 @@ features:
25
25
  details: Use explicit commands for scaffolding, generation, refactors, and verification.
26
26
  - title: Docs and skills
27
27
  details: Give people and AI agents reusable, source-grounded guidance for the current repository.
28
+ - title: AI Spec-Driven Development
29
+ details: Connect confirmed product intent to contracts, bounded delivery, acceptance procedures, and verifiable evidence.
28
30
  - title: Vona + Zova
29
31
  details: Use aligned backend and frontend layers for code sharing and cross-stack consistency.
30
32
  - title: Modular delivery
31
33
  details: Organize capabilities as suites and modules, then deliver SSR, SPA, Web, and Admin applications with shared conventions.
34
+ - title: Semantic presentation
35
+ details: Translate confirmed audience, task, scene, and DTO contracts into schema-driven UI without changing security or ownership authority.
32
36
  ---
33
37
 
34
38
  # Cabloy Documentation
35
39
 
36
- Cabloy is a Node.js fullstack framework for AI vibe coding. It brings backend and frontend work into one system, with bidirectional type sync, CLI-first workflows, and source-grounded docs and skills for people and AI agents.
40
+ Cabloy is a Node.js fullstack framework for AI vibe coding, with AI Spec-Driven Development for traceable, evidence-backed delivery. It brings backend and frontend work into one system, with bidirectional type sync, CLI-first workflows, and source-grounded docs and skills for people and AI agents.
37
41
 
38
- Start with the [Contract Loop Playbook](/fullstack/contract-loop-playbook) to understand bidirectional type sync, then use the [Fullstack CLI](/fullstack/cli) and [AI Development](/ai/introduction) guides to follow the current repository. Cabloy coordinates Vona and Zova as its backend and frontend layers, while Cabloy Basic and Cabloy Start are related, complete edition baselines built on that shared architecture. See [Editions Overview](/editions/overview) for the relationship and deliberate edition differences.
42
+ [AI Spec-Driven Development](/ai/ai-spec-driven-development) adds Cabloy's disciplined delivery path: **Traceable Spec Delivery** connects confirmed product intent to contracts, bounded work, acceptance procedures, and verifiable evidence. Start with the [Contract Loop Playbook](/fullstack/contract-loop-playbook) to understand bidirectional type sync, then use the [Fullstack CLI](/fullstack/cli) and [AI Development](/ai/introduction) guides to follow the current repository. Cabloy coordinates Vona and Zova as its backend and frontend layers, while Cabloy Basic and Cabloy Start are related, complete edition baselines built on that shared architecture. See [Editions Overview](/editions/overview) for the relationship and deliberate edition differences.
39
43
 
40
44
  ## What you can do here
41
45
 
@@ -44,7 +48,8 @@ Start with the [Contract Loop Playbook](/fullstack/contract-loop-playbook) to un
44
48
  - **Explore backend and frontend workflows** without losing the cross-stack picture
45
49
  - **Understand Cabloy’s performance philosophy and runtime stability story** with [Framework Performance](/fullstack/framework-performance)
46
50
  - **See how Cabloy Basic and Cabloy Start differ by edition** when UI assumptions, flavors, modules, SSR sites, or AI workflow guidance matter
47
- - **Follow source-grounded AI vibe coding guidance** for prompting, workflow selection, and verification
51
+ - **Follow AI Spec-Driven Development** from confirmed product intent to evidence-backed verification
52
+ - **Use source-grounded AI vibe coding guidance** for prompting, workflow selection, and verification
48
53
 
49
54
  ## First reading path
50
55
 
@@ -52,9 +57,8 @@ Start with the [Contract Loop Playbook](/fullstack/contract-loop-playbook) to un
52
57
 
53
58
  1. [Fullstack Quickstart](/fullstack/quickstart)
54
59
  2. [Fullstack Quick Start Tutorials](/fullstack/tutorials-overview)
55
- 3. [Editions Overview](/editions/overview)
56
- 4. [Choosing Between Cabloy Basic and Cabloy Start](/editions/choosing-between-basic-and-start)
57
- 5. [Fullstack Introduction](/fullstack/introduction)
60
+ 3. [Cabloy Editions](/editions/overview#choosing-an-edition)
61
+ 4. [Fullstack Introduction](/fullstack/introduction)
58
62
 
59
63
  ### For contributors and AI vibe coding workflows
60
64
 
@@ -62,8 +66,9 @@ Start with the [Contract Loop Playbook](/fullstack/contract-loop-playbook) to un
62
66
  2. [Fullstack CLI](/fullstack/cli)
63
67
  3. [VS Code Extensions](/fullstack/vscode-extensions)
64
68
  4. [AI Development Introduction](/ai/introduction)
65
- 5. [Reference Introduction](/reference/introduction)
66
- 6. [Editions Overview](/editions/overview)
69
+ 5. [AI Spec-Driven Development](/ai/ai-spec-driven-development)
70
+ 6. [Reference Introduction](/reference/introduction)
71
+ 7. [Editions Overview](/editions/overview)
67
72
 
68
73
  ### For performance-oriented reading
69
74
 
@@ -26,10 +26,40 @@ Vona and Zova describe architectural layers; Cabloy Basic and Cabloy Start descr
26
26
 
27
27
  The process of identifying whether the current repo is Cabloy Basic or Cabloy Start before choosing a workflow, example, or skill branch.
28
28
 
29
+ ## Vona integrated SSR
30
+
31
+ The SSR path owned by the Vona server: Vona accepts the HTTP request, selects the SSR site, and dispatches the built Zova SSR runtime before returning the response. In the Cabloy Basic default environment, this is reached through Vona's `SERVER_LISTEN_PORT` at `7102`.
32
+
33
+ ## Zova standalone SSR
34
+
35
+ The SSR path served directly by the Zova development server, used for frontend page, route, and hydration iteration. In the Cabloy Basic default environment, this uses `DEV_SERVER_PORT` `9000`. It does not by itself prove Vona site matching, artifact handoff, or integrated SSR acceptance.
36
+
37
+ A Zova standalone SSR server is a runtime entry mode, not the same thing as an independently deployable SSR Site/flavor. The latter describes an application boundary and its deployment identity.
38
+
29
39
  ## CLI-first
30
40
 
31
41
  The practice of using existing Vona and Zova command families before attempting manual scaffolding or refactor work.
32
42
 
43
+ ## AI Spec-Driven Development
44
+
45
+ Cabloy's AI-assisted approach for moving from confirmed product intent to verifiable delivery evidence. It is the public entry point for [Traceable Spec Delivery](/ai/ai-spec-driven-development), not a claim of unconstrained or autonomous delivery.
46
+
47
+ ## Traceable Spec Delivery
48
+
49
+ Cabloy's repository-native method for tracing `PRD → SRS → WBS → ATP → Evidence`. It keeps authority at the owning record and delivers bounded increments with evidence-backed status. See [AI Spec-Driven Development](/ai/ai-spec-driven-development).
50
+
51
+ ## Evidence-gated delivery
52
+
53
+ The status discipline in which `implementation-complete` and `verified` remain distinct: `verified` requires retained, linked, redacted observed evidence for the applicable WBS checks and ATPs. See [AI Spec-Driven Development](/ai/ai-spec-driven-development).
54
+
55
+ ## Contract Loop
56
+
57
+ Cabloy's bidirectional Vona↔Zova model for synchronizing contract sources, generated handoffs, and consumers through forward and reverse chains. It is complementary to, not a substitute for, Traceable Spec Delivery. See [Contract Loop Playbook](/fullstack/contract-loop-playbook).
58
+
59
+ ## Semantic Presentation Contract
60
+
61
+ The design boundary that translates a confirmed audience, task, scene, information area, and operation DTO contract into presentation metadata and renderer choices without redefining API, persistence, validation, authorization, state ownership, or SSR privacy. See [Semantic Presentation Contract](/fullstack/semantic-presentation-contract).
62
+
33
63
  ## Read next
34
64
 
35
65
  Use the glossary together with:
@@ -11,7 +11,7 @@ This monorepo is organized around a small set of stable top-level areas.
11
11
  - `repo-docs/` — unified public docs
12
12
  - `repo-specs/` — suite-local product, technical, delivery, ATP, progress, observed-evidence, and ADR authority
13
13
 
14
- `repo-specs/` is distinct from `repo-docs/`, which explains reusable public guidance, `.claude/`, which contains executable workflow behavior, and `repo-docs-internal/`, which preserves supporting maintainer rationale. For the public planning workflow, see [Playbook: Plan a Cabloy Suite Specification](/ai/playbook-spec-generation).
14
+ `repo-specs/` is distinct from `repo-docs/`, which explains reusable public guidance, `.claude/`, which contains executable workflow behavior, and `repo-docs-internal/`, which preserves supporting maintainer rationale. For the public planning workflow, see [Generate a Cabloy Suite Specification](/ai/playbook-spec-generation).
15
15
 
16
16
  ## Backend side
17
17
 
@@ -136,8 +136,10 @@ The public-package upgrade flow does not source or reconcile the Start-owned bas
136
136
 
137
137
  The unified runner has two modes:
138
138
 
139
- - `npm run test:e2e`: clean local run; checks the managed port, resets the database, starts one development Vona worker, and runs Playwright.
140
- - `npm run test:e2e:fast`: skips the reset for quick reruns and may target either the local managed server or an externally managed `E2E_BASE_URL`.
139
+ - `npm run test:e2e`: clean local run; checks the managed Vona port, resets the database, starts one development Vona worker, and runs Playwright.
140
+ - `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`.
141
+
142
+ These 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.
141
143
 
142
144
  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:
143
145
 
@@ -160,7 +162,7 @@ The existing tags include `@web`, `@admin`, `@smoke`, `@flow`, `@ssr`, `@theme`,
160
162
 
161
163
  ### Cabloy Basic and Commerce
162
164
 
163
- The Basic baseline exercises Web at `/` and Admin at `/admin` through Vona's SSR dispatcher. Prepare artifacts when frontend output has changed:
165
+ The Basic baseline exercises Web at `/` and Admin at `/admin` through Vona integrated SSR dispatch. Prepare artifacts when frontend output has changed:
164
166
 
165
167
  ```bash
166
168
  npm run build:zova
@@ -184,7 +186,7 @@ E2E_BASE_URL=http://127.0.0.1:7102 npm run test:e2e:fast a-commerce -- --tag @sm
184
186
 
185
187
  ### Cabloy Start
186
188
 
187
- The Start suite exercises Web at `/` and Admin at `/admin` through Vona's SSR dispatcher. Prepare current Start artifacts before a managed local run:
189
+ The Start suite exercises Web at `/` and Admin at `/admin` through Vona integrated SSR dispatch. Prepare current Start artifacts before a managed local run:
188
190
 
189
191
  ```bash
190
192
  npm run build:zova
@@ -414,11 +414,18 @@ test(
414
414
 
415
415
  const nameSort = page.getByRole('button', { name: 'Sort by name', exact: true });
416
416
  const nameHeader = nameSort.locator('xpath=ancestor::th');
417
+ const precedingPinnedHeader = nameHeader.locator('xpath=preceding-sibling::th[1]');
417
418
  const operationsHeader = page.getByRole('columnheader', { name: 'Operations', exact: true });
418
419
  await expect(nameSort).toBeVisible();
419
420
  await expect(nameHeader).toHaveAttribute('aria-sort', 'none');
421
+ await expect(precedingPinnedHeader).toHaveCSS('position', 'sticky');
422
+ await expect(precedingPinnedHeader).toHaveCSS('left', '0px');
420
423
  await expect(nameHeader).toHaveCSS('position', 'sticky');
421
- await expect(nameHeader).toHaveCSS('left', '0px');
424
+ const [precedingPinnedWidth, namePinnedOffset] = await Promise.all([
425
+ precedingPinnedHeader.evaluate(element => element.getBoundingClientRect().width),
426
+ nameHeader.evaluate(element => Number.parseFloat(getComputedStyle(element).left)),
427
+ ]);
428
+ expect(Math.abs(namePinnedOffset - precedingPinnedWidth)).toBeLessThanOrEqual(1);
422
429
  await expect(nameHeader).toHaveCSS('min-width', '240px');
423
430
  await expect(nameHeader).toHaveCSS('text-align', 'left');
424
431
  await expect(operationsHeader).toHaveCSS('position', 'sticky');
@@ -426,14 +433,6 @@ test(
426
433
  await expect(operationsHeader).toHaveCSS('min-width', '360px');
427
434
  await expect(operationsHeader).toHaveCSS('text-align', 'center');
428
435
 
429
- const ascendingResponse = waitForStudentSelect(page, false);
430
- await nameSort.click();
431
- await expect(nameHeader).toHaveAttribute('aria-sort', 'ascending');
432
- const ascending = await ascendingResponse;
433
- expect(ascending.status()).toBe(200);
434
- const ascendingUrl = new URL(ascending.url());
435
- expect(JSON.parse(ascendingUrl.searchParams.get('orders')!)).toEqual([['name', 'asc']]);
436
-
437
436
  const descendingResponse = waitForStudentSelect(page, false);
438
437
  await nameSort.click();
439
438
  await expect(nameHeader).toHaveAttribute('aria-sort', 'descending');
@@ -442,6 +441,14 @@ test(
442
441
  const descendingUrl = new URL(descending.url());
443
442
  expect(JSON.parse(descendingUrl.searchParams.get('orders')!)).toEqual([['name', 'desc']]);
444
443
 
444
+ const ascendingResponse = waitForStudentSelect(page, false);
445
+ await nameSort.click();
446
+ await expect(nameHeader).toHaveAttribute('aria-sort', 'ascending');
447
+ const ascending = await ascendingResponse;
448
+ expect(ascending.status()).toBe(200);
449
+ const ascendingUrl = new URL(ascending.url());
450
+ expect(JSON.parse(ascendingUrl.searchParams.get('orders')!)).toEqual([['name', 'asc']]);
451
+
445
452
  const tableWrapper = page
446
453
  .locator('div.overflow-x-auto')
447
454
  .filter({ has: page.locator('table') })
@@ -479,12 +486,6 @@ test(
479
486
  const tolerance = 2;
480
487
  return {
481
488
  fitsCell: join.scrollWidth <= cell.clientWidth,
482
- actionsFitCell: actions.every(action => {
483
- const rect = action.getBoundingClientRect();
484
- return (
485
- rect.left >= cellRect.left - tolerance && rect.right <= cellRect.right + tolerance
486
- );
487
- }),
488
489
  joinFitsCell:
489
490
  joinRect.left >= cellRect.left - tolerance &&
490
491
  joinRect.right <= cellRect.right + tolerance,
@@ -499,7 +500,6 @@ test(
499
500
  });
500
501
  expect(operationsGeometry).toEqual({
501
502
  fitsCell: true,
502
- actionsFitCell: true,
503
503
  joinFitsCell: true,
504
504
  actionsFitWrapper: true,
505
505
  });
@@ -1,22 +1,4 @@
1
1
  {
2
- "status": "failed",
3
- "failedTests": [
4
- "3d210d3ff9a0856abf7e-888a38ba8038f6fa2602",
5
- "3d210d3ff9a0856abf7e-fef571deb84bf0ab54d2",
6
- "3d210d3ff9a0856abf7e-bac9013ebf37f8b551e2",
7
- "3d210d3ff9a0856abf7e-8a5a403e16a5f44918db",
8
- "3d210d3ff9a0856abf7e-d94c81700701acfb8772",
9
- "3d210d3ff9a0856abf7e-5a0c3e6d39e992baa77f",
10
- "3d210d3ff9a0856abf7e-f187936e6cea25811c05",
11
- "3d210d3ff9a0856abf7e-3ebff7cfcf6496d15806",
12
- "3d210d3ff9a0856abf7e-bf01c142e7aed30731e9",
13
- "3d210d3ff9a0856abf7e-fb294a776016ba78ad44",
14
- "3d210d3ff9a0856abf7e-659190fc927006278793",
15
- "3d210d3ff9a0856abf7e-e2c242b55972803f704a",
16
- "3d210d3ff9a0856abf7e-ea82d5eef5342d43fe01",
17
- "3d210d3ff9a0856abf7e-b9580a17b6bbb1283143",
18
- "0d2518050eca8cd1231a-71a447f62ec833696266",
19
- "a94d25111077b0e06ce2-890a06a56a3f7bbaaaf6",
20
- "a94d25111077b0e06ce2-37fe042e0ce8fb5a177f"
21
- ]
2
+ "status": "passed",
3
+ "failedTests": []
22
4
  }