@yss123/cage-cli 0.2.0 → 0.3.1

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 (629) 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/approval-tree.d.ts +88 -0
  8. package/dist/approval-tree.js +18 -0
  9. package/dist/approval-tree.js.map +1 -0
  10. package/dist/baseline.d.ts +8 -0
  11. package/dist/baseline.js +13 -0
  12. package/dist/baseline.js.map +1 -1
  13. package/dist/bootstrap.d.ts +20 -0
  14. package/dist/bootstrap.js +75 -0
  15. package/dist/bootstrap.js.map +1 -0
  16. package/dist/budget.d.ts +7 -0
  17. package/dist/budget.js +49 -5
  18. package/dist/budget.js.map +1 -1
  19. package/dist/capabilities.d.ts +38 -0
  20. package/dist/capabilities.js +148 -0
  21. package/dist/capabilities.js.map +1 -0
  22. package/dist/config.d.ts +31 -2
  23. package/dist/config.js +22 -0
  24. package/dist/config.js.map +1 -1
  25. package/dist/context.d.ts +14 -0
  26. package/dist/context.js +35 -2
  27. package/dist/context.js.map +1 -1
  28. package/dist/create-prompt.d.ts +7 -0
  29. package/dist/create-prompt.js +12 -0
  30. package/dist/create-prompt.js.map +1 -1
  31. package/dist/create.d.ts +21 -1
  32. package/dist/create.js +23 -1
  33. package/dist/create.js.map +1 -1
  34. package/dist/derive.d.ts +23 -0
  35. package/dist/derive.js +40 -0
  36. package/dist/derive.js.map +1 -1
  37. package/dist/dev.d.ts +6 -0
  38. package/dist/dev.js +11 -0
  39. package/dist/dev.js.map +1 -1
  40. package/dist/doctor.d.ts +98 -0
  41. package/dist/doctor.js +93 -0
  42. package/dist/doctor.js.map +1 -0
  43. package/dist/env.d.ts +6 -0
  44. package/dist/env.js +11 -0
  45. package/dist/env.js.map +1 -1
  46. package/dist/findings.d.ts +27 -0
  47. package/dist/findings.js +20 -0
  48. package/dist/findings.js.map +1 -1
  49. package/dist/gen/contracts.d.ts +28 -0
  50. package/dist/gen/contracts.js +52 -12
  51. package/dist/gen/contracts.js.map +1 -1
  52. package/dist/gen/index.d.ts +26 -0
  53. package/dist/gen/index.js +69 -1
  54. package/dist/gen/index.js.map +1 -1
  55. package/dist/gen/zod-code.d.ts +42 -0
  56. package/dist/gen/zod-code.js +178 -16
  57. package/dist/gen/zod-code.js.map +1 -1
  58. package/dist/graph-approvals.d.ts +70 -0
  59. package/dist/graph-approvals.js +93 -0
  60. package/dist/graph-approvals.js.map +1 -0
  61. package/dist/graph-business.d.ts +135 -0
  62. package/dist/graph-business.js +404 -0
  63. package/dist/graph-business.js.map +1 -0
  64. package/dist/graph-command.d.ts +17 -0
  65. package/dist/graph-command.js +21 -0
  66. package/dist/graph-command.js.map +1 -1
  67. package/dist/graph-model.d.ts +44 -0
  68. package/dist/graph-model.js +36 -3
  69. package/dist/graph-model.js.map +1 -1
  70. package/dist/graph-presentation.d.ts +16 -0
  71. package/dist/graph-presentation.js +10 -1
  72. package/dist/graph-presentation.js.map +1 -1
  73. package/dist/graph-query.d.ts +95 -0
  74. package/dist/graph-query.js +62 -0
  75. package/dist/graph-query.js.map +1 -1
  76. package/dist/graph-relations.d.ts +20 -0
  77. package/dist/graph-relations.js +42 -10
  78. package/dist/graph-relations.js.map +1 -1
  79. package/dist/graph-search.d.ts +35 -0
  80. package/dist/graph-search.js +36 -0
  81. package/dist/graph-search.js.map +1 -1
  82. package/dist/graph-snapshot.d.ts +26 -0
  83. package/dist/graph-snapshot.js +30 -1
  84. package/dist/graph-snapshot.js.map +1 -1
  85. package/dist/graph.d.ts +13 -2
  86. package/dist/graph.js +61 -4
  87. package/dist/graph.js.map +1 -1
  88. package/dist/impact.d.ts +50 -0
  89. package/dist/impact.js +62 -2
  90. package/dist/impact.js.map +1 -1
  91. package/dist/index.d.ts +10 -0
  92. package/dist/index.js +10 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/init.d.ts +12 -0
  95. package/dist/init.js +15 -0
  96. package/dist/init.js.map +1 -1
  97. package/dist/load.d.ts +10 -0
  98. package/dist/load.js +15 -0
  99. package/dist/load.js.map +1 -1
  100. package/dist/main.d.ts +6 -0
  101. package/dist/main.js +93 -5
  102. package/dist/main.js.map +1 -1
  103. package/dist/migrate.d.ts +12 -0
  104. package/dist/migrate.js +17 -0
  105. package/dist/migrate.js.map +1 -1
  106. package/dist/ontology.d.ts +67 -2
  107. package/dist/ontology.js +94 -4
  108. package/dist/ontology.js.map +1 -1
  109. package/dist/process-rules.d.ts +21 -0
  110. package/dist/process-rules.js +100 -0
  111. package/dist/process-rules.js.map +1 -0
  112. package/dist/process.d.ts +32 -0
  113. package/dist/process.js +32 -0
  114. package/dist/process.js.map +1 -1
  115. package/dist/project-structure.d.ts +5 -0
  116. package/dist/project-structure.js +10 -0
  117. package/dist/project-structure.js.map +1 -1
  118. package/dist/registration.d.ts +16 -0
  119. package/dist/registration.js +56 -0
  120. package/dist/registration.js.map +1 -0
  121. package/dist/rules.d.ts +52 -0
  122. package/dist/rules.js +58 -0
  123. package/dist/rules.js.map +1 -1
  124. package/dist/runtime-diagnostics.d.ts +27 -0
  125. package/dist/runtime-diagnostics.js +60 -0
  126. package/dist/runtime-diagnostics.js.map +1 -0
  127. package/dist/snapshots.d.ts +40 -0
  128. package/dist/snapshots.js +62 -0
  129. package/dist/snapshots.js.map +1 -0
  130. package/dist/static-check.d.ts +33 -0
  131. package/dist/static-check.js +37 -1
  132. package/dist/static-check.js.map +1 -1
  133. package/dist/sync.d.ts +11 -0
  134. package/dist/sync.js +66 -9
  135. package/dist/sync.js.map +1 -1
  136. package/dist/upgrade.d.ts +16 -0
  137. package/dist/upgrade.js +21 -0
  138. package/dist/upgrade.js.map +1 -1
  139. package/dist/verify.d.ts +14 -0
  140. package/dist/verify.js +19 -0
  141. package/dist/verify.js.map +1 -1
  142. package/dist/version.js +5 -0
  143. package/dist/version.js.map +1 -1
  144. package/graph-ui/app.js +321 -27
  145. package/graph-ui/approval-flow.js +185 -0
  146. package/graph-ui/approval-parallel.js +110 -0
  147. package/graph-ui/approval-tree.js +17 -0
  148. package/graph-ui/business.css +1011 -0
  149. package/graph-ui/business.js +566 -0
  150. package/graph-ui/flowchart-interaction.js +177 -0
  151. package/graph-ui/flowchart.js +1059 -0
  152. package/graph-ui/graph-approvals.js +92 -0
  153. package/graph-ui/graph-business.js +403 -0
  154. package/graph-ui/graph-model.js +36 -3
  155. package/graph-ui/graph-relations.js +42 -10
  156. package/graph-ui/graph-search.js +36 -0
  157. package/graph-ui/index.html +26 -12
  158. package/graph-ui/model.js +28 -0
  159. package/graph-ui/relations.js +4 -0
  160. package/graph-ui/structure.js +44 -0
  161. package/graph-ui/style.css +12 -0
  162. package/package.json +6 -4
  163. package/templates/app/.dockerignore +2 -0
  164. package/templates/app/.env.example +10 -0
  165. package/templates/app/AGENTS.md +50 -10
  166. package/templates/app/README.md +9 -5
  167. package/templates/app/_gitignore +1 -0
  168. package/templates/app/apps/api/package.json +2 -2
  169. package/templates/app/apps/api/src/main.ts +5 -1
  170. package/templates/app/apps/api/src/worker.ts +3 -0
  171. package/templates/app/apps/web/index.html +1 -0
  172. package/templates/app/apps/web/package.json +7 -3
  173. package/templates/app/apps/web/src/app/app.tsx +122 -12
  174. package/templates/app/apps/web/src/app/styles/global.css +88 -8
  175. package/templates/app/apps/web/src/app/use-session.ts +43 -0
  176. package/templates/app/apps/web/src/app/workspace-layout.tsx +58 -19
  177. package/templates/app/apps/web/src/main.tsx +5 -0
  178. package/templates/app/apps/web/src/modules/approval/components/task-operation-dialog.tsx +61 -0
  179. package/templates/app/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +13 -5
  180. package/templates/app/apps/web/src/modules/approval/index.ts +4 -0
  181. package/templates/app/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +89 -38
  182. package/templates/app/apps/web/src/modules/approval/pages/approval-tasks.css +18 -0
  183. package/templates/app/apps/web/src/modules/auth/index.ts +4 -0
  184. package/templates/app/apps/web/src/modules/auth/pages/login-page.tsx +12 -0
  185. package/templates/app/apps/web/src/modules/inventory/index.ts +4 -0
  186. package/templates/app/apps/web/src/modules/inventory/pages/inventory-page.tsx +29 -1
  187. package/templates/app/apps/web/src/modules/purchase/components/approval-history.tsx +67 -0
  188. package/templates/app/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
  189. package/templates/app/apps/web/src/modules/purchase/components/order-reviewers.tsx +38 -0
  190. package/templates/app/apps/web/src/modules/purchase/components/purchase-assistant-context.tsx +17 -0
  191. package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.css +6 -0
  192. package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.tsx +32 -3
  193. package/templates/app/apps/web/src/modules/purchase/index.ts +5 -0
  194. package/templates/app/apps/web/src/modules/purchase/lib/presentation.ts +20 -0
  195. package/templates/app/apps/web/src/modules/purchase/pages/purchase-intelligence.css +17 -0
  196. package/templates/app/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +156 -0
  197. package/templates/app/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +54 -22
  198. package/templates/app/apps/web/src/modules/workspace/index.ts +5 -0
  199. package/templates/app/apps/web/src/modules/workspace/pages/home-page.tsx +44 -0
  200. package/templates/app/apps/web/src/shared/hooks/use-command.ts +13 -0
  201. package/templates/app/apps/web/src/shared/lib/error-message.ts +15 -1
  202. package/templates/app/apps/web/src/shared/lib/navigation.ts +21 -0
  203. package/templates/app/apps/web/src/shared/ui/approval-member-picker.css +10 -0
  204. package/templates/app/apps/web/src/shared/ui/approval-member-picker.tsx +51 -0
  205. package/templates/app/apps/web/src/shared/ui/assistant-markdown.tsx +19 -0
  206. package/templates/app/apps/web/src/shared/ui/assistant-panel.css +134 -0
  207. package/templates/app/apps/web/src/shared/ui/assistant-panel.tsx +200 -0
  208. package/templates/app/apps/web/src/shared/ui/assistant-scope.tsx +72 -0
  209. package/templates/app/apps/web/src/shared/ui/attachment-upload.css +28 -0
  210. package/templates/app/apps/web/src/shared/ui/attachment-upload.tsx +163 -0
  211. package/templates/app/apps/web/src/shared/ui/notice.tsx +7 -0
  212. package/templates/app/apps/web/src/shared/ui/page-heading.tsx +7 -0
  213. package/templates/app/apps/web/src/shared/ui/page-state.css +47 -0
  214. package/templates/app/apps/web/src/shared/ui/page-state.tsx +76 -0
  215. package/templates/app/apps/web/src/shared/ui/require-capability.tsx +34 -0
  216. package/templates/app/apps/web/vite.config.ts +5 -0
  217. package/templates/app/cage.config.json +23 -0
  218. package/templates/app/db/migrations/0002_draft.sql +12 -0
  219. package/templates/app/db/migrations/0003_draft.sql +8 -0
  220. package/templates/app/db/migrations/0004_draft.sql +27 -0
  221. package/templates/app/deploy/nginx.conf +52 -0
  222. package/templates/app/docs/ai/README.md +28 -2
  223. package/templates/app/docs/ai/approvals.md +260 -0
  224. package/templates/app/docs/ai/architecture.md +26 -0
  225. package/templates/app/docs/ai/commenting.md +203 -0
  226. package/templates/app/docs/ai/diagnostics.md +80 -0
  227. package/templates/app/docs/ai/files.md +93 -0
  228. package/templates/app/docs/ai/intelligence.md +348 -0
  229. package/templates/app/docs/ai/ontology-context.md +59 -4
  230. package/templates/app/docs/ai/primitives.md +34 -1
  231. package/templates/app/docs/ai/project-structure.md +8 -3
  232. package/templates/app/docs/ai/purchase-example.md +35 -7
  233. package/templates/app/docs/ai/recipes.md +10 -2
  234. package/templates/app/docs/ai/routing.md +86 -0
  235. package/templates/app/docs/ai/troubleshooting.md +5 -0
  236. package/templates/app/docs/ai/workflow.md +24 -11
  237. package/templates/app/docs/errors/CAGE-AI-001.md +61 -0
  238. package/templates/app/docs/errors/CAGE-APPR-001.md +13 -9
  239. package/templates/app/docs/errors/CAGE-APPR-002.md +2 -2
  240. package/templates/app/docs/errors/CAGE-APPR-003.md +1 -1
  241. package/templates/app/docs/errors/CAGE-APPR-004.md +4 -4
  242. package/templates/app/docs/errors/CAGE-APPR-005.md +4 -4
  243. package/templates/app/docs/errors/CAGE-APPR-006.md +29 -8
  244. package/templates/app/docs/errors/CAGE-APPR-007.md +9 -7
  245. package/templates/app/docs/errors/CAGE-APPR-010.md +5 -5
  246. package/templates/app/docs/errors/CAGE-AUDIT-001.md +53 -0
  247. package/templates/app/docs/errors/CAGE-AUTH-001.md +1 -1
  248. package/templates/app/docs/errors/CAGE-BIZ-001.md +51 -0
  249. package/templates/app/docs/errors/CAGE-BIZ-002.md +49 -0
  250. package/templates/app/docs/errors/CAGE-BUDGET-001.md +1 -1
  251. package/templates/app/docs/errors/CAGE-BUDGET-002.md +1 -1
  252. package/templates/app/docs/errors/CAGE-BUDGET-003.md +1 -1
  253. package/templates/app/docs/errors/CAGE-CMD-002.md +1 -1
  254. package/templates/app/docs/errors/CAGE-CMD-003.md +1 -1
  255. package/templates/app/docs/errors/CAGE-CONN-001.md +3 -3
  256. package/templates/app/docs/errors/CAGE-CONN-002.md +1 -1
  257. package/templates/app/docs/errors/CAGE-CONN-003.md +1 -1
  258. package/templates/app/docs/errors/CAGE-CONN-004.md +1 -1
  259. package/templates/app/docs/errors/CAGE-CONN-005.md +1 -1
  260. package/templates/app/docs/errors/CAGE-CONN-006.md +1 -1
  261. package/templates/app/docs/errors/CAGE-CONN-007.md +6 -6
  262. package/templates/app/docs/errors/CAGE-CONN-008.md +5 -5
  263. package/templates/app/docs/errors/CAGE-CONN-009.md +6 -6
  264. package/templates/app/docs/errors/CAGE-CONN-010.md +6 -6
  265. package/templates/app/docs/errors/CAGE-CONN-011.md +1 -1
  266. package/templates/app/docs/errors/CAGE-CONN-012.md +1 -1
  267. package/templates/app/docs/errors/CAGE-CONN-013.md +49 -0
  268. package/templates/app/docs/errors/CAGE-CONN-014.md +48 -0
  269. package/templates/app/docs/errors/CAGE-CONN-015.md +49 -0
  270. package/templates/app/docs/errors/CAGE-CREATE-001.md +10 -9
  271. package/templates/app/docs/errors/CAGE-DECL-001.md +2 -2
  272. package/templates/app/docs/errors/CAGE-DECL-002.md +7 -6
  273. package/templates/app/docs/errors/CAGE-DECL-003.md +1 -1
  274. package/templates/app/docs/errors/CAGE-DECL-004.md +1 -1
  275. package/templates/app/docs/errors/CAGE-DEP-001.md +2 -2
  276. package/templates/app/docs/errors/CAGE-DEP-002.md +1 -1
  277. package/templates/app/docs/errors/CAGE-DEP-003.md +2 -2
  278. package/templates/app/docs/errors/CAGE-DEP-004.md +1 -1
  279. package/templates/app/docs/errors/CAGE-DEP-005.md +1 -1
  280. package/templates/app/docs/errors/CAGE-DIAG-001.md +53 -0
  281. package/templates/app/docs/errors/CAGE-DLQ-001.md +2 -2
  282. package/templates/app/docs/errors/CAGE-ENV-001.md +4 -4
  283. package/templates/app/docs/errors/CAGE-ENV-002.md +51 -0
  284. package/templates/app/docs/errors/CAGE-ENV-003.md +48 -0
  285. package/templates/app/docs/errors/CAGE-EVENT-001.md +1 -1
  286. package/templates/app/docs/errors/CAGE-EVENT-002.md +7 -7
  287. package/templates/app/docs/errors/CAGE-FIELD-001.md +2 -2
  288. package/templates/app/docs/errors/CAGE-FIELD-002.md +1 -1
  289. package/templates/app/docs/errors/CAGE-FIELD-003.md +1 -1
  290. package/templates/app/docs/errors/CAGE-FIELD-004.md +1 -1
  291. package/templates/app/docs/errors/CAGE-FILE-001.md +56 -0
  292. package/templates/app/docs/errors/CAGE-GEN-001.md +2 -2
  293. package/templates/app/docs/errors/CAGE-GEN-002.md +1 -1
  294. package/templates/app/docs/errors/CAGE-GEN-003.md +53 -0
  295. package/templates/app/docs/errors/CAGE-GRANT-001.md +3 -3
  296. package/templates/app/docs/errors/CAGE-GRANT-002.md +2 -2
  297. package/templates/app/docs/errors/CAGE-GRANT-003.md +7 -6
  298. package/templates/app/docs/errors/CAGE-IMPACT-001.md +2 -2
  299. package/templates/app/docs/errors/CAGE-IMPACT-002.md +52 -0
  300. package/templates/app/docs/errors/CAGE-INIT-001.md +1 -1
  301. package/templates/app/docs/errors/CAGE-INIT-002.md +1 -1
  302. package/templates/app/docs/errors/CAGE-INIT-003.md +2 -2
  303. package/templates/app/docs/errors/CAGE-INIT-004.md +1 -1
  304. package/templates/app/docs/errors/CAGE-INIT-005.md +52 -0
  305. package/templates/app/docs/errors/CAGE-JOB-001.md +1 -1
  306. package/templates/app/docs/errors/CAGE-JOB-002.md +1 -1
  307. package/templates/app/docs/errors/CAGE-JOB-003.md +1 -1
  308. package/templates/app/docs/errors/CAGE-LINT-001.md +1 -1
  309. package/templates/app/docs/errors/CAGE-MIG-001.md +1 -1
  310. package/templates/app/docs/errors/CAGE-MIG-002.md +1 -1
  311. package/templates/app/docs/errors/CAGE-MIG-005.md +1 -1
  312. package/templates/app/docs/errors/CAGE-NAME-001.md +1 -1
  313. package/templates/app/docs/errors/CAGE-NAME-002.md +1 -1
  314. package/templates/app/docs/errors/CAGE-NAME-003.md +3 -3
  315. package/templates/app/docs/errors/CAGE-NAME-004.md +1 -1
  316. package/templates/app/docs/errors/CAGE-NAME-005.md +1 -1
  317. package/templates/app/docs/errors/CAGE-NAME-006.md +1 -1
  318. package/templates/app/docs/errors/CAGE-ORG-001.md +7 -6
  319. package/templates/app/docs/errors/CAGE-PAIR-002.md +6 -5
  320. package/templates/app/docs/errors/CAGE-QUERY-001.md +1 -1
  321. package/templates/app/docs/errors/CAGE-QUERY-002.md +2 -2
  322. package/templates/app/docs/errors/CAGE-QUERY-003.md +7 -6
  323. package/templates/app/docs/errors/CAGE-REACT-001.md +3 -3
  324. package/templates/app/docs/errors/CAGE-REACT-002.md +1 -1
  325. package/templates/app/docs/errors/CAGE-REACT-003.md +50 -0
  326. package/templates/app/docs/errors/CAGE-READS-001.md +9 -6
  327. package/templates/app/docs/errors/CAGE-REG-001.md +13 -12
  328. package/templates/app/docs/errors/CAGE-REG-002.md +2 -1
  329. package/templates/app/docs/errors/CAGE-REG-003.md +1 -1
  330. package/templates/app/docs/errors/CAGE-REL-001.md +14 -14
  331. package/templates/app/docs/errors/CAGE-ROUTE-001.md +7 -6
  332. package/templates/app/docs/errors/CAGE-SCOPE-001.md +1 -1
  333. package/templates/app/docs/errors/CAGE-SCOPE-002.md +2 -2
  334. package/templates/app/docs/errors/CAGE-SECRET-001.md +2 -2
  335. package/templates/app/docs/errors/CAGE-SECRET-002.md +1 -1
  336. package/templates/app/docs/errors/CAGE-SENS-001.md +5 -5
  337. package/templates/app/docs/errors/CAGE-SQL-001.md +1 -1
  338. package/templates/app/docs/errors/CAGE-SQL-002.md +1 -1
  339. package/templates/app/docs/errors/CAGE-STATE-001.md +3 -3
  340. package/templates/app/docs/errors/CAGE-STATE-002.md +1 -1
  341. package/templates/app/docs/errors/CAGE-STATE-003.md +1 -1
  342. package/templates/app/docs/errors/CAGE-STATE-004.md +1 -1
  343. package/templates/app/docs/errors/CAGE-STATE-005.md +3 -2
  344. package/templates/app/docs/errors/CAGE-STATE-010.md +5 -5
  345. package/templates/app/docs/errors/CAGE-STATE-011.md +5 -5
  346. package/templates/app/docs/errors/CAGE-STRUCT-001.md +1 -1
  347. package/templates/app/docs/errors/CAGE-STRUCT-002.md +1 -1
  348. package/templates/app/docs/errors/CAGE-SYNC-001.md +3 -2
  349. package/templates/app/docs/errors/CAGE-TEST-001.md +1 -1
  350. package/templates/app/docs/errors/CAGE-TEST-002.md +50 -0
  351. package/templates/app/docs/errors/CAGE-TEST-003.md +52 -0
  352. package/templates/app/docs/errors/CAGE-UNSAFE-001.md +3 -2
  353. package/templates/app/docs/errors/CAGE-UPGRADE-001.md +2 -2
  354. package/templates/app/docs/errors/CAGE-WORKER-001.md +48 -0
  355. package/templates/app/docs/errors/CAGE-WORKER-002.md +50 -0
  356. package/templates/app/docs/errors/CAGE-WORKER-003.md +48 -0
  357. package/templates/app/docs/errors/README.md +52 -2
  358. package/templates/app/package.json +3 -3
  359. package/templates/app/packages/contracts/package.json +1 -1
  360. package/templates/app/packages/contracts/src/aggregates/approval-member/index.ts +70 -0
  361. package/templates/app/packages/contracts/src/aggregates/dept/index.ts +10 -10
  362. package/templates/app/packages/contracts/src/aggregates/inventory/index.ts +5 -5
  363. package/templates/app/packages/contracts/src/aggregates/inventory-lock/index.ts +4 -4
  364. package/templates/app/packages/contracts/src/aggregates/purchase-order/index.ts +34 -12
  365. package/templates/app/packages/contracts/src/aggregates/role/index.ts +15 -15
  366. package/templates/app/packages/contracts/src/aggregates/user/index.ts +16 -16
  367. package/templates/app/packages/contracts/src/index.ts +16 -1
  368. package/templates/app/packages/contracts/src/queries/index.ts +2 -2
  369. package/templates/app/packages/domain/package.json +5 -4
  370. package/templates/app/packages/domain/src/index.ts +4 -0
  371. package/templates/app/packages/domain/src/integrations/erp.ts +15 -0
  372. package/templates/app/packages/domain/src/integrations/intelligence.ts +20 -0
  373. package/templates/app/packages/domain/src/modules/inventory/index.ts +1 -0
  374. package/templates/app/packages/domain/src/modules/inventory/inventory.ts +12 -0
  375. package/templates/app/packages/domain/src/modules/purchase/approval-members.ts +54 -0
  376. package/templates/app/packages/domain/src/modules/purchase/approvals.ts +38 -6
  377. package/templates/app/packages/domain/src/modules/purchase/index.ts +2 -0
  378. package/templates/app/packages/domain/src/modules/purchase/intelligence.test.ts +224 -0
  379. package/templates/app/packages/domain/src/modules/purchase/jobs.ts +5 -0
  380. package/templates/app/packages/domain/src/modules/purchase/purchase-order.test.ts +9 -0
  381. package/templates/app/packages/domain/src/modules/purchase/purchase-order.ts +125 -4
  382. package/templates/app/packages/domain/src/modules/purchase/queries.ts +5 -0
  383. package/templates/app/packages/domain/src/workflows/purchase-inventory.ts +6 -0
  384. package/templates/app/packages/domain/src/workflows/purchase-process.ts +42 -0
  385. package/templates/blank/.dockerignore +2 -0
  386. package/templates/blank/.env.example +10 -0
  387. package/templates/blank/AGENTS.md +50 -10
  388. package/templates/blank/README.md +4 -1
  389. package/templates/blank/_gitignore +1 -0
  390. package/templates/blank/apps/api/package.json +1 -1
  391. package/templates/blank/apps/api/src/main.ts +4 -1
  392. package/templates/blank/apps/api/src/worker.ts +2 -0
  393. package/templates/blank/apps/web/index.html +1 -0
  394. package/templates/blank/apps/web/package.json +7 -3
  395. package/templates/blank/apps/web/src/app/app.tsx +80 -18
  396. package/templates/blank/apps/web/src/app/styles/global.css +90 -0
  397. package/templates/blank/apps/web/src/app/use-session.ts +43 -0
  398. package/templates/blank/apps/web/src/app/workspace-layout.tsx +30 -5
  399. package/templates/blank/apps/web/src/main.tsx +5 -0
  400. package/templates/blank/apps/web/src/modules/auth/index.ts +4 -0
  401. package/templates/blank/apps/web/src/modules/auth/pages/login-page.tsx +18 -1
  402. package/templates/blank/apps/web/src/modules/directory/index.ts +7 -0
  403. package/templates/blank/apps/web/src/modules/directory/pages/user-detail-page.tsx +78 -0
  404. package/templates/blank/apps/web/src/modules/directory/pages/users-page.tsx +93 -0
  405. package/templates/blank/apps/web/src/modules/workspace/index.ts +4 -0
  406. package/templates/blank/apps/web/src/modules/workspace/pages/home-page.tsx +17 -0
  407. package/templates/blank/apps/web/src/shared/lib/error-message.ts +11 -0
  408. package/templates/blank/apps/web/src/shared/lib/navigation.ts +21 -0
  409. package/templates/blank/apps/web/src/shared/ui/brand.tsx +10 -2
  410. package/templates/blank/apps/web/src/shared/ui/page-state.css +47 -0
  411. package/templates/blank/apps/web/src/shared/ui/page-state.tsx +76 -0
  412. package/templates/blank/apps/web/src/shared/ui/require-capability.tsx +34 -0
  413. package/templates/blank/apps/web/vite.config.ts +5 -0
  414. package/templates/blank/deploy/nginx.conf +52 -0
  415. package/templates/blank/docs/ai/README.md +28 -2
  416. package/templates/blank/docs/ai/approvals.md +260 -0
  417. package/templates/blank/docs/ai/architecture.md +26 -0
  418. package/templates/blank/docs/ai/commenting.md +203 -0
  419. package/templates/blank/docs/ai/diagnostics.md +80 -0
  420. package/templates/blank/docs/ai/files.md +93 -0
  421. package/templates/blank/docs/ai/intelligence.md +348 -0
  422. package/templates/blank/docs/ai/ontology-context.md +59 -4
  423. package/templates/blank/docs/ai/primitives.md +34 -1
  424. package/templates/blank/docs/ai/project-structure.md +8 -3
  425. package/templates/blank/docs/ai/purchase-example.md +35 -7
  426. package/templates/blank/docs/ai/recipes.md +10 -2
  427. package/templates/blank/docs/ai/routing.md +86 -0
  428. package/templates/blank/docs/ai/troubleshooting.md +5 -0
  429. package/templates/blank/docs/ai/workflow.md +24 -11
  430. package/templates/blank/docs/errors/CAGE-AI-001.md +61 -0
  431. package/templates/blank/docs/errors/CAGE-APPR-001.md +13 -9
  432. package/templates/blank/docs/errors/CAGE-APPR-002.md +2 -2
  433. package/templates/blank/docs/errors/CAGE-APPR-003.md +1 -1
  434. package/templates/blank/docs/errors/CAGE-APPR-004.md +4 -4
  435. package/templates/blank/docs/errors/CAGE-APPR-005.md +4 -4
  436. package/templates/blank/docs/errors/CAGE-APPR-006.md +29 -8
  437. package/templates/blank/docs/errors/CAGE-APPR-007.md +9 -7
  438. package/templates/blank/docs/errors/CAGE-APPR-010.md +5 -5
  439. package/templates/blank/docs/errors/CAGE-AUDIT-001.md +53 -0
  440. package/templates/blank/docs/errors/CAGE-AUTH-001.md +1 -1
  441. package/templates/blank/docs/errors/CAGE-BIZ-001.md +51 -0
  442. package/templates/blank/docs/errors/CAGE-BIZ-002.md +49 -0
  443. package/templates/blank/docs/errors/CAGE-BUDGET-001.md +1 -1
  444. package/templates/blank/docs/errors/CAGE-BUDGET-002.md +1 -1
  445. package/templates/blank/docs/errors/CAGE-BUDGET-003.md +1 -1
  446. package/templates/blank/docs/errors/CAGE-CMD-002.md +1 -1
  447. package/templates/blank/docs/errors/CAGE-CMD-003.md +1 -1
  448. package/templates/blank/docs/errors/CAGE-CONN-001.md +3 -3
  449. package/templates/blank/docs/errors/CAGE-CONN-002.md +1 -1
  450. package/templates/blank/docs/errors/CAGE-CONN-003.md +1 -1
  451. package/templates/blank/docs/errors/CAGE-CONN-004.md +1 -1
  452. package/templates/blank/docs/errors/CAGE-CONN-005.md +1 -1
  453. package/templates/blank/docs/errors/CAGE-CONN-006.md +1 -1
  454. package/templates/blank/docs/errors/CAGE-CONN-007.md +6 -6
  455. package/templates/blank/docs/errors/CAGE-CONN-008.md +5 -5
  456. package/templates/blank/docs/errors/CAGE-CONN-009.md +6 -6
  457. package/templates/blank/docs/errors/CAGE-CONN-010.md +6 -6
  458. package/templates/blank/docs/errors/CAGE-CONN-011.md +1 -1
  459. package/templates/blank/docs/errors/CAGE-CONN-012.md +1 -1
  460. package/templates/blank/docs/errors/CAGE-CONN-013.md +49 -0
  461. package/templates/blank/docs/errors/CAGE-CONN-014.md +48 -0
  462. package/templates/blank/docs/errors/CAGE-CONN-015.md +49 -0
  463. package/templates/blank/docs/errors/CAGE-CREATE-001.md +10 -9
  464. package/templates/blank/docs/errors/CAGE-DECL-001.md +2 -2
  465. package/templates/blank/docs/errors/CAGE-DECL-002.md +7 -6
  466. package/templates/blank/docs/errors/CAGE-DECL-003.md +1 -1
  467. package/templates/blank/docs/errors/CAGE-DECL-004.md +1 -1
  468. package/templates/blank/docs/errors/CAGE-DEP-001.md +2 -2
  469. package/templates/blank/docs/errors/CAGE-DEP-002.md +1 -1
  470. package/templates/blank/docs/errors/CAGE-DEP-003.md +2 -2
  471. package/templates/blank/docs/errors/CAGE-DEP-004.md +1 -1
  472. package/templates/blank/docs/errors/CAGE-DEP-005.md +1 -1
  473. package/templates/blank/docs/errors/CAGE-DIAG-001.md +53 -0
  474. package/templates/blank/docs/errors/CAGE-DLQ-001.md +2 -2
  475. package/templates/blank/docs/errors/CAGE-ENV-001.md +4 -4
  476. package/templates/blank/docs/errors/CAGE-ENV-002.md +51 -0
  477. package/templates/blank/docs/errors/CAGE-ENV-003.md +48 -0
  478. package/templates/blank/docs/errors/CAGE-EVENT-001.md +1 -1
  479. package/templates/blank/docs/errors/CAGE-EVENT-002.md +7 -7
  480. package/templates/blank/docs/errors/CAGE-FIELD-001.md +2 -2
  481. package/templates/blank/docs/errors/CAGE-FIELD-002.md +1 -1
  482. package/templates/blank/docs/errors/CAGE-FIELD-003.md +1 -1
  483. package/templates/blank/docs/errors/CAGE-FIELD-004.md +1 -1
  484. package/templates/blank/docs/errors/CAGE-FILE-001.md +56 -0
  485. package/templates/blank/docs/errors/CAGE-GEN-001.md +2 -2
  486. package/templates/blank/docs/errors/CAGE-GEN-002.md +1 -1
  487. package/templates/blank/docs/errors/CAGE-GEN-003.md +53 -0
  488. package/templates/blank/docs/errors/CAGE-GRANT-001.md +3 -3
  489. package/templates/blank/docs/errors/CAGE-GRANT-002.md +2 -2
  490. package/templates/blank/docs/errors/CAGE-GRANT-003.md +7 -6
  491. package/templates/blank/docs/errors/CAGE-IMPACT-001.md +2 -2
  492. package/templates/blank/docs/errors/CAGE-IMPACT-002.md +52 -0
  493. package/templates/blank/docs/errors/CAGE-INIT-001.md +1 -1
  494. package/templates/blank/docs/errors/CAGE-INIT-002.md +1 -1
  495. package/templates/blank/docs/errors/CAGE-INIT-003.md +2 -2
  496. package/templates/blank/docs/errors/CAGE-INIT-004.md +1 -1
  497. package/templates/blank/docs/errors/CAGE-INIT-005.md +52 -0
  498. package/templates/blank/docs/errors/CAGE-JOB-001.md +1 -1
  499. package/templates/blank/docs/errors/CAGE-JOB-002.md +1 -1
  500. package/templates/blank/docs/errors/CAGE-JOB-003.md +1 -1
  501. package/templates/blank/docs/errors/CAGE-LINT-001.md +1 -1
  502. package/templates/blank/docs/errors/CAGE-MIG-001.md +1 -1
  503. package/templates/blank/docs/errors/CAGE-MIG-002.md +1 -1
  504. package/templates/blank/docs/errors/CAGE-MIG-005.md +1 -1
  505. package/templates/blank/docs/errors/CAGE-NAME-001.md +1 -1
  506. package/templates/blank/docs/errors/CAGE-NAME-002.md +1 -1
  507. package/templates/blank/docs/errors/CAGE-NAME-003.md +3 -3
  508. package/templates/blank/docs/errors/CAGE-NAME-004.md +1 -1
  509. package/templates/blank/docs/errors/CAGE-NAME-005.md +1 -1
  510. package/templates/blank/docs/errors/CAGE-NAME-006.md +1 -1
  511. package/templates/blank/docs/errors/CAGE-ORG-001.md +7 -6
  512. package/templates/blank/docs/errors/CAGE-PAIR-002.md +6 -5
  513. package/templates/blank/docs/errors/CAGE-QUERY-001.md +1 -1
  514. package/templates/blank/docs/errors/CAGE-QUERY-002.md +2 -2
  515. package/templates/blank/docs/errors/CAGE-QUERY-003.md +7 -6
  516. package/templates/blank/docs/errors/CAGE-REACT-001.md +3 -3
  517. package/templates/blank/docs/errors/CAGE-REACT-002.md +1 -1
  518. package/templates/blank/docs/errors/CAGE-REACT-003.md +50 -0
  519. package/templates/blank/docs/errors/CAGE-READS-001.md +9 -6
  520. package/templates/blank/docs/errors/CAGE-REG-001.md +13 -12
  521. package/templates/blank/docs/errors/CAGE-REG-002.md +2 -1
  522. package/templates/blank/docs/errors/CAGE-REG-003.md +1 -1
  523. package/templates/blank/docs/errors/CAGE-REL-001.md +14 -14
  524. package/templates/blank/docs/errors/CAGE-ROUTE-001.md +7 -6
  525. package/templates/blank/docs/errors/CAGE-SCOPE-001.md +1 -1
  526. package/templates/blank/docs/errors/CAGE-SCOPE-002.md +2 -2
  527. package/templates/blank/docs/errors/CAGE-SECRET-001.md +2 -2
  528. package/templates/blank/docs/errors/CAGE-SECRET-002.md +1 -1
  529. package/templates/blank/docs/errors/CAGE-SENS-001.md +5 -5
  530. package/templates/blank/docs/errors/CAGE-SQL-001.md +1 -1
  531. package/templates/blank/docs/errors/CAGE-SQL-002.md +1 -1
  532. package/templates/blank/docs/errors/CAGE-STATE-001.md +3 -3
  533. package/templates/blank/docs/errors/CAGE-STATE-002.md +1 -1
  534. package/templates/blank/docs/errors/CAGE-STATE-003.md +1 -1
  535. package/templates/blank/docs/errors/CAGE-STATE-004.md +1 -1
  536. package/templates/blank/docs/errors/CAGE-STATE-005.md +3 -2
  537. package/templates/blank/docs/errors/CAGE-STATE-010.md +5 -5
  538. package/templates/blank/docs/errors/CAGE-STATE-011.md +5 -5
  539. package/templates/blank/docs/errors/CAGE-STRUCT-001.md +1 -1
  540. package/templates/blank/docs/errors/CAGE-STRUCT-002.md +1 -1
  541. package/templates/blank/docs/errors/CAGE-SYNC-001.md +3 -2
  542. package/templates/blank/docs/errors/CAGE-TEST-001.md +1 -1
  543. package/templates/blank/docs/errors/CAGE-TEST-002.md +50 -0
  544. package/templates/blank/docs/errors/CAGE-TEST-003.md +52 -0
  545. package/templates/blank/docs/errors/CAGE-UNSAFE-001.md +3 -2
  546. package/templates/blank/docs/errors/CAGE-UPGRADE-001.md +2 -2
  547. package/templates/blank/docs/errors/CAGE-WORKER-001.md +48 -0
  548. package/templates/blank/docs/errors/CAGE-WORKER-002.md +50 -0
  549. package/templates/blank/docs/errors/CAGE-WORKER-003.md +48 -0
  550. package/templates/blank/docs/errors/README.md +52 -2
  551. package/templates/blank/docs/examples/purchase-admin/apps/api/src/main.ts +5 -1
  552. package/templates/blank/docs/examples/purchase-admin/apps/api/src/worker.ts +3 -0
  553. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/app.tsx +122 -12
  554. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/styles/global.css +88 -8
  555. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/use-session.ts +43 -0
  556. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/workspace-layout.tsx +58 -19
  557. package/templates/blank/docs/examples/purchase-admin/apps/web/src/main.tsx +5 -0
  558. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/components/task-operation-dialog.tsx +61 -0
  559. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +13 -5
  560. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/index.ts +4 -0
  561. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +89 -38
  562. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/pages/approval-tasks.css +18 -0
  563. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/index.ts +4 -0
  564. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/pages/login-page.tsx +12 -0
  565. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/index.ts +4 -0
  566. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/pages/inventory-page.tsx +29 -1
  567. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/approval-history.tsx +67 -0
  568. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
  569. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/order-reviewers.tsx +38 -0
  570. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-assistant-context.tsx +17 -0
  571. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.css +6 -0
  572. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.tsx +32 -3
  573. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/index.ts +5 -0
  574. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/lib/presentation.ts +20 -0
  575. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-intelligence.css +17 -0
  576. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +156 -0
  577. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +54 -22
  578. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/workspace/index.ts +5 -0
  579. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/workspace/pages/home-page.tsx +44 -0
  580. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/hooks/use-command.ts +13 -0
  581. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/error-message.ts +15 -1
  582. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/navigation.ts +21 -0
  583. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/approval-member-picker.css +10 -0
  584. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/approval-member-picker.tsx +51 -0
  585. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-markdown.tsx +19 -0
  586. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-panel.css +134 -0
  587. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-panel.tsx +200 -0
  588. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-scope.tsx +72 -0
  589. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/attachment-upload.css +28 -0
  590. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/attachment-upload.tsx +163 -0
  591. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/notice.tsx +7 -0
  592. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-heading.tsx +7 -0
  593. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-state.css +47 -0
  594. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-state.tsx +76 -0
  595. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/require-capability.tsx +34 -0
  596. package/templates/blank/docs/examples/purchase-admin/cage.config.json +23 -0
  597. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/approval-member/index.ts +70 -0
  598. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/dept/index.ts +10 -10
  599. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory/index.ts +5 -5
  600. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory-lock/index.ts +4 -4
  601. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/purchase-order/index.ts +34 -12
  602. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/role/index.ts +15 -15
  603. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/user/index.ts +16 -16
  604. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/index.ts +16 -1
  605. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/queries/index.ts +2 -2
  606. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/index.ts +4 -0
  607. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/erp.ts +15 -0
  608. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/intelligence.ts +20 -0
  609. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/index.ts +1 -0
  610. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/inventory.ts +12 -0
  611. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approval-members.ts +54 -0
  612. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approvals.ts +38 -6
  613. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/index.ts +2 -0
  614. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/intelligence.test.ts +224 -0
  615. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/jobs.ts +5 -0
  616. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts +9 -0
  617. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.ts +125 -4
  618. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/queries.ts +5 -0
  619. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-inventory.ts +6 -0
  620. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-process.ts +42 -0
  621. package/templates/blank/package.json +3 -3
  622. package/templates/blank/packages/contracts/package.json +1 -1
  623. package/templates/blank/packages/contracts/src/aggregates/dept/index.ts +10 -10
  624. package/templates/blank/packages/contracts/src/aggregates/role/index.ts +15 -15
  625. package/templates/blank/packages/contracts/src/aggregates/user/index.ts +16 -16
  626. package/templates/blank/packages/contracts/src/index.ts +1 -1
  627. package/templates/blank/packages/contracts/src/queries/index.ts +1 -1
  628. package/templates/blank/packages/domain/package.json +5 -4
  629. package/templates/blank/packages/domain/src/index.ts +2 -1
@@ -4,6 +4,62 @@
4
4
 
5
5
  本页命令在**应用根目录**运行,使用项目安装的 CLI。工具直接分析当前注册的 domain,无需启动 API、worker 或数据库。不要把 Web 截图作为 AI 理解业务的唯一材料:优先取得结构化上下文,再按源码位置阅读实现。
6
6
 
7
+ ## 在浏览器按业务阅读
8
+
9
+ 运行 `pnpm exec cage graph` 打开业务地图,默认从业务板块进入,再选择完整流程,点击阶段查看规则与实现代码。声明了 `businessProcess` 的板块优先展示完整业务流程;其他板块按真实状态迁移展示对象生命周期。具体操作与查询收在折叠区中。模块目录下的业务对象归入同一板块,未分模块的项目按业务对象组织;查询、任务和外部通知按已声明的读取或调用关系出现在相关板块。系统组织模型默认隐藏,可单独开启。
10
+
11
+ 板块默认使用所属对象的中文名称。可在 `cage.config.json` 的 `graph.labels` 设置 `"module:purchase": "采购管理"` 这样的板块标题;未分模块的对象沿用 `aggregate:对象名`。板块标题属于显示配置,不改变节点身份、本体哈希或业务逻辑。
12
+
13
+ 完整流程以矩形展示业务阶段、菱形展示决定分支、圆角终点展示结束结果。绿色箭头标记业务走向,并注明参与人、自动或等待;棕色箭头标记展开的次要分支;虚线标记涉及的业务对象。取消等次要路径可以展开,审批通过/驳回等主要分支保持可见。主线保持同一轴线,侧面分支使用独立出口和通道,汇合复用已有阶段。长线在源节点附近也显示方向箭头,分支文字注明动作与去向,回路入口注明来源;文字放在线旁,悬停或点选连线可突出显示对应的起点与终点。
14
+
15
+ 主要实现绑定了代码审批路由的阶段默认展开为审批子流程:按声明顺序展示每一步的标题、审批人、任一或全部同意规则;条件用菱形展示,“是”进入该组审批,“否”从侧边跳过整组,再继续后续步骤。所需步骤全部通过才继续业务,任一步骤驳回则结束本轮审批。审批字段和角色使用 `graph.labels` 中的中文名称,点击容器仍可查看原审批及路由源码。未抽取到绑定路由时明确提示缺少步骤;取消审批只作为终止动作展示。这是声明的静态阅读图,不表示某张单据当前走到了哪一步。
16
+
17
+ 普通滚轮以光标为中心缩放,空白处拖动平移;选择模式下可拖动节点,箭头随之更新,抓手模式、空格或中键可从任意位置平移。工具栏支持横向/纵向布局、100% 缩放、适应画布、回到起点、重置节点布局及展开画布(Esc 退出);触屏支持单指平移与双指缩放。长流程首次按可读字号展示起点,点击“适应”查看全图。点击节点或箭头打开步骤详情与代码面板,查看详情和切换页签保留当前视野与手动布局;这些调整只影响本次页面中的展示,不改写业务声明。
18
+
19
+ 展开具体操作时,触发图只沿事件触发、反应调用、审批结论与外部成功回写展开,异步连线使用虚线。任务的 calls 只表示可调用,反应的 map 仍可能返回 null;读取依赖、同对象归属、状态相接不表示操作必然依次执行。旧项目的生命周期只展示允许的状态迁移,不把人工的下一步当作自动执行。
20
+
21
+ “实现代码”预览本次抽取保存的完整声明调用,包括 handler、map 或审批路由,提供文件和行号;依赖中的帮助函数仍需按源码阅读。字段、状态和能力点只有聚合位置时,明确显示所属聚合的声明;依赖包没有本地源码位置时不伪造预览。服务只按已注册节点提供快照中的代码,不接受任意文件路径。改代码后点击“重新抽取”,图谱、代码和复制的 AI 上下文才一起更新。
22
+
23
+ 板块、流程、步骤和代码页签保存在 URL 中,支持复制地址、刷新及前进后退。需要查看字段或全部技术关系时,切换“对象与字段”或“完整本体”;步骤详情也可直接进入完整本体及复制 AI 上下文。
24
+
25
+ ## 声明完整业务流程
26
+
27
+ `businessProcess` 把已有执行声明组织成业务阅读规格,适合把申请、审批、履约、结算串成一条完整主线。它不调度命令、不生成写接口,也不改变数据表或授权。跨模块流程放在 domain 的 `workflows`,单个模块内的流程可放在对应模块,所有引用及流程本身都从 domain 入口导出。
28
+
29
+ 采购范例的完整声明位于 `packages/domain/src/workflows/purchase-process.ts`(空白项目在采购参考源码目录中查找)。以下片段说明主要选项,变量引用该范例已有的聚合、命令和审批:
30
+
31
+ ```ts
32
+ export const purchaseOverview = businessProcess('purchase-overview', {
33
+ title: '采购申请到批准', description: '看清申请人提交与审批结论。',
34
+ area: { id: 'purchase', title: '采购管理', description: '采购申请、审批、收货与库存协作。' },
35
+ subject: PurchaseOrder, entry: 'create',
36
+ stages: {
37
+ create: { title: '填写采购申请', description: '保存采购草稿。', actor: '申请人', action: create },
38
+ submit: { title: '提交申请', description: '校验后提交审批。', actor: '申请人', action: submit },
39
+ review: { title: '采购审批', description: '按现有审批规则选人。', kind: 'decision', action: poApproval },
40
+ approved: { title: '批准并锁定库存', description: '审批通过后同事务占用库存。', kind: 'end', action: approve,
41
+ related: [{ object: InventoryLock, label: '锁定采购所需库存', via: acquireLock }] },
42
+ rejected: { title: '审批驳回', description: '本轮采购申请结束。', kind: 'end', action: reject },
43
+ },
44
+ transitions: [
45
+ { from: 'create', to: 'submit', mode: 'manual', label: '申请人提交' },
46
+ { from: 'submit', to: 'review', mode: 'automatic', label: '启动审批' },
47
+ { from: 'review', to: 'approved', mode: 'automatic', label: '审批通过' },
48
+ { from: 'review', to: 'rejected', mode: 'automatic', label: '审批驳回' },
49
+ ],
50
+ });
51
+ ```
52
+
53
+ - `action` 引用该阶段的主要实现;`details` 可补充命令、反应等实现依据,点击后能分别查看代码。
54
+ - `manual` 的目标必须允许用户调用;`automatic` 必须能沿真实触发链到达;`wait` 用于外部通知或定时处理。仅有状态相接不能证明自动执行。
55
+ - `related` 的 `object` 引用实际聚合,`via` 引用本阶段实际可触发且涉及该对象的声明。对象关联显示为虚线,不参与流程先后排序。
56
+ - `branch: true` 将次要路径收起;每个阶段都需要从入口可达,并能到达至少一个 `kind: 'end'` 的结果。回路直接指向原阶段 ID。
57
+ - 同一板块 ID 的名称和说明保持一致;流程按源码声明顺序展示,可把全流程放在专题流程之前。
58
+
59
+ `cage check` 用 [CAGE-BIZ-001](../errors/CAGE-BIZ-001.md) 和 [CAGE-BIZ-002](../errors/CAGE-BIZ-002.md) 检查声明与实现关系。它不执行 handler、map 或审批,所以仍需业务回归证明运行行为。
60
+
61
+ 阶段直接使用 `title`、`description`、`actor` 的中文文案;操作和字段等继续用 `graph.labels`,审批角色可用 `"role:finance": "财务"`。状态也可在 `states(..., { labels: { draft: '草稿' } })` 中维护中文名;这些名称不更改原有状态标识。
62
+
7
63
  ## 开发一项需求的入口
8
64
 
9
65
  以采购模板为例:
@@ -94,16 +150,15 @@ command:PurchaseOrder.cancel
94
150
  ```powershell
95
151
  # 开发前:先取得上下文、阅读实际实现,再保存独立基线。
96
152
  pnpm exec cage context "采购单取消"
97
- pnpm exec cage analyze
98
- Copy-Item .cage/ontology.json .cage/before-change.json
153
+ pnpm exec cage snapshot save before-change
99
154
  # 在源码修改业务声明和实现……
100
155
  pnpm exec cage check
101
156
  pnpm gen
102
- pnpm exec cage impact --base-file .cage/before-change.json
157
+ pnpm exec cage impact --snapshot before-change
103
158
  # 按影响和实际风险选择必要测试,审查迁移与管理员授权。
104
159
  ```
105
160
 
106
- 查询也会更新 `.cage/ontology.json`。基线必须在改代码前另存,保留到验收结束,不能把每次被覆盖的当前图当作旧图。`context` 用于开发前定位,`impact` 用于修改后比较;二者都不能替代业务验收。
161
+ `context`、`graph search/inspect/path` 不写入当前 `.cage/ontology.json`;`analyze/gen` 才更新当前图。命名快照写到 `.cage/snapshots`,同名拒绝覆盖,`snapshot list` 显示保存时间、版本与指纹。独立本体图文件和真实 Git 基线仍可使用。基线保留到验收结束,不能把修改后的当前图当作旧图。`context` 用于开发前定位,`impact` 用于修改后比较;二者都不能替代业务验收。详见[诊断与快照](diagnostics.md)。
107
162
 
108
163
  可直接交给编程工具的要求:
109
164
 
@@ -4,6 +4,8 @@
4
4
 
5
5
  本页代码使用当前公开导出。完整文件示例可直接放入应用;标为“片段”的代码需要结合采购范例已有符号使用。不要把片段中的变量名当成新的框架 API。
6
6
 
7
+ 文件字段使用 `file({ maxBytes, accept }).optional()` 或 `files({ maxBytes, accept, maxCount })`。字段保存文件 ID,上传/续传先获得临时文件,最终通过业务命令绑定;完整流程、限制和存储配置见[文件指南](files.md)。
8
+
7
9
  ## 最小的增、查、改、归档业务
8
10
 
9
11
  下面是完整的 `packages/domain/src/modules/note/note.ts`。它演示带部门范围的便笺,不影响采购范例原有业务;需要此业务时才添加文件。
@@ -167,6 +169,33 @@ export const releaseOnCancel = reaction(OrderCancelled, {
167
169
 
168
170
  事件默认载荷映射的具体命名规则见真实 `event.ts` 与范例;映射不明确时使用 `emit` 显式声明。已部署事件只做兼容扩展,新增字段设 optional;不兼容含义用新事件并考虑旧 outbox 消费,不能只改消费者。
169
171
 
172
+ ### 有界集合与步骤顺序
173
+
174
+ 同一事件需要对 20 台设备调用相同命令时,用 `reactionEach` 声明一次。下面为局部片段,`EquipmentAllocated` 事件含 `assets: [{ assetId }]`,`acquireAsset` 为已导出的目标命令:
175
+
176
+ ```ts
177
+ import { reactionEach } from '@yss123/cage-kernel';
178
+
179
+ export const acquireAllocatedAssets = reactionEach(EquipmentAllocated, {
180
+ command: acquireAsset,
181
+ items: event => event.assets,
182
+ maxItems: 20,
183
+ orderBy: 'assetId',
184
+ order: 20,
185
+ tx: 'same',
186
+ acquires: 'asset.use',
187
+ map: (item, _event, _index) => ({ id: item.assetId }),
188
+ });
189
+ ```
190
+
191
+ `maxItems` 是执行上限,输入 schema 也应表达业务上限。`orderBy` 必须是各项真实存在、非空、同类型且唯一的字符串或有限数值键;按键升序串行执行,以稳定资源锁顺序。`map` 收到排序后的索引,可返回 null 跳过;映射和选择器都是纯函数。
192
+
193
+ 失败诊断中的 `itemIndex` 是跳过 null 后的实际执行输入索引;`sortedIndex` 是排序后原项位置,`originalIndex` 是事件数组原位置,`itemKey` 是稳定排序键,均使用零基索引。诊断不附完整项载荷。
194
+
195
+ 多个跨对象步骤用 `order` 表达预算 → 设备 → 占用明细等依赖。同事件同 `tx` 分组一旦使用 order,所有步骤必须提供互不重复的非负整数。普通 `reaction` 也支持 order;不要靠导出变量的编号表达流程顺序。
196
+
197
+ `tx: 'same'` 的集合仍走每一条目标命令的授权、约束、审计与版本流水线,任一失败使主命令及整个同事务链回滚。默认 outbox 集合由 worker 串行调用并随该消费者事务提交;重试与死信仍按事件处理。图谱和 context 展示目标、上限、排序键、顺序和事务。框架不替业务决定整单或分批:配发整单可用一个命令及其同事务集合,分批归还则每次提交的一批共同回滚。
198
+
170
199
  ## 两种查询写法
171
200
 
172
201
  下面两段均为完整声明,可选择需要的写法。它们都走只读连接与安全视图;调用人需要 `PurchaseOrder.read`,并受其范围与掩码限制。
@@ -202,6 +231,10 @@ export const recentOrders = query('recentOrders', {
202
231
 
203
232
  `sql` 与 `build` 必须二选一。SQL 用数据库的 snake_case 列名和 `:参数名`;不要拼接输入,也不要查询 `core.*`/`sys.*` 基表。`reads` 列出所有涉及的聚合,不能漏掉 join 的对象。业务前端调用生成的 `queries.*`,不复制查询 SQL。
204
233
 
234
+ 有目的级审计要求时,在 query 中声明 `audit: { purpose: '月度结算核对' }`。目的应为固定说明,不包含敏感输入。查询会先可靠写入用途审计再交付结果;潜在敏感明文还按 `reads` 保守审计,不假定任意 SQL 投影能精确推导字段和对象。审计故障返回 `CAGE-AUDIT-001`,不交付查询数据。完整保证见[审计矩阵](architecture.md#审计保证)。
235
+
236
+ 通用列表参数要求正安全整数 page/pageSize;数值筛选必须有限并满足字段 schema,布尔只接受 true/false,日期必须合法,排序字段必须来自公开字段。非法值返回字段级 `INVALID_INPUT`,不会把任意非 true 字符串转成 false。当前仍采用 offset 分页及精确计数,大规模分页成本需按实际数据测量。
237
+
205
238
  ## 审批绑定与选人
206
239
 
207
240
  下面是完整的采购路由文件形状,使用同目录现有的采购符号:
@@ -228,7 +261,7 @@ export const poRoute = route('po-approval', [
228
261
 
229
262
  `approval` 绑定事件与结论命令;`route` 决定步骤与人;`routable` 限制交给路由的数据字段。`onApproved/onRejected` 必须属于同一聚合,且允许 process 调用。
230
263
 
231
- 内置选人器是 `approver.deptLeader(字段名)`、`approver.role(角色code)`、`approver.user(用户id)`。条件使用 `gt/gte/lt/lte/eq/ne/isIn` 等封闭表达式。`mode: 'any'/'all'` 描述一步内的人如何完成,不表示任意并行分支。可以在代码组合这些能力;任意函数选人、转签和加签需框架扩展或外部审批适配器,当前不能直接写成现成 API。
264
+ 内置选人器是 `approver.deptLeader(字段名)`、`approver.role(角色code)`、`approver.user(用户id)`。条件使用 `gt/gte/lt/lte/eq/ne/isIn` 等封闭表达式。`mode: 'any'/'all'` 描述一步内的人如何完成,不表示任意并行分支。人工节点可通过 `actions: { transfer: true, delegate: true, addSign: true }` 显式开放转办、委派归还和当前节点并行必签,默认关闭;任务版本、权限、SDK 与边界见[审批任务流转](approvals.md)。任意函数选人、前后加签和并行流程分支仍需扩展。
232
265
 
233
266
  被选中的审批人还要具备结论命令所需能力、范围和额度。部门负责人为空会产生 `CAGE-APPR-007`,详见[排错](troubleshooting.md)。
234
267
 
@@ -4,6 +4,8 @@
4
4
 
5
5
  两种模板使用同一规则:采购模板提供完整业务,空白模板保留认证和工作台。不要为小功能创建空目录;文件确实承担独立职责时再拆分。
6
6
 
7
+ 目录表达代码归属,[详细中文注释规范](commenting.md)说明每个文件及接口如何被理解和使用。框架与脚手架应用的新建、修改源码都必须执行这份规范,职责说明和实现一起交付。
8
+
7
9
  ## 项目分工
8
10
 
9
11
  ```text
@@ -14,8 +16,9 @@
14
16
  │ │ └─ worker.ts # 启动异步任务,按环境装配连接器 fake
15
17
  │ └─ web/src/
16
18
  │ ├─ main.tsx # 挂载 React、全局 Provider 和样式
17
- │ ├─ app/ # 会话恢复、布局、导航、模块组合
19
+ │ ├─ app/ # 会话恢复、URL 路由、布局、模块组合
18
20
  │ │ ├─ app.tsx
21
+ │ │ ├─ use-session.ts # 会话恢复和 401 回跳,不把网络故障当成未登录
19
22
  │ │ ├─ workspace-layout.tsx
20
23
  │ │ └─ styles/global.css
21
24
  │ ├─ modules/ # 按业务命名,一个模块内管理它的页面和交互
@@ -71,7 +74,7 @@
71
74
  3. 需要驱动其他模块时,把 reaction 放在 `workflows/expense-xxx.ts`,从双方模块公开入口取声明。第三方接口放 `integrations/<系统名>.ts`,声明 hosts、schema、secret 名、outbound/inbound,不直接发网络请求。
72
75
  4. 运行 `pnpm gen`,审查 `contracts/src/aggregates/expense/index.ts` 和迁移草稿。根 `@app/contracts` 自动导出 Expense API/类型。不要在 contracts 里手工建“报销 service”。
73
76
  5. 在 `apps/web/src/modules/expense/pages/expense-list-page.tsx` 使用生成 hooks。新建表单放该模块 `components/expense-form.tsx`,模块专用 hooks 放自己的 `hooks`,专用接口封装按需放自己的 `api`,专用常量留在模块内。
74
- 6. 从前端模块 `index.ts` 导出页面,应用壳从 `../modules/expense` 引入并接入导航。页面自己拥有筛选、分页、弹窗和提交状态;不要把它们全移到 App 或 Workspace。
77
+ 6. 从前端模块 `index.ts` 导出页面,应用壳从 `../modules/expense` 引入并注册列表、详情 URL,通过 Outlet 放入工作台布局。导航用 Link/NavLink,筛选和分页用 useSearchParams;弹窗和提交状态留在页面,不把整个页面切换写成 useState。按[路由指南](routing.md)验收深链接、刷新、前进后退和登录回跳。
75
78
 
76
79
  前后端可以有相同的业务模块名,但文件不混放:领域定义授权和行为,前端管理交互,通过生成契约连接。API 启动入口维持薄壳,普通业务无需新增 controller/service/repository。
77
80
 
@@ -107,7 +110,9 @@
107
110
  - 入口只挂载或组合;页面主要描述页面流程。表单、表格或交互已承担独立职责时再抽取,避免一个大组件处理所有业务,也避免每个按钮都新建文件。
108
111
  - 全局主题、reset、基础布局放 `app/styles`;业务专用样式与组件就近放置,可用 CSS Modules。不要把所有新增业务样式长期追加进一个全局文件。当前范例保留既有全局主题,结构调整不重新设计界面。
109
112
  - 单测与被测代码相邻,使用 `*.test.ts(x)`。需要真实业务链路的集成用例与所属业务模块相邻;框架的测试发现递归查找,不必为它回到 src 根目录。
110
- - 新代码写清职责、关键流程和设计原因,特别是事务边界、状态迁移、缓存刷新和权限展示。不要给每行语法写翻译,不加无业务价值的防御分支和静默兜底;脚本使用 TypeScript,不新增 `.mjs`。
113
+ - 新建和修改的手写源码文件必须有中文职责、主要调用链与运行边界说明;模块入口也要说明公开职责。导出函数/类/声明、React 组件/hooks、接口及类型字段使用中文 JSDoc,复杂私有函数与关键分支解释具体步骤、原因和边界,详细要求见[注释规范](commenting.md)。
114
+ - 业务字段说明单位、格式、空值与来源;命令说明输入、权限、状态、读依赖、事件、事务与失败行为;页面说明 URL、数据加载、权限和错误交互;测试说明意图与覆盖边界;脚本说明前置条件、写入/覆盖等副作用。修改已有代码时同步补齐受影响的上下游注释,不能只更新当前实现。
115
+ - 注释必须准确、充分,不以“代码自解释”免除必要说明,不用每行语法翻译、注释字数或比例充数。生成注释从声明/生成器维护,已执行或已发布迁移不可因补注释而重写。不加无业务价值的防御分支和静默兜底;脚本使用 TypeScript,不新增 `.mjs`。
111
116
 
112
117
  ## 自动约束与整理已有项目
113
118
 
@@ -11,9 +11,11 @@
11
11
  | `packages/domain/src/index.ts` | 哪些声明真正被注册 | 保留组织模型,导出新增业务,避免导出名冲突 |
12
12
  | `packages/domain/src/modules/inventory/inventory.ts` | 最简字段、创建命令、资源锁聚合 | scope.none 不等于无需授权;创建与释放都是命令 |
13
13
  | `packages/domain/src/modules/purchase/purchase-order.ts` | 单据生命周期、金额、明细、约束、事件 | 哪些字段由输入提供,哪些由内核维护;每个状态的允许操作 |
14
+ | `packages/domain/src/modules/purchase/approval-members.ts` | 采购协作名录与公开业务姓名 | 名录读权限与系统用户资料分离;成员身份不授予审批权限 |
14
15
  | `packages/domain/src/workflows/purchase-inventory.ts` | 同事务建锁、异步释放 | acquires/releases 的配对及 map 返回 null 的原因 |
15
- | `packages/domain/src/modules/purchase/approvals.ts` | 启动/取消审批、条件步骤与选人 | routable、部门负责人、角色 code、结论命令 |
16
+ | `packages/domain/src/modules/purchase/approvals.ts` | 启动/取消审批、专业会签、财务候选与任务动作 | routable、部门负责人、字段选人、候选领取、结论命令 |
16
17
  | `packages/domain/src/integrations/erp.ts` | 出站推单、成功回写、入站回调 | 白名单、secret 名、schema、幂等与 HMAC |
18
+ | `packages/domain/src/integrations/intelligence.ts` | 消费框架托管模型和本体助理 | Admin 配置连接,通用工具由框架生成 |
17
19
  | `packages/domain/src/modules/purchase/queries.ts` | 按状态汇总 | reads、安全视图、命名参数 |
18
20
  | `packages/domain/src/modules/purchase/jobs.ts` | 过期草稿取消 | reads/calls 和 job 调用身份 |
19
21
  | `apps/api/src/main.ts`、`apps/api/src/worker.ts` | 如何启动框架与 worker | 保持薄装配,fake 只用于相应环境 |
@@ -27,8 +29,13 @@
27
29
  ```text
28
30
  采购员新建 → draft
29
31
  → submit → pending_approval + OrderSubmitted(同事务提交)
30
- → worker 消费事件 → 按 poRoute 创建经理待办
31
- → 经理审批;金额 > 50000 时还有财务步骤
32
+ → worker 消费事件 → AI 材料预审
33
+ → 材料不足:returnForChanges → draft,补充用途后重新提交、从头审核
34
+ → 疑难材料:在本节点创建人工接管待办
35
+ → 材料清楚:通过本节点,创建经理待办
36
+ → 部门经理审批
37
+ → 申请启用专业复核时:所选专业人员全部会签
38
+ → 金额 > 50000 时:财务共享候选任务,由 finance 成员领取后处理
32
39
  → 流程完成 → 调用 approve
33
40
  → 职责分离、额度、库存检查
34
41
  → approved + OrderApproved
@@ -41,11 +48,12 @@
41
48
 
42
49
  submit 返回成功只表示单据和事件已提交,不表示待办、ERP 或其他异步工作已经完成。worker 未运行时,单据可以已经处于待审批,但没有待办。
43
50
 
44
- ### 为什么分三个聚合
51
+ ### 为什么分开单据、库存与协作名录
45
52
 
46
53
  - `PurchaseOrder` 管单据、审批结论和采购状态。
47
54
  - `Inventory` 是物料台账,提供库存检查的数据。
48
55
  - `InventoryLock` 记录某张订单的资源占用,使用订单 id 作为锁 id,让释放目标明确。
56
+ - `ApprovalMember` 保存采购参与者可读取的公开业务姓名和专业说明。它引用真实用户,但不开放 `User.name` 等系统用户资料,也不代替角色授权。
49
57
 
50
58
  审批通过和建锁放在同一事务,是为了避免“单据已批准却没拿到资源”。ERP 网络请求放到 outbox,是因为远端调用无法与本地 PostgreSQL 共同回滚。
51
59
 
@@ -67,15 +75,35 @@ submit 返回成功只表示单据和事件已提交,不表示待办、ERP 或
67
75
 
68
76
  | 对象 | 配置要点 |
69
77
  | --- | --- |
70
- | 采购员 | 创建/查看/提交/取消采购单等所需能力,所属部门,以及采购单数据范围 |
71
- | 经理 | `PurchaseOrder.read/approve/reject`,适当数据范围,`approve` 的 `ceiling` 额度参数 |
78
+ | 采购员 | 创建/查看/提交/取消采购单等所需能力,所属部门,以及采购单数据范围;配置专业复核需 `PurchaseOrder.setReviewers` 和 `ApprovalMember.read` |
79
+ | 智能助理使用人 | 显式授予 `Sys.ai.use`;编辑用途还需 `PurchaseOrder.explainPurpose` |
80
+ | 模型管理者 | `Sys.ai.models.manage`;在 `/admin/#/models` 配置并启用 `main`,部署主密钥见[智能能力指南](intelligence.md) |
81
+ | 助理性格管理者 | `Sys.ai.personalities.manage`;在 `/admin/#/personalities` 编辑预设、自定义性格、设置默认并试聊 |
82
+ | AI 预审角色 | 创建 code 为 `purchase_ai_reviewer` 的角色,授予 `PurchaseOrder.read/returnForChanges` 及覆盖申请范围的数据权限;本例 AI 仅预审,不执行最终 approve |
83
+ | 经理 | `PurchaseOrder.read/approve/reject/returnForChanges`,适当数据范围,`approve` 的 `ceiling` 额度参数 |
84
+ | 专业协作人 | 真实账号及同样的审批能力、范围、额度;由名录管理员通过 `ApprovalMember.create` 登记公开业务姓名、专业说明;需要在任务中选人时授予 `ApprovalMember.read` |
85
+ | 名录管理员 | 显式授予 `ApprovalMember.create/update/retire/read`;登记、更新资料或退役不修改用户角色,不自动给采购参与者授予 `User.read` |
72
86
  | 部门 | 将采购员所属部门的负责人设为经理;不能为空 |
73
- | 财务 | 角色 **code** 为 `finance`,给实际用户分配;配置审批所需权限、范围及额度 |
87
+ | 财务 | 角色 **code** 为 `finance`,给至少两位实际用户分配以体验共享候选池;配置审批所需权限、范围及足够额度;领取后才能处理 |
74
88
  | 库存台账 | 预先登记与采购明细相同的 sku,数量满足演示检查 |
75
89
  | 连接器环境 | fake 阶段使用 worker 注册的 fake;真实环境另配 host 对应密钥及回调签名密钥 |
76
90
 
77
91
  经理与提单人必须是不同用户。配置“负责人”决定选谁;配置角色能力与范围决定此人能否完成结论命令,两者都需要。金额 **大于** 50,000 才追加财务步骤,恰好 50,000 不满足 gt 条件。
78
92
 
93
+ 专业复核默认关闭,兼容旧单据的空字段;开启后需选择 1–5 位不同且非提单人的有效名录成员。`setReviewers` 只允许编辑草稿;创建可暂存未选完整的草稿,但 `submit` 会重新核对名单,拒绝保存后退役的成员。名录退役不修改已经提交的名单快照,也不撤销在途任务;账号停用和实际审批权限继续由审批引擎核验。名录的用户引用不能换绑,已退役记录保留且不支持重新启用。
94
+
95
+ `ApprovalMember` 使用 `scope.none()`,没有部门或本人字段。名录管理员和需要选人的采购参与者都必须显式获得该聚合的 `all` 数据范围;仅授予 `ApprovalMember.read` 仍看不到成员,草稿的专业名单校验也会因读范围不足拒绝。这里的 `all` 始终受当前租户隔离,不要求也不授予 `User.read`。
96
+
97
+ 经理、专业会签和财务节点均显式启用转办、委派与前置/后置/并行加签,节点政策随每次提交保存。转办交接处理责任;委派处理完成后归还原审批人;加签增加必须完成的签署任务,前置签署完成前原任务等待,后置签署在原任务通过后才开放。任务动作和决定都应携带页面当前 `revision`,冲突后刷新待办,不自动重试旧决定。AI 人工接管继续采用 AI 节点自身政策,不能因为后续经理节点启用动作而越权操作。
98
+
99
+ 逐项体验时用不同采购单分别记录:普通经理审批、专业双人会签、恰好 50,000 元跳过财务、超过 50,000 元财务领取/释放/再领取、转办、委派归还、三种加签,以及退回重提和申请人取消。每一步同时查看采购状态、当前可操作/等待任务及动作历史;专业会签只通过一人或必签尚未完成时采购单应仍待审批,最终通过才产生库存锁。浏览器验收需切换真实账号进行,自动测试通过不能替代页面验证。
100
+
101
+ 可分别准备“采购办公用品”、说明实际使用场景的完整用途、含“紧急采购”的用途,体验退回、通过本节点和转人工。真实模型的判定应按实际样例验收;故障默认转人工,不能当作正常审查通过。详情页显示历史理由、修改建议及审核轮次;用途编辑框的未保存内容会经 SDK 一起传给助理,服务端重新核对当前单据与权限。
102
+
103
+ 拥有 `Sys.ai.use` 的用户在所有业务页面右下角都有助理入口,点击打开悬浮对话窗,收起后继续执行当前任务。工作台、采购列表/详情、库存和待办分别提供页面语义;列表带筛选与可见记录,详情带单据引用和未保存用途。应用壳只挂载一个 `AssistantScope`,业务页面通过 `AssistantPage` 注册上下文,所以站内切页保留对话,但下一条消息使用新页面的快照。不同页面拥有独立的 `AiPageContext` 身份,旧任务要求补充页面时不能提交新页面代替。登录页和独立的 `/admin/` 不挂载业务助理。
104
+
105
+ 悬浮窗的“相处方式”选择器消费框架 `useAssistant` 的性格目录和切换接口。默认跟随 Admin 设置,也可为当前会话选择其他已启用性格;切换不清空对话,旧回复保留生成时的性格名称。采购范例没有单独的性格表或 Prompt 拼接逻辑,AI 审批继续使用原节点策略。
106
+
79
107
  ## 页面如何使用框架
80
108
 
81
109
  采购页和库存页通过 `@app/contracts` 获取方法、快照类型和查询 hooks。命令成功后刷新相应列表;失败时按 code/domainCode 展示原因。只有允许 user 调用的命令才生成页面方法,因此审批通过应使用待办接口。
@@ -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
 
@@ -40,7 +42,13 @@
40
42
  4. 配置实际部门负责人、角色或指定用户;给审批人配置能力、范围和额度。
41
43
  5. 页面通过待办接口操作。通过后需占用资源时用反应调用资源命令,按业务一致性选择同事务。
42
44
 
43
- 完成标准:提交生成待办、正确的人审批、越权和自审批拒绝、取消能结束待办、资源配对完整。任意流程设计器、动态 JS 选人、转签/加签不属于当前现成能力,需要明确扩展范围。
45
+ 完成标准:提交生成待办、正确的人审批、越权和自审批拒绝、取消能结束待办、资源配对完整。转办、委派归还和当前节点并行必签见[审批任务流转](approvals.md),须显式启用政策并传任务版本。任意流程设计器、动态 JS 选人、前后加签和指定节点退回仍需明确扩展范围。
46
+
47
+ ## 加入 AI 审批或随页助理
48
+
49
+ 先检查 domain 是否已经导出 `ai()`,再按需求修改已有声明或启用一次。AI 审批配置在业务模块的现有 `step` 内,填写 `kind: 'ai'`、审核策略、取证字段/查询与 `handoff`,由 `approval` 绑定自动执行角色和结论命令。业务助理使用框架生成的工具,前端通过 `useAssistant` 与 `useAiPageContext` 接入当前页面;悬浮窗、Markdown 和确认交互由应用实现。
50
+
51
+ 模型地址、协议和密钥通过 `managedModel` 对应的 Admin 配置管理,性格也使用框架现有管理页。先完成系统迁移和必要授权,按[智能化指南](intelligence.md)的接入顺序、SDK 示例和验收步骤验证。分别说明框架支持、应用已启用和真实联调结果;空白模板中的参考代码不参与运行。
44
52
 
45
53
  ## 增加报表或复杂列表
46
54
 
@@ -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:133`
51
+ - `packages/ai/src/index.ts:135`
52
+
53
+ 实现片段(位置随框架版本更新):
54
+
55
+ ```ts
56
+ /**
57
+ * 校验扩展唯一性与审批模型引用,无效配置以 CAGE-AI-001 拒绝。
58
+ */
59
+ validate(registry: Registry): void;
60
+ }
61
+ ```