@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,13 +1,96 @@
1
- <!-- cage:begin v0.1.0 -->
2
- ## Cage 框架约定
3
-
4
- 1. 先声明聚合、状态、命令、约束和事件,再实现 handler、查询与页面。
5
- 2. 修改后运行 cage check、cage gen、cage verify;用 cage impact --base-file 旧本体图.json 查看影响。
6
- 3. domain 的声明必须是模块顶层 export const,并从 index.ts 导出。
7
- 4. handler 的读依赖写入 reads;写入只走命令,第三方 IO 通过连接器。
8
- 5. 前端从 @app/contracts 导入契约;生成物通过 cage gen 更新。
9
- 6. 不得手写 HTTP 路由、拼接 SQL 或嵌入密钥;unsafe 必须注明 reason、owner。
10
- 7. 迁移草稿需审查,已发布的迁移不可修改;新增能力点由管理员授权。
11
- 8. 错误码见 docs/errors;完整示例见框架仓库 examples/purchase-admin。
12
- <!-- cage:end -->
1
+ # 本项目的业务开发说明
2
+
3
+ 这是 create-cage-app 生成的业务项目,当前包含采购演示,可逐步替换成客户业务。业务源码在本项目,框架通过 @yss123/cage-* 依赖提供。
4
+
5
+ 先读 [业务开发指南](docs/ai/README.md),按需求查 [任务配方](docs/ai/recipes.md)、[完整采购范例](docs/ai/purchase-example.md) 和 [错误码册](docs/errors/README.md)。这些资料就在项目内,无需克隆框架仓库。
6
+
7
+ ## 项目自己的业务约定
8
+
9
+ 客户术语、角色权限、状态规则、第三方协议和验收标准写在本节或独立业务文档,再从这里链接。新增业务以用户需求为准,不因模板包含采购示例就固定实现采购流程。
10
+
11
+ 本节位于托管区之外,cage sync 会保留。下面的托管区提供框架工作方法。
12
+
13
+ <!-- cage:begin v0.2.0 -->
14
+ ## Cage 业务开发约定(框架托管)
15
+
16
+ ### 先读,再按需求改业务
17
+
18
+ 本项目由 create-cage-app 创建。框架来自 `@yss123/cage-*` 依赖,业务写在本项目;不需要克隆框架仓库,也不要复制框架内部实现。
19
+
20
+ 先读项目说明指定的学习资料,默认入口为 `docs/ai/README.md`。第一次读 `architecture.md`、`project-structure.md` 和 `primitives.md`;具体任务读 `recipes.md`,采购全链路读 `purchase-example.md`,错误查 `docs/errors/README.md` 和 `docs/ai/troubleshooting.md`。资料相对该学习目录,项目说明可指定源码仓库中的规范资料位置。
21
+
22
+ ### 业务代码放在哪里
23
+
24
+ | 位置 | 职责 |
25
+ | --- | --- |
26
+ | `packages/domain/src/modules/<业务>` | 同业务聚合、状态、命令、事件、审批、查询、任务;模块 index.ts 公开导出 |
27
+ | `packages/domain/src/workflows`、`integrations` | 跨模块反应 / 第三方协议与映射;不堆到全局 reactions.ts、queries.ts |
28
+ | `packages/domain/src/index.ts` | 统一导出全部业务及组织模型;没导出的声明不会注册 |
29
+ | `packages/contracts/src/aggregates/<聚合>`、`queries` | 生成协议;根 index.ts 提供 @app/contracts 公共入口,只用 cage gen 更新 |
30
+ | `apps/api/src` | API/worker 薄启动入口,普通业务不手写 HTTP 路由 |
31
+ | `apps/web/src/app` | 会话、导航、布局、模块组合;main.tsx 只挂载和装配 Provider |
32
+ | `apps/web/src/modules/<业务>` | 页面、表单、专用 hooks/API/样式;从模块 index.ts 暴露页面 |
33
+ | `apps/web/src/shared` | 跨模块复用且不绑定业务的 UI、hooks、纯辅助函数 |
34
+ | `db/migrations` | 审查过的结构迁移,作用于已配置的数据库 |
35
+ | `cage.config.json` | 项目路径、检查配置、graph.labels 中文图谱名称 |
36
+ | `.env` | 本机真实连接和密钥;不提交、不输出完整内容 |
37
+
38
+ 新增业务不得继续平铺在 src 根目录。前端模块只依赖自己和 shared,由 app 通过公开入口组合;shared 不反向依赖业务。领域模块间确有读取依赖时走目标模块 index.ts;跨模块反应写 workflows。小模块不创建空层级,已有独立职责再拆文件。完整命名、目录树和示例见 `docs/ai/project-structure.md`。新模板启用 `structure: modular`,check/verify 检查目录和导入边界,遇到 CAGE-STRUCT 错误按职责修正。
13
39
 
40
+ ### 实现一项需求的顺序
41
+
42
+ 1. 先运行 `pnpm exec cage context "需求关键词"`;按需 `graph search` 查候选、`graph inspect` 查完整节点、`graph path` 看关系路径。确认中文匹配入口后按源码位置阅读实现;候选和子图不是全部依赖,具体条件不能凭连线推断。完整用法见 `docs/ai/ontology-context.md`。从用户需求确定字段、状态/动作、角色/范围、约束与后续动作;能由业务声明表达的不改框架。
43
+ 2. 已有业务含义变化时,修改前保存本体图基线:`pnpm exec cage analyze` 后将 `.cage/ontology.json` 另存为独立文件;或使用真实 Git 基线。
44
+ 3. 先声明 aggregate/states/command/constraints/event,再写 handler、reaction/query/approval/connector,最后接业务页面。声明使用模块顶层 `export const`,从 domain 入口导出,跨文件导出名保持唯一。
45
+ 4. 运行 `pnpm exec cage check` 和 `pnpm gen`,审查 contracts 和迁移草稿。按需运行 `pnpm exec cage impact --base-file 旧图.json`,补中文图谱名。
46
+ 5. 页面使用生成方法并处理 code/domainCode;新增能力由管理员授权。数据库结构变化审查后显式 `pnpm migrate`,dev 不代办迁移。
47
+ 6. 按改动运行必要验证,交付时说明体验步骤、授权配置、迁移,以及通过/跳过/未执行项。
48
+
49
+ ### 必守边界
50
+
51
+ - 聚合定义对象字段、状态、范围字段与不变量;命令是业务写入口。handler 只计算业务变化和读取 reads 中的依赖,不直接操作数据库、网络或文件。
52
+ - 对象关系统一放在 fields:ref 为外键,hasMany 为只读反查,manyToMany 自动生成中间表并随所属对象命令提交。前端用生成的 related 方法分页读取;不手写纯中间表聚合,不把单页结果当完整集合替换。完整例子见 docs/ai/relations.md。
53
+ - command 的 input 使用 Zod;已有记录输入必须含 id。from/to 表达状态迁移;`to: null` 只适用于已有记录并保留状态,不能靠 handler 改 status 绕过状态机。
54
+ - 写入、审计、版本、幂等和事务交给内核;不要在业务项目重建 repository、连接池或权限流水线。
55
+ - 自定义查询声明 reads,二选一使用 sql/build,只读 `safe.*`;值参数化。不得拼接 SQL、查询基表绕过范围或硬编码密钥。
56
+ - scope 描述范围字段,角色数据决定实际范围;`scope.none()` 不代表所有人可访问。`can/useCan` 只控制按钮,后端负责授权。
57
+ - 前端从 `@app/contracts` 导入生成 API/类型,按需使用 `@yss123/cage-client`;不导入 domain、内核或数据库包。
58
+ - 跨聚合写入通过 reaction 调用命令。`tx: 'same'` 共同提交/回滚,默认 outbox 异步执行。资源 acquires/releases 是图规则标签,实际占用/释放仍由命令完成;离开持有状态要检查每条释放路径。
59
+ - 审批通过 approval + route 配置,结论是 process 命令;选中审批人不等于已具备能力、范围和额度。第三方 IO 通过连接器,回调验签后调用 external 命令。
60
+ - job 的读取与调用必须列入 reads/calls。业务导入/导出放在需要的业务页面调用通用任务接口,202 只代表任务已接受;worker 必须运行。
61
+ - 已部署事件只做兼容扩展;新增字段设为 optional,不兼容含义用新事件。已执行/已发布迁移不能改写,结构更新新增迁移。
62
+ - 不手改生成物,不关闭门禁掩盖错误,不因方便自动授予生产角色新能力。unsafe 必须写明 reason/owner,不能替代普通业务声明。
63
+ - 代码注释说明职责、关键流程和设计原因;避免无业务价值的防御分支和静默兜底。维护脚本用 TypeScript,不新增 .mjs。
64
+
65
+ ### 最小命令形状
66
+
67
+ ```ts
68
+ // 片段:Order 为已导出的聚合,OrderSubmitted 为事件,业务校验按需求添加。
69
+ export const submitOrder = command(Order, {
70
+ name: 'submit',
71
+ from: 'draft',
72
+ to: 'pending_approval',
73
+ emits: [OrderSubmitted],
74
+ handler: (draft) => draft,
75
+ });
76
+ ```
77
+
78
+ 完整可添加的普通管理对象见 `docs/ai/primitives.md` 的 Note;采购模板的审批、资源、第三方示例在 `packages/domain/src`,空白模板的参考源码在 `docs/examples/purchase-admin`。先读本项目 AGENTS.md 中的模板说明,区分运行代码与参考资料。API 以当前包公开导出和生成契约为准,不发明不存在的配置和方法。
79
+
80
+ ### 启动、验证与排错
81
+
82
+ 在项目根目录执行:首次 `pnpm install`,复制并编辑 .env.example,仅提供已有库管理员连接后 `pnpm exec cage init`;再 `pnpm build:app`、`pnpm gen`,审查后 `pnpm migrate`,最后 `pnpm dev`。已有配置不能覆盖。
83
+
84
+ init 只准备账号/schema/授权并填写三个连接,不创建数据库;APP/READ/MIGRATE 指向同一个库。已有集群账号复用原密码,日常启动不用管理员。普通项目不新增 Docker 生命周期命令。
85
+
86
+ - `pnpm exec cage graph`:浏览器图谱,默认端口 15418,以终端为准。
87
+ - `pnpm exec cage context command:对象.命令 --format json --out .cage/context.json`:按完整 key 取精简上下文;默认 Markdown,可用 --depth/--limit 调整范围。CLI 每次重新抽取;Web“复制 AI 上下文”使用当前页面快照,改代码后先刷新图谱。
88
+ - `graph inspect/path` 有歧义时复制候选完整 key;path 默认沿箭头,--direction both 的逆向遍历不表示执行方向。报告中的测试/前端文件是候选,须核对;查询也会覆盖当前 .cage/ontology.json,旧基线务必另存。
89
+ - `pnpm exec cage gen --check`:生成一致性;`pnpm exec cage sync --check`:本托管区一致性。
90
+ - `pnpm exec cage test --only project`:业务测试;`pnpm verify`:类型、依赖、lint、图规则、生成、托管区、预算和测试。
91
+ - `pnpm exec cage verify --skip-tests` 表示不完整门禁;派生测试跳过不能当作通过。测试连接只用独立测试集群。
92
+ - 重要业务改动验证成功路径及有风险的反例;文档或可逆的小改动不反复跑全量数据库测试。
93
+ - CLI 报错先看 code/at/reason/fix,再查错误码册;HTTP 错误查 runtime.md。异步失败先看 worker、同步记录和死信,修复后重放,不能直接 SQL 改状态。
94
+
95
+ 框架托管区由 cage sync 更新;项目独有的业务规则写在标记之外,避免升级覆盖。
96
+ <!-- cage:end -->
@@ -16,6 +16,8 @@ FROM node:24-bookworm-slim AS runtime
16
16
  WORKDIR /app
17
17
  COPY --from=build --chown=node:node /out/api /app
18
18
  COPY --from=build --chown=node:node /app/apps/web/dist /app/web
19
+ # 系统管理与图谱共享中文显示配置;运行时工作目录同样保持为 /app。
20
+ COPY --from=build --chown=node:node /app/cage.config.json /app/cage.config.json
19
21
  ENV NODE_ENV=production PORT=3000 WEB_DIR=/app/web
20
22
  USER node
21
23
  EXPOSE 3000
@@ -1,27 +1,55 @@
1
- # 采购工作台
1
+ # Cage 业务应用(含采购示例)
2
2
 
3
3
  这是可启动的标准范例:组织管理、采购单、审批待办、库存台账、库存锁生命周期和 ERP 出入站映射。
4
4
 
5
+ ## 让 AI 在本项目开发业务
6
+
7
+ 把本目录交给 Codex 等编程工具时,先让它读 [AGENTS.md](AGENTS.md),再按[业务开发指南](docs/ai/README.md)和[任务配方](docs/ai/recipes.md)实现需求。普通业务不需要修改框架源码。
8
+
9
+ [采购全链路导读](docs/ai/purchase-example.md)说明每个文件和异步步骤;[原语与最小业务](docs/ai/primitives.md)提供可添加的普通管理对象;[错误码册](docs/errors/README.md)用于按码修复。脚手架会将这些资料放入生成项目本地的 `docs/ai` 与 `docs/errors`,无需再次克隆框架。
10
+
5
11
  ## 启动
6
12
 
7
- 在框架仓库根目录执行 `pnpm install`、`pnpm build`,然后进入本目录。独立模板项目先执行 `pnpm install`、`pnpm build:app`、`pnpm cage gen`。
13
+ 在本项目根目录执行 `pnpm install`、`pnpm build:app`;无需克隆或构建框架仓库。
8
14
 
9
15
  ```powershell
10
- pnpm cage db setup
11
- pnpm cage db up
12
- # 仅首次初始化独立新集群时执行;已有库随后用 cage migrate。
13
- pnpm cage db init
16
+ # 首次配置时复制,已有 .env 时直接编辑原文件。
17
+ Copy-Item .env.example .env
18
+ # 编辑 .env,只填写 CAGE_ADMIN_DATABASE_URL,连接已经存在的数据库。
19
+ pnpm exec cage init
20
+ # init 自动创建账号、生成密码和 Cookie 密钥,并写回 .env。
21
+ pnpm gen
22
+ # 审查 db/migrations 后执行表结构迁移。
23
+ pnpm migrate
14
24
  pnpm dev
15
25
  ```
16
26
 
17
- 连接池、事务、数据库初始化和凭证生成均由框架提供,项目不写连接或建库脚本。`cage db setup` 生成随机密码和本地 `.env`,重复运行保留已有配置。开发库位于 `127.0.0.1:54329/cage_dev`,测试库位于独立容器的 54330 端口。`cage db down` 停止容器但保留开发数据卷;`cage db up` 再次启动。package.json 中的 `db:*` 是相同命令的简写。
27
+ 数据库配置位于本项目根目录的 `.env`,与 `package.json`、`cage.config.json` 同级。[`.env.example`](.env.example) 为每项提供中文注释、填写格式和是否必填。连接池和事务由框架提供,项目只需配置连接。
28
+
29
+ | 配置项 | 用途 |
30
+ | --- | --- |
31
+ | `CAGE_APP_DATABASE_URL` | `cage_app` 账号:API/worker 业务读写 |
32
+ | `CAGE_READ_DATABASE_URL` | `cage_read` 账号:仅查询安全视图 |
33
+ | `CAGE_MIGRATE_DATABASE_URL` | `cage_migrate` 账号:手动执行表结构迁移 |
34
+
35
+ 三个连接由 `cage init` 自动生成,指向**同一个已经存在的数据库**,主机、端口和库名一致。CLI 自动读取 `.env`,部署环境中的同名变量优先。修改后重启 `dev`。`migrate` 在下次执行时读取配置。
36
+
37
+ `pnpm migrate` 更新该库中的表、视图和索引;迁移历史记录在 `sys.schema_migrations`。`pnpm dev` 连接该库并启动 API、worker 和 Web,domain 变化后仅重新生成文件;表结构变更需审查迁移后手动执行。框架不创建数据库、不安装 PostgreSQL、不管理 Docker。
18
38
 
19
- CLI 自动读取项目 `.env`,部署环境变量优先。`CAGE_APP_DATABASE_URL`、`CAGE_READ_DATABASE_URL`、`CAGE_MIGRATE_DATABASE_URL` 分别连接写入、只读和迁移账号。超级用户仅用于初始化,API/worker 不接收其凭证。
39
+ ### 首次只提供管理员连接
40
+
41
+ 在 `.env` 中填写 `CAGE_ADMIN_DATABASE_URL=postgresql://postgres:管理员密码@主机:端口/已有数据库名`。PostgreSQL 管理员通常叫 `postgres`,已有管理员叫 `root` 时使用实际账号名;连接串中的密码特殊字符需要 URL 编码。
42
+
43
+ 执行 `pnpm exec cage init` 会创建框架账号和授权,生成三个独立随机密码及 Cookie 密钥,自动填写 `.env`,成功后移除文件中的管理员连接。业务端口、自定义配置和已有 Cookie 密钥会保留;失败会回滚数据库并保留原 `.env`。日常启动不需要管理员连接。
44
+
45
+ 重复 `init` 会验证并复用已保存的三个账号,不更改密码。若集群已有 Cage 账号但本项目没有原连接,请先复用原凭证再运行 `init`;命令不会为了新项目重置其他项目的账号。部署时也可由平台直接提供三个账号连接,无需执行本地初始化。
46
+
47
+ 数据库除三个登录账号外,还有不允许登录的 `cage_view_owner`,由 `init` 一并创建,用于持有安全视图,无需填写密码。角色名属于整个 PostgreSQL 集群,不能为另一个项目随意重置密码。业务表及系统表由后续 `pnpm migrate` 创建,`init` 只准备角色、schema 和授权。连接现有数据库不表示框架会自动识别、接管其中任意历史业务表;接入历史表需另行映射和审查迁移。
20
48
 
21
49
  测试环境会初始化集群级角色,因此 `CAGE_TEST_DATABASE_URL` 必须指向独立测试集群。运行 `pnpm cage verify` 验证示例;框架仓库根目录的 `pnpm test:docker` 验证全部框架测试。
22
50
 
23
- 浏览器打开 <http://localhost:5173>。初始管理员凭证在 API 终端显示一次。
24
- 如果 Windows Docker/Hyper-V 保留了该端口,在 `.env` 设置 `CAGE_WEB_PORT=15173`;终端会打印实际地址。`PORT` 控制 API 端口,Vite 代理同步使用它。未配置数据库连接串时才使用原有内嵌 PostgreSQL。
51
+ 浏览器打开终端打印的 Web 地址;配置示例使用 <http://localhost:15173>。初始管理员凭证在 API 终端显示一次。
52
+ `CAGE_WEB_PORT` 控制 Web 端口,`PORT` 控制 API 端口,Vite 代理同步使用它。缺少数据库配置时会给出错误,需填写 `.env` 后重新启动。
25
53
 
26
54
  ## 体验完整采购流程
27
55
 
@@ -47,12 +75,14 @@ CLI 自动读取项目 `.env`,部署环境变量优先。`CAGE_APP_DATABASE_UR
47
75
 
48
76
  图谱主标题显示中文业务名称,下面保留英文代码标识。框架会读取声明现有的 `description`;本项目在 `cage.config.json` 的 `graph.labels` 中补充状态、字段等名称,也可覆盖较长描述。例如 `"command:PurchaseOrder.approve": "通过审批"`。键为 `节点类型:本体节点 ID`,可从节点详情复制 ID;中文标题只用于显示,不改变命令、权限标识或数据库。新增业务声明时同时补上需要的名称,然后在图谱中点击“重新抽取”。
49
77
 
50
- - `packages/domain/src/inventory.ts`:最简聚合和库存锁。
51
- - `purchase-order.ts`:状态、命令、约束和事件。
52
- - `reactions.ts`:同事务建锁与异步释放,包含资源配对标记。
53
- - `approvals.ts`、`erp.ts`:封闭审批路由、出站和入站映射。
54
- - `queries.ts`、`jobs.ts`:安全视图查询及过期草稿清理。
78
+ - `packages/domain/src/modules/inventory`:最简聚合和库存锁。
79
+ - `packages/domain/src/modules/purchase`:采购状态、命令、约束、事件、审批、查询和任务。
80
+ - `packages/domain/src/workflows/purchase-inventory.ts`:同事务建锁与异步释放,包含资源配对标记。
81
+ - `packages/domain/src/integrations/erp.ts`:出站、入站映射和验签。
82
+ - `packages/contracts/src/aggregates/<聚合>`:生成的 SDK;页面统一从 `@app/contracts` 引入。
55
83
  - `apps/api/src`:API 和 worker 的薄启动入口。
56
- - `apps/web/src`:仅依赖生成契约的 React 界面。
84
+ - `apps/web/src/app`、`modules`、`shared`:应用组合、业务页面、共享基础组件;`main.tsx` 只挂载。
85
+
86
+ 新增业务先读[工程目录与代码组织](docs/ai/project-structure.md),不要继续在 src 根目录平铺文件。模板已启用模块目录门禁,`cage check` 和 `verify` 会指出目录与依赖越界。
57
87
 
58
88
  先运行 `pnpm cage gen` 再提交契约和迁移草稿;`pnpm cage verify` 检查完整工具链。派生测试遇到无法推断的业务输入会显示跳过,`purchase-order.test.ts` 另外准备真实业务数据覆盖成功审批和约束反例。
@@ -0,0 +1,8 @@
1
+ node_modules/
2
+ dist/
3
+ .cage/
4
+ generated/
5
+ .env
6
+ .env.*
7
+ !.env.example
8
+ *.log
@@ -10,7 +10,7 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@app/domain": "workspace:*",
13
- "@yss123/cage-http": "0.1.0",
14
- "@yss123/cage-connectors": "0.1.0"
13
+ "@yss123/cage-http": "0.2.0",
14
+ "@yss123/cage-connectors": "0.2.0"
15
15
  }
16
16
  }
@@ -0,0 +1,18 @@
1
+ // 应用组合层只决定会话与页面的切换;具体业务交给 modules 下的页面。
2
+ import { useEffect, useState } from 'react';
3
+ import { loadMe } from '@app/contracts';
4
+ import { LoginPage } from '../modules/auth';
5
+ import { WorkspaceLayout } from './workspace-layout';
6
+
7
+ export function App() {
8
+ const [session, setSession] = useState<'loading' | 'guest' | 'ready'>('loading');
9
+ useEffect(() => {
10
+ void loadMe().then((result) => setSession(result.ok ? 'ready' : 'guest'));
11
+ }, []);
12
+ if (session === 'loading') return <div className="loading">正在连接工作台…</div>;
13
+ return session === 'guest' ? (
14
+ <LoginPage onLogin={() => setSession('ready')} />
15
+ ) : (
16
+ <WorkspaceLayout onLogout={() => setSession('guest')} />
17
+ );
18
+ }
@@ -0,0 +1,70 @@
1
+ // 应用壳组合模块公开入口,只持有导航和会话;表单、筛选、命令留在各业务模块。
2
+ import { useState } from 'react';
3
+ import { useQueryClient } from '@tanstack/react-query';
4
+ import { client, currentUser } from '@app/contracts';
5
+ import { PurchaseOrdersPage } from '../modules/purchase';
6
+ import { InventoryPage } from '../modules/inventory';
7
+ import { ApprovalTasksPage, useApprovalTasks } from '../modules/approval';
8
+
9
+ export function WorkspaceLayout({ onLogout }: { onLogout: () => void }) {
10
+ const [tab, setTab] = useState<'orders' | 'tasks' | 'stock'>('orders');
11
+ const tasks = useApprovalTasks();
12
+ const cache = useQueryClient();
13
+ return (
14
+ <div className="workspace">
15
+ <aside>
16
+ <a className="brand" href="/">
17
+ cage<span>采购工作台</span>
18
+ </a>
19
+ <span className="nav-caption">工作空间</span>
20
+ <nav>
21
+ {(
22
+ [
23
+ ['orders', '01', '采购单'],
24
+ ['tasks', '02', '审批待办'],
25
+ ['stock', '03', '库存台账'],
26
+ ] as const
27
+ ).map(([key, no, label]) => (
28
+ <button key={key} className={tab === key ? 'selected' : ''} onClick={() => setTab(key)}>
29
+ <span>{no}</span>
30
+ {label}
31
+ {key === 'tasks' && <b>{tasks.data?.length ?? 0}</b>}
32
+ </button>
33
+ ))}
34
+ </nav>
35
+ <div className="aside-bottom">
36
+ <a href="/admin/">系统管理 ↗</a>
37
+ <div className="user">
38
+ <span className="avatar">{currentUser()?.name?.slice(0, 1) ?? '用'}</span>
39
+ <div>
40
+ {currentUser()?.name}
41
+ <small>已登录</small>
42
+ </div>
43
+ </div>
44
+ <button
45
+ className="logout"
46
+ onClick={async () => {
47
+ await client.logout();
48
+ cache.clear();
49
+ onLogout();
50
+ }}
51
+ >
52
+ 退出登录
53
+ </button>
54
+ </div>
55
+ </aside>
56
+ <main className="content">
57
+ <header>
58
+ <span>采购管理 / {tab === 'orders' ? '采购单' : tab === 'tasks' ? '审批待办' : '库存台账'}</span>
59
+ <span className="live-dot">团队工作空间</span>
60
+ </header>
61
+ {tab === 'orders' && <PurchaseOrdersPage pendingTasks={tasks.data?.length} />}
62
+ {tab === 'tasks' && <ApprovalTasksPage />}
63
+ {tab === 'stock' && <InventoryPage />}
64
+ <div className="page-footer">
65
+ CAGE / PROCUREMENT WORKSPACE<span>业务操作均受权限与数据范围约束</span>
66
+ </div>
67
+ </main>
68
+ </div>
69
+ );
70
+ }