@yss123/cage-cli 0.3.2 → 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 (134) hide show
  1. package/README.md +1 -1
  2. package/dist/analyze.js +3 -0
  3. package/dist/analyze.js.map +1 -1
  4. package/dist/capabilities.js +10 -0
  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/ontology-names.d.ts +17 -0
  23. package/dist/ontology-names.js +42 -0
  24. package/dist/ontology-names.js.map +1 -0
  25. package/dist/sync.d.ts +5 -1
  26. package/dist/sync.js +16 -9
  27. package/dist/sync.js.map +1 -1
  28. package/graph-ui/app.js +3 -2
  29. package/graph-ui/business.js +11 -3
  30. package/graph-ui/graph-business.js +16 -16
  31. package/graph-ui/graph-relations.js +3 -5
  32. package/package.json +6 -6
  33. package/templates/app/.agents/skills/cage-development/SKILL.md +1 -1
  34. package/templates/app/AGENTS.md +12 -9
  35. package/templates/app/README.md +2 -2
  36. package/templates/app/apps/api/package.json +2 -2
  37. package/templates/app/apps/web/package.json +3 -1
  38. package/templates/app/apps/web/src/app/styles/global.css +12 -11
  39. package/templates/app/apps/web/src/main.tsx +18 -7
  40. package/templates/app/apps/web/src/shared/lib/error-message.ts +1 -1
  41. package/templates/app/apps/web/src/shared/ui/approval-member-picker.tsx +1 -1
  42. package/templates/app/cage.config.json +2 -1
  43. package/templates/app/docs/README.md +6 -4
  44. package/templates/app/docs/development/README.md +21 -5
  45. package/templates/app/docs/development/examples/note/note.ts +8 -4
  46. package/templates/app/docs/development/examples/purchase-example.md +5 -5
  47. package/templates/app/docs/development/getting-started/architecture.md +5 -5
  48. package/templates/app/docs/development/getting-started/workflow.md +17 -23
  49. package/templates/app/docs/development/guides/approvals.md +4 -4
  50. package/templates/app/docs/development/guides/business-collaboration.md +3 -1
  51. package/templates/app/docs/development/guides/frontend-ui.md +30 -0
  52. package/templates/app/docs/development/guides/intelligence.md +14 -12
  53. package/templates/app/docs/development/guides/ontology-modeling.md +83 -0
  54. package/templates/app/docs/development/guides/recipes.md +28 -14
  55. package/templates/app/docs/development/guides/relations.md +31 -8
  56. package/templates/app/docs/development/reference/commenting.md +7 -4
  57. package/templates/app/docs/development/reference/primitives.md +5 -3
  58. package/templates/app/docs/development/skills/cage-development/SKILL.md +30 -20
  59. package/templates/app/docs/development/tools/diagnostics.md +4 -1
  60. package/templates/app/docs/development/tools/ontology-context.md +1 -1
  61. package/templates/app/docs/development/tools/troubleshooting.md +3 -3
  62. package/templates/app/docs/errors/CAGE-APPR-007.md +1 -1
  63. package/templates/app/docs/errors/CAGE-GRANT-001.md +18 -12
  64. package/templates/app/docs/errors/CAGE-GRANT-002.md +2 -2
  65. package/templates/app/docs/errors/CAGE-GRANT-003.md +3 -3
  66. package/templates/app/docs/errors/CAGE-ONTOLOGY-001.md +52 -0
  67. package/templates/app/docs/errors/CAGE-STATE-003.md +1 -1
  68. package/templates/app/docs/errors/CAGE-SYNC-001.md +2 -2
  69. package/templates/app/docs/errors/README.md +7 -1
  70. package/templates/app/docs/errors/runtime.md +1 -1
  71. package/templates/app/package.json +3 -3
  72. package/templates/app/packages/contracts/package.json +1 -1
  73. package/templates/app/packages/contracts/src/aggregates/role/index.ts +2 -2
  74. package/templates/app/packages/contracts/src/aggregates/user/index.ts +3 -3
  75. package/templates/app/packages/domain/package.json +5 -5
  76. package/templates/app/packages/domain/src/modules/purchase/approval-members.ts +1 -1
  77. package/templates/app/packages/domain/src/modules/purchase/approvals.ts +2 -2
  78. package/templates/app/packages/domain/src/modules/purchase/intelligence.test.ts +4 -4
  79. package/templates/app/packages/domain/src/modules/purchase/purchase-order.test.ts +10 -17
  80. package/templates/app/packages/domain/src/modules/purchase/purchase-order.ts +4 -5
  81. package/templates/app/packages/domain/src/workflows/purchase-process.ts +1 -1
  82. package/templates/blank/.agents/skills/cage-development/SKILL.md +1 -1
  83. package/templates/blank/AGENTS.md +12 -9
  84. package/templates/blank/apps/api/package.json +1 -1
  85. package/templates/blank/apps/web/package.json +3 -1
  86. package/templates/blank/apps/web/src/app/styles/global.css +6 -5
  87. package/templates/blank/apps/web/src/main.tsx +18 -7
  88. package/templates/blank/cage.config.json +1 -0
  89. package/templates/blank/docs/README.md +6 -4
  90. package/templates/blank/docs/development/README.md +21 -5
  91. package/templates/blank/docs/development/examples/note/note.ts +8 -4
  92. package/templates/blank/docs/development/examples/purchase-example.md +5 -5
  93. package/templates/blank/docs/development/getting-started/architecture.md +5 -5
  94. package/templates/blank/docs/development/getting-started/workflow.md +17 -23
  95. package/templates/blank/docs/development/guides/approvals.md +4 -4
  96. package/templates/blank/docs/development/guides/business-collaboration.md +3 -1
  97. package/templates/blank/docs/development/guides/frontend-ui.md +30 -0
  98. package/templates/blank/docs/development/guides/intelligence.md +14 -12
  99. package/templates/blank/docs/development/guides/ontology-modeling.md +83 -0
  100. package/templates/blank/docs/development/guides/recipes.md +28 -14
  101. package/templates/blank/docs/development/guides/relations.md +31 -8
  102. package/templates/blank/docs/development/reference/commenting.md +7 -4
  103. package/templates/blank/docs/development/reference/primitives.md +5 -3
  104. package/templates/blank/docs/development/skills/cage-development/SKILL.md +30 -20
  105. package/templates/blank/docs/development/tools/diagnostics.md +4 -1
  106. package/templates/blank/docs/development/tools/ontology-context.md +1 -1
  107. package/templates/blank/docs/development/tools/troubleshooting.md +3 -3
  108. package/templates/blank/docs/errors/CAGE-APPR-007.md +1 -1
  109. package/templates/blank/docs/errors/CAGE-GRANT-001.md +18 -12
  110. package/templates/blank/docs/errors/CAGE-GRANT-002.md +2 -2
  111. package/templates/blank/docs/errors/CAGE-GRANT-003.md +3 -3
  112. package/templates/blank/docs/errors/CAGE-ONTOLOGY-001.md +52 -0
  113. package/templates/blank/docs/errors/CAGE-STATE-003.md +1 -1
  114. package/templates/blank/docs/errors/CAGE-SYNC-001.md +2 -2
  115. package/templates/blank/docs/errors/README.md +7 -1
  116. package/templates/blank/docs/errors/runtime.md +1 -1
  117. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/styles/global.css +12 -11
  118. package/templates/blank/docs/examples/purchase-admin/apps/web/src/main.tsx +18 -7
  119. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/error-message.ts +1 -1
  120. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/approval-member-picker.tsx +1 -1
  121. package/templates/blank/docs/examples/purchase-admin/cage.config.json +2 -1
  122. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/role/index.ts +2 -2
  123. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/user/index.ts +3 -3
  124. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approval-members.ts +1 -1
  125. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approvals.ts +2 -2
  126. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/intelligence.test.ts +4 -4
  127. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts +10 -17
  128. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.ts +4 -5
  129. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-process.ts +1 -1
  130. package/templates/blank/package.json +3 -3
  131. package/templates/blank/packages/contracts/package.json +1 -1
  132. package/templates/blank/packages/contracts/src/aggregates/role/index.ts +2 -2
  133. package/templates/blank/packages/contracts/src/aggregates/user/index.ts +3 -3
  134. package/templates/blank/packages/domain/package.json +5 -5
@@ -0,0 +1,52 @@
1
+ # CAGE-ONTOLOGY-001:本体节点缺少结构化业务名称
2
+
3
+ [返回错误码册](README.md) · [业务排错](../development/tools/troubleshooting.md)
4
+
5
+ > 本页由框架生成。正反例为局部声明或操作说明,完整写法见业务开发指南及本项目 domain。
6
+
7
+ ## 何时出现
8
+
9
+ 阶段:check / gen / verify / 图谱与上下文诊断。
10
+
11
+ 当前项目可定位的聚合、字段、状态、命令、事件、查询或任务没有非空业务名称,图谱只能回退机器标识。默认警告,graph.naming 为 required 时作为门禁错误。
12
+
13
+ ## 修复步骤
14
+
15
+ 1. 按 reason 的完整节点 key 定位声明。字段和状态的位置指向所属聚合,继续在其中查找成员;无本地源码位置的依赖节点不在本检查范围。
16
+ 2. 对象、命令、查询和任务填写 description;事件在第三个参数填写 description;字段用 .describe(...) 或关系选项 description;每个状态都在 states 的 labels 中命名。旧声明可用 graph.labels 的完整 key 覆盖显示。
17
+ 3. 普通注释与前端 statusLabel 不会自动进入本体。名称用用户的业务用语,不为翻译改表名、状态值或能力点;详见 docs/development/guides/ontology-modeling.md。
18
+ 4. 补齐后重跑 check 并查看 graph/context;完整性不验证语言、名称质量或任意业务关系,仍按已明确规则验证外键方向、基数、状态迁移及真实触发链。
19
+
20
+ ## 正例
21
+
22
+ ```text
23
+ states('active', 'archived', { terminal: ['archived'], labels: { active: '使用中', archived: '已归档' } })
24
+ ```
25
+
26
+ ## 反例
27
+
28
+ ```text
29
+ states('active', 'archived', { terminal: ['archived'] }) // 只在页面或注释中翻译状态,没有结构化名称
30
+ ```
31
+
32
+ ## 修复后验证
33
+
34
+ 重跑 cage check,再在 graph/context 中按业务用语核对名称;对象关系与运行行为仍需独立业务用例验证。
35
+
36
+ ## 框架内的检查位置
37
+
38
+ 以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
39
+
40
+ - `packages/cli/src/ontology-names.ts:27`
41
+ - `packages/cli/src/ontology-names.ts:42`
42
+ - `packages/cli/src/sync.ts:42`
43
+
44
+ 实现片段(位置随框架版本更新):
45
+
46
+ ```ts
47
+ * @param presentation 与图谱同一次抽取产生的名称,配置短标题优先于声明文案。
48
+ * @returns 每个缺名节点一条 CAGE-ONTOLOGY-001;不推断语言、不从注释或前端反推业务名称。
49
+ */
50
+ export function checkOntologyNames(cfg: CageConfig, graph: Ontology, presentation: GraphPresentation): Finding[] {
51
+ const aggregates = new Map(graph.nodes.filter(node => node.kind === 'aggregate').map(node => [node.id, node]));
52
+ ```
@@ -12,7 +12,7 @@
12
12
 
13
13
  ## 修复步骤
14
14
 
15
- 1. 状态标识使用 pending_approval 等,中文名称通过页面/graph.labels 显示。
15
+ 1. 状态标识使用 pending_approval 等,业务名称在 states 的 labels 中填写,graph.labels 可覆盖显示;页面文案和普通注释不会自动进入本体。
16
16
 
17
17
  ## 正例
18
18
 
@@ -34,9 +34,9 @@ sync --check 发现框架规则需更新,或 begin/end 标记缺失一边、
34
34
 
35
35
  以下路径相对框架源码仓库,不是要求业务项目创建这些文件。当前项目先修业务声明、配置或授权;明确属于框架缺口时反馈错误码和脱敏上下文。
36
36
 
37
- - `packages/cli/src/sync.ts:66`
38
37
  - `packages/cli/src/sync.ts:73`
39
- - `packages/cli/src/sync.ts:84`
38
+ - `packages/cli/src/sync.ts:80`
39
+ - `packages/cli/src/sync.ts:91`
40
40
 
41
41
  实现片段(位置随框架版本更新):
42
42
 
@@ -8,6 +8,12 @@
8
8
 
9
9
  每页包含触发阶段、具体原因、修复步骤、正反例、验证方法与当前版实现位置。例子为局部说明,不能替代完整业务输入。
10
10
 
11
+ ## 本体业务名称
12
+
13
+ | 诊断码 | 含义 |
14
+ | --- | --- |
15
+ | [CAGE-ONTOLOGY-001](CAGE-ONTOLOGY-001.md) | 本体节点缺少结构化业务名称 |
16
+
11
17
  ## 智能运行时
12
18
 
13
19
  | 诊断码 | 含义 |
@@ -181,7 +187,7 @@
181
187
 
182
188
  | 诊断码 | 含义 |
183
189
  | --- | --- |
184
- | [CAGE-GRANT-001](CAGE-GRANT-001.md) | 授予超出自己的能力或额度 |
190
+ | [CAGE-GRANT-001](CAGE-GRANT-001.md) | 授予超出自己的能力或参数 |
185
191
  | [CAGE-GRANT-002](CAGE-GRANT-002.md) | 授予超出自己的数据范围 |
186
192
  | [CAGE-GRANT-003](CAGE-GRANT-003.md) | 能力不在代码目录中 |
187
193
 
@@ -13,7 +13,7 @@
13
13
  | NOT_FOUND | 404 | 记录不存在或超出范围 | 用当前用户检查 id/租户/范围,不泄漏范围外数据 |
14
14
  | INVALID_INPUT | 400 | Zod/协议输入错误、外键或检查约束等 | 按输入 schema 修正字段和格式,不直接扩大 schema |
15
15
  | INVALID_TRANSITION | 409 | 当前状态不允许该命令 | 刷新记录,按真实生命周期显示允许操作 |
16
- | CONSTRAINT_VIOLATED | 403 | 职责分离、额度、二次认证、防提权等拒绝 | 看约束原因,调整业务操作或由有权管理员配置;不删除约束 |
16
+ | CONSTRAINT_VIOLATED | 403 | 职责分离、二次认证、防提权等拒绝 | 看约束原因,调整业务操作或由有权管理员配置;不删除约束 |
17
17
  | INVARIANT_VIOLATED | 409 | 命令结果不满足聚合不变量 | 修正输入或 handler,保持合法结果 |
18
18
  | CONFLICT | 409 | 版本、唯一性、数据库串行化/死锁等冲突 | 看 detail、重新读取再决定是否重试;不要盲目重复创建 |
19
19
  | DOMAIN_ERROR | 422 | handler 返回 fail | 读取 domainCode,展示业务文案和必要 detail |
@@ -11,9 +11,9 @@
11
11
  "build:app": "pnpm --filter @app/domain build && pnpm --filter @app/api build && pnpm --filter @app/web build"
12
12
  },
13
13
  "devDependencies": {
14
- "@yss123/cage-cli": "0.3.2",
15
- "@yss123/cage-testkit": "0.3.2",
16
- "@yss123/cage-lint": "0.3.2",
14
+ "@yss123/cage-cli": "0.4.0",
15
+ "@yss123/cage-testkit": "0.4.0",
16
+ "@yss123/cage-lint": "0.4.0",
17
17
  "@types/node": "^24.3.0",
18
18
  "typescript": "~5.9.3",
19
19
  "vitest": "^4.1.12",
@@ -10,7 +10,7 @@
10
10
  "typecheck": "tsc -p tsconfig.json --noEmit"
11
11
  },
12
12
  "dependencies": {
13
- "@yss123/cage-client": "0.3.2",
13
+ "@yss123/cage-client": "0.4.0",
14
14
  "zod": "^4.1.5"
15
15
  }
16
16
  }
@@ -31,7 +31,7 @@ export const RoleInputs = {
31
31
  };
32
32
 
33
33
  /** Role.archive 可能返回的错误码 */
34
- export type RoleArchiveError = 'CONFLICT' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
34
+ export type RoleArchiveError = 'CONFLICT' | 'CONSTRAINT_VIOLATED' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
35
35
  /** Role.create 可能返回的错误码 */
36
36
  export type RoleCreateError = 'CONFLICT' | 'CONSTRAINT_VIOLATED' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT';
37
37
  /** Role.grantCapability 可能返回的错误码 */
@@ -39,7 +39,7 @@ export type RoleGrantCapabilityError = 'CONFLICT' | 'CONSTRAINT_VIOLATED' | 'DOM
39
39
  /** Role.rename 可能返回的错误码 */
40
40
  export type RoleRenameError = 'CONFLICT' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
41
41
  /** Role.revokeCapability 可能返回的错误码 */
42
- export type RoleRevokeCapabilityError = 'CONFLICT' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
42
+ export type RoleRevokeCapabilityError = 'CONFLICT' | 'CONSTRAINT_VIOLATED' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
43
43
  /** Role.setScope 可能返回的错误码 */
44
44
  export type RoleSetScopeError = 'CONFLICT' | 'CONSTRAINT_VIOLATED' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
45
45
 
@@ -38,11 +38,11 @@ export type UserAssignRolesError = 'CONFLICT' | 'CONSTRAINT_VIOLATED' | 'DOMAIN_
38
38
  /** User.create 可能返回的错误码 */
39
39
  export type UserCreateError = 'CONFLICT' | 'CONSTRAINT_VIOLATED' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT';
40
40
  /** User.disable 可能返回的错误码 */
41
- export type UserDisableError = 'CONFLICT' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
41
+ export type UserDisableError = 'CONFLICT' | 'CONSTRAINT_VIOLATED' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
42
42
  /** User.enable 可能返回的错误码 */
43
- export type UserEnableError = 'CONFLICT' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
43
+ export type UserEnableError = 'CONFLICT' | 'CONSTRAINT_VIOLATED' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
44
44
  /** User.setPassword 可能返回的错误码 */
45
- export type UserSetPasswordError = 'CONFLICT' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
45
+ export type UserSetPasswordError = 'CONFLICT' | 'CONSTRAINT_VIOLATED' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
46
46
  /** User.update 可能返回的错误码 */
47
47
  export type UserUpdateError = 'CONFLICT' | 'DOMAIN_ERROR' | 'FORBIDDEN' | 'INVALID_INPUT' | 'INVALID_TRANSITION' | 'NOT_FOUND';
48
48
 
@@ -14,11 +14,11 @@
14
14
  "typecheck": "tsc -p tsconfig.json --noEmit"
15
15
  },
16
16
  "dependencies": {
17
- "@yss123/cage-kernel": "0.3.2",
18
- "@yss123/cage-admin": "0.3.2",
19
- "@yss123/cage-approval": "0.3.2",
20
- "@yss123/cage-connectors": "0.3.2",
21
- "@yss123/cage-ai": "0.3.2",
17
+ "@yss123/cage-kernel": "0.4.0",
18
+ "@yss123/cage-admin": "0.4.0",
19
+ "@yss123/cage-approval": "0.4.0",
20
+ "@yss123/cage-connectors": "0.4.0",
21
+ "@yss123/cage-ai": "0.4.0",
22
22
  "zod": "^4.1.5"
23
23
  }
24
24
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * 采购协作名录:由业务管理员登记可参与采购复核的账号、公开业务姓名和专业领域,供草稿选人及任务操作使用。
3
3
  * 聚合通过标准命令维护,浏览器读取 safe.approval_member;名录与 sys.user 的私密资料、角色授权分离。
4
- * 名录在同租户内向具 ApprovalMember.read 且显式获 all 范围的采购参与者公开;加入名录不授予审批权限、范围或额度。
4
+ * 名录在同租户内向具 ApprovalMember.read 且显式获 all 范围的采购参与者公开;加入名录不授予审批权限或范围。
5
5
  */
6
6
  import { aggregate, command, ref, scope, states, text } from '@yss123/cage-kernel';
7
7
  import { z } from 'zod';
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * 采购实际审批路由:AI 预审、部门审核、可选专业会签和大额财务候选受理,共用一个采购流程实例。
3
3
  * 人工节点显式开放转办、委派和前后/并行加签;步骤/政策随提交保存,旧实例保持自己的快照。
4
- * 路由只决定任务分配与签序,最终结论仍执行领域命令的职责分离、额度与库存约束。
4
+ * 路由只决定任务分配与签序,最终结论仍执行领域命令的职责分离与库存约束。
5
5
  */
6
6
  import { approval } from '@yss123/cage-kernel';
7
7
  import { approver, eq, gt, route, step, when } from '@yss123/cage-approval';
@@ -28,7 +28,7 @@ export const poApproval = approval(PurchaseOrder, {
28
28
  * needsSpecialistReview=true 才增加专业会签,名单来自提交快照且全部人必须通过;金额严格大于 50000 元才增加财务节点。
29
29
  * AI 只读取 reason/amount/items,pass 仅推进到经理,return 回到草稿,manual 在当前节点交部门负责人。
30
30
  * 模型失败同样转人工,最多四轮/五次工具调用/120 秒;不以失败兜底为自动批准。
31
- * 财务共享一项未分配任务,finance 当前成员须先领取;所有人工动作仍需真实命令能力、范围、额度和职责分离。
31
+ * 财务共享一项未分配任务,finance 当前成员须先领取;所有人工动作仍需真实命令能力、范围和职责分离。
32
32
  * AI 人工接管保持原节点规则;经理、专业和财务才开放三项管理动作,新实例自动保存允许的加签位置。
33
33
  */
34
34
  export const poRoute = route('po-approval', [
@@ -25,7 +25,7 @@ beforeAll(async () => {
25
25
  env = await createTestEnv({ domain: { ...purchase, intelligence }, migrations: readMigrations(fileURLToPath(new URL('../../../../../db/migrations/', import.meta.url))) });
26
26
  buyer = await env.user({ caps: ['PurchaseOrder.read', 'PurchaseOrder.create', 'PurchaseOrder.explainPurpose', 'PurchaseOrder.submit', 'PurchaseOrder.setReviewers', 'ApprovalMember.read'],
27
27
  scopes: { ApprovalMember: 'all' } });
28
- reviewer = await env.user({ caps: ['PurchaseOrder.read', 'PurchaseOrder.approve', 'PurchaseOrder.returnForChanges'], scopes: { PurchaseOrder: 'dept' }, params: { 'PurchaseOrder.approve': { ceiling: 50000 } } });
28
+ reviewer = await env.user({ caps: ['PurchaseOrder.read', 'PurchaseOrder.approve', 'PurchaseOrder.returnForChanges'], scopes: { PurchaseOrder: 'dept' } });
29
29
  await env.kernel.execute('Dept.update', { id: env.rootDeptId, leaderId: reviewer.id }, env.system());
30
30
  await env.kernel.execute('Inventory.create', { sku: 'AI-01', available: 100 }, env.system());
31
31
  const role = await env.kernel.execute('Role.create', { code: 'purchase_ai_reviewer', name: '材料预审角色' }, env.system());
@@ -39,12 +39,12 @@ beforeAll(async () => {
39
39
  afterAll(() => env?.close());
40
40
 
41
41
  /**
42
- * 通过组织和业务命令登记同部门协作人;10 万元额度只供本隔离库验证大额流程,名录本身不授予能力。
42
+ * 通过组织和业务命令登记同部门协作人;名录本身不授予能力。
43
43
  * 专业和财务共享这些真实审批能力,财务候选身份由额外的 finance 角色单独赋予。
44
44
  */
45
45
  async function collaborator(specialty: string) {
46
46
  const user = await env.user({ caps: ['PurchaseOrder.read', 'PurchaseOrder.approve', 'PurchaseOrder.reject', 'PurchaseOrder.returnForChanges'],
47
- scopes: { PurchaseOrder: 'dept' }, params: { 'PurchaseOrder.approve': { ceiling: 100000 } } });
47
+ scopes: { PurchaseOrder: 'dept' } });
48
48
  await env.kernel.execute('ApprovalMember.create', { userId: user.id, displayName: specialty, specialty }, env.system());
49
49
  return user;
50
50
  }
@@ -145,7 +145,7 @@ it('经理后开启所选专业人员 all 会签,全部通过才批准并锁
145
145
  expect((await env.query('select status from core.inventory_lock where id=$1', [order.id]))[0].status).toBe('held');
146
146
  });
147
147
 
148
- /** gt 阈值必须保持严格大于;恰好 5 万元时经理的同额 ceiling 足够,不创建财务候选任务。 */
148
+ /** gt 阈值必须保持严格大于;恰好 5 万元时不创建财务候选任务。 */
149
149
  it('恰好 50000 元经理通过后直接批准,不产生财务候选待办', async () => {
150
150
  decision = 'pass'; const order = await submit({ amount: '50000.00' });
151
151
  await approveBy(reviewer, order.id);
@@ -12,7 +12,7 @@ let buyer: TestUser;
12
12
  let manager: TestUser;
13
13
  /**
14
14
  * 夹具通过真实命令建立部门负责人和库存,不绕过领域规则直接造业务行。
15
- * 申请人和经理能力分开,经理额度限定为 50000,确保后续断言真的经过职责分离与额度分支。
15
+ * 申请人和经理能力分开,以验证职责分离、业务批准和库存联动。
16
16
  */
17
17
  beforeAll(async () => {
18
18
  env = await createTestEnv({
@@ -24,19 +24,18 @@ beforeAll(async () => {
24
24
  });
25
25
  manager = await env.user({
26
26
  caps: ['PurchaseOrder.approve'],
27
- params: { 'PurchaseOrder.approve': { ceiling: 50000 } },
28
27
  });
29
28
  await env.kernel.execute('Dept.update', { id: env.rootDeptId, leaderId: manager.id }, env.system());
30
29
  await env.kernel.execute('Inventory.create', { sku: 'A-01', available: 100 }, env.system());
31
30
  });
32
31
  afterAll(() => env?.close());
33
32
 
34
- /** 创建并提交一张 1200 元、两件 A-01 的采购单;只推进领域状态,不在此助手中消费 outbox。 */
35
- async function submitted() {
33
+ /** 创建并提交两件 A-01 的采购单;金额默认 1200 元,不在此助手中消费 outbox。 */
34
+ async function submitted(amount = '1200.00') {
36
35
  const ctx = await buyer.ctx();
37
36
  const order = await env.kernel.execute(
38
37
  'PurchaseOrder.create',
39
- { amount: '1200.00', items: [{ sku: 'A-01', qty: 2 }] },
38
+ { amount, items: [{ sku: 'A-01', qty: 2 }] },
40
39
  ctx,
41
40
  );
42
41
  return env.kernel.execute('PurchaseOrder.submit', { id: order.id }, ctx);
@@ -126,21 +125,15 @@ it.each(['cancelled', 'received'] as const)(
126
125
  },
127
126
  );
128
127
 
129
- /** 低额度反例检查硬约束阻止批准,且同事务反应没有留下半成功的占用记录。 */
130
- it('审批额度不够时保留待审批状态,不创建库存锁', async () => {
131
- const order = await submitted();
132
- const lowLimit = await env.user({
133
- caps: ['PurchaseOrder.approve'],
134
- params: { 'PurchaseOrder.approve': { ceiling: 500 } },
135
- });
128
+ /** 领域命令不按角色金额限制批准;更大金额的额外步骤由采购流程声明负责。 */
129
+ it('有批准能力的经理不需要额度参数即可执行大额采购结论', async () => {
130
+ const order = await submitted('60000.00');
136
131
  const process = env.kernel.processCtx({
137
132
  process: 'po-approval',
138
133
  tenantId: env.tenantId,
139
- onBehalfOf: lowLimit.id,
134
+ onBehalfOf: manager.id,
140
135
  capabilities: ['PurchaseOrder.approve'],
141
136
  });
142
- expect((await env.callAs(process, 'PurchaseOrder.approve', { id: order.id })).code).toBe(
143
- 'CONSTRAINT_VIOLATED',
144
- );
145
- expect(await env.query('select id from core.inventory_lock where id = $1', [order.id])).toHaveLength(0);
137
+ await env.kernel.execute('PurchaseOrder.approve', { id: order.id }, process);
138
+ expect((await env.query('select status from core.inventory_lock where id = $1', [order.id]))[0].status).toBe('held');
146
139
  });
@@ -1,12 +1,11 @@
1
1
  /**
2
2
  * 采购单声明集中列出申请材料、专业复核名单、状态、范围、命令和事件,由 API、worker 和生成器统一消费。
3
3
  * 草稿可编辑专业复核名单,提交重新核对协作名录;handler 仅读取声明依赖,数据库写入、版本与审计由内核完成。
4
- * 审批结论仍以 process 命令执行职责分离、额度和库存检查;选入名录或路由不授予权限。
4
+ * 审批结论仍以 process 命令执行职责分离和库存检查;选入名录或路由不授予权限。
5
5
  */
6
6
  import {
7
7
  aggregate,
8
8
  bool,
9
- ceiling,
10
9
  command,
11
10
  emit,
12
11
  event,
@@ -127,7 +126,7 @@ export const create = command(PurchaseOrder, {
127
126
  /**
128
127
  * 在 draft 中调整本单专业复核需求和名单;需要 PurchaseOrder.setReviewers,不能直接修改待审批快照。
129
128
  * 输入保存前核对 1–5 位不同且非提单人的 active 名录成员;关闭时用 false/[],失败整次回滚。
130
- * 提交还会重新查询名录,以拒绝保存后退役的成员;名录不授予对单据的读取、批准能力或额度。
129
+ * 提交还会重新查询名录,以拒绝保存后退役的成员;名录不授予对单据的读取或批准能力。
131
130
  */
132
131
  export const setReviewers = command(PurchaseOrder, {
133
132
  name: 'setReviewers', description: '设置采购单专业复核需求和人员', from: 'draft', to: null,
@@ -179,7 +178,7 @@ export const submit = command(PurchaseOrder, {
179
178
  });
180
179
 
181
180
  /**
182
- * 审批终结命令必须同时满足创建人与审批人分离、当前角色额度,以及声明的库存只读检查。
181
+ * 审批终结命令必须同时满足创建人与审批人分离,以及声明的库存只读检查。
183
182
  * stock 是 reads 绑定的受范围约束仓储;找不到 SKU 或登记数量不足时返回 STOCK_SHORT 并回滚。
184
183
  * 该检查不扣减 available;真正占用由 OrderApproved 的同事务反应创建 InventoryLock。
185
184
  * 范例展示资源配对,不实现多订单累计扣减、仓库出入库或价格核算。
@@ -188,7 +187,7 @@ export const approve = command(PurchaseOrder, {
188
187
  from: 'pending_approval',
189
188
  to: 'approved',
190
189
  invokedBy: 'process',
191
- constraints: [sod.notSameAs('createdBy'), ceiling('amount')],
190
+ constraints: [sod.notSameAs('createdBy')],
192
191
  reads: { stock: Inventory },
193
192
  emits: [OrderApproved],
194
193
  handler: async (o, _input, { stock }) => {
@@ -18,7 +18,7 @@ export const purchaseLifecycle = businessProcess('purchase-lifecycle', {
18
18
  approval: { title: '采购审批', description: 'AI 先核查材料;通过后部门经理审批,金额超过五万元时增加财务审批。疑难材料由本步骤转人工。', actor: 'AI、部门经理、财务', kind: 'decision', action: poApproval },
19
19
  returned: { title: '退回修改', description: '材料不足退回草稿,保留本轮审核理由。', actor: '审批流程', action: returnForChanges },
20
20
  revise: { title: '补充采购用途', description: '依据建议补充用途,再次提交后从 AI 预审开始。', actor: '申请人', action: explainPurpose },
21
- approved: { title: '批准并锁定库存', description: '审批结论通过权限、额度和库存校验后,同事务锁定所需库存。', actor: '审批流程与系统', action: approve,
21
+ approved: { title: '批准并锁定库存', description: '审批结论通过权限和库存校验后,同事务锁定所需库存。', actor: '审批流程与系统', action: approve,
22
22
  related: [{ object: InventoryLock, label: '同事务锁库存', via: acquireLock }] },
23
23
  received: { title: '确认收货', description: '接收外部收货通知并更新采购单,异步释放库存锁。', actor: '外部系统与系统', kind: 'end', action: markReceived,
24
24
  related: [{ object: InventoryLock, label: '收货后释放占用', via: releaseLock }] },
@@ -6,5 +6,5 @@ description: 使用 Cage 框架开发、修改和排查业务应用。适用于
6
6
  <!-- 由 scripts/sync-agent-skill.ts 生成;教学正文只在 docs/development 维护。 -->
7
7
 
8
8
  加载本技能后,先阅读[完整框架开发方法](../../../docs/development/skills/cage-development/SKILL.md),再根据其中的任务选择表读取相关专题。
9
- 正文包含 Cage 运行模型、与用户澄清业务并选择方案的方法、真实接入、排错与验收;不要只凭本入口的摘要开始编写业务。
9
+ 正文规定先理解需求、提出疑问与建议、查证框架,再说明实现映射、编码和验收;不要只凭本入口的摘要开始编写业务。
10
10
  当前项目的业务要求与 AGENTS.md 仍适用,框架维护任务遵守仓库的包边界。
@@ -10,14 +10,14 @@
10
10
 
11
11
  本节位于托管区之外,cage sync 会保留。下面的托管区提供框架工作方法。
12
12
 
13
- <!-- cage:begin v0.3.2 -->
13
+ <!-- cage:begin v0.4.0 -->
14
14
  ## Cage 业务开发约定(框架托管)
15
15
 
16
16
  ### 学习与任务入口
17
17
 
18
18
  本项目使用 `@yss123/cage-*`,业务写在本项目。先读项目说明指定的教材;独立项目默认入口是 `docs/development/README.md`。
19
19
 
20
- 开始 Cage 业务开发或排错时,加载 `docs/development/skills/cage-development/SKILL.md`。它讲清运行模型、业务澄清、能力选择、实施与验收方法;首次学习配合 `docs/development/getting-started/first-feature.md`。已熟悉时只读受影响专题,普通样式/文案改动无需重走业务建模。
20
+ 开始 Cage 业务开发或排错时,加载 `docs/development/skills/cage-development/SKILL.md`,统一按“理解需求 → 澄清 → 查证能力 → 说明实现映射 → 编码 → 验收”工作。首次学习配合 `docs/development/getting-started/first-feature.md`;已熟悉时只读受影响专题,普通样式/文案改动无需重走业务建模。
21
21
 
22
22
  支持 Agent Skills 的工具可发现 `.agents/skills/cage-development`;其他工具直接读取上述 Markdown,使用相同流程。教材随框架版本分发,均为本地文件,不需要额外服务、模型或索引。框架仓库范例使用项目说明指定的规范教材位置。
23
23
 
@@ -28,13 +28,13 @@
28
28
  - 角色、能力、数据范围、调用身份与业务约束分别建模。前端 can() 只影响显示,新增能力不自动授给生产角色;审批选人不授予能力。
29
29
  - 页面依赖生成契约及客户端。表单、弹窗等临时状态留在前端;正式业务数据和流程结果通过服务端读写。实际记录不能用模拟仓储或固定统计替代。
30
30
 
31
- ### 实现与排错
31
+ ### 编码前的依据
32
32
 
33
- 1. 阅读需求、文档和现有实现后,按 `docs/development/guides/business-collaboration.md` 主动提出疑点、可行选项、影响与推荐理由,让用户选择业务规则;沿用已明确的选择与授权,等待回答时推进独立部分,可选建议不阻塞已明确任务。再把确定的规则映射到聚合、命令、归属/范围、后续行为与验收,沿已有模块修改。具体选择看 `docs/development/guides/recipes.md`,目录归属看 `docs/development/reference/project-structure.md`。
34
- 2. 不熟悉的 API 先按手册任务目录定位,用本地文件搜索查术语,再执行 `pnpm exec cage capabilities 符号 --format json` 核对当前版本签名;`cage context "业务关键词"` 定位当前应用。未命中不代表不支持,不发明方法或返回字段。
35
- 3. 涉及已有领域含义变化,先 `pnpm exec cage snapshot save before-change` 保存本体基线,或使用真实 Git 基线。修改声明与导出,运行 check/gen,审查契约和迁移草稿。生成物不手改,已执行迁移不可改写。
36
- 4. 页面使用真实契约,处理业务失败、版本冲突、会话与缓存;多页面使用独立 URL,列表筛选/分页进入查询参数。按 `docs/development/guides/routing.md` 验收深链接、刷新、登录回跳和无权限行为。
37
- 5. 出错保留 code/at/reason/fix,查 `docs/errors/README.md` 与 `docs/development/tools/troubleshooting.md`;从真实调用逐层定位。不得放宽权限、删约束或关闭门禁来掩盖问题。
33
+ 业务疑点按 `docs/development/guides/business-collaboration.md` 提出选项、影响和推荐,让用户选择;沿用已明确的规则与授权。API 和当前行为由 agent 查证,普通技术方案自行决定;等待业务答案时推进独立部分。
34
+
35
+ 写代码前按 Skill 简述“已确认规则 → 已查证的 Cage 能力 → 修改位置 → 验收结果”,具体设计见 `docs/development/guides/recipes.md`。能力与签名查 `cage capabilities`,现有业务查 `cage context` 并阅读源码。未知规则和能力缺口不能靠猜测、编造 API 或复制示例填补;已明确的部分直接实施,不另设技术方案批准。
36
+
37
+ 涉及领域建模先读 `docs/development/guides/ontology-modeling.md`:说明对象含义、关系方向/基数、状态及动作前后结果,再写真实声明。聚合/字段/命令等填写结构化描述,每个状态填写 labels;中文注释和前端文案不会自动成为本体名称。处理本次声明的 CAGE-ONTOLOGY-001,并按业务例子核对关系和触发链;名称完整不能证明业务正确。自然语言、文档、表格和原型都是输入,不能由模板或页面布局代替业务判断。
38
38
 
39
39
  遇到原生 AI、AI 审批或随页助理,先读 `docs/development/guides/intelligence.md`,核对已有能力及应用启用状态。审批、文件、关系、数据传输等专题由 Skill 按需引导,不重建框架已有运行时。
40
40
 
@@ -42,12 +42,15 @@
42
42
 
43
43
  - 所有手写代码遵守 `docs/development/reference/commenting.md`:文件职责与调用链、导出 API/字段、复杂分支的中文说明,写清做什么、为什么、怎样完成及实际边界;随代码更新。生成物注释从生成器维护。
44
44
  - domain 按 modules/workflows/integrations/shared 组织,Web 按 app/modules/shared 组织。模块通过 index.ts 公开入口组合,前端不导入 domain、数据库或内核运行时;不关闭 modular 目录门禁。
45
+ - 领域含义修改前保留本体或真实 Git 基线;修改声明后运行 check/gen,审查契约和迁移草稿。生成物不手改,已执行迁移不可改写;具体命令见 `docs/development/getting-started/workflow.md`。
46
+ - 页面处理业务失败、版本冲突、会话与缓存;多页面使用独立 URL,筛选/分页进入查询参数,按 `docs/development/guides/routing.md` 实际验收。
45
47
  - 新项目启动步骤见 `docs/development/getting-started/workflow.md`。使用已有 PostgreSQL 和项目 .env;init 准备账号,migrate 更新结构,bootstrap 显式初始化组织,dev 启动进程。普通业务不新增连接池或管理 Docker。
46
48
  - 不输出或提交 .env、数据库密码、Cookie 密钥及初始化凭据。API 与 worker 使用一致的 domain,修改配置后按实际需要重启。
49
+ - 出错保留 code/at/reason/fix,查 `docs/errors/README.md` 与 `docs/development/tools/troubleshooting.md`;不得放宽权限、删约束或关闭门禁来掩盖问题。
47
50
 
48
51
  ### 完成依据
49
52
 
50
- 验证与改动匹配。check/gen/typecheck/build 证明各自检查范围;业务读写还需独立读取结果,权限需直接请求验证,审批需待办与结论,文件需实际内容,异步需任务终态,页面需浏览器操作。
53
+ 对照编码前的业务规则逐项验收,验证与改动匹配。check/gen/typecheck/build 证明各自检查范围;业务读写还需独立读取结果,权限需直接请求验证,审批需待办与结论,文件需实际内容,异步需任务终态,页面需浏览器操作。
51
54
 
52
55
  `pnpm verify` 汇总门禁;`verify --skip-tests` 不代表完整通过。诊断用 `cage doctor`、`timeline`、`explain`,具体前提见 `docs/development/tools/diagnostics.md`。交付分别说明通过、跳过、未执行及剩余配置;文档和可逆小改动不反复执行全量数据库回归。
53
56
  <!-- cage:end -->
@@ -10,6 +10,6 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@app/domain": "workspace:*",
13
- "@yss123/cage-http": "0.3.2"
13
+ "@yss123/cage-http": "0.4.0"
14
14
  }
15
15
  }
@@ -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.2",
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",
@@ -23,11 +23,11 @@ body {
23
23
  margin: 0;
24
24
  min-width: 1024px;
25
25
  }
26
- button,
26
+ button:not(.ant-btn),
27
27
  input {
28
28
  font: inherit;
29
29
  }
30
- button,
30
+ button:not(.ant-btn),
31
31
  a {
32
32
  -webkit-tap-highlight-color: transparent;
33
33
  }
@@ -39,16 +39,17 @@ button,
39
39
  .primary {
40
40
  cursor: pointer;
41
41
  }
42
- button:disabled {
42
+ button:not(.ant-btn):disabled {
43
43
  cursor: wait;
44
44
  opacity: 0.65;
45
45
  }
46
- button:focus-visible,
46
+ button:not(.ant-btn):focus-visible,
47
47
  a:focus-visible {
48
48
  outline: 3px solid #91bca2;
49
49
  outline-offset: 4px;
50
50
  }
51
- button {
51
+ /* 原生按钮规则服务于模板现有的 DOM 控件,不覆盖新增的 Ant Design Button。 */
52
+ button:not(.ant-btn) {
52
53
  transition:
53
54
  background 0.18s ease,
54
55
  border-color 0.18s ease;
@@ -1,18 +1,29 @@
1
1
  /**
2
- * 空白业务应用的浏览器启动入口,创建共享 QueryClient 并挂载 app 路由。
3
- * 新增业务页面使用同一 Provider 内的生成查询 hooks;此处只装配前端,不注册领域或连接数据库。
4
- * 全局样式由入口加载,会话失效与账号切换时的查询清理由 useSession 负责。
2
+ * 空白业务应用的浏览器启动入口,装配 Ant Design 中文主题、共享 QueryClient 并挂载 app 路由。
3
+ * 新增页面使用同一组 Provider 内的 UI 上下文和生成查询 hooks;入口不注册领域或连接数据库。
4
+ * AntD reset 与全局样式由入口加载,会话失效和账号切换时的查询清理由 useSession 负责。
5
5
  */
6
- // 浏览器入口只负责挂载和全局 Provider。QueryClient 让新增模块可直接使用生成查询 hooks。
6
+ // 浏览器入口只负责挂载 React、Ant Design 与查询 Provider,让新增模块使用统一 UI 和缓存上下文。
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 提供上下文反馈方法。
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
  );
@@ -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
  "aggregate:Dept": "部门",
10
11
  "aggregate:User": "用户",
@@ -1,11 +1,13 @@
1
1
  # 本地框架文档
2
2
 
3
- 从 [框架学习入口](development/README.md) 或 [Cage 开发 Skill](development/skills/cage-development/SKILL.md) 开始。
3
+ 编程 agent 先读项目 [AGENTS.md](../AGENTS.md),按 [Cage 开发 Skill](development/skills/cage-development/SKILL.md) 理解需求、澄清、查证能力、说明实现映射,再编码与验收。
4
4
 
5
- - `development/getting-started`:运行模型、完整入门课和开发步骤。
6
- - `development/guides`:[业务澄清与共同设计](development/guides/business-collaboration.md)、能力选择与各专题接入。
5
+ [任务导航](development/README.md) 说明各类文档的分工,按本次需要选择资料:
6
+
7
+ - `development/getting-started`:运行模型、完整业务链和操作命令。
8
+ - `development/guides`:[业务澄清](development/guides/business-collaboration.md)、[能力选择与实现映射](development/guides/recipes.md)、各专题接入。
7
9
  - `development/reference`:原语与工程规范。
8
10
  - `development/tools`:诊断、本体查询和排错。
9
11
  - `development/examples`:教学源码与采购导读。
10
- - `development/skills`:框架开发方法。
12
+ - `development/skills`:唯一的 agent 工作流程。
11
13
  - [错误码册](errors/README.md):按实际错误定位原因。