@yss123/cage-cli 0.3.1 → 0.4.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 (388) hide show
  1. package/README.md +7 -3
  2. package/dist/analyze.js +3 -0
  3. package/dist/analyze.js.map +1 -1
  4. package/dist/capabilities.js +50 -40
  5. package/dist/capabilities.js.map +1 -1
  6. package/dist/config.d.ts +4 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/context.js +2 -2
  9. package/dist/context.js.map +1 -1
  10. package/dist/doctor.js +1 -1
  11. package/dist/doctor.js.map +1 -1
  12. package/dist/findings.d.ts +1 -1
  13. package/dist/findings.js +2 -2
  14. package/dist/findings.js.map +1 -1
  15. package/dist/graph-business.d.ts +11 -8
  16. package/dist/graph-business.js +16 -16
  17. package/dist/graph-business.js.map +1 -1
  18. package/dist/graph-relations.js +3 -5
  19. package/dist/graph-relations.js.map +1 -1
  20. package/dist/impact.js +1 -4
  21. package/dist/impact.js.map +1 -1
  22. package/dist/main.js +1 -1
  23. package/dist/main.js.map +1 -1
  24. package/dist/ontology-names.d.ts +17 -0
  25. package/dist/ontology-names.js +42 -0
  26. package/dist/ontology-names.js.map +1 -0
  27. package/dist/project-structure.js +2 -2
  28. package/dist/project-structure.js.map +1 -1
  29. package/dist/sync.d.ts +5 -1
  30. package/dist/sync.js +45 -121
  31. package/dist/sync.js.map +1 -1
  32. package/graph-ui/app.js +3 -2
  33. package/graph-ui/business.js +11 -3
  34. package/graph-ui/graph-business.js +16 -16
  35. package/graph-ui/graph-relations.js +3 -5
  36. package/package.json +6 -6
  37. package/templates/app/.agents/skills/cage-development/SKILL.md +10 -0
  38. package/templates/app/AGENTS.md +42 -122
  39. package/templates/app/CLAUDE.md +6 -0
  40. package/templates/app/README.md +6 -6
  41. package/templates/app/apps/api/package.json +2 -2
  42. package/templates/app/apps/web/package.json +3 -1
  43. package/templates/app/apps/web/src/app/styles/global.css +12 -11
  44. package/templates/app/apps/web/src/main.tsx +18 -7
  45. package/templates/app/apps/web/src/shared/lib/error-message.ts +1 -1
  46. package/templates/app/apps/web/src/shared/ui/approval-member-picker.tsx +1 -1
  47. package/templates/app/cage.config.json +2 -1
  48. package/templates/app/docs/README.md +13 -0
  49. package/templates/app/docs/development/README.md +80 -0
  50. package/templates/app/docs/development/examples/note/note-detail-page.tsx +106 -0
  51. package/templates/app/docs/development/examples/note/note.ts +71 -0
  52. package/templates/app/docs/development/examples/note/notes-page.tsx +87 -0
  53. package/templates/{blank/docs/ai → app/docs/development/examples}/purchase-example.md +10 -10
  54. package/templates/{blank/docs/ai → app/docs/development/getting-started}/architecture.md +9 -9
  55. package/templates/app/docs/development/getting-started/first-feature.md +66 -0
  56. package/templates/{blank/docs/ai → app/docs/development/getting-started}/workflow.md +22 -27
  57. package/templates/app/docs/{ai → development/guides}/approvals.md +19 -9
  58. package/templates/app/docs/development/guides/business-collaboration.md +65 -0
  59. package/templates/{blank/docs/ai → app/docs/development/guides}/files.md +5 -1
  60. package/templates/app/docs/development/guides/frontend-ui.md +30 -0
  61. package/templates/app/docs/{ai → development/guides}/intelligence.md +18 -16
  62. package/templates/app/docs/development/guides/ontology-modeling.md +83 -0
  63. package/templates/app/docs/development/guides/recipes.md +123 -0
  64. package/templates/app/docs/{ai → development/guides}/relations.md +33 -10
  65. package/templates/{blank/docs/ai → app/docs/development/guides}/routing.md +1 -1
  66. package/templates/app/docs/{ai → development/guides}/transfers.md +1 -1
  67. package/templates/{blank/docs/ai → app/docs/development/reference}/commenting.md +8 -5
  68. package/templates/app/docs/{ai → development/reference}/primitives.md +12 -64
  69. package/templates/app/docs/{ai → development/reference}/project-structure.md +2 -2
  70. package/templates/app/docs/development/skills/cage-development/SKILL.md +144 -0
  71. package/templates/{blank/docs/ai → app/docs/development/tools}/diagnostics.md +7 -4
  72. package/templates/{blank/docs/ai → app/docs/development/tools}/ontology-context.md +4 -4
  73. package/templates/app/docs/{ai → development/tools}/troubleshooting.md +10 -4
  74. package/templates/app/docs/errors/CAGE-AI-001.md +1 -1
  75. package/templates/app/docs/errors/CAGE-APPR-001.md +2 -2
  76. package/templates/app/docs/errors/CAGE-APPR-002.md +1 -1
  77. package/templates/app/docs/errors/CAGE-APPR-003.md +1 -1
  78. package/templates/app/docs/errors/CAGE-APPR-004.md +1 -1
  79. package/templates/app/docs/errors/CAGE-APPR-005.md +1 -1
  80. package/templates/app/docs/errors/CAGE-APPR-006.md +1 -1
  81. package/templates/app/docs/errors/CAGE-APPR-007.md +2 -2
  82. package/templates/app/docs/errors/CAGE-APPR-010.md +1 -1
  83. package/templates/app/docs/errors/CAGE-AUDIT-001.md +1 -1
  84. package/templates/app/docs/errors/CAGE-AUTH-001.md +1 -1
  85. package/templates/app/docs/errors/CAGE-BIZ-001.md +1 -1
  86. package/templates/app/docs/errors/CAGE-BIZ-002.md +1 -1
  87. package/templates/app/docs/errors/CAGE-BUDGET-001.md +1 -1
  88. package/templates/app/docs/errors/CAGE-BUDGET-002.md +1 -1
  89. package/templates/app/docs/errors/CAGE-BUDGET-003.md +1 -1
  90. package/templates/app/docs/errors/CAGE-CMD-002.md +1 -1
  91. package/templates/app/docs/errors/CAGE-CMD-003.md +1 -1
  92. package/templates/app/docs/errors/CAGE-CONN-001.md +1 -1
  93. package/templates/app/docs/errors/CAGE-CONN-002.md +1 -1
  94. package/templates/app/docs/errors/CAGE-CONN-003.md +1 -1
  95. package/templates/app/docs/errors/CAGE-CONN-004.md +1 -1
  96. package/templates/app/docs/errors/CAGE-CONN-005.md +1 -1
  97. package/templates/app/docs/errors/CAGE-CONN-006.md +1 -1
  98. package/templates/app/docs/errors/CAGE-CONN-007.md +1 -1
  99. package/templates/app/docs/errors/CAGE-CONN-008.md +1 -1
  100. package/templates/app/docs/errors/CAGE-CONN-009.md +1 -1
  101. package/templates/app/docs/errors/CAGE-CONN-010.md +1 -1
  102. package/templates/app/docs/errors/CAGE-CONN-011.md +1 -1
  103. package/templates/app/docs/errors/CAGE-CONN-012.md +1 -1
  104. package/templates/app/docs/errors/CAGE-CONN-013.md +1 -1
  105. package/templates/app/docs/errors/CAGE-CONN-014.md +1 -1
  106. package/templates/app/docs/errors/CAGE-CONN-015.md +1 -1
  107. package/templates/app/docs/errors/CAGE-CREATE-001.md +2 -2
  108. package/templates/app/docs/errors/CAGE-DECL-001.md +1 -1
  109. package/templates/app/docs/errors/CAGE-DECL-002.md +1 -1
  110. package/templates/app/docs/errors/CAGE-DECL-003.md +1 -1
  111. package/templates/app/docs/errors/CAGE-DECL-004.md +1 -1
  112. package/templates/app/docs/errors/CAGE-DEP-001.md +1 -1
  113. package/templates/app/docs/errors/CAGE-DEP-002.md +1 -1
  114. package/templates/app/docs/errors/CAGE-DEP-003.md +1 -1
  115. package/templates/app/docs/errors/CAGE-DEP-004.md +1 -1
  116. package/templates/app/docs/errors/CAGE-DEP-005.md +1 -1
  117. package/templates/app/docs/errors/CAGE-DIAG-001.md +1 -1
  118. package/templates/app/docs/errors/CAGE-DLQ-001.md +1 -1
  119. package/templates/app/docs/errors/CAGE-ENV-001.md +1 -1
  120. package/templates/app/docs/errors/CAGE-ENV-002.md +1 -1
  121. package/templates/app/docs/errors/CAGE-ENV-003.md +1 -1
  122. package/templates/app/docs/errors/CAGE-EVENT-001.md +1 -1
  123. package/templates/app/docs/errors/CAGE-EVENT-002.md +1 -1
  124. package/templates/app/docs/errors/CAGE-FIELD-001.md +1 -1
  125. package/templates/app/docs/errors/CAGE-FIELD-002.md +1 -1
  126. package/templates/app/docs/errors/CAGE-FIELD-003.md +1 -1
  127. package/templates/app/docs/errors/CAGE-FIELD-004.md +1 -1
  128. package/templates/app/docs/errors/CAGE-FILE-001.md +1 -1
  129. package/templates/app/docs/errors/CAGE-GEN-001.md +1 -1
  130. package/templates/app/docs/errors/CAGE-GEN-002.md +1 -1
  131. package/templates/app/docs/errors/CAGE-GEN-003.md +1 -1
  132. package/templates/app/docs/errors/CAGE-GRANT-001.md +19 -13
  133. package/templates/app/docs/errors/CAGE-GRANT-002.md +3 -3
  134. package/templates/app/docs/errors/CAGE-GRANT-003.md +4 -4
  135. package/templates/app/docs/errors/CAGE-IMPACT-001.md +1 -1
  136. package/templates/app/docs/errors/CAGE-IMPACT-002.md +1 -1
  137. package/templates/app/docs/errors/CAGE-INIT-001.md +1 -1
  138. package/templates/app/docs/errors/CAGE-INIT-002.md +1 -1
  139. package/templates/app/docs/errors/CAGE-INIT-003.md +1 -1
  140. package/templates/app/docs/errors/CAGE-INIT-004.md +1 -1
  141. package/templates/app/docs/errors/CAGE-INIT-005.md +1 -1
  142. package/templates/app/docs/errors/CAGE-JOB-001.md +1 -1
  143. package/templates/app/docs/errors/CAGE-JOB-002.md +1 -1
  144. package/templates/app/docs/errors/CAGE-JOB-003.md +1 -1
  145. package/templates/app/docs/errors/CAGE-LINT-001.md +1 -1
  146. package/templates/app/docs/errors/CAGE-MIG-001.md +1 -1
  147. package/templates/app/docs/errors/CAGE-MIG-002.md +1 -1
  148. package/templates/app/docs/errors/CAGE-MIG-005.md +1 -1
  149. package/templates/app/docs/errors/CAGE-NAME-001.md +1 -1
  150. package/templates/app/docs/errors/CAGE-NAME-002.md +1 -1
  151. package/templates/app/docs/errors/CAGE-NAME-003.md +1 -1
  152. package/templates/app/docs/errors/CAGE-NAME-004.md +1 -1
  153. package/templates/app/docs/errors/CAGE-NAME-005.md +1 -1
  154. package/templates/app/docs/errors/CAGE-NAME-006.md +1 -1
  155. package/templates/app/docs/errors/CAGE-ONTOLOGY-001.md +52 -0
  156. package/templates/app/docs/errors/CAGE-ORG-001.md +1 -1
  157. package/templates/app/docs/errors/CAGE-PAIR-002.md +1 -1
  158. package/templates/app/docs/errors/CAGE-QUERY-001.md +1 -1
  159. package/templates/app/docs/errors/CAGE-QUERY-002.md +1 -1
  160. package/templates/app/docs/errors/CAGE-QUERY-003.md +1 -1
  161. package/templates/app/docs/errors/CAGE-REACT-001.md +1 -1
  162. package/templates/app/docs/errors/CAGE-REACT-002.md +1 -1
  163. package/templates/app/docs/errors/CAGE-REACT-003.md +1 -1
  164. package/templates/app/docs/errors/CAGE-READS-001.md +1 -1
  165. package/templates/app/docs/errors/CAGE-REG-001.md +1 -1
  166. package/templates/app/docs/errors/CAGE-REG-002.md +1 -1
  167. package/templates/app/docs/errors/CAGE-REG-003.md +1 -1
  168. package/templates/app/docs/errors/CAGE-REL-001.md +1 -1
  169. package/templates/app/docs/errors/CAGE-ROUTE-001.md +1 -1
  170. package/templates/app/docs/errors/CAGE-SCOPE-001.md +1 -1
  171. package/templates/app/docs/errors/CAGE-SCOPE-002.md +1 -1
  172. package/templates/app/docs/errors/CAGE-SECRET-001.md +1 -1
  173. package/templates/app/docs/errors/CAGE-SECRET-002.md +1 -1
  174. package/templates/app/docs/errors/CAGE-SENS-001.md +1 -1
  175. package/templates/app/docs/errors/CAGE-SQL-001.md +1 -1
  176. package/templates/app/docs/errors/CAGE-SQL-002.md +1 -1
  177. package/templates/app/docs/errors/CAGE-STATE-001.md +1 -1
  178. package/templates/app/docs/errors/CAGE-STATE-002.md +1 -1
  179. package/templates/app/docs/errors/CAGE-STATE-003.md +2 -2
  180. package/templates/app/docs/errors/CAGE-STATE-004.md +1 -1
  181. package/templates/app/docs/errors/CAGE-STATE-005.md +1 -1
  182. package/templates/app/docs/errors/CAGE-STATE-010.md +1 -1
  183. package/templates/app/docs/errors/CAGE-STATE-011.md +1 -1
  184. package/templates/app/docs/errors/CAGE-STRUCT-001.md +4 -4
  185. package/templates/app/docs/errors/CAGE-STRUCT-002.md +3 -3
  186. package/templates/app/docs/errors/CAGE-SYNC-001.md +4 -4
  187. package/templates/app/docs/errors/CAGE-TEST-001.md +1 -1
  188. package/templates/app/docs/errors/CAGE-TEST-002.md +1 -1
  189. package/templates/app/docs/errors/CAGE-TEST-003.md +1 -1
  190. package/templates/app/docs/errors/CAGE-UNSAFE-001.md +1 -1
  191. package/templates/app/docs/errors/CAGE-UPGRADE-001.md +1 -1
  192. package/templates/app/docs/errors/CAGE-WORKER-001.md +1 -1
  193. package/templates/app/docs/errors/CAGE-WORKER-002.md +1 -1
  194. package/templates/app/docs/errors/CAGE-WORKER-003.md +1 -1
  195. package/templates/app/docs/errors/README.md +8 -2
  196. package/templates/app/docs/errors/runtime.md +2 -2
  197. package/templates/app/package.json +3 -3
  198. package/templates/app/packages/contracts/package.json +1 -1
  199. package/templates/app/packages/contracts/src/aggregates/role/index.ts +2 -2
  200. package/templates/app/packages/contracts/src/aggregates/user/index.ts +3 -3
  201. package/templates/app/packages/domain/package.json +5 -5
  202. package/templates/app/packages/domain/src/modules/purchase/approval-members.ts +1 -1
  203. package/templates/app/packages/domain/src/modules/purchase/approvals.ts +2 -2
  204. package/templates/app/packages/domain/src/modules/purchase/intelligence.test.ts +4 -4
  205. package/templates/app/packages/domain/src/modules/purchase/purchase-order.test.ts +10 -17
  206. package/templates/app/packages/domain/src/modules/purchase/purchase-order.ts +4 -5
  207. package/templates/app/packages/domain/src/workflows/purchase-process.ts +1 -1
  208. package/templates/blank/.agents/skills/cage-development/SKILL.md +10 -0
  209. package/templates/blank/AGENTS.md +42 -122
  210. package/templates/blank/CLAUDE.md +6 -0
  211. package/templates/blank/README.md +3 -3
  212. package/templates/blank/apps/api/package.json +1 -1
  213. package/templates/blank/apps/web/package.json +3 -1
  214. package/templates/blank/apps/web/src/app/styles/global.css +6 -5
  215. package/templates/blank/apps/web/src/main.tsx +18 -7
  216. package/templates/blank/cage.config.json +1 -0
  217. package/templates/blank/docs/README.md +13 -0
  218. package/templates/blank/docs/development/README.md +80 -0
  219. package/templates/blank/docs/development/examples/note/note-detail-page.tsx +106 -0
  220. package/templates/blank/docs/development/examples/note/note.ts +71 -0
  221. package/templates/blank/docs/development/examples/note/notes-page.tsx +87 -0
  222. package/templates/{app/docs/ai → blank/docs/development/examples}/purchase-example.md +10 -10
  223. package/templates/{app/docs/ai → blank/docs/development/getting-started}/architecture.md +9 -9
  224. package/templates/blank/docs/development/getting-started/first-feature.md +66 -0
  225. package/templates/{app/docs/ai → blank/docs/development/getting-started}/workflow.md +22 -27
  226. package/templates/blank/docs/{ai → development/guides}/approvals.md +19 -9
  227. package/templates/blank/docs/development/guides/business-collaboration.md +65 -0
  228. package/templates/{app/docs/ai → blank/docs/development/guides}/files.md +5 -1
  229. package/templates/blank/docs/development/guides/frontend-ui.md +30 -0
  230. package/templates/blank/docs/{ai → development/guides}/intelligence.md +18 -16
  231. package/templates/blank/docs/development/guides/ontology-modeling.md +83 -0
  232. package/templates/blank/docs/development/guides/recipes.md +123 -0
  233. package/templates/blank/docs/{ai → development/guides}/relations.md +33 -10
  234. package/templates/{app/docs/ai → blank/docs/development/guides}/routing.md +1 -1
  235. package/templates/blank/docs/{ai → development/guides}/transfers.md +1 -1
  236. package/templates/{app/docs/ai → blank/docs/development/reference}/commenting.md +8 -5
  237. package/templates/blank/docs/{ai → development/reference}/primitives.md +12 -64
  238. package/templates/blank/docs/{ai → development/reference}/project-structure.md +2 -2
  239. package/templates/blank/docs/development/skills/cage-development/SKILL.md +144 -0
  240. package/templates/{app/docs/ai → blank/docs/development/tools}/diagnostics.md +7 -4
  241. package/templates/{app/docs/ai → blank/docs/development/tools}/ontology-context.md +4 -4
  242. package/templates/blank/docs/{ai → development/tools}/troubleshooting.md +10 -4
  243. package/templates/blank/docs/errors/CAGE-AI-001.md +1 -1
  244. package/templates/blank/docs/errors/CAGE-APPR-001.md +2 -2
  245. package/templates/blank/docs/errors/CAGE-APPR-002.md +1 -1
  246. package/templates/blank/docs/errors/CAGE-APPR-003.md +1 -1
  247. package/templates/blank/docs/errors/CAGE-APPR-004.md +1 -1
  248. package/templates/blank/docs/errors/CAGE-APPR-005.md +1 -1
  249. package/templates/blank/docs/errors/CAGE-APPR-006.md +1 -1
  250. package/templates/blank/docs/errors/CAGE-APPR-007.md +2 -2
  251. package/templates/blank/docs/errors/CAGE-APPR-010.md +1 -1
  252. package/templates/blank/docs/errors/CAGE-AUDIT-001.md +1 -1
  253. package/templates/blank/docs/errors/CAGE-AUTH-001.md +1 -1
  254. package/templates/blank/docs/errors/CAGE-BIZ-001.md +1 -1
  255. package/templates/blank/docs/errors/CAGE-BIZ-002.md +1 -1
  256. package/templates/blank/docs/errors/CAGE-BUDGET-001.md +1 -1
  257. package/templates/blank/docs/errors/CAGE-BUDGET-002.md +1 -1
  258. package/templates/blank/docs/errors/CAGE-BUDGET-003.md +1 -1
  259. package/templates/blank/docs/errors/CAGE-CMD-002.md +1 -1
  260. package/templates/blank/docs/errors/CAGE-CMD-003.md +1 -1
  261. package/templates/blank/docs/errors/CAGE-CONN-001.md +1 -1
  262. package/templates/blank/docs/errors/CAGE-CONN-002.md +1 -1
  263. package/templates/blank/docs/errors/CAGE-CONN-003.md +1 -1
  264. package/templates/blank/docs/errors/CAGE-CONN-004.md +1 -1
  265. package/templates/blank/docs/errors/CAGE-CONN-005.md +1 -1
  266. package/templates/blank/docs/errors/CAGE-CONN-006.md +1 -1
  267. package/templates/blank/docs/errors/CAGE-CONN-007.md +1 -1
  268. package/templates/blank/docs/errors/CAGE-CONN-008.md +1 -1
  269. package/templates/blank/docs/errors/CAGE-CONN-009.md +1 -1
  270. package/templates/blank/docs/errors/CAGE-CONN-010.md +1 -1
  271. package/templates/blank/docs/errors/CAGE-CONN-011.md +1 -1
  272. package/templates/blank/docs/errors/CAGE-CONN-012.md +1 -1
  273. package/templates/blank/docs/errors/CAGE-CONN-013.md +1 -1
  274. package/templates/blank/docs/errors/CAGE-CONN-014.md +1 -1
  275. package/templates/blank/docs/errors/CAGE-CONN-015.md +1 -1
  276. package/templates/blank/docs/errors/CAGE-CREATE-001.md +2 -2
  277. package/templates/blank/docs/errors/CAGE-DECL-001.md +1 -1
  278. package/templates/blank/docs/errors/CAGE-DECL-002.md +1 -1
  279. package/templates/blank/docs/errors/CAGE-DECL-003.md +1 -1
  280. package/templates/blank/docs/errors/CAGE-DECL-004.md +1 -1
  281. package/templates/blank/docs/errors/CAGE-DEP-001.md +1 -1
  282. package/templates/blank/docs/errors/CAGE-DEP-002.md +1 -1
  283. package/templates/blank/docs/errors/CAGE-DEP-003.md +1 -1
  284. package/templates/blank/docs/errors/CAGE-DEP-004.md +1 -1
  285. package/templates/blank/docs/errors/CAGE-DEP-005.md +1 -1
  286. package/templates/blank/docs/errors/CAGE-DIAG-001.md +1 -1
  287. package/templates/blank/docs/errors/CAGE-DLQ-001.md +1 -1
  288. package/templates/blank/docs/errors/CAGE-ENV-001.md +1 -1
  289. package/templates/blank/docs/errors/CAGE-ENV-002.md +1 -1
  290. package/templates/blank/docs/errors/CAGE-ENV-003.md +1 -1
  291. package/templates/blank/docs/errors/CAGE-EVENT-001.md +1 -1
  292. package/templates/blank/docs/errors/CAGE-EVENT-002.md +1 -1
  293. package/templates/blank/docs/errors/CAGE-FIELD-001.md +1 -1
  294. package/templates/blank/docs/errors/CAGE-FIELD-002.md +1 -1
  295. package/templates/blank/docs/errors/CAGE-FIELD-003.md +1 -1
  296. package/templates/blank/docs/errors/CAGE-FIELD-004.md +1 -1
  297. package/templates/blank/docs/errors/CAGE-FILE-001.md +1 -1
  298. package/templates/blank/docs/errors/CAGE-GEN-001.md +1 -1
  299. package/templates/blank/docs/errors/CAGE-GEN-002.md +1 -1
  300. package/templates/blank/docs/errors/CAGE-GEN-003.md +1 -1
  301. package/templates/blank/docs/errors/CAGE-GRANT-001.md +19 -13
  302. package/templates/blank/docs/errors/CAGE-GRANT-002.md +3 -3
  303. package/templates/blank/docs/errors/CAGE-GRANT-003.md +4 -4
  304. package/templates/blank/docs/errors/CAGE-IMPACT-001.md +1 -1
  305. package/templates/blank/docs/errors/CAGE-IMPACT-002.md +1 -1
  306. package/templates/blank/docs/errors/CAGE-INIT-001.md +1 -1
  307. package/templates/blank/docs/errors/CAGE-INIT-002.md +1 -1
  308. package/templates/blank/docs/errors/CAGE-INIT-003.md +1 -1
  309. package/templates/blank/docs/errors/CAGE-INIT-004.md +1 -1
  310. package/templates/blank/docs/errors/CAGE-INIT-005.md +1 -1
  311. package/templates/blank/docs/errors/CAGE-JOB-001.md +1 -1
  312. package/templates/blank/docs/errors/CAGE-JOB-002.md +1 -1
  313. package/templates/blank/docs/errors/CAGE-JOB-003.md +1 -1
  314. package/templates/blank/docs/errors/CAGE-LINT-001.md +1 -1
  315. package/templates/blank/docs/errors/CAGE-MIG-001.md +1 -1
  316. package/templates/blank/docs/errors/CAGE-MIG-002.md +1 -1
  317. package/templates/blank/docs/errors/CAGE-MIG-005.md +1 -1
  318. package/templates/blank/docs/errors/CAGE-NAME-001.md +1 -1
  319. package/templates/blank/docs/errors/CAGE-NAME-002.md +1 -1
  320. package/templates/blank/docs/errors/CAGE-NAME-003.md +1 -1
  321. package/templates/blank/docs/errors/CAGE-NAME-004.md +1 -1
  322. package/templates/blank/docs/errors/CAGE-NAME-005.md +1 -1
  323. package/templates/blank/docs/errors/CAGE-NAME-006.md +1 -1
  324. package/templates/blank/docs/errors/CAGE-ONTOLOGY-001.md +52 -0
  325. package/templates/blank/docs/errors/CAGE-ORG-001.md +1 -1
  326. package/templates/blank/docs/errors/CAGE-PAIR-002.md +1 -1
  327. package/templates/blank/docs/errors/CAGE-QUERY-001.md +1 -1
  328. package/templates/blank/docs/errors/CAGE-QUERY-002.md +1 -1
  329. package/templates/blank/docs/errors/CAGE-QUERY-003.md +1 -1
  330. package/templates/blank/docs/errors/CAGE-REACT-001.md +1 -1
  331. package/templates/blank/docs/errors/CAGE-REACT-002.md +1 -1
  332. package/templates/blank/docs/errors/CAGE-REACT-003.md +1 -1
  333. package/templates/blank/docs/errors/CAGE-READS-001.md +1 -1
  334. package/templates/blank/docs/errors/CAGE-REG-001.md +1 -1
  335. package/templates/blank/docs/errors/CAGE-REG-002.md +1 -1
  336. package/templates/blank/docs/errors/CAGE-REG-003.md +1 -1
  337. package/templates/blank/docs/errors/CAGE-REL-001.md +1 -1
  338. package/templates/blank/docs/errors/CAGE-ROUTE-001.md +1 -1
  339. package/templates/blank/docs/errors/CAGE-SCOPE-001.md +1 -1
  340. package/templates/blank/docs/errors/CAGE-SCOPE-002.md +1 -1
  341. package/templates/blank/docs/errors/CAGE-SECRET-001.md +1 -1
  342. package/templates/blank/docs/errors/CAGE-SECRET-002.md +1 -1
  343. package/templates/blank/docs/errors/CAGE-SENS-001.md +1 -1
  344. package/templates/blank/docs/errors/CAGE-SQL-001.md +1 -1
  345. package/templates/blank/docs/errors/CAGE-SQL-002.md +1 -1
  346. package/templates/blank/docs/errors/CAGE-STATE-001.md +1 -1
  347. package/templates/blank/docs/errors/CAGE-STATE-002.md +1 -1
  348. package/templates/blank/docs/errors/CAGE-STATE-003.md +2 -2
  349. package/templates/blank/docs/errors/CAGE-STATE-004.md +1 -1
  350. package/templates/blank/docs/errors/CAGE-STATE-005.md +1 -1
  351. package/templates/blank/docs/errors/CAGE-STATE-010.md +1 -1
  352. package/templates/blank/docs/errors/CAGE-STATE-011.md +1 -1
  353. package/templates/blank/docs/errors/CAGE-STRUCT-001.md +4 -4
  354. package/templates/blank/docs/errors/CAGE-STRUCT-002.md +3 -3
  355. package/templates/blank/docs/errors/CAGE-SYNC-001.md +4 -4
  356. package/templates/blank/docs/errors/CAGE-TEST-001.md +1 -1
  357. package/templates/blank/docs/errors/CAGE-TEST-002.md +1 -1
  358. package/templates/blank/docs/errors/CAGE-TEST-003.md +1 -1
  359. package/templates/blank/docs/errors/CAGE-UNSAFE-001.md +1 -1
  360. package/templates/blank/docs/errors/CAGE-UPGRADE-001.md +1 -1
  361. package/templates/blank/docs/errors/CAGE-WORKER-001.md +1 -1
  362. package/templates/blank/docs/errors/CAGE-WORKER-002.md +1 -1
  363. package/templates/blank/docs/errors/CAGE-WORKER-003.md +1 -1
  364. package/templates/blank/docs/errors/README.md +8 -2
  365. package/templates/blank/docs/errors/runtime.md +2 -2
  366. package/templates/blank/docs/examples/purchase-admin/README.md +1 -1
  367. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/styles/global.css +12 -11
  368. package/templates/blank/docs/examples/purchase-admin/apps/web/src/main.tsx +18 -7
  369. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/error-message.ts +1 -1
  370. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/approval-member-picker.tsx +1 -1
  371. package/templates/blank/docs/examples/purchase-admin/cage.config.json +2 -1
  372. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/role/index.ts +2 -2
  373. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/user/index.ts +3 -3
  374. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approval-members.ts +1 -1
  375. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approvals.ts +2 -2
  376. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/intelligence.test.ts +4 -4
  377. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts +10 -17
  378. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.ts +4 -5
  379. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-process.ts +1 -1
  380. package/templates/blank/package.json +3 -3
  381. package/templates/blank/packages/contracts/package.json +1 -1
  382. package/templates/blank/packages/contracts/src/aggregates/role/index.ts +2 -2
  383. package/templates/blank/packages/contracts/src/aggregates/user/index.ts +3 -3
  384. package/templates/blank/packages/domain/package.json +5 -5
  385. package/templates/app/docs/ai/README.md +0 -103
  386. package/templates/app/docs/ai/recipes.md +0 -89
  387. package/templates/blank/docs/ai/README.md +0 -103
  388. package/templates/blank/docs/ai/recipes.md +0 -89
@@ -0,0 +1,6 @@
1
+ <!-- 由 scripts/sync-agent-skill.ts 生成;共享同一套框架教材。 -->
2
+ # Cage 开发入口
3
+
4
+ 先读本目录 [AGENTS.md](AGENTS.md) 的项目说明和约定。
5
+ 进行 Cage 业务开发或排错时,阅读[框架开发 Skill](docs/development/skills/cage-development/SKILL.md),按任务选择章节并完成对应验证。
6
+ 这是框架维护的通用教学流程;具体业务以用户需求和项目约定为准。
@@ -4,9 +4,9 @@
4
4
 
5
5
  ## 让 AI 在本项目开发业务
6
6
 
7
- 把本目录交给 Codex 等编程工具时,先让它读 [AGENTS.md](AGENTS.md),再按[业务开发指南](docs/ai/README.md)和[任务配方](docs/ai/recipes.md)实现需求。普通业务不需要修改框架源码。
7
+ 把本目录交给 Codex 等编程工具时,先让它读 [AGENTS.md](AGENTS.md),再按[业务开发指南](docs/development/README.md)和[任务配方](docs/development/guides/recipes.md)实现需求。普通业务不需要修改框架源码。
8
8
 
9
- [采购全链路导读](docs/ai/purchase-example.md)说明每个文件和异步步骤;[原语与最小业务](docs/ai/primitives.md)提供可添加的普通管理对象;[错误码册](docs/errors/README.md)用于按码修复。脚手架会将这些资料放入生成项目本地的 `docs/ai` 与 `docs/errors`,无需再次克隆框架。
9
+ [采购全链路导读](docs/development/examples/purchase-example.md)说明每个文件和异步步骤;[原语与最小业务](docs/development/reference/primitives.md)提供可添加的普通管理对象;[错误码册](docs/errors/README.md)用于按码修复。脚手架会将这些资料放入生成项目本地的 `docs/development` 与 `docs/errors`,无需再次克隆框架。
10
10
 
11
11
  ## 启动
12
12
 
@@ -54,15 +54,15 @@ pnpm dev
54
54
 
55
55
  ## 体验完整采购流程
56
56
 
57
- 前端使用 React Router:工作台 `/workspace`,采购列表 `/procurement/orders`,单据详情 `/procurement/orders/:id`,审批 `/approvals`,库存 `/inventory`,登录 `/login`。单号和审批待办可直接打开详情;刷新、前进后退和登录回跳保留页面地址。新增页面与部署按[路由和浏览器验收指南](docs/ai/routing.md)执行;Nginx 示例见 [deploy/nginx.conf](deploy/nginx.conf)。
57
+ 前端使用 React Router:工作台 `/workspace`,采购列表 `/procurement/orders`,单据详情 `/procurement/orders/:id`,审批 `/approvals`,库存 `/inventory`,登录 `/login`。单号和审批待办可直接打开详情;刷新、前进后退和登录回跳保留页面地址。新增页面与部署按[路由和浏览器验收指南](docs/development/guides/routing.md)执行;Nginx 示例见 [deploy/nginx.conf](deploy/nginx.conf)。
58
58
 
59
59
  1. 管理员在“库存台账”登记 `A-01` 等物料。
60
- 2. 进入 `/admin/` 创建采购员、经理,分别分配采购命令和审批能力;经理的 `PurchaseOrder.approve` 参数配置 `ceiling`。
60
+ 2. 进入 `/admin/` 创建采购员、经理,分别分配采购命令、审批能力和所需数据范围。
61
61
  3. 把经理设为采购员所在部门的负责人。提单人与审批人必须不同。
62
62
  4. 为需要选人的采购参与者授予 `ApprovalMember.read` 与该聚合 `all` 范围,通过 `ApprovalMember.create` 登记审批协作人的公开业务姓名与专业领域;名录不授予实际审批能力。
63
63
  5. 采购员新建采购单,可开启专业复核并选择 1–5 人;草稿使用 `PurchaseOrder.setReviewers` 调整名单,提交时重新校验。worker 先执行 AI 材料预审;未配置模型或模型失败时按声明转人工接管。
64
64
  6. AI 预审/人工接管之后进入经理节点;启用专业复核时,经理后由所选人员全部会签。经理、专业和财务节点开放转办、委派归还和前置/后置/并行加签。
65
- 7. 超过 50,000 元的采购继续进入财务共享候选池,需另建 code 为 `finance` 的角色并给实际用户配置权限、范围和额度;财务必须先领取,恰好 50,000 元跳过该步骤。
65
+ 7. 超过 50,000 元的采购继续进入财务共享候选池,需另建 code 为 `finance` 的角色并给实际用户配置权限和范围;财务必须先领取,恰好 50,000 元跳过该步骤。
66
66
  8. 全部必签完成后,最终审批命令同事务生成库存锁;worker 调用 fake ERP 并回写单号。取消单据或收到 ERP 收货回调后异步释放锁;回调需要 `ERP_WEBHOOK_SECRET` 对原始 JSON 的 HMAC-SHA256 签名。
67
67
 
68
68
  `Inventory.available` 是演示台账数量。本例验证库存锁生命周期,尚未实现仓库级的并发扣减、实物库存及退货核算。
@@ -87,6 +87,6 @@ pnpm dev
87
87
  - `apps/api/src`:API 和 worker 的薄启动入口。
88
88
  - `apps/web/src/app`、`modules`、`shared`:应用组合、业务页面、共享基础组件;`main.tsx` 只挂载。
89
89
 
90
- 新增业务先读[工程目录与代码组织](docs/ai/project-structure.md),不要继续在 src 根目录平铺文件。模板已启用模块目录门禁,`cage check` 和 `verify` 会指出目录与依赖越界。
90
+ 新增业务先读[工程目录与代码组织](docs/development/reference/project-structure.md),不要继续在 src 根目录平铺文件。模板已启用模块目录门禁,`cage check` 和 `verify` 会指出目录与依赖越界。
91
91
 
92
92
  先运行 `pnpm cage gen` 再提交契约和迁移草稿;`pnpm cage verify` 检查完整工具链。派生测试遇到无法推断的业务输入会显示跳过,`purchase-order.test.ts` 另外准备真实业务数据覆盖成功审批和约束反例。
@@ -10,7 +10,7 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@app/domain": "workspace:*",
13
- "@yss123/cage-http": "0.3.1",
14
- "@yss123/cage-connectors": "0.3.1"
13
+ "@yss123/cage-http": "0.4.0",
14
+ "@yss123/cage-connectors": "0.4.0"
15
15
  }
16
16
  }
@@ -8,9 +8,11 @@
8
8
  "typecheck": "tsc --noEmit"
9
9
  },
10
10
  "dependencies": {
11
+ "@ant-design/icons": "^6.3.4",
11
12
  "@app/contracts": "workspace:*",
12
13
  "@tanstack/react-query": "^5.87.1",
13
- "@yss123/cage-client": "0.3.1",
14
+ "@yss123/cage-client": "0.4.0",
15
+ "antd": "^6.7.0",
14
16
  "react": "^19.1.1",
15
17
  "react-dom": "^19.1.1",
16
18
  "react-markdown": "^10.1.0",
@@ -19,16 +19,17 @@
19
19
  body {
20
20
  margin: 0;
21
21
  }
22
- button,
22
+ button:not(.ant-btn),
23
23
  input {
24
24
  font: inherit;
25
25
  }
26
- button,
26
+ button:not(.ant-btn),
27
27
  a,
28
28
  input {
29
29
  outline-offset: 4px;
30
30
  }
31
- button {
31
+ /* 原生按钮规则服务于范例中现有的手写 DOM 控件,不覆盖新增的 Ant Design Button。 */
32
+ button:not(.ant-btn) {
32
33
  border: 1px solid var(--line);
33
34
  background: #fff;
34
35
  color: var(--green);
@@ -37,10 +38,10 @@ button {
37
38
  cursor: pointer;
38
39
  transition: background 0.15s;
39
40
  }
40
- button:hover {
41
+ button:not(.ant-btn):hover {
41
42
  background: #edf2e8;
42
43
  }
43
- button:disabled {
44
+ button:not(.ant-btn):disabled {
44
45
  opacity: 0.45;
45
46
  cursor: default;
46
47
  }
@@ -295,7 +296,7 @@ header {
295
296
  gap: 7px;
296
297
  flex-wrap: wrap;
297
298
  }
298
- .filters button {
299
+ .filters button:not(.ant-btn) {
299
300
  border: 0;
300
301
  background: none;
301
302
  font-size: 12px;
@@ -305,7 +306,7 @@ header {
305
306
  background: #edf3e6;
306
307
  color: var(--green);
307
308
  }
308
- .toolbar > button {
309
+ .toolbar > button:not(.ant-btn) {
309
310
  font-size: 11px;
310
311
  }
311
312
  /**
@@ -373,7 +374,7 @@ tr:last-child td {
373
374
  display: flex;
374
375
  gap: 7px;
375
376
  }
376
- .actions button {
377
+ .actions button:not(.ant-btn) {
377
378
  font-size: 11px;
378
379
  padding: 6px 9px;
379
380
  }
@@ -386,7 +387,7 @@ tr:last-child td {
386
387
  font-size: 11px;
387
388
  color: var(--muted);
388
389
  }
389
- .pagination button {
390
+ .pagination button:not(.ant-btn) {
390
391
  font-size: 11px;
391
392
  margin-left: 7px;
392
393
  }
@@ -442,7 +443,7 @@ tr:last-child td {
442
443
  font-size: 12px;
443
444
  margin-bottom: 20px;
444
445
  }
445
- .notice button {
446
+ .notice button:not(.ant-btn) {
446
447
  background: transparent;
447
448
  border: 0;
448
449
  }
@@ -459,7 +460,7 @@ tr:last-child td {
459
460
  align-items: end;
460
461
  padding: 22px;
461
462
  }
462
- .stock-form button {
463
+ .stock-form button:not(.ant-btn) {
463
464
  margin-bottom: 18px;
464
465
  }
465
466
  label {
@@ -1,18 +1,29 @@
1
1
  /**
2
- * 采购 Web 的浏览器启动入口:创建共享查询缓存,将应用路由挂到 root DOM 节点。
3
- * 契约客户端负责网络与会话协议,页面只在 Provider 内消费 hooks;这里不注册领域或启动后端。
4
- * 全局样式在此加载,账号切换时的缓存清理由 useSession 和应用壳负责。
2
+ * 采购 Web 的浏览器启动入口:装配 Ant Design 中文主题、共享查询缓存并挂载应用路由。
3
+ * 页面通过 Provider 消费 UI 上下文、生成契约客户端和查询 hooks;入口不注册领域或启动后端。
4
+ * AntD reset 与业务全局样式在此加载,账号切换时的缓存清理由 useSession 和应用壳负责。
5
5
  */
6
- // 唯一浏览器启动入口:挂载 React、全局 Provider 和样式;业务从 app 组合进入。
6
+ // 唯一浏览器启动入口:挂载 React、Ant Design 与查询 Provider;业务从 app 组合进入。
7
7
  import { createRoot } from 'react-dom/client';
8
8
  import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
9
+ import { App as AntdApp, ConfigProvider } from 'antd';
10
+ import zhCN from 'antd/locale/zh_CN';
9
11
  import { App } from './app/app';
12
+ import 'antd/dist/reset.css';
10
13
  import './app/styles/global.css';
11
14
 
12
15
  const queryClient = new QueryClient();
13
16
 
17
+ /**
18
+ * ConfigProvider 提供简体中文文案与统一绿色主题;AntdApp 为 message、modal、notification 等反馈 API 提供上下文。
19
+ * QueryClientProvider 继续承载生成查询 hooks 的缓存;Provider 均只创建一次并覆盖整套路由。
20
+ */
14
21
  createRoot(document.getElementById('root')!).render(
15
- <QueryClientProvider client={queryClient}>
16
- <App />
17
- </QueryClientProvider>,
22
+ <ConfigProvider locale={zhCN} theme={{ token: { colorPrimary: '#173e35', borderRadius: 4 } }}>
23
+ <AntdApp>
24
+ <QueryClientProvider client={queryClient}>
25
+ <App />
26
+ </QueryClientProvider>
27
+ </AntdApp>
28
+ </ConfigProvider>,
18
29
  );
@@ -16,7 +16,7 @@ export function errorMessage(r: Extract<CageResult<unknown, string>, { ok: false
16
16
  INVALID_INPUT: '请检查填写内容',
17
17
  CONFLICT: '数据或任务已更新,请刷新后重试',
18
18
  UNAUTHENTICATED: '登录已过期',
19
- CONSTRAINT_VIOLATED: '未满足审批条件,请检查审批人或额度',
19
+ CONSTRAINT_VIOLATED: '未满足业务条件,请检查操作人及具体原因',
20
20
  STOCK_SHORT: '库存不足',
21
21
  REVIEWERS_REQUIRED: '请为专业会签选择 1–5 位协作人',
22
22
  REVIEWERS_NOT_REQUIRED: '取消专业会签时请清空复核人员',
@@ -46,6 +46,6 @@ export function ApprovalMemberPicker({ value, onChange, max = 5, exclude = [], d
46
46
  {query.data && entries.length === 0 && <p className="muted">当前页没有匹配人员,请调整筛选或联系名录维护人。</p>}
47
47
  {(query.data?.total ?? 0) > 200 && <div className="actions"><button type="button" disabled={page === 1} onClick={() => setPage(page - 1)}>上一页</button>
48
48
  <span>第 {page} 页</span><button type="button" disabled={page * 200 >= query.data!.total} onClick={() => setPage(page + 1)}>下一页</button></div>}
49
- <small className="muted">名录只提供选人信息,处理权限、数据范围和最终额度仍以服务端校验为准。</small>
49
+ <small className="muted">名录只提供选人信息,处理权限和数据范围仍以服务端校验为准。</small>
50
50
  </fieldset>;
51
51
  }
@@ -5,6 +5,7 @@
5
5
  "typecheck": ["packages/domain", "packages/contracts", "apps/api", "apps/web"],
6
6
  "graph": {
7
7
  "title": "采购业务图谱",
8
+ "naming": "required",
8
9
  "labels": {
9
10
  "module:purchase": "采购管理",
10
11
  "module:inventory": "库存管理",
@@ -125,7 +126,7 @@
125
126
  "state:Role.archived": "已停用",
126
127
  "field:Role.code": "角色编码",
127
128
  "field:Role.name": "角色名称",
128
- "field:Role.capabilities": "能力点与额度",
129
+ "field:Role.capabilities": "能力点",
129
130
  "field:Role.scopes": "数据访问范围",
130
131
  "capability:Role.read": "查看角色",
131
132
  "capability:Role.export": "导出角色",
@@ -0,0 +1,13 @@
1
+ # 本地框架文档
2
+
3
+ 编程 agent 先读项目 [AGENTS.md](../AGENTS.md),按 [Cage 开发 Skill](development/skills/cage-development/SKILL.md) 理解需求、澄清、查证能力、说明实现映射,再编码与验收。
4
+
5
+ [任务导航](development/README.md) 说明各类文档的分工,按本次需要选择资料:
6
+
7
+ - `development/getting-started`:运行模型、完整业务链和操作命令。
8
+ - `development/guides`:[业务澄清](development/guides/business-collaboration.md)、[能力选择与实现映射](development/guides/recipes.md)、各专题接入。
9
+ - `development/reference`:原语与工程规范。
10
+ - `development/tools`:诊断、本体查询和排错。
11
+ - `development/examples`:教学源码与采购导读。
12
+ - `development/skills`:唯一的 agent 工作流程。
13
+ - [错误码册](errors/README.md):按实际错误定位原因。
@@ -0,0 +1,80 @@
1
+ # Cage 框架学习入口
2
+
3
+ 本目录面向使用 Cage 编写业务的 agent,帮助 agent 理解需求、查证框架并完成真实实现。先读项目 AGENTS.md,再按 [cage-development Skill](skills/cage-development/SKILL.md) 工作;本页只负责按任务定位资料。教材由框架维护,随脚手架分发,读取无需额外服务、模型或向量索引。
4
+
5
+ 工作主线:**理解需求 → 提出疑问与建议 → 核对现有业务和框架能力 → 说明实现映射 → 编码 → 按规则验收**。明确的规则直接采用,技术事实自行查证,需要用户决定的业务取舍再交给用户选择。
6
+
7
+ 模型接入、智能助理和 AI 审批属于框架的原生 AI 能力,具体接入见[原生 AI 专题](guides/intelligence.md)。
8
+
9
+ ## 按当前阶段阅读
10
+
11
+ | 你现在需要什么 | 从哪里开始 | 应得到什么 |
12
+ | --- | --- | --- |
13
+ | 第一次使用 Cage | [Skill 的运行模型](skills/cage-development/SKILL.md#先建立正确的运行模型) → [第一条完整业务链](getting-started/first-feature.md) | 理解声明、导出、生成、授权、契约与持久读写如何连接 |
14
+ | 用户描述或文档不清楚 | [业务澄清与共同设计](guides/business-collaboration.md) | 主动提出疑问、可行选项与建议,与用户选择业务规则,再落实到实现和验收 |
15
+ | 把需求转成设计 | [业务设计与能力选择](guides/recipes.md) → [编码前的映射](skills/cage-development/SKILL.md#4-写代码前说明实现映射) | 业务规则、查证过的能力、修改位置和验收例子一一对应 |
16
+ | 表达对象、状态和关系的业务含义 | [本体建模](guides/ontology-modeling.md) → [对象关系](guides/relations.md) | 名称写入真实声明,关系有正确方向、基数及执行依据,图谱能用业务用语阅读 |
17
+ | AI 生成 React 页面与选择组件 | [前端组件指南](guides/frontend-ui.md) → [路由](guides/routing.md) | 生成可维护的真实 TSX 页面,使用 Ant Design 组合 UI,并按 Cage 契约读写 |
18
+ | 实现或修改功能 | [Skill 的实施流程](skills/cage-development/SKILL.md#5-沿一条真实链路实施再扩展) → [开发步骤](getting-started/workflow.md) | 沿实际调用链完成受影响的功能,并取得验证证据 |
19
+ | 已有功能不正常 | [排错方法](tools/troubleshooting.md) → [诊断工具](tools/diagnostics.md) / [错误码册](../errors/README.md) | 找到第一个失败边界,修复原因并复验 |
20
+ | 查询一个能力的用法 | 下方专题表,必要时本地搜索术语 | 找到当前任务的 API、接入前提与限制 |
21
+
22
+ 已经熟悉框架时不必每次重读课程。不要将所有专题一次加载,也不要把参考业务注册到客户应用。
23
+
24
+ ## 各类文件的责任
25
+
26
+ | 文件 | 负责什么 |
27
+ | --- | --- |
28
+ | 项目 AGENTS.md | 项目入口、代码与环境约束;项目业务约定保留在框架托管区外 |
29
+ | [Skill](skills/cage-development/SKILL.md) | agent 的工作顺序、判断依据及何时与用户互动 |
30
+ | [业务澄清](guides/business-collaboration.md) | 如何发现疑点、比较方案、保留并落实用户选择 |
31
+ | [能力选择](guides/recipes.md) | 业务规则如何映射到 Cage,包含编码前的映射示例 |
32
+ | [本体建模](guides/ontology-modeling.md) | 业务含义、结构化名称、对象关系和触发链写在哪里,以及怎样检查和验收 |
33
+ | [开发步骤](getting-started/workflow.md) | 已确定设计的修改、生成、迁移和验证命令 |
34
+ | 其他专题、参考与源码 | 当前能力用法、前提与边界,按需阅读;示例业务不成为当前需求 |
35
+
36
+ ## 按资料用途查找
37
+
38
+ | 目录 | 内容与入口 |
39
+ | --- | --- |
40
+ | `getting-started/` 入门 | [运行模型](getting-started/architecture.md)、[完整入门课](getting-started/first-feature.md)、[开发步骤](getting-started/workflow.md) |
41
+ | `guides/` 专题指南 | [业务澄清](guides/business-collaboration.md)、[能力选择](guides/recipes.md)、[本体建模](guides/ontology-modeling.md)、[前端组件](guides/frontend-ui.md)、[审批](guides/approvals.md)、[文件](guides/files.md)、[关系](guides/relations.md)、[路由](guides/routing.md)、[数据传输](guides/transfers.md)、[原生 AI](guides/intelligence.md) |
42
+ | `reference/` 参考规范 | [原语](reference/primitives.md)、[目录组织](reference/project-structure.md)、[中文注释](reference/commenting.md) |
43
+ | `tools/` 工具与排错 | [诊断](tools/diagnostics.md)、[本体上下文](tools/ontology-context.md)、[排错方法](tools/troubleshooting.md) |
44
+ | `examples/` 教学示例 | [便笺源码](examples/note/note.ts)、[采购导读](examples/purchase-example.md);按入门课与导读阅读,源码不自动注册 |
45
+ | `skills/` agent 开发流程 | [cage-development](skills/cage-development/SKILL.md),按任务加载上述教材 |
46
+
47
+ 查明确符号可用 `rg -n "术语或符号" docs/development docs/errors`,没有 rg 时使用 agent 的本地文件搜索。用 `pnpm exec cage capabilities 符号 --format json` 核对已安装版本公开签名,用 `pnpm exec cage context "业务关键词" --format json` 定位当前应用。候选命中不能代替阅读上下文,未命中也不能证明框架不支持。
48
+
49
+ ## 确认代码与资料的位置
50
+
51
+ 本指南的业务路径和命令默认相对应用根目录。应用的 `packages/domain/src` 定义业务,`packages/contracts/src` 是生成契约,`apps/web/src` 是界面,`apps/api/src` 是薄启动入口,`db/migrations` 保存审查过的迁移。
52
+
53
+ 空白模板只启用组织基础;`docs/examples/purchase-admin` 是离线采购参考源码,不参与注册、编译或迁移。采购模板直接在业务目录包含该范例。框架仓库的应用根目录是 `examples/purchase-admin`,规范教材位于仓库 `docs/development`,以应用 AGENTS.md 的说明为准。
54
+
55
+ `docs/development` 是框架教学内容的唯一手写来源;Skills 发现入口和模板副本由同步脚本生成。用户的业务约定保留在项目已有业务文档或 AGENTS.md 的托管区外。教材分发检查只能证明资料存在且一致,模型是否学会需要框架维护者另做任务评估。
56
+
57
+ ## 当前实现边界
58
+
59
+ 以下区分可避免 agent 把方案中的愿景写成不存在的功能。
60
+
61
+ | 已有能力 | 使用边界 |
62
+ | --- | --- |
63
+ | 真实 PostgreSQL 连接、分账号、表结构迁移 | 连接已有数据库;`init` 不建库;不会自动识别并接管任意历史表 |
64
+ | 聚合/命令、能力与范围、掩码、审计、outbox、worker | handler 不做数据库/网络 IO;生产角色不会自动拿到新能力 |
65
+ | fields 中的 ref / hasMany / manyToMany | hasMany 为只读反查;manyToMany 自动中间表并随主对象事务写入,公开读取独立分页;双向集合不会自动互为镜像 |
66
+ | 本体抽取、中文检索/节点/路径/AI 上下文、图规则、图谱、生成、影响分析与门禁 | 上下文注明证据、源码和覆盖边界;名称与测试匹配是候选线索,不能证明任意 JS 正确;跳过用例仍需补足 |
67
+ | 有界集合 reactionEach、显式步骤 order | 稳定唯一键排序后串行调用目标命令;同事务整体回滚,异步链按 outbox 恢复;不是并行写表接口 |
68
+ | capabilities、doctor、timeline、explain、snapshot | 实际运行诊断需要受控会话与权限;未取得的证据为 unknown,授权解释不执行 handler |
69
+ | 代码审批路由与任务流转 | 顺序/条件、`parallel/branch` 结构化 AND 分支与汇合、any/all、字段选人、候选领取/释放、转办、单层委派归还、前后/并行必签和动作历史;候选池仅支持 any,追加票全部必签。条件和依赖随提交冻结,currentStep 仅为最小活动索引;尚无任意连线/循环/OR 网关、岗位/代理规则、通用恢复、任意 JS 选人或在途迁移,见[任务流转](guides/approvals.md) |
70
+ | 审批时限、站内提醒与催办 | 人工节点按实际开启时间计算自然分钟 SLA,worker 持久投递临期/超时提醒;申请人可按完整活动集合催办,同实例共享冷却,接收人可标已读。旧快照不自动获得政策;尚无工作日历、自动升级、抄送或邮件/短信通知 |
71
+ | 审批界面与 SDK | Admin/采购待办可领取、释放、归还受托任务并查看等待加签;采购另有协作名录选人器、转办/委派/三种加签及分页人工历史,view 查询参数保留视图。启用运营后通用 Admin 提供我的申请、催办和流程提醒;页面仍需应用启用、真实授权与浏览器验收。AI 助理目前只查询本人待办及提交决定,无人员管理写工具 |
72
+ | 原生 AI 审批与领域助理 | 现有 `step` 支持 `kind: 'ai'`;三态审核、自动工具、会话及偏好记忆可复用;需显式启用、授权并做模型质量验收 |
73
+ | Admin 模型与性格、助理 SDK | 动态模型连接和性格管理;Chat Completions / Responses 兼容性以实际服务为准;SDK 提供流式状态与页面快照,悬浮窗和 Markdown 由应用实现 |
74
+ | 连接器 fake、出站、入站验签、同步记录 | fake 不等于真实 ERP 联调,也不等于完整请求录制/回放平台 |
75
+ | 异步 CSV 导入/导出接口与客户端任务查询 | 界面由业务项目决定;导出结果不是可直接回导的命令输入模板 |
76
+ | 私有文件字段、流式分片上传、暂停与续传、范围下载 | 默认本地存储,提供对象存储适配接口;尚无内置 S3/OSS、签名直传、病毒扫描及文件共享 |
77
+ | 组织模型、系统管理界面 | 暂无移动部门(改上级)的完整支持、菜单配置页 |
78
+ | 库存锁采购范例 | 演示资源生命周期;不是仓库级并发库存扣减、退货或 ERP 撤销补偿系统 |
79
+
80
+ 文档与实现冲突时,以当前代码和检查结果为依据,指出冲突并修正文档;不要默默扩展公开 API。规划、代码存在、构建通过、真实联调通过是不同状态,交付时分别说明。
@@ -0,0 +1,106 @@
1
+ /**
2
+ * 入门课详情页,从 URL 的 id 独立读取便笺并通过契约修改或归档。
3
+ * 由 app 组合到 /notes/:id;query 缓存与退出清理由现有应用会话层管理。
4
+ * 每次写入传服务端记录版本;冲突后刷新而不自动覆盖,归档后仅展示结果。
5
+ */
6
+ import { useRef, useState } from 'react';
7
+ import { Link, useParams } from 'react-router-dom';
8
+ import { note, useNote } from '@app/contracts';
9
+ import { useCan } from '@yss123/cage-client';
10
+
11
+ /** 加载独立详情;标题草稿为 null 时显示服务端标题,空字符串仍表示用户正在编辑。 */
12
+ export function NoteDetailPage() {
13
+ const { id = '' } = useParams();
14
+ const query = useNote(id);
15
+ const canUpdate = useCan('Note.update');
16
+ const canArchive = useCan('Note.archive');
17
+ const [draft, setDraft] = useState<{ id: string; title: string } | null>(null);
18
+ const [error, setError] = useState('');
19
+ const [saving, setSaving] = useState(false);
20
+ const submitting = useRef(false);
21
+ const record = query.data;
22
+ const title = draft?.id === id ? draft.title : (record?.title ?? '');
23
+
24
+ /**
25
+ * 保存或归档当前记录,使用读取版本防止覆盖并发变更;失败保留草稿,成功后清除草稿并读取。
26
+ * 冲突刷新后要求用户核对再提交;按钮禁用与引用锁限制本页同时提交,不替代内核检查。
27
+ */
28
+ async function save(action: 'update' | 'archive') {
29
+ if (!record || submitting.current) return;
30
+ submitting.current = true;
31
+ setSaving(true);
32
+ setError('');
33
+ try {
34
+ const result =
35
+ action === 'update'
36
+ ? await note.update(record.id, { title }, record.version)
37
+ : await note.archive(record.id, record.version);
38
+ if (!result.ok) {
39
+ setError(
40
+ result.code === 'CONFLICT'
41
+ ? '记录已变化,请核对最新数据和当前草稿后再提交。'
42
+ : `操作失败:${result.code}`,
43
+ );
44
+ if (result.code === 'CONFLICT') await query.refetch();
45
+ return;
46
+ }
47
+ setDraft(null);
48
+ await query.refetch();
49
+ } catch {
50
+ setError('请求未完成,请重新读取记录确认结果。');
51
+ } finally {
52
+ submitting.current = false;
53
+ setSaving(false);
54
+ }
55
+ }
56
+
57
+ return (
58
+ <section>
59
+ <Link to="/notes">返回列表</Link>
60
+ {query.isPending && <p role="status">正在加载…</p>}
61
+ {query.isError && (
62
+ <p role="alert">
63
+ 无法读取记录:可能不存在、会话失效或不在可见范围。
64
+ <button onClick={() => void query.refetch()}>重试</button>
65
+ </p>
66
+ )}
67
+ {record && (
68
+ <>
69
+ <h1>{record.title}</h1>
70
+ <p>
71
+ 状态:{record.status};版本:{record.version}
72
+ </p>
73
+ {record.status === 'active' && (
74
+ <>
75
+ {canUpdate && (
76
+ <form
77
+ onSubmit={(event) => {
78
+ event.preventDefault();
79
+ void save('update');
80
+ }}
81
+ >
82
+ <label>
83
+ 标题
84
+ <input
85
+ value={title}
86
+ required
87
+ maxLength={120}
88
+ onChange={(event) => setDraft({ id, title: event.target.value })}
89
+ />
90
+ </label>
91
+ <button disabled={saving || !title.trim()}>保存</button>
92
+ </form>
93
+ )}
94
+ {canArchive && (
95
+ <button disabled={saving} onClick={() => void save('archive')}>
96
+ 归档
97
+ </button>
98
+ )}
99
+ </>
100
+ )}
101
+ </>
102
+ )}
103
+ {error && <p role="alert">{error}</p>}
104
+ </section>
105
+ );
106
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * 框架入门课的部门便笺声明,由学习者放入应用领域模块后从 domain 入口导出。
3
+ * 聚合维护标题、归属和状态;命令仅描述业务变化,实际权限、事务与持久化由内核执行。
4
+ * 本文件作为教材分发,不自动注册到空白应用;不存在文件、审批或外部 IO 副作用。
5
+ */
6
+ import { aggregate, command, ref, scope, states, text } from '@yss123/cage-kernel';
7
+ import { z } from 'zod';
8
+
9
+ /**
10
+ * 部门便笺以标题和生命周期为一致性边界,通过部门与创建人字段支持安全读取。
11
+ * 声明被 domain 导出后参与注册和生成;实际可见范围取决于角色授权,本声明不授予权限。
12
+ * 所有命令结果均须满足非空标题不变量,归档保留记录并关闭修改入口。
13
+ */
14
+ export const Note = aggregate('Note', {
15
+ description: '部门便笺',
16
+ fields: {
17
+ /** 标题最多 120 字符;命令先去除两端空白,不变量拒绝空白标题。 */
18
+ title: text(120).describe('便笺标题'),
19
+ /** 内核新建时按当前主体填充的部门,用于服务端范围过滤。 */
20
+ deptId: ref('Dept').describe('所属部门'),
21
+ /** 内核新建时记录的创建人,可用于本人范围;不接受客户端指定。 */
22
+ createdBy: ref('User').describe('创建人'),
23
+ },
24
+ // 机器状态用于命令和存储,业务名供图谱与上下文读取;普通注释不会替代 labels。
25
+ states: states('active', 'archived', {
26
+ terminal: ['archived'],
27
+ labels: { active: '使用中', archived: '已归档' },
28
+ }),
29
+ scope: scope.deptSubtree('deptId'),
30
+ invariants: { titleNotBlank: (record) => record.title.trim().length > 0 },
31
+ });
32
+
33
+ /**
34
+ * 创建 active 便笺,输入只有去除两端空白后的标题,草稿直接作为业务结果返回。
35
+ * 内核填写归属并执行 Note.create 授权、审计及事务;空标题、无能力或不合格范围会拒绝写入。
36
+ * 不发布额外业务事件,也不接受客户端指定归属字段。
37
+ */
38
+ export const createNote = command(Note, {
39
+ name: 'create',
40
+ description: '创建便笺',
41
+ from: 'new',
42
+ to: 'active',
43
+ input: z.object({ title: z.string().trim().min(1).max(120) }),
44
+ handler: (draft) => draft,
45
+ });
46
+
47
+ /**
48
+ * 修改 active 便笺标题;id 用于内核按范围锁定记录,页面另传已读取的 expectedVersion。
49
+ * to: null 保留状态,返回值只包含标题变化;归档或版本冲突由内核拒绝,handler 不直接写库。
50
+ */
51
+ export const updateNote = command(Note, {
52
+ name: 'update',
53
+ description: '修改便笺标题',
54
+ from: 'active',
55
+ to: null,
56
+ input: z.object({ id: z.string().uuid(), title: z.string().trim().min(1).max(120) }),
57
+ handler: (_draft, input) => ({ title: input.title }),
58
+ });
59
+
60
+ /**
61
+ * 归档 active 便笺,输入沿用已有对象命令的默认 id,返回草稿以保留标题与归属。
62
+ * 内核检查 Note.archive、范围与版本,再设置 archived;已有归档记录的修改和重复归档会拒绝。
63
+ * 本动作不删除历史记录,不发布需 worker 处理的业务事件。
64
+ */
65
+ export const archiveNote = command(Note, {
66
+ name: 'archive',
67
+ description: '归档便笺',
68
+ from: 'active',
69
+ to: 'archived',
70
+ handler: (draft) => draft,
71
+ });
@@ -0,0 +1,87 @@
1
+ /**
2
+ * 入门课的便笺列表与创建页面,通过生成契约读写服务端记录,不维护本地业务仓储。
3
+ * 由 app 路由在已登录且具备 Note.read 的页面内挂载;服务端仍执行全部权限与范围判断。
4
+ * 表单状态只保留未提交标题,失败不清空;创建成功后重新查询列表,详情使用独立 URL。
5
+ */
6
+ import { useRef, useState, type FormEvent } from 'react';
7
+ import { Link } from 'react-router-dom';
8
+ import { note, useNoteList } from '@app/contracts';
9
+ import { useCan } from '@yss123/cage-client';
10
+
11
+ /** 显示当前主体可见的第一页便笺并提供创建入口;分页扩展应按路由规范放入 URL 参数。 */
12
+ export function NotesPage() {
13
+ const query = useNoteList();
14
+ const canCreate = useCan('Note.create');
15
+ const [title, setTitle] = useState('');
16
+ const [error, setError] = useState('');
17
+ const [saving, setSaving] = useState(false);
18
+ const submitting = useRef(false);
19
+
20
+ /**
21
+ * 提交一次创建,立即锁住重复点击;业务失败保留输入,成功后从安全接口重新读取。
22
+ * 此锁只限制当前页面的并发点击,不承诺跨刷新重试去重;业务需恢复同次请求时另保存幂等键。
23
+ */
24
+ async function create(event: FormEvent<HTMLFormElement>) {
25
+ event.preventDefault();
26
+ if (submitting.current) return;
27
+ submitting.current = true;
28
+ setSaving(true);
29
+ setError('');
30
+ try {
31
+ const result = await note.create({ title });
32
+ if (!result.ok) {
33
+ setError(`创建失败:${result.code}`);
34
+ return;
35
+ }
36
+ setTitle('');
37
+ await query.refetch();
38
+ } catch {
39
+ setError('请求未完成,请重新读取列表确认结果后再决定是否重试。');
40
+ } finally {
41
+ submitting.current = false;
42
+ setSaving(false);
43
+ }
44
+ }
45
+
46
+ return (
47
+ <section>
48
+ <h1>部门便笺</h1>
49
+ {canCreate && (
50
+ <form onSubmit={create}>
51
+ <label>
52
+ 标题
53
+ <input
54
+ value={title}
55
+ maxLength={120}
56
+ required
57
+ onChange={(event) => setTitle(event.target.value)}
58
+ />
59
+ </label>
60
+ <button disabled={saving || !title.trim()}>{saving ? '正在保存…' : '创建'}</button>
61
+ </form>
62
+ )}
63
+ {error && <p role="alert">{error}</p>}
64
+ {query.isPending && <p role="status">正在加载…</p>}
65
+ {query.isError && (
66
+ <p role="alert">
67
+ 读取失败,请检查会话和读取权限。<button onClick={() => void query.refetch()}>重试</button>
68
+ </p>
69
+ )}
70
+ {query.data && (
71
+ <>
72
+ <p>
73
+ 共 {query.data.total} 条,当前显示 {query.data.items.length} 条。
74
+ </p>
75
+ <ul>
76
+ {query.data.items.map((record) => (
77
+ <li key={record.id}>
78
+ <Link to={`/notes/${encodeURIComponent(record.id)}`}>{record.title}</Link>({record.status})
79
+ </li>
80
+ ))}
81
+ </ul>
82
+ {query.data.items.length === 0 && <p>当前可见范围内没有便笺。</p>}
83
+ </>
84
+ )}
85
+ </section>
86
+ );
87
+ }