@yss123/cage-cli 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. package/README.md +47 -3
  2. package/bin/cage.js +5 -0
  3. package/bin/create-cage-app.js +5 -0
  4. package/dist/analyze.d.ts +16 -0
  5. package/dist/analyze.js +18 -2
  6. package/dist/analyze.js.map +1 -1
  7. package/dist/baseline.d.ts +8 -0
  8. package/dist/baseline.js +13 -0
  9. package/dist/baseline.js.map +1 -1
  10. package/dist/bootstrap.d.ts +20 -0
  11. package/dist/bootstrap.js +75 -0
  12. package/dist/bootstrap.js.map +1 -0
  13. package/dist/budget.d.ts +7 -0
  14. package/dist/budget.js +49 -5
  15. package/dist/budget.js.map +1 -1
  16. package/dist/capabilities.d.ts +38 -0
  17. package/dist/capabilities.js +133 -0
  18. package/dist/capabilities.js.map +1 -0
  19. package/dist/config.d.ts +31 -2
  20. package/dist/config.js +22 -0
  21. package/dist/config.js.map +1 -1
  22. package/dist/context.d.ts +14 -0
  23. package/dist/context.js +35 -2
  24. package/dist/context.js.map +1 -1
  25. package/dist/create-prompt.d.ts +7 -0
  26. package/dist/create-prompt.js +12 -0
  27. package/dist/create-prompt.js.map +1 -1
  28. package/dist/create.d.ts +21 -1
  29. package/dist/create.js +23 -1
  30. package/dist/create.js.map +1 -1
  31. package/dist/derive.d.ts +23 -0
  32. package/dist/derive.js +40 -0
  33. package/dist/derive.js.map +1 -1
  34. package/dist/dev.d.ts +6 -0
  35. package/dist/dev.js +11 -0
  36. package/dist/dev.js.map +1 -1
  37. package/dist/doctor.d.ts +98 -0
  38. package/dist/doctor.js +93 -0
  39. package/dist/doctor.js.map +1 -0
  40. package/dist/env.d.ts +6 -0
  41. package/dist/env.js +11 -0
  42. package/dist/env.js.map +1 -1
  43. package/dist/findings.d.ts +27 -0
  44. package/dist/findings.js +20 -0
  45. package/dist/findings.js.map +1 -1
  46. package/dist/gen/contracts.d.ts +28 -0
  47. package/dist/gen/contracts.js +52 -12
  48. package/dist/gen/contracts.js.map +1 -1
  49. package/dist/gen/index.d.ts +26 -0
  50. package/dist/gen/index.js +69 -1
  51. package/dist/gen/index.js.map +1 -1
  52. package/dist/gen/zod-code.d.ts +42 -0
  53. package/dist/gen/zod-code.js +178 -16
  54. package/dist/gen/zod-code.js.map +1 -1
  55. package/dist/graph-approvals.d.ts +60 -0
  56. package/dist/graph-approvals.js +80 -0
  57. package/dist/graph-approvals.js.map +1 -0
  58. package/dist/graph-business.d.ts +135 -0
  59. package/dist/graph-business.js +404 -0
  60. package/dist/graph-business.js.map +1 -0
  61. package/dist/graph-command.d.ts +17 -0
  62. package/dist/graph-command.js +21 -0
  63. package/dist/graph-command.js.map +1 -1
  64. package/dist/graph-model.d.ts +44 -0
  65. package/dist/graph-model.js +36 -3
  66. package/dist/graph-model.js.map +1 -1
  67. package/dist/graph-presentation.d.ts +16 -0
  68. package/dist/graph-presentation.js +10 -1
  69. package/dist/graph-presentation.js.map +1 -1
  70. package/dist/graph-query.d.ts +95 -0
  71. package/dist/graph-query.js +62 -0
  72. package/dist/graph-query.js.map +1 -1
  73. package/dist/graph-relations.d.ts +20 -0
  74. package/dist/graph-relations.js +34 -4
  75. package/dist/graph-relations.js.map +1 -1
  76. package/dist/graph-search.d.ts +35 -0
  77. package/dist/graph-search.js +36 -0
  78. package/dist/graph-search.js.map +1 -1
  79. package/dist/graph-snapshot.d.ts +26 -0
  80. package/dist/graph-snapshot.js +30 -1
  81. package/dist/graph-snapshot.js.map +1 -1
  82. package/dist/graph.d.ts +13 -2
  83. package/dist/graph.js +59 -4
  84. package/dist/graph.js.map +1 -1
  85. package/dist/impact.d.ts +50 -0
  86. package/dist/impact.js +62 -2
  87. package/dist/impact.js.map +1 -1
  88. package/dist/index.d.ts +10 -0
  89. package/dist/index.js +10 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/init.d.ts +12 -0
  92. package/dist/init.js +15 -0
  93. package/dist/init.js.map +1 -1
  94. package/dist/load.d.ts +10 -0
  95. package/dist/load.js +15 -0
  96. package/dist/load.js.map +1 -1
  97. package/dist/main.d.ts +6 -0
  98. package/dist/main.js +93 -5
  99. package/dist/main.js.map +1 -1
  100. package/dist/migrate.d.ts +12 -0
  101. package/dist/migrate.js +17 -0
  102. package/dist/migrate.js.map +1 -1
  103. package/dist/ontology.d.ts +67 -2
  104. package/dist/ontology.js +89 -2
  105. package/dist/ontology.js.map +1 -1
  106. package/dist/process-rules.d.ts +21 -0
  107. package/dist/process-rules.js +100 -0
  108. package/dist/process-rules.js.map +1 -0
  109. package/dist/process.d.ts +32 -0
  110. package/dist/process.js +32 -0
  111. package/dist/process.js.map +1 -1
  112. package/dist/project-structure.d.ts +5 -0
  113. package/dist/project-structure.js +10 -0
  114. package/dist/project-structure.js.map +1 -1
  115. package/dist/registration.d.ts +16 -0
  116. package/dist/registration.js +56 -0
  117. package/dist/registration.js.map +1 -0
  118. package/dist/rules.d.ts +52 -0
  119. package/dist/rules.js +58 -0
  120. package/dist/rules.js.map +1 -1
  121. package/dist/runtime-diagnostics.d.ts +27 -0
  122. package/dist/runtime-diagnostics.js +60 -0
  123. package/dist/runtime-diagnostics.js.map +1 -0
  124. package/dist/snapshots.d.ts +40 -0
  125. package/dist/snapshots.js +62 -0
  126. package/dist/snapshots.js.map +1 -0
  127. package/dist/static-check.d.ts +33 -0
  128. package/dist/static-check.js +37 -1
  129. package/dist/static-check.js.map +1 -1
  130. package/dist/sync.d.ts +11 -0
  131. package/dist/sync.js +65 -8
  132. package/dist/sync.js.map +1 -1
  133. package/dist/upgrade.d.ts +16 -0
  134. package/dist/upgrade.js +21 -0
  135. package/dist/upgrade.js.map +1 -1
  136. package/dist/verify.d.ts +14 -0
  137. package/dist/verify.js +19 -0
  138. package/dist/verify.js.map +1 -1
  139. package/dist/version.js +5 -0
  140. package/dist/version.js.map +1 -1
  141. package/graph-ui/app.js +321 -27
  142. package/graph-ui/approval-flow.js +165 -0
  143. package/graph-ui/business.css +985 -0
  144. package/graph-ui/business.js +549 -0
  145. package/graph-ui/flowchart-interaction.js +177 -0
  146. package/graph-ui/flowchart.js +1059 -0
  147. package/graph-ui/graph-approvals.js +79 -0
  148. package/graph-ui/graph-business.js +403 -0
  149. package/graph-ui/graph-model.js +36 -3
  150. package/graph-ui/graph-relations.js +34 -4
  151. package/graph-ui/graph-search.js +36 -0
  152. package/graph-ui/index.html +26 -12
  153. package/graph-ui/model.js +28 -0
  154. package/graph-ui/relations.js +4 -0
  155. package/graph-ui/structure.js +44 -0
  156. package/graph-ui/style.css +12 -0
  157. package/package.json +6 -4
  158. package/templates/app/.dockerignore +2 -0
  159. package/templates/app/.env.example +10 -0
  160. package/templates/app/AGENTS.md +49 -9
  161. package/templates/app/README.md +4 -1
  162. package/templates/app/_gitignore +1 -0
  163. package/templates/app/apps/api/package.json +2 -2
  164. package/templates/app/apps/api/src/main.ts +5 -1
  165. package/templates/app/apps/api/src/worker.ts +3 -0
  166. package/templates/app/apps/web/index.html +1 -0
  167. package/templates/app/apps/web/package.json +7 -3
  168. package/templates/app/apps/web/src/app/app.tsx +122 -12
  169. package/templates/app/apps/web/src/app/styles/global.css +88 -8
  170. package/templates/app/apps/web/src/app/use-session.ts +43 -0
  171. package/templates/app/apps/web/src/app/workspace-layout.tsx +58 -19
  172. package/templates/app/apps/web/src/main.tsx +5 -0
  173. package/templates/app/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +11 -0
  174. package/templates/app/apps/web/src/modules/approval/index.ts +4 -0
  175. package/templates/app/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +20 -1
  176. package/templates/app/apps/web/src/modules/auth/index.ts +4 -0
  177. package/templates/app/apps/web/src/modules/auth/pages/login-page.tsx +12 -0
  178. package/templates/app/apps/web/src/modules/inventory/index.ts +4 -0
  179. package/templates/app/apps/web/src/modules/inventory/pages/inventory-page.tsx +29 -1
  180. package/templates/app/apps/web/src/modules/purchase/components/approval-history.tsx +32 -0
  181. package/templates/app/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
  182. package/templates/app/apps/web/src/modules/purchase/components/purchase-assistant-context.tsx +17 -0
  183. package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.css +6 -0
  184. package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.tsx +25 -3
  185. package/templates/app/apps/web/src/modules/purchase/index.ts +5 -0
  186. package/templates/app/apps/web/src/modules/purchase/lib/presentation.ts +20 -0
  187. package/templates/app/apps/web/src/modules/purchase/pages/purchase-intelligence.css +15 -0
  188. package/templates/app/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +154 -0
  189. package/templates/app/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +52 -22
  190. package/templates/app/apps/web/src/modules/workspace/index.ts +5 -0
  191. package/templates/app/apps/web/src/modules/workspace/pages/home-page.tsx +44 -0
  192. package/templates/app/apps/web/src/shared/hooks/use-command.ts +13 -0
  193. package/templates/app/apps/web/src/shared/lib/error-message.ts +9 -0
  194. package/templates/app/apps/web/src/shared/lib/navigation.ts +21 -0
  195. package/templates/app/apps/web/src/shared/ui/assistant-markdown.tsx +19 -0
  196. package/templates/app/apps/web/src/shared/ui/assistant-panel.css +134 -0
  197. package/templates/app/apps/web/src/shared/ui/assistant-panel.tsx +200 -0
  198. package/templates/app/apps/web/src/shared/ui/assistant-scope.tsx +72 -0
  199. package/templates/app/apps/web/src/shared/ui/attachment-upload.css +28 -0
  200. package/templates/app/apps/web/src/shared/ui/attachment-upload.tsx +163 -0
  201. package/templates/app/apps/web/src/shared/ui/notice.tsx +7 -0
  202. package/templates/app/apps/web/src/shared/ui/page-heading.tsx +7 -0
  203. package/templates/app/apps/web/src/shared/ui/page-state.css +47 -0
  204. package/templates/app/apps/web/src/shared/ui/page-state.tsx +76 -0
  205. package/templates/app/apps/web/src/shared/ui/require-capability.tsx +34 -0
  206. package/templates/app/apps/web/vite.config.ts +5 -0
  207. package/templates/app/cage.config.json +9 -0
  208. package/templates/app/db/migrations/0002_draft.sql +12 -0
  209. package/templates/app/db/migrations/0003_draft.sql +8 -0
  210. package/templates/app/deploy/nginx.conf +52 -0
  211. package/templates/app/docs/ai/README.md +21 -0
  212. package/templates/app/docs/ai/architecture.md +26 -0
  213. package/templates/app/docs/ai/commenting.md +203 -0
  214. package/templates/app/docs/ai/diagnostics.md +80 -0
  215. package/templates/app/docs/ai/files.md +93 -0
  216. package/templates/app/docs/ai/intelligence.md +348 -0
  217. package/templates/app/docs/ai/ontology-context.md +59 -4
  218. package/templates/app/docs/ai/primitives.md +33 -0
  219. package/templates/app/docs/ai/project-structure.md +8 -3
  220. package/templates/app/docs/ai/purchase-example.md +16 -2
  221. package/templates/app/docs/ai/recipes.md +9 -1
  222. package/templates/app/docs/ai/routing.md +86 -0
  223. package/templates/app/docs/ai/troubleshooting.md +5 -0
  224. package/templates/app/docs/ai/workflow.md +24 -11
  225. package/templates/app/docs/errors/CAGE-AI-001.md +61 -0
  226. package/templates/app/docs/errors/CAGE-APPR-001.md +7 -6
  227. package/templates/app/docs/errors/CAGE-APPR-002.md +2 -2
  228. package/templates/app/docs/errors/CAGE-APPR-003.md +1 -1
  229. package/templates/app/docs/errors/CAGE-APPR-004.md +4 -4
  230. package/templates/app/docs/errors/CAGE-APPR-005.md +1 -1
  231. package/templates/app/docs/errors/CAGE-APPR-006.md +12 -6
  232. package/templates/app/docs/errors/CAGE-APPR-007.md +3 -3
  233. package/templates/app/docs/errors/CAGE-APPR-010.md +5 -5
  234. package/templates/app/docs/errors/CAGE-AUDIT-001.md +53 -0
  235. package/templates/app/docs/errors/CAGE-AUTH-001.md +1 -1
  236. package/templates/app/docs/errors/CAGE-BIZ-001.md +51 -0
  237. package/templates/app/docs/errors/CAGE-BIZ-002.md +49 -0
  238. package/templates/app/docs/errors/CAGE-BUDGET-001.md +1 -1
  239. package/templates/app/docs/errors/CAGE-BUDGET-002.md +1 -1
  240. package/templates/app/docs/errors/CAGE-BUDGET-003.md +1 -1
  241. package/templates/app/docs/errors/CAGE-CMD-002.md +1 -1
  242. package/templates/app/docs/errors/CAGE-CMD-003.md +1 -1
  243. package/templates/app/docs/errors/CAGE-CONN-001.md +3 -3
  244. package/templates/app/docs/errors/CAGE-CONN-002.md +1 -1
  245. package/templates/app/docs/errors/CAGE-CONN-003.md +1 -1
  246. package/templates/app/docs/errors/CAGE-CONN-004.md +1 -1
  247. package/templates/app/docs/errors/CAGE-CONN-005.md +1 -1
  248. package/templates/app/docs/errors/CAGE-CONN-006.md +1 -1
  249. package/templates/app/docs/errors/CAGE-CONN-007.md +6 -6
  250. package/templates/app/docs/errors/CAGE-CONN-008.md +5 -5
  251. package/templates/app/docs/errors/CAGE-CONN-009.md +6 -6
  252. package/templates/app/docs/errors/CAGE-CONN-010.md +6 -6
  253. package/templates/app/docs/errors/CAGE-CONN-011.md +1 -1
  254. package/templates/app/docs/errors/CAGE-CONN-012.md +1 -1
  255. package/templates/app/docs/errors/CAGE-CONN-013.md +49 -0
  256. package/templates/app/docs/errors/CAGE-CONN-014.md +48 -0
  257. package/templates/app/docs/errors/CAGE-CONN-015.md +49 -0
  258. package/templates/app/docs/errors/CAGE-CREATE-001.md +10 -9
  259. package/templates/app/docs/errors/CAGE-DECL-001.md +2 -2
  260. package/templates/app/docs/errors/CAGE-DECL-002.md +7 -6
  261. package/templates/app/docs/errors/CAGE-DECL-003.md +1 -1
  262. package/templates/app/docs/errors/CAGE-DECL-004.md +1 -1
  263. package/templates/app/docs/errors/CAGE-DEP-001.md +2 -2
  264. package/templates/app/docs/errors/CAGE-DEP-002.md +1 -1
  265. package/templates/app/docs/errors/CAGE-DEP-003.md +2 -2
  266. package/templates/app/docs/errors/CAGE-DEP-004.md +1 -1
  267. package/templates/app/docs/errors/CAGE-DEP-005.md +1 -1
  268. package/templates/app/docs/errors/CAGE-DIAG-001.md +53 -0
  269. package/templates/app/docs/errors/CAGE-DLQ-001.md +2 -2
  270. package/templates/app/docs/errors/CAGE-ENV-001.md +4 -4
  271. package/templates/app/docs/errors/CAGE-ENV-002.md +51 -0
  272. package/templates/app/docs/errors/CAGE-ENV-003.md +48 -0
  273. package/templates/app/docs/errors/CAGE-EVENT-001.md +1 -1
  274. package/templates/app/docs/errors/CAGE-EVENT-002.md +7 -7
  275. package/templates/app/docs/errors/CAGE-FIELD-001.md +2 -2
  276. package/templates/app/docs/errors/CAGE-FIELD-002.md +1 -1
  277. package/templates/app/docs/errors/CAGE-FIELD-003.md +1 -1
  278. package/templates/app/docs/errors/CAGE-FIELD-004.md +1 -1
  279. package/templates/app/docs/errors/CAGE-FILE-001.md +56 -0
  280. package/templates/app/docs/errors/CAGE-GEN-001.md +2 -2
  281. package/templates/app/docs/errors/CAGE-GEN-002.md +1 -1
  282. package/templates/app/docs/errors/CAGE-GEN-003.md +53 -0
  283. package/templates/app/docs/errors/CAGE-GRANT-001.md +3 -3
  284. package/templates/app/docs/errors/CAGE-GRANT-002.md +2 -2
  285. package/templates/app/docs/errors/CAGE-GRANT-003.md +7 -6
  286. package/templates/app/docs/errors/CAGE-IMPACT-001.md +2 -2
  287. package/templates/app/docs/errors/CAGE-IMPACT-002.md +52 -0
  288. package/templates/app/docs/errors/CAGE-INIT-001.md +1 -1
  289. package/templates/app/docs/errors/CAGE-INIT-002.md +1 -1
  290. package/templates/app/docs/errors/CAGE-INIT-003.md +2 -2
  291. package/templates/app/docs/errors/CAGE-INIT-004.md +1 -1
  292. package/templates/app/docs/errors/CAGE-INIT-005.md +52 -0
  293. package/templates/app/docs/errors/CAGE-JOB-001.md +1 -1
  294. package/templates/app/docs/errors/CAGE-JOB-002.md +1 -1
  295. package/templates/app/docs/errors/CAGE-JOB-003.md +1 -1
  296. package/templates/app/docs/errors/CAGE-LINT-001.md +1 -1
  297. package/templates/app/docs/errors/CAGE-MIG-001.md +1 -1
  298. package/templates/app/docs/errors/CAGE-MIG-002.md +1 -1
  299. package/templates/app/docs/errors/CAGE-MIG-005.md +1 -1
  300. package/templates/app/docs/errors/CAGE-NAME-001.md +1 -1
  301. package/templates/app/docs/errors/CAGE-NAME-002.md +1 -1
  302. package/templates/app/docs/errors/CAGE-NAME-003.md +3 -3
  303. package/templates/app/docs/errors/CAGE-NAME-004.md +1 -1
  304. package/templates/app/docs/errors/CAGE-NAME-005.md +1 -1
  305. package/templates/app/docs/errors/CAGE-NAME-006.md +1 -1
  306. package/templates/app/docs/errors/CAGE-ORG-001.md +7 -6
  307. package/templates/app/docs/errors/CAGE-PAIR-002.md +6 -5
  308. package/templates/app/docs/errors/CAGE-QUERY-001.md +1 -1
  309. package/templates/app/docs/errors/CAGE-QUERY-002.md +2 -2
  310. package/templates/app/docs/errors/CAGE-QUERY-003.md +7 -6
  311. package/templates/app/docs/errors/CAGE-REACT-001.md +3 -3
  312. package/templates/app/docs/errors/CAGE-REACT-002.md +1 -1
  313. package/templates/app/docs/errors/CAGE-REACT-003.md +50 -0
  314. package/templates/app/docs/errors/CAGE-READS-001.md +9 -6
  315. package/templates/app/docs/errors/CAGE-REG-001.md +13 -12
  316. package/templates/app/docs/errors/CAGE-REG-002.md +2 -1
  317. package/templates/app/docs/errors/CAGE-REG-003.md +1 -1
  318. package/templates/app/docs/errors/CAGE-REL-001.md +14 -14
  319. package/templates/app/docs/errors/CAGE-ROUTE-001.md +7 -6
  320. package/templates/app/docs/errors/CAGE-SCOPE-001.md +1 -1
  321. package/templates/app/docs/errors/CAGE-SCOPE-002.md +2 -2
  322. package/templates/app/docs/errors/CAGE-SECRET-001.md +2 -2
  323. package/templates/app/docs/errors/CAGE-SECRET-002.md +1 -1
  324. package/templates/app/docs/errors/CAGE-SENS-001.md +5 -5
  325. package/templates/app/docs/errors/CAGE-SQL-001.md +1 -1
  326. package/templates/app/docs/errors/CAGE-SQL-002.md +1 -1
  327. package/templates/app/docs/errors/CAGE-STATE-001.md +3 -3
  328. package/templates/app/docs/errors/CAGE-STATE-002.md +1 -1
  329. package/templates/app/docs/errors/CAGE-STATE-003.md +1 -1
  330. package/templates/app/docs/errors/CAGE-STATE-004.md +1 -1
  331. package/templates/app/docs/errors/CAGE-STATE-005.md +3 -2
  332. package/templates/app/docs/errors/CAGE-STATE-010.md +5 -5
  333. package/templates/app/docs/errors/CAGE-STATE-011.md +5 -5
  334. package/templates/app/docs/errors/CAGE-STRUCT-001.md +1 -1
  335. package/templates/app/docs/errors/CAGE-STRUCT-002.md +1 -1
  336. package/templates/app/docs/errors/CAGE-SYNC-001.md +3 -2
  337. package/templates/app/docs/errors/CAGE-TEST-001.md +1 -1
  338. package/templates/app/docs/errors/CAGE-TEST-002.md +50 -0
  339. package/templates/app/docs/errors/CAGE-TEST-003.md +52 -0
  340. package/templates/app/docs/errors/CAGE-UNSAFE-001.md +3 -2
  341. package/templates/app/docs/errors/CAGE-UPGRADE-001.md +2 -2
  342. package/templates/app/docs/errors/CAGE-WORKER-001.md +48 -0
  343. package/templates/app/docs/errors/CAGE-WORKER-002.md +50 -0
  344. package/templates/app/docs/errors/CAGE-WORKER-003.md +48 -0
  345. package/templates/app/docs/errors/README.md +50 -0
  346. package/templates/app/package.json +3 -3
  347. package/templates/app/packages/contracts/package.json +1 -1
  348. package/templates/app/packages/contracts/src/aggregates/dept/index.ts +10 -10
  349. package/templates/app/packages/contracts/src/aggregates/inventory/index.ts +5 -5
  350. package/templates/app/packages/contracts/src/aggregates/inventory-lock/index.ts +4 -4
  351. package/templates/app/packages/contracts/src/aggregates/purchase-order/index.ts +26 -12
  352. package/templates/app/packages/contracts/src/aggregates/role/index.ts +15 -15
  353. package/templates/app/packages/contracts/src/aggregates/user/index.ts +16 -16
  354. package/templates/app/packages/contracts/src/index.ts +7 -1
  355. package/templates/app/packages/contracts/src/queries/index.ts +2 -2
  356. package/templates/app/packages/domain/package.json +5 -4
  357. package/templates/app/packages/domain/src/index.ts +4 -0
  358. package/templates/app/packages/domain/src/integrations/erp.ts +15 -0
  359. package/templates/app/packages/domain/src/integrations/intelligence.ts +20 -0
  360. package/templates/app/packages/domain/src/modules/inventory/index.ts +1 -0
  361. package/templates/app/packages/domain/src/modules/inventory/inventory.ts +12 -0
  362. package/templates/app/packages/domain/src/modules/purchase/approvals.ts +22 -1
  363. package/templates/app/packages/domain/src/modules/purchase/index.ts +1 -0
  364. package/templates/app/packages/domain/src/modules/purchase/intelligence.test.ts +62 -0
  365. package/templates/app/packages/domain/src/modules/purchase/jobs.ts +5 -0
  366. package/templates/app/packages/domain/src/modules/purchase/purchase-order.test.ts +9 -0
  367. package/templates/app/packages/domain/src/modules/purchase/purchase-order.ts +70 -0
  368. package/templates/app/packages/domain/src/modules/purchase/queries.ts +5 -0
  369. package/templates/app/packages/domain/src/workflows/purchase-inventory.ts +6 -0
  370. package/templates/app/packages/domain/src/workflows/purchase-process.ts +42 -0
  371. package/templates/blank/.dockerignore +2 -0
  372. package/templates/blank/.env.example +10 -0
  373. package/templates/blank/AGENTS.md +49 -9
  374. package/templates/blank/README.md +4 -1
  375. package/templates/blank/_gitignore +1 -0
  376. package/templates/blank/apps/api/package.json +1 -1
  377. package/templates/blank/apps/api/src/main.ts +4 -1
  378. package/templates/blank/apps/api/src/worker.ts +2 -0
  379. package/templates/blank/apps/web/index.html +1 -0
  380. package/templates/blank/apps/web/package.json +7 -3
  381. package/templates/blank/apps/web/src/app/app.tsx +80 -18
  382. package/templates/blank/apps/web/src/app/styles/global.css +90 -0
  383. package/templates/blank/apps/web/src/app/use-session.ts +43 -0
  384. package/templates/blank/apps/web/src/app/workspace-layout.tsx +30 -5
  385. package/templates/blank/apps/web/src/main.tsx +5 -0
  386. package/templates/blank/apps/web/src/modules/auth/index.ts +4 -0
  387. package/templates/blank/apps/web/src/modules/auth/pages/login-page.tsx +18 -1
  388. package/templates/blank/apps/web/src/modules/directory/index.ts +7 -0
  389. package/templates/blank/apps/web/src/modules/directory/pages/user-detail-page.tsx +78 -0
  390. package/templates/blank/apps/web/src/modules/directory/pages/users-page.tsx +93 -0
  391. package/templates/blank/apps/web/src/modules/workspace/index.ts +4 -0
  392. package/templates/blank/apps/web/src/modules/workspace/pages/home-page.tsx +17 -0
  393. package/templates/blank/apps/web/src/shared/lib/error-message.ts +11 -0
  394. package/templates/blank/apps/web/src/shared/lib/navigation.ts +21 -0
  395. package/templates/blank/apps/web/src/shared/ui/brand.tsx +10 -2
  396. package/templates/blank/apps/web/src/shared/ui/page-state.css +47 -0
  397. package/templates/blank/apps/web/src/shared/ui/page-state.tsx +76 -0
  398. package/templates/blank/apps/web/src/shared/ui/require-capability.tsx +34 -0
  399. package/templates/blank/apps/web/vite.config.ts +5 -0
  400. package/templates/blank/deploy/nginx.conf +52 -0
  401. package/templates/blank/docs/ai/README.md +21 -0
  402. package/templates/blank/docs/ai/architecture.md +26 -0
  403. package/templates/blank/docs/ai/commenting.md +203 -0
  404. package/templates/blank/docs/ai/diagnostics.md +80 -0
  405. package/templates/blank/docs/ai/files.md +93 -0
  406. package/templates/blank/docs/ai/intelligence.md +348 -0
  407. package/templates/blank/docs/ai/ontology-context.md +59 -4
  408. package/templates/blank/docs/ai/primitives.md +33 -0
  409. package/templates/blank/docs/ai/project-structure.md +8 -3
  410. package/templates/blank/docs/ai/purchase-example.md +16 -2
  411. package/templates/blank/docs/ai/recipes.md +9 -1
  412. package/templates/blank/docs/ai/routing.md +86 -0
  413. package/templates/blank/docs/ai/troubleshooting.md +5 -0
  414. package/templates/blank/docs/ai/workflow.md +24 -11
  415. package/templates/blank/docs/errors/CAGE-AI-001.md +61 -0
  416. package/templates/blank/docs/errors/CAGE-APPR-001.md +7 -6
  417. package/templates/blank/docs/errors/CAGE-APPR-002.md +2 -2
  418. package/templates/blank/docs/errors/CAGE-APPR-003.md +1 -1
  419. package/templates/blank/docs/errors/CAGE-APPR-004.md +4 -4
  420. package/templates/blank/docs/errors/CAGE-APPR-005.md +1 -1
  421. package/templates/blank/docs/errors/CAGE-APPR-006.md +12 -6
  422. package/templates/blank/docs/errors/CAGE-APPR-007.md +3 -3
  423. package/templates/blank/docs/errors/CAGE-APPR-010.md +5 -5
  424. package/templates/blank/docs/errors/CAGE-AUDIT-001.md +53 -0
  425. package/templates/blank/docs/errors/CAGE-AUTH-001.md +1 -1
  426. package/templates/blank/docs/errors/CAGE-BIZ-001.md +51 -0
  427. package/templates/blank/docs/errors/CAGE-BIZ-002.md +49 -0
  428. package/templates/blank/docs/errors/CAGE-BUDGET-001.md +1 -1
  429. package/templates/blank/docs/errors/CAGE-BUDGET-002.md +1 -1
  430. package/templates/blank/docs/errors/CAGE-BUDGET-003.md +1 -1
  431. package/templates/blank/docs/errors/CAGE-CMD-002.md +1 -1
  432. package/templates/blank/docs/errors/CAGE-CMD-003.md +1 -1
  433. package/templates/blank/docs/errors/CAGE-CONN-001.md +3 -3
  434. package/templates/blank/docs/errors/CAGE-CONN-002.md +1 -1
  435. package/templates/blank/docs/errors/CAGE-CONN-003.md +1 -1
  436. package/templates/blank/docs/errors/CAGE-CONN-004.md +1 -1
  437. package/templates/blank/docs/errors/CAGE-CONN-005.md +1 -1
  438. package/templates/blank/docs/errors/CAGE-CONN-006.md +1 -1
  439. package/templates/blank/docs/errors/CAGE-CONN-007.md +6 -6
  440. package/templates/blank/docs/errors/CAGE-CONN-008.md +5 -5
  441. package/templates/blank/docs/errors/CAGE-CONN-009.md +6 -6
  442. package/templates/blank/docs/errors/CAGE-CONN-010.md +6 -6
  443. package/templates/blank/docs/errors/CAGE-CONN-011.md +1 -1
  444. package/templates/blank/docs/errors/CAGE-CONN-012.md +1 -1
  445. package/templates/blank/docs/errors/CAGE-CONN-013.md +49 -0
  446. package/templates/blank/docs/errors/CAGE-CONN-014.md +48 -0
  447. package/templates/blank/docs/errors/CAGE-CONN-015.md +49 -0
  448. package/templates/blank/docs/errors/CAGE-CREATE-001.md +10 -9
  449. package/templates/blank/docs/errors/CAGE-DECL-001.md +2 -2
  450. package/templates/blank/docs/errors/CAGE-DECL-002.md +7 -6
  451. package/templates/blank/docs/errors/CAGE-DECL-003.md +1 -1
  452. package/templates/blank/docs/errors/CAGE-DECL-004.md +1 -1
  453. package/templates/blank/docs/errors/CAGE-DEP-001.md +2 -2
  454. package/templates/blank/docs/errors/CAGE-DEP-002.md +1 -1
  455. package/templates/blank/docs/errors/CAGE-DEP-003.md +2 -2
  456. package/templates/blank/docs/errors/CAGE-DEP-004.md +1 -1
  457. package/templates/blank/docs/errors/CAGE-DEP-005.md +1 -1
  458. package/templates/blank/docs/errors/CAGE-DIAG-001.md +53 -0
  459. package/templates/blank/docs/errors/CAGE-DLQ-001.md +2 -2
  460. package/templates/blank/docs/errors/CAGE-ENV-001.md +4 -4
  461. package/templates/blank/docs/errors/CAGE-ENV-002.md +51 -0
  462. package/templates/blank/docs/errors/CAGE-ENV-003.md +48 -0
  463. package/templates/blank/docs/errors/CAGE-EVENT-001.md +1 -1
  464. package/templates/blank/docs/errors/CAGE-EVENT-002.md +7 -7
  465. package/templates/blank/docs/errors/CAGE-FIELD-001.md +2 -2
  466. package/templates/blank/docs/errors/CAGE-FIELD-002.md +1 -1
  467. package/templates/blank/docs/errors/CAGE-FIELD-003.md +1 -1
  468. package/templates/blank/docs/errors/CAGE-FIELD-004.md +1 -1
  469. package/templates/blank/docs/errors/CAGE-FILE-001.md +56 -0
  470. package/templates/blank/docs/errors/CAGE-GEN-001.md +2 -2
  471. package/templates/blank/docs/errors/CAGE-GEN-002.md +1 -1
  472. package/templates/blank/docs/errors/CAGE-GEN-003.md +53 -0
  473. package/templates/blank/docs/errors/CAGE-GRANT-001.md +3 -3
  474. package/templates/blank/docs/errors/CAGE-GRANT-002.md +2 -2
  475. package/templates/blank/docs/errors/CAGE-GRANT-003.md +7 -6
  476. package/templates/blank/docs/errors/CAGE-IMPACT-001.md +2 -2
  477. package/templates/blank/docs/errors/CAGE-IMPACT-002.md +52 -0
  478. package/templates/blank/docs/errors/CAGE-INIT-001.md +1 -1
  479. package/templates/blank/docs/errors/CAGE-INIT-002.md +1 -1
  480. package/templates/blank/docs/errors/CAGE-INIT-003.md +2 -2
  481. package/templates/blank/docs/errors/CAGE-INIT-004.md +1 -1
  482. package/templates/blank/docs/errors/CAGE-INIT-005.md +52 -0
  483. package/templates/blank/docs/errors/CAGE-JOB-001.md +1 -1
  484. package/templates/blank/docs/errors/CAGE-JOB-002.md +1 -1
  485. package/templates/blank/docs/errors/CAGE-JOB-003.md +1 -1
  486. package/templates/blank/docs/errors/CAGE-LINT-001.md +1 -1
  487. package/templates/blank/docs/errors/CAGE-MIG-001.md +1 -1
  488. package/templates/blank/docs/errors/CAGE-MIG-002.md +1 -1
  489. package/templates/blank/docs/errors/CAGE-MIG-005.md +1 -1
  490. package/templates/blank/docs/errors/CAGE-NAME-001.md +1 -1
  491. package/templates/blank/docs/errors/CAGE-NAME-002.md +1 -1
  492. package/templates/blank/docs/errors/CAGE-NAME-003.md +3 -3
  493. package/templates/blank/docs/errors/CAGE-NAME-004.md +1 -1
  494. package/templates/blank/docs/errors/CAGE-NAME-005.md +1 -1
  495. package/templates/blank/docs/errors/CAGE-NAME-006.md +1 -1
  496. package/templates/blank/docs/errors/CAGE-ORG-001.md +7 -6
  497. package/templates/blank/docs/errors/CAGE-PAIR-002.md +6 -5
  498. package/templates/blank/docs/errors/CAGE-QUERY-001.md +1 -1
  499. package/templates/blank/docs/errors/CAGE-QUERY-002.md +2 -2
  500. package/templates/blank/docs/errors/CAGE-QUERY-003.md +7 -6
  501. package/templates/blank/docs/errors/CAGE-REACT-001.md +3 -3
  502. package/templates/blank/docs/errors/CAGE-REACT-002.md +1 -1
  503. package/templates/blank/docs/errors/CAGE-REACT-003.md +50 -0
  504. package/templates/blank/docs/errors/CAGE-READS-001.md +9 -6
  505. package/templates/blank/docs/errors/CAGE-REG-001.md +13 -12
  506. package/templates/blank/docs/errors/CAGE-REG-002.md +2 -1
  507. package/templates/blank/docs/errors/CAGE-REG-003.md +1 -1
  508. package/templates/blank/docs/errors/CAGE-REL-001.md +14 -14
  509. package/templates/blank/docs/errors/CAGE-ROUTE-001.md +7 -6
  510. package/templates/blank/docs/errors/CAGE-SCOPE-001.md +1 -1
  511. package/templates/blank/docs/errors/CAGE-SCOPE-002.md +2 -2
  512. package/templates/blank/docs/errors/CAGE-SECRET-001.md +2 -2
  513. package/templates/blank/docs/errors/CAGE-SECRET-002.md +1 -1
  514. package/templates/blank/docs/errors/CAGE-SENS-001.md +5 -5
  515. package/templates/blank/docs/errors/CAGE-SQL-001.md +1 -1
  516. package/templates/blank/docs/errors/CAGE-SQL-002.md +1 -1
  517. package/templates/blank/docs/errors/CAGE-STATE-001.md +3 -3
  518. package/templates/blank/docs/errors/CAGE-STATE-002.md +1 -1
  519. package/templates/blank/docs/errors/CAGE-STATE-003.md +1 -1
  520. package/templates/blank/docs/errors/CAGE-STATE-004.md +1 -1
  521. package/templates/blank/docs/errors/CAGE-STATE-005.md +3 -2
  522. package/templates/blank/docs/errors/CAGE-STATE-010.md +5 -5
  523. package/templates/blank/docs/errors/CAGE-STATE-011.md +5 -5
  524. package/templates/blank/docs/errors/CAGE-STRUCT-001.md +1 -1
  525. package/templates/blank/docs/errors/CAGE-STRUCT-002.md +1 -1
  526. package/templates/blank/docs/errors/CAGE-SYNC-001.md +3 -2
  527. package/templates/blank/docs/errors/CAGE-TEST-001.md +1 -1
  528. package/templates/blank/docs/errors/CAGE-TEST-002.md +50 -0
  529. package/templates/blank/docs/errors/CAGE-TEST-003.md +52 -0
  530. package/templates/blank/docs/errors/CAGE-UNSAFE-001.md +3 -2
  531. package/templates/blank/docs/errors/CAGE-UPGRADE-001.md +2 -2
  532. package/templates/blank/docs/errors/CAGE-WORKER-001.md +48 -0
  533. package/templates/blank/docs/errors/CAGE-WORKER-002.md +50 -0
  534. package/templates/blank/docs/errors/CAGE-WORKER-003.md +48 -0
  535. package/templates/blank/docs/errors/README.md +50 -0
  536. package/templates/blank/docs/examples/purchase-admin/apps/api/src/main.ts +5 -1
  537. package/templates/blank/docs/examples/purchase-admin/apps/api/src/worker.ts +3 -0
  538. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/app.tsx +122 -12
  539. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/styles/global.css +88 -8
  540. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/use-session.ts +43 -0
  541. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/workspace-layout.tsx +58 -19
  542. package/templates/blank/docs/examples/purchase-admin/apps/web/src/main.tsx +5 -0
  543. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +11 -0
  544. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/index.ts +4 -0
  545. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +20 -1
  546. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/index.ts +4 -0
  547. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/pages/login-page.tsx +12 -0
  548. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/index.ts +4 -0
  549. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/pages/inventory-page.tsx +29 -1
  550. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/approval-history.tsx +32 -0
  551. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
  552. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-assistant-context.tsx +17 -0
  553. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.css +6 -0
  554. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.tsx +25 -3
  555. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/index.ts +5 -0
  556. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/lib/presentation.ts +20 -0
  557. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-intelligence.css +15 -0
  558. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +154 -0
  559. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +52 -22
  560. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/workspace/index.ts +5 -0
  561. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/workspace/pages/home-page.tsx +44 -0
  562. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/hooks/use-command.ts +13 -0
  563. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/error-message.ts +9 -0
  564. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/navigation.ts +21 -0
  565. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-markdown.tsx +19 -0
  566. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-panel.css +134 -0
  567. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-panel.tsx +200 -0
  568. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-scope.tsx +72 -0
  569. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/attachment-upload.css +28 -0
  570. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/attachment-upload.tsx +163 -0
  571. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/notice.tsx +7 -0
  572. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-heading.tsx +7 -0
  573. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-state.css +47 -0
  574. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-state.tsx +76 -0
  575. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/require-capability.tsx +34 -0
  576. package/templates/blank/docs/examples/purchase-admin/cage.config.json +9 -0
  577. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/dept/index.ts +10 -10
  578. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory/index.ts +5 -5
  579. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory-lock/index.ts +4 -4
  580. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/purchase-order/index.ts +26 -12
  581. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/role/index.ts +15 -15
  582. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/user/index.ts +16 -16
  583. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/index.ts +7 -1
  584. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/queries/index.ts +2 -2
  585. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/index.ts +4 -0
  586. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/erp.ts +15 -0
  587. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/intelligence.ts +20 -0
  588. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/index.ts +1 -0
  589. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/inventory.ts +12 -0
  590. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approvals.ts +22 -1
  591. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/index.ts +1 -0
  592. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/intelligence.test.ts +62 -0
  593. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/jobs.ts +5 -0
  594. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts +9 -0
  595. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.ts +70 -0
  596. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/queries.ts +5 -0
  597. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-inventory.ts +6 -0
  598. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-process.ts +42 -0
  599. package/templates/blank/package.json +3 -3
  600. package/templates/blank/packages/contracts/package.json +1 -1
  601. package/templates/blank/packages/contracts/src/aggregates/dept/index.ts +10 -10
  602. package/templates/blank/packages/contracts/src/aggregates/role/index.ts +15 -15
  603. package/templates/blank/packages/contracts/src/aggregates/user/index.ts +16 -16
  604. package/templates/blank/packages/contracts/src/index.ts +1 -1
  605. package/templates/blank/packages/contracts/src/queries/index.ts +1 -1
  606. package/templates/blank/packages/domain/package.json +5 -4
  607. package/templates/blank/packages/domain/src/index.ts +2 -1
@@ -1,7 +1,20 @@
1
+ /**
2
+ * 不依赖模型的本体名称检索,供 CLI、agent 上下文和浏览器筛选共用。
3
+ * 归一化标识与文案,按完整命中或英文词、相邻中文片段计算权重,并返回命中字段。
4
+ * 结果是稳定排序的候选;不进行语义推理,无法保证理解否定、业务同义词或任意自然语言要求。
5
+ */
1
6
  // 轻量、可解释的名称检索;不调用模型,不把关键词匹配描述成“理解任意需求”。
2
7
  // 中文用相邻双字作为线索,让“采购单取消”能匹配“取消采购单”,同时返回命中依据。
3
8
  import { kindLabels, nodeLabel } from './graph-model.js';
9
+ /**
10
+ * 统一全半角、大小写与首尾空白后进行词法比较,不改变输出中的原始标识。
11
+ */
4
12
  const normalize = (value) => value.normalize('NFKC').toLowerCase().trim();
13
+ /**
14
+ * 拆出英文标识词及连续中文的相邻双字片段,并稳定去重。
15
+ * @param query 已归一化查询。
16
+ * @returns 匹配词列表;单汉字单独保留,不执行分词模型。
17
+ */
5
18
  function searchTerms(query) {
6
19
  const terms = query.match(/[a-z0-9_$.:/-]+/g) ?? [];
7
20
  for (const segment of query.match(/[\p{Script=Han}]+/gu) ?? []) {
@@ -14,6 +27,14 @@ function searchTerms(query) {
14
27
  }
15
28
  return [...new Set(terms)];
16
29
  }
30
+ /**
31
+ * 对 key、ID、中文文案、原描述及所属对象分别评分,取最高单字段得分。
32
+ * @param node 待匹配节点。
33
+ * @param query 用户输入。
34
+ * @param labels 显示覆盖。
35
+ * @param descriptions 声明原始描述。
36
+ * @returns 有依据的候选或 undefined;所有命中字段仍保留,不把分数当业务证明。
37
+ */
17
38
  function matchNode(node, query, labels, descriptions) {
18
39
  const normalized = normalize(query);
19
40
  if (!normalized)
@@ -49,6 +70,14 @@ function matchNode(node, query, labels, descriptions) {
49
70
  return { key: node.key, id: node.id, kind: node.kind, label: nodeLabel(node, labels), score, matches };
50
71
  }
51
72
  /** 排序稳定,结果携带命中字段;多个候选不静默合成一个“正确需求”。 */
73
+ /**
74
+ * 按可选类型筛选并稳定排序名称候选。
75
+ * @param model 展示图。
76
+ * @param query 关键词。
77
+ * @param labels 中文覆盖。
78
+ * @param options 类型范围及原始描述。
79
+ * @returns 完整候选数组,调用方负责 limit 和截断提示。
80
+ */
52
81
  export function searchGraphNodes(model, query, labels = {}, options = {}) {
53
82
  return model.nodes
54
83
  .filter((node) => !options.kind || node.kind === options.kind)
@@ -57,6 +86,13 @@ export function searchGraphNodes(model, query, labels = {}, options = {}) {
57
86
  .sort((a, b) => b.score - a.score || a.key.localeCompare(b.key));
58
87
  }
59
88
  /** 画布的筛选与搜索下拉共用同一匹配规则,保留按节点类型查找的用法。 */
89
+ /**
90
+ * 供画布筛选复用名称匹配,并额外允许按中文类型名称筛选。
91
+ * @param node 展示节点。
92
+ * @param query 筛选文字。
93
+ * @param labels 中文映射。
94
+ * @returns 是否命中;空查询可匹配类型名称,不修改图。
95
+ */
60
96
  export function matchesNode(node, query, labels) {
61
97
  return !!matchNode(node, query, labels, {}) || normalize(kindLabels[node.kind]).includes(normalize(query));
62
98
  }
@@ -1,4 +1,6 @@
1
1
  <!doctype html>
2
+ <!-- 本地本体探索器的静态骨架,由 graph 服务提供并由 app.js 填充。
3
+ ID 是脚本绑定契约;本页不嵌入领域执行代码,业务地图与完整本体共用导航和检查结果。 -->
2
4
  <html lang="zh-CN">
3
5
  <head>
4
6
  <meta charset="UTF-8" />
@@ -10,6 +12,7 @@
10
12
  href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Crect width='40' height='40' rx='10' fill='%232d665a'/%3E%3Cpath d='M11 12h18v16H11zm0 8h18m-9-8v16' stroke='%23fff' fill='none' stroke-width='2'/%3E%3C/svg%3E"
11
13
  />
12
14
  <link rel="stylesheet" href="/style.css" />
15
+ <link rel="stylesheet" href="/business.css" />
13
16
  </head>
14
17
  <body>
15
18
  <div class="app-shell">
@@ -19,7 +22,7 @@
19
22
  ><strong>CAGE<span>ATLAS</span></strong></a
20
23
  >
21
24
  <div class="breadcrumb">
22
- <span>开发者工作台</span><b>/</b><span id="project-name">正在读取项目</span>
25
+ <span>业务探索工作台</span><b>/</b><span id="project-name">正在读取项目</span>
23
26
  </div>
24
27
  <span class="local-badge"><i></i>本地声明</span>
25
28
  <button
@@ -32,10 +35,13 @@
32
35
  </button>
33
36
  </header>
34
37
 
38
+ <!-- 对象/板块导航与类型筛选由当前视图重建,移动端展开状态由按钮的 aria-expanded 同步。 -->
35
39
  <aside class="sidebar" id="sidebar">
36
40
  <div class="section-label">项目工作区 <span>01</span></div>
37
41
  <div class="nav-active"><span class="nav-symbol">◇</span> 本体图谱 <span class="nav-dot"></span></div>
38
- <div class="sidebar-heading">业务对象 <span id="aggregate-total"></span></div>
42
+ <div class="sidebar-heading">
43
+ <span id="objects-heading-label">业务板块</span><span id="aggregate-total"></span>
44
+ </div>
39
45
  <div id="aggregate-list" class="aggregate-list"></div>
40
46
  <div class="sidebar-heading" id="types-heading">
41
47
  节点类型 <button id="reset-types" class="text-button">重置</button>
@@ -61,12 +67,12 @@
61
67
  >
62
68
  </aside>
63
69
 
64
- <main class="main">
70
+ <main class="main business-page" id="main">
65
71
  <section class="page-heading">
66
72
  <div>
67
73
  <div class="eyebrow">业务关系探索</div>
68
- <h1>本体图谱<span class="version-tag">v0.1</span></h1>
69
- <p>从声明出发,看见业务如何连接。</p>
74
+ <h1 id="page-title">业务地图</h1>
75
+ <p id="page-description">先理解业务,再沿流程找到实现。</p>
70
76
  </div>
71
77
  <div class="heading-actions">
72
78
  <button id="download" class="button secondary"><span>↓</span> 导出 JSON</button
@@ -77,15 +83,17 @@
77
83
  <section class="overview" aria-label="图谱统计">
78
84
  <div class="overview-item">
79
85
  <span class="metric-icon aggregate-icon">◇</span>
80
- <div><small>业务对象</small><strong id="metric-aggregates">—</strong></div>
86
+ <div>
87
+ <small id="metric-first-label">业务板块</small><strong id="metric-aggregates">—</strong>
88
+ </div>
81
89
  </div>
82
90
  <div class="overview-item">
83
91
  <span class="metric-icon node-icon">⠿</span>
84
- <div><small>声明节点</small><strong id="metric-nodes">—</strong></div>
92
+ <div><small id="metric-second-label">流程入口</small><strong id="metric-nodes">—</strong></div>
85
93
  </div>
86
94
  <div class="overview-item">
87
95
  <span class="metric-icon edge-icon">↗</span>
88
- <div><small>声明关系</small><strong id="metric-edges">—</strong></div>
96
+ <div><small id="metric-third-label">业务对象</small><strong id="metric-edges">—</strong></div>
89
97
  </div>
90
98
  <div class="overview-health">
91
99
  <span id="health-dot" class="health-dot"></span>
@@ -94,12 +102,13 @@
94
102
  </div>
95
103
  </section>
96
104
 
97
- <section class="explorer" aria-label="交互式本体图谱">
105
+ <!-- 三个视图共享工具条;business-view 承载流程,canvas 承载完整图和对象字段图。 -->
106
+ <section class="explorer business-mode" id="explorer" aria-label="交互式业务地图与本体图谱">
98
107
  <div class="graph-panel">
99
108
  <div class="graph-toolbar">
100
109
  <div class="tabs" role="group" aria-label="图谱视图">
101
- <button data-mode="structure" class="active" aria-pressed="true">对象与字段</button
102
- ><button data-mode="business" aria-pressed="false">业务流程</button
110
+ <button data-mode="business" class="active" aria-pressed="true">业务地图</button
111
+ ><button data-mode="structure" aria-pressed="false">对象与字段</button
103
112
  ><button data-mode="all" aria-pressed="false">完整本体</button>
104
113
  </div>
105
114
  <div class="search-wrap">
@@ -107,13 +116,14 @@
107
116
  ><input
108
117
  id="search"
109
118
  type="search"
110
- placeholder="搜索中文名称或代码标识"
119
+ placeholder="搜索业务、流程或代码标识"
111
120
  aria-label="搜索节点"
112
121
  autocomplete="off"
113
122
  /><kbd>/</kbd>
114
123
  <div id="search-results" class="search-results" hidden></div>
115
124
  </div>
116
125
  </div>
126
+ <div id="business-view" class="business-view" aria-label="业务板块与流程"></div>
117
127
  <div class="graph-subbar">
118
128
  <span
119
129
  ><i class="tiny-dot"></i><strong id="view-title">全部业务</strong
@@ -150,6 +160,7 @@
150
160
  <path d="M0 0L10 5L0 10z" fill="#357c6c" />
151
161
  </marker>
152
162
  </defs>
163
+ <!-- 脚本只变换 viewport 来实现平移和缩放,边先于节点绘制以保留节点命中面。 -->
153
164
  <g id="viewport">
154
165
  <g id="edges"></g>
155
166
  <g id="nodes"></g>
@@ -180,11 +191,13 @@
180
191
  </div>
181
192
  <aside id="inspector" class="inspector" aria-label="节点与关系详情" aria-live="polite"></aside>
182
193
  </section>
194
+ <div id="business-health" class="business-health" aria-live="polite"></div>
183
195
  <footer class="page-footer">
184
196
  <span id="domain-path">packages/domain/src/index.ts</span><span>只读探索 · 不连接业务数据库</span>
185
197
  </footer>
186
198
  </main>
187
199
  </div>
200
+ <!-- 规则发现保留在独立对话框,不因主画布能显示就隐藏声明错误。 -->
188
201
  <dialog id="findings-dialog">
189
202
  <div class="dialog-heading">
190
203
  <h2>声明检查</h2>
@@ -192,6 +205,7 @@
192
205
  </div>
193
206
  <div id="findings-list"></div>
194
207
  </dialog>
208
+ <!-- 模块入口在 DOM 骨架之后加载,固定资源由 CLI 构建脚本输出到 graph-ui。 -->
195
209
  <script type="module" src="/app.js"></script>
196
210
  </body>
197
211
  </html>
package/graph-ui/model.js CHANGED
@@ -1,6 +1,9 @@
1
1
  import { kindLabels } from './graph-model.js';
2
2
  export { nodeLabel, projectGraph, neighborhood, edgeLabels } from './graph-model.js';
3
3
  export { matchesNode } from './graph-search.js';
4
+ /**
5
+ * 节点类型对应的中文标签、颜色、短字和布局列优先级;只影响图谱呈现。
6
+ */
4
7
  export const kinds = {
5
8
  aggregate: { label: kindLabels.aggregate, color: '#197c72', short: '表', column: 0 },
6
9
  command: { label: kindLabels.command, color: '#547db2', short: '令', column: 1 },
@@ -17,12 +20,30 @@ export const kinds = {
17
20
  state: { label: kindLabels.state, color: '#898b69', short: '态', column: 2 },
18
21
  capability: { label: kindLabels.capability, color: '#81949f', short: '权', column: 1 },
19
22
  entry: { label: kindLabels.entry, color: '#89938e', short: '+', column: 0 },
23
+ process: { label: kindLabels.process, color: '#397a56', short: '流', column: 0 },
24
+ stage: { label: kindLabels.stage, color: '#648c5b', short: '段', column: 1 },
20
25
  };
26
+ /**
27
+ * 按组织聚合前缀识别默认隐藏对象,不是能力或租户授权判断。
28
+ */
21
29
  export const isSystem = (node) => /^(User|Role|Dept)(\.|$)/.test(node.id);
30
+ /**
31
+ * 完整本体普通节点的固定宽度,单位为画布单位,与 edgePath 端点计算保持一致。
32
+ */
22
33
  export const NODE_WIDTH = 190;
34
+ /**
35
+ * 完整本体普通节点高度,单位为画布单位;对象字段卡片使用独立动态高度。
36
+ */
23
37
  export const NODE_HEIGHT = 56;
24
38
  /** 按类型分组的平衡列 + 邻接排序。相同声明每次打开位置相同,没有持续运动的力导向
25
39
  * 动画;读长名称、比较刷新前后的关系时不会被随机布局打断。 */
40
+ /**
41
+ * 按语义列与邻接平均纵坐标计算确定性位置,避免随机布局干扰阅读。
42
+ * @param nodes 可见节点,不修改原数组。
43
+ * @param edges 可见关系。
44
+ * @param focusKey 小于等于 12 节点时以该节点作为中间列。
45
+ * @returns 节点 key 到坐标映射;没有持续动画或 DOM 副作用。
46
+ */
26
47
  export function layoutGraph(nodes, edges, focusKey) {
27
48
  const positions = new Map();
28
49
  // 小范围聚焦按关系方向排布:依赖方在左、当前节点居中、目标在右。
@@ -65,6 +86,13 @@ export function layoutGraph(nodes, edges, focusKey) {
65
86
  }
66
87
  return positions;
67
88
  }
89
+ /**
90
+ * 根据两个普通节点位置绘制曲线,同列及自环从侧面绕行。
91
+ * @param from 起点左上角。
92
+ * @param to 终点左上角。
93
+ * @param self 是否自环。
94
+ * @returns SVG d 属性,不绘制或修改节点。
95
+ */
68
96
  export function edgePath(from, to, self) {
69
97
  if (self)
70
98
  return `M${from.x + NODE_WIDTH - 25},${from.y} C${from.x + NODE_WIDTH + 50},${from.y - 65} ${from.x + NODE_WIDTH + 50},${from.y + 100} ${from.x + NODE_WIDTH - 25},${from.y + NODE_HEIGHT}`;
@@ -1,2 +1,6 @@
1
+ /**
2
+ * 浏览器关系解释的转导出入口,与 CLI 使用同一份 src/graph-relations 规则。
3
+ * 这里只暴露可浏览器执行的纯解释逻辑,不加载数据库、审批引擎或 Node 文件访问模块。
4
+ */
1
5
  // Web 与 AI 上下文共用关系解释,保持证据和业务含义一致。
2
6
  export { explainEdge } from './graph-relations.js';
@@ -1,11 +1,28 @@
1
+ /**
2
+ * 字段卡片固定宽度,单位为画布单位;布局与引用线共享该值。
3
+ */
1
4
  export const TABLE_WIDTH = 336;
5
+ /**
6
+ * 字段卡片标题区高度,引用目标连接到其中心。
7
+ */
2
8
  export const TABLE_HEADER = 58;
9
+ /**
10
+ * 单字段行高度,字段引用起点用此值定位行中心。
11
+ */
3
12
  export const TABLE_ROW = 38;
13
+ /**
14
+ * 字段卡片尾部留白高度,与动态字段数一起确定总高。
15
+ */
4
16
  export const TABLE_FOOTER = 34;
5
17
  /** 对象卡片展示声明字段,而不是猜测完整数据库结构。系统自动添加的列不在
6
18
  * 抽取结果中,因此这里不补造 id 或主键。集合关系也留在 fields 中展示,
7
19
  * 用类型和虚拟关系标记区分物理列,基数来自抽取器明确记录的声明。
8
20
  * 字段仍保留原节点身份,搜索、点击和关系解释都能回到同一份声明。 */
21
+ /**
22
+ * 沿 field 边收集聚合声明字段并计算卡片高度,不补造系统列。
23
+ * @param model 展示图。
24
+ * @returns 所有聚合卡片,虚拟关系仍作为声明字段展示。
25
+ */
9
26
  export function tableCards(model) {
10
27
  return model.nodes
11
28
  .filter((n) => n.kind === 'aggregate')
@@ -16,11 +33,24 @@ export function tableCards(model) {
16
33
  });
17
34
  }
18
35
  /** 用真实字段归属解析端点;不能把两个同名字段合并,也不能把命令算成列。 */
36
+ /**
37
+ * 通过完整 key 找到聚合或字段所属卡片。
38
+ * @param cards 卡片列表。
39
+ * @param key 聚合或字段身份。
40
+ * @returns 匹配卡片或 undefined,命令不会被当字段。
41
+ */
19
42
  export function tableOwner(cards, key) {
20
43
  return cards.find((card) => card.node.key === key || card.fields.some((field) => field.key === key));
21
44
  }
22
45
  /** 关联较多的对象优先放置,再按实际卡片高度分配到最短列。
23
46
  * 两列上限保持字段字可读;卡片高度由字段数决定,避免固定网格裁掉长表。 */
47
+ /**
48
+ * 优先放置关系多且较高的卡片,再将每张卡放入当前最短列。
49
+ * @param cards 卡片数组,不修改。
50
+ * @param edges 引用关系,用于连接度排序。
51
+ * @param columns 调用方按可用宽度给出的列数。
52
+ * @returns 卡片坐标映射,未连接数据库或保存布局。
53
+ */
24
54
  export function layoutTables(cards, edges, columns) {
25
55
  const positions = new Map();
26
56
  const heights = Array.from({ length: Math.min(columns, cards.length) }, () => 0);
@@ -35,6 +65,13 @@ export function layoutTables(cards, edges, columns) {
35
65
  }
36
66
  /** 引用线从具体字段行连接到目标对象表头。端点随卡片拖动一起计算,
37
67
  * 不把整张卡片的中心当成字段位置;同列时从侧边绕开表体。 */
68
+ /**
69
+ * 从具体字段行中心连接到目标卡片表头,随拖动位置实时计算。
70
+ * @param edge 已确认有效的字段引用边。
71
+ * @param cards 可见卡片。
72
+ * @param positions 卡片坐标。
73
+ * @returns SVG 曲线路径,同列侧绕避免穿过表体。
74
+ */
38
75
  export function tableEdgePath(edge, cards, positions) {
39
76
  const source = tableOwner(cards, edge.from);
40
77
  const target = tableOwner(cards, edge.to);
@@ -54,6 +91,11 @@ export function tableEdgePath(edge, cards, positions) {
54
91
  const bend = Math.max(65, Math.abs(x2 - x1) / 2) * (forward ? 1 : -1);
55
92
  return `M${x1},${y1} C${x1 + bend},${y1} ${x2 - bend},${y2} ${x2},${y2}`;
56
93
  }
94
+ /**
95
+ * 将已抽取字段 kind 显示为中文类型。
96
+ * @param field 字段节点。
97
+ * @returns 已知中文类型或原 kind,不推断数据库实际类型。
98
+ */
57
99
  export function fieldType(field) {
58
100
  const types = {
59
101
  text: '文本',
@@ -67,6 +109,8 @@ export function fieldType(field) {
67
109
  ref: '引用',
68
110
  hasMany: '一对多',
69
111
  manyToMany: '多对多',
112
+ file: '文件',
113
+ files: '多文件',
70
114
  list: '列表',
71
115
  json: 'JSON',
72
116
  date: '日期',
@@ -1,5 +1,7 @@
1
1
  /* 图谱工作台使用低饱和的纸面色与矿物绿。节点颜色承担类型区分,装饰保持克制,
2
2
  让长名称、连线和选中状态始终是画面的第一层信息。 */
3
+ /* 本体工作台的基础外观与完整图/对象字段视图样式,由 index.html 先加载。
4
+ * 主题变量、布局和 SVG 状态与 app.ts/model.ts/structure.ts 约定配合;业务流程专属覆盖放在后续 business.css。 */
3
5
  :root {
4
6
  font-family: 'Bahnschrift', 'Microsoft YaHei UI', 'PingFang SC', sans-serif;
5
7
  color: #283d37;
@@ -56,6 +58,7 @@ a {
56
58
  [hidden] {
57
59
  display: none !important;
58
60
  }
61
+ /* 顶部、侧栏与主体的共享页面骨架;侧栏宽度由断点覆盖,主体必须允许内部画布收缩。 */
59
62
  .app-shell {
60
63
  min-height: 100vh;
61
64
  display: grid;
@@ -209,6 +212,7 @@ a {
209
212
  color: #225d49;
210
213
  text-decoration: underline;
211
214
  }
215
+ /* 业务对象导航与类型筛选使用同一选择状态;active 表示当前筛选,不代表服务端授权。 */
212
216
  .aggregate-list {
213
217
  display: grid;
214
218
  gap: 3px;
@@ -490,6 +494,7 @@ h1 {
490
494
  font-size: 12px;
491
495
  white-space: pre-wrap;
492
496
  }
497
+ /* 完整图的画布和解释栏并排组成探索区;窄屏断点将解释栏移到画布下方。 */
493
498
  .explorer {
494
499
  display: grid;
495
500
  grid-template-columns: minmax(0, 1fr) 267px;
@@ -569,6 +574,7 @@ h1 {
569
574
  padding: 1px 4px;
570
575
  color: #a6afa0;
571
576
  }
577
+ /* 检索结果浮在工具条下方,不参与画布几何;长名称截断仅影响显示,节点身份由数据保持。 */
572
578
  .search-results {
573
579
  position: absolute;
574
580
  z-index: 10;
@@ -643,6 +649,7 @@ h1 {
643
649
  color: #a8b19f;
644
650
  white-space: nowrap;
645
651
  }
652
+ /* SVG 画布自身裁剪平移内容;缩放、拖动和节点位置由脚本更新 transform,本层只提供容器与光标。 */
646
653
  .canvas {
647
654
  flex: 1;
648
655
  min-height: 0;
@@ -738,6 +745,7 @@ h1 {
738
745
  border-top-style: dashed;
739
746
  margin-left: 7px;
740
747
  }
748
+ /* 边与节点的可读状态:派生关系、邻域高亮、选中和淡出分开表达,颜色不改变关系语义。 */
741
749
  .edge {
742
750
  fill: none;
743
751
  stroke: #aebdb0;
@@ -847,6 +855,7 @@ h1 {
847
855
  transform: rotate(360deg);
848
856
  }
849
857
  }
858
+ /* 解释栏承载节点、关系和证据,长内容独立滚动;来源位置与原始 JSON 不参与图谱布局。 */
850
859
  .inspector {
851
860
  border-left: 1px solid #e5eadd;
852
861
  background: #fff;
@@ -1072,6 +1081,7 @@ dialog::backdrop {
1072
1081
  background: #263c2d44;
1073
1082
  backdrop-filter: blur(3px);
1074
1083
  }
1084
+ /* 检查结果使用原生 dialog 的内容布局,打开关闭和 findings 列表由 app.ts 管理。 */
1075
1085
  .dialog-heading {
1076
1086
  display: flex;
1077
1087
  align-items: center;
@@ -1121,6 +1131,7 @@ dialog::backdrop {
1121
1131
  margin-bottom: 29px;
1122
1132
  }
1123
1133
  }
1134
+ /* 中等宽度逐步压缩边距和工具条,保留交互控件;更窄断点再切换单列布局。 */
1124
1135
  @media (max-width: 1200px) {
1125
1136
  :root {
1126
1137
  --sidebar: 186px;
@@ -1578,6 +1589,7 @@ dialog::backdrop {
1578
1589
  .table-card.selected .table-shadow {
1579
1590
  opacity: 1;
1580
1591
  }
1592
+ /* 对象字段视图的 SVG 卡片。表头拖动整卡,字段行提供独立命中与选择,字体大小与 structure.ts 测量约定配合。 */
1581
1593
  .table-body {
1582
1594
  fill: #fafcf6;
1583
1595
  stroke: #d7e2cc;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yss123/cage-cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "cage 命令行:init、gen、check、graph、context、impact、test、verify、budget、sync、upgrade、dev、migrate",
5
5
  "type": "module",
6
6
  "bin": {
@@ -31,9 +31,11 @@
31
31
  "typescript": "~5.9.3",
32
32
  "vitest": "^4.1.12",
33
33
  "zod": "^4.1.5",
34
- "@yss123/cage-kernel": "0.2.0",
35
- "@yss123/cage-lint": "0.2.0",
36
- "@yss123/cage-testkit": "0.2.0"
34
+ "@yss123/cage-ontology": "0.3.0",
35
+ "@yss123/cage-admin": "0.3.0",
36
+ "@yss123/cage-kernel": "0.3.0",
37
+ "@yss123/cage-lint": "0.3.0",
38
+ "@yss123/cage-testkit": "0.3.0"
37
39
  },
38
40
  "devDependencies": {
39
41
  "@types/pg": "^8.15.5"
@@ -4,6 +4,8 @@ node_modules
4
4
  .git
5
5
  .cage
6
6
  **/.cage
7
+ .cage-files
8
+ **/.cage-files
7
9
  generated
8
10
  .env
9
11
  .env.*
@@ -38,6 +38,12 @@ CAGE_ADMIN_DATABASE_URL=postgresql://postgres:REPLACE_WITH_ADMIN_PASSWORD@127.0.
38
38
  # 自动生成 32 字节随机值;已有值保留。同一应用的多个实例使用同一值。
39
39
  # CAGE_COOKIE_SECRET=
40
40
 
41
+ # 生产 NODE_ENV=production 时必须提供合格随机密钥;固定开发值会被拒绝。
42
+ # 组织在审查执行 migrate 后,显式 cage bootstrap --credentials-file <新的受限文件>。
43
+ # API 日常启动不会初始化组织或向日志输出管理员密码。
44
+ # 可信代理在 apps/api/src/main.ts 显式配置地址/网段;默认 trustProxy: false。
45
+ # /healthz 表示存活,/readyz 检查数据库和授权监听;API 与 worker 使用同版本部署。
46
+
41
47
  # [可选,开发默认 fake] 第三方连接器阶段:fake 使用模拟实现;test / prod 使用真实适配器。
42
48
  # 本项只影响第三方外部服务,fake 阶段仍连接真实 PostgreSQL。
43
49
  # test / prod 需另行配置业务连接器要求的地址与密钥,不是修改此值就完成对接。
@@ -50,6 +56,10 @@ CAGE_WEB_PORT=15173
50
56
  # [可选,默认 3000] API 服务端口;本地 Web 代理自动转发到这个端口。
51
57
  PORT=3000
52
58
 
59
+ # 私有上传目录,不能通过 Nginx/静态服务公开;生产挂载持久卷并与数据库配套备份。
60
+ # 默认是项目根目录 .cage-files;改变目录前必须迁移已有文件。
61
+ CAGE_FILES_DIR=.cage-files
62
+
53
63
  # [可选,范例默认 0.0.0.0] API 监听地址;这里使用 127.0.0.1,仅允许本机访问。
54
64
  # 需要容器内或局域网访问时改为 0.0.0.0,并按部署环境配置网络访问权限。
55
65
  HOST=127.0.0.1
@@ -10,7 +10,7 @@
10
10
 
11
11
  本节位于托管区之外,cage sync 会保留。下面的托管区提供框架工作方法。
12
12
 
13
- <!-- cage:begin v0.2.0 -->
13
+ <!-- cage:begin v0.3.0 -->
14
14
  ## Cage 业务开发约定(框架托管)
15
15
 
16
16
  ### 先读,再按需求改业务
@@ -19,6 +19,33 @@
19
19
 
20
20
  先读项目说明指定的学习资料,默认入口为 `docs/ai/README.md`。第一次读 `architecture.md`、`project-structure.md` 和 `primitives.md`;具体任务读 `recipes.md`,采购全链路读 `purchase-example.md`,错误查 `docs/errors/README.md` 和 `docs/ai/troubleshooting.md`。资料相对该学习目录,项目说明可指定源码仓库中的规范资料位置。
21
21
 
22
+ ### 详细中文注释(每次开发必须遵守)
23
+
24
+ 所有新增和维护的手写源码都必须写详细中文注释,先读学习目录中的 `commenting.md`(独立项目为 `docs/ai/commenting.md`)。注释是交付内容,不能以“代码自解释”或“保持简洁”为由省略。
25
+
26
+ - 每个文件开头说明模块职责、谁调用它、主要调用链和责任边界;纯导出入口也说明如何组合模块。
27
+ - 导出函数、类、组件、hooks、接口和业务声明使用 JSDoc,写清用途、参数含义、返回结果、主要步骤、前置条件、失败行为和副作用;复杂内部函数同样说明。参数类型已表达的语法无需重复,业务单位、空值、默认行为与约束必须解释。
28
+ - 领域代码说明字段和状态的业务意义、命令调用身份与权限/范围、reads 依赖、事件用途、事务与异步边界、幂等/重试及资源释放;只写实际声明和实现已有的保证。
29
+ - 页面说明 URL/查询参数、数据来源、临时状态、加载/空态/失败/无权限、提交后的刷新、会话与订阅清理;复杂分支、计算、顺序、并发和缓存规则在附近解释原因与过程。
30
+ - 测试说明场景、前置条件、动作、断言和所防止的回归;脚本说明输入、读写路径、执行顺序、外部副作用与退出条件。注释不含密钥、凭据或个人数据。
31
+ - 注释同时回答“做什么、为什么、如何完成、有哪些边界”,不能只有一句标题,也不能机械逐行翻译、凑字数或批量粘贴空泛模板。代码变更时同步更新注释,交付前逐文件核对。
32
+ - 生成契约的注释由生成器维护,不手改生成物;已执行/已发布迁移不能改写。仅补注释时不得顺便重构或改变逻辑、接口、配置值和运行文案。
33
+
34
+ ### 原生 AI 能力入口
35
+
36
+ 遇到以下需求,先读 `docs/ai/intelligence.md`,用 `pnpm exec cage capabilities "关键词" --format json` 核对当前安装版本的公开 API,再检查本项目 domain 导出和页面接入。关键词可直接使用下表需求名称;未命中时缩短关键词或查公开符号,不能据此断言能力不存在。
37
+
38
+ | 需求 | 框架入口与应用职责 |
39
+ | --- | --- |
40
+ | AI审批 / 智能审批 | 现有 `step` 使用 `kind: 'ai'`,支持 pass 通过、return 退回修改、manual 转人工;应用声明策略、结论命令、自动执行角色及接管人 |
41
+ | 业务助理 / 本体助理 | 导出 `ai({ models, assistant })`;框架提供执行循环、按领域声明生成的工具、会话、偏好记忆和 HTTP;应用配置授权及界面 |
42
+ | 页面上下文 / 随页助理 | `useAssistant(client.ai, page)` 配合 `useAiPageContext` / `AiPageContext`;应用上报页面、对象、选中项和草稿,服务端重读并校验业务事实 |
43
+ | 模型管理 / Responses | `managedModel` 接入 Admin 动态配置,支持 Chat Completions / Responses;应用配置部署加密密钥并显式授权管理者 |
44
+ | 性格 / 流式输出 | Admin 管理性格,SDK 提供选择、增量文字与执行进度;应用实现悬浮窗、Markdown 和确认卡片 |
45
+ | 上下文预算 | `ai({ context: ... })` 的配置形状见 `AiContextOptions`;框架按预算选择完整工具或发现模式,历史和本体按需读取 |
46
+
47
+ 前端只使用客户端、协议与契约;后端循环、通用工具和记忆使用框架实现。页面快照和性格不授予权限。分别核对**框架支持**(公开导出)、**项目已启用**(domain 导出、迁移、模型、权限、worker、SDK)和**实际验证通过**(真实角色与模型联调);空白模板的参考代码不表示已启用。具体接入顺序和验收步骤见该指南,不必将整份指南塞入每次任务上下文。
48
+
22
49
  ### 业务代码放在哪里
23
50
 
24
51
  | 位置 | 职责 |
@@ -28,7 +55,7 @@
28
55
  | `packages/domain/src/index.ts` | 统一导出全部业务及组织模型;没导出的声明不会注册 |
29
56
  | `packages/contracts/src/aggregates/<聚合>`、`queries` | 生成协议;根 index.ts 提供 @app/contracts 公共入口,只用 cage gen 更新 |
30
57
  | `apps/api/src` | API/worker 薄启动入口,普通业务不手写 HTTP 路由 |
31
- | `apps/web/src/app` | 会话、导航、布局、模块组合;main.tsx 只挂载和装配 Provider |
58
+ | `apps/web/src/app` | 会话、URL 路由、布局、模块组合;main.tsx 只挂载和装配 Provider |
32
59
  | `apps/web/src/modules/<业务>` | 页面、表单、专用 hooks/API/样式;从模块 index.ts 暴露页面 |
33
60
  | `apps/web/src/shared` | 跨模块复用且不绑定业务的 UI、hooks、纯辅助函数 |
34
61
  | `db/migrations` | 审查过的结构迁移,作用于已配置的数据库 |
@@ -40,11 +67,11 @@
40
67
  ### 实现一项需求的顺序
41
68
 
42
69
  1. 先运行 `pnpm exec cage context "需求关键词"`;按需 `graph search` 查候选、`graph inspect` 查完整节点、`graph path` 看关系路径。确认中文匹配入口后按源码位置阅读实现;候选和子图不是全部依赖,具体条件不能凭连线推断。完整用法见 `docs/ai/ontology-context.md`。从用户需求确定字段、状态/动作、角色/范围、约束与后续动作;能由业务声明表达的不改框架。
43
- 2. 已有业务含义变化时,修改前保存本体图基线:`pnpm exec cage analyze` 后将 `.cage/ontology.json` 另存为独立文件;或使用真实 Git 基线。
70
+ 2. 已有业务含义变化时,修改前用 `pnpm exec cage snapshot save before-change` 保存不可覆盖的命名基线;或使用真实 Git 提交/独立本体图文件。
44
71
  3. 先声明 aggregate/states/command/constraints/event,再写 handler、reaction/query/approval/connector,最后接业务页面。声明使用模块顶层 `export const`,从 domain 入口导出,跨文件导出名保持唯一。
45
- 4. 运行 `pnpm exec cage check` 和 `pnpm gen`,审查 contracts 和迁移草稿。按需运行 `pnpm exec cage impact --base-file 旧图.json`,补中文图谱名。
46
- 5. 页面使用生成方法并处理 code/domainCode;新增能力由管理员授权。数据库结构变化审查后显式 `pnpm migrate`,dev 不代办迁移。
47
- 6. 按改动运行必要验证,交付时说明体验步骤、授权配置、迁移,以及通过/跳过/未执行项。
72
+ 4. 运行 `pnpm exec cage check` 和 `pnpm gen`,审查 contracts 和迁移草稿。按需运行 `pnpm exec cage impact --snapshot before-change`,补中文图谱名。
73
+ 5. 页面使用生成方法并处理 code/domainCode;列表、详情等多页面注册到 React Router,Link/NavLink 导航,筛选/分页进入 URL。组件状态用于弹窗和表单等临时交互。新增能力由管理员授权。数据库结构变化审查后显式 `pnpm migrate`,dev 不代办迁移。
74
+ 6. 按 `commenting.md` 逐文件检查详细中文注释与实现一致,再按改动运行必要验证;交付时说明体验步骤、授权配置、迁移、注释覆盖,以及通过/跳过/未执行项。
48
75
 
49
76
  ### 必守边界
50
77
 
@@ -55,17 +82,25 @@
55
82
  - 自定义查询声明 reads,二选一使用 sql/build,只读 `safe.*`;值参数化。不得拼接 SQL、查询基表绕过范围或硬编码密钥。
56
83
  - scope 描述范围字段,角色数据决定实际范围;`scope.none()` 不代表所有人可访问。`can/useCan` 只控制按钮,后端负责授权。
57
84
  - 前端从 `@app/contracts` 导入生成 API/类型,按需使用 `@yss123/cage-client`;不导入 domain、内核或数据库包。
85
+ - 多页面业务必须有独立 URL,不用 useState/tab 模拟整页导航;详情从 URL 取 ID 并独立加载。前端路由集中在 app,页面从模块公开入口接入 Outlet。登录后保留原路径/query/hash,401 回登录,403 展示权限提示;/admin/ 使用普通链接进入独立系统管理。前端路由不替代后端授权。实现、SPA 部署回退和浏览器配方见 docs/ai/routing.md。
58
86
  - 跨聚合写入通过 reaction 调用命令。`tx: 'same'` 共同提交/回滚,默认 outbox 异步执行。资源 acquires/releases 是图规则标签,实际占用/释放仍由命令完成;离开持有状态要检查每条释放路径。
87
+ - 批量调用同一命令使用 reactionEach,声明 maxItems、唯一排序字段 orderBy、items 和 map;稳定键排序后串行执行。步骤依赖用 order,同事件同事务分组不得混用有序/无序或重复顺序。保持同事务回滚边界,见 docs/ai/primitives.md。
59
88
  - 审批通过 approval + route 配置,结论是 process 命令;选中审批人不等于已具备能力、范围和额度。第三方 IO 通过连接器,回调验签后调用 external 命令。
60
89
  - job 的读取与调用必须列入 reads/calls。业务导入/导出放在需要的业务页面调用通用任务接口,202 只代表任务已接受;worker 必须运行。
61
90
  - 已部署事件只做兼容扩展;新增字段设为 optional,不兼容含义用新事件。已执行/已发布迁移不能改写,结构更新新增迁移。
62
91
  - 不手改生成物,不关闭门禁掩盖错误,不因方便自动授予生产角色新能力。unsafe 必须写明 reason/owner,不能替代普通业务声明。
63
- - 代码注释说明职责、关键流程和设计原因;避免无业务价值的防御分支和静默兜底。维护脚本用 TypeScript,不新增 .mjs。
92
+ - 按前述详细中文注释规范完成文件、API、业务声明和关键流程说明;避免无业务价值的防御分支和静默兜底。维护脚本用 TypeScript,不新增 .mjs。
64
93
 
65
94
  ### 最小命令形状
66
95
 
67
96
  ```ts
68
97
  // 片段:Order 为已导出的聚合,OrderSubmitted 为事件,业务校验按需求添加。
98
+ /**
99
+ * 将草稿订单提交审批:只有 draft 可进入 pending_approval。
100
+ * 入口使用 Order.submit 能力,真实授权、范围、状态和版本由内核检查;声明本身不自动授予权限。
101
+ * handler 返回草稿供后续校验和持久化,OrderSubmitted 随命令事务登记,后续由已配置消费者处理。
102
+ * 失败不会提交这次业务变更;事件已登记也不代表后续审批已经完成。
103
+ */
69
104
  export const submitOrder = command(Order, {
70
105
  name: 'submit',
71
106
  from: 'draft',
@@ -79,17 +114,22 @@ export const submitOrder = command(Order, {
79
114
 
80
115
  ### 启动、验证与排错
81
116
 
82
- 在项目根目录执行:首次 `pnpm install`,复制并编辑 .env.example,仅提供已有库管理员连接后 `pnpm exec cage init`;再 `pnpm build:app`、`pnpm gen`,审查后 `pnpm migrate`,最后 `pnpm dev`。已有配置不能覆盖。
117
+ 在项目根目录执行:首次 `pnpm install`,复制并编辑 .env.example,仅提供已有库管理员连接后 `pnpm exec cage init`;再 `pnpm build:app`、`pnpm gen`,审查后 `pnpm migrate`;用 `pnpm exec cage bootstrap --credentials-file .cage/admin-credentials.json` 显式初始化组织,最后 `pnpm dev`。已有配置不能覆盖,凭据文件必须是新受限文件且父目录存在。
83
118
 
84
119
  init 只准备账号/schema/授权并填写三个连接,不创建数据库;APP/READ/MIGRATE 指向同一个库。已有集群账号复用原密码,日常启动不用管理员。普通项目不新增 Docker 生命周期命令。
85
120
 
121
+ API 日常启动不初始化组织、不输出管理员密码;生产缺少合格 Cookie 密钥会拒绝启动。bootstrap 不自动授予业务能力。`/healthz` 只表示存活,`/readyz` 检查必要依赖。首阶段 API 与 worker 同版本部署,查看实际注册指纹和消费者心跳。
122
+
86
123
  - `pnpm exec cage graph`:浏览器图谱,默认端口 15418,以终端为准。
87
124
  - `pnpm exec cage context command:对象.命令 --format json --out .cage/context.json`:按完整 key 取精简上下文;默认 Markdown,可用 --depth/--limit 调整范围。CLI 每次重新抽取;Web“复制 AI 上下文”使用当前页面快照,改代码后先刷新图谱。
88
- - `graph inspect/path` 有歧义时复制候选完整 key;path 默认沿箭头,--direction both 的逆向遍历不表示执行方向。报告中的测试/前端文件是候选,须核对;查询也会覆盖当前 .cage/ontology.json,旧基线务必另存。
125
+ - `graph inspect/path` 有歧义时复制候选完整 key;path 默认沿箭头,--direction both 的逆向遍历不表示执行方向。报告中的测试/前端文件是候选,须核对;context 与图谱查询不覆盖当前图或命名快照。
126
+ - `pnpm exec cage capabilities 关键词 --format json`:查当前安装版本公开签名;`cage doctor`:区分注册、生成、构建、迁移、授权与实际进程证据,unknown 不能当作通过。`cage timeline/explain` 关联实际异步证据与解释授权,参数和权限见 docs/ai/diagnostics.md。
127
+ - 生成方法支持 signal/timeoutMs/idempotencyKey 请求选项。底层 CageResult 与 mutation 行为有区别:useCageCommand 失败抛 CageCommandError,成功才返回业务数据。订阅 client.subscribe 在退出、401、切换账号时取消查询并清除应用缓存。
89
128
  - `pnpm exec cage gen --check`:生成一致性;`pnpm exec cage sync --check`:本托管区一致性。
90
129
  - `pnpm exec cage test --only project`:业务测试;`pnpm verify`:类型、依赖、lint、图规则、生成、托管区、预算和测试。
91
130
  - `pnpm exec cage verify --skip-tests` 表示不完整门禁;派生测试跳过不能当作通过。测试连接只用独立测试集群。
92
131
  - 重要业务改动验证成功路径及有风险的反例;文档或可逆的小改动不反复跑全量数据库测试。
132
+ - 修改页面/导航后实际验收深链接、刷新、前进后退、登录回跳、无权限和 404;生产再查 SPA 回退。check/verify 不自动完成浏览器验收,未执行要明确报告。见 docs/ai/routing.md。
93
133
  - CLI 报错先看 code/at/reason/fix,再查错误码册;HTTP 错误查 runtime.md。异步失败先看 worker、同步记录和死信,修复后重放,不能直接 SQL 改状态。
94
134
 
95
135
  框架托管区由 cage sync 更新;项目独有的业务规则写在标记之外,避免升级覆盖。
@@ -21,6 +21,7 @@ pnpm exec cage init
21
21
  pnpm gen
22
22
  # 审查 db/migrations 后执行表结构迁移。
23
23
  pnpm migrate
24
+ pnpm exec cage bootstrap --credentials-file .cage/admin-credentials.json
24
25
  pnpm dev
25
26
  ```
26
27
 
@@ -48,11 +49,13 @@ pnpm dev
48
49
 
49
50
  测试环境会初始化集群级角色,因此 `CAGE_TEST_DATABASE_URL` 必须指向独立测试集群。运行 `pnpm cage verify` 验证示例;框架仓库根目录的 `pnpm test:docker` 验证全部框架测试。
50
51
 
51
- 浏览器打开终端打印的 Web 地址;配置示例使用 <http://localhost:15173>。初始管理员凭证在 API 终端显示一次。
52
+ 浏览器打开终端打印的 Web 地址;配置示例使用 <http://localhost:15173>。管理员凭证由显式 bootstrap 交付到新的受限文件,交付后移除。初始化仅授予系统管理能力,采购能力需要管理员明确配置。
52
53
  `CAGE_WEB_PORT` 控制 Web 端口,`PORT` 控制 API 端口,Vite 代理同步使用它。缺少数据库配置时会给出错误,需填写 `.env` 后重新启动。
53
54
 
54
55
  ## 体验完整采购流程
55
56
 
57
+ 前端使用 React Router:工作台 `/workspace`,采购列表 `/procurement/orders`,单据详情 `/procurement/orders/:id`,审批 `/approvals`,库存 `/inventory`,登录 `/login`。单号和审批待办可直接打开详情;刷新、前进后退和登录回跳保留页面地址。新增页面与部署按[路由和浏览器验收指南](docs/ai/routing.md)执行;Nginx 示例见 [deploy/nginx.conf](deploy/nginx.conf)。
58
+
56
59
  1. 管理员在“库存台账”登记 `A-01` 等物料。
57
60
  2. 进入 `/admin/` 创建采购员、经理,分别分配采购命令和审批能力;经理的 `PurchaseOrder.approve` 参数配置 `ceiling`。
58
61
  3. 把经理设为采购员所在部门的负责人。提单人与审批人必须不同。