openxiangda 2.31.8 → 2.32.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 (48) hide show
  1. package/dist/browser/Shell.d.ts.map +1 -1
  2. package/dist/browser/Shell.js +50 -23
  3. package/dist/browser/Shell.js.map +1 -1
  4. package/dist/browser/admin-shell.d.ts +72 -0
  5. package/dist/browser/admin-shell.d.ts.map +1 -0
  6. package/dist/browser/admin-shell.js +14 -0
  7. package/dist/browser/admin-shell.js.map +1 -0
  8. package/dist/browser/application.d.ts.map +1 -1
  9. package/dist/browser/application.js +4 -1
  10. package/dist/browser/application.js.map +1 -1
  11. package/dist/browser/components/platform-fields/ZonedDateTimeField.d.ts.map +1 -1
  12. package/dist/browser/components/platform-fields/ZonedDateTimeField.js +13 -2
  13. package/dist/browser/components/platform-fields/ZonedDateTimeField.js.map +1 -1
  14. package/dist/browser/components/platform-fields/zoned-date-time.d.ts +7 -0
  15. package/dist/browser/components/platform-fields/zoned-date-time.d.ts.map +1 -1
  16. package/dist/browser/components/platform-fields/zoned-date-time.js +29 -0
  17. package/dist/browser/components/platform-fields/zoned-date-time.js.map +1 -1
  18. package/dist/browser/components/resource/useResourceFormDrafts.d.ts.map +1 -1
  19. package/dist/browser/components/workflow/StandardWorkflowPages.d.ts.map +1 -1
  20. package/dist/browser/components/workflow/StandardWorkflowPages.js +11 -4
  21. package/dist/browser/components/workflow/StandardWorkflowPages.js.map +1 -1
  22. package/dist/browser/platform-client.d.ts +2 -0
  23. package/dist/browser/platform-client.d.ts.map +1 -1
  24. package/dist/browser/platform-client.js +41 -13
  25. package/dist/browser/platform-client.js.map +1 -1
  26. package/dist/browser/ui-provider.d.ts +3 -1
  27. package/dist/browser/ui-provider.d.ts.map +1 -1
  28. package/dist/browser/ui-provider.js +3 -2
  29. package/dist/browser/ui-provider.js.map +1 -1
  30. package/dist/react.d.ts +1 -0
  31. package/dist/react.d.ts.map +1 -1
  32. package/dist/react.js +1 -0
  33. package/dist/react.js.map +1 -1
  34. package/documentation/AGENTS.md +1 -1
  35. package/documentation/data-authz.md +10 -11
  36. package/documentation/design-workflow.md +2 -2
  37. package/documentation/frontend.md +29 -3
  38. package/documentation/getting-started.md +7 -7
  39. package/documentation/manifest.json +5 -5
  40. package/package.json +24 -19
  41. package/releases/2.31.9.json +33 -0
  42. package/releases/2.32.0.json +38 -0
  43. package/skills/manifest.json +1 -1
  44. package/skills/openxiangda-v2/SKILL.md +6 -6
  45. package/skills/openxiangda-v2/references/data-authz.md +10 -11
  46. package/skills/openxiangda-v2/references/design-workflow.md +2 -2
  47. package/skills/openxiangda-v2/references/frontend.md +29 -3
  48. package/skills/openxiangda-v2/references/getting-started.md +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"ui-provider.js","sourceRoot":"","sources":["../../src/browser/ui-provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAoB,MAAM,MAAM,CAAC;AAC7D,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAsC,MAAM,OAAO,CAAC;AAChF,OAAO,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAOhG,MAAM,YAAY,GAAgB,EAAE,CAAC;AAErC,kFAAkF;AAClF,MAAM,UAAU,qBAAqB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAqE;IACtJ,MAAM,IAAI,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,CACL,KAAC,2BAA2B,CAAC,QAAQ,IAAC,KAAK,EAAE,IAAI,YAC/C,KAAC,cAAc,IAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,YAAY,EAAE,iBAAiB,EAAE,YAAY,YACzF,KAAC,GAAG,IAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAC9F,OAAO,EAAE,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE,YAAG,QAAQ,GAAO,GAC9D,GACoB,CACxC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ui-provider.js","sourceRoot":"","sources":["../../src/browser/ui-provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAoB,MAAM,MAAM,CAAC;AAC7D,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAsC,MAAM,OAAO,CAAC;AAChF,OAAO,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,wBAAwB,EAA0B,MAAM,eAAe,CAAC;AAQjF,MAAM,YAAY,GAAgB,EAAE,CAAC;AAErC,kFAAkF;AAClF,MAAM,UAAU,qBAAqB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAqE;IAC7J,MAAM,IAAI,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,CACL,KAAC,2BAA2B,CAAC,QAAQ,IAAC,KAAK,EAAE,IAAI,YAC/C,KAAC,cAAc,IAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,YAAY,EAAE,iBAAiB,EAAE,YAAY,YACzF,KAAC,GAAG,IAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAC9F,OAAO,EAAE,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE,YAAE,KAAC,wBAAwB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAqC,GAAM,GACnJ,GACoB,CACxC,CAAC;AACJ,CAAC"}
package/dist/react.d.ts CHANGED
@@ -17,6 +17,7 @@ export * from './browser/route-manifest';
17
17
  export { useUnsavedChangesGuard, type UnsavedChangesGuardOptions } from './browser/navigation-guard';
18
18
  export * from './browser/standard-user-surfaces';
19
19
  export * from './browser/Shell';
20
+ export * from './browser/admin-shell';
20
21
  export * from './browser/resource-definitions';
21
22
  export * from './browser/workflow-definitions';
22
23
  export * from './browser/workflow-launch';
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,iCAAiC,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEvG,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0CAA0C,CAAC;AACzD,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,KAAK,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACrG,cAAc,kCAAkC,CAAC;AACjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,6BAA6B,EAC7B,KAAK,8BAA8B,EACnC,KAAK,iBAAiB,EACtB,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,EAChC,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,oCAAoC,EACpC,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,cAAc,qDAAqD,CAAC;AACpE,cAAc,oDAAoD,CAAC;AACnE,cAAc,qDAAqD,CAAC;AACpE,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,qDAAqD,CAAC;AACpE,mBAAmB,6DAA6D,CAAC"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,iCAAiC,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEvG,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0CAA0C,CAAC;AACzD,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,KAAK,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACrG,cAAc,kCAAkC,CAAC;AACjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,6BAA6B,EAC7B,KAAK,8BAA8B,EACnC,KAAK,iBAAiB,EACtB,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,EAChC,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,oCAAoC,EACpC,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,cAAc,qDAAqD,CAAC;AACpE,cAAc,oDAAoD,CAAC;AACnE,cAAc,qDAAqD,CAAC;AACpE,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,qDAAqD,CAAC;AACpE,mBAAmB,6DAA6D,CAAC"}
package/dist/react.js CHANGED
@@ -16,6 +16,7 @@ export * from './browser/route-manifest';
16
16
  export { useUnsavedChangesGuard } from './browser/navigation-guard';
17
17
  export * from './browser/standard-user-surfaces';
18
18
  export * from './browser/Shell';
19
+ export * from './browser/admin-shell';
19
20
  export * from './browser/resource-definitions';
20
21
  export * from './browser/workflow-definitions';
21
22
  export * from './browser/workflow-launch';
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,iCAAiC,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAG3E,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0CAA0C,CAAC;AACzD,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAmC,MAAM,4BAA4B,CAAC;AACrG,cAAc,kCAAkC,CAAC;AACjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EAEzB,8BAA8B,EAC9B,6BAA6B,EAC7B,6BAA6B,EAG7B,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,EAChC,sBAAsB,EACtB,iBAAiB,GAGlB,MAAM,2BAA2B,CAAC;AASnC,cAAc,qDAAqD,CAAC;AACpE,cAAc,oDAAoD,CAAC;AACnE,cAAc,qDAAqD,CAAC;AACpE,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,qDAAqD,CAAC"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,iCAAiC,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAG3E,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0CAA0C,CAAC;AACzD,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAmC,MAAM,4BAA4B,CAAC;AACrG,cAAc,kCAAkC,CAAC;AACjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EAEzB,8BAA8B,EAC9B,6BAA6B,EAC7B,6BAA6B,EAG7B,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,EAChC,sBAAsB,EACtB,iBAAiB,GAGlB,MAAM,2BAA2B,CAAC;AASnC,cAAc,qDAAqD,CAAC;AACpE,cAAc,oDAAoD,CAAC;AACnE,cAAc,qDAAqD,CAAC;AACpE,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,qDAAqD,CAAC"}
@@ -9,7 +9,7 @@
9
9
  - 当前用户、角色并集、数据授权和部署状态归平台;应用不保存凭据或授权快照。普通 CRUD 走 Data API,真实业务动作才按需启用 Nest。想写后端接口时先按 docs development 的"判定是否真的需要 Nest 后端"逐行核对:列表/表单/详情/删除用 `createNativeResourceClient`,幂等、时间窗、状态前置用平台事务与守卫,聚合用服务端聚合;check 会拒绝未绑定已声明 operation 的应用 controller 路由。
10
10
  - 标准业务字段使用 `openxiangda/field-kit`;PC 补充控件使用 antd,移动使用有作用域的 `openxiangda/mobile` 和 MobileSurface,不引入上游全局重置。
11
11
  - 界面开发默认按 docs design-workflow 由当前 Agent 完成视觉、真实页面实现和浏览器修正;需要新视觉方向时可用 Image 2.5 等当前图片能力生成少量参考。图片不定义交互、权限或验收。设备由真实任务决定;复用 Shell 导航事实、标准字段行为,通过 ui 和局部样式应用设计,不复制权限或导航状态。采用的参考图、tokens 和必要原型以 AppSpec assets 固定。模板 /home 不替代页面选型。
12
- - 应用默认先建立并保留标准管理后台:后台 Shell、显式菜单、资源表单、数据列表、详情/编辑、权限和流程入口是应用骨架。Agent 可优化后台外观但不能替换后台;用户端 PC 与移动端按真实任务分别设计,通过 runtime/Data API 读取后台数据。禁止用图片、单页 HTML、iframe 或独立假后台替代后台,发布前分别验收后台与用户端入口。
12
+ - 应用默认先建立并保留标准管理后台:后台 Shell、显式菜单、资源表单、数据列表、详情/编辑、权限和流程入口是应用骨架。Agent 可通过 `ui.admin.shell` 和局部插槽自定义后台外观,平台仍拥有路由、身份、导航授权和数据行为;用户端 PC 与移动端按真实任务分别设计,通过 runtime/Data API 读取后台数据。禁止用图片、单页 HTML、iframe 或独立假后台替代后台,发布前分别验收后台与用户端入口。
13
13
  - 图表等专业交互先检查现有依赖并评估成熟组件/开源库,报表优先评估 ECharts,按需加载并释放实例;平台数据、权限与聚合仍通过官方能力。详见 docs frontend。
14
14
  - 入口与导航验收从平台应用列表开始,检查应用根路径、后台首个有权菜单、登录返回及刷新深链接;不能只验证开发者给出的业务链接。
15
15
  - 无账号表单或外部公开数据读取都读取 `docs public-access`:使用 `frontend.publicAccess` 和专用客户端;提交策略声明 `create` 时必须启用 `draft`,只读公开目录使用 `public.list`/`public.read` 与 `publicRecordFields`,附件/图片/富文本按平台托管 URL 读取,子表必须声明 `publicSubtableFields`,不创建 guest 角色、不传 draft id、不调用普通 Data API。标准审批、通知和后端均按需启用。
@@ -11,17 +11,16 @@ create/update 闭包返回的值。人员和部门保存平台目录真实 ID;
11
11
 
12
12
  字段策略支持 `read`、`create`、`update` 和 `mask`。显式空数组拒绝,能力数组采用 all-of。无权更新字段不仅 disabled,还必须从更新 payload 删除。
13
13
 
14
- 模型可声明 `audit: { read: false }`,禁止普通用户读取创建人、更新人、创建时间、
15
- 更新时间和变更历史;需要保留管理者查看时,使用
16
- `audit: { read: ['app:your-app:audit:read'] }`,先在 `authz.capabilities`
17
- 声明该能力并授予相应角色,也可以直接引用已有的管理权限。审计策略只引用
18
- 能力,不会新建能力或改变其 catalog 所有者;引用缺失会在发布前失败。
19
- 省略沿用原有读取行为,`id` 与 `revision` 始终是协议字段。权限只控制读取,
20
- 不删除平台存储的审计事实。显式查询、筛选、排序、聚合、导出和历史接口同样
21
- 执行权限;标准详情页随受权元数据隐藏或显示变更记录入口。
22
- 能力数组沿用字段策略的 all-of 规则,字段与行权限必须来自同一个有效角色成员
23
- 授权。应用可信后端和现有超级管理员权限保持原有语义。使用该声明需要平台支持
24
- `data.audit-read-access`,旧平台会在发布前拒绝。
14
+ `id`、`revision`、`created_at`、`updated_at`、`created_by`、`updated_by` 是基础元数据:
15
+ 只要有记录读取权限,就可读取、筛选、排序、聚合和导出,不需要额外字段权限。
16
+ 它们仍由平台生成,不能通过业务字段写入来伪造;记录、租户、环境权限和匿名公开字段白名单仍然生效。
17
+
18
+ 模型可声明 `audit: { read: false }` 禁止普通用户查看变更历史;需要保留管理者查看时,
19
+ 使用 `audit: { read: ['app:your-app:audit:read'] }`,先在 `authz.capabilities` 声明该能力并授予相应角色,
20
+ 也可以引用已有管理权限。历史可能包含过去的业务值,因此不因基础元数据开放而自动开放。
21
+ 审计策略引用能力,不新建能力或改变其所有者;缺失引用在发布前失败。
22
+ 为兼容历史包,编译器仍物化审计元数据策略作为历史接口的授权声明,当前平台读取基础元数据时忽略这些额外 read 限制。
23
+ 应用可信后端和超级管理员保持原语义。该声明需要 `data.audit-read-access`;基础元数据开放需部署 2026-09-29 对应平台迁移。
25
24
 
26
25
  ```bash
27
26
  pnpm openxiangda check
@@ -14,7 +14,7 @@
14
14
  开始界面工作前,从当前 AppSpec、平台契约和用户材料形成一个短设计输入,至少明确:
15
15
 
16
16
  - 目标用户、主任务、页面归属以及 PC/移动设备范围;
17
- - 必须保留的平台 Shell、导航、字段协议、权限和数据来源;
17
+ - 必须保留的平台路由与授权导航事实、字段协议、权限和数据来源;Shell 外观可通过正式扩展接口自定义;
18
18
  - 页面信息层次、关键操作,以及空、加载、失败、拒绝、校验、提交中和成功状态;
19
19
  - 用户提供的品牌、参考图和素材授权;没有品牌事实时标记为 Agent 推断;
20
20
  - 目标视口、可访问性、内容长度、数据量和性能边界;
@@ -37,7 +37,7 @@
37
37
 
38
38
  ## 页面归属与平台边界 {#adapter}
39
39
 
40
- 应用结构先于视觉:标准管理后台是默认骨架,必须保留平台 Shell、后台路由、显式菜单、
40
+ 应用结构先于视觉:标准管理后台是默认骨架,必须保留平台后台路由、授权与显式菜单,Shell 外观可定制、
41
41
  资源表单、数据列表、详情/编辑、权限和流程入口。Agent 可以在这些边界内优化布局、视觉和
42
42
  交互,但不能用设计图、独立原型、单页 HTML 或 iframe 替代后台。
43
43
 
@@ -20,7 +20,7 @@
20
20
 
21
21
  标准管理后台是每个业务应用的默认开发骨架,必须保留后台 Shell、显式菜单、资源表单、数据列表、详情/编辑、权限和流程入口。开发顺序先完成后台资源与契约,再实现用户端 PC/移动端;不能以用户端首页或设计原型替代后台。
22
22
 
23
- Agent 可以在标准后台内部优化布局、视觉和交互,但后台仍复用平台 Shell、导航、字段行为和权限。用户端 PC 与移动端按真实旅程分别设计,通过平台 runtime/Data API 使用后台数据。图片参考和原型不拥有业务事实;禁止用图片、单页 HTML、iframe 或自定义假后台替换标准后台,也不能把后台权限、导航状态复制到用户端。
23
+ Agent 可以在标准后台内部优化布局、视觉和交互,后台通过默认 Shell 或 `ui.admin` 扩展复用平台导航、字段行为和权限。用户端 PC 与移动端按真实旅程分别设计,通过平台 runtime/Data API 使用后台数据。图片参考和原型不拥有业务事实;禁止用图片、单页 HTML、iframe 或自定义假后台替换标准后台,也不能把后台权限、导航状态复制到用户端。
24
24
 
25
25
  发布前分别验证后台入口、表单、数据列表、流程入口和用户端 PC/移动端入口;没有完成后台骨架的应用不得发布。
26
26
 
@@ -31,9 +31,9 @@ Agent 可以在标准后台内部优化布局、视觉和交互,但后台仍
31
31
  | 独立门户、申请或用户任务 | 按实际旅程选择 `surface: 'user'`,拥有独立布局 |
32
32
  | 确有手机使用需求的用户任务 | 独立移动 user 页面,使用 `openxiangda/mobile` 和 Field Kit |
33
33
 
34
- “自定义页面”可以直接放在标准后台内。应用只编写内容,runtime 自动套用唯一 Shell;不要因为要画图表就复制顶栏、侧栏、Router 或改成 user 页面。模板 `/home` 是独立用户页占位,不能不经页面选型就当作业务默认入口。
34
+ “自定义页面”可以直接放在标准后台内。应用编写业务内容,runtime 自动套用默认或应用提供的唯一 Shell;自定义布局使用 `ui.admin`,无需复制 Router 或改成 user 页面。模板 `/home` 是独立用户页占位,不能不经页面选型就当作业务默认入口。
35
35
 
36
- 后台菜单的分组、名称、顺序、图标由 `frontend.admin.navigation` 配置;标准视图控制字段与操作,工具栏/行/详情有动作插槽,自定义 React 内容通过 contributions 接入。当前没有整套后台 Shell 的替换接口。用户需要独立产品布局时选择 user surface,普通后台报表无需更换外壳。
36
+ 后台菜单的分组、名称、顺序、图标由 `frontend.admin.navigation` 配置;标准视图控制字段与操作,工具栏/行/详情有动作插槽,自定义 React 内容通过 contributions 接入。通过 `ui.admin.shell` 可替换整个后台外观,也可用 `header`、`sidebar`、`footer` 插槽局部扩展。后台页面仍使用 admin surface,路由与权限由平台维护。
37
37
 
38
38
  应用根路径由生成的 `routeManifest.rootEntry` 分流;`/admin` 根据当前用户可访问的显式菜单选择后台首页。交付时分别核验平台应用列表入口、根路径、后台入口和业务深链接。无后台菜单不能解释为缺少模型;没有管理后台的用户应用也不需要为了消除空状态伪造 CRUD 页面。
39
39
 
@@ -445,3 +445,29 @@ pnpm --filter @app/web build
445
445
  ## 具名工作流私有草稿
446
446
 
447
447
  普通创建能力被应用关闭时,使用 `createWorkflowFormDraftClient('contracts', { workflowCode: 'contract-approval', operationCode: 'submit-contract-approval' })`(从 `openxiangda/react` 导入)。客户端提供 `list/save/remove`,保持当前用户、环境、工作流与具名操作范围;仅支持默认 create 表单,不包含 Native submit。保存 `values` 与已声明的 `state`;正式提交仍将既有 `formDraft:{resourceCode,id,expectedRevision,mode:'create'}` 交给业务操作的 BusinessProcess 原子消费。服务端从真实业务命令核验工作流/操作,不能传任意范围冒用草稿。需先部署支持该能力与新增草稿作用域列的平台版本;不得通过增加普通 NativeCreate 或本地存储绕过拒绝。
448
+
449
+
450
+ ## 应用自定义后台壳层
451
+
452
+ `OpenXiangdaApplication` 的 `ui.admin` 允许应用定义完整后台布局,不需要隐藏平台 DOM。
453
+
454
+ ```tsx
455
+ import type { AdminShellProps } from 'openxiangda/react';
456
+ function ProductAdmin({ children, navigation, identity, title, navigate, logout, loggingOut }: AdminShellProps) {
457
+ return <div className="product-admin">
458
+ <header><strong>{title}</strong><span>{identity.subjectProfile.displayName}</span>
459
+ <button disabled={loggingOut} onClick={() => void logout()}>退出登录</button></header>
460
+ <aside>{navigation.map(group => <nav key={group.code} aria-label={group.label}>
461
+ {group.items.map(item => <button key={item.code} onClick={() => navigate(item.path)}>{item.label}</button>)}
462
+ </nav>)}</aside><main>{children}</main>
463
+ </div>;
464
+ }
465
+ // 在既有 OpenXiangdaApplication 上增加,其他契约 props 原样保留:
466
+ // ui={{ theme, admin: { shell: ProductAdmin, centerNavigation: { workflow: false, messages: false } } }}
467
+ ```
468
+
469
+ `navigation` 已按当前角色并集和读取视角过滤,`selectedPath`、`homePath`、`pathname`、`search` 来自平台 Router;请直接渲染,不保存另一份角色或菜单状态。`centers` 为可见的审批工作中心与消息中心入口;隐藏中心导航仅改变展示,不禁用能力或深链接。隐藏后应从业务页为审批人提供任务入口。
470
+
471
+ 可只提供 `header`、`sidebar` 或 `footer`(接收 `AdminShellModel`)。整体 `shell` 额外收到 `children` 与 `slots`,可复用默认部件或完全自行排版。自定义壳层接管后台资源列表、新增、详情、编辑、移动深链以及后台业务页面;标准字段、抽屉、未保存提示和授权继续由平台组件负责。登录页和用户页不受影响。组件在模块顶层声明,避免每次渲染重新创建组件类型导致表单重挂载。
472
+
473
+ 无 `ui.admin` 时沿用默认后台。扩展不能越过 `adminAccess`、页面能力或 Data API 记录权限;不能自行创建第二个 Router、认证会话或数据权限状态。验收应覆盖应用入口、刷新深链、无权角色、PC/移动、键盘和壳层异常恢复。
@@ -68,10 +68,10 @@ MCP 服务随项目根包一起安装,AI 客户端的 stdio 连接仍需配置
68
68
  以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
69
69
 
70
70
  ```bash
71
- pnpm dlx openxiangda@2.31.8 skill install --force
72
- pnpm dlx openxiangda@2.31.8 auth status --base-url <平台地址> --json
73
- pnpm dlx openxiangda@2.31.8 login --cwd my-app --base-url https://platform.example.com
74
- pnpm dlx openxiangda@2.31.8 create my-app --base-url https://platform.example.com
71
+ pnpm dlx openxiangda@2.32.0 skill install --force
72
+ pnpm dlx openxiangda@2.32.0 auth status --base-url <平台地址> --json
73
+ pnpm dlx openxiangda@2.32.0 login --cwd my-app --base-url https://platform.example.com
74
+ pnpm dlx openxiangda@2.32.0 create my-app --base-url https://platform.example.com
75
75
  cd my-app
76
76
  pnpm openxiangda context --json
77
77
  pnpm openxiangda dev
@@ -174,9 +174,9 @@ MCP 的 `docs_read` 可以读取本说明,当前没有独立的源码操作 MC
174
174
  无需本地工作区,使用本 Skill 随包精确版本或已安装的对应 CLI:
175
175
 
176
176
  ```bash
177
- pnpm dlx openxiangda@2.31.8 auth status --base-url <平台> --json
178
- pnpm dlx openxiangda@2.31.8 source resolve <仓库URL> --base-url <平台> --json
179
- pnpm dlx openxiangda@2.31.8 source clone <仓库URL> <新目录> --base-url <平台> --json
177
+ pnpm dlx openxiangda@2.32.0 auth status --base-url <平台> --json
178
+ pnpm dlx openxiangda@2.32.0 source resolve <仓库URL> --base-url <平台> --json
179
+ pnpm dlx openxiangda@2.32.0 source clone <仓库URL> <新目录> --base-url <平台> --json
180
180
  ```
181
181
 
182
182
  登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schemaVersion": "openxiangda.documentation/v1",
3
- "version": "2.31.8",
3
+ "version": "2.32.0",
4
4
  "topics": [
5
5
  {
6
6
  "id": "getting-started",
7
7
  "title": "安装与开始开发",
8
8
  "file": "getting-started.md",
9
- "sha256": "d9e4e3dd1acd90b8a067bd70de5448127e5faa6386493c70237310bc43c0f122"
9
+ "sha256": "d1282c0b4d50e3ca5a76c8f6e1f271809eb9ae0669b7f32e6a9ef784564b7b8b"
10
10
  },
11
11
  {
12
12
  "id": "product-design",
@@ -18,7 +18,7 @@
18
18
  "id": "design-workflow",
19
19
  "title": "Agent 原生视觉设计与实现",
20
20
  "file": "design-workflow.md",
21
- "sha256": "5fb1557685595639dc9dd04f5c1bd146f6457c24b33b3608b3c2ecb24a842caf"
21
+ "sha256": "1aa7a747fd07d41c245eb9de6eef0941cd300908beac007ca49f0aff0e38e46b"
22
22
  },
23
23
  {
24
24
  "id": "interaction-patterns",
@@ -60,7 +60,7 @@
60
60
  "id": "frontend",
61
61
  "title": "页面与标准组件扩展",
62
62
  "file": "frontend.md",
63
- "sha256": "93db2bef516307475e86c70a4146055f0ada86673f88b70b19a588d8ea035c68"
63
+ "sha256": "d2e313a5bfffc9aea46e4f9936ae79908588c2a4727824e2b211b886baa1f392"
64
64
  },
65
65
  {
66
66
  "id": "field-components",
@@ -72,7 +72,7 @@
72
72
  "id": "data-authz",
73
73
  "title": "数据查询与权限",
74
74
  "file": "data-authz.md",
75
- "sha256": "b35904b721bcd837c3a26cdf91ef9514c82c87bd517c35572b84ee2a90c5a89f"
75
+ "sha256": "5c8592f0b45e14c619b6146c6570c65161f0e0cb8ee86724050b3417f9e90e50"
76
76
  },
77
77
  {
78
78
  "id": "public-access",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openxiangda",
3
- "version": "2.31.8",
3
+ "version": "2.32.0",
4
4
  "description": "OpenXiangda 2.0 的统一命令、应用 SDK、MCP 与中文 AI 技能资料。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -64,13 +64,13 @@
64
64
  "antd-mobile": "5.42.3",
65
65
  "dayjs": "1.11.18",
66
66
  "docx-preview": "0.3.7",
67
- "openxiangda-cli": "2.6.10",
67
+ "openxiangda-cli": "2.6.12",
68
68
  "openxiangda-contracts": "2.33.0",
69
- "openxiangda-devkit-core": "2.34.3",
69
+ "openxiangda-devkit-core": "2.34.4",
70
70
  "openxiangda-legacy": "npm:openxiangda@1.0.269",
71
- "openxiangda-mcp": "2.0.59",
71
+ "openxiangda-mcp": "2.0.60",
72
72
  "openxiangda-nest": "2.9.0",
73
- "openxiangda-skill-kit": "2.3.34",
73
+ "openxiangda-skill-kit": "2.3.35",
74
74
  "xlsx": "https://github.com/1377385356/openxiangda/releases/download/vendor-mirror/xlsx-0.20.3.tgz"
75
75
  },
76
76
  "peerDependencies": {
@@ -136,36 +136,41 @@
136
136
  },
137
137
  "openxiangdaRelease": {
138
138
  "schemaVersion": "openxiangda.release-notes/v1",
139
- "version": "2.31.8",
139
+ "version": "2.32.0",
140
140
  "status": "reviewed",
141
- "title": "OpenXiangda 2.31.8:富文本图片与原通知投递恢复",
142
- "summary": "支持具名动作的富文本托管图片,并公开按原消息查询、恢复失败投递的用户态接口。",
141
+ "title": "OpenXiangda 2.32.0:自定义后台壳层与精确时间交互",
142
+ "summary": "提供正式后台壳层扩展,改进时间禁选、业务错误与内网开发诊断。",
143
143
  "newFeatures": [
144
- "NotificationService 增加 listMessages、listDeadLetters、replayDeadLetter,固定应用环境并保留平台管理权限。"
144
+ "应用可通过 ui.admin 提供完整后台壳层或顶栏、侧栏、页脚插槽,消费权限过滤后的导航与身份。",
145
+ "消息与待办导航可分别配置显示,资源深链接与移动端页面统一使用自定义壳层。"
145
146
  ],
146
147
  "fixes": [
147
- "managedFiles 作者配置与 Native 编译支持精确 text.rich 字段,避免借用其他图片字段授权。"
148
+ "日期时间控件按时区精确禁用小时、分钟、秒,保留输入校验和受控值。",
149
+ "业务拒绝的中文 message 与错误码、requestId 分离,避免页面丢失实际提示。",
150
+ "开发连接故障区分 DNS、TCP、TLS 与超时并提供安全恢复提示。"
148
151
  ],
149
152
  "affectedUsers": [
150
- "使用具名动作编辑富文本或需要后台管理通知投递的 V2 应用。"
153
+ "使用自定义管理后台、精确日期范围或校内网络开发的 V2 应用。"
151
154
  ],
152
155
  "upgradeSteps": [
153
- "升级工具链;富文本插图依赖对应平台编译支持,开发态已有记录上传需平台开发态附件 RLS 修复。",
154
- "通知死信 messageId 过滤和来源关联需对应平台版本;管理员分别授予 read、content:read、delivery:retry 权限。"
156
+ "升级 openxiangda 至 2.32.0,重新安装依赖并构建应用。CLI 模板随同版本化。",
157
+ "按公开 ui.admin 契约接入壳层;路由、登录与授权继续由平台负责。",
158
+ "基础记录字段默认读取及受管下载文件名需要配套平台后端升级;仅升级 npm 不会更改服务端。"
155
159
  ],
156
160
  "knownLimitations": [
157
- "投影阶段尚无消息时死信关联字段为空;已解决死信保持既有 not-found 响应,客户端应刷新状态。",
158
- "SDK 和平台源码验证不代替目标应用实际图片上传、通知投递及权限验收。"
161
+ "自定义壳层接入和业务页面设计仍由应用负责,升级 SDK 不自动替换现有 UI。",
162
+ "网络诊断不自动改变 VPN、系统代理、证书或重试未知结果写请求。",
163
+ "前端时间禁选不能替代应用服务端业务时间守卫。"
159
164
  ],
160
165
  "issues": [],
161
166
  "compatibility": {
162
167
  "node": ">=24",
163
168
  "workspaceGenerations": "v2",
164
- "platform": "新增富文本声明和通知来源过滤需同步支持本次变更的平台;不扩大普通用户发送权限。",
165
- "v1": "独立 V1 引擎不受影响。"
169
+ "platform": "沿用现有认证、权限与路由协议;基础记录元数据的后端调整需对应站点发布。",
170
+ "v1": "V1 引擎与既有业务不受本次 SDK 改动影响。"
166
171
  },
167
- "sha256": "e30dad108c478ee6cce5a1632cbd620cbf650999c9d2fd39973482c2edb01ad9",
168
- "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.31.8"
172
+ "sha256": "987351f0bde76980d80f2a1ea8741c7e4697ef7b659ca679f5bf9b2797c8e8b2",
173
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.32.0"
169
174
  },
170
175
  "scripts": {
171
176
  "build": "node ../../scripts/prune-package-dist.mjs && tsc -p tsconfig.json && node scripts/copy-assets.mjs",
@@ -0,0 +1,33 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.31.9",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.31.9:审批凭据绑定与附件预览修复",
6
+ "summary": "修复登录面刷新后既有审批凭据失配,以及流程附件预览遗漏 CSRF 请求头的问题。",
7
+ "newFeatures": [],
8
+ "fixes": [
9
+ "工作流操作保留签发详情时的 CSRF 绑定,登录面刷新不会将已签发操作错误地改用新凭据。",
10
+ "流程附件元数据、封面缩略图与文件内容通过 SDK 携带所需请求头,保留实例和字段授权。",
11
+ "审批确认弹窗持续展示操作失败提示,便于用户了解未完成状态。"
12
+ ],
13
+ "affectedUsers": [
14
+ "使用任务或实例审批、流程附件预览的 V2 应用。"
15
+ ],
16
+ "upgradeSteps": [
17
+ "升级 openxiangda 至 2.31.9 并重新构建应用,CLI 同批次更新模板依赖。",
18
+ "发布后核对真实审批提交、业务状态回读和封面预览;不需要修改角色权限或数据库。"
19
+ ],
20
+ "knownLimitations": [
21
+ "网络结果不明的写操作不会自动重试,应先查询原操作状态。",
22
+ "原始文件 URL 仍不代替带授权头的 SDK 文件预览,HTML 等附件的服务端隔离策略保持不变。"
23
+ ],
24
+ "issues": [],
25
+ "compatibility": {
26
+ "node": ">=24",
27
+ "workspaceGenerations": "v2",
28
+ "platform": "沿用既有工作流 Surface、一次性命令凭据与文件授权契约,无服务端放宽。",
29
+ "v1": "独立 V1 引擎不受影响。"
30
+ },
31
+ "sha256": "451b5b993046436de85f8f1aefd3acdad4677efe5754969d0adb5c6c8a9758b1",
32
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.31.9"
33
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.32.0",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.32.0:自定义后台壳层与精确时间交互",
6
+ "summary": "提供正式后台壳层扩展,改进时间禁选、业务错误与内网开发诊断。",
7
+ "newFeatures": [
8
+ "应用可通过 ui.admin 提供完整后台壳层或顶栏、侧栏、页脚插槽,消费权限过滤后的导航与身份。",
9
+ "消息与待办导航可分别配置显示,资源深链接与移动端页面统一使用自定义壳层。"
10
+ ],
11
+ "fixes": [
12
+ "日期时间控件按时区精确禁用小时、分钟、秒,保留输入校验和受控值。",
13
+ "业务拒绝的中文 message 与错误码、requestId 分离,避免页面丢失实际提示。",
14
+ "开发连接故障区分 DNS、TCP、TLS 与超时并提供安全恢复提示。"
15
+ ],
16
+ "affectedUsers": [
17
+ "使用自定义管理后台、精确日期范围或校内网络开发的 V2 应用。"
18
+ ],
19
+ "upgradeSteps": [
20
+ "升级 openxiangda 至 2.32.0,重新安装依赖并构建应用。CLI 模板随同版本化。",
21
+ "按公开 ui.admin 契约接入壳层;路由、登录与授权继续由平台负责。",
22
+ "基础记录字段默认读取及受管下载文件名需要配套平台后端升级;仅升级 npm 不会更改服务端。"
23
+ ],
24
+ "knownLimitations": [
25
+ "自定义壳层接入和业务页面设计仍由应用负责,升级 SDK 不自动替换现有 UI。",
26
+ "网络诊断不自动改变 VPN、系统代理、证书或重试未知结果写请求。",
27
+ "前端时间禁选不能替代应用服务端业务时间守卫。"
28
+ ],
29
+ "issues": [],
30
+ "compatibility": {
31
+ "node": ">=24",
32
+ "workspaceGenerations": "v2",
33
+ "platform": "沿用现有认证、权限与路由协议;基础记录元数据的后端调整需对应站点发布。",
34
+ "v1": "V1 引擎与既有业务不受本次 SDK 改动影响。"
35
+ },
36
+ "sha256": "987351f0bde76980d80f2a1ea8741c7e4697ef7b659ca679f5bf9b2797c8e8b2",
37
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.32.0"
38
+ }
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "name": "openxiangda-v2",
6
6
  "description": "使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具体变更出发,通过对话发现模块、完成详细产品设计,由当前 AI Agent 按需用 Image 2.5 等图片能力形成视觉参考,直接实现真实页面并在浏览器修正,再检查和交付应用;维护 1.x 应用时使用对应的 1.x 技能。",
7
- "sha256": "0ea5740d7043248b6769bdb643849cc7187d930d021fc5891e270ef10a9bfa79"
7
+ "sha256": "66e227c96e4e7e36aa3d15e4eb6744ff9d78934a335d4b987159bbd77d5e593b"
8
8
  }
9
9
  ]
10
10
  }
@@ -7,9 +7,9 @@ description: 使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具
7
7
 
8
8
  ## 应用结构基线(必须遵守)
9
9
 
10
- 每个业务应用默认先建立并保留标准管理后台。管理后台是应用骨架,承载资源模型、表单、数据列表、详情/编辑、权限和流程入口;AI 必须先从后台完成数据与契约,再实现用户端体验。不得因为制作用户端首页而删除、隐藏或替换后台 Shell、后台路由或显式菜单。
10
+ 每个业务应用默认先建立并保留标准管理后台。管理后台是应用骨架,承载资源模型、表单、数据列表、详情/编辑、权限和流程入口;AI 必须先从后台完成数据与契约,再实现用户端体验。默认提供标准 Shell;需要定制后台外观时使用 `ui.admin.shell` 或局部插槽,保留平台后台路由、授权和显式业务菜单。
11
11
 
12
- Agent 按页面归属优化布局、视觉和交互:后台必须复用平台 Shell、导航、字段行为和权限;用户端 PC 与移动端按真实任务分别设计,并通过平台 runtime/Data API 读取后台数据。图片参考不定义交互、权限或验收。不得用图片、单页 HTML、iframe 或独立假后台冒充管理后台,也不得在用户端复制后台权限和导航状态。
12
+ Agent 按页面归属优化布局、视觉和交互:后台通过默认 Shell 或 `ui.admin` 扩展复用平台导航事实、字段行为和权限;用户端 PC 与移动端按真实任务分别设计,并通过平台 runtime/Data API 读取后台数据。图片参考不定义交互、权限或验收。不得用图片、单页 HTML、iframe 或独立假后台冒充管理后台,也不得在用户端复制后台权限和导航状态。
13
13
 
14
14
  设计、实现和发布验收必须分别核验管理后台入口、表单、数据列表、流程入口,以及用户端 PC/移动端入口。缺少标准管理后台的应用结构不完整,不能发布。
15
15
 
@@ -40,10 +40,10 @@ AI 接到新应用、页面或改版任务时,在同一个 OpenXiangda 工作
40
40
  未创建工作区时使用本 Skill 随根包发布的精确版本:
41
41
 
42
42
  ```bash
43
- pnpm dlx openxiangda@2.31.8 auth status --cwd <应用目录> --base-url <平台地址> --json
44
- pnpm dlx openxiangda@2.31.8 login --cwd <应用目录> --base-url <平台地址>
45
- pnpm dlx openxiangda@2.31.8 create <应用目录> --base-url <同一平台地址>
46
- pnpm dlx openxiangda@2.31.8 skill install --force
43
+ pnpm dlx openxiangda@2.32.0 auth status --cwd <应用目录> --base-url <平台地址> --json
44
+ pnpm dlx openxiangda@2.32.0 login --cwd <应用目录> --base-url <平台地址>
45
+ pnpm dlx openxiangda@2.32.0 create <应用目录> --base-url <同一平台地址>
46
+ pnpm dlx openxiangda@2.32.0 skill install --force
47
47
  ```
48
48
 
49
49
  创建前把产品要求的目标平台明确带入命令,不从旧登录态推断站点。已有工作区从原绑定恢复,平台不一致时先解决登录与目标,不改 link 文件跨站创建。
@@ -11,17 +11,16 @@ create/update 闭包返回的值。人员和部门保存平台目录真实 ID;
11
11
 
12
12
  字段策略支持 `read`、`create`、`update` 和 `mask`。显式空数组拒绝,能力数组采用 all-of。无权更新字段不仅 disabled,还必须从更新 payload 删除。
13
13
 
14
- 模型可声明 `audit: { read: false }`,禁止普通用户读取创建人、更新人、创建时间、
15
- 更新时间和变更历史;需要保留管理者查看时,使用
16
- `audit: { read: ['app:your-app:audit:read'] }`,先在 `authz.capabilities`
17
- 声明该能力并授予相应角色,也可以直接引用已有的管理权限。审计策略只引用
18
- 能力,不会新建能力或改变其 catalog 所有者;引用缺失会在发布前失败。
19
- 省略沿用原有读取行为,`id` 与 `revision` 始终是协议字段。权限只控制读取,
20
- 不删除平台存储的审计事实。显式查询、筛选、排序、聚合、导出和历史接口同样
21
- 执行权限;标准详情页随受权元数据隐藏或显示变更记录入口。
22
- 能力数组沿用字段策略的 all-of 规则,字段与行权限必须来自同一个有效角色成员
23
- 授权。应用可信后端和现有超级管理员权限保持原有语义。使用该声明需要平台支持
24
- `data.audit-read-access`,旧平台会在发布前拒绝。
14
+ `id`、`revision`、`created_at`、`updated_at`、`created_by`、`updated_by` 是基础元数据:
15
+ 只要有记录读取权限,就可读取、筛选、排序、聚合和导出,不需要额外字段权限。
16
+ 它们仍由平台生成,不能通过业务字段写入来伪造;记录、租户、环境权限和匿名公开字段白名单仍然生效。
17
+
18
+ 模型可声明 `audit: { read: false }` 禁止普通用户查看变更历史;需要保留管理者查看时,
19
+ 使用 `audit: { read: ['app:your-app:audit:read'] }`,先在 `authz.capabilities` 声明该能力并授予相应角色,
20
+ 也可以引用已有管理权限。历史可能包含过去的业务值,因此不因基础元数据开放而自动开放。
21
+ 审计策略引用能力,不新建能力或改变其所有者;缺失引用在发布前失败。
22
+ 为兼容历史包,编译器仍物化审计元数据策略作为历史接口的授权声明,当前平台读取基础元数据时忽略这些额外 read 限制。
23
+ 应用可信后端和超级管理员保持原语义。该声明需要 `data.audit-read-access`;基础元数据开放需部署 2026-09-29 对应平台迁移。
25
24
 
26
25
  ```bash
27
26
  pnpm openxiangda check
@@ -14,7 +14,7 @@
14
14
  开始界面工作前,从当前 AppSpec、平台契约和用户材料形成一个短设计输入,至少明确:
15
15
 
16
16
  - 目标用户、主任务、页面归属以及 PC/移动设备范围;
17
- - 必须保留的平台 Shell、导航、字段协议、权限和数据来源;
17
+ - 必须保留的平台路由与授权导航事实、字段协议、权限和数据来源;Shell 外观可通过正式扩展接口自定义;
18
18
  - 页面信息层次、关键操作,以及空、加载、失败、拒绝、校验、提交中和成功状态;
19
19
  - 用户提供的品牌、参考图和素材授权;没有品牌事实时标记为 Agent 推断;
20
20
  - 目标视口、可访问性、内容长度、数据量和性能边界;
@@ -37,7 +37,7 @@
37
37
 
38
38
  ## 页面归属与平台边界 {#adapter}
39
39
 
40
- 应用结构先于视觉:标准管理后台是默认骨架,必须保留平台 Shell、后台路由、显式菜单、
40
+ 应用结构先于视觉:标准管理后台是默认骨架,必须保留平台后台路由、授权与显式菜单,Shell 外观可定制、
41
41
  资源表单、数据列表、详情/编辑、权限和流程入口。Agent 可以在这些边界内优化布局、视觉和
42
42
  交互,但不能用设计图、独立原型、单页 HTML 或 iframe 替代后台。
43
43
 
@@ -20,7 +20,7 @@
20
20
 
21
21
  标准管理后台是每个业务应用的默认开发骨架,必须保留后台 Shell、显式菜单、资源表单、数据列表、详情/编辑、权限和流程入口。开发顺序先完成后台资源与契约,再实现用户端 PC/移动端;不能以用户端首页或设计原型替代后台。
22
22
 
23
- Agent 可以在标准后台内部优化布局、视觉和交互,但后台仍复用平台 Shell、导航、字段行为和权限。用户端 PC 与移动端按真实旅程分别设计,通过平台 runtime/Data API 使用后台数据。图片参考和原型不拥有业务事实;禁止用图片、单页 HTML、iframe 或自定义假后台替换标准后台,也不能把后台权限、导航状态复制到用户端。
23
+ Agent 可以在标准后台内部优化布局、视觉和交互,后台通过默认 Shell 或 `ui.admin` 扩展复用平台导航、字段行为和权限。用户端 PC 与移动端按真实旅程分别设计,通过平台 runtime/Data API 使用后台数据。图片参考和原型不拥有业务事实;禁止用图片、单页 HTML、iframe 或自定义假后台替换标准后台,也不能把后台权限、导航状态复制到用户端。
24
24
 
25
25
  发布前分别验证后台入口、表单、数据列表、流程入口和用户端 PC/移动端入口;没有完成后台骨架的应用不得发布。
26
26
 
@@ -31,9 +31,9 @@ Agent 可以在标准后台内部优化布局、视觉和交互,但后台仍
31
31
  | 独立门户、申请或用户任务 | 按实际旅程选择 `surface: 'user'`,拥有独立布局 |
32
32
  | 确有手机使用需求的用户任务 | 独立移动 user 页面,使用 `openxiangda/mobile` 和 Field Kit |
33
33
 
34
- “自定义页面”可以直接放在标准后台内。应用只编写内容,runtime 自动套用唯一 Shell;不要因为要画图表就复制顶栏、侧栏、Router 或改成 user 页面。模板 `/home` 是独立用户页占位,不能不经页面选型就当作业务默认入口。
34
+ “自定义页面”可以直接放在标准后台内。应用编写业务内容,runtime 自动套用默认或应用提供的唯一 Shell;自定义布局使用 `ui.admin`,无需复制 Router 或改成 user 页面。模板 `/home` 是独立用户页占位,不能不经页面选型就当作业务默认入口。
35
35
 
36
- 后台菜单的分组、名称、顺序、图标由 `frontend.admin.navigation` 配置;标准视图控制字段与操作,工具栏/行/详情有动作插槽,自定义 React 内容通过 contributions 接入。当前没有整套后台 Shell 的替换接口。用户需要独立产品布局时选择 user surface,普通后台报表无需更换外壳。
36
+ 后台菜单的分组、名称、顺序、图标由 `frontend.admin.navigation` 配置;标准视图控制字段与操作,工具栏/行/详情有动作插槽,自定义 React 内容通过 contributions 接入。通过 `ui.admin.shell` 可替换整个后台外观,也可用 `header`、`sidebar`、`footer` 插槽局部扩展。后台页面仍使用 admin surface,路由与权限由平台维护。
37
37
 
38
38
  应用根路径由生成的 `routeManifest.rootEntry` 分流;`/admin` 根据当前用户可访问的显式菜单选择后台首页。交付时分别核验平台应用列表入口、根路径、后台入口和业务深链接。无后台菜单不能解释为缺少模型;没有管理后台的用户应用也不需要为了消除空状态伪造 CRUD 页面。
39
39
 
@@ -445,3 +445,29 @@ pnpm --filter @app/web build
445
445
  ## 具名工作流私有草稿
446
446
 
447
447
  普通创建能力被应用关闭时,使用 `createWorkflowFormDraftClient('contracts', { workflowCode: 'contract-approval', operationCode: 'submit-contract-approval' })`(从 `openxiangda/react` 导入)。客户端提供 `list/save/remove`,保持当前用户、环境、工作流与具名操作范围;仅支持默认 create 表单,不包含 Native submit。保存 `values` 与已声明的 `state`;正式提交仍将既有 `formDraft:{resourceCode,id,expectedRevision,mode:'create'}` 交给业务操作的 BusinessProcess 原子消费。服务端从真实业务命令核验工作流/操作,不能传任意范围冒用草稿。需先部署支持该能力与新增草稿作用域列的平台版本;不得通过增加普通 NativeCreate 或本地存储绕过拒绝。
448
+
449
+
450
+ ## 应用自定义后台壳层
451
+
452
+ `OpenXiangdaApplication` 的 `ui.admin` 允许应用定义完整后台布局,不需要隐藏平台 DOM。
453
+
454
+ ```tsx
455
+ import type { AdminShellProps } from 'openxiangda/react';
456
+ function ProductAdmin({ children, navigation, identity, title, navigate, logout, loggingOut }: AdminShellProps) {
457
+ return <div className="product-admin">
458
+ <header><strong>{title}</strong><span>{identity.subjectProfile.displayName}</span>
459
+ <button disabled={loggingOut} onClick={() => void logout()}>退出登录</button></header>
460
+ <aside>{navigation.map(group => <nav key={group.code} aria-label={group.label}>
461
+ {group.items.map(item => <button key={item.code} onClick={() => navigate(item.path)}>{item.label}</button>)}
462
+ </nav>)}</aside><main>{children}</main>
463
+ </div>;
464
+ }
465
+ // 在既有 OpenXiangdaApplication 上增加,其他契约 props 原样保留:
466
+ // ui={{ theme, admin: { shell: ProductAdmin, centerNavigation: { workflow: false, messages: false } } }}
467
+ ```
468
+
469
+ `navigation` 已按当前角色并集和读取视角过滤,`selectedPath`、`homePath`、`pathname`、`search` 来自平台 Router;请直接渲染,不保存另一份角色或菜单状态。`centers` 为可见的审批工作中心与消息中心入口;隐藏中心导航仅改变展示,不禁用能力或深链接。隐藏后应从业务页为审批人提供任务入口。
470
+
471
+ 可只提供 `header`、`sidebar` 或 `footer`(接收 `AdminShellModel`)。整体 `shell` 额外收到 `children` 与 `slots`,可复用默认部件或完全自行排版。自定义壳层接管后台资源列表、新增、详情、编辑、移动深链以及后台业务页面;标准字段、抽屉、未保存提示和授权继续由平台组件负责。登录页和用户页不受影响。组件在模块顶层声明,避免每次渲染重新创建组件类型导致表单重挂载。
472
+
473
+ 无 `ui.admin` 时沿用默认后台。扩展不能越过 `adminAccess`、页面能力或 Data API 记录权限;不能自行创建第二个 Router、认证会话或数据权限状态。验收应覆盖应用入口、刷新深链、无权角色、PC/移动、键盘和壳层异常恢复。
@@ -68,10 +68,10 @@ MCP 服务随项目根包一起安装,AI 客户端的 stdio 连接仍需配置
68
68
  以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
69
69
 
70
70
  ```bash
71
- pnpm dlx openxiangda@2.31.8 skill install --force
72
- pnpm dlx openxiangda@2.31.8 auth status --base-url <平台地址> --json
73
- pnpm dlx openxiangda@2.31.8 login --cwd my-app --base-url https://platform.example.com
74
- pnpm dlx openxiangda@2.31.8 create my-app --base-url https://platform.example.com
71
+ pnpm dlx openxiangda@2.32.0 skill install --force
72
+ pnpm dlx openxiangda@2.32.0 auth status --base-url <平台地址> --json
73
+ pnpm dlx openxiangda@2.32.0 login --cwd my-app --base-url https://platform.example.com
74
+ pnpm dlx openxiangda@2.32.0 create my-app --base-url https://platform.example.com
75
75
  cd my-app
76
76
  pnpm openxiangda context --json
77
77
  pnpm openxiangda dev
@@ -174,9 +174,9 @@ MCP 的 `docs_read` 可以读取本说明,当前没有独立的源码操作 MC
174
174
  无需本地工作区,使用本 Skill 随包精确版本或已安装的对应 CLI:
175
175
 
176
176
  ```bash
177
- pnpm dlx openxiangda@2.31.8 auth status --base-url <平台> --json
178
- pnpm dlx openxiangda@2.31.8 source resolve <仓库URL> --base-url <平台> --json
179
- pnpm dlx openxiangda@2.31.8 source clone <仓库URL> <新目录> --base-url <平台> --json
177
+ pnpm dlx openxiangda@2.32.0 auth status --base-url <平台> --json
178
+ pnpm dlx openxiangda@2.32.0 source resolve <仓库URL> --base-url <平台> --json
179
+ pnpm dlx openxiangda@2.32.0 source clone <仓库URL> <新目录> --base-url <平台> --json
180
180
  ```
181
181
 
182
182
  登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回