@yss123/cage-cli 0.2.0 → 0.3.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 (607) hide show
  1. package/README.md +47 -3
  2. package/bin/cage.js +5 -0
  3. package/bin/create-cage-app.js +5 -0
  4. package/dist/analyze.d.ts +16 -0
  5. package/dist/analyze.js +18 -2
  6. package/dist/analyze.js.map +1 -1
  7. package/dist/baseline.d.ts +8 -0
  8. package/dist/baseline.js +13 -0
  9. package/dist/baseline.js.map +1 -1
  10. package/dist/bootstrap.d.ts +20 -0
  11. package/dist/bootstrap.js +75 -0
  12. package/dist/bootstrap.js.map +1 -0
  13. package/dist/budget.d.ts +7 -0
  14. package/dist/budget.js +49 -5
  15. package/dist/budget.js.map +1 -1
  16. package/dist/capabilities.d.ts +38 -0
  17. package/dist/capabilities.js +133 -0
  18. package/dist/capabilities.js.map +1 -0
  19. package/dist/config.d.ts +31 -2
  20. package/dist/config.js +22 -0
  21. package/dist/config.js.map +1 -1
  22. package/dist/context.d.ts +14 -0
  23. package/dist/context.js +35 -2
  24. package/dist/context.js.map +1 -1
  25. package/dist/create-prompt.d.ts +7 -0
  26. package/dist/create-prompt.js +12 -0
  27. package/dist/create-prompt.js.map +1 -1
  28. package/dist/create.d.ts +21 -1
  29. package/dist/create.js +23 -1
  30. package/dist/create.js.map +1 -1
  31. package/dist/derive.d.ts +23 -0
  32. package/dist/derive.js +40 -0
  33. package/dist/derive.js.map +1 -1
  34. package/dist/dev.d.ts +6 -0
  35. package/dist/dev.js +11 -0
  36. package/dist/dev.js.map +1 -1
  37. package/dist/doctor.d.ts +98 -0
  38. package/dist/doctor.js +93 -0
  39. package/dist/doctor.js.map +1 -0
  40. package/dist/env.d.ts +6 -0
  41. package/dist/env.js +11 -0
  42. package/dist/env.js.map +1 -1
  43. package/dist/findings.d.ts +27 -0
  44. package/dist/findings.js +20 -0
  45. package/dist/findings.js.map +1 -1
  46. package/dist/gen/contracts.d.ts +28 -0
  47. package/dist/gen/contracts.js +52 -12
  48. package/dist/gen/contracts.js.map +1 -1
  49. package/dist/gen/index.d.ts +26 -0
  50. package/dist/gen/index.js +69 -1
  51. package/dist/gen/index.js.map +1 -1
  52. package/dist/gen/zod-code.d.ts +42 -0
  53. package/dist/gen/zod-code.js +178 -16
  54. package/dist/gen/zod-code.js.map +1 -1
  55. package/dist/graph-approvals.d.ts +60 -0
  56. package/dist/graph-approvals.js +80 -0
  57. package/dist/graph-approvals.js.map +1 -0
  58. package/dist/graph-business.d.ts +135 -0
  59. package/dist/graph-business.js +404 -0
  60. package/dist/graph-business.js.map +1 -0
  61. package/dist/graph-command.d.ts +17 -0
  62. package/dist/graph-command.js +21 -0
  63. package/dist/graph-command.js.map +1 -1
  64. package/dist/graph-model.d.ts +44 -0
  65. package/dist/graph-model.js +36 -3
  66. package/dist/graph-model.js.map +1 -1
  67. package/dist/graph-presentation.d.ts +16 -0
  68. package/dist/graph-presentation.js +10 -1
  69. package/dist/graph-presentation.js.map +1 -1
  70. package/dist/graph-query.d.ts +95 -0
  71. package/dist/graph-query.js +62 -0
  72. package/dist/graph-query.js.map +1 -1
  73. package/dist/graph-relations.d.ts +20 -0
  74. package/dist/graph-relations.js +34 -4
  75. package/dist/graph-relations.js.map +1 -1
  76. package/dist/graph-search.d.ts +35 -0
  77. package/dist/graph-search.js +36 -0
  78. package/dist/graph-search.js.map +1 -1
  79. package/dist/graph-snapshot.d.ts +26 -0
  80. package/dist/graph-snapshot.js +30 -1
  81. package/dist/graph-snapshot.js.map +1 -1
  82. package/dist/graph.d.ts +13 -2
  83. package/dist/graph.js +59 -4
  84. package/dist/graph.js.map +1 -1
  85. package/dist/impact.d.ts +50 -0
  86. package/dist/impact.js +62 -2
  87. package/dist/impact.js.map +1 -1
  88. package/dist/index.d.ts +10 -0
  89. package/dist/index.js +10 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/init.d.ts +12 -0
  92. package/dist/init.js +15 -0
  93. package/dist/init.js.map +1 -1
  94. package/dist/load.d.ts +10 -0
  95. package/dist/load.js +15 -0
  96. package/dist/load.js.map +1 -1
  97. package/dist/main.d.ts +6 -0
  98. package/dist/main.js +93 -5
  99. package/dist/main.js.map +1 -1
  100. package/dist/migrate.d.ts +12 -0
  101. package/dist/migrate.js +17 -0
  102. package/dist/migrate.js.map +1 -1
  103. package/dist/ontology.d.ts +67 -2
  104. package/dist/ontology.js +89 -2
  105. package/dist/ontology.js.map +1 -1
  106. package/dist/process-rules.d.ts +21 -0
  107. package/dist/process-rules.js +100 -0
  108. package/dist/process-rules.js.map +1 -0
  109. package/dist/process.d.ts +32 -0
  110. package/dist/process.js +32 -0
  111. package/dist/process.js.map +1 -1
  112. package/dist/project-structure.d.ts +5 -0
  113. package/dist/project-structure.js +10 -0
  114. package/dist/project-structure.js.map +1 -1
  115. package/dist/registration.d.ts +16 -0
  116. package/dist/registration.js +56 -0
  117. package/dist/registration.js.map +1 -0
  118. package/dist/rules.d.ts +52 -0
  119. package/dist/rules.js +58 -0
  120. package/dist/rules.js.map +1 -1
  121. package/dist/runtime-diagnostics.d.ts +27 -0
  122. package/dist/runtime-diagnostics.js +60 -0
  123. package/dist/runtime-diagnostics.js.map +1 -0
  124. package/dist/snapshots.d.ts +40 -0
  125. package/dist/snapshots.js +62 -0
  126. package/dist/snapshots.js.map +1 -0
  127. package/dist/static-check.d.ts +33 -0
  128. package/dist/static-check.js +37 -1
  129. package/dist/static-check.js.map +1 -1
  130. package/dist/sync.d.ts +11 -0
  131. package/dist/sync.js +65 -8
  132. package/dist/sync.js.map +1 -1
  133. package/dist/upgrade.d.ts +16 -0
  134. package/dist/upgrade.js +21 -0
  135. package/dist/upgrade.js.map +1 -1
  136. package/dist/verify.d.ts +14 -0
  137. package/dist/verify.js +19 -0
  138. package/dist/verify.js.map +1 -1
  139. package/dist/version.js +5 -0
  140. package/dist/version.js.map +1 -1
  141. package/graph-ui/app.js +321 -27
  142. package/graph-ui/approval-flow.js +165 -0
  143. package/graph-ui/business.css +985 -0
  144. package/graph-ui/business.js +549 -0
  145. package/graph-ui/flowchart-interaction.js +177 -0
  146. package/graph-ui/flowchart.js +1059 -0
  147. package/graph-ui/graph-approvals.js +79 -0
  148. package/graph-ui/graph-business.js +403 -0
  149. package/graph-ui/graph-model.js +36 -3
  150. package/graph-ui/graph-relations.js +34 -4
  151. package/graph-ui/graph-search.js +36 -0
  152. package/graph-ui/index.html +26 -12
  153. package/graph-ui/model.js +28 -0
  154. package/graph-ui/relations.js +4 -0
  155. package/graph-ui/structure.js +44 -0
  156. package/graph-ui/style.css +12 -0
  157. package/package.json +6 -4
  158. package/templates/app/.dockerignore +2 -0
  159. package/templates/app/.env.example +10 -0
  160. package/templates/app/AGENTS.md +49 -9
  161. package/templates/app/README.md +4 -1
  162. package/templates/app/_gitignore +1 -0
  163. package/templates/app/apps/api/package.json +2 -2
  164. package/templates/app/apps/api/src/main.ts +5 -1
  165. package/templates/app/apps/api/src/worker.ts +3 -0
  166. package/templates/app/apps/web/index.html +1 -0
  167. package/templates/app/apps/web/package.json +7 -3
  168. package/templates/app/apps/web/src/app/app.tsx +122 -12
  169. package/templates/app/apps/web/src/app/styles/global.css +88 -8
  170. package/templates/app/apps/web/src/app/use-session.ts +43 -0
  171. package/templates/app/apps/web/src/app/workspace-layout.tsx +58 -19
  172. package/templates/app/apps/web/src/main.tsx +5 -0
  173. package/templates/app/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +11 -0
  174. package/templates/app/apps/web/src/modules/approval/index.ts +4 -0
  175. package/templates/app/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +20 -1
  176. package/templates/app/apps/web/src/modules/auth/index.ts +4 -0
  177. package/templates/app/apps/web/src/modules/auth/pages/login-page.tsx +12 -0
  178. package/templates/app/apps/web/src/modules/inventory/index.ts +4 -0
  179. package/templates/app/apps/web/src/modules/inventory/pages/inventory-page.tsx +29 -1
  180. package/templates/app/apps/web/src/modules/purchase/components/approval-history.tsx +32 -0
  181. package/templates/app/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
  182. package/templates/app/apps/web/src/modules/purchase/components/purchase-assistant-context.tsx +17 -0
  183. package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.css +6 -0
  184. package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.tsx +25 -3
  185. package/templates/app/apps/web/src/modules/purchase/index.ts +5 -0
  186. package/templates/app/apps/web/src/modules/purchase/lib/presentation.ts +20 -0
  187. package/templates/app/apps/web/src/modules/purchase/pages/purchase-intelligence.css +15 -0
  188. package/templates/app/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +154 -0
  189. package/templates/app/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +52 -22
  190. package/templates/app/apps/web/src/modules/workspace/index.ts +5 -0
  191. package/templates/app/apps/web/src/modules/workspace/pages/home-page.tsx +44 -0
  192. package/templates/app/apps/web/src/shared/hooks/use-command.ts +13 -0
  193. package/templates/app/apps/web/src/shared/lib/error-message.ts +9 -0
  194. package/templates/app/apps/web/src/shared/lib/navigation.ts +21 -0
  195. package/templates/app/apps/web/src/shared/ui/assistant-markdown.tsx +19 -0
  196. package/templates/app/apps/web/src/shared/ui/assistant-panel.css +134 -0
  197. package/templates/app/apps/web/src/shared/ui/assistant-panel.tsx +200 -0
  198. package/templates/app/apps/web/src/shared/ui/assistant-scope.tsx +72 -0
  199. package/templates/app/apps/web/src/shared/ui/attachment-upload.css +28 -0
  200. package/templates/app/apps/web/src/shared/ui/attachment-upload.tsx +163 -0
  201. package/templates/app/apps/web/src/shared/ui/notice.tsx +7 -0
  202. package/templates/app/apps/web/src/shared/ui/page-heading.tsx +7 -0
  203. package/templates/app/apps/web/src/shared/ui/page-state.css +47 -0
  204. package/templates/app/apps/web/src/shared/ui/page-state.tsx +76 -0
  205. package/templates/app/apps/web/src/shared/ui/require-capability.tsx +34 -0
  206. package/templates/app/apps/web/vite.config.ts +5 -0
  207. package/templates/app/cage.config.json +9 -0
  208. package/templates/app/db/migrations/0002_draft.sql +12 -0
  209. package/templates/app/db/migrations/0003_draft.sql +8 -0
  210. package/templates/app/deploy/nginx.conf +52 -0
  211. package/templates/app/docs/ai/README.md +21 -0
  212. package/templates/app/docs/ai/architecture.md +26 -0
  213. package/templates/app/docs/ai/commenting.md +203 -0
  214. package/templates/app/docs/ai/diagnostics.md +80 -0
  215. package/templates/app/docs/ai/files.md +93 -0
  216. package/templates/app/docs/ai/intelligence.md +348 -0
  217. package/templates/app/docs/ai/ontology-context.md +59 -4
  218. package/templates/app/docs/ai/primitives.md +33 -0
  219. package/templates/app/docs/ai/project-structure.md +8 -3
  220. package/templates/app/docs/ai/purchase-example.md +16 -2
  221. package/templates/app/docs/ai/recipes.md +9 -1
  222. package/templates/app/docs/ai/routing.md +86 -0
  223. package/templates/app/docs/ai/troubleshooting.md +5 -0
  224. package/templates/app/docs/ai/workflow.md +24 -11
  225. package/templates/app/docs/errors/CAGE-AI-001.md +61 -0
  226. package/templates/app/docs/errors/CAGE-APPR-001.md +7 -6
  227. package/templates/app/docs/errors/CAGE-APPR-002.md +2 -2
  228. package/templates/app/docs/errors/CAGE-APPR-003.md +1 -1
  229. package/templates/app/docs/errors/CAGE-APPR-004.md +4 -4
  230. package/templates/app/docs/errors/CAGE-APPR-005.md +1 -1
  231. package/templates/app/docs/errors/CAGE-APPR-006.md +12 -6
  232. package/templates/app/docs/errors/CAGE-APPR-007.md +3 -3
  233. package/templates/app/docs/errors/CAGE-APPR-010.md +5 -5
  234. package/templates/app/docs/errors/CAGE-AUDIT-001.md +53 -0
  235. package/templates/app/docs/errors/CAGE-AUTH-001.md +1 -1
  236. package/templates/app/docs/errors/CAGE-BIZ-001.md +51 -0
  237. package/templates/app/docs/errors/CAGE-BIZ-002.md +49 -0
  238. package/templates/app/docs/errors/CAGE-BUDGET-001.md +1 -1
  239. package/templates/app/docs/errors/CAGE-BUDGET-002.md +1 -1
  240. package/templates/app/docs/errors/CAGE-BUDGET-003.md +1 -1
  241. package/templates/app/docs/errors/CAGE-CMD-002.md +1 -1
  242. package/templates/app/docs/errors/CAGE-CMD-003.md +1 -1
  243. package/templates/app/docs/errors/CAGE-CONN-001.md +3 -3
  244. package/templates/app/docs/errors/CAGE-CONN-002.md +1 -1
  245. package/templates/app/docs/errors/CAGE-CONN-003.md +1 -1
  246. package/templates/app/docs/errors/CAGE-CONN-004.md +1 -1
  247. package/templates/app/docs/errors/CAGE-CONN-005.md +1 -1
  248. package/templates/app/docs/errors/CAGE-CONN-006.md +1 -1
  249. package/templates/app/docs/errors/CAGE-CONN-007.md +6 -6
  250. package/templates/app/docs/errors/CAGE-CONN-008.md +5 -5
  251. package/templates/app/docs/errors/CAGE-CONN-009.md +6 -6
  252. package/templates/app/docs/errors/CAGE-CONN-010.md +6 -6
  253. package/templates/app/docs/errors/CAGE-CONN-011.md +1 -1
  254. package/templates/app/docs/errors/CAGE-CONN-012.md +1 -1
  255. package/templates/app/docs/errors/CAGE-CONN-013.md +49 -0
  256. package/templates/app/docs/errors/CAGE-CONN-014.md +48 -0
  257. package/templates/app/docs/errors/CAGE-CONN-015.md +49 -0
  258. package/templates/app/docs/errors/CAGE-CREATE-001.md +10 -9
  259. package/templates/app/docs/errors/CAGE-DECL-001.md +2 -2
  260. package/templates/app/docs/errors/CAGE-DECL-002.md +7 -6
  261. package/templates/app/docs/errors/CAGE-DECL-003.md +1 -1
  262. package/templates/app/docs/errors/CAGE-DECL-004.md +1 -1
  263. package/templates/app/docs/errors/CAGE-DEP-001.md +2 -2
  264. package/templates/app/docs/errors/CAGE-DEP-002.md +1 -1
  265. package/templates/app/docs/errors/CAGE-DEP-003.md +2 -2
  266. package/templates/app/docs/errors/CAGE-DEP-004.md +1 -1
  267. package/templates/app/docs/errors/CAGE-DEP-005.md +1 -1
  268. package/templates/app/docs/errors/CAGE-DIAG-001.md +53 -0
  269. package/templates/app/docs/errors/CAGE-DLQ-001.md +2 -2
  270. package/templates/app/docs/errors/CAGE-ENV-001.md +4 -4
  271. package/templates/app/docs/errors/CAGE-ENV-002.md +51 -0
  272. package/templates/app/docs/errors/CAGE-ENV-003.md +48 -0
  273. package/templates/app/docs/errors/CAGE-EVENT-001.md +1 -1
  274. package/templates/app/docs/errors/CAGE-EVENT-002.md +7 -7
  275. package/templates/app/docs/errors/CAGE-FIELD-001.md +2 -2
  276. package/templates/app/docs/errors/CAGE-FIELD-002.md +1 -1
  277. package/templates/app/docs/errors/CAGE-FIELD-003.md +1 -1
  278. package/templates/app/docs/errors/CAGE-FIELD-004.md +1 -1
  279. package/templates/app/docs/errors/CAGE-FILE-001.md +56 -0
  280. package/templates/app/docs/errors/CAGE-GEN-001.md +2 -2
  281. package/templates/app/docs/errors/CAGE-GEN-002.md +1 -1
  282. package/templates/app/docs/errors/CAGE-GEN-003.md +53 -0
  283. package/templates/app/docs/errors/CAGE-GRANT-001.md +3 -3
  284. package/templates/app/docs/errors/CAGE-GRANT-002.md +2 -2
  285. package/templates/app/docs/errors/CAGE-GRANT-003.md +7 -6
  286. package/templates/app/docs/errors/CAGE-IMPACT-001.md +2 -2
  287. package/templates/app/docs/errors/CAGE-IMPACT-002.md +52 -0
  288. package/templates/app/docs/errors/CAGE-INIT-001.md +1 -1
  289. package/templates/app/docs/errors/CAGE-INIT-002.md +1 -1
  290. package/templates/app/docs/errors/CAGE-INIT-003.md +2 -2
  291. package/templates/app/docs/errors/CAGE-INIT-004.md +1 -1
  292. package/templates/app/docs/errors/CAGE-INIT-005.md +52 -0
  293. package/templates/app/docs/errors/CAGE-JOB-001.md +1 -1
  294. package/templates/app/docs/errors/CAGE-JOB-002.md +1 -1
  295. package/templates/app/docs/errors/CAGE-JOB-003.md +1 -1
  296. package/templates/app/docs/errors/CAGE-LINT-001.md +1 -1
  297. package/templates/app/docs/errors/CAGE-MIG-001.md +1 -1
  298. package/templates/app/docs/errors/CAGE-MIG-002.md +1 -1
  299. package/templates/app/docs/errors/CAGE-MIG-005.md +1 -1
  300. package/templates/app/docs/errors/CAGE-NAME-001.md +1 -1
  301. package/templates/app/docs/errors/CAGE-NAME-002.md +1 -1
  302. package/templates/app/docs/errors/CAGE-NAME-003.md +3 -3
  303. package/templates/app/docs/errors/CAGE-NAME-004.md +1 -1
  304. package/templates/app/docs/errors/CAGE-NAME-005.md +1 -1
  305. package/templates/app/docs/errors/CAGE-NAME-006.md +1 -1
  306. package/templates/app/docs/errors/CAGE-ORG-001.md +7 -6
  307. package/templates/app/docs/errors/CAGE-PAIR-002.md +6 -5
  308. package/templates/app/docs/errors/CAGE-QUERY-001.md +1 -1
  309. package/templates/app/docs/errors/CAGE-QUERY-002.md +2 -2
  310. package/templates/app/docs/errors/CAGE-QUERY-003.md +7 -6
  311. package/templates/app/docs/errors/CAGE-REACT-001.md +3 -3
  312. package/templates/app/docs/errors/CAGE-REACT-002.md +1 -1
  313. package/templates/app/docs/errors/CAGE-REACT-003.md +50 -0
  314. package/templates/app/docs/errors/CAGE-READS-001.md +9 -6
  315. package/templates/app/docs/errors/CAGE-REG-001.md +13 -12
  316. package/templates/app/docs/errors/CAGE-REG-002.md +2 -1
  317. package/templates/app/docs/errors/CAGE-REG-003.md +1 -1
  318. package/templates/app/docs/errors/CAGE-REL-001.md +14 -14
  319. package/templates/app/docs/errors/CAGE-ROUTE-001.md +7 -6
  320. package/templates/app/docs/errors/CAGE-SCOPE-001.md +1 -1
  321. package/templates/app/docs/errors/CAGE-SCOPE-002.md +2 -2
  322. package/templates/app/docs/errors/CAGE-SECRET-001.md +2 -2
  323. package/templates/app/docs/errors/CAGE-SECRET-002.md +1 -1
  324. package/templates/app/docs/errors/CAGE-SENS-001.md +5 -5
  325. package/templates/app/docs/errors/CAGE-SQL-001.md +1 -1
  326. package/templates/app/docs/errors/CAGE-SQL-002.md +1 -1
  327. package/templates/app/docs/errors/CAGE-STATE-001.md +3 -3
  328. package/templates/app/docs/errors/CAGE-STATE-002.md +1 -1
  329. package/templates/app/docs/errors/CAGE-STATE-003.md +1 -1
  330. package/templates/app/docs/errors/CAGE-STATE-004.md +1 -1
  331. package/templates/app/docs/errors/CAGE-STATE-005.md +3 -2
  332. package/templates/app/docs/errors/CAGE-STATE-010.md +5 -5
  333. package/templates/app/docs/errors/CAGE-STATE-011.md +5 -5
  334. package/templates/app/docs/errors/CAGE-STRUCT-001.md +1 -1
  335. package/templates/app/docs/errors/CAGE-STRUCT-002.md +1 -1
  336. package/templates/app/docs/errors/CAGE-SYNC-001.md +3 -2
  337. package/templates/app/docs/errors/CAGE-TEST-001.md +1 -1
  338. package/templates/app/docs/errors/CAGE-TEST-002.md +50 -0
  339. package/templates/app/docs/errors/CAGE-TEST-003.md +52 -0
  340. package/templates/app/docs/errors/CAGE-UNSAFE-001.md +3 -2
  341. package/templates/app/docs/errors/CAGE-UPGRADE-001.md +2 -2
  342. package/templates/app/docs/errors/CAGE-WORKER-001.md +48 -0
  343. package/templates/app/docs/errors/CAGE-WORKER-002.md +50 -0
  344. package/templates/app/docs/errors/CAGE-WORKER-003.md +48 -0
  345. package/templates/app/docs/errors/README.md +50 -0
  346. package/templates/app/package.json +3 -3
  347. package/templates/app/packages/contracts/package.json +1 -1
  348. package/templates/app/packages/contracts/src/aggregates/dept/index.ts +10 -10
  349. package/templates/app/packages/contracts/src/aggregates/inventory/index.ts +5 -5
  350. package/templates/app/packages/contracts/src/aggregates/inventory-lock/index.ts +4 -4
  351. package/templates/app/packages/contracts/src/aggregates/purchase-order/index.ts +26 -12
  352. package/templates/app/packages/contracts/src/aggregates/role/index.ts +15 -15
  353. package/templates/app/packages/contracts/src/aggregates/user/index.ts +16 -16
  354. package/templates/app/packages/contracts/src/index.ts +7 -1
  355. package/templates/app/packages/contracts/src/queries/index.ts +2 -2
  356. package/templates/app/packages/domain/package.json +5 -4
  357. package/templates/app/packages/domain/src/index.ts +4 -0
  358. package/templates/app/packages/domain/src/integrations/erp.ts +15 -0
  359. package/templates/app/packages/domain/src/integrations/intelligence.ts +20 -0
  360. package/templates/app/packages/domain/src/modules/inventory/index.ts +1 -0
  361. package/templates/app/packages/domain/src/modules/inventory/inventory.ts +12 -0
  362. package/templates/app/packages/domain/src/modules/purchase/approvals.ts +22 -1
  363. package/templates/app/packages/domain/src/modules/purchase/index.ts +1 -0
  364. package/templates/app/packages/domain/src/modules/purchase/intelligence.test.ts +62 -0
  365. package/templates/app/packages/domain/src/modules/purchase/jobs.ts +5 -0
  366. package/templates/app/packages/domain/src/modules/purchase/purchase-order.test.ts +9 -0
  367. package/templates/app/packages/domain/src/modules/purchase/purchase-order.ts +70 -0
  368. package/templates/app/packages/domain/src/modules/purchase/queries.ts +5 -0
  369. package/templates/app/packages/domain/src/workflows/purchase-inventory.ts +6 -0
  370. package/templates/app/packages/domain/src/workflows/purchase-process.ts +42 -0
  371. package/templates/blank/.dockerignore +2 -0
  372. package/templates/blank/.env.example +10 -0
  373. package/templates/blank/AGENTS.md +49 -9
  374. package/templates/blank/README.md +4 -1
  375. package/templates/blank/_gitignore +1 -0
  376. package/templates/blank/apps/api/package.json +1 -1
  377. package/templates/blank/apps/api/src/main.ts +4 -1
  378. package/templates/blank/apps/api/src/worker.ts +2 -0
  379. package/templates/blank/apps/web/index.html +1 -0
  380. package/templates/blank/apps/web/package.json +7 -3
  381. package/templates/blank/apps/web/src/app/app.tsx +80 -18
  382. package/templates/blank/apps/web/src/app/styles/global.css +90 -0
  383. package/templates/blank/apps/web/src/app/use-session.ts +43 -0
  384. package/templates/blank/apps/web/src/app/workspace-layout.tsx +30 -5
  385. package/templates/blank/apps/web/src/main.tsx +5 -0
  386. package/templates/blank/apps/web/src/modules/auth/index.ts +4 -0
  387. package/templates/blank/apps/web/src/modules/auth/pages/login-page.tsx +18 -1
  388. package/templates/blank/apps/web/src/modules/directory/index.ts +7 -0
  389. package/templates/blank/apps/web/src/modules/directory/pages/user-detail-page.tsx +78 -0
  390. package/templates/blank/apps/web/src/modules/directory/pages/users-page.tsx +93 -0
  391. package/templates/blank/apps/web/src/modules/workspace/index.ts +4 -0
  392. package/templates/blank/apps/web/src/modules/workspace/pages/home-page.tsx +17 -0
  393. package/templates/blank/apps/web/src/shared/lib/error-message.ts +11 -0
  394. package/templates/blank/apps/web/src/shared/lib/navigation.ts +21 -0
  395. package/templates/blank/apps/web/src/shared/ui/brand.tsx +10 -2
  396. package/templates/blank/apps/web/src/shared/ui/page-state.css +47 -0
  397. package/templates/blank/apps/web/src/shared/ui/page-state.tsx +76 -0
  398. package/templates/blank/apps/web/src/shared/ui/require-capability.tsx +34 -0
  399. package/templates/blank/apps/web/vite.config.ts +5 -0
  400. package/templates/blank/deploy/nginx.conf +52 -0
  401. package/templates/blank/docs/ai/README.md +21 -0
  402. package/templates/blank/docs/ai/architecture.md +26 -0
  403. package/templates/blank/docs/ai/commenting.md +203 -0
  404. package/templates/blank/docs/ai/diagnostics.md +80 -0
  405. package/templates/blank/docs/ai/files.md +93 -0
  406. package/templates/blank/docs/ai/intelligence.md +348 -0
  407. package/templates/blank/docs/ai/ontology-context.md +59 -4
  408. package/templates/blank/docs/ai/primitives.md +33 -0
  409. package/templates/blank/docs/ai/project-structure.md +8 -3
  410. package/templates/blank/docs/ai/purchase-example.md +16 -2
  411. package/templates/blank/docs/ai/recipes.md +9 -1
  412. package/templates/blank/docs/ai/routing.md +86 -0
  413. package/templates/blank/docs/ai/troubleshooting.md +5 -0
  414. package/templates/blank/docs/ai/workflow.md +24 -11
  415. package/templates/blank/docs/errors/CAGE-AI-001.md +61 -0
  416. package/templates/blank/docs/errors/CAGE-APPR-001.md +7 -6
  417. package/templates/blank/docs/errors/CAGE-APPR-002.md +2 -2
  418. package/templates/blank/docs/errors/CAGE-APPR-003.md +1 -1
  419. package/templates/blank/docs/errors/CAGE-APPR-004.md +4 -4
  420. package/templates/blank/docs/errors/CAGE-APPR-005.md +1 -1
  421. package/templates/blank/docs/errors/CAGE-APPR-006.md +12 -6
  422. package/templates/blank/docs/errors/CAGE-APPR-007.md +3 -3
  423. package/templates/blank/docs/errors/CAGE-APPR-010.md +5 -5
  424. package/templates/blank/docs/errors/CAGE-AUDIT-001.md +53 -0
  425. package/templates/blank/docs/errors/CAGE-AUTH-001.md +1 -1
  426. package/templates/blank/docs/errors/CAGE-BIZ-001.md +51 -0
  427. package/templates/blank/docs/errors/CAGE-BIZ-002.md +49 -0
  428. package/templates/blank/docs/errors/CAGE-BUDGET-001.md +1 -1
  429. package/templates/blank/docs/errors/CAGE-BUDGET-002.md +1 -1
  430. package/templates/blank/docs/errors/CAGE-BUDGET-003.md +1 -1
  431. package/templates/blank/docs/errors/CAGE-CMD-002.md +1 -1
  432. package/templates/blank/docs/errors/CAGE-CMD-003.md +1 -1
  433. package/templates/blank/docs/errors/CAGE-CONN-001.md +3 -3
  434. package/templates/blank/docs/errors/CAGE-CONN-002.md +1 -1
  435. package/templates/blank/docs/errors/CAGE-CONN-003.md +1 -1
  436. package/templates/blank/docs/errors/CAGE-CONN-004.md +1 -1
  437. package/templates/blank/docs/errors/CAGE-CONN-005.md +1 -1
  438. package/templates/blank/docs/errors/CAGE-CONN-006.md +1 -1
  439. package/templates/blank/docs/errors/CAGE-CONN-007.md +6 -6
  440. package/templates/blank/docs/errors/CAGE-CONN-008.md +5 -5
  441. package/templates/blank/docs/errors/CAGE-CONN-009.md +6 -6
  442. package/templates/blank/docs/errors/CAGE-CONN-010.md +6 -6
  443. package/templates/blank/docs/errors/CAGE-CONN-011.md +1 -1
  444. package/templates/blank/docs/errors/CAGE-CONN-012.md +1 -1
  445. package/templates/blank/docs/errors/CAGE-CONN-013.md +49 -0
  446. package/templates/blank/docs/errors/CAGE-CONN-014.md +48 -0
  447. package/templates/blank/docs/errors/CAGE-CONN-015.md +49 -0
  448. package/templates/blank/docs/errors/CAGE-CREATE-001.md +10 -9
  449. package/templates/blank/docs/errors/CAGE-DECL-001.md +2 -2
  450. package/templates/blank/docs/errors/CAGE-DECL-002.md +7 -6
  451. package/templates/blank/docs/errors/CAGE-DECL-003.md +1 -1
  452. package/templates/blank/docs/errors/CAGE-DECL-004.md +1 -1
  453. package/templates/blank/docs/errors/CAGE-DEP-001.md +2 -2
  454. package/templates/blank/docs/errors/CAGE-DEP-002.md +1 -1
  455. package/templates/blank/docs/errors/CAGE-DEP-003.md +2 -2
  456. package/templates/blank/docs/errors/CAGE-DEP-004.md +1 -1
  457. package/templates/blank/docs/errors/CAGE-DEP-005.md +1 -1
  458. package/templates/blank/docs/errors/CAGE-DIAG-001.md +53 -0
  459. package/templates/blank/docs/errors/CAGE-DLQ-001.md +2 -2
  460. package/templates/blank/docs/errors/CAGE-ENV-001.md +4 -4
  461. package/templates/blank/docs/errors/CAGE-ENV-002.md +51 -0
  462. package/templates/blank/docs/errors/CAGE-ENV-003.md +48 -0
  463. package/templates/blank/docs/errors/CAGE-EVENT-001.md +1 -1
  464. package/templates/blank/docs/errors/CAGE-EVENT-002.md +7 -7
  465. package/templates/blank/docs/errors/CAGE-FIELD-001.md +2 -2
  466. package/templates/blank/docs/errors/CAGE-FIELD-002.md +1 -1
  467. package/templates/blank/docs/errors/CAGE-FIELD-003.md +1 -1
  468. package/templates/blank/docs/errors/CAGE-FIELD-004.md +1 -1
  469. package/templates/blank/docs/errors/CAGE-FILE-001.md +56 -0
  470. package/templates/blank/docs/errors/CAGE-GEN-001.md +2 -2
  471. package/templates/blank/docs/errors/CAGE-GEN-002.md +1 -1
  472. package/templates/blank/docs/errors/CAGE-GEN-003.md +53 -0
  473. package/templates/blank/docs/errors/CAGE-GRANT-001.md +3 -3
  474. package/templates/blank/docs/errors/CAGE-GRANT-002.md +2 -2
  475. package/templates/blank/docs/errors/CAGE-GRANT-003.md +7 -6
  476. package/templates/blank/docs/errors/CAGE-IMPACT-001.md +2 -2
  477. package/templates/blank/docs/errors/CAGE-IMPACT-002.md +52 -0
  478. package/templates/blank/docs/errors/CAGE-INIT-001.md +1 -1
  479. package/templates/blank/docs/errors/CAGE-INIT-002.md +1 -1
  480. package/templates/blank/docs/errors/CAGE-INIT-003.md +2 -2
  481. package/templates/blank/docs/errors/CAGE-INIT-004.md +1 -1
  482. package/templates/blank/docs/errors/CAGE-INIT-005.md +52 -0
  483. package/templates/blank/docs/errors/CAGE-JOB-001.md +1 -1
  484. package/templates/blank/docs/errors/CAGE-JOB-002.md +1 -1
  485. package/templates/blank/docs/errors/CAGE-JOB-003.md +1 -1
  486. package/templates/blank/docs/errors/CAGE-LINT-001.md +1 -1
  487. package/templates/blank/docs/errors/CAGE-MIG-001.md +1 -1
  488. package/templates/blank/docs/errors/CAGE-MIG-002.md +1 -1
  489. package/templates/blank/docs/errors/CAGE-MIG-005.md +1 -1
  490. package/templates/blank/docs/errors/CAGE-NAME-001.md +1 -1
  491. package/templates/blank/docs/errors/CAGE-NAME-002.md +1 -1
  492. package/templates/blank/docs/errors/CAGE-NAME-003.md +3 -3
  493. package/templates/blank/docs/errors/CAGE-NAME-004.md +1 -1
  494. package/templates/blank/docs/errors/CAGE-NAME-005.md +1 -1
  495. package/templates/blank/docs/errors/CAGE-NAME-006.md +1 -1
  496. package/templates/blank/docs/errors/CAGE-ORG-001.md +7 -6
  497. package/templates/blank/docs/errors/CAGE-PAIR-002.md +6 -5
  498. package/templates/blank/docs/errors/CAGE-QUERY-001.md +1 -1
  499. package/templates/blank/docs/errors/CAGE-QUERY-002.md +2 -2
  500. package/templates/blank/docs/errors/CAGE-QUERY-003.md +7 -6
  501. package/templates/blank/docs/errors/CAGE-REACT-001.md +3 -3
  502. package/templates/blank/docs/errors/CAGE-REACT-002.md +1 -1
  503. package/templates/blank/docs/errors/CAGE-REACT-003.md +50 -0
  504. package/templates/blank/docs/errors/CAGE-READS-001.md +9 -6
  505. package/templates/blank/docs/errors/CAGE-REG-001.md +13 -12
  506. package/templates/blank/docs/errors/CAGE-REG-002.md +2 -1
  507. package/templates/blank/docs/errors/CAGE-REG-003.md +1 -1
  508. package/templates/blank/docs/errors/CAGE-REL-001.md +14 -14
  509. package/templates/blank/docs/errors/CAGE-ROUTE-001.md +7 -6
  510. package/templates/blank/docs/errors/CAGE-SCOPE-001.md +1 -1
  511. package/templates/blank/docs/errors/CAGE-SCOPE-002.md +2 -2
  512. package/templates/blank/docs/errors/CAGE-SECRET-001.md +2 -2
  513. package/templates/blank/docs/errors/CAGE-SECRET-002.md +1 -1
  514. package/templates/blank/docs/errors/CAGE-SENS-001.md +5 -5
  515. package/templates/blank/docs/errors/CAGE-SQL-001.md +1 -1
  516. package/templates/blank/docs/errors/CAGE-SQL-002.md +1 -1
  517. package/templates/blank/docs/errors/CAGE-STATE-001.md +3 -3
  518. package/templates/blank/docs/errors/CAGE-STATE-002.md +1 -1
  519. package/templates/blank/docs/errors/CAGE-STATE-003.md +1 -1
  520. package/templates/blank/docs/errors/CAGE-STATE-004.md +1 -1
  521. package/templates/blank/docs/errors/CAGE-STATE-005.md +3 -2
  522. package/templates/blank/docs/errors/CAGE-STATE-010.md +5 -5
  523. package/templates/blank/docs/errors/CAGE-STATE-011.md +5 -5
  524. package/templates/blank/docs/errors/CAGE-STRUCT-001.md +1 -1
  525. package/templates/blank/docs/errors/CAGE-STRUCT-002.md +1 -1
  526. package/templates/blank/docs/errors/CAGE-SYNC-001.md +3 -2
  527. package/templates/blank/docs/errors/CAGE-TEST-001.md +1 -1
  528. package/templates/blank/docs/errors/CAGE-TEST-002.md +50 -0
  529. package/templates/blank/docs/errors/CAGE-TEST-003.md +52 -0
  530. package/templates/blank/docs/errors/CAGE-UNSAFE-001.md +3 -2
  531. package/templates/blank/docs/errors/CAGE-UPGRADE-001.md +2 -2
  532. package/templates/blank/docs/errors/CAGE-WORKER-001.md +48 -0
  533. package/templates/blank/docs/errors/CAGE-WORKER-002.md +50 -0
  534. package/templates/blank/docs/errors/CAGE-WORKER-003.md +48 -0
  535. package/templates/blank/docs/errors/README.md +50 -0
  536. package/templates/blank/docs/examples/purchase-admin/apps/api/src/main.ts +5 -1
  537. package/templates/blank/docs/examples/purchase-admin/apps/api/src/worker.ts +3 -0
  538. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/app.tsx +122 -12
  539. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/styles/global.css +88 -8
  540. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/use-session.ts +43 -0
  541. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/workspace-layout.tsx +58 -19
  542. package/templates/blank/docs/examples/purchase-admin/apps/web/src/main.tsx +5 -0
  543. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +11 -0
  544. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/index.ts +4 -0
  545. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +20 -1
  546. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/index.ts +4 -0
  547. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/pages/login-page.tsx +12 -0
  548. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/index.ts +4 -0
  549. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/pages/inventory-page.tsx +29 -1
  550. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/approval-history.tsx +32 -0
  551. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
  552. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-assistant-context.tsx +17 -0
  553. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.css +6 -0
  554. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.tsx +25 -3
  555. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/index.ts +5 -0
  556. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/lib/presentation.ts +20 -0
  557. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-intelligence.css +15 -0
  558. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +154 -0
  559. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +52 -22
  560. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/workspace/index.ts +5 -0
  561. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/workspace/pages/home-page.tsx +44 -0
  562. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/hooks/use-command.ts +13 -0
  563. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/error-message.ts +9 -0
  564. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/navigation.ts +21 -0
  565. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-markdown.tsx +19 -0
  566. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-panel.css +134 -0
  567. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-panel.tsx +200 -0
  568. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-scope.tsx +72 -0
  569. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/attachment-upload.css +28 -0
  570. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/attachment-upload.tsx +163 -0
  571. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/notice.tsx +7 -0
  572. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-heading.tsx +7 -0
  573. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-state.css +47 -0
  574. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-state.tsx +76 -0
  575. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/require-capability.tsx +34 -0
  576. package/templates/blank/docs/examples/purchase-admin/cage.config.json +9 -0
  577. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/dept/index.ts +10 -10
  578. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory/index.ts +5 -5
  579. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory-lock/index.ts +4 -4
  580. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/purchase-order/index.ts +26 -12
  581. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/role/index.ts +15 -15
  582. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/user/index.ts +16 -16
  583. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/index.ts +7 -1
  584. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/queries/index.ts +2 -2
  585. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/index.ts +4 -0
  586. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/erp.ts +15 -0
  587. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/intelligence.ts +20 -0
  588. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/index.ts +1 -0
  589. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/inventory.ts +12 -0
  590. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approvals.ts +22 -1
  591. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/index.ts +1 -0
  592. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/intelligence.test.ts +62 -0
  593. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/jobs.ts +5 -0
  594. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts +9 -0
  595. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.ts +70 -0
  596. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/queries.ts +5 -0
  597. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-inventory.ts +6 -0
  598. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-process.ts +42 -0
  599. package/templates/blank/package.json +3 -3
  600. package/templates/blank/packages/contracts/package.json +1 -1
  601. package/templates/blank/packages/contracts/src/aggregates/dept/index.ts +10 -10
  602. package/templates/blank/packages/contracts/src/aggregates/role/index.ts +15 -15
  603. package/templates/blank/packages/contracts/src/aggregates/user/index.ts +16 -16
  604. package/templates/blank/packages/contracts/src/index.ts +1 -1
  605. package/templates/blank/packages/contracts/src/queries/index.ts +1 -1
  606. package/templates/blank/packages/domain/package.json +5 -4
  607. package/templates/blank/packages/domain/src/index.ts +2 -1
@@ -4,6 +4,8 @@
4
4
 
5
5
  本页用于把用户的业务描述转成 Cage 项目的可执行修改。按需要读对应配方即可,不需要修改框架内部。
6
6
 
7
+ 需要 AI 审批、业务助理、随页聊天、模型管理或性格配置时,先用 `cage capabilities` 查框架能力,再按[原生智能化指南](intelligence.md)接入。普通业务建模仍按下文声明聚合和命令;接入已有框架服务无需另建一套通用后端。
8
+
7
9
  ## 先把需求落到一张业务表
8
10
 
9
11
  开始编码前,从用户需求或现有业务中确定以下信息。能从上下文确认的直接使用;真正缺失且影响实现的再询问,不要为技术细节反复让用户确认。
@@ -22,7 +24,7 @@
22
24
 
23
25
  按[最小便笺业务](primitives.md)新增 `packages/domain/src/modules/<业务>/<对象>.ts`:字段、范围、不变量、create/update/archive 命令。采用唯一的导出名和必要的 `name` 覆盖,避免 index 的 `export *` 丢失重名符号。
24
26
 
25
- 从模块 index 到 domain 入口导出后运行 check/gen,审查迁移,再在 `apps/web/src/modules/<业务>` 使用生成 contracts 做列表、表单和操作按钮,经模块公开入口接入 app。最后给角色授权并补图谱中文名。完整归属规则见[目录规范](project-structure.md)。不要手写增删改查路由、ORM 实体与 repository,也不要复制框架鉴权代码。
27
+ 从模块 index 到 domain 入口导出后运行 check/gen,审查迁移,再在 `apps/web/src/modules/<业务>` 使用生成 contracts 做列表、详情、表单和操作按钮,经模块公开入口注册到 app 路由。列表和详情都有独立 URL,筛选/分页进入 query,按[浏览器配方](routing.md)检查导航。最后给角色授权并补图谱中文名。完整归属规则见[目录规范](project-structure.md)。不要手写后端增删改查路由、ORM 实体与 repository,也不要复制框架鉴权代码。
26
28
 
27
29
  完成标准:授权用户能创建和修改,范围外数据不可见,归档后的允许行为符合业务要求,生成契约和迁移一致。没有审批需求时不必添加审批;没有外部系统时不必添加连接器。
28
30
 
@@ -42,6 +44,12 @@
42
44
 
43
45
  完成标准:提交生成待办、正确的人审批、越权和自审批拒绝、取消能结束待办、资源配对完整。任意流程设计器、动态 JS 选人、转签/加签不属于当前现成能力,需要明确扩展范围。
44
46
 
47
+ ## 加入 AI 审批或随页助理
48
+
49
+ 先检查 domain 是否已经导出 `ai()`,再按需求修改已有声明或启用一次。AI 审批配置在业务模块的现有 `step` 内,填写 `kind: 'ai'`、审核策略、取证字段/查询与 `handoff`,由 `approval` 绑定自动执行角色和结论命令。业务助理使用框架生成的工具,前端通过 `useAssistant` 与 `useAiPageContext` 接入当前页面;悬浮窗、Markdown 和确认交互由应用实现。
50
+
51
+ 模型地址、协议和密钥通过 `managedModel` 对应的 Admin 配置管理,性格也使用框架现有管理页。先完成系统迁移和必要授权,按[智能化指南](intelligence.md)的接入顺序、SDK 示例和验收步骤验证。分别说明框架支持、应用已启用和真实联调结果;空白模板中的参考代码不参与运行。
52
+
45
53
  ## 增加报表或复杂列表
46
54
 
47
55
  普通分页和详情先使用生成的 list/get;汇总、联表等需求再添加 query。写清 reads、输入 schema,选择参数化 SQL 或 build;只查对应 safe 视图,不为“报表方便”切到管理员连接。
@@ -0,0 +1,86 @@
1
+ # 业务前端路由与浏览器验收
2
+
3
+ [返回学习入口](README.md) · [工程目录](project-structure.md) · [开发步骤](workflow.md)
4
+
5
+ 多页面业务默认使用 React Router 的 BrowserRouter。列表、详情、报表等可独立访问的页面必须有 URL;在 app 中统一组合路由和工作台布局,页面从模块 index.ts 导出。useState 用于弹窗、未提交表单和按钮忙碌状态。筛选、分页和需要分享的选项使用 useSearchParams。
6
+
7
+ 本页对应后续开发版本的模板改进;已发布的 0.2.0 项目需要按本页迁入路由实现,不能只升级依赖就认为旧页面已完成改造。框架包无需维护客户的页面地址。
8
+
9
+ ## 模板中的可运行示例
10
+
11
+ | 页面 | 空白模板 | 采购模板 |
12
+ | --- | --- | --- |
13
+ | 登录 | `/login` | `/login` |
14
+ | 工作台 | `/workspace` | `/workspace` |
15
+ | 列表 | `/directory/users?page=2` | `/procurement/orders?status=draft&page=2` |
16
+ | 详情 | `/directory/users/:id` | `/procurement/orders/:id` |
17
+ | 其他业务 | 按实际需求新增 | `/inventory`、`/approvals` |
18
+ | 404 | 未匹配页面显示“页面不存在” | 同左 |
19
+
20
+ `:id` 替换成真实记录 ID。空白模板的成员目录读取已有 User 组织模型,不注册额外业务、演示表或虚假数据;列表与详情均需要 User.read,数据范围由安全接口落实。采购待办的 businessKey 由 app 映射成采购详情链接,审批模块不直接导入采购模块。
21
+
22
+ 在应用根目录运行 pnpm dev 后访问终端打印的 Web 地址。先在系统管理配置真实账号与权限,再从列表复制某条记录的详情 URL,用于刷新和新标签页测试。
23
+
24
+ ## 新增一项业务页面
25
+
26
+ 1. 在 `apps/web/src/modules/<业务>/pages` 编写列表、详情和表单,从模块 index.ts 导出。详情用 useParams 读取 ID,再用生成的 use对象(id) 获取记录;不要求先打开列表,也不从组件状态或上一页传来的对象直接认定记录存在。
27
+ 2. 在 `apps/web/src/app/app.tsx` 注册列表与详情 Route。放在已有会话守卫和 WorkspaceLayout 之下,使页面通过 Outlet 渲染。新增实际页面时扩展路由表;不要再添加 tab/page useState 来选择整页。
28
+ 3. 导航使用 Link / NavLink;完整页面地址可收藏、复制或新标签页打开。列表筛选和分页通过 useSearchParams 更新,刷新和前进后退恢复相应查询。
29
+ 4. 需要 read 能力的页面用共享 RequireCapability 提供直接访问时的提示;服务端返回 FORBIDDEN 时显示权限提示,NOT_FOUND 显示“记录不存在,或不在当前可访问范围”。401 由会话回调进入登录。不要把 403 当成登录失效,也不要通过放宽读权限解决页面导航问题。
30
+ 5. 用下面的浏览器配方验收,并报告通过、跳过与未执行。构建和 cage verify 通过,只证明其各自检查范围,不能据此宣称路由体验正确。
31
+
32
+ ```tsx
33
+ // app 中的组合片段:页面通过所属模块的 index.ts 导出。
34
+ <Route element={<WorkspaceLayout onLogout={onLogout} />}>
35
+ <Route path="procurement/orders" element={<PurchaseOrdersPage />} />
36
+ <Route path="procurement/orders/:id" element={<PurchaseOrderDetailPage />} />
37
+ </Route>
38
+ ```
39
+
40
+ 片段只展示路由与布局关系。实际代码参考本模板 app.tsx,保留会话守卫、页面 props 和能力提示。`cage/no-manual-routes` 限制手写后端业务 HTTP 路由,不禁止 React Router;前端导航不会生成能力或授予数据访问权。
41
+
42
+ ## 登录后返回原地址
43
+
44
+ 应用启动先 loadMe 恢复会话。未登录访问详情时,守卫使用 replace 导航到 `/login?returnTo=编码后的原路径`,包含 query 和 hash。登录完成再次 replace 回原页面,避免浏览器后退反复落入登录页。
45
+
46
+ `shared/lib/navigation.ts` 的 loginReturnTo 只接受应用内页面,排除外站、登录循环及 API/admin 等服务端入口;不要直接把用户提供的任意 returnTo 交给 location.href。网络错误显示重试界面并保留地址,只有 UNAUTHENTICATED 才要求重新登录。运行中会话过期同样保存当前 URL,并清除上一账号的查询缓存。
47
+
48
+ 前端路由守卫只改善导航与提示。请求仍由 Cage HTTP 和内核检查会话、能力、租户、数据范围与掩码;直接请求接口必须得到相同约束。
49
+
50
+ ## 与系统管理及部署共存
51
+
52
+ | 路径 | 所有者 |
53
+ | --- | --- |
54
+ | `/login`、`/workspace`、客户业务页面 | React Router |
55
+ | `/admin`、`/admin/` 及其脚本/样式 | Cage 系统管理 |
56
+ | `/api/`、`/auth/`、`/hooks/` | Cage HTTP 接口 |
57
+ | `/assets/` | Vite 构建资源 |
58
+
59
+ 进入 `/admin/` 使用普通 `<a href="/admin/">`,让浏览器请求独立管理入口;应用内部页面使用 Link。不要在 React 中注册覆盖 /admin 或 /auth 的页面。Vite 配置已代理 API、认证与管理请求,开发环境支持业务深链接刷新。
60
+
61
+ 生产可选两种部署方式:
62
+
63
+ - **Cage 托管 Web**:API 启动时提供 webDir,标准入口读取 WEB_DIR;将其设置为 apps/web/dist 的绝对路径。模板 Dockerfile 已复制构建产物并设置 WEB_DIR=/app/web。浏览器 GET/HEAD 页面请求可回退到 index.html,React 决定详情或 404;API、管理和丢失资源返回各自错误,不应变成业务首页。
64
+ - **Nginx 托管 Web**:参考项目 `deploy/nginx.conf`,将 root 指向真实 dist,将 API/admin/auth/hooks 代理到 Cage;业务页面使用 try_files 回退到 index.html,/assets/ 缺失时直接 404。示例按 Nginx 与 API 在同一主机、API 端口 3000 编写;按部署拓扑修改上游。仅复制 dist 到没有 SPA 回退的静态服务器会导致详情刷新 404。
65
+
66
+ 上线前用实际反向代理地址验收深链接。Vite 开发环境成功,不代表 Nginx、CDN 或生产容器已配置正确。
67
+
68
+ ## 浏览器验收配方
69
+
70
+ 准备一条有权读取的真实记录和两个测试账号:有 read 能力及范围的账号、没有该能力的账号。测试账号和记录在独立验收环境准备,不修改生产角色。
71
+
72
+ | 操作 | 预期结果 |
73
+ | --- | --- |
74
+ | 复制列表中某条详情 URL,在新标签页粘贴 | 直接加载对应记录,无需先访问列表 |
75
+ | 在详情页刷新 | URL 和记录保持一致 |
76
+ | 列表 → 详情 → 另一页面,再点浏览器后退、前进 | 地址、页面内容与导航高亮同步变化 |
77
+ | 改变列表筛选/分页,复制地址或刷新 | 条件与列表恢复,不返回工作台或第一页 |
78
+ | 未登录打开带 query/hash 的详情 URL | 进入登录;成功后回到原 URL,保留 query/hash |
79
+ | 在业务页使测试会话过期,再触发读取 | 进入登录;重新登录后回到原页面,旧账号缓存不残留 |
80
+ | 无 read 能力账号直接访问有效详情地址 | 显示权限提示,直接请求 API 仍为 403 |
81
+ | 有 read 能力但记录位于范围外 | 显示记录不可用,直接请求 API 为 404,不泄露记录是否存在 |
82
+ | 访问不存在的业务路径 | 显示应用 404,并有返回工作台入口 |
83
+ | 访问 /admin/,以及缺失的 API/JS/CSS | 管理入口独立可用;缺失接口或资源不返回业务 index.html |
84
+ | 在实际部署地址重复深链接和刷新步骤 | 正常加载,浏览器控制台无脚本 MIME 错误 |
85
+
86
+ 验收记录写明模板、地址、操作和结果。模拟 API 的浏览器检查可以证明导航行为;真实权限、范围和数据库链路需要相应集成验收,二者分别报告。
@@ -4,6 +4,8 @@
4
4
 
5
5
  先保留完整诊断的 code、源码位置、reason/fix、requestId 或 outboxId。检查所在阶段,再修复原因;不要通过改业务状态、给全局权限、注释约束或禁用 lint 消除现象。
6
6
 
7
+ 先执行 `pnpm exec cage doctor` 查看各阶段证据;异步动作按 requestId/outboxId/业务对象用 `cage timeline` 关联实际执行记录。能力、范围、调用身份或额度不清楚时,有权诊断的管理员可使用 `cage explain`,不会执行目标命令。完整参数与权限见[诊断指南](diagnostics.md)。
8
+
7
9
  ## 按现象定位
8
10
 
9
11
  | 现象 | 先查什么 | 常见原因 |
@@ -15,6 +17,9 @@
15
17
  | 详情 404 | 记录 id、租户和数据范围 | 不存在或在范围外;不能仅凭 404 断言被删除 |
16
18
  | 列表为空 | read 能力、范围与相应字段 | 默认本人范围、无 owner 字段或部门不匹配 |
17
19
  | 电话看不到明文 | sensitive 标注、unmask 能力 | 默认掩码是正常安全行为 |
20
+ | 有明文能力但读取报 CAGE-AUDIT-001 | requestId、审计库可用性与权限 | 可靠审计未成功,框架拒绝交付结果 |
21
+ | 生产服务拒绝启动 | CAGE-ENV-002/003、Cookie 密钥与 bootstrap 参数 | 关键配置不合格,或试图在日常启动时隐式初始化 |
22
+ | 任务时间线有 CAGE-WORKER-002 | API/worker 版本、注册指纹和消费者清单 | 旧进程或必要消费者缺失,不能把 done 当作已执行 |
18
23
  | 提交成功但无待办 | worker、outbox/死信、审批路由 | 未投递、缺审批人、没有匹配的绑定/路由 |
19
24
  | 已批准但 ERP 单号未回写 | worker、同步记录、死信、环境/fake | 密钥/白名单/响应错误,或异步还未完成 |
20
25
  | 已取消但锁未释放 | 释放事件、反应、死信 | 先前消息阻塞、map 条件不匹配或遗漏释放 |
@@ -1,6 +1,6 @@
1
1
  # 开发步骤与交付要求
2
2
 
3
- [返回学习入口](README.md) · [范例导读](purchase-example.md)
3
+ [返回学习入口](README.md) · [范例导读](purchase-example.md) · [详细中文注释](commenting.md)
4
4
 
5
5
  本页命令在**应用根目录**执行,除非注明“框架根目录”。使用项目安装的 CLI:`pnpm exec cage ...`。项目脚本可简写为 `pnpm gen / pnpm migrate / pnpm dev / pnpm verify`;不要假定机器已全局安装 cage。
6
6
 
@@ -18,39 +18,44 @@ pnpm build:app
18
18
  pnpm gen
19
19
  # 审查 db/migrations 中的迁移草稿,再执行:
20
20
  pnpm migrate
21
+ # 迁移后显式初始化组织,目标是新的受限凭据文件;父目录需存在。
22
+ pnpm exec cage bootstrap --credentials-file .cage/admin-credentials.json
21
23
  pnpm dev
22
24
  ```
23
25
 
24
26
  `init` 自动创建独立账号与随机密码,填写 APP/READ/MIGRATE 连接和 Cookie 密钥,成功后删除文件中的管理员连接。三个连接使用同一数据库。已有 Cage 集群账号时复用原连接,不能重置其他应用的账号密码。生产环境可由平台直接提供账号连接,不必执行本地 init。
25
27
 
28
+ `bootstrap` 独立初始化组织,不自动授予业务能力。管理员凭据只进入新的受限文件,不进入服务控制台;已有用户时不重置。交付后移除凭据文件。日常 API 启动不初始化组织;生产缺少合格 Cookie 密钥会拒绝启动。具体文件权限与诊断用法见[能力发现与状态诊断](diagnostics.md)。
29
+
26
30
  `.env.example` 是配置说明,`.env` 是本机私密配置,二者不混用。CLI 自动加载应用 `.env`,部署环境同名变量优先。API 和 worker 启动需重启后读取变更;不要输出整个 `.env` 排障。
27
31
 
28
32
  框架仓库首次先在根目录 `pnpm install`、`pnpm build`,再进入 `examples/purchase-admin` 配置。`dev` 不自动执行迁移;生成新迁移后要审查并显式运行 migrate。
29
33
 
30
34
  ## 做一项业务修改
31
35
 
32
- 1. 读 AGENTS.md 和[目录规范](project-structure.md),确认需求落在领域模块、前端模块、组织配置还是框架。先 `pnpm exec cage context "需求关键词"`,按需 `graph search/inspect/path` 定位,确认候选入口后阅读对应源码、范例与测试;证据和边界见[本体上下文指南](ontology-context.md)。发现能力缺口先说明,不编造 API。
33
- 2. 涉及已存在业务含义变化时,**修改前**保存基线。已有 Git 可用提交,也可保存独立本体图文件。
34
- 3. 在所属领域模块写字段、状态、不变量和命令输入;再实现 handler、事件、查询与审批。跨模块反应放 workflows,第三方协议放 integrations。从模块 index 到 domain 总入口逐层导出,避免跨文件 export 名冲突。
36
+ 1. 读 AGENTS.md、[目录规范](project-structure.md)和[详细中文注释规范](commenting.md),确认需求落在领域模块、前端模块、组织配置还是框架。先 `pnpm exec cage context "需求关键词"`,按需 `graph search/inspect/path` 定位,确认候选入口后阅读对应源码、范例与测试;证据和边界见[本体上下文指南](ontology-context.md)。发现能力缺口先说明,不编造 API。
37
+ 2. 涉及已存在业务含义变化时,**修改前**运行 `pnpm exec cage snapshot save before-change` 保存命名基线;也可使用真实 Git 提交或独立本体图文件。
38
+ 3. 在所属领域模块写字段、状态、不变量和命令输入;再实现 handler、事件、查询与审批。跨模块反应放 workflows,第三方协议放 integrations。从模块 index 到 domain 总入口逐层导出,避免跨文件 export 名冲突。同步编写详细中文注释:文件职责与调用链、导出声明及输入字段、权限/状态/reads/事件/事务、关键步骤和失败边界;涉及已有行为时补齐受影响的上下游说明。
35
39
  4. `pnpm exec cage check` 检查声明和图规则;`pnpm gen` 更新契约与迁移草稿。聚合和命令填写中文 `description`,需要覆盖时补 `cage.config.json` 的 `graph.labels`(如 `aggregate:Note`、`command:Note.archive`、`capability:Note.export`)。这些名称同时用于图谱和 `/admin` 授权界面;修改后重启 API。不重命名实际能力点来实现翻译。在图谱确认连接与资源生命周期。
36
40
  5. 审查数据库变更,特别是非空字段、数据回填、删列和索引。已执行的迁移不可改写。需要落库时显式 `pnpm migrate`。
37
- 6. 页面和表单放 `apps/web/src/modules/<业务>`,从模块公开入口接入 app 导航;依赖生成 contracts,处理失败结果。新增能力由管理员授权,页面按钮可用 `useCan` 控制。
38
- 7. 补足重要业务反例并运行相关验证。提交源声明、契约和审查过的迁移,报告跳过及未执行项。
41
+ 6. 页面和表单放 `apps/web/src/modules/<业务>`,从模块公开入口接入 app 的 URL 路由;依赖生成 contracts,处理失败结果。列表、详情等多页面使用 React Router,筛选和分页进入 URL;组件状态只管理页面内临时交互。新增能力由管理员授权,页面按钮可用 `useCan` 控制。按[路由与浏览器验收](routing.md)检查直达、刷新、前进后退和登录回跳。
42
+ 7. 补足重要业务反例并运行相关验证;测试解释夹具目的、所保护的规则和覆盖边界。按注释规范审查本次 diff,核对页面、组件/hooks、类型字段、脚本副作用和恢复流程的说明是否完整准确。提交源声明、契约和审查过的迁移,报告跳过及未执行项。
39
43
 
40
44
  ### 如何保存和比较基线
41
45
 
42
46
  ```powershell
43
- # 修改前执行,避免后续 gen/analyze 覆盖唯一的旧图。
44
- pnpm exec cage analyze
45
- Copy-Item .cage/ontology.json .cage/before-change.json
47
+ # 修改前执行;同名快照不会覆盖。
48
+ pnpm exec cage snapshot save before-change
46
49
  # 修改 domain 后执行:
47
- pnpm exec cage impact --base-file .cage/before-change.json
50
+ pnpm exec cage impact --snapshot before-change
48
51
  # 或与真实可用的 Git 提交比较;下面的 main 应按仓库实际情况替换。
49
52
  pnpm exec cage impact --base main
50
53
  ```
51
54
 
52
55
  基线文件要保留到验收结束。影响分析用于找到相关命令、约束、审批、查询和候选测试,不能当作不需验证的证明。没有 Git 提交时不要为了让命令成功而擅自创建/推送远端。
53
56
 
57
+ `context` 和图谱查询只返回查询结果,不更新当前图文件或命名基线;`analyze/gen` 更新当前图。快照来源时间、版本与图指纹随报告保存。
58
+
54
59
  ## 常见需求的具体改法
55
60
 
56
61
  | 需求 | 做法 | 必查项 |
@@ -82,6 +87,8 @@ if (!result.ok) {
82
87
 
83
88
  对自定义 HTTP 协议能力使用 `@yss123/cage-client`;它负责会话、CSRF 和类型化结果。需让多个提交共享幂等键时,按当前客户端接口显式传递同一次业务操作的 key,并在页面阻止重复进行中的提交。生成契约的方法签名以 `packages/contracts/src` 为准,不假设每个命令方法都支持自定义 options。
84
89
 
90
+ 生成方法最后的请求选项支持 `signal/timeoutMs/idempotencyKey`。底层返回 `CageResult`;`useCageCommand` 成功返回业务数据、失败抛出 `CageCommandError`,因此 mutation 的 `isSuccess` 表示业务成功。退出、401、切换账号时订阅 `client.subscribe` 取消用户查询并清除应用缓存,范例 `apps/web/src/app/use-session.ts` 展示了接法。
91
+
85
92
  ### 导入和导出属于业务页面
86
93
 
87
94
  框架提供通用异步接口与任务查询,页面放在哪里由具体业务决定。
@@ -98,6 +105,9 @@ CSV 编码、限制、SDK 与完整接口见本项目自带的[业务页导入
98
105
  | 命令 | 用途 | 主要输出 |
99
106
  | --- | --- | --- |
100
107
  | `pnpm exec cage analyze` | 抽取显式声明与源码位置 | `.cage/ontology.json` |
108
+ | `pnpm exec cage capabilities 关键词 --format json` | 查询当前安装版本的公开能力 | 公开签名、声明位置和学习入口 |
109
+ | `pnpm exec cage doctor` | 统一核对注册、生成、构建及可用运行证据 | pass / fail / unknown 与下一步;见[诊断指南](diagnostics.md) |
110
+ | `pnpm exec cage snapshot save 名称` | 保存不可覆盖的命名基线 | `.cage/snapshots`;配合 `impact --snapshot 名称` |
101
111
  | `pnpm exec cage check` | 静态检查、注册表与图规则 | 终端 `code/at/reason/fix` |
102
112
  | `pnpm exec cage graph` | 启动中文本体图谱 | 默认 `http://127.0.0.1:15418`,按终端地址访问 |
103
113
  | `pnpm exec cage context "需求或节点"` | 开发前取得相关子图、原因、源码与候选验证 | 默认终端 Markdown;`--format json --out .cage/context.json` 保存结构化报告 |
@@ -117,8 +127,10 @@ CSV 编码、限制、SDK 与完整接口见本项目自带的[业务页导入
117
127
  ## 验证要与改动匹配
118
128
 
119
129
  - 文档、文案、可逆的小改动:检查链接、格式、资料分发;不需要重复运行全套数据库测试。
130
+ - 所有源码变更:按[注释交付清单](commenting.md#交付前逐项核对)人工核对中文职责、接口与关键流程说明;静态检查不能替代注释准确性检查。仅补注释时不新增复述实现的测试、不改写已执行迁移。
120
131
  - 命令/约束/反应变化:针对成功路径及真正的风险增加用例,如越权拒绝、额度边界、资源释放、同事务回滚。不要写只复述实现的测试。
121
132
  - 领域结构变化:check、gen、生成一致性、类型检查;有数据库影响时在独立测试库验证迁移和读写。
133
+ - 页面或导航变化:构建后按[浏览器配方](routing.md)实际操作,包含深链接、新标签页、刷新、前进后退、登录回跳、无权限和 404。check/verify 不自动执行浏览器验收;未操作时明确报告未执行,不能写“页面功能完整”。
122
134
  - 发布前:按项目要求执行完整 verify/build/test,核对分发包。没有执行的项目明确写出原因。
123
135
 
124
136
  测试使用真实 PostgreSQL。`CAGE_TEST_DATABASE_URL` 供独立测试集群使用,测试工具会准备角色和临时数据库;不要指向业务/生产集群。没有设置时 testkit 可使用内嵌的真实 PostgreSQL,这与 dev 的固定已有库流程不同。
@@ -133,7 +145,8 @@ CSV 编码、限制、SDK 与完整接口见本项目自带的[业务页导入
133
145
  先用 cage context 查询现有业务,必要时 graph inspect/path,确认候选与关系后阅读实现。
134
146
  说明字段、状态、能力与范围、事件/资源的影响,再修改 domain、生成契约和迁移草稿、接入业务页面。
135
147
  使用真实公开 API;不要手写业务路由、直接写表或新增本地数据库生命周期命令。
148
+ 按 docs/ai/commenting.md 给新建和修改代码写详细中文注释,覆盖职责、API/字段、步骤、原因和边界,同步修正相关上下游说明。
136
149
  按改动运行必要检查,报告通过/跳过/未执行项和需要的管理员配置。
137
150
  ```
138
151
 
139
- 交付说明至少包含行为变化、源文件、生成物/迁移、角色授权需求、验证结果,以及尚未做的真实外部联调。遇到错误先修复根因;不把待办未生成、任务已接受或 fake 成功写成业务全部完成。
152
+ 交付说明至少包含行为变化、源文件、生成物/迁移、角色授权需求、详细中文注释覆盖的主要职责与边界、验证结果,以及尚未做的真实外部联调。注释未覆盖项如实说明,不能用聊天中的解释代替源码注释。遇到错误先修复根因;不把待办未生成、任务已接受或 fake 成功写成业务全部完成。
@@ -0,0 +1,61 @@
1
+ # CAGE-AI-001:智能运行时声明无效
2
+
3
+ [返回错误码册](README.md) · [业务排错](../ai/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:领域声明 / 模型与运行预算配置。
10
+
11
+ 模型引用未配置、重复启用 AI 运行时,或上下文预算、重试、并发、超时、队列参数非法。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. 在 domain 顶层导出一个 ai({ models, assistant }) 声明,审批 step 的 model 引用同名模型。
16
+ 2. 预算与并发为正整数;maxModelRetries 为 0 至 8,context.maxTools 最多 128(包含通用工具)。并发最多 32,单次运行 timeoutMs 最多 300000。API 与 worker 使用相同声明和模型配置。
17
+
18
+ ## 正例
19
+
20
+ ```text
21
+ ai({ models: { main: provider }, assistant: { model: 'main', limits: { maxSteps: 8 } } })
22
+ ```
23
+
24
+ ## 反例
25
+
26
+ ```text
27
+ ai({ models: {}, assistant: { model: 'missing', limits: { maxSteps: 0 } } })
28
+ ```
29
+
30
+ ## 修复后验证
31
+
32
+ 重跑 cage check、迁移与相关测试,再以真实角色验证助理和审批;fake 成功不代表真实模型联调完成。
33
+
34
+ ## 框架内的检查位置
35
+
36
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
37
+
38
+ - `packages/ai/src/index.ts:54`
39
+ - `packages/ai/src/index.ts:61`
40
+ - `packages/ai/src/index.ts:74`
41
+ - `packages/ai/src/index.ts:82`
42
+ - `packages/ai/src/index.ts:86`
43
+ - `packages/ai/src/index.ts:88`
44
+ - `packages/ai/src/index.ts:89`
45
+ - `packages/ai/src/index.ts:90`
46
+ - `packages/ai/src/index.ts:92`
47
+ - `packages/ai/src/index.ts:94`
48
+ - `packages/ai/src/index.ts:96`
49
+ - `packages/ai/src/index.ts:126`
50
+ - `packages/ai/src/index.ts:130`
51
+ - `packages/ai/src/index.ts:132`
52
+
53
+ 实现片段(位置随框架版本更新):
54
+
55
+ ```ts
56
+ /**
57
+ * 校验扩展唯一性与审批模型引用,无效配置以 CAGE-AI-001 拒绝。
58
+ */
59
+ validate(registry: Registry): void;
60
+ }
61
+ ```
@@ -34,14 +34,15 @@ routable: ['managerName'] // 聚合没有该字段
34
34
 
35
35
  以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
36
 
37
- - `packages/kernel/src/primitives/flow.ts:134`
37
+ - `packages/approval/src/route.ts:159`
38
+ - `packages/kernel/src/primitives/flow.ts:245`
38
39
 
39
40
  实现片段(位置随框架版本更新):
40
41
 
41
42
  ```ts
42
- for (const f of def.routable) {
43
- if (!(f in agg.fields)) throw declError('CAGE-APPR-001', `可路由字段 ${agg.name}.${f} 不存在`);
44
- }
45
- for (const c of [def.onApproved, def.onRejected]) {
46
- if (c.agg !== agg) throw declError('CAGE-APPR-002', `审批结论命令必须属于 ${agg.name}`);
43
+ for (const field of s.context.fields) if (!binding.agg.fields[field] || binding.agg.fields[field].isHidden)
44
+ throw declError('CAGE-APPR-001', `AI 上下文字段 ${field} 不存在或不可公开`);
45
+ for (const query of s.context.queries ?? []) if (!registry.queries.some(q => q.name === query))
46
+ throw declError('CAGE-REG-001', `AI 步骤引用的查询 ${query} 未导出`);
47
+ }
47
48
  ```
@@ -34,12 +34,12 @@ PurchaseOrder 的审批绑定使用 approvePurchaseOrder 命令
34
34
 
35
35
  以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
36
 
37
- - `packages/kernel/src/primitives/flow.ts:137`
37
+ - `packages/kernel/src/primitives/flow.ts:248`
38
38
 
39
39
  实现片段(位置随框架版本更新):
40
40
 
41
41
  ```ts
42
- for (const c of [def.onApproved, def.onRejected]) {
42
+ for (const c of [def.onApproved, def.onRejected, ...(def.onReturned ? [def.onReturned] : [])]) {
43
43
  if (c.agg !== agg) throw declError('CAGE-APPR-002', `审批结论命令必须属于 ${agg.name}`);
44
44
  if (!c.invokedBy.includes('process')) {
45
45
  throw declError('CAGE-APPR-003', `审批结论命令必须声明 invokedBy: 'process'`);
@@ -34,7 +34,7 @@ invokedBy: 'user' // 用作审批结论
34
34
 
35
35
  以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
36
 
37
- - `packages/kernel/src/primitives/flow.ts:139`
37
+ - `packages/kernel/src/primitives/flow.ts:250`
38
38
 
39
39
  实现片段(位置随框架版本更新):
40
40
 
@@ -34,14 +34,14 @@ approval(..., { process: 'po-approval', ... }) 与 route('po-approval', ...)
34
34
 
35
35
  以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
36
 
37
- - `packages/approval/src/bridge.ts:8`
37
+ - `packages/approval/src/bridge.ts:14`
38
38
 
39
39
  实现片段(位置随框架版本更新):
40
40
 
41
41
  ```ts
42
42
  const binding = k.registry.approvalByProcess(r.process);
43
43
  if (!binding) throw new Error(`[CAGE-APPR-004] 没有流程 ${r.process} 的审批绑定`);
44
- const cmd = r.outcome === 'approved' ? binding.a.onApproved : binding.a.onRejected;
45
- const ctx = k.processCtx({
46
- process: r.process,
44
+ const cmd = r.outcome === 'approved' ? binding.a.onApproved : r.outcome === 'returned' ? binding.a.onReturned : binding.a.onRejected;
45
+ if (!cmd) throw new Error('[CAGE-APPR-006] 审批未绑定退回修改命令');
46
+ let ctx: Ctx;
47
47
  ```
@@ -34,7 +34,7 @@ route('采购审批', nodes)
34
34
 
35
35
  以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
36
 
37
- - `packages/approval/src/route.ts:96`
37
+ - `packages/approval/src/route.ts:126`
38
38
 
39
39
  实现片段(位置随框架版本更新):
40
40
 
@@ -34,14 +34,20 @@ route('po-approval', [])
34
34
 
35
35
  以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
36
 
37
- - `packages/approval/src/route.ts:97`
37
+ - `packages/approval/src/bridge.ts:16`
38
+ - `packages/approval/src/engine.ts:70`
39
+ - `packages/approval/src/route.ts:66`
40
+ - `packages/approval/src/route.ts:68`
41
+ - `packages/approval/src/route.ts:127`
42
+ - `packages/approval/src/route.ts:154`
43
+ - `packages/approval/src/route.ts:156`
38
44
 
39
45
  实现片段(位置随框架版本更新):
40
46
 
41
47
  ```ts
42
- if (!/^[a-z][a-z0-9-]*$/.test(process)) throw declError('CAGE-APPR-005', `流程名 ${process} 必须是小写短横线`);
43
- if (nodes.length === 0) throw declError('CAGE-APPR-006', `流程 ${process} 至少需要一个步骤`);
44
- const fields = new Set<string>();
45
- for (const n of nodes) {
46
- const steps = n.kind === 'step' ? [n] : n.steps;
48
+ const cmd = r.outcome === 'approved' ? binding.a.onApproved : r.outcome === 'returned' ? binding.a.onReturned : binding.a.onRejected;
49
+ if (!cmd) throw new Error('[CAGE-APPR-006] 审批未绑定退回修改命令');
50
+ let ctx: Ctx;
51
+ if (r.lastApprover) {
52
+ const user = await k.contextFor(r.lastApprover, r.tenantId);
47
53
  ```
@@ -37,14 +37,14 @@ deptLeader('deptId'):给该部门设置负责人;role('finance'):给实际
37
37
 
38
38
  以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
39
39
 
40
- - `packages/approval/src/engine.ts:64`
40
+ - `packages/approval/src/engine.ts:81`
41
41
 
42
42
  实现片段(位置随框架版本更新):
43
43
 
44
44
  ```ts
45
45
  if (who.length === 0) {
46
- throw new Error(`[CAGE-APPR-007] 流程 ${this.route.process} 第 ${index + 1} 步「${s.title}」找不到审批人,请在 /admin 配置部门负责人或角色`);
46
+ throw new Error(`[CAGE-APPR-007] 流程 ${this.route.process} 第 ${index + 1} 步「${title}」找不到审批人,请在 /admin 配置部门负责人或角色`);
47
47
  }
48
48
  for (const assignee of new Set(who)) {
49
- await tx.insertInto('flow.approval_task').values({ instance_id: instanceId, tenant_id: tenantId, step: index, title: s.title, assignee }).execute();
49
+ await tx.insertInto('flow.approval_task').values({ instance_id: instanceId, tenant_id: tenantId, step: index, title, assignee }).execute();
50
50
  ```
@@ -34,15 +34,15 @@ approve 被 poApproval.onApproved 引用,或 acquireLock 被 lockOnApprove 引
34
34
 
35
35
  以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
36
 
37
- - `packages/cli/src/rules.ts:140`
38
- - `packages/cli/src/rules.ts:149`
37
+ - `packages/cli/src/rules.ts:175`
38
+ - `packages/cli/src/rules.ts:189`
39
39
 
40
40
  实现片段(位置随框架版本更新):
41
41
 
42
42
  ```ts
43
43
 
44
44
  /** CAGE-APPR-010:invokedBy 为 process 的命令必须有审批绑定或反应调用它,否则没有人能调用 */
45
- export function checkProcessCommands(g: Ontology): Finding[] {
46
- const { into } = index(g);
47
- const findings: Finding[] = [];
45
+ /**
46
+ * 检查仅流程/外部可调用的命令是否有声明调用入口。
47
+ * @param g 当前图。
48
48
  ```
@@ -0,0 +1,53 @@
1
+ # CAGE-AUDIT-001:可靠读取审计失败
2
+
3
+ [返回错误码册](README.md) · [业务排错](../ai/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:安全读侧 / 查询。
10
+
11
+ 敏感明文读取,或声明 audit.purpose 的查询,无法完成交付前的审计写入。请求拒绝交付结果。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. 凭 requestId 检查审计存储、写账号权限和数据库可用性;修复后重新读取。
16
+ 2. 不要吞掉审计异常、去除敏感声明或改用基表绕过审计。查询只声明目的,不把敏感输入放进目的文本。
17
+
18
+ ## 正例
19
+
20
+ ```text
21
+ query('report', { reads: [Order], audit: { purpose: '月度核对' }, /* input/sql */ })
22
+ ```
23
+
24
+ ## 反例
25
+
26
+ ```text
27
+ 审计写入失败后继续返回敏感明文
28
+ ```
29
+
30
+ ## 修复后验证
31
+
32
+ 修复审计存储后重新读取,确认有权交付的数据与相应审计均完成。
33
+
34
+ ## 框架内的检查位置
35
+
36
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
37
+
38
+ - `packages/kernel/src/read.ts:136`
39
+ - `packages/kernel/src/read.ts:137`
40
+ - `packages/kernel/src/read.ts:284`
41
+ - `packages/kernel/src/read.ts:285`
42
+ - `packages/kernel/src/transfer/index.ts:176`
43
+ - `packages/kernel/src/transfer/index.ts:177`
44
+
45
+ 实现片段(位置随框架版本更新):
46
+
47
+ ```ts
48
+ }); } catch {
49
+ this.k.log.error({ code: 'CAGE-AUDIT-001', aggregate: agg.name, kind, requestId: ctx.requestId }, '读取审计失败,未交付数据');
50
+ throw cageError('INTERNAL', { diagnostic: 'CAGE-AUDIT-001', phase: 'audit', operation: kind, retryable: true });
51
+ }
52
+ }
53
+ ```
@@ -34,7 +34,7 @@ HTTP 无法取得 OIDC issuer 的发现文档,或远端返回非成功状态
34
34
 
35
35
  以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
36
 
37
- - `packages/http/src/oidc.ts:20`
37
+ - `packages/http/src/oidc.ts:25`
38
38
 
39
39
  实现片段(位置随框架版本更新):
40
40
 
@@ -0,0 +1,51 @@
1
+ # CAGE-BIZ-001:业务流程声明无效
2
+
3
+ [返回错误码册](README.md) · [业务排错](../ai/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:声明加载 / 图规则。
10
+
11
+ 流程或板块标识重复、名称说明缺失、入口/连线/结束阶段无效,或引用的真实声明未从 domain 导出。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. 使用 businessProcess 声明阅读规格,填写流程、板块、阶段及连线说明;阶段引用已导出的真实业务声明。
16
+ 2. 主对象使用聚合引用;相同板块 ID 的名称和说明保持一致。流程不调度命令,也不授予权限。
17
+
18
+ ## 正例
19
+
20
+ ```text
21
+ export const orderFlow = businessProcess('order-flow', { /* 完整阶段和转移,均引用真实声明 */ });
22
+ ```
23
+
24
+ ## 反例
25
+
26
+ ```text
27
+ transitions: [{ from: 'draft', to: 'missing', mode: 'automatic', label: '继续' }] // missing 阶段不存在
28
+ ```
29
+
30
+ ## 修复后验证
31
+
32
+ 重跑 cage check,再在 cage graph 中检查主线、分支、关联和实现代码;运行行为仍需相应业务回归。
33
+
34
+ ## 框架内的检查位置
35
+
36
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
37
+
38
+ - `packages/kernel/src/primitives/business-process.ts:132`
39
+ - `packages/kernel/src/registry.ts:253`
40
+ - `packages/kernel/src/registry.ts:256`
41
+ - `packages/kernel/src/registry.ts:259`
42
+
43
+ 实现片段(位置随框架版本更新):
44
+
45
+ ```ts
46
+ ): BusinessProcess {
47
+ const invalid = (reason: string): never => { throw declError('CAGE-BIZ-001', `${name}:${reason}`); };
48
+ const identifier = (value: string) => /^[a-z][a-z0-9-]*$/.test(value);
49
+ const text = (value: string) => typeof value === 'string' && value.trim().length > 0;
50
+ if (!identifier(name) || !identifier(def.area.id)) invalid('流程与板块标识须使用小写短横线格式');
51
+ ```
@@ -0,0 +1,49 @@
1
+ # CAGE-BIZ-002:业务流程与真实声明不一致
2
+
3
+ [返回错误码册](README.md) · [业务排错](../ai/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:声明加载 / 图规则。
10
+
11
+ 阶段不可达或无法结束,自动连线缺少真实触发链,人工/等待方式与目标入口不符,同对象状态不相接,或关联对象缺少实现依据。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. 自动连线必须有 emits、事件触发、反应目标、审批结论或外部成功回写支持;reads、字段关联和状态相接不能证明自动调用。
16
+ 2. 人工下一步使用用户可调用的命令,独立通知或调度使用 wait;核对前后命令的状态约束。
17
+ 3. 关联的 via 引用本阶段实际可触发的声明,且该声明确实读取、写入或引用目标对象。补齐入口到所有阶段,以及各阶段到结束结果的路径。
18
+
19
+ ## 正例
20
+
21
+ ```text
22
+ { from: 'draft', to: 'submit', mode: 'manual', label: '申请人提交' } // submit 允许 user 且状态相接
23
+ ```
24
+
25
+ ## 反例
26
+
27
+ ```text
28
+ { from: 'create', to: 'submit', mode: 'automatic', label: '自动提交' } // 只有状态相接,没有实际触发
29
+ ```
30
+
31
+ ## 修复后验证
32
+
33
+ 重跑 cage check,再在 cage graph 中检查主线、分支、关联和实现代码;运行行为仍需相应业务回归。
34
+
35
+ ## 框架内的检查位置
36
+
37
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
38
+
39
+ - `packages/cli/src/process-rules.ts:50`
40
+
41
+ 实现片段(位置随框架版本更新):
42
+
43
+ ```ts
44
+ const fail = (node: ViewNode, reason: string, fix: string) => findings.push({
45
+ code: 'CAGE-BIZ-002', at: node.file ? `${node.file}:${node.line}` : node.id, reason, fix,
46
+ });
47
+ const actual = (start: string) => reachable(start, key => causalSuccessors(model, key));
48
+ const involving = (start: string, target: string) => {
49
+ ```