@yss123/cage-cli 0.1.0 → 0.2.0

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 (540) hide show
  1. package/README.md +23 -1
  2. package/dist/analyze.js +2 -0
  3. package/dist/analyze.js.map +1 -1
  4. package/dist/config.d.ts +2 -2
  5. package/dist/config.js +0 -1
  6. package/dist/config.js.map +1 -1
  7. package/dist/context.d.ts +72 -0
  8. package/dist/context.js +202 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/create-prompt.d.ts +5 -0
  11. package/dist/create-prompt.js +50 -0
  12. package/dist/create-prompt.js.map +1 -0
  13. package/dist/create.d.ts +18 -1
  14. package/dist/create.js +30 -13
  15. package/dist/create.js.map +1 -1
  16. package/dist/dev.js +12 -51
  17. package/dist/dev.js.map +1 -1
  18. package/dist/gen/contracts.js +34 -13
  19. package/dist/gen/contracts.js.map +1 -1
  20. package/dist/gen/index.js +43 -3
  21. package/dist/gen/index.js.map +1 -1
  22. package/dist/gen/zod-code.d.ts +1 -1
  23. package/dist/gen/zod-code.js +3 -1
  24. package/dist/gen/zod-code.js.map +1 -1
  25. package/dist/graph-command.d.ts +11 -0
  26. package/dist/graph-command.js +67 -0
  27. package/dist/graph-command.js.map +1 -0
  28. package/dist/graph-model.d.ts +21 -0
  29. package/dist/graph-model.js +101 -0
  30. package/dist/graph-model.js.map +1 -0
  31. package/dist/graph-presentation.d.ts +11 -0
  32. package/dist/graph-presentation.js +25 -0
  33. package/dist/graph-presentation.js.map +1 -0
  34. package/dist/graph-query.d.ts +171 -0
  35. package/dist/graph-query.js +242 -0
  36. package/dist/graph-query.js.map +1 -0
  37. package/dist/graph-relations.d.ts +14 -0
  38. package/dist/graph-relations.js +142 -0
  39. package/dist/graph-relations.js.map +1 -0
  40. package/dist/graph-search.d.ts +21 -0
  41. package/dist/graph-search.js +63 -0
  42. package/dist/graph-search.js.map +1 -0
  43. package/dist/graph-snapshot.d.ts +2 -4
  44. package/dist/graph-snapshot.js +2 -19
  45. package/dist/graph-snapshot.js.map +1 -1
  46. package/dist/graph.js +19 -1
  47. package/dist/graph.js.map +1 -1
  48. package/dist/impact.d.ts +6 -0
  49. package/dist/impact.js +28 -16
  50. package/dist/impact.js.map +1 -1
  51. package/dist/index.d.ts +5 -1
  52. package/dist/index.js +5 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/init.d.ts +6 -0
  55. package/dist/init.js +131 -0
  56. package/dist/init.js.map +1 -0
  57. package/dist/main.js +77 -32
  58. package/dist/main.js.map +1 -1
  59. package/dist/migrate.d.ts +3 -6
  60. package/dist/migrate.js +14 -53
  61. package/dist/migrate.js.map +1 -1
  62. package/dist/ontology.d.ts +3 -1
  63. package/dist/ontology.js +13 -3
  64. package/dist/ontology.js.map +1 -1
  65. package/dist/project-structure.d.ts +8 -0
  66. package/dist/project-structure.js +94 -0
  67. package/dist/project-structure.js.map +1 -0
  68. package/dist/static-check.js +1 -4
  69. package/dist/static-check.js.map +1 -1
  70. package/dist/sync.js +82 -10
  71. package/dist/sync.js.map +1 -1
  72. package/graph-ui/app.js +46 -8
  73. package/graph-ui/graph-model.js +100 -0
  74. package/graph-ui/graph-relations.js +141 -0
  75. package/graph-ui/graph-search.js +62 -0
  76. package/graph-ui/model.js +19 -77
  77. package/graph-ui/relations.js +2 -125
  78. package/graph-ui/structure.js +4 -1
  79. package/graph-ui/style.css +21 -0
  80. package/package.json +8 -8
  81. package/templates/app/.env.example +58 -14
  82. package/templates/app/AGENTS.md +95 -12
  83. package/templates/app/Dockerfile +2 -0
  84. package/templates/app/README.md +46 -16
  85. package/templates/app/_gitignore +8 -0
  86. package/templates/app/apps/api/package.json +2 -2
  87. package/templates/app/apps/web/src/app/app.tsx +18 -0
  88. package/templates/app/apps/web/src/app/workspace-layout.tsx +70 -0
  89. package/templates/app/apps/web/src/main.tsx +4 -543
  90. package/templates/app/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +20 -0
  91. package/templates/app/apps/web/src/modules/approval/index.ts +2 -0
  92. package/templates/app/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +54 -0
  93. package/templates/app/apps/web/src/modules/auth/index.ts +1 -0
  94. package/templates/app/apps/web/src/modules/auth/pages/login-page.tsx +59 -0
  95. package/templates/app/apps/web/src/modules/inventory/index.ts +1 -0
  96. package/templates/app/apps/web/src/modules/inventory/pages/inventory-page.tsx +74 -0
  97. package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.tsx +60 -0
  98. package/templates/app/apps/web/src/modules/purchase/index.ts +2 -0
  99. package/templates/app/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +210 -0
  100. package/templates/app/apps/web/src/shared/hooks/use-command.ts +29 -0
  101. package/templates/app/apps/web/src/shared/lib/error-message.ts +15 -0
  102. package/templates/app/apps/web/src/shared/ui/notice.tsx +13 -0
  103. package/templates/app/apps/web/src/shared/ui/page-heading.tsx +28 -0
  104. package/templates/app/apps/web/vite.config.ts +3 -0
  105. package/templates/app/cage.config.json +1 -1
  106. package/templates/app/docs/ai/README.md +77 -0
  107. package/templates/app/docs/ai/architecture.md +122 -0
  108. package/templates/app/docs/ai/ontology-context.md +117 -0
  109. package/templates/app/docs/ai/primitives.md +249 -0
  110. package/templates/app/docs/ai/project-structure.md +123 -0
  111. package/templates/app/docs/ai/purchase-example.md +97 -0
  112. package/templates/app/docs/ai/recipes.md +81 -0
  113. package/templates/app/docs/ai/relations.md +160 -0
  114. package/templates/app/docs/ai/transfers.md +92 -0
  115. package/templates/app/docs/ai/troubleshooting.md +60 -0
  116. package/templates/app/docs/ai/workflow.md +139 -0
  117. package/templates/app/docs/errors/CAGE-APPR-001.md +47 -0
  118. package/templates/app/docs/errors/CAGE-APPR-002.md +47 -0
  119. package/templates/app/docs/errors/CAGE-APPR-003.md +47 -0
  120. package/templates/app/docs/errors/CAGE-APPR-004.md +47 -0
  121. package/templates/app/docs/errors/CAGE-APPR-005.md +47 -0
  122. package/templates/app/docs/errors/CAGE-APPR-006.md +47 -0
  123. package/templates/app/docs/errors/CAGE-APPR-007.md +50 -0
  124. package/templates/app/docs/errors/CAGE-APPR-010.md +48 -0
  125. package/templates/app/docs/errors/CAGE-AUTH-001.md +47 -0
  126. package/templates/app/docs/errors/CAGE-BUDGET-001.md +47 -0
  127. package/templates/app/docs/errors/CAGE-BUDGET-002.md +47 -0
  128. package/templates/app/docs/errors/CAGE-BUDGET-003.md +47 -0
  129. package/templates/app/docs/errors/CAGE-CMD-002.md +47 -0
  130. package/templates/app/docs/errors/CAGE-CMD-003.md +47 -0
  131. package/templates/app/docs/errors/CAGE-CONN-001.md +47 -0
  132. package/templates/app/docs/errors/CAGE-CONN-002.md +47 -0
  133. package/templates/app/docs/errors/CAGE-CONN-003.md +47 -0
  134. package/templates/app/docs/errors/CAGE-CONN-004.md +47 -0
  135. package/templates/app/docs/errors/CAGE-CONN-005.md +47 -0
  136. package/templates/app/docs/errors/CAGE-CONN-006.md +47 -0
  137. package/templates/app/docs/errors/CAGE-CONN-007.md +47 -0
  138. package/templates/app/docs/errors/CAGE-CONN-008.md +47 -0
  139. package/templates/app/docs/errors/CAGE-CONN-009.md +47 -0
  140. package/templates/app/docs/errors/CAGE-CONN-010.md +47 -0
  141. package/templates/app/docs/errors/CAGE-CONN-011.md +47 -0
  142. package/templates/app/docs/errors/CAGE-CONN-012.md +47 -0
  143. package/templates/app/docs/errors/CAGE-CREATE-001.md +52 -0
  144. package/templates/app/docs/errors/CAGE-DECL-001.md +48 -0
  145. package/templates/app/docs/errors/CAGE-DECL-002.md +47 -0
  146. package/templates/app/docs/errors/CAGE-DECL-003.md +47 -0
  147. package/templates/app/docs/errors/CAGE-DECL-004.md +47 -0
  148. package/templates/app/docs/errors/CAGE-DEP-001.md +48 -0
  149. package/templates/app/docs/errors/CAGE-DEP-002.md +47 -0
  150. package/templates/app/docs/errors/CAGE-DEP-003.md +47 -0
  151. package/templates/app/docs/errors/CAGE-DEP-004.md +47 -0
  152. package/templates/app/docs/errors/CAGE-DEP-005.md +47 -0
  153. package/templates/app/docs/errors/CAGE-DLQ-001.md +48 -0
  154. package/templates/app/docs/errors/CAGE-ENV-001.md +52 -0
  155. package/templates/app/docs/errors/CAGE-EVENT-001.md +47 -0
  156. package/templates/app/docs/errors/CAGE-EVENT-002.md +50 -0
  157. package/templates/app/docs/errors/CAGE-FIELD-001.md +47 -0
  158. package/templates/app/docs/errors/CAGE-FIELD-002.md +47 -0
  159. package/templates/app/docs/errors/CAGE-FIELD-003.md +47 -0
  160. package/templates/app/docs/errors/CAGE-FIELD-004.md +47 -0
  161. package/templates/app/docs/errors/CAGE-GEN-001.md +48 -0
  162. package/templates/app/docs/errors/CAGE-GEN-002.md +47 -0
  163. package/templates/app/docs/errors/CAGE-GRANT-001.md +49 -0
  164. package/templates/app/docs/errors/CAGE-GRANT-002.md +48 -0
  165. package/templates/app/docs/errors/CAGE-GRANT-003.md +47 -0
  166. package/templates/app/docs/errors/CAGE-IMPACT-001.md +48 -0
  167. package/templates/app/docs/errors/CAGE-INIT-001.md +47 -0
  168. package/templates/app/docs/errors/CAGE-INIT-002.md +49 -0
  169. package/templates/app/docs/errors/CAGE-INIT-003.md +48 -0
  170. package/templates/app/docs/errors/CAGE-INIT-004.md +48 -0
  171. package/templates/app/docs/errors/CAGE-JOB-001.md +47 -0
  172. package/templates/app/docs/errors/CAGE-JOB-002.md +47 -0
  173. package/templates/app/docs/errors/CAGE-JOB-003.md +47 -0
  174. package/templates/app/docs/errors/CAGE-LINT-001.md +47 -0
  175. package/templates/app/docs/errors/CAGE-MIG-001.md +47 -0
  176. package/templates/app/docs/errors/CAGE-MIG-002.md +47 -0
  177. package/templates/app/docs/errors/CAGE-MIG-003.md +5 -0
  178. package/templates/app/docs/errors/CAGE-MIG-004.md +5 -0
  179. package/templates/app/docs/errors/CAGE-MIG-005.md +47 -0
  180. package/templates/app/docs/errors/CAGE-NAME-001.md +47 -0
  181. package/templates/app/docs/errors/CAGE-NAME-002.md +47 -0
  182. package/templates/app/docs/errors/CAGE-NAME-003.md +47 -0
  183. package/templates/app/docs/errors/CAGE-NAME-004.md +47 -0
  184. package/templates/app/docs/errors/CAGE-NAME-005.md +47 -0
  185. package/templates/app/docs/errors/CAGE-NAME-006.md +47 -0
  186. package/templates/app/docs/errors/CAGE-ORG-001.md +49 -0
  187. package/templates/app/docs/errors/CAGE-PAIR-002.md +50 -0
  188. package/templates/app/docs/errors/CAGE-QUERY-001.md +47 -0
  189. package/templates/app/docs/errors/CAGE-QUERY-002.md +47 -0
  190. package/templates/app/docs/errors/CAGE-QUERY-003.md +49 -0
  191. package/templates/app/docs/errors/CAGE-REACT-001.md +47 -0
  192. package/templates/app/docs/errors/CAGE-REACT-002.md +47 -0
  193. package/templates/app/docs/errors/CAGE-READS-001.md +47 -0
  194. package/templates/app/docs/errors/CAGE-REG-001.md +53 -0
  195. package/templates/app/docs/errors/CAGE-REG-002.md +48 -0
  196. package/templates/app/docs/errors/CAGE-REG-003.md +47 -0
  197. package/templates/app/docs/errors/CAGE-REL-001.md +64 -0
  198. package/templates/app/docs/errors/CAGE-ROUTE-001.md +47 -0
  199. package/templates/app/docs/errors/CAGE-SCOPE-001.md +47 -0
  200. package/templates/app/docs/errors/CAGE-SCOPE-002.md +47 -0
  201. package/templates/app/docs/errors/CAGE-SECRET-001.md +48 -0
  202. package/templates/app/docs/errors/CAGE-SECRET-002.md +47 -0
  203. package/templates/app/docs/errors/CAGE-SENS-001.md +48 -0
  204. package/templates/app/docs/errors/CAGE-SQL-001.md +47 -0
  205. package/templates/app/docs/errors/CAGE-SQL-002.md +47 -0
  206. package/templates/app/docs/errors/CAGE-STATE-001.md +49 -0
  207. package/templates/app/docs/errors/CAGE-STATE-002.md +47 -0
  208. package/templates/app/docs/errors/CAGE-STATE-003.md +47 -0
  209. package/templates/app/docs/errors/CAGE-STATE-004.md +47 -0
  210. package/templates/app/docs/errors/CAGE-STATE-005.md +48 -0
  211. package/templates/app/docs/errors/CAGE-STATE-010.md +48 -0
  212. package/templates/app/docs/errors/CAGE-STATE-011.md +48 -0
  213. package/templates/app/docs/errors/CAGE-STRUCT-001.md +51 -0
  214. package/templates/app/docs/errors/CAGE-STRUCT-002.md +51 -0
  215. package/templates/app/docs/errors/CAGE-SYNC-001.md +48 -0
  216. package/templates/app/docs/errors/CAGE-TEST-001.md +47 -0
  217. package/templates/app/docs/errors/CAGE-UNSAFE-001.md +48 -0
  218. package/templates/app/docs/errors/CAGE-UPGRADE-001.md +48 -0
  219. package/templates/app/docs/errors/README.md +307 -0
  220. package/templates/app/docs/errors/runtime.md +50 -0
  221. package/templates/app/package.json +4 -7
  222. package/templates/app/packages/contracts/package.json +1 -1
  223. package/templates/app/packages/contracts/src/{dept.ts → aggregates/dept/index.ts} +3 -3
  224. package/templates/app/packages/contracts/src/{inventory.ts → aggregates/inventory/index.ts} +3 -3
  225. package/templates/app/packages/contracts/src/{inventory-lock.ts → aggregates/inventory-lock/index.ts} +3 -3
  226. package/templates/app/packages/contracts/src/{purchase-order.ts → aggregates/purchase-order/index.ts} +3 -3
  227. package/templates/app/packages/contracts/src/{role.ts → aggregates/role/index.ts} +3 -3
  228. package/templates/app/packages/contracts/src/{user.ts → aggregates/user/index.ts} +3 -3
  229. package/templates/app/packages/contracts/src/index.ts +14 -14
  230. package/templates/app/packages/domain/package.json +4 -4
  231. package/templates/app/packages/domain/src/index.ts +4 -7
  232. package/templates/app/packages/domain/src/{erp.ts → integrations/erp.ts} +1 -1
  233. package/templates/app/packages/domain/src/modules/inventory/index.ts +2 -0
  234. package/templates/app/packages/domain/src/modules/purchase/index.ts +6 -0
  235. package/templates/app/packages/domain/src/{purchase-order.test.ts → modules/purchase/purchase-order.test.ts} +2 -2
  236. package/templates/app/packages/domain/src/{purchase-order.ts → modules/purchase/purchase-order.ts} +1 -1
  237. package/templates/app/packages/domain/src/{reactions.ts → workflows/purchase-inventory.ts} +2 -2
  238. package/templates/blank/.dockerignore +10 -0
  239. package/templates/blank/.env.example +61 -0
  240. package/templates/blank/.github/workflows/cage.yml +44 -0
  241. package/templates/blank/AGENTS.md +96 -0
  242. package/templates/blank/Dockerfile +25 -0
  243. package/templates/blank/README.md +37 -0
  244. package/templates/blank/_gitignore +8 -0
  245. package/templates/blank/apps/api/package.json +15 -0
  246. package/templates/blank/apps/api/src/main.ts +11 -0
  247. package/templates/blank/apps/api/src/worker.ts +8 -0
  248. package/templates/blank/apps/api/tsconfig.json +5 -0
  249. package/templates/blank/apps/web/index.html +13 -0
  250. package/templates/blank/apps/web/package.json +22 -0
  251. package/templates/blank/apps/web/src/app/app.tsx +44 -0
  252. package/templates/blank/apps/web/src/app/styles/global.css +516 -0
  253. package/templates/blank/apps/web/src/app/workspace-layout.tsx +70 -0
  254. package/templates/blank/apps/web/src/main.tsx +13 -0
  255. package/templates/blank/apps/web/src/modules/auth/index.ts +1 -0
  256. package/templates/blank/apps/web/src/modules/auth/pages/login-page.tsx +87 -0
  257. package/templates/blank/apps/web/src/modules/workspace/index.ts +1 -0
  258. package/templates/blank/apps/web/src/modules/workspace/pages/home-page.tsx +45 -0
  259. package/templates/blank/apps/web/src/shared/lib/error-message.ts +11 -0
  260. package/templates/blank/apps/web/src/shared/ui/brand.tsx +11 -0
  261. package/templates/blank/apps/web/tsconfig.json +11 -0
  262. package/templates/blank/apps/web/vite.config.ts +19 -0
  263. package/templates/blank/cage.config.json +14 -0
  264. package/templates/blank/db/migrations/0001_init.sql +63 -0
  265. package/templates/blank/docs/ai/README.md +77 -0
  266. package/templates/blank/docs/ai/architecture.md +122 -0
  267. package/templates/blank/docs/ai/ontology-context.md +117 -0
  268. package/templates/blank/docs/ai/primitives.md +249 -0
  269. package/templates/blank/docs/ai/project-structure.md +123 -0
  270. package/templates/blank/docs/ai/purchase-example.md +97 -0
  271. package/templates/blank/docs/ai/recipes.md +81 -0
  272. package/templates/blank/docs/ai/relations.md +160 -0
  273. package/templates/blank/docs/ai/transfers.md +92 -0
  274. package/templates/blank/docs/ai/troubleshooting.md +60 -0
  275. package/templates/blank/docs/ai/workflow.md +139 -0
  276. package/templates/blank/docs/errors/CAGE-APPR-001.md +47 -0
  277. package/templates/blank/docs/errors/CAGE-APPR-002.md +47 -0
  278. package/templates/blank/docs/errors/CAGE-APPR-003.md +47 -0
  279. package/templates/blank/docs/errors/CAGE-APPR-004.md +47 -0
  280. package/templates/blank/docs/errors/CAGE-APPR-005.md +47 -0
  281. package/templates/blank/docs/errors/CAGE-APPR-006.md +47 -0
  282. package/templates/blank/docs/errors/CAGE-APPR-007.md +50 -0
  283. package/templates/blank/docs/errors/CAGE-APPR-010.md +48 -0
  284. package/templates/blank/docs/errors/CAGE-AUTH-001.md +47 -0
  285. package/templates/blank/docs/errors/CAGE-BUDGET-001.md +47 -0
  286. package/templates/blank/docs/errors/CAGE-BUDGET-002.md +47 -0
  287. package/templates/blank/docs/errors/CAGE-BUDGET-003.md +47 -0
  288. package/templates/blank/docs/errors/CAGE-CMD-002.md +47 -0
  289. package/templates/blank/docs/errors/CAGE-CMD-003.md +47 -0
  290. package/templates/blank/docs/errors/CAGE-CONN-001.md +47 -0
  291. package/templates/blank/docs/errors/CAGE-CONN-002.md +47 -0
  292. package/templates/blank/docs/errors/CAGE-CONN-003.md +47 -0
  293. package/templates/blank/docs/errors/CAGE-CONN-004.md +47 -0
  294. package/templates/blank/docs/errors/CAGE-CONN-005.md +47 -0
  295. package/templates/blank/docs/errors/CAGE-CONN-006.md +47 -0
  296. package/templates/blank/docs/errors/CAGE-CONN-007.md +47 -0
  297. package/templates/blank/docs/errors/CAGE-CONN-008.md +47 -0
  298. package/templates/blank/docs/errors/CAGE-CONN-009.md +47 -0
  299. package/templates/blank/docs/errors/CAGE-CONN-010.md +47 -0
  300. package/templates/blank/docs/errors/CAGE-CONN-011.md +47 -0
  301. package/templates/blank/docs/errors/CAGE-CONN-012.md +47 -0
  302. package/templates/blank/docs/errors/CAGE-CREATE-001.md +52 -0
  303. package/templates/blank/docs/errors/CAGE-DECL-001.md +48 -0
  304. package/templates/blank/docs/errors/CAGE-DECL-002.md +47 -0
  305. package/templates/blank/docs/errors/CAGE-DECL-003.md +47 -0
  306. package/templates/blank/docs/errors/CAGE-DECL-004.md +47 -0
  307. package/templates/blank/docs/errors/CAGE-DEP-001.md +48 -0
  308. package/templates/blank/docs/errors/CAGE-DEP-002.md +47 -0
  309. package/templates/blank/docs/errors/CAGE-DEP-003.md +47 -0
  310. package/templates/blank/docs/errors/CAGE-DEP-004.md +47 -0
  311. package/templates/blank/docs/errors/CAGE-DEP-005.md +47 -0
  312. package/templates/blank/docs/errors/CAGE-DLQ-001.md +48 -0
  313. package/templates/blank/docs/errors/CAGE-ENV-001.md +52 -0
  314. package/templates/blank/docs/errors/CAGE-EVENT-001.md +47 -0
  315. package/templates/blank/docs/errors/CAGE-EVENT-002.md +50 -0
  316. package/templates/blank/docs/errors/CAGE-FIELD-001.md +47 -0
  317. package/templates/blank/docs/errors/CAGE-FIELD-002.md +47 -0
  318. package/templates/blank/docs/errors/CAGE-FIELD-003.md +47 -0
  319. package/templates/blank/docs/errors/CAGE-FIELD-004.md +47 -0
  320. package/templates/blank/docs/errors/CAGE-GEN-001.md +48 -0
  321. package/templates/blank/docs/errors/CAGE-GEN-002.md +47 -0
  322. package/templates/blank/docs/errors/CAGE-GRANT-001.md +49 -0
  323. package/templates/blank/docs/errors/CAGE-GRANT-002.md +48 -0
  324. package/templates/blank/docs/errors/CAGE-GRANT-003.md +47 -0
  325. package/templates/blank/docs/errors/CAGE-IMPACT-001.md +48 -0
  326. package/templates/blank/docs/errors/CAGE-INIT-001.md +47 -0
  327. package/templates/blank/docs/errors/CAGE-INIT-002.md +49 -0
  328. package/templates/blank/docs/errors/CAGE-INIT-003.md +48 -0
  329. package/templates/blank/docs/errors/CAGE-INIT-004.md +48 -0
  330. package/templates/blank/docs/errors/CAGE-JOB-001.md +47 -0
  331. package/templates/blank/docs/errors/CAGE-JOB-002.md +47 -0
  332. package/templates/blank/docs/errors/CAGE-JOB-003.md +47 -0
  333. package/templates/blank/docs/errors/CAGE-LINT-001.md +47 -0
  334. package/templates/blank/docs/errors/CAGE-MIG-001.md +47 -0
  335. package/templates/blank/docs/errors/CAGE-MIG-002.md +47 -0
  336. package/templates/blank/docs/errors/CAGE-MIG-003.md +5 -0
  337. package/templates/blank/docs/errors/CAGE-MIG-004.md +5 -0
  338. package/templates/blank/docs/errors/CAGE-MIG-005.md +47 -0
  339. package/templates/blank/docs/errors/CAGE-NAME-001.md +47 -0
  340. package/templates/blank/docs/errors/CAGE-NAME-002.md +47 -0
  341. package/templates/blank/docs/errors/CAGE-NAME-003.md +47 -0
  342. package/templates/blank/docs/errors/CAGE-NAME-004.md +47 -0
  343. package/templates/blank/docs/errors/CAGE-NAME-005.md +47 -0
  344. package/templates/blank/docs/errors/CAGE-NAME-006.md +47 -0
  345. package/templates/blank/docs/errors/CAGE-ORG-001.md +49 -0
  346. package/templates/blank/docs/errors/CAGE-PAIR-002.md +50 -0
  347. package/templates/blank/docs/errors/CAGE-QUERY-001.md +47 -0
  348. package/templates/blank/docs/errors/CAGE-QUERY-002.md +47 -0
  349. package/templates/blank/docs/errors/CAGE-QUERY-003.md +49 -0
  350. package/templates/blank/docs/errors/CAGE-REACT-001.md +47 -0
  351. package/templates/blank/docs/errors/CAGE-REACT-002.md +47 -0
  352. package/templates/blank/docs/errors/CAGE-READS-001.md +47 -0
  353. package/templates/blank/docs/errors/CAGE-REG-001.md +53 -0
  354. package/templates/blank/docs/errors/CAGE-REG-002.md +48 -0
  355. package/templates/blank/docs/errors/CAGE-REG-003.md +47 -0
  356. package/templates/blank/docs/errors/CAGE-REL-001.md +64 -0
  357. package/templates/blank/docs/errors/CAGE-ROUTE-001.md +47 -0
  358. package/templates/blank/docs/errors/CAGE-SCOPE-001.md +47 -0
  359. package/templates/blank/docs/errors/CAGE-SCOPE-002.md +47 -0
  360. package/templates/blank/docs/errors/CAGE-SECRET-001.md +48 -0
  361. package/templates/blank/docs/errors/CAGE-SECRET-002.md +47 -0
  362. package/templates/blank/docs/errors/CAGE-SENS-001.md +48 -0
  363. package/templates/blank/docs/errors/CAGE-SQL-001.md +47 -0
  364. package/templates/blank/docs/errors/CAGE-SQL-002.md +47 -0
  365. package/templates/blank/docs/errors/CAGE-STATE-001.md +49 -0
  366. package/templates/blank/docs/errors/CAGE-STATE-002.md +47 -0
  367. package/templates/blank/docs/errors/CAGE-STATE-003.md +47 -0
  368. package/templates/blank/docs/errors/CAGE-STATE-004.md +47 -0
  369. package/templates/blank/docs/errors/CAGE-STATE-005.md +48 -0
  370. package/templates/blank/docs/errors/CAGE-STATE-010.md +48 -0
  371. package/templates/blank/docs/errors/CAGE-STATE-011.md +48 -0
  372. package/templates/blank/docs/errors/CAGE-STRUCT-001.md +51 -0
  373. package/templates/blank/docs/errors/CAGE-STRUCT-002.md +51 -0
  374. package/templates/blank/docs/errors/CAGE-SYNC-001.md +48 -0
  375. package/templates/blank/docs/errors/CAGE-TEST-001.md +47 -0
  376. package/templates/blank/docs/errors/CAGE-UNSAFE-001.md +48 -0
  377. package/templates/blank/docs/errors/CAGE-UPGRADE-001.md +48 -0
  378. package/templates/blank/docs/errors/README.md +307 -0
  379. package/templates/blank/docs/errors/runtime.md +50 -0
  380. package/templates/blank/docs/examples/purchase-admin/README.md +5 -0
  381. package/templates/blank/docs/examples/purchase-admin/apps/api/src/main.ts +10 -0
  382. package/templates/blank/docs/examples/purchase-admin/apps/api/src/worker.ts +14 -0
  383. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/app.tsx +18 -0
  384. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/styles/global.css +663 -0
  385. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/workspace-layout.tsx +70 -0
  386. package/templates/blank/docs/examples/purchase-admin/apps/web/src/main.tsx +13 -0
  387. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +20 -0
  388. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/index.ts +2 -0
  389. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +54 -0
  390. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/index.ts +1 -0
  391. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/pages/login-page.tsx +59 -0
  392. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/index.ts +1 -0
  393. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/pages/inventory-page.tsx +74 -0
  394. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.tsx +60 -0
  395. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/index.ts +2 -0
  396. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +210 -0
  397. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/hooks/use-command.ts +29 -0
  398. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/error-message.ts +15 -0
  399. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/notice.tsx +13 -0
  400. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-heading.tsx +28 -0
  401. package/templates/blank/docs/examples/purchase-admin/cage.config.json +114 -0
  402. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/dept/index.ts +74 -0
  403. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory/index.ts +57 -0
  404. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory-lock/index.ts +52 -0
  405. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/purchase-order/index.ts +72 -0
  406. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/role/index.ts +85 -0
  407. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/user/index.ts +89 -0
  408. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/index.ts +81 -0
  409. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/queries/index.ts +17 -0
  410. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/index.ts +6 -0
  411. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/erp.ts +36 -0
  412. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/index.ts +2 -0
  413. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/inventory.ts +43 -0
  414. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approvals.ts +18 -0
  415. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/index.ts +6 -0
  416. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/jobs.ts +13 -0
  417. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts +137 -0
  418. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.ts +122 -0
  419. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/queries.ts +10 -0
  420. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-inventory.ts +24 -0
  421. package/templates/blank/package.json +22 -0
  422. package/templates/blank/packages/contracts/package.json +16 -0
  423. package/templates/blank/packages/contracts/src/aggregates/dept/index.ts +74 -0
  424. package/templates/blank/packages/contracts/src/aggregates/role/index.ts +85 -0
  425. package/templates/blank/packages/contracts/src/aggregates/user/index.ts +89 -0
  426. package/templates/blank/packages/contracts/src/index.ts +55 -0
  427. package/templates/blank/packages/contracts/src/queries/index.ts +13 -0
  428. package/templates/blank/packages/contracts/tsconfig.json +5 -0
  429. package/templates/blank/packages/domain/package.json +23 -0
  430. package/templates/blank/packages/domain/src/index.ts +4 -0
  431. package/templates/blank/packages/domain/tsconfig.json +5 -0
  432. package/templates/blank/pnpm-workspace.yaml +10 -0
  433. package/templates/blank/renovate.json +5 -0
  434. package/templates/blank/tsconfig.base.json +8 -0
  435. package/dist/database.d.ts +0 -5
  436. package/dist/database.js +0 -70
  437. package/dist/database.js.map +0 -1
  438. package/managed/errors/CAGE-APPR-001.md +0 -32
  439. package/managed/errors/CAGE-APPR-002.md +0 -32
  440. package/managed/errors/CAGE-APPR-003.md +0 -32
  441. package/managed/errors/CAGE-APPR-004.md +0 -32
  442. package/managed/errors/CAGE-APPR-005.md +0 -32
  443. package/managed/errors/CAGE-APPR-006.md +0 -32
  444. package/managed/errors/CAGE-APPR-007.md +0 -32
  445. package/managed/errors/CAGE-APPR-010.md +0 -32
  446. package/managed/errors/CAGE-AUTH-001.md +0 -32
  447. package/managed/errors/CAGE-BUDGET-001.md +0 -32
  448. package/managed/errors/CAGE-BUDGET-002.md +0 -32
  449. package/managed/errors/CAGE-BUDGET-003.md +0 -32
  450. package/managed/errors/CAGE-CMD-002.md +0 -32
  451. package/managed/errors/CAGE-CMD-003.md +0 -34
  452. package/managed/errors/CAGE-CONN-001.md +0 -32
  453. package/managed/errors/CAGE-CONN-002.md +0 -32
  454. package/managed/errors/CAGE-CONN-003.md +0 -32
  455. package/managed/errors/CAGE-CONN-004.md +0 -32
  456. package/managed/errors/CAGE-CONN-005.md +0 -32
  457. package/managed/errors/CAGE-CONN-006.md +0 -32
  458. package/managed/errors/CAGE-CONN-007.md +0 -32
  459. package/managed/errors/CAGE-CONN-008.md +0 -32
  460. package/managed/errors/CAGE-CONN-009.md +0 -32
  461. package/managed/errors/CAGE-CONN-010.md +0 -32
  462. package/managed/errors/CAGE-CONN-011.md +0 -32
  463. package/managed/errors/CAGE-CONN-012.md +0 -32
  464. package/managed/errors/CAGE-CREATE-001.md +0 -32
  465. package/managed/errors/CAGE-DECL-001.md +0 -34
  466. package/managed/errors/CAGE-DECL-002.md +0 -34
  467. package/managed/errors/CAGE-DECL-003.md +0 -34
  468. package/managed/errors/CAGE-DECL-004.md +0 -34
  469. package/managed/errors/CAGE-DEP-001.md +0 -34
  470. package/managed/errors/CAGE-DEP-002.md +0 -34
  471. package/managed/errors/CAGE-DEP-003.md +0 -34
  472. package/managed/errors/CAGE-DEP-004.md +0 -34
  473. package/managed/errors/CAGE-DEP-005.md +0 -34
  474. package/managed/errors/CAGE-DLQ-001.md +0 -32
  475. package/managed/errors/CAGE-ENV-001.md +0 -32
  476. package/managed/errors/CAGE-EVENT-001.md +0 -32
  477. package/managed/errors/CAGE-EVENT-002.md +0 -32
  478. package/managed/errors/CAGE-FIELD-001.md +0 -32
  479. package/managed/errors/CAGE-FIELD-002.md +0 -32
  480. package/managed/errors/CAGE-FIELD-003.md +0 -32
  481. package/managed/errors/CAGE-FIELD-004.md +0 -32
  482. package/managed/errors/CAGE-GEN-001.md +0 -33
  483. package/managed/errors/CAGE-GEN-002.md +0 -33
  484. package/managed/errors/CAGE-GRANT-001.md +0 -32
  485. package/managed/errors/CAGE-GRANT-002.md +0 -32
  486. package/managed/errors/CAGE-GRANT-003.md +0 -32
  487. package/managed/errors/CAGE-IMPACT-001.md +0 -32
  488. package/managed/errors/CAGE-JOB-001.md +0 -32
  489. package/managed/errors/CAGE-JOB-002.md +0 -32
  490. package/managed/errors/CAGE-JOB-003.md +0 -32
  491. package/managed/errors/CAGE-LINT-001.md +0 -32
  492. package/managed/errors/CAGE-MIG-001.md +0 -32
  493. package/managed/errors/CAGE-MIG-002.md +0 -32
  494. package/managed/errors/CAGE-MIG-003.md +0 -32
  495. package/managed/errors/CAGE-MIG-004.md +0 -32
  496. package/managed/errors/CAGE-MIG-005.md +0 -32
  497. package/managed/errors/CAGE-NAME-001.md +0 -32
  498. package/managed/errors/CAGE-NAME-002.md +0 -32
  499. package/managed/errors/CAGE-NAME-003.md +0 -32
  500. package/managed/errors/CAGE-NAME-004.md +0 -32
  501. package/managed/errors/CAGE-NAME-005.md +0 -32
  502. package/managed/errors/CAGE-NAME-006.md +0 -32
  503. package/managed/errors/CAGE-ORG-001.md +0 -32
  504. package/managed/errors/CAGE-PAIR-002.md +0 -33
  505. package/managed/errors/CAGE-QUERY-001.md +0 -32
  506. package/managed/errors/CAGE-QUERY-002.md +0 -32
  507. package/managed/errors/CAGE-QUERY-003.md +0 -32
  508. package/managed/errors/CAGE-REACT-001.md +0 -32
  509. package/managed/errors/CAGE-REACT-002.md +0 -32
  510. package/managed/errors/CAGE-READS-001.md +0 -32
  511. package/managed/errors/CAGE-REG-001.md +0 -32
  512. package/managed/errors/CAGE-REG-002.md +0 -32
  513. package/managed/errors/CAGE-REG-003.md +0 -32
  514. package/managed/errors/CAGE-ROUTE-001.md +0 -32
  515. package/managed/errors/CAGE-SCOPE-001.md +0 -32
  516. package/managed/errors/CAGE-SCOPE-002.md +0 -32
  517. package/managed/errors/CAGE-SECRET-001.md +0 -32
  518. package/managed/errors/CAGE-SECRET-002.md +0 -32
  519. package/managed/errors/CAGE-SENS-001.md +0 -32
  520. package/managed/errors/CAGE-SQL-001.md +0 -32
  521. package/managed/errors/CAGE-SQL-002.md +0 -32
  522. package/managed/errors/CAGE-STATE-001.md +0 -32
  523. package/managed/errors/CAGE-STATE-002.md +0 -32
  524. package/managed/errors/CAGE-STATE-003.md +0 -32
  525. package/managed/errors/CAGE-STATE-004.md +0 -32
  526. package/managed/errors/CAGE-STATE-005.md +0 -32
  527. package/managed/errors/CAGE-STATE-010.md +0 -32
  528. package/managed/errors/CAGE-STATE-011.md +0 -32
  529. package/managed/errors/CAGE-SYNC-001.md +0 -35
  530. package/managed/errors/CAGE-TEST-001.md +0 -33
  531. package/managed/errors/CAGE-UNSAFE-001.md +0 -32
  532. package/managed/errors/CAGE-UPGRADE-001.md +0 -32
  533. package/managed/errors/README.md +0 -99
  534. package/templates/app/compose.yaml +0 -39
  535. /package/templates/app/apps/web/src/{style.css → app/styles/global.css} +0 -0
  536. /package/templates/app/packages/contracts/src/{queries.ts → queries/index.ts} +0 -0
  537. /package/templates/app/packages/domain/src/{inventory.ts → modules/inventory/inventory.ts} +0 -0
  538. /package/templates/app/packages/domain/src/{approvals.ts → modules/purchase/approvals.ts} +0 -0
  539. /package/templates/app/packages/domain/src/{jobs.ts → modules/purchase/jobs.ts} +0 -0
  540. /package/templates/app/packages/domain/src/{queries.ts → modules/purchase/queries.ts} +0 -0
@@ -1,34 +0,0 @@
1
- # CAGE-DECL-004
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/cli/src/static-check.ts:239](../../packages/cli/src/static-check.ts)
8
-
9
- ```ts
10
- findings.push({
11
- code: 'CAGE-DECL-004',
12
- at: `${list[0].file}:${list[0].line}`,
13
- reason: `导出名 ${n} 在 ${list.map((s) => s.file).join('、')} 里重复,export * 会把它们都丢掉`,
14
- fix: '改成不重复的导出名;命令可以用 command(X, { name: "原名" }) 保持能力点不变',
15
- });
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 将声明放在模块顶层,用唯一的 export const 名称声明,并从 domain/index.ts 导出。
21
-
22
- ## 正例
23
-
24
- ```text
25
- export const Order = aggregate('Order', definition);
26
- // index.ts
27
- export * from './order.js';
28
- ```
29
-
30
- ## 反例
31
-
32
- ```text
33
- function build() { return aggregate('Order', definition); }
34
- ```
@@ -1,34 +0,0 @@
1
- # CAGE-DEP-001
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/cli/src/static-check.ts:144](../../packages/cli/src/static-check.ts)
8
-
9
- ```ts
10
- findings.push({
11
- code: 'CAGE-DEP-001',
12
- at: loc(node),
13
- reason: `声明文件导入了 IO 模块 ${spec}`,
14
- fix: '需要外部数据就声明 reads;需要通知外部系统就发事件,由连接器的出站映射处理',
15
- });
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 移除业务层的 IO 或越层依赖。读取放进 reads,外部调用放进 outbound,前端依赖 contracts。
21
-
22
- ## 正例
23
-
24
- ```text
25
- reads: { stock: Inventory }
26
- // handler 中
27
- await deps.stock.get(id);
28
- ```
29
-
30
- ## 反例
31
-
32
- ```text
33
- import pg from 'pg'; // domain 中禁止直接访问数据库
34
- ```
@@ -1,34 +0,0 @@
1
- # CAGE-DEP-002
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/lint/dependency-cruiser.cjs:17](../../packages/lint/dependency-cruiser.cjs)
8
-
9
- ```ts
10
- severity: 'error',
11
- comment: '[CAGE-DEP-002] 适配器必须通过命令网关写数据',
12
- from: { path: '^packages/adapters' },
13
- to: { path: 'node_modules/(pg|kysely)/' },
14
- },
15
- {
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 移除业务层的 IO 或越层依赖。读取放进 reads,外部调用放进 outbound,前端依赖 contracts。
21
-
22
- ## 正例
23
-
24
- ```text
25
- reads: { stock: Inventory }
26
- // handler 中
27
- await deps.stock.get(id);
28
- ```
29
-
30
- ## 反例
31
-
32
- ```text
33
- import pg from 'pg'; // domain 中禁止直接访问数据库
34
- ```
@@ -1,34 +0,0 @@
1
- # CAGE-DEP-003
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/lint/dependency-cruiser.cjs:24](../../packages/lint/dependency-cruiser.cjs)
8
-
9
- ```ts
10
- severity: 'error',
11
- comment: '[CAGE-DEP-003] 前端只能依赖 @app/contracts',
12
- from: { path: '^apps/web' },
13
- to: { path: '^packages/domain|node_modules/@yss123/cage-(kernel|http|admin|connectors|approval|testkit)/' },
14
- },
15
- {
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 移除业务层的 IO 或越层依赖。读取放进 reads,外部调用放进 outbound,前端依赖 contracts。
21
-
22
- ## 正例
23
-
24
- ```text
25
- reads: { stock: Inventory }
26
- // handler 中
27
- await deps.stock.get(id);
28
- ```
29
-
30
- ## 反例
31
-
32
- ```text
33
- import pg from 'pg'; // domain 中禁止直接访问数据库
34
- ```
@@ -1,34 +0,0 @@
1
- # CAGE-DEP-004
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/cli/src/static-check.ts:155](../../packages/cli/src/static-check.ts)
8
-
9
- ```ts
10
- findings.push({
11
- code: 'CAGE-DEP-004',
12
- at: loc(node),
13
- reason: name === 'fetch' ? 'handler 里直接发网络请求' : '声明文件里使用了动态 import',
14
- fix: '第三方调用改为连接器声明 + outbound 出站映射',
15
- });
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 移除业务层的 IO 或越层依赖。读取放进 reads,外部调用放进 outbound,前端依赖 contracts。
21
-
22
- ## 正例
23
-
24
- ```text
25
- reads: { stock: Inventory }
26
- // handler 中
27
- await deps.stock.get(id);
28
- ```
29
-
30
- ## 反例
31
-
32
- ```text
33
- import pg from 'pg'; // domain 中禁止直接访问数据库
34
- ```
@@ -1,34 +0,0 @@
1
- # CAGE-DEP-005
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/lint/dependency-cruiser.cjs:31](../../packages/lint/dependency-cruiser.cjs)
8
-
9
- ```ts
10
- severity: 'error',
11
- comment: '[CAGE-DEP-005] domain 不能依赖生成物',
12
- from: { path: '^packages/domain' },
13
- to: { path: '^(generated|packages/contracts)/' },
14
- },
15
- ],
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 移除业务层的 IO 或越层依赖。读取放进 reads,外部调用放进 outbound,前端依赖 contracts。
21
-
22
- ## 正例
23
-
24
- ```text
25
- reads: { stock: Inventory }
26
- // handler 中
27
- await deps.stock.get(id);
28
- ```
29
-
30
- ## 反例
31
-
32
- ```text
33
- import pg from 'pg'; // domain 中禁止直接访问数据库
34
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-DLQ-001
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/kernel/src/worker/outbox.ts:128](../../packages/kernel/src/worker/outbox.ts)
8
-
9
- ```ts
10
- const d = await tx.selectFrom('sys.dead_letter').selectAll().where('id', '=', deadLetterId).where('handled_at', 'is', null).forUpdate().executeTakeFirst();
11
- if (!d) throw new Error('[CAGE-DLQ-001] 死信不存在或已处理');
12
- await tx.updateTable('sys.outbox').set({ status: 'pending', attempts: 0, next_at: sql`now()`, last_error: null }).where('id', '=', d.outbox_id).execute();
13
- await tx.updateTable('sys.dead_letter').set({ handled_by: handledBy, handled_at: sql`now()`, resolution: 'replayed' }).where('id', '=', deadLetterId).execute();
14
- await sql`select pg_notify('cage_outbox', '')`.execute(tx);
15
- });
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 检查死信详情和事件顺序,修复原因后用管理接口重放或丢弃,不直接改业务表。
21
-
22
- ## 正例
23
-
24
- ```text
25
- 在 /admin 的死信列表检查错误并重放
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- 直接更新 sys.outbox 绕过死信处理流程
32
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-ENV-001
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/cli/src/migrate.ts:51](../../packages/cli/src/migrate.ts)
8
-
9
- ```ts
10
- const urls = urlsFromEnv(env);
11
- if (!urls.migrate) throw new Error('[CAGE-ENV-001] 设置 CAGE_MIGRATE_DATABASE_URL');
12
- if (init) {
13
- if (!env.CAGE_SUPER_DATABASE_URL) throw new Error('[CAGE-ENV-001] 初始化需要 CAGE_SUPER_DATABASE_URL');
14
- const password = (url: string) => {
15
- const pw = decodeURIComponent(new URL(url).password);
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 在运行环境设置 app/read/migrate 三种连接串,检查连接账号与库名。不要把凭证写进源码。
21
-
22
- ## 正例
23
-
24
- ```text
25
- CAGE_APP_DATABASE_URL / CAGE_READ_DATABASE_URL / CAGE_MIGRATE_DATABASE_URL
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- // 未配置数据库连接就启动 API
32
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-EVENT-001
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/kernel/src/kernel.ts:365](../../packages/kernel/src/kernel.ts)
8
-
9
- ```ts
10
- if (!p.success) {
11
- throw new Error(`[CAGE-EVENT-001] 事件 ${ev.name} 的载荷不符合声明:${JSON.stringify(zodIssues(p.error))}`);
12
- }
13
- const payload = maskEventPayload(ev, p.data as Record<string, unknown>);
14
- const row = await tx
15
- .insertInto('sys.outbox')
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 保留旧事件字段及类型,新加字段设为 optional;不兼容含义使用新事件名。
21
-
22
- ## 正例
23
-
24
- ```text
25
- event("OrderChanged", { orderId: id(), note: text().optional() })
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- // 给已有事件新增必填 note,旧 outbox 消息无法提供它
32
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-EVENT-002
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/cli/src/rules.ts:225](../../packages/cli/src/rules.ts)
8
-
9
- ```ts
10
-
11
- /** CAGE-EVENT-002:事件载荷只允许向后兼容的变更(只能新增可选字段) */
12
- export function checkEventCompat(base: Ontology, head: Ontology): Finding[] {
13
- const findings: Finding[] = [];
14
- const b = new Map(base.nodes.filter((n) => n.kind === 'event').map((n) => [n.id, n]));
15
- for (const ev of head.nodes.filter((n) => n.kind === 'event')) {
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 保留旧事件字段及类型,新加字段设为 optional;不兼容含义使用新事件名。
21
-
22
- ## 正例
23
-
24
- ```text
25
- event("OrderChanged", { orderId: id(), note: text().optional() })
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- // 给已有事件新增必填 note,旧 outbox 消息无法提供它
32
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-FIELD-001
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/kernel/src/primitives/fields.ts:92](../../packages/kernel/src/primitives/fields.ts)
8
-
9
- ```ts
10
- sensitive(kind: SensitiveKind): Field<T, Opt> {
11
- if (!SENSITIVE_KINDS.includes(kind)) throw declError('CAGE-FIELD-001', `未知的敏感种类 ${kind}`);
12
- return this.with({ sensitiveKind: kind });
13
- }
14
- /** 唯一约束(租户内) */
15
- unique(): Field<T, Opt> {
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 使用 field 工厂声明字段,避免覆盖 id/status/version 等系统列,引用指向存在的聚合。
21
-
22
- ## 正例
23
-
24
- ```text
25
- fields: { deptId: ref('Dept'), amount: money() }
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- fields: { version: text() } // 系统版本号不能改作业务字段
32
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-FIELD-002
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/kernel/src/primitives/fields.ts:149](../../packages/kernel/src/primitives/fields.ts)
8
-
9
- ```ts
10
- const target = typeof to === 'string' ? to : to?.name;
11
- if (!target) throw declError('CAGE-FIELD-002', 'ref() 的目标为空,可能是循环导入;可改为 ref("聚合名")');
12
- return mk(z.string().uuid(), { kind: 'ref', sql: 'uuid', ref: target });
13
- }
14
-
15
- type ShapeZod<S extends Fields> = {
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 使用 field 工厂声明字段,避免覆盖 id/status/version 等系统列,引用指向存在的聚合。
21
-
22
- ## 正例
23
-
24
- ```text
25
- fields: { deptId: ref('Dept'), amount: money() }
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- fields: { version: text() } // 系统版本号不能改作业务字段
32
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-FIELD-003
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/kernel/src/primitives/aggregate.ts:83](../../packages/kernel/src/primitives/aggregate.ts)
8
-
9
- ```ts
10
- }
11
- if (!isField(v)) throw declError('CAGE-FIELD-003', `${name}.${k} 不是字段原语`);
12
- if ((RESERVED_FIELDS as readonly string[]).includes(k)) {
13
- throw declError('CAGE-FIELD-004', `${name}.${k} 是保留字段名,由内核维护`);
14
- }
15
- if (!/^[a-z][A-Za-z0-9]*$/.test(k)) throw declError('CAGE-NAME-002', `字段名 ${name}.${k} 必须是小驼峰`);
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 使用 field 工厂声明字段,避免覆盖 id/status/version 等系统列,引用指向存在的聚合。
21
-
22
- ## 正例
23
-
24
- ```text
25
- fields: { deptId: ref('Dept'), amount: money() }
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- fields: { version: text() } // 系统版本号不能改作业务字段
32
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-FIELD-004
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/kernel/src/primitives/aggregate.ts:85](../../packages/kernel/src/primitives/aggregate.ts)
8
-
9
- ```ts
10
- if ((RESERVED_FIELDS as readonly string[]).includes(k)) {
11
- throw declError('CAGE-FIELD-004', `${name}.${k} 是保留字段名,由内核维护`);
12
- }
13
- if (!/^[a-z][A-Za-z0-9]*$/.test(k)) throw declError('CAGE-NAME-002', `字段名 ${name}.${k} 必须是小驼峰`);
14
- fields[k] = v;
15
- }
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 使用 field 工厂声明字段,避免覆盖 id/status/version 等系统列,引用指向存在的聚合。
21
-
22
- ## 正例
23
-
24
- ```text
25
- fields: { deptId: ref('Dept'), amount: money() }
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- fields: { version: text() } // 系统版本号不能改作业务字段
32
- ```
@@ -1,33 +0,0 @@
1
- # CAGE-GEN-001
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/cli/src/gen/index.ts:48](../../packages/cli/src/gen/index.ts)
8
-
9
- ```ts
10
- findings: Finding[],
11
- code = 'CAGE-GEN-001',
12
- ) {
13
- const cur = existsSync(path) ? readFileSync(path, 'utf8') : null;
14
- if (cur === content) return;
15
- if (check) {
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 运行 cage gen,检查生成契约与迁移草稿后提交;不要手改生成文件。
21
-
22
- ## 正例
23
-
24
- ```text
25
- pnpm cage gen
26
- pnpm cage gen --check
27
- ```
28
-
29
- ## 反例
30
-
31
- ```text
32
- // 修改了 domain,但提交旧 contracts
33
- ```
@@ -1,33 +0,0 @@
1
- # CAGE-GEN-002
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/cli/src/gen/index.ts:122](../../packages/cli/src/gen/index.ts)
8
-
9
- ```ts
10
- findings.push({
11
- code: 'CAGE-GEN-002',
12
- at: cfg.migrations,
13
- reason: `声明的表结构与迁移不一致(${stmts.length} 处变化)`,
14
- fix: '运行 cage gen 生成迁移草稿,人审后提交',
15
- });
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 运行 cage gen,检查生成契约与迁移草稿后提交;不要手改生成文件。
21
-
22
- ## 正例
23
-
24
- ```text
25
- pnpm cage gen
26
- pnpm cage gen --check
27
- ```
28
-
29
- ## 反例
30
-
31
- ```text
32
- // 修改了 domain,但提交旧 contracts
33
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-GRANT-001
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/admin/src/domain/constraints.ts:21](../../packages/admin/src/domain/constraints.ts)
8
-
9
- ```ts
10
- const mine = ctx.capabilities.get(input.capability);
11
- if (!mine) return violation('[CAGE-GRANT-001] 不能授出自己没有的能力点');
12
- for (const [k, v] of Object.entries(input.params ?? {})) {
13
- if (typeof v === 'number' && typeof mine[k] === 'number' && v > (mine[k] as number)) {
14
- return violation(`[CAGE-GRANT-001] 参数 ${k}=${v} 超过了你自己的 ${mine[k]}`);
15
- }
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 先声明能力点,再由具有该能力和范围的管理员分配,不能通过界面发明能力。
21
-
22
- ## 正例
23
-
24
- ```text
25
- capability: 'PurchaseOrder.read'
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- capability: 'PurchaseOrder.nonexistent'
32
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-GRANT-002
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/admin/src/domain/constraints.ts:37](../../packages/admin/src/domain/constraints.ts)
8
-
9
- ```ts
10
- const want = COMBINATOR_WIDTH[input.combinator as Combinator] ?? 99;
11
- return want <= ownWidth(ctx, input.aggregate) ? ok() : violation('[CAGE-GRANT-002] 不能授出比自己更宽的数据范围');
12
- },
13
- });
14
-
15
- /** 分配角色也是授权:被分配角色里的每个能力点和范围,操作人自己都必须有 */
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 先声明能力点,再由具有该能力和范围的管理员分配,不能通过界面发明能力。
21
-
22
- ## 正例
23
-
24
- ```text
25
- capability: 'PurchaseOrder.read'
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- capability: 'PurchaseOrder.nonexistent'
32
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-GRANT-003
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/admin/src/domain/constraints.ts:13](../../packages/admin/src/domain/constraints.ts)
8
-
9
- ```ts
10
- check: (_role, _ctx, input, meta) =>
11
- meta.catalog().includes(input.capability) ? ok() : violation(`[CAGE-GRANT-003] 能力点 ${input.capability} 不在能力目录里`),
12
- });
13
-
14
- /** 防提权:不能授出自己没有的能力点;数值参数(额度)不能超过自己的 */
15
- export const noEscalation = (): Constraint => ({
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 先声明能力点,再由具有该能力和范围的管理员分配,不能通过界面发明能力。
21
-
22
- ## 正例
23
-
24
- ```text
25
- capability: 'PurchaseOrder.read'
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- capability: 'PurchaseOrder.nonexistent'
32
- ```
@@ -1,32 +0,0 @@
1
- # CAGE-IMPACT-001
2
-
3
- ## 什么时候出现
4
-
5
- 命中以下实现中的检查时触发。终端会附具体声明位置、原因和修复方法。
6
-
7
- 来源:[packages/cli/src/baseline.ts:45](../../packages/cli/src/baseline.ts)
8
-
9
- ```ts
10
- );
11
- if (code !== 0) throw new Error('[CAGE-IMPACT-001] 基线抽取失败,请修复基线声明或使用保存的 --base-file');
12
- return readOntology(join(project, '.cage/ontology.json'));
13
- } finally {
14
- // 先断开本次建立的 junction,避免清理工作树时遍历共享依赖目录。
15
- for (const link of links) unlinkSync(link);
16
- ```
17
-
18
- ## 怎么修
19
-
20
- 指定存在的 Git 提交,或保存过的完整 ontology.json。基线错误不能当作无变化。
21
-
22
- ## 正例
23
-
24
- ```text
25
- cage impact --base-file baseline.json
26
- ```
27
-
28
- ## 反例
29
-
30
- ```text
31
- cage impact // 没有指定基线
32
- ```