cabloy 5.1.193 → 5.1.195

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 (108) hide show
  1. package/.cabloy-version +1 -1
  2. package/.github/workflows/agent-governance.yml +1 -0
  3. package/CHANGELOG.md +30 -0
  4. package/README.md +13 -24
  5. package/package.json +2 -1
  6. package/repo-agent-governance/adapters/codex/contract-loop-gate.mjs +1 -1
  7. package/repo-agent-governance/adapters/cursor/contract-loop-gate.mjs +1 -1
  8. package/repo-agent-governance/managed-assets.json +140 -35
  9. package/repo-agent-governance/scripts/pack-check.mjs +17 -0
  10. package/repo-agent-governance/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -0
  11. package/repo-agent-governance/skills/cabloy-domain-planning/SKILL.md +5 -3
  12. package/repo-agent-governance/skills/cabloy-spec-execution/SKILL.md +13 -8
  13. package/repo-agent-governance/skills/cabloy-spec-execution/evals/evals.json +108 -12
  14. package/repo-agent-governance/skills/cabloy-spec-execution/evals/files/scenarios.json +84 -0
  15. package/repo-agent-governance/skills/cabloy-spec-execution/evals/protocol.md +9 -0
  16. package/repo-agent-governance/skills/cabloy-spec-execution/references/execution-protocol.md +21 -5
  17. package/repo-agent-governance/skills/cabloy-spec-execution/references/status-and-evidence.md +5 -3
  18. package/repo-agent-governance/skills/cabloy-spec-generation/SKILL.md +78 -168
  19. package/repo-agent-governance/skills/cabloy-spec-generation/evals/evals.json +165 -17
  20. package/repo-agent-governance/skills/cabloy-spec-generation/evals/files/scenarios.json +114 -0
  21. package/repo-agent-governance/skills/cabloy-spec-generation/evals/protocol.md +44 -0
  22. package/repo-agent-governance/skills/cabloy-spec-generation/references/canonical-spec-input.md +145 -0
  23. package/repo-agent-governance/skills/cabloy-spec-generation/references/repo-aware-discovery.md +55 -57
  24. package/repo-agent-governance/skills/cabloy-spec-generation/references/repo-specs-document-set.md +6 -4
  25. package/repo-agent-governance/skills/cabloy-spec-generation/references/traceability-and-status-rules.md +12 -8
  26. package/repo-agent-governance/tests/governance.test.mjs +42 -1
  27. package/repo-agent-governance/tests/spec-audit.test.mjs +255 -0
  28. package/repo-agent-governance/tools/contract-loop/hook-runtime.mjs +4 -3
  29. package/repo-agent-governance/tools/spec-audit/audit.mjs +427 -0
  30. package/repo-agent-governance/tools/spec-charts/generate-implementation-charts.mjs +97 -408
  31. package/repo-agent-governance/tools/spec-charts/generate-implementation-charts.test.mjs +462 -1
  32. package/repo-agent-governance/tools/spec-charts/spec-parser.mjs +561 -0
  33. package/repo-docs/.vitepress/config.mjs +54 -29
  34. package/repo-docs/ai/playbook-spec-execution.md +10 -4
  35. package/repo-docs/ai/playbook-spec-generation.md +40 -3
  36. package/repo-docs/ai/skills.md +3 -3
  37. package/repo-docs/backend/controller-aop-guide.md +10 -0
  38. package/repo-docs/backend/field-indexes.md +25 -0
  39. package/repo-docs/backend/menu-authorization.md +1 -0
  40. package/repo-docs/backend/menu-guide.md +18 -7
  41. package/repo-docs/blogs/cabloy-fullstack-resource-addressing/index.md +2 -1
  42. package/repo-docs/fullstack/contract-loop-playbook.md +1 -1
  43. package/repo-docs/fullstack/development-history.md +24 -0
  44. package/repo-docs/fullstack/introduction.md +25 -156
  45. package/repo-docs/fullstack/quickstart.md +1 -1
  46. package/repo-docs/fullstack/ssr-entry-modes.md +52 -0
  47. package/repo-docs/fullstack/ssr-site-and-flavor-setup.md +3 -1
  48. package/repo-docs/fullstack/tutorial-5-backend-contract-sharing.md +13 -7
  49. package/repo-docs/fullstack/tutorial-6-one-contract-four-uses.md +11 -15
  50. package/repo-docs/fullstack/tutorials-overview.md +2 -2
  51. package/repo-docs/index.md +23 -45
  52. package/repo-docs/public/cabloy.png +0 -0
  53. package/repo-docs/public/cabloy.svg +3 -0
  54. package/repo-docs/public/favicon.svg +3 -0
  55. package/repo-docs/reference/repo-scripts.md +6 -1
  56. package/repo-e2e/config/playwright.config.ts +1 -1
  57. package/repo-e2e/scripts/startE2eVona.ts +6 -2
  58. package/repo-e2e/specs/controller-boundary.spec.ts +76 -28
  59. package/scripts/bootstrapAgentGovernance.mjs +1 -0
  60. package/scripts/upgrade.ts +1 -0
  61. package/vona/packages-cli/cli/package.json +1 -1
  62. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudBasic/snippets/2-meta.index.ts +4 -10
  63. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/snippets/2-meta.index.ts +4 -10
  64. package/vona/packages-cli/cli-set-api/package.json +8 -2
  65. package/vona/packages-cli/cli-set-api/src/index.ts +1 -0
  66. package/vona/packages-cli/cli-set-api/src/lib/bean/cli.tools.masterDetail.ts +9 -12
  67. package/vona/packages-cli/cli-set-api/src/lib/mergeMetaIndex.ts +121 -0
  68. package/vona/packages-cli/cli-set-api/test/indexSnippets.test.ts +41 -0
  69. package/vona/packages-cli/cli-set-api/test/mergeMetaIndex.test.ts +78 -0
  70. package/vona/packages-vona/vona/package.json +1 -1
  71. package/vona/pnpm-lock.yaml +5 -5
  72. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/sku.ts +25 -4
  73. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuUniqueness.test.ts +161 -0
  74. package/vona/src/suite/a-commerce/modules/commerce-payment/src/bean/meta.index.ts +21 -20
  75. package/vona/src/suite/a-commerce/modules/commerce-payment/test/paymentIndexes.test.ts +165 -0
  76. package/vona/src/suite/a-commerce/modules/commerce-promotion/src/bean/meta.index.ts +16 -13
  77. package/vona/src/suite/a-commerce/modules/commerce-promotion/test/promotionIndexes.test.ts +82 -0
  78. package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/meta.index.ts +23 -21
  79. package/vona/src/suite/a-commerce/modules/commerce-trade/test/tradeIndexes.test.ts +86 -0
  80. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/package.json +1 -1
  81. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
  82. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/lib/beanSsrSiteBase.ts +2 -0
  83. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/lib/ssrMenu.ts +9 -3
  84. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/lib/ssrMenuEligibility.ts +14 -0
  85. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/lib/ssrMenuGroup.ts +9 -3
  86. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/lib/ssrMenuSite.ts +10 -0
  87. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/types/ssrMenu.ts +1 -1
  88. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/types/ssrMenuGroup.ts +1 -1
  89. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/test/ssrMenuEligibility.test.ts +73 -13
  90. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/test/ssrMenuSite.test.ts +90 -0
  91. package/vona/src/suite-vendor/a-cabloy/package.json +2 -2
  92. package/vona/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
  93. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/meta.index.ts +35 -26
  94. package/vona/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
  95. package/vona/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
  96. package/vona/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
  97. package/vona/src/suite-vendor/a-pay/package.json +5 -5
  98. package/vona/src/suite-vendor/a-vona/modules/a-error/package.json +1 -1
  99. package/vona/src/suite-vendor/a-vona/modules/a-error/src/lib/onerror.ts +9 -0
  100. package/vona/src/suite-vendor/a-vona/modules/a-error/test/onerror.test.ts +92 -0
  101. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  102. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transactionFiber_.ts +6 -2
  103. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transaction_.ts +4 -1
  104. package/vona/src/suite-vendor/a-vona/modules/a-ormutils/package.json +1 -1
  105. package/vona/src/suite-vendor/a-vona/modules/a-ormutils/src/lib/columns.ts +3 -1
  106. package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
  107. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  108. /package/repo-docs/{.vitepress/public → public}/CNAME +0 -0
package/.cabloy-version CHANGED
@@ -1 +1 @@
1
- 5.1.193
1
+ 5.1.195
@@ -35,5 +35,6 @@ jobs:
35
35
  npm run agent:governance:pack-check
36
36
  npm run test:spec-charts
37
37
  npm run spec:charts:check -- a-commerce
38
+ npm run spec:charts:check -- home-user
38
39
  - name: build documentation
39
40
  run: npm run docs:build
package/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.1.195
4
+
5
+ ### Features
6
+
7
+ - Update application features.
8
+
9
+ ### Bug Fixes
10
+
11
+ - Fix metadata index merging and preserve indexes on the same table in metadata and generators.
12
+
13
+ ### Improvements
14
+
15
+ - Enhance transaction handling and specification skills.
16
+ - Refine the commerce specification and clarify the tutorial’s OpenAPI workflow and contract model.
17
+ - Update the controller AOP guide, SSR comparison, development history, introduction, README, and site icon.
18
+
19
+ ## 5.1.194
20
+
21
+ ### Bug Fixes
22
+
23
+ - Resolve lint errors in governance contract-loop hooks.
24
+
25
+ ### Improvements
26
+
27
+ - Update controller-boundary tests.
28
+
29
+ ### Breaking Changes
30
+
31
+ - Require explicit menu site bindings for SSR.
32
+
3
33
  ## 5.1.193
4
34
 
5
35
  ### Features
package/README.md CHANGED
@@ -6,32 +6,31 @@
6
6
  [![Docs](https://img.shields.io/badge/docs-cabloy-4f46e5.svg?style=flat-square)](https://cabloy.com)
7
7
  [![Demo](https://img.shields.io/badge/demo-cabloy.com-059669.svg?style=flat-square)](https://cabloy.com/demo)
8
8
 
9
- Cabloy is a Node.js fullstack framework for AI vibe coding, with AI Spec-Driven Development for traceable, evidence-backed delivery.
9
+ Cabloy is a Node.js fullstack framework for AI vibe coding, with AI Spec-Driven Development guiding work from confirmed specs to verifiable delivery.
10
10
 
11
- **One fullstack system for AI vibe coding—bidirectional type sync, CLI-first workflows, docs, skills, and traceable delivery from product intent to verifiable evidence.**
12
-
13
- Instead of stitching separate backend and frontend stacks together, Cabloy keeps their contracts, tooling, and guidance connected in one repository. [AI Spec-Driven Development](https://cabloy.com/ai/ai-spec-driven-development) provides the disciplined path from confirmed Specs to evidence-backed delivery; its precise engineering method is Traceable Spec Delivery. Vona is its backend framework and runtime layer, and Zova is its frontend framework and application layer. Cabloy Basic and Cabloy Start are related, complete edition baselines built on that shared architecture; see [Editions Overview](https://cabloy.com/editions/overview) for their deliberate differences.
11
+ Cabloy Basic and Cabloy Start are complete editions built on this shared architecture; see [Editions Overview](https://cabloy.com/editions/overview) for their differences.
14
12
 
15
13
  [Documentation](https://cabloy.com) · [npm](https://www.npmjs.com/package/cabloy) · [Demo](https://cabloy.com/demo) · [GitHub](https://github.com/cabloy/cabloy)
16
14
 
17
15
  ## Fullstack Principles
18
16
 
19
- Cabloy’s fullstack model is built around two core principles:
17
+ Cabloy connects Vona and Zova in two ways:
20
18
 
21
- 1. **Frontend build output participates directly in backend SSR**
22
- - Zova owns the frontend application source
23
- - the generated frontend bundle and SSR-related artifacts are consumed by the Vona-side SSR flow
24
- - backend rendering and frontend hydration stay on one coordinated delivery path
19
+ 1. **Integrated SSR.** Zova builds the frontend and SSR artifacts. In Vona integrated SSR, Vona consumes those artifacts to render the page, and Zova hydrates it in the browser.
25
20
 
26
- 2. **Type information flows in both directions**
27
- - **Backend -> Frontend**: Vona emits Swagger/OpenAPI contracts that Zova can use to generate SDKs and related schema-aware helpers
28
- - **Frontend -> Backend**: Zova generates structural metadata and typing surfaces such as routes, components, and icons that can improve backend-side tooling and type hints
21
+ 2. **Bidirectional contract flow.** Vona's OpenAPI contracts generate Zova SDKs and schema-aware helpers. Zova's generated metadata and types for routes, components, and icons feed back into Vona's tooling and type hints.
29
22
 
30
- For the complete explanation, see [Fullstack Introduction](https://cabloy.com/fullstack/introduction), [Vona + Zova Integration](https://cabloy.com/fullstack/vona-zova-integration), [Backend OpenAPI to Frontend SDK](https://cabloy.com/fullstack/openapi-to-sdk), and [Frontend Metadata Back to Backend](https://cabloy.com/fullstack/frontend-metadata-to-backend).
23
+ Learn more about [Vona + Zova Integration](https://cabloy.com/fullstack/vona-zova-integration) and the [Contract Loop](https://cabloy.com/fullstack/contract-loop-playbook).
31
24
 
32
25
  ## Get Started
33
26
 
34
- See the [Fullstack Quickstart](https://cabloy.com/fullstack/quickstart).
27
+ Create a new Cabloy Basic project:
28
+
29
+ ```bash
30
+ npm create cabloy
31
+ ```
32
+
33
+ For Cabloy Start, clone the [Cabloy Start repository](https://github.com/cabloy/cabloy-start) and run `npm run init` from its root. See the [Fullstack Quickstart](https://cabloy.com/fullstack/quickstart) for prerequisites and development commands.
35
34
 
36
35
  ## AI Spec-Driven Development
37
36
 
@@ -78,16 +77,6 @@ Included demonstration suites give AI vibe coding agents high-quality, project-n
78
77
 
79
78
  > “Not included” means that the suite is not part of the default edition baseline. It does not limit what can be built with Cabloy.
80
79
 
81
- ## Highlights
82
-
83
- - **One fullstack system** — build backend and frontend together instead of assembling separate stacks
84
- - **Bidirectional type sync** — use the contract loop to keep backend contracts and frontend metadata aligned in both directions
85
- - **CLI-first workflows** — use explicit commands for scaffolding, generation, refactors, and verification
86
- - **Docs and skills** — give people and AI agents reusable, source-grounded guidance for the current repository
87
- - **AI Spec-Driven Development** — use Traceable Spec Delivery to connect product intent, contracts, bounded work, acceptance procedures, and verifiable evidence
88
- - **Vona + Zova** — use aligned backend and frontend layers for code sharing and cross-stack consistency
89
- - **Modular delivery** — organize capabilities as suites and modules, then deliver SSR, SPA, Web, and Admin applications with shared conventions
90
-
91
80
  ## Technology Stack
92
81
 
93
82
  ### General
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cabloy",
3
- "version": "5.1.193",
3
+ "version": "5.1.195",
4
4
  "gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
5
5
  "description": "A Node.js fullstack framework",
6
6
  "keywords": [
@@ -60,6 +60,7 @@
60
60
  "test:spec-charts": "node --test repo-agent-governance/tools/spec-charts/generate-implementation-charts.test.mjs",
61
61
  "spec:charts": "node ./repo-agent-governance/tools/spec-charts/generate-implementation-charts.mjs",
62
62
  "spec:charts:check": "node ./repo-agent-governance/tools/spec-charts/generate-implementation-charts.mjs --check",
63
+ "spec:check": "node ./repo-agent-governance/tools/spec-audit/audit.mjs",
63
64
  "docs:dev": "pnpm --dir repo-docs docs:dev",
64
65
  "docs:build": "pnpm --dir repo-docs docs:build",
65
66
  "docs:preview": "pnpm --dir repo-docs docs:preview",
@@ -17,7 +17,7 @@ function runCodexHook() {
17
17
  const evaluated = evaluateCodexEditedFiles(ROOT, extractCodexEditedFiles(payload), payload.cwd);
18
18
  if (!evaluated.length) return 0;
19
19
  const message = evaluated.map(item => item.message).join('\n\n');
20
- // eslint-disable-next-line
20
+ // eslint-disable-next-line no-console
21
21
  console.log(JSON.stringify(formatCodexHookOutput(message)));
22
22
  return 0;
23
23
  }
@@ -19,7 +19,7 @@ function runCursorHook() {
19
19
  if (!evaluated) return 0;
20
20
  const output = formatCursorHookOutput(evaluated.message, inferCursorHookEvent(payload));
21
21
  if (output) {
22
- // eslint-disable-next-line
22
+ // eslint-disable-next-line no-console
23
23
  console.log(JSON.stringify(output));
24
24
  }
25
25
  return 0;
@@ -18,7 +18,7 @@
18
18
  {
19
19
  "adapter": "codex",
20
20
  "category": "skill",
21
- "sha256": "5ac94eb98e3c89abef06b5164298f953ea16759fc24e8d57d18f5d6c40c4168f",
21
+ "sha256": "88e6ca8c60d8caeb68ab932f2a7e22810a31911400b4428fd0756d076dbc78e8",
22
22
  "source": "skills/cabloy-backend-scaffold/references/follow-up-checklist.md",
23
23
  "target": ".agents/skills/cabloy-backend-scaffold/references/follow-up-checklist.md"
24
24
  },
@@ -67,7 +67,7 @@
67
67
  {
68
68
  "adapter": "codex",
69
69
  "category": "skill",
70
- "sha256": "0cc583277837d9e7ec8b54df86eeb43a42efef3b0ac08405c91a6f6345b6b377",
70
+ "sha256": "aceca7a587634f574301cafad267b9a2d620db1c5a5c1dd8cec9483870fc0400",
71
71
  "source": "skills/cabloy-domain-planning/SKILL.md",
72
72
  "target": ".agents/skills/cabloy-domain-planning/SKILL.md"
73
73
  },
@@ -158,63 +158,98 @@
158
158
  {
159
159
  "adapter": "codex",
160
160
  "category": "skill",
161
- "sha256": "00b614b97e4cfca37ecb5245e9a58ddd69e744e67b3cae32145499bec01f1812",
161
+ "sha256": "1d5a93d8285e85778e281c1a82d141f44d6f74112a295fc1d8ad977e2af2b3c3",
162
162
  "source": "skills/cabloy-spec-execution/evals/evals.json",
163
163
  "target": ".agents/skills/cabloy-spec-execution/evals/evals.json"
164
164
  },
165
165
  {
166
166
  "adapter": "codex",
167
167
  "category": "skill",
168
- "sha256": "ec7d25e9de7f4ecc12e1937e7692dab880892958155d914e086133708878fdd0",
168
+ "sha256": "187c45fea775846326bcdea17b20a465850e563cd98a9c189725ca5aac5fdee5",
169
+ "source": "skills/cabloy-spec-execution/evals/files/scenarios.json",
170
+ "target": ".agents/skills/cabloy-spec-execution/evals/files/scenarios.json"
171
+ },
172
+ {
173
+ "adapter": "codex",
174
+ "category": "skill",
175
+ "sha256": "4272ada10c6802a70c3fd926aab858724a65e975a716775ac716d6f0ba85c25a",
176
+ "source": "skills/cabloy-spec-execution/evals/protocol.md",
177
+ "target": ".agents/skills/cabloy-spec-execution/evals/protocol.md"
178
+ },
179
+ {
180
+ "adapter": "codex",
181
+ "category": "skill",
182
+ "sha256": "788f9c94a93753f2ad16d0a1f772fe61785514ab69e2564a2a2454f4efb46086",
169
183
  "source": "skills/cabloy-spec-execution/references/execution-protocol.md",
170
184
  "target": ".agents/skills/cabloy-spec-execution/references/execution-protocol.md"
171
185
  },
172
186
  {
173
187
  "adapter": "codex",
174
188
  "category": "skill",
175
- "sha256": "f8c69f36ac2ea5fc4800ca70fdc5a3d8362e944ca54cd9d657ded6465695e160",
189
+ "sha256": "ec93b6999fcf87f35f8f1f18eed54bb08ee2753862b34f6c474480f2c88ee7e0",
176
190
  "source": "skills/cabloy-spec-execution/references/status-and-evidence.md",
177
191
  "target": ".agents/skills/cabloy-spec-execution/references/status-and-evidence.md"
178
192
  },
179
193
  {
180
194
  "adapter": "codex",
181
195
  "category": "skill",
182
- "sha256": "150c826e78616763d73f8e81f2e3d85c0e05eedb649ac2a069359c6ce074d507",
196
+ "sha256": "52a1a0ae16f72345a761d657130fd65b681535c20937a86d1d6f279772c9bb31",
183
197
  "source": "skills/cabloy-spec-execution/SKILL.md",
184
198
  "target": ".agents/skills/cabloy-spec-execution/SKILL.md"
185
199
  },
186
200
  {
187
201
  "adapter": "codex",
188
202
  "category": "skill",
189
- "sha256": "8ce8a4bc07ef33a40f8b745e34966202be27e6682c995c3fa0c351e1d85af904",
203
+ "sha256": "4ef681f7bb98e605514e770bfa129d171f915e8562025d6195de0f8dfecaa80a",
190
204
  "source": "skills/cabloy-spec-generation/evals/evals.json",
191
205
  "target": ".agents/skills/cabloy-spec-generation/evals/evals.json"
192
206
  },
193
207
  {
194
208
  "adapter": "codex",
195
209
  "category": "skill",
196
- "sha256": "988b4aee132dd64156e7b237653f7ba37f0f088b75f669219c3931b35336ec04",
210
+ "sha256": "c5a1923be3cf387d3d31535af816e8ecadd52762ebb847a1be0d7cd1fe7c3d61",
211
+ "source": "skills/cabloy-spec-generation/evals/files/scenarios.json",
212
+ "target": ".agents/skills/cabloy-spec-generation/evals/files/scenarios.json"
213
+ },
214
+ {
215
+ "adapter": "codex",
216
+ "category": "skill",
217
+ "sha256": "4fa0405277092948d79cbde3d5b9b0f2e258dac58bf7e462dffea56da5fdd45f",
218
+ "source": "skills/cabloy-spec-generation/evals/protocol.md",
219
+ "target": ".agents/skills/cabloy-spec-generation/evals/protocol.md"
220
+ },
221
+ {
222
+ "adapter": "codex",
223
+ "category": "skill",
224
+ "sha256": "85b5a174c20111d31e50071a826f555c1e9b810e52078305af2850f3593f3603",
225
+ "source": "skills/cabloy-spec-generation/references/canonical-spec-input.md",
226
+ "target": ".agents/skills/cabloy-spec-generation/references/canonical-spec-input.md"
227
+ },
228
+ {
229
+ "adapter": "codex",
230
+ "category": "skill",
231
+ "sha256": "0c482b23c42c893dae4a027a786117ff2ad4b5686e3fc29de0a117d7e4958a49",
197
232
  "source": "skills/cabloy-spec-generation/references/repo-aware-discovery.md",
198
233
  "target": ".agents/skills/cabloy-spec-generation/references/repo-aware-discovery.md"
199
234
  },
200
235
  {
201
236
  "adapter": "codex",
202
237
  "category": "skill",
203
- "sha256": "77c90b159387320059b82d83ccdab42d116f4ade2cb844aec2b0dad86d60fcd3",
238
+ "sha256": "772e83aea0d7a3ad3d5a91d4ecedd09f6cd24ae9eb146399f0834ded3f074185",
204
239
  "source": "skills/cabloy-spec-generation/references/repo-specs-document-set.md",
205
240
  "target": ".agents/skills/cabloy-spec-generation/references/repo-specs-document-set.md"
206
241
  },
207
242
  {
208
243
  "adapter": "codex",
209
244
  "category": "skill",
210
- "sha256": "168e58f7acf2a3085a79e745862acb4972c703271563df9769bb23fff2a48d93",
245
+ "sha256": "242d3b7dd6f9266fa836918443c06add6bf9d2308d7f4288112412ee3a6224f5",
211
246
  "source": "skills/cabloy-spec-generation/references/traceability-and-status-rules.md",
212
247
  "target": ".agents/skills/cabloy-spec-generation/references/traceability-and-status-rules.md"
213
248
  },
214
249
  {
215
250
  "adapter": "codex",
216
251
  "category": "skill",
217
- "sha256": "0aacce954ed495a8482d01d28fdcf863757262eae9998234dd4849aa728c3fca",
252
+ "sha256": "7b66c1f77130d14e44bea6f6f09e0de53fe4ae251ad888e78195dab48246301d",
218
253
  "source": "skills/cabloy-spec-generation/SKILL.md",
219
254
  "target": ".agents/skills/cabloy-spec-generation/SKILL.md"
220
255
  },
@@ -319,7 +354,7 @@
319
354
  {
320
355
  "adapter": "claude",
321
356
  "category": "skill",
322
- "sha256": "5ac94eb98e3c89abef06b5164298f953ea16759fc24e8d57d18f5d6c40c4168f",
357
+ "sha256": "88e6ca8c60d8caeb68ab932f2a7e22810a31911400b4428fd0756d076dbc78e8",
323
358
  "source": "skills/cabloy-backend-scaffold/references/follow-up-checklist.md",
324
359
  "target": ".claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md"
325
360
  },
@@ -368,7 +403,7 @@
368
403
  {
369
404
  "adapter": "claude",
370
405
  "category": "skill",
371
- "sha256": "0cc583277837d9e7ec8b54df86eeb43a42efef3b0ac08405c91a6f6345b6b377",
406
+ "sha256": "aceca7a587634f574301cafad267b9a2d620db1c5a5c1dd8cec9483870fc0400",
372
407
  "source": "skills/cabloy-domain-planning/SKILL.md",
373
408
  "target": ".claude/skills/cabloy-domain-planning/SKILL.md"
374
409
  },
@@ -459,63 +494,98 @@
459
494
  {
460
495
  "adapter": "claude",
461
496
  "category": "skill",
462
- "sha256": "00b614b97e4cfca37ecb5245e9a58ddd69e744e67b3cae32145499bec01f1812",
497
+ "sha256": "1d5a93d8285e85778e281c1a82d141f44d6f74112a295fc1d8ad977e2af2b3c3",
463
498
  "source": "skills/cabloy-spec-execution/evals/evals.json",
464
499
  "target": ".claude/skills/cabloy-spec-execution/evals/evals.json"
465
500
  },
466
501
  {
467
502
  "adapter": "claude",
468
503
  "category": "skill",
469
- "sha256": "ec7d25e9de7f4ecc12e1937e7692dab880892958155d914e086133708878fdd0",
504
+ "sha256": "187c45fea775846326bcdea17b20a465850e563cd98a9c189725ca5aac5fdee5",
505
+ "source": "skills/cabloy-spec-execution/evals/files/scenarios.json",
506
+ "target": ".claude/skills/cabloy-spec-execution/evals/files/scenarios.json"
507
+ },
508
+ {
509
+ "adapter": "claude",
510
+ "category": "skill",
511
+ "sha256": "4272ada10c6802a70c3fd926aab858724a65e975a716775ac716d6f0ba85c25a",
512
+ "source": "skills/cabloy-spec-execution/evals/protocol.md",
513
+ "target": ".claude/skills/cabloy-spec-execution/evals/protocol.md"
514
+ },
515
+ {
516
+ "adapter": "claude",
517
+ "category": "skill",
518
+ "sha256": "788f9c94a93753f2ad16d0a1f772fe61785514ab69e2564a2a2454f4efb46086",
470
519
  "source": "skills/cabloy-spec-execution/references/execution-protocol.md",
471
520
  "target": ".claude/skills/cabloy-spec-execution/references/execution-protocol.md"
472
521
  },
473
522
  {
474
523
  "adapter": "claude",
475
524
  "category": "skill",
476
- "sha256": "f8c69f36ac2ea5fc4800ca70fdc5a3d8362e944ca54cd9d657ded6465695e160",
525
+ "sha256": "ec93b6999fcf87f35f8f1f18eed54bb08ee2753862b34f6c474480f2c88ee7e0",
477
526
  "source": "skills/cabloy-spec-execution/references/status-and-evidence.md",
478
527
  "target": ".claude/skills/cabloy-spec-execution/references/status-and-evidence.md"
479
528
  },
480
529
  {
481
530
  "adapter": "claude",
482
531
  "category": "skill",
483
- "sha256": "150c826e78616763d73f8e81f2e3d85c0e05eedb649ac2a069359c6ce074d507",
532
+ "sha256": "52a1a0ae16f72345a761d657130fd65b681535c20937a86d1d6f279772c9bb31",
484
533
  "source": "skills/cabloy-spec-execution/SKILL.md",
485
534
  "target": ".claude/skills/cabloy-spec-execution/SKILL.md"
486
535
  },
487
536
  {
488
537
  "adapter": "claude",
489
538
  "category": "skill",
490
- "sha256": "8ce8a4bc07ef33a40f8b745e34966202be27e6682c995c3fa0c351e1d85af904",
539
+ "sha256": "4ef681f7bb98e605514e770bfa129d171f915e8562025d6195de0f8dfecaa80a",
491
540
  "source": "skills/cabloy-spec-generation/evals/evals.json",
492
541
  "target": ".claude/skills/cabloy-spec-generation/evals/evals.json"
493
542
  },
494
543
  {
495
544
  "adapter": "claude",
496
545
  "category": "skill",
497
- "sha256": "988b4aee132dd64156e7b237653f7ba37f0f088b75f669219c3931b35336ec04",
546
+ "sha256": "c5a1923be3cf387d3d31535af816e8ecadd52762ebb847a1be0d7cd1fe7c3d61",
547
+ "source": "skills/cabloy-spec-generation/evals/files/scenarios.json",
548
+ "target": ".claude/skills/cabloy-spec-generation/evals/files/scenarios.json"
549
+ },
550
+ {
551
+ "adapter": "claude",
552
+ "category": "skill",
553
+ "sha256": "4fa0405277092948d79cbde3d5b9b0f2e258dac58bf7e462dffea56da5fdd45f",
554
+ "source": "skills/cabloy-spec-generation/evals/protocol.md",
555
+ "target": ".claude/skills/cabloy-spec-generation/evals/protocol.md"
556
+ },
557
+ {
558
+ "adapter": "claude",
559
+ "category": "skill",
560
+ "sha256": "85b5a174c20111d31e50071a826f555c1e9b810e52078305af2850f3593f3603",
561
+ "source": "skills/cabloy-spec-generation/references/canonical-spec-input.md",
562
+ "target": ".claude/skills/cabloy-spec-generation/references/canonical-spec-input.md"
563
+ },
564
+ {
565
+ "adapter": "claude",
566
+ "category": "skill",
567
+ "sha256": "0c482b23c42c893dae4a027a786117ff2ad4b5686e3fc29de0a117d7e4958a49",
498
568
  "source": "skills/cabloy-spec-generation/references/repo-aware-discovery.md",
499
569
  "target": ".claude/skills/cabloy-spec-generation/references/repo-aware-discovery.md"
500
570
  },
501
571
  {
502
572
  "adapter": "claude",
503
573
  "category": "skill",
504
- "sha256": "77c90b159387320059b82d83ccdab42d116f4ade2cb844aec2b0dad86d60fcd3",
574
+ "sha256": "772e83aea0d7a3ad3d5a91d4ecedd09f6cd24ae9eb146399f0834ded3f074185",
505
575
  "source": "skills/cabloy-spec-generation/references/repo-specs-document-set.md",
506
576
  "target": ".claude/skills/cabloy-spec-generation/references/repo-specs-document-set.md"
507
577
  },
508
578
  {
509
579
  "adapter": "claude",
510
580
  "category": "skill",
511
- "sha256": "168e58f7acf2a3085a79e745862acb4972c703271563df9769bb23fff2a48d93",
581
+ "sha256": "242d3b7dd6f9266fa836918443c06add6bf9d2308d7f4288112412ee3a6224f5",
512
582
  "source": "skills/cabloy-spec-generation/references/traceability-and-status-rules.md",
513
583
  "target": ".claude/skills/cabloy-spec-generation/references/traceability-and-status-rules.md"
514
584
  },
515
585
  {
516
586
  "adapter": "claude",
517
587
  "category": "skill",
518
- "sha256": "0aacce954ed495a8482d01d28fdcf863757262eae9998234dd4849aa728c3fca",
588
+ "sha256": "7b66c1f77130d14e44bea6f6f09e0de53fe4ae251ad888e78195dab48246301d",
519
589
  "source": "skills/cabloy-spec-generation/SKILL.md",
520
590
  "target": ".claude/skills/cabloy-spec-generation/SKILL.md"
521
591
  },
@@ -592,7 +662,7 @@
592
662
  {
593
663
  "adapter": "codex",
594
664
  "category": "runtime",
595
- "sha256": "3f3fcc1824f18bcdc2040d65932a47cb74b477ad21670dae957de61540af0154",
665
+ "sha256": "7d7bc4472cd7fdfa2a34193117a771445b3b2ac6fddb553c64050f7ae9cf01cc",
596
666
  "source": "adapters/codex/contract-loop-gate.mjs",
597
667
  "target": ".codex/hooks/contract-loop-gate.mjs"
598
668
  },
@@ -606,7 +676,7 @@
606
676
  {
607
677
  "adapter": "cursor",
608
678
  "category": "runtime",
609
- "sha256": "da224fb581fde615273af8db4e2bfca513233a83e69a0803442dfec86bbd6ba6",
679
+ "sha256": "14ec4e6aaf57cd8cdc21b42b8ff865810d79a82f0927a4445b756e41c0e2438a",
610
680
  "source": "adapters/cursor/contract-loop-gate.mjs",
611
681
  "target": ".cursor/hooks/contract-loop-gate.mjs"
612
682
  },
@@ -634,7 +704,7 @@
634
704
  {
635
705
  "adapter": "cursor",
636
706
  "category": "skill",
637
- "sha256": "5ac94eb98e3c89abef06b5164298f953ea16759fc24e8d57d18f5d6c40c4168f",
707
+ "sha256": "88e6ca8c60d8caeb68ab932f2a7e22810a31911400b4428fd0756d076dbc78e8",
638
708
  "source": "skills/cabloy-backend-scaffold/references/follow-up-checklist.md",
639
709
  "target": ".cursor/skills/cabloy-backend-scaffold/references/follow-up-checklist.md"
640
710
  },
@@ -683,7 +753,7 @@
683
753
  {
684
754
  "adapter": "cursor",
685
755
  "category": "skill",
686
- "sha256": "0cc583277837d9e7ec8b54df86eeb43a42efef3b0ac08405c91a6f6345b6b377",
756
+ "sha256": "aceca7a587634f574301cafad267b9a2d620db1c5a5c1dd8cec9483870fc0400",
687
757
  "source": "skills/cabloy-domain-planning/SKILL.md",
688
758
  "target": ".cursor/skills/cabloy-domain-planning/SKILL.md"
689
759
  },
@@ -774,63 +844,98 @@
774
844
  {
775
845
  "adapter": "cursor",
776
846
  "category": "skill",
777
- "sha256": "00b614b97e4cfca37ecb5245e9a58ddd69e744e67b3cae32145499bec01f1812",
847
+ "sha256": "1d5a93d8285e85778e281c1a82d141f44d6f74112a295fc1d8ad977e2af2b3c3",
778
848
  "source": "skills/cabloy-spec-execution/evals/evals.json",
779
849
  "target": ".cursor/skills/cabloy-spec-execution/evals/evals.json"
780
850
  },
781
851
  {
782
852
  "adapter": "cursor",
783
853
  "category": "skill",
784
- "sha256": "ec7d25e9de7f4ecc12e1937e7692dab880892958155d914e086133708878fdd0",
854
+ "sha256": "187c45fea775846326bcdea17b20a465850e563cd98a9c189725ca5aac5fdee5",
855
+ "source": "skills/cabloy-spec-execution/evals/files/scenarios.json",
856
+ "target": ".cursor/skills/cabloy-spec-execution/evals/files/scenarios.json"
857
+ },
858
+ {
859
+ "adapter": "cursor",
860
+ "category": "skill",
861
+ "sha256": "4272ada10c6802a70c3fd926aab858724a65e975a716775ac716d6f0ba85c25a",
862
+ "source": "skills/cabloy-spec-execution/evals/protocol.md",
863
+ "target": ".cursor/skills/cabloy-spec-execution/evals/protocol.md"
864
+ },
865
+ {
866
+ "adapter": "cursor",
867
+ "category": "skill",
868
+ "sha256": "788f9c94a93753f2ad16d0a1f772fe61785514ab69e2564a2a2454f4efb46086",
785
869
  "source": "skills/cabloy-spec-execution/references/execution-protocol.md",
786
870
  "target": ".cursor/skills/cabloy-spec-execution/references/execution-protocol.md"
787
871
  },
788
872
  {
789
873
  "adapter": "cursor",
790
874
  "category": "skill",
791
- "sha256": "f8c69f36ac2ea5fc4800ca70fdc5a3d8362e944ca54cd9d657ded6465695e160",
875
+ "sha256": "ec93b6999fcf87f35f8f1f18eed54bb08ee2753862b34f6c474480f2c88ee7e0",
792
876
  "source": "skills/cabloy-spec-execution/references/status-and-evidence.md",
793
877
  "target": ".cursor/skills/cabloy-spec-execution/references/status-and-evidence.md"
794
878
  },
795
879
  {
796
880
  "adapter": "cursor",
797
881
  "category": "skill",
798
- "sha256": "150c826e78616763d73f8e81f2e3d85c0e05eedb649ac2a069359c6ce074d507",
882
+ "sha256": "52a1a0ae16f72345a761d657130fd65b681535c20937a86d1d6f279772c9bb31",
799
883
  "source": "skills/cabloy-spec-execution/SKILL.md",
800
884
  "target": ".cursor/skills/cabloy-spec-execution/SKILL.md"
801
885
  },
802
886
  {
803
887
  "adapter": "cursor",
804
888
  "category": "skill",
805
- "sha256": "8ce8a4bc07ef33a40f8b745e34966202be27e6682c995c3fa0c351e1d85af904",
889
+ "sha256": "4ef681f7bb98e605514e770bfa129d171f915e8562025d6195de0f8dfecaa80a",
806
890
  "source": "skills/cabloy-spec-generation/evals/evals.json",
807
891
  "target": ".cursor/skills/cabloy-spec-generation/evals/evals.json"
808
892
  },
809
893
  {
810
894
  "adapter": "cursor",
811
895
  "category": "skill",
812
- "sha256": "988b4aee132dd64156e7b237653f7ba37f0f088b75f669219c3931b35336ec04",
896
+ "sha256": "c5a1923be3cf387d3d31535af816e8ecadd52762ebb847a1be0d7cd1fe7c3d61",
897
+ "source": "skills/cabloy-spec-generation/evals/files/scenarios.json",
898
+ "target": ".cursor/skills/cabloy-spec-generation/evals/files/scenarios.json"
899
+ },
900
+ {
901
+ "adapter": "cursor",
902
+ "category": "skill",
903
+ "sha256": "4fa0405277092948d79cbde3d5b9b0f2e258dac58bf7e462dffea56da5fdd45f",
904
+ "source": "skills/cabloy-spec-generation/evals/protocol.md",
905
+ "target": ".cursor/skills/cabloy-spec-generation/evals/protocol.md"
906
+ },
907
+ {
908
+ "adapter": "cursor",
909
+ "category": "skill",
910
+ "sha256": "85b5a174c20111d31e50071a826f555c1e9b810e52078305af2850f3593f3603",
911
+ "source": "skills/cabloy-spec-generation/references/canonical-spec-input.md",
912
+ "target": ".cursor/skills/cabloy-spec-generation/references/canonical-spec-input.md"
913
+ },
914
+ {
915
+ "adapter": "cursor",
916
+ "category": "skill",
917
+ "sha256": "0c482b23c42c893dae4a027a786117ff2ad4b5686e3fc29de0a117d7e4958a49",
813
918
  "source": "skills/cabloy-spec-generation/references/repo-aware-discovery.md",
814
919
  "target": ".cursor/skills/cabloy-spec-generation/references/repo-aware-discovery.md"
815
920
  },
816
921
  {
817
922
  "adapter": "cursor",
818
923
  "category": "skill",
819
- "sha256": "77c90b159387320059b82d83ccdab42d116f4ade2cb844aec2b0dad86d60fcd3",
924
+ "sha256": "772e83aea0d7a3ad3d5a91d4ecedd09f6cd24ae9eb146399f0834ded3f074185",
820
925
  "source": "skills/cabloy-spec-generation/references/repo-specs-document-set.md",
821
926
  "target": ".cursor/skills/cabloy-spec-generation/references/repo-specs-document-set.md"
822
927
  },
823
928
  {
824
929
  "adapter": "cursor",
825
930
  "category": "skill",
826
- "sha256": "168e58f7acf2a3085a79e745862acb4972c703271563df9769bb23fff2a48d93",
931
+ "sha256": "242d3b7dd6f9266fa836918443c06add6bf9d2308d7f4288112412ee3a6224f5",
827
932
  "source": "skills/cabloy-spec-generation/references/traceability-and-status-rules.md",
828
933
  "target": ".cursor/skills/cabloy-spec-generation/references/traceability-and-status-rules.md"
829
934
  },
830
935
  {
831
936
  "adapter": "cursor",
832
937
  "category": "skill",
833
- "sha256": "0aacce954ed495a8482d01d28fdcf863757262eae9998234dd4849aa728c3fca",
938
+ "sha256": "7b66c1f77130d14e44bea6f6f09e0de53fe4ae251ad888e78195dab48246301d",
834
939
  "source": "skills/cabloy-spec-generation/SKILL.md",
835
940
  "target": ".cursor/skills/cabloy-spec-generation/SKILL.md"
836
941
  },
@@ -17,6 +17,18 @@ const required = [
17
17
  'repo-agent-governance/scripts/governance.mjs',
18
18
  'repo-agent-governance/tools/contract-loop/core.mjs',
19
19
  'repo-agent-governance/tools/contract-loop/hook-runtime.mjs',
20
+ 'repo-agent-governance/tools/spec-audit/audit.mjs',
21
+ 'repo-agent-governance/tools/spec-charts/spec-parser.mjs',
22
+ 'repo-agent-governance/tools/spec-charts/generate-implementation-charts.mjs',
23
+ 'repo-agent-governance/skills/cabloy-spec-generation/SKILL.md',
24
+ 'repo-agent-governance/skills/cabloy-spec-generation/references/canonical-spec-input.md',
25
+ 'repo-agent-governance/skills/cabloy-spec-generation/evals/evals.json',
26
+ 'repo-agent-governance/skills/cabloy-spec-generation/evals/protocol.md',
27
+ 'repo-agent-governance/skills/cabloy-spec-generation/evals/files/scenarios.json',
28
+ 'repo-agent-governance/skills/cabloy-spec-execution/SKILL.md',
29
+ 'repo-agent-governance/skills/cabloy-spec-generation/references/repo-aware-discovery.md',
30
+ 'repo-agent-governance/skills/cabloy-spec-generation/references/repo-specs-document-set.md',
31
+ 'repo-agent-governance/skills/cabloy-spec-generation/references/traceability-and-status-rules.md',
20
32
  'repo-agent-governance/adapters/cursor/hooks.json',
21
33
  'repo-agent-governance/adapters/cursor/contract-loop-gate.mjs',
22
34
  'repo-agent-governance/adapters/codex/hooks.json',
@@ -42,6 +54,11 @@ for (const path of forbidden) {
42
54
  if (files.has(path))
43
55
  throw new Error(`npm package must not contain local governance state: ${path}`);
44
56
  }
57
+ for (const path of files) {
58
+ if (path.startsWith('repo-specs/') || path.startsWith('repo-docs-internal/')) {
59
+ throw new Error(`npm package must not contain project planning or internal records: ${path}`);
60
+ }
61
+ }
45
62
  // eslint-disable-next-line no-console
46
63
  console.log(
47
64
  `Governance package surface is valid (${required.length} canonical assets; ${managedAdapters.length} transition adapters excluded).`,
@@ -43,6 +43,7 @@ When the active edition and installed modules provide `@Passport.rbac(...)` and
43
43
  - migration/version changes
44
44
  - `meta.version`
45
45
  - field indexes; in shared-database multitenancy, preserve ordinary lookup indexes and enforce business uniqueness in tenant-aware business logic rather than with `table.unique(...)`
46
+ - when editing or generating `meta.index`, consolidate each table's specifications into one declaration instead of adding another same-table `$tableColumns` spread; check for leading-column name collisions, effective metadata, and physical index definitions using the [Field Indexes guide](../../../../repo-docs/backend/field-indexes.md)
46
47
  - relations
47
48
  - datasource choice
48
49
  - cache behavior
@@ -143,9 +143,11 @@ Use examples such as:
143
143
 
144
144
  When helpful, explain why the recommendation is better than obvious alternatives.
145
145
 
146
- ## Step 7: Require confirmation before scaffolding
146
+ ## Step 7: Confirm naming and preserve the caller's workflow
147
147
 
148
- Before suggesting any scaffold execution, explicitly confirm:
148
+ If invoked by `cabloy-spec-generation` because naming was unresolved, this is a **naming-only** detour. Return the validated identity, capability names, proposed ownership, edition, and remaining naming questions to generation. Do not run scaffold commands or treat naming confirmation as generation, ADR, or execution approval. Generation resumes its selected complete/incremental/lightweight mode and confirmation gate.
149
+
150
+ For a direct scaffolding request, before suggesting execution, explicitly confirm:
149
151
 
150
152
  - `providerId`
151
153
  - suite short name
@@ -160,7 +162,7 @@ Always leave a custom path available, for example:
160
162
 
161
163
  ## Step 8: Hand off to CLI-first scaffolding only after confirmation
162
164
 
163
- Once naming is confirmed, route to the real generators rather than hand-authoring structure.
165
+ For a naming-only detour, return to `cabloy-spec-generation` without source generation. Only a direct, explicitly confirmed scaffolding request routes to the real generators rather than hand-authoring structure. A completed spec baseline instead hands one bounded WBS candidate to `cabloy-spec-execution` for its own dossier approval.
164
166
 
165
167
  Typical commands are:
166
168