openxiangda 2.20.4 → 2.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/bin/distribution/launcher.js +1 -2
  2. package/documentation/AGENTS.md +2 -2
  3. package/documentation/appspec.md +8 -1
  4. package/documentation/backend.md +38 -0
  5. package/documentation/data-authz.md +35 -0
  6. package/documentation/declarations-cheatsheet.md +7 -1
  7. package/documentation/design-workflow.md +90 -74
  8. package/documentation/development.md +3 -3
  9. package/documentation/frontend.md +11 -4
  10. package/documentation/getting-started.md +41 -9
  11. package/documentation/manifest.json +17 -29
  12. package/documentation/product-design.md +1 -1
  13. package/documentation/public-access.md +16 -6
  14. package/documentation/reference/cli.md +3 -1
  15. package/documentation/reference/mcp.md +12 -6
  16. package/documentation/testing.md +2 -0
  17. package/documentation/upgrading.md +1 -1
  18. package/documentation/workflow-events.md +42 -0
  19. package/package.json +23 -17
  20. package/releases/2.0.0.json +50 -0
  21. package/releases/2.0.1.json +39 -0
  22. package/releases/2.1.0.json +44 -0
  23. package/releases/2.1.1.json +48 -0
  24. package/releases/2.10.0.json +42 -0
  25. package/releases/2.11.0.json +41 -0
  26. package/releases/2.12.0.json +38 -0
  27. package/releases/2.13.0.json +41 -0
  28. package/releases/2.13.1.json +33 -0
  29. package/releases/2.13.2.json +31 -0
  30. package/releases/2.14.0.json +41 -0
  31. package/releases/2.15.0.json +40 -0
  32. package/releases/2.16.0.json +41 -0
  33. package/releases/2.17.0.json +39 -0
  34. package/releases/2.17.1.json +34 -0
  35. package/releases/2.18.0.json +37 -0
  36. package/releases/2.18.1.json +31 -0
  37. package/releases/2.18.10.json +29 -0
  38. package/releases/2.18.2.json +30 -0
  39. package/releases/2.18.3.json +30 -0
  40. package/releases/2.18.9.json +37 -0
  41. package/releases/2.19.0.json +38 -0
  42. package/releases/2.2.0.json +48 -0
  43. package/releases/2.2.1.json +35 -0
  44. package/releases/2.2.2.json +34 -0
  45. package/releases/2.20.0.json +36 -0
  46. package/releases/2.21.0.json +35 -0
  47. package/releases/2.21.1.json +36 -0
  48. package/releases/2.3.0.json +37 -0
  49. package/releases/2.4.0.json +37 -0
  50. package/releases/2.4.1.json +35 -0
  51. package/releases/2.5.0.json +37 -0
  52. package/releases/2.6.0.json +37 -0
  53. package/releases/2.7.0.json +37 -0
  54. package/releases/2.7.1.json +31 -0
  55. package/releases/2.8.0.json +32 -0
  56. package/releases/2.8.1.json +30 -0
  57. package/releases/2.9.0.json +33 -0
  58. package/releases/2.9.1.json +31 -0
  59. package/releases/2.9.2.json +33 -0
  60. package/releases/2.9.3.json +31 -0
  61. package/releases/2.9.4.json +37 -0
  62. package/skills/manifest.json +2 -2
  63. package/skills/openxiangda-v2/SKILL.md +15 -15
  64. package/skills/openxiangda-v2/references/appspec.md +8 -1
  65. package/skills/openxiangda-v2/references/backend.md +38 -0
  66. package/skills/openxiangda-v2/references/cli.md +3 -1
  67. package/skills/openxiangda-v2/references/data-authz.md +35 -0
  68. package/skills/openxiangda-v2/references/declarations-cheatsheet.md +7 -1
  69. package/skills/openxiangda-v2/references/design-workflow.md +90 -74
  70. package/skills/openxiangda-v2/references/development.md +3 -3
  71. package/skills/openxiangda-v2/references/frontend.md +11 -4
  72. package/skills/openxiangda-v2/references/getting-started.md +41 -9
  73. package/skills/openxiangda-v2/references/mcp.md +12 -6
  74. package/skills/openxiangda-v2/references/product-design.md +1 -1
  75. package/skills/openxiangda-v2/references/public-access.md +16 -6
  76. package/skills/openxiangda-v2/references/testing.md +2 -0
  77. package/skills/openxiangda-v2/references/upgrading.md +1 -1
  78. package/skills/openxiangda-v2/references/workflow-events.md +42 -0
  79. package/documentation/design-craft.md +0 -1526
  80. package/documentation/opendesign-methods.md +0 -756
  81. package/releases/2.20.2.json +0 -30
  82. package/releases/2.20.3.json +0 -29
  83. package/skills/openxiangda-v2/references/design-craft.md +0 -1526
  84. package/skills/openxiangda-v2/references/opendesign-methods.md +0 -756
@@ -0,0 +1,30 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.8.1",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.8.1:修复审计权限能力引用",
6
+ "summary": "审计读取策略正确复用已有能力,保留原能力定义,并拒绝缺失引用。",
7
+ "newFeatures": [],
8
+ "fixes": [
9
+ "修复 audit.read 引用已有管理能力时错误报告 catalog owner 冲突的问题。",
10
+ "本地与平台编译器一致地保留能力原定义;审计策略不再自动补建未声明能力,跨资源引用不依赖资源排序。"
11
+ ],
12
+ "affectedUsers": [
13
+ "使用 audit.read 能力数组控制审计信息的应用开发者。"
14
+ ],
15
+ "upgradeSteps": [
16
+ "平台采用 openxiangda-contracts 2.6.1 后,应用升级到 openxiangda 2.8.1 并重新生成和检查。",
17
+ "audit.read 引用现有应用能力;独立审计能力须先在 authz.capabilities 声明并按需授予角色。"
18
+ ],
19
+ "knownLimitations": [
20
+ "省略 audit 保留原有读取行为,能力数组保持 all-of 与同一角色成员字段和行授权规则。",
21
+ "受限应用启用后仍须保留支持 data.audit-read-access 的兼容平台组合。"
22
+ ],
23
+ "compatibility": {
24
+ "node": ">=24",
25
+ "platform": "openxiangda-contracts 2.6.1 与 data.audit-read-access 1.0.0"
26
+ },
27
+ "issues": [],
28
+ "sha256": "354f1883a5cbd7d5bcf32d94fbabbb4ec362df5abecec99ed78e2d687dff94b7",
29
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.8.1"
30
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.9.0",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.9.0:声明标准列表导入导出入口",
6
+ "summary": "应用可按默认或命名视图配置标准列表的导入、导出任务,PC 与移动端使用相同声明。",
7
+ "newFeatures": [
8
+ "crud[].list.actions 支持 import 与 export 布尔开关,直接资源声明同样支持。",
9
+ "关闭导入适用于原生与流程列表;关闭导出同时覆盖 PC 和移动列表。"
10
+ ],
11
+ "fixes": [
12
+ "应用可通过公开配置移除首发范围之外的列表任务,无需修改共享组件或使用 CSS 隐藏。"
13
+ ],
14
+ "affectedUsers": [
15
+ "使用标准 CRUD 默认或命名视图,需要控制导入导出入口的 V2 应用开发者。"
16
+ ],
17
+ "upgradeSteps": [
18
+ "平台采用 openxiangda-contracts 2.7.0,应用采用 openxiangda 2.9.0 后重新生成和检查。",
19
+ "在目标视图的 list.actions 中将不需要的入口设为 false,再部署测试候选并验证 PC/移动页面。"
20
+ ],
21
+ "knownLimitations": [
22
+ "省略开关保持既有行为;true 不授予权限,也不改变原生、流程或只读写入归属。",
23
+ "这是页面入口配置,Data API 和敏感字段仍按原有授权规则执行。",
24
+ "命名视图各自声明开关,不继承默认视图的任务选择;无需新增数据库迁移。"
25
+ ],
26
+ "compatibility": {
27
+ "node": ">=24",
28
+ "platform": "openxiangda-contracts 2.7.0"
29
+ },
30
+ "issues": [],
31
+ "sha256": "c9d413f52c85a7ca1ee5e113ca72d9284efd303b3a99dc8ba71ae35cf7526783",
32
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.9.0"
33
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.9.1",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.9.1:保留显式查询操作数与路径",
6
+ "summary": "修复标准客户端将成员包含查询的单值改成数组,导致合法查询返回400的问题。",
7
+ "newFeatures": [],
8
+ "fixes": [
9
+ "has操作保持单个稳定标识;in、between、hasAny、hasAll保留数组全部值,不再复用快捷筛选推断操作数形状。",
10
+ "显式查询path保持原值路径;单项快照和级联控件选择仍转为稳定查询值。",
11
+ "列表、批量列表和导出使用相同修正,应用无需修改正确的DataWhere条件。"
12
+ ],
13
+ "affectedUsers": [
14
+ "使用openxiangda/core显式where成员筛选、数组操作或子值路径查询的V2应用。"
15
+ ],
16
+ "upgradeSteps": [
17
+ "将应用的公开openxiangda依赖升级到2.9.1,重新检查并发布测试候选。",
18
+ "复测参与人归属、数组区间筛选及导出;生产晋级复用验收通过的原测试制品。"
19
+ ],
20
+ "knownLimitations": [
21
+ "快捷filters的既有界面语义不变;字段类型、行权限与查询边界仍由平台Data API验证。",
22
+ "本补丁不改变业务数据、权限或数据库结构;新增CRUD列表开关仍需平台采用contracts2.7.0。"
23
+ ],
24
+ "compatibility": {
25
+ "node": ">=24",
26
+ "platform": "openxiangda-contracts 2.7.0"
27
+ },
28
+ "issues": [],
29
+ "sha256": "2cfb20fed9921fc7281f36970f9ba534192fe0eacafb55223e3031587b27f6c7",
30
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.9.1"
31
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.9.2",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.9.2:查询操作数修正与模板版本联动",
6
+ "summary": "修复标准客户端将成员包含查询的单值改成数组导致400的问题,并补齐根包和CLI模板的发布版本联动。",
7
+ "newFeatures": [],
8
+ "fixes": [
9
+ "has操作保持单个稳定标识;in、between、hasAny、hasAll保留数组全部值,不再复用快捷筛选推断操作数形状。",
10
+ "显式查询path保持原值路径;单项快照和级联控件选择仍转为稳定查询值。",
11
+ "列表、批量列表和导出使用相同修正,应用无需修改正确的DataWhere条件。",
12
+ "发布版本规划在写入版本前拒绝缺少CLI配套Changeset的根包升级,避免模板变更到不可变包检查阶段才被发现。"
13
+ ],
14
+ "affectedUsers": [
15
+ "使用openxiangda/core显式where成员筛选、数组操作或子值路径查询的V2应用。"
16
+ ],
17
+ "upgradeSteps": [
18
+ "将应用的公开openxiangda依赖升级到2.9.2,重新检查并发布测试候选。",
19
+ "复测参与人归属、数组区间筛选及导出;生产晋级复用验收通过的原测试制品。"
20
+ ],
21
+ "knownLimitations": [
22
+ "快捷filters的既有界面语义不变;字段类型、行权限与查询边界仍由平台Data API验证。",
23
+ "本补丁不改变业务数据、权限或数据库结构;新增CRUD列表开关仍需平台采用contracts2.7.0。",
24
+ "2.9.1仅为被发布门禁拦截的未发布候选;其查询修正随2.9.2正式交付。"
25
+ ],
26
+ "compatibility": {
27
+ "node": ">=24",
28
+ "platform": "openxiangda-contracts 2.7.0"
29
+ },
30
+ "issues": [],
31
+ "sha256": "9989af7b2e2b9e5eaf81bf19b1307366a35b07522082b384918882f8db05d61c",
32
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.9.2"
33
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.9.3",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.9.3:明确记录用户授权的性能延期",
6
+ "summary": "修复功能验收完成但用户已延期性能时无法正式晋级的问题,保留原测量并明确区分性能通过与延期。",
7
+ "newFeatures": [],
8
+ "fixes": [
9
+ "AppSpec验收报告支持有授权人、实际时间、来源、证据及后续安排的performanceDeferral。",
10
+ "延期时保留真实超标测量,返回deferred与overBudget统计,生产阶段明确显示性能未通过。",
11
+ "没有授权延期时仍要求性能测量达标;延期不豁免功能AC、证据、原测试版本和制品绑定。"
12
+ ],
13
+ "affectedUsers": [
14
+ "已由用户明确延期性能验收、需要按实际范围完成V2功能交付的应用开发者。"
15
+ ],
16
+ "upgradeSteps": [
17
+ "更新项目的openxiangda依赖至2.9.3并刷新项目技能;已有测试制品可以沿用,不因验收工具升级而重建。",
18
+ "依据实际用户决定填写延期记录,保留成功与失败测量;正式spec verify后提交推送报告,用原TEST运行晋级。"
19
+ ],
20
+ "knownLimitations": [
21
+ "结构验证不证明授权或证据内容真实;不得制造用户确认、提高阈值或仅保留成功样本。",
22
+ "本次仅修复开发交付记录契约,不修复性能,也不修改平台后端、业务数据或运行时权限。"
23
+ ],
24
+ "compatibility": {
25
+ "node": ">=24",
26
+ "platform": "沿用openxiangda-contracts 2.7.0,无新增平台能力要求"
27
+ },
28
+ "issues": [],
29
+ "sha256": "aea11cf79206afaae7d6a98eb72506bd71f13752ca6178e459d5395cde4b10a8",
30
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.9.3"
31
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.9.4",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.9.4:DingTalk OA 工作通知 SDK",
6
+ "summary": "应用通过平台托管的 Notification Hub 发送文本或 Markdown 钉钉 OA 工作通知,并查询投递结果。",
7
+ "newFeatures": [
8
+ "Nest SDK 增加 sendDingTalkWorkNotice 和 getDingTalkWorkNoticeResult。",
9
+ "工作通知支持按 Native 用户、部门或全员发送,平台负责渠道凭据、Native 标识映射、幂等、投递和审计。"
10
+ ],
11
+ "fixes": [],
12
+ "affectedUsers": [
13
+ "需要从 OpenXiangda 2.0 应用发送钉钉文本或 Markdown 工作通知的开发者。"
14
+ ],
15
+ "compatibility": {
16
+ "node": ">=24",
17
+ "workspaceGenerations": [
18
+ "v1",
19
+ "v2"
20
+ ],
21
+ "v1Policy": "V1 引擎和已有应用不变。",
22
+ "platformPolicy": "需要部署包含 Notification Hub DingTalk OA 工作通知接口的匹配平台组合,并配置已启用的 OA 渠道。",
23
+ "releaseChannels": "latest / stable-v2:V2 正式版;legacy-v1:V1 维护版;alpha:预发布。"
24
+ },
25
+ "upgradeSteps": [
26
+ "平台先部署匹配的 Notification Hub 服务并确认 DingTalk OA 渠道和 Secret 引用可用。",
27
+ "将应用的 openxiangda 依赖升级到 2.9.4,更新锁文件并通过标准检查。",
28
+ "在测试环境验证用户、部门和全员目标的发送回执,再使用同一候选晋级生产。"
29
+ ],
30
+ "knownLimitations": [
31
+ "首版内容类型为 text 和 markdown;钉钉最终接收结果仍以平台投递记录和钉钉响应为准。",
32
+ "发布包、平台部署和真实业务角色验收分别验证;本版本不自动配置渠道 Secret。"
33
+ ],
34
+ "issues": [],
35
+ "sha256": "6383173f0e6bd4596286e95453fd651d07eb8d91948e829dcd1fe3dfbab1f485",
36
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.9.4"
37
+ }
@@ -3,8 +3,8 @@
3
3
  "skills": [
4
4
  {
5
5
  "name": "openxiangda-v2",
6
- "description": "使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具体变更出发,通过对话发现模块、完成详细产品设计,由 AI 在工作区内调用 OpenDesign 原版 CLI/Skill/MCP 形成整体视觉与可运行原型,再开发、检查和交付应用。OpenDesign 客户端只作为可选预览器;维护 1.x 应用时使用对应的 1.x 技能。",
7
- "sha256": "01cad9ea9d2ffff598fc6f213a180dfea95b790e577df6ba6b131d87d0076434"
6
+ "description": "使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具体变更出发,通过对话发现模块、完成详细产品设计,由当前 AI Agent 按需用 Image 2.5 等图片能力形成视觉参考,直接实现真实页面并在浏览器修正,再检查和交付应用;维护 1.x 应用时使用对应的 1.x 技能。",
7
+ "sha256": "da8d59598a9fbd9217f7df8e730e9dafa32716144676b29d669c8022bef4070b"
8
8
  }
9
9
  ]
10
10
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: openxiangda-v2
3
- description: 使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具体变更出发,通过对话发现模块、完成详细产品设计,由 AI 在工作区内调用 OpenDesign 原版 CLI/Skill/MCP 形成整体视觉与可运行原型,再开发、检查和交付应用。OpenDesign 客户端只作为可选预览器;维护 1.x 应用时使用对应的 1.x 技能。
3
+ description: 使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具体变更出发,通过对话发现模块、完成详细产品设计,由当前 AI Agent 按需用 Image 2.5 等图片能力形成视觉参考,直接实现真实页面并在浏览器修正,再检查和交付应用;维护 1.x 应用时使用对应的 1.x 技能。
4
4
  ---
5
5
 
6
6
  # OpenXiangda 2.0
@@ -9,7 +9,7 @@ description: 使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具
9
9
 
10
10
  每个业务应用默认先建立并保留标准管理后台。管理后台是应用骨架,承载资源模型、表单、数据列表、详情/编辑、权限和流程入口;AI 必须先从后台完成数据与契约,再实现用户端体验。不得因为制作用户端首页而删除、隐藏或替换后台 Shell、后台路由或显式菜单。
11
11
 
12
- OpenDesign 按页面归属使用:后台页面可以用 OpenDesign 优化布局、视觉和交互,但必须复用平台后台 Shell、导航、字段行为和权限;用户端 PC 与移动端可以分别使用 OpenDesign 的完整视觉和交互,并通过平台 runtime/Data API 读取后台数据。不得用单页 HTML、iframe 或独立假后台冒充管理后台,也不得在用户端复制后台权限和导航状态。
12
+ Agent 按页面归属优化布局、视觉和交互:后台必须复用平台 Shell、导航、字段行为和权限;用户端 PC 与移动端按真实任务分别设计,并通过平台 runtime/Data API 读取后台数据。图片参考不定义交互、权限或验收。不得用图片、单页 HTML、iframe 或独立假后台冒充管理后台,也不得在用户端复制后台权限和导航状态。
13
13
 
14
14
  设计、实现和发布验收必须分别核验管理后台入口、表单、数据列表、流程入口,以及用户端 PC/移动端入口。缺少标准管理后台的应用结构不完整,不能发布。
15
15
 
@@ -21,29 +21,29 @@ OpenDesign 按页面归属使用:后台页面可以用 OpenDesign 优化布局
21
21
 
22
22
  遇到已有 V1 项目时,先核实 V2 能力覆盖、项目是否仍在测试阶段和迁移成本;能力满足、仍在测试阶段且代价可控时,优先建议转用 V2。先做只读评估,再按项目确认详细设计、数据/流程映射、测试和回滚;迁移实施前的原项目维护仍使用匹配的 V1 引擎。
23
23
 
24
- 有界面影响的开发和改版默认读[OpenDesign 工作流](references/design-workflow.md),由 AI 在当前 OpenXiangda 工作区读取相关 Skill,并通过 `openxiangda design cli` 或原版 stdio MCP 自动完成设计方向、原型、lint、修正和产物交接;不要求用户打开或操作 OpenDesign 客户端。客户端只用于用户主动查看或人工预览。随包方法仅作离线参考,保留字段与权限行为,旧默认皮肤或设备偏好可按任务重新设计。设计与原型资源使用 AppSpec assets 固定;不把结构检查或示例数据当成实际验收。
24
+ 有界面影响的开发和改版默认读[Agent 原生设计工作流](references/design-workflow.md),由当前 AI 在同一个 OpenXiangda 工作区确定视觉方向、直接实现真实页面并在浏览器修正。需要建立新方向时,按需使用用户指定或当前可用的图片生成能力(例如 Image 2.5)形成少量参考;图片不可用或质量不足时直接使用设计约束、成熟组件和浏览器迭代继续开发。保留字段与权限行为,旧默认皮肤或设备偏好可按任务重新设计。实际采用的参考图、token 和必要原型使用 AppSpec assets 固定;不把图片、结构检查或示例数据当成实际验收。
25
25
 
26
26
  ## AI 自动设计与开发
27
27
 
28
- AI 接到新应用、页面或改版任务时,在同一个 OpenXiangda 工作区内执行以下闭环,不把设计任务转交给用户操作客户端:
28
+ AI 接到新应用、页面或改版任务时,在同一个 OpenXiangda 工作区内执行以下闭环,不建立第二个设计项目或把实现转交给用户:
29
29
 
30
- 1. 读取本 Skill、`references/design-workflow.md` 和任务相关的 OpenDesign Skill;从当前 AppSpec、平台契约和用户材料确定页面、角色、设备与验收目标。
31
- 2. `openxiangda design cli` 查询原版方向、模板、设计系统和插件;需要持续会话时启动 `openxiangda design cli mcp`,把原版设计工具接入当前 AI Agent。所有 CLI 参数、JSON、标准输入输出和取消都由原版处理。
32
- 3. 在任务工作区创建或复用原版项目,向原版 Agent 提交任务上下文,生成可运行原型;AI 自己读取文件、运行 lint/预览检查并按结果修正。
33
- 4. 将本轮实际采用的设计文件、token、原型和来源版本复制或导出到 `appspec/design`,然后继续生成 OpenXiangda 页面、字段和业务实现。设计产物与应用源码属于同一变更链,不要求用户在客户端中搬运文件。
34
- 5. 运行本项目的 check、浏览器和真实角色验收;只有实际证据通过后才进入部署流程。原型、示例数据或客户端截图不能替代业务验收。
30
+ 1. 读取本 Skill 和 `references/design-workflow.md`,从当前 AppSpec、平台契约和用户材料确定页面、角色、设备、状态与验收目标。
31
+ 2. 已有设计足够时直接沿用;需要新视觉方向时,用 Image 2.5 等当前图片能力生成一至三个关键视图,筛选后只固定实际采用的参考。图片中不得包含秘密、真实个人数据或未授权素材。
32
+ 3. 从参考和产品约束提取布局、排版、颜色、间距与组件关系,直接使用真实 React、平台 Shell、Field Kit 和受支持组件实现;不逐像素照抄伪文字、虚构控件或图片中的错误交互。
33
+ 4. 在目标视口打开真实页面,操作空、加载、失败、拒绝、校验、提交、恢复、未保存输入、键盘与响应式路径,依据截图和交互发现修正代码。图片和 Agent 自评不能替代浏览器断言。
34
+ 5. 将本轮实际采用的参考图、设计说明、token 和必要原型记录到 `appspec/design`,运行本项目的 check、浏览器和真实角色验收;只有实际证据通过后才进入部署流程。
35
35
 
36
- 如果原版 CLI 或 MCP 不可用,保留真实错误并停止依赖原版的设计步骤;可以继续不依赖设计运行时的只读分析,但不能伪造设计产物或把离线参考当成原版执行结果。
36
+ 图片能力不可用、失败或结果不合格时,记录事实并继续直接实现和浏览器迭代;不能伪造设计产物或通过结果。静态图不拥有应用结构、交互、权限、数据或验收事实。
37
37
 
38
38
  ## 定位当前版本
39
39
 
40
40
  未创建工作区时使用本 Skill 随根包发布的精确版本:
41
41
 
42
42
  ```bash
43
- pnpm dlx openxiangda@2.20.4 auth status --cwd <应用目录> --base-url <平台地址> --json
44
- pnpm dlx openxiangda@2.20.4 login --cwd <应用目录> --base-url <平台地址>
45
- pnpm dlx openxiangda@2.20.4 create <应用目录> --base-url <同一平台地址>
46
- pnpm dlx openxiangda@2.20.4 skill install --force
43
+ pnpm dlx openxiangda@2.21.1 auth status --cwd <应用目录> --base-url <平台地址> --json
44
+ pnpm dlx openxiangda@2.21.1 login --cwd <应用目录> --base-url <平台地址>
45
+ pnpm dlx openxiangda@2.21.1 create <应用目录> --base-url <同一平台地址>
46
+ pnpm dlx openxiangda@2.21.1 skill install --force
47
47
  ```
48
48
 
49
49
  创建前把产品要求的目标平台明确带入命令,不从旧登录态推断站点。已有工作区从原绑定恢复,平台不一致时先解决登录与目标,不改 link 文件跨站创建。
@@ -61,7 +61,7 @@ pnpm dlx openxiangda@2.20.4 skill install --force
61
61
  | 安装、登录、创建、连接开发 | [开始开发](references/getting-started.md) |
62
62
  | 源码仓库、换电脑、旧项目导入、提交推送与重试 | [应用源码](references/getting-started.md#应用源码);先用 `source status` 读取实际绑定 |
63
63
  | 模糊想法、模块发现、PRD、权限与架构设计 | [产品设计](references/product-design.md)、[交互模式](references/interaction-patterns.md) |
64
- | 界面设计、改版、原型和视觉修正 | 先读[设计工作流](references/design-workflow.md),使用 `openxiangda design open` 和 `design cli` 调用原版;[离线方法](references/opendesign-methods.md)与[设计 Craft](references/design-craft.md)仅作补充 |
64
+ | 界面设计、改版、原型和视觉修正 | 先读[Agent 原生设计工作流](references/design-workflow.md),按需用 Image 2.5 等当前图片能力生成参考,直接实现真实页面并完成浏览器闭环 |
65
65
  | 理解需求与选择能力 | [开发流程](references/development.md)、[架构](references/concepts.md) |
66
66
  | 写 openxiangda.config.ts 声明、避免首轮校验返工 | [声明速查](references/declarations-cheatsheet.md);先扫规则表再动手 |
67
67
  | 模型、CRUD、字段与移动表单 | [业务模块](references/application-foundation.md)、[字段](references/field-components.md) |
@@ -36,11 +36,18 @@ appspec/
36
36
  ```bash
37
37
  pnpm openxiangda spec init
38
38
  pnpm openxiangda spec new booking-window --title "限制可预约时段" --risk L2
39
+ pnpm openxiangda spec add-capability CAP-REPAIR-REQUEST --title "报修申请能力" --resources repair-requests
39
40
  pnpm openxiangda spec context booking-window --json
40
41
  pnpm openxiangda spec check
41
42
  ```
42
43
 
43
- 已有工作区优先用 `spec new` 生成本地记录。访谈尚未创建应用时,可在 `appspec/changes/active/<变更ID>.md` 手工建草稿:front matter 使用 `schema: openxiangda.appspec/change/v1`、与文件名一致的 `id`、`title`、`status: draft`、`currentSpec: pending`、适用的 `risk`,以及 `documents: [实际评审ID]`。不必为整理设计先创建远端应用。
44
+ 已有工作区优先用 `spec new` 生成本地记录。跨变更复用的能力规格用
45
+ `spec add-capability <CAP-*> --title <名称>` 单独建立(可带 `--resources`/`--actions`
46
+ 逗号分隔引用),排他创建 `appspec/capabilities/` 下的规格文件,绝不覆盖同名文件;
47
+ ChangeSpec 通过 `capabilities` 引用这些 CAP-* 规格。访谈尚未创建应用时,可在
48
+ `appspec/changes/active/<变更ID>.md` 手工建草稿:front matter 使用
49
+ `schema: openxiangda.appspec/change/v1`、与文件名一致的 `id`、`title`、`status: draft`、
50
+ `currentSpec: pending`、适用的 `risk`,以及 `documents: [实际评审ID]`。不必为整理设计先创建远端应用。
44
51
 
45
52
  | 阶段或风险 | ChangeSpec 必需正文 |
46
53
  | --- | --- |
@@ -189,6 +189,44 @@ await businessData.transaction({
189
189
  分派已接受后撤销角色,不会自动撤销历史分派;后续处理动作必须重新验证当前权限,
190
190
  由管理员重新分派。此规则应写入 AppSpec,并实测撤销先发生和分派先发生两种顺序。
191
191
 
192
+ ## AI 能力目录与 MCP Facade {#ai-catalog}
193
+
194
+ 编译器为每个应用生成不可变的 AI 能力目录:资源的标准 CRUD 面(query/get/create/update/delete,
195
+ 按 `generated` 与 `mutationOwner` 实际开放的操作)自动成为 `generatedCrud` 能力;`backend.operations[]`
196
+ 中带 `ai` 声明的操作成为 `customAction` 能力。目录摘要(`aiCatalogDigest`)随当前声明生成并进入契约;
197
+ 平台 `GET .../native/ai/catalog` 按当前用户角色与字段权限裁剪后返回。为操作声明 `ai` 即把它加入目录:
198
+
199
+ ```ts
200
+ operations: [{
201
+ code: 'dispatch-repair', method: 'POST', path: '/dispatch', capability: dispatchCapability,
202
+ ai: {
203
+ name: '受理派单', description: '把报修单派给指定技师并写入派工记录',
204
+ risk: 'write', resources: ['repair-requests'],
205
+ sideEffects: ['更新报修单状态为处理中', '写入一条派工记录'],
206
+ },
207
+ }],
208
+ ```
209
+
210
+ `ai` 的规则:`name` 与 `description` 必填;`risk` 取 `read | write | destructive | external`,
211
+ `read` 等价于 `method: 'GET'`,DELETE 方法只能是 `destructive` 或 `external`;`resources`
212
+ 引用 1–16 个已声明资源;`sideEffects` 最多 20 条——只读必须为零,写操作至少一条具体副作用;
213
+ `concurrency` 可选 `none | revision`,`timeoutMs` 限 100–30000。
214
+
215
+ 宿主(平台 AI 网关)用该目录装配 MCP Facade,应用不自己实现协议:
216
+
217
+ - **单应用 Facade**(`createApplicationAiMcpServer`):每个能力一个工具,只读能力直接以
218
+ `capability.code` 命名执行;写能力命名为 `capability.code + '.preview'`,只生成预览不落库;
219
+ 存在写能力时额外提供 `openxiangda.ai.confirm`(入参 `previewId`),在用户明确确认预览摘要后
220
+ 由宿主重新校验身份、权限、版本和幂等性再执行。目录本体通过资源 `openxiangda://ai/catalog`
221
+ 读取。
222
+ - **平台聚合 Facade**(`createAggregatedAiMcpServer`):跨应用统一工具面
223
+ `apps.search`、`resources.describe`、`records.query`、`records.get`、`records.create`、
224
+ `records.update`、`records.delete`、`actions.invoke`、`mutations.confirm`;聚合器只把工具
225
+ 路由到所属应用的执行器,不合并权限、不产生第二个数据或授权边界。
226
+
227
+ 这套 Facade 服务平台侧 AI 入口,与应用工作区开发用的 MCP(见[MCP 参考](mcp.md))
228
+ 是两组互不重叠的工具。
229
+
192
230
  ## 启动与依赖注入 {#bootstrap}
193
231
 
194
232
  ```ts
@@ -7,7 +7,6 @@
7
7
  | `pnpm openxiangda auth` | 只读 | 只读核验指定平台授权,不登录或刷新会话 |
8
8
  | `pnpm openxiangda context` | 只读 | 只读查看工作区、版本与平台绑定 |
9
9
  | `pnpm openxiangda docs` | 只读 | 按主题和章节读取当前版本中文资料 |
10
- | `pnpm openxiangda design` | 远端变更 | 打开 OpenDesign 原版并透传完整原生 CLI;写入范围由原生命令决定 |
11
10
  | `pnpm openxiangda admin` | 只读 | 只读查看应用管理能力和流程节点运行配置 |
12
11
  | `pnpm openxiangda create` | 远端变更 | 创建、绑定并初始化应用 |
13
12
  | `pnpm openxiangda source` | 远端变更 | 配置应用源码仓库、查看状态或提交推送 |
@@ -23,7 +22,10 @@
23
22
  | `pnpm openxiangda stop` | 远端变更 | 将应用环境缩容为零并保留数据 |
24
23
  | `pnpm openxiangda rollback` | 远端变更 | 回滚测试或生产环境 |
25
24
  | `pnpm openxiangda login` | 本地写入 | 通过平台浏览器授权登录 |
25
+ | `pnpm openxiangda link` | 本地写入 | 查看平台绑定或显式换绑到其他站点 |
26
26
  | `pnpm openxiangda skill` | 本地写入 | 安装当前版本的 AI Skill |
27
27
  | `pnpm openxiangda spec` | 本地写入 | 维护需求、设计、变更与业务验收记录 |
28
28
 
29
29
  只验证时运行 check;部署测试环境时直接运行 deploy,它已包含检查、测试和构建。生产使用 deploy --environment production --from <测试运行ID>;加 --dry-run 只读预览。登录、创建和长期 dev 进程由 CLI 管理。
30
+
31
+ 上表为项目工作区的 Devkit 命令。统一入口在转发给引擎之前还自带 `version`、`update check|install`、`changelog`、`migrate assess` 和 `support status|bootstrap|login|join`,分别用于版本诊断、工具链升级、变更日志、V1 项目迁移评估和支持通道授权;它们不属于 Devkit 注册表,用法与示例见「开始开发」主题(getting-started)。
@@ -29,6 +29,41 @@ pnpm openxiangda check
29
29
 
30
30
  角色成员、维度授权和平台管理员由平台管理面维护,不属于应用开发 CLI。
31
31
 
32
+ ### 授权来源声明
33
+
34
+ 应用可以在 `authz` 中声明四类授权来源,让平台从业务数据投影出维度授权、应用角色成员和
35
+ 行级关系授权;投影事实由平台物化并按当前配置重算,应用不维护第二份权限状态。各声明的
36
+ `userIdField` 等字段路径支持 `field`、`field.value` 和 `field.snapshot.<子字段>` 投影形式。
37
+
38
+ - `scopeDimensions`:`{ code, name, resourceCode?, valueType?: 'string'|'uuid',
39
+ hierarchyMode?: 'flat'|'self_parent', valueSource?: { kind: 'native_resource',
40
+ resourceCode, labelField, enabledField? } }`。定义数据范围的取值域;`valueSource` 把
41
+ Native 资源绑定取值来源,选择器只展示平台按当前 membership 与 create/update 闭包返回的
42
+ 值;`self_parent` 表示取值记录通过父引用形成层级。
43
+ - `scopeSources`:`{ code, name, resourceCode, subject, grants, operationField?,
44
+ enabledField?, effectiveFromField?, effectiveToField?, failureMode }`。从业务资源行投影
45
+ 维度授权:`subject` 为 `{ type: 'user', userIdField }` 或
46
+ `{ type: 'role_membership', userIdField, roleCode }`,`grants: [{ dimensionCode,
47
+ valueField, parentValueField? }]` 把行字段值授为对应维度;生效窗口和启用开关由字段控制;
48
+ `failureMode: 'strict'` 投影失败即判定失败,`'last_known_good'` 在源数据暂不可读时沿用
49
+ 最近一次成功投影。
50
+ - `roleMembershipSources`:`{ code, name, resourceCode, userIdField, roleCode,
51
+ enabledField?, effectiveFromField?, effectiveToField?, failureMode: 'strict' }`。从业务
52
+ 数据行授予应用角色,例如"成员表"一行代表某人拥有某角色。
53
+ - `relationshipGrantSources`:`{ code, name, resourceCode, subject, relationCode,
54
+ targetResourceCode, resourceIdField, operations, enabledField?, effectiveFromField?,
55
+ effectiveToField?, failureMode: 'strict' }`。通过业务关系授予目标资源上指定操作
56
+ (1–20 个)的行级授权,例如"订单负责人可更新该订单"。
57
+
58
+ `authorizationTransitions: [{ fromAuthzDigest, removeRoleCodes?,
59
+ removeCapabilityCodes?, reason }]` 记录授权合同的关键收缩:从 `fromAuthzDigest`
60
+ (64 位十六进制)标识的授权版本移除角色或能力时,必须逐条声明并给出原因,平台在两个授权
61
+ 修订之间核对覆盖情况后才放行发布;它不用于新增授权。
62
+
63
+ `authz.capabilities` 的完整形状是 `{ code, kind: 'backend' | 'ui', name, description? }`;
64
+ `kind: 'ui'` 声明页面级能力,`kind: 'backend'` 声明后端操作能力并配合
65
+ [按需后端](backend.md)的 `platformAccess` 使用。
66
+
32
67
  自定义 PC/移动页面需要维护当前应用角色时,使用
33
68
  `openxiangda/core` 的 `loadRoleManagementCatalog`、
34
69
  `listRoleMemberships`、`searchRoleManagementUsers`、成员 mutation 与
@@ -41,6 +41,10 @@
41
41
  | workflow definition 必须显式 `launch`(编译器强制) | `definitions: [{ version: 1, definition, launch: { mode: 'standalone' } }]` |
42
42
  | option/user/department/resource-ref/cascade 字段投影进工作流事实是 { label, value } 对象,不能声明为标量;条件比较用 `<fact>.value` | `inputSchema.properties.urgency = { type: 'object', ... }` + `path: 'urgency.value'` |
43
43
  | `cascade.*` 的写入/比较值形状是**数组路径** | `category: [{ label: '办公设备', value: 'office' }]` |
44
+ | 行级策略按**角色并集取最宽**:多角色身份的可见行 = 各角色可见行的并集;基线角色与限制性规则并存时,限制会被宽松规则覆盖(平台语义,不是缺陷) | 给某角色做行级收窄前,先确认其角色并集里没有更宽的 unrestricted 角色 |
45
+ | `matchMode: 'AND'` 且多条规则面向**不同角色**时,非目标角色规则恒 false → 全拒(编译器会警告) | 多角色白名单用 `matchMode: 'OR'`;单条规则用 AND/OR 等价 |
46
+ | `created_by`/`updated_by` 审计列支持 `current_user` 行规则("只看自己创建");运行时 WITH CHECK 正向匹配依赖平台版本,使用前在目标平台实测确认 | `{ subject: 'current_user', field: 'created_by', roleCodes: ['app-user'] }` |
47
+ | 匿名策略 `requiredFields` 比模型必填更严格时编译器**警告**:标准控件不为这些字段生成必填校验,空值提交会被服务端 `REQUIRED_FIELD_MISSING` 拒绝 | 在模型字段上声明 `required: true`,使模型必填与策略对齐 |
44
48
  | 平台保留能力(如 `app:<app>:directory:read`)**不能**在 `capabilities` 里重复声明,直接在角色中引用即可 | `const directoryRead = \`app:\${APP_CODE}:directory:read\`` → `roles: [{ code: 'admin', capabilities: [directoryRead] }]` |
45
49
  | 资源 CRUD 能力码用 `resourceCapabilityCodes(appCode, resourceCode)` 生成 | `const crud = resourceCapabilityCodes(APP_CODE, 'repair-requests')` → `capabilities: [crud.read, crud.create]` |
46
50
  | `authenticatedUserRoleCode` 是平台登录用户的基线角色 | `authz: { authenticatedUserRoleCode: 'app-user', ... }` |
@@ -190,11 +194,13 @@ export default defineOpenXiangdaApp({
190
194
  { code: 'app-user', name: '应用用户', capabilities: [requestCrud.read, requestCrud.create] },
191
195
  { code: 'admin', name: '管理员', capabilities: [requestCrud.read, requestCrud.create, requestCrud.update, requestCrud.delete] },
192
196
  ],
193
- scopeDimensions: [], scopeSources: [], dataPolicies: [], authorizationTransitions: [],
197
+ scopeDimensions: [], scopeSources: [], roleMembershipSources: [], relationshipGrantSources: [], dataPolicies: [], authorizationTransitions: [],
194
198
  },
195
199
  });
196
200
  ```
197
201
 
202
+ 授权来源声明的字段路径(`userIdField` 等)支持 `field` / `field.value` / `field.snapshot.<子字段>` 三种投影形式;`roleMembershipSources`/`relationshipGrantSources` 只允许 `failureMode: 'strict'`,`scopeSources` 额外允许 `last_known_good`。`authorizationTransitions` 只记录移除(`removeRoleCodes`/`removeCapabilityCodes`)并要求 `fromAuthzDigest` 匹配原授权摘要;新增授权不需要 transition。
203
+
198
204
  `request-items` 不出现在 `crud` 里:子表行随 `requests` 表单的 `subtable` 字段写入(在 `requests.fields` 里补 `{ code: 'items', type: 'subtable', subtable: { resourceCode: 'request-items', foreignKey: 'requestId', orderField: 'sortOrder', maxRows: 20 } }`)。
199
205
 
200
206
  ## 图片上传的像素上限