@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
@@ -0,0 +1,51 @@
1
+ # CAGE-STRUCT-001:业务源码目录不符合模块约定
2
+
3
+ [返回错误码册](README.md) · [业务排错](../ai/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:check / analyze / verify(structure: modular)。
10
+
11
+ 启用 structure: modular 后,domain/web 的 src 根目录出现业务文件,或使用约定之外的顶层源码目录。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. 前端使用 app / modules / shared,src 根目录只保留 main.tsx;领域使用 modules / workflows / integrations / shared,根目录只保留 index.ts。
16
+ 2. 把页面、表单、hooks 和业务辅助代码放在同一业务模块,需要时再拆文件;不要创建空目录凑层级。测试就近放置,类型声明 .d.ts 不受入口约束。
17
+ 3. 目录调整后修正导入并运行 cage check、gen、verify;完整规范见 docs/ai/project-structure.md。
18
+
19
+ ## 正例
20
+
21
+ ```text
22
+ apps/web/src/modules/expense/pages/expense-list-page.tsx
23
+ packages/domain/src/modules/expense/expense.ts
24
+ ```
25
+
26
+ ## 反例
27
+
28
+ ```text
29
+ apps/web/src/expense-list.tsx
30
+ packages/domain/src/expense.ts
31
+ ```
32
+
33
+ ## 修复后验证
34
+
35
+ 按 docs/ai/project-structure.md 整理归属和导入后重跑 cage check 与 verify;不关闭目录规则,也不改业务表或能力标识。
36
+
37
+ ## 框架内的检查位置
38
+
39
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
40
+
41
+ - `packages/cli/src/project-structure.ts:58`
42
+
43
+ 实现片段(位置随框架版本更新):
44
+
45
+ ```ts
46
+ findings.push({
47
+ code: 'CAGE-STRUCT-001',
48
+ at,
49
+ reason: `${kind} 源码没有放入约定模块:${from.path}`,
50
+ fix: `src 根目录只保留${kind === 'domain' ? '领域 index.ts' : '浏览器 main.tsx'};业务按归属放入 ${layers.join(' / ')},见 docs/ai/project-structure.md`,
51
+ ```
@@ -0,0 +1,51 @@
1
+ # CAGE-STRUCT-002:源码依赖越过模块边界
2
+
3
+ [返回错误码册](README.md) · [业务排错](../ai/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:check / analyze / verify(structure: modular)。
10
+
11
+ 共享代码反向依赖业务,前端业务互相穿透,领域模块依赖组合层,或跨模块导入了内部文件。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. app 组合前端模块;各模块只用自己的实现和 shared,通过 props/回调协作。shared 不放具体业务请求、文案和状态。
16
+ 2. 领域模块间确有 reads 等依赖时从目标 index.ts 导入;跨模块事件反应写到 workflows,外部协议写到 integrations。
17
+ 3. 不要用领域总入口反向导入模块内部。公开入口仅转导出,依赖必须保持单向,禁止通过路径别名或转导出绕开规则。
18
+
19
+ ## 正例
20
+
21
+ ```text
22
+ // 领域采购模块读取库存公开声明
23
+ import { Inventory } from '../inventory/index.js';
24
+ ```
25
+
26
+ ## 反例
27
+
28
+ ```text
29
+ // shared 反向依赖某项业务页面
30
+ import { ExpensePage } from '../../modules/expense/pages/expense-page';
31
+ ```
32
+
33
+ ## 修复后验证
34
+
35
+ 按 docs/ai/project-structure.md 整理归属和导入后重跑 cage check 与 verify;不关闭目录规则,也不改业务表或能力标识。
36
+
37
+ ## 框架内的检查位置
38
+
39
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
40
+
41
+ - `packages/cli/src/project-structure.ts:108`
42
+
43
+ 实现片段(位置随框架版本更新):
44
+
45
+ ```ts
46
+ findings.push({
47
+ code: 'CAGE-STRUCT-002',
48
+ at: `${at}:${source.slice(0, spec.pos).split('\n').length}`,
49
+ reason: `${reason}(${spec.fileName})`,
50
+ fix: '调整依赖归属;共用纯逻辑下沉到 shared,页面协作由 app 传参,领域交互通过模块公开声明。见 docs/ai/project-structure.md',
51
+ ```
@@ -0,0 +1,48 @@
1
+ # CAGE-SYNC-001:AGENTS 托管区过期或标记损坏
2
+
3
+ [返回错误码册](README.md) · [业务排错](../ai/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:sync / verify。
10
+
11
+ sync --check 发现框架规则需更新,或 begin/end 标记缺失一边、重复、顺序错误。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. 保留唯一且有序的 begin/end,项目业务约定移到标记外,再运行 pnpm exec cage sync。同步只替换托管区,不升级业务和文档。
16
+
17
+ ## 正例
18
+
19
+ ```text
20
+ 一个完整托管区,前后保留自己的业务规则
21
+ ```
22
+
23
+ ## 反例
24
+
25
+ ```text
26
+ 复制两段 begin/end,或只删除 end 标记
27
+ ```
28
+
29
+ ## 修复后验证
30
+
31
+ 运行 cage sync 后再 sync --check,确认标记外业务约定保持不变。
32
+
33
+ ## 框架内的检查位置
34
+
35
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
+
37
+ - `packages/cli/src/sync.ts:97`
38
+ - `packages/cli/src/sync.ts:110`
39
+
40
+ 实现片段(位置随框架版本更新):
41
+
42
+ ```ts
43
+ if (starts.length !== 1 || ends.length !== 1 || ends[0].index! < starts[0].index!) {
44
+ throw new Error('[CAGE-SYNC-001] 托管区标记不完整或重复,请修复 AGENTS.md 的 begin/end 标记');
45
+ }
46
+ return current.slice(0, starts[0].index) + latest + current.slice(ends[0].index! + ends[0][0].length);
47
+ }
48
+ ```
@@ -0,0 +1,47 @@
1
+ # CAGE-TEST-001:测试进程没有生成结果报告
2
+
3
+ [返回错误码册](README.md) · [业务排错](../ai/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:test / verify。
10
+
11
+ 测试未输出当前运行的 JSON 结果,CLI 无法认定测试通过。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. 查看 Vitest 的启动/配置错误并重跑,确认当前 .cage/test-results.json;不复用旧报告,不将 skipped 当作 passed。
16
+
17
+ ## 正例
18
+
19
+ ```text
20
+ 测试正常退出并生成当前结果,分别报告 passed/failed/skipped
21
+ ```
22
+
23
+ ## 反例
24
+
25
+ ```text
26
+ 测试没启动,却读取上次 success:true 当作本次成功
27
+ ```
28
+
29
+ ## 修复后验证
30
+
31
+ 确认当前运行退出码与 JSON 报告,分别报告通过、失败和跳过。
32
+
33
+ ## 框架内的检查位置
34
+
35
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
+
37
+ - `packages/cli/src/verify.ts:36`
38
+
39
+ 实现片段(位置随框架版本更新):
40
+
41
+ ```ts
42
+ if (code !== 0) return code;
43
+ if (!existsSync(report)) throw new Error('[CAGE-TEST-001] 测试进程未输出结果报告,不能判定通过');
44
+ const result = JSON.parse(readFileSync(report, 'utf8'));
45
+ if (result.numPendingTests) console.log(`覆盖提示:${result.numPendingTests} 个用例跳过,请结合业务测试验收。`);
46
+ return result.success ? 0 : 1;
47
+ ```
@@ -0,0 +1,48 @@
1
+ # CAGE-UNSAFE-001:逃生口缺少原因或负责人
2
+
3
+ [返回错误码册](README.md) · [业务排错](../ai/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:声明 / lint / budget。
10
+
11
+ unsafe 的 reason/owner 缺失或为空,运行时或 lint 拒绝。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. 先尝试正常声明;确需逃生口写清业务必要性、负责人和评审依据,并通过预算检查。它不会自动授予额外权限。
16
+
17
+ ## 正例
18
+
19
+ ```text
20
+ unsafe({ reason: '已评审的历史数据修复', owner: '数据负责人' }, action)
21
+ ```
22
+
23
+ ## 反例
24
+
25
+ ```text
26
+ unsafe({ reason: '', owner: '' }, action)
27
+ ```
28
+
29
+ ## 修复后验证
30
+
31
+ 运行相关 lint、budget 和真正业务用例,保留原因与负责人。
32
+
33
+ ## 框架内的检查位置
34
+
35
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
+
37
+ - `packages/kernel/src/primitives/flow.ts:219`
38
+ - `packages/lint/src/rules/unsafe-needs-reason.ts:8`
39
+
40
+ 实现片段(位置随框架版本更新):
41
+
42
+ ```ts
43
+ export function unsafe<T>(tag: UnsafeTag, fn: () => T): T {
44
+ if (!tag?.reason || !tag?.owner) throw declError('CAGE-UNSAFE-001', 'unsafe 必须写明 reason 和 owner');
45
+ return fn();
46
+ }
47
+ (unsafe as any)[UNSAFE] = true;
48
+ ```
@@ -0,0 +1,48 @@
1
+ # CAGE-UPGRADE-001:升级版本或 codemod 有歧义
2
+
3
+ [返回错误码册](README.md) · [业务排错](../ai/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:upgrade。
10
+
11
+ 当前 CLI 不含目标版本迁移,或 command 同时存在旧 caller 与新 invokedBy。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. 先安装目标版本 CLI;dry-run 审查迁移。新旧属性同时存在时人工确定语义并保留一种,不让工具猜测。
16
+
17
+ ## 正例
18
+
19
+ ```text
20
+ 安装目标 CLI → upgrade --dry-run → 审查后 upgrade
21
+ ```
22
+
23
+ ## 反例
24
+
25
+ ```text
26
+ command(A, { caller: 'user', invokedBy: 'process', ... })
27
+ ```
28
+
29
+ ## 修复后验证
30
+
31
+ 审查 dry-run 后升级,再按新版本运行 gen/verify,报告尚未完成的数据库/外部联调。
32
+
33
+ ## 框架内的检查位置
34
+
35
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
+
37
+ - `packages/cli/src/upgrade.ts:45`
38
+ - `packages/cli/src/upgrade.ts:58`
39
+
40
+ 实现片段(位置随框架版本更新):
41
+
42
+ ```ts
43
+ if (old && obj?.getProperty('invokedBy'))
44
+ throw new Error('[CAGE-UPGRADE-001] command 同时包含 caller 与 invokedBy,请手工消除歧义');
45
+ old?.rename('invokedBy');
46
+ }
47
+ return file.getFullText();
48
+ ```
@@ -0,0 +1,307 @@
1
+ # 错误码册
2
+
3
+ 这是本业务项目自带的离线诊断手册。先使用错误码、声明位置、reason/fix 定位;不需要克隆框架仓库。
4
+
5
+ - [HTTP 运行时错误与业务码](runtime.md):401/403/404、状态冲突、约束拒绝、DOMAIN_ERROR 等。
6
+ - [业务排错顺序](../ai/troubleshooting.md):启动、权限、审批人、worker、死信与导入导出。
7
+ - CAGE-* 是声明、工具链或内部运行诊断;HTTP code 与业务 domainCode 是另一层,不要混为一谈。
8
+
9
+ 每页包含触发阶段、具体原因、修复步骤、正反例、验证方法与当前版实现位置。例子为局部说明,不能替代完整业务输入。
10
+
11
+ ## 审批
12
+
13
+ | 诊断码 | 含义 |
14
+ | --- | --- |
15
+ | [CAGE-APPR-001](CAGE-APPR-001.md) | 可路由字段不存在 |
16
+ | [CAGE-APPR-002](CAGE-APPR-002.md) | 审批结论落到其他聚合 |
17
+ | [CAGE-APPR-003](CAGE-APPR-003.md) | 审批结论未允许流程调用 |
18
+ | [CAGE-APPR-004](CAGE-APPR-004.md) | 路由没有对应审批绑定 |
19
+ | [CAGE-APPR-005](CAGE-APPR-005.md) | 流程名称格式错误 |
20
+ | [CAGE-APPR-006](CAGE-APPR-006.md) | 流程没有步骤 |
21
+ | [CAGE-APPR-007](CAGE-APPR-007.md) | 找不到审批人 |
22
+ | [CAGE-APPR-010](CAGE-APPR-010.md) | 流程专用命令没有调用者 |
23
+
24
+ ## 登录认证
25
+
26
+ | 诊断码 | 含义 |
27
+ | --- | --- |
28
+ | [CAGE-AUTH-001](CAGE-AUTH-001.md) | OIDC 发现文档获取失败 |
29
+
30
+ ## 体积与逃生口预算
31
+
32
+ | 诊断码 | 含义 |
33
+ | --- | --- |
34
+ | [CAGE-BUDGET-001](CAGE-BUDGET-001.md) | 内核超出体积预算 |
35
+ | [CAGE-BUDGET-002](CAGE-BUDGET-002.md) | 公共原语超过词汇预算 |
36
+ | [CAGE-BUDGET-003](CAGE-BUDGET-003.md) | 新增未经基线认可的 unsafe |
37
+
38
+ ## 命令
39
+
40
+ | 诊断码 | 含义 |
41
+ | --- | --- |
42
+ | [CAGE-CMD-002](CAGE-CMD-002.md) | 已有记录命令缺少 id |
43
+ | [CAGE-CMD-003](CAGE-CMD-003.md) | 新建命令没有目标状态 |
44
+
45
+ ## 第三方连接器
46
+
47
+ | 诊断码 | 含义 |
48
+ | --- | --- |
49
+ | [CAGE-CONN-001](CAGE-CONN-001.md) | 连接器名称格式错误 |
50
+ | [CAGE-CONN-002](CAGE-CONN-002.md) | 外部操作路径格式错误 |
51
+ | [CAGE-CONN-003](CAGE-CONN-003.md) | 地址白名单包含协议或路径 |
52
+ | [CAGE-CONN-004](CAGE-CONN-004.md) | 只读操作被用作出站写映射 |
53
+ | [CAGE-CONN-005](CAGE-CONN-005.md) | 入站事件名称格式错误 |
54
+ | [CAGE-CONN-006](CAGE-CONN-006.md) | 回调命令未允许 external |
55
+ | [CAGE-CONN-007](CAGE-CONN-007.md) | 当前环境没有连接器地址 |
56
+ | [CAGE-CONN-008](CAGE-CONN-008.md) | 外部请求发生网络错误或超时 |
57
+ | [CAGE-CONN-009](CAGE-CONN-009.md) | 外部服务返回非成功状态 |
58
+ | [CAGE-CONN-010](CAGE-CONN-010.md) | 外部响应不符合 schema |
59
+ | [CAGE-CONN-011](CAGE-CONN-011.md) | 出站永久失败进入死信 |
60
+ | [CAGE-CONN-012](CAGE-CONN-012.md) | 外部专用命令没有声明调用者 |
61
+
62
+ ## 创建应用
63
+
64
+ | 诊断码 | 含义 |
65
+ | --- | --- |
66
+ | [CAGE-CREATE-001](CAGE-CREATE-001.md) | 项目创建参数或模板资源有误 |
67
+
68
+ ## 可抽取声明
69
+
70
+ | 诊断码 | 含义 |
71
+ | --- | --- |
72
+ | [CAGE-DECL-001](CAGE-DECL-001.md) | 声明不在可抽取的顶层常量 |
73
+ | [CAGE-DECL-002](CAGE-DECL-002.md) | 声明没有从 domain 入口导出 |
74
+ | [CAGE-DECL-003](CAGE-DECL-003.md) | 声明不是 export const |
75
+ | [CAGE-DECL-004](CAGE-DECL-004.md) | 跨文件导出名冲突 |
76
+
77
+ ## 依赖边界
78
+
79
+ | 诊断码 | 含义 |
80
+ | --- | --- |
81
+ | [CAGE-DEP-001](CAGE-DEP-001.md) | 领域声明直接依赖 IO |
82
+ | [CAGE-DEP-002](CAGE-DEP-002.md) | 适配器绕过命令写库 |
83
+ | [CAGE-DEP-003](CAGE-DEP-003.md) | 前端依赖服务端实现 |
84
+ | [CAGE-DEP-004](CAGE-DEP-004.md) | 声明或 handler 直接发请求/动态导入 |
85
+ | [CAGE-DEP-005](CAGE-DEP-005.md) | domain 反向依赖生成物 |
86
+
87
+ ## 工程目录与模块依赖
88
+
89
+ | 诊断码 | 含义 |
90
+ | --- | --- |
91
+ | [CAGE-STRUCT-001](CAGE-STRUCT-001.md) | 业务源码目录不符合模块约定 |
92
+ | [CAGE-STRUCT-002](CAGE-STRUCT-002.md) | 源码依赖越过模块边界 |
93
+
94
+ ## 死信操作
95
+
96
+ | 诊断码 | 含义 |
97
+ | --- | --- |
98
+ | [CAGE-DLQ-001](CAGE-DLQ-001.md) | 死信不存在或已经处理 |
99
+
100
+ ## 运行配置
101
+
102
+ | 诊断码 | 含义 |
103
+ | --- | --- |
104
+ | [CAGE-ENV-001](CAGE-ENV-001.md) | 缺少数据库连接配置 |
105
+
106
+ ## 事件载荷与兼容性
107
+
108
+ | 诊断码 | 含义 |
109
+ | --- | --- |
110
+ | [CAGE-EVENT-001](CAGE-EVENT-001.md) | 事件载荷不满足声明 |
111
+ | [CAGE-EVENT-002](CAGE-EVENT-002.md) | 事件变更不向后兼容 |
112
+
113
+ ## 字段
114
+
115
+ | 诊断码 | 含义 |
116
+ | --- | --- |
117
+ | [CAGE-FIELD-001](CAGE-FIELD-001.md) | 敏感字段种类不存在 |
118
+ | [CAGE-FIELD-002](CAGE-FIELD-002.md) | 引用目标为空 |
119
+ | [CAGE-FIELD-003](CAGE-FIELD-003.md) | 字段不是字段原语 |
120
+ | [CAGE-FIELD-004](CAGE-FIELD-004.md) | 覆盖系统保留列 |
121
+
122
+ ## 关系字段
123
+
124
+ | 诊断码 | 含义 |
125
+ | --- | --- |
126
+ | [CAGE-REL-001](CAGE-REL-001.md) | 关系字段声明无效 |
127
+
128
+ ## 生成一致性
129
+
130
+ | 诊断码 | 含义 |
131
+ | --- | --- |
132
+ | [CAGE-GEN-001](CAGE-GEN-001.md) | 契约等生成结果过期 |
133
+ | [CAGE-GEN-002](CAGE-GEN-002.md) | 声明结构没有对应迁移 |
134
+
135
+ ## 角色授权与防提权
136
+
137
+ | 诊断码 | 含义 |
138
+ | --- | --- |
139
+ | [CAGE-GRANT-001](CAGE-GRANT-001.md) | 授予超出自己的能力或额度 |
140
+ | [CAGE-GRANT-002](CAGE-GRANT-002.md) | 授予超出自己的数据范围 |
141
+ | [CAGE-GRANT-003](CAGE-GRANT-003.md) | 能力不在代码目录中 |
142
+
143
+ ## 影响分析
144
+
145
+ | 诊断码 | 含义 |
146
+ | --- | --- |
147
+ | [CAGE-IMPACT-001](CAGE-IMPACT-001.md) | 影响分析没有可用基线 |
148
+
149
+ ## 账号初始化
150
+
151
+ | 诊断码 | 含义 |
152
+ | --- | --- |
153
+ | [CAGE-INIT-001](CAGE-INIT-001.md) | 管理员 URL 没有数据库名 |
154
+ | [CAGE-INIT-002](CAGE-INIT-002.md) | 集群已有账号但缺少原凭证 |
155
+ | [CAGE-INIT-003](CAGE-INIT-003.md) | 三种连接身份或目标不一致 |
156
+ | [CAGE-INIT-004](CAGE-INIT-004.md) | 账号已创建但 .env 替换失败 |
157
+
158
+ ## 定时任务
159
+
160
+ | 诊断码 | 含义 |
161
+ | --- | --- |
162
+ | [CAGE-JOB-001](CAGE-JOB-001.md) | 定时表达式不合法 |
163
+ | [CAGE-JOB-002](CAGE-JOB-002.md) | 任务调用了未声明的命令 |
164
+ | [CAGE-JOB-003](CAGE-JOB-003.md) | 任务读取了未声明的聚合 |
165
+
166
+ ## 通用 lint
167
+
168
+ | 诊断码 | 含义 |
169
+ | --- | --- |
170
+ | [CAGE-LINT-001](CAGE-LINT-001.md) | lint 语法或规则错误 |
171
+
172
+ ## 结构迁移与安全层
173
+
174
+ | 诊断码 | 含义 |
175
+ | --- | --- |
176
+ | [CAGE-MIG-001](CAGE-MIG-001.md) | 迁移事务执行失败 |
177
+ | [CAGE-MIG-002](CAGE-MIG-002.md) | 安全层重建失败 |
178
+ | [CAGE-MIG-005](CAGE-MIG-005.md) | 已执行迁移内容被修改 |
179
+
180
+ ## 名称
181
+
182
+ | 诊断码 | 含义 |
183
+ | --- | --- |
184
+ | [CAGE-NAME-001](CAGE-NAME-001.md) | 聚合名必须大驼峰 |
185
+ | [CAGE-NAME-002](CAGE-NAME-002.md) | 字段名必须小驼峰 |
186
+ | [CAGE-NAME-003](CAGE-NAME-003.md) | 事件名必须大驼峰 |
187
+ | [CAGE-NAME-004](CAGE-NAME-004.md) | 命令名必须小驼峰 |
188
+ | [CAGE-NAME-005](CAGE-NAME-005.md) | 查询名必须小驼峰 |
189
+ | [CAGE-NAME-006](CAGE-NAME-006.md) | 任务名必须小驼峰 |
190
+
191
+ ## 组织模型
192
+
193
+ | 诊断码 | 含义 |
194
+ | --- | --- |
195
+ | [CAGE-ORG-001](CAGE-ORG-001.md) | 业务入口遗漏组织模型 |
196
+
197
+ ## 资源配对
198
+
199
+ | 诊断码 | 含义 |
200
+ | --- | --- |
201
+ | [CAGE-PAIR-002](CAGE-PAIR-002.md) | 离开持有资源状态却没有释放 |
202
+
203
+ ## 安全查询
204
+
205
+ | 诊断码 | 含义 |
206
+ | --- | --- |
207
+ | [CAGE-QUERY-001](CAGE-QUERY-001.md) | 查询必须选择一种实现 |
208
+ | [CAGE-QUERY-002](CAGE-QUERY-002.md) | 自定义查询直接访问基表 |
209
+ | [CAGE-QUERY-003](CAGE-QUERY-003.md) | 查询读取范围与声明不一致 |
210
+
211
+ ## 跨聚合反应
212
+
213
+ | 诊断码 | 含义 |
214
+ | --- | --- |
215
+ | [CAGE-REACT-001](CAGE-REACT-001.md) | 反应目标与命令聚合不一致 |
216
+ | [CAGE-REACT-002](CAGE-REACT-002.md) | 同事务反应链嵌套过深 |
217
+
218
+ ## 显式读依赖
219
+
220
+ | 诊断码 | 含义 |
221
+ | --- | --- |
222
+ | [CAGE-READS-001](CAGE-READS-001.md) | handler 使用了未声明读依赖 |
223
+
224
+ ## 运行时注册表
225
+
226
+ | 诊断码 | 含义 |
227
+ | --- | --- |
228
+ | [CAGE-REG-001](CAGE-REG-001.md) | 注册表缺少被引用声明 |
229
+ | [CAGE-REG-002](CAGE-REG-002.md) | 聚合或查询注册重名 |
230
+ | [CAGE-REG-003](CAGE-REG-003.md) | 命令能力点重复 |
231
+
232
+ ## 自动路由
233
+
234
+ | 诊断码 | 含义 |
235
+ | --- | --- |
236
+ | [CAGE-ROUTE-001](CAGE-ROUTE-001.md) | 业务项目手写 HTTP 路由 |
237
+
238
+ ## 数据范围
239
+
240
+ | 诊断码 | 含义 |
241
+ | --- | --- |
242
+ | [CAGE-SCOPE-001](CAGE-SCOPE-001.md) | 范围组合子未知 |
243
+ | [CAGE-SCOPE-002](CAGE-SCOPE-002.md) | 范围字段没有声明 |
244
+
245
+ ## 密钥边界
246
+
247
+ | 诊断码 | 含义 |
248
+ | --- | --- |
249
+ | [CAGE-SECRET-001](CAGE-SECRET-001.md) | 运行环境缺少密钥 |
250
+ | [CAGE-SECRET-002](CAGE-SECRET-002.md) | 源码疑似包含密钥字面量 |
251
+
252
+ ## 敏感字段
253
+
254
+ | 诊断码 | 含义 |
255
+ | --- | --- |
256
+ | [CAGE-SENS-001](CAGE-SENS-001.md) | 敏感字段未标注就进入事件 |
257
+
258
+ ## SQL 参数化
259
+
260
+ | 诊断码 | 含义 |
261
+ | --- | --- |
262
+ | [CAGE-SQL-001](CAGE-SQL-001.md) | SQL 拼接用户值 |
263
+ | [CAGE-SQL-002](CAGE-SQL-002.md) | sql.raw 接收动态表达式 |
264
+
265
+ ## 状态与可达性
266
+
267
+ | 诊断码 | 含义 |
268
+ | --- | --- |
269
+ | [CAGE-STATE-001](CAGE-STATE-001.md) | 引用了未声明状态 |
270
+ | [CAGE-STATE-002](CAGE-STATE-002.md) | 状态集合为空 |
271
+ | [CAGE-STATE-003](CAGE-STATE-003.md) | 状态名称格式错误 |
272
+ | [CAGE-STATE-004](CAGE-STATE-004.md) | 状态名称重复 |
273
+ | [CAGE-STATE-005](CAGE-STATE-005.md) | 状态声明位置冲突 |
274
+ | [CAGE-STATE-010](CAGE-STATE-010.md) | 状态不可达 |
275
+ | [CAGE-STATE-011](CAGE-STATE-011.md) | 非终态没有后续操作 |
276
+
277
+ ## AI 托管区
278
+
279
+ | 诊断码 | 含义 |
280
+ | --- | --- |
281
+ | [CAGE-SYNC-001](CAGE-SYNC-001.md) | AGENTS 托管区过期或标记损坏 |
282
+
283
+ ## 测试报告
284
+
285
+ | 诊断码 | 含义 |
286
+ | --- | --- |
287
+ | [CAGE-TEST-001](CAGE-TEST-001.md) | 测试进程没有生成结果报告 |
288
+
289
+ ## 逃生口
290
+
291
+ | 诊断码 | 含义 |
292
+ | --- | --- |
293
+ | [CAGE-UNSAFE-001](CAGE-UNSAFE-001.md) | 逃生口缺少原因或负责人 |
294
+
295
+ ## 升级
296
+
297
+ | 诊断码 | 含义 |
298
+ | --- | --- |
299
+ | [CAGE-UPGRADE-001](CAGE-UPGRADE-001.md) | 升级版本或 codemod 有歧义 |
300
+
301
+ ## 历史流程
302
+
303
+ [CAGE-MIG-003](CAGE-MIG-003.md)、[CAGE-MIG-004](CAGE-MIG-004.md) 属于旧版初始化流程,当前使用 init + migrate;保留页面供历史诊断。
304
+
305
+ 手册随创建项目时的 CLI 版本分发。cage sync 仅更新 AGENTS 托管区;升级后需要按该版本的资料核对差异。
306
+
307
+ 框架维护者:修改 scripts/error-catalog.ts 后运行 pnpm docs:errors;不要只手改生成的逐码页面。
@@ -0,0 +1,50 @@
1
+ # HTTP 运行时错误与业务码
2
+
3
+ [返回错误码册](README.md) · [排错方法](../ai/troubleshooting.md)
4
+
5
+ 框架诊断分三层:`CAGE-APPR-007` 等内部/工具码、HTTP 响应的通用 `code`、业务拒绝的 `domainCode`。同一次失败可以同时涉及几层;例如审批人配置问题出现在 worker 死信,前端提交此前可能已成功。
6
+
7
+ ## 接口错误
8
+
9
+ | code | HTTP | 含义 | 业务前端/AI 应怎么做 |
10
+ | --- | --- | --- | --- |
11
+ | UNAUTHENTICATED | 401 | 会话不存在/失效或认证未通过 | 重新登录;回调先核对验签,不跳过认证 |
12
+ | FORBIDDEN | 403 | 无能力、身份不允许,或 CSRF 拒绝等 | 看 detail 与当前授权;不能只因有按钮就认为有权。客户端会刷新过期 CSRF 令牌重试 |
13
+ | NOT_FOUND | 404 | 记录不存在或超出范围 | 用当前用户检查 id/租户/范围,不泄漏范围外数据 |
14
+ | INVALID_INPUT | 400 | Zod/协议输入错误、外键或检查约束等 | 按输入 schema 修正字段和格式,不直接扩大 schema |
15
+ | INVALID_TRANSITION | 409 | 当前状态不允许该命令 | 刷新记录,按真实生命周期显示允许操作 |
16
+ | CONSTRAINT_VIOLATED | 403 | 职责分离、额度、二次认证、防提权等拒绝 | 看约束原因,调整业务操作或由有权管理员配置;不删除约束 |
17
+ | INVARIANT_VIOLATED | 409 | 命令结果不满足聚合不变量 | 修正输入或 handler,保持合法结果 |
18
+ | CONFLICT | 409 | 版本、唯一性、数据库串行化/死锁等冲突 | 看 detail、重新读取再决定是否重试;不要盲目重复创建 |
19
+ | DOMAIN_ERROR | 422 | handler 返回 fail | 读取 domainCode,展示业务文案和必要 detail |
20
+ | RATE_LIMITED | 429 | 请求超过限流 | 按提示等待,避免页面无限重试 |
21
+ | INTERNAL | 500 | 未分类内部错误 | 用 requestId 查服务端日志,向用户显示通用失败;不返回堆栈/密钥 |
22
+ | NETWORK(仅客户端) | 0 | 请求未取得可用网络响应 | 检查连接与服务状态;保留同次操作幂等键,避免误认为服务端一定未执行 |
23
+
24
+ 网络失败和超时不证明服务端事务未提交。通用重试与人工重试都需考虑幂等与当前状态,不能先写 SQL 回滚业务再重发。
25
+
26
+ ## 业务码用法
27
+
28
+ 领域 handler 返回:
29
+
30
+ ```ts
31
+ return fail('STOCK_SHORT', ['A-01']);
32
+ ```
33
+
34
+ HTTP 响应形状为:
35
+
36
+ ```json
37
+ { "code": "DOMAIN_ERROR", "domainCode": "STOCK_SHORT", "detail": ["A-01"] }
38
+ ```
39
+
40
+ 客户端方法返回可区分结果,先判断 `result.ok`;失败时看 `result.code`,业务错误再看 `result.domainCode`。不要假设 code 直接等于 STOCK_SHORT,也不要把所有 403 当作“请重新登录”。
41
+
42
+ 业务码由项目定义并在页面翻译;字段 schema、不变量、硬约束和业务 fail 各有职责。正常业务拒绝不要伪装成普通异常导致 INTERNAL。
43
+
44
+ ## 异步任务与死信
45
+
46
+ 导入/导出 HTTP 202 只表示任务已接受,任务详情另有 queued/processing/retrying/completed/failed/expired。检查 task.errorCode/result 和导入报告,完成后才提供成功提示或下载。
47
+
48
+ outbox 消费失败可能重试或进死信;修复内层错误后重放,查看同一聚合后续消息是否继续。使用管理接口处理,不直接更新 sys.outbox 或业务状态。
49
+
50
+ 当前实现定义位于框架源码 `packages/kernel/src/errors.ts` 与客户端包;实际 API 响应为准。生成契约会列出命令可能的通用错误与能抽取到的业务码,但不代表任何错误都已被实际测试覆盖。
@@ -5,18 +5,15 @@
5
5
  "packageManager": "pnpm@10.14.0",
6
6
  "scripts": {
7
7
  "dev": "cage dev",
8
- "db:setup": "cage db setup",
9
- "db:up": "cage db up",
10
- "db:down": "cage db down",
11
- "db:status": "cage db status",
8
+ "migrate": "cage migrate",
12
9
  "verify": "cage verify",
13
10
  "gen": "cage gen",
14
11
  "build:app": "pnpm --filter @app/domain build && pnpm --filter @app/api build && pnpm --filter @app/web build"
15
12
  },
16
13
  "devDependencies": {
17
- "@yss123/cage-cli": "0.1.0",
18
- "@yss123/cage-testkit": "0.1.0",
19
- "@yss123/cage-lint": "0.1.0",
14
+ "@yss123/cage-cli": "0.2.0",
15
+ "@yss123/cage-testkit": "0.2.0",
16
+ "@yss123/cage-lint": "0.2.0",
20
17
  "@types/node": "^24.3.0",
21
18
  "typescript": "~5.9.3",
22
19
  "vitest": "^4.1.12",
@@ -10,7 +10,7 @@
10
10
  "typecheck": "tsc -p tsconfig.json --noEmit"
11
11
  },
12
12
  "dependencies": {
13
- "@yss123/cage-client": "0.1.0",
13
+ "@yss123/cage-client": "0.2.0",
14
14
  "zod": "^4.1.5"
15
15
  }
16
16
  }