openxiangda 2.9.0 → 2.9.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"resource-query.d.ts","sourceRoot":"","sources":["../../../../src/browser/components/platform-fields/resource-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EAGV,MAAM,+BAA+B,CAAC;AAOvC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE;AAWtE,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,oBAAoB,GAC1B,SAAS,GAAG,SAAS,CA0GvB;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,CAQ3G"}
1
+ {"version":3,"file":"resource-query.d.ts","sourceRoot":"","sources":["../../../../src/browser/components/platform-fields/resource-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EAGV,MAAM,+BAA+B,CAAC;AAOvC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE;AActE,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,oBAAoB,GAC1B,SAAS,GAAG,SAAS,CA0GvB;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,CA8B3G"}
@@ -1,10 +1,13 @@
1
1
  import { cascadeTerminalValues, } from './cascade-value';
2
2
  import { deepestAddressPredicate } from './address-value';
3
+ function isSelectionSnapshot(value) {
4
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value) && 'value' in value);
5
+ }
6
+ function stableValue(value) {
7
+ return isSelectionSnapshot(value) ? String(value.value) : value;
8
+ }
3
9
  function stableValues(value) {
4
- const values = Array.isArray(value) ? value : [value];
5
- return values.map(item => item && typeof item === 'object' && 'value' in item
6
- ? String(item.value)
7
- : item);
10
+ return (Array.isArray(value) ? value : [value]).map(stableValue);
8
11
  }
9
12
  export function buildResourceWhere(resourceCode, surface, query) {
10
13
  const declaredFields = new Set(Object.keys(surface.fields));
@@ -115,8 +118,32 @@ export function compileAdvancedWhere(code, surface, node) {
115
118
  return { or: node.or.map(item => compileAdvancedWhere(code, surface, item)) };
116
119
  if ('not' in node)
117
120
  return { not: compileAdvancedWhere(code, surface, node.not) };
121
+ // A path already selects the canonical subvalue; top-level field control
122
+ // normalization must not replace its value or silently drop the path.
123
+ if (node.path !== undefined)
124
+ return node;
118
125
  if (node.operator === 'isEmpty' || node.operator === 'isNotEmpty')
119
126
  return { field: node.field, operator: node.operator };
127
+ const field = surface.fields[node.field];
128
+ if (node.operator === 'has') {
129
+ const cascadePath = field?.type === 'cascade.single' && Array.isArray(node.value) &&
130
+ node.value.length > 0 && node.value.every(isSelectionSnapshot);
131
+ return { ...node, value: cascadePath
132
+ ? cascadeTerminalValues(node.value, false)[0]
133
+ : stableValue(node.value) };
134
+ }
135
+ if (['in', 'between', 'hasAny', 'hasAll'].includes(node.operator)) {
136
+ // Explicit operators own operand cardinality. Do not apply shortcut
137
+ // filters, which infer hasAny or reduce a range to its first comparison.
138
+ if (!Array.isArray(node.value))
139
+ return node;
140
+ const cascadePaths = field?.type === 'cascade.multiple' &&
141
+ ['hasAny', 'hasAll'].includes(node.operator) && node.value.length > 0 &&
142
+ node.value.every(path => Array.isArray(path) && path.length > 0 && path.every(isSelectionSnapshot));
143
+ return { ...node, value: cascadePaths
144
+ ? cascadeTerminalValues(node.value, true)
145
+ : node.value.map(stableValue) };
146
+ }
120
147
  const normalized = buildResourceWhere(code, surface, { page: 1, pageSize: 20, filters: { [node.field]: node.value } });
121
148
  const predicate = normalized && 'and' in normalized ? normalized.and[0] : undefined;
122
149
  return predicate && 'field' in predicate ? { ...predicate, operator: node.operator } : node;
@@ -1 +1 @@
1
- {"version":3,"file":"resource-query.js","sourceRoot":"","sources":["../../../../src/browser/components/platform-fields/resource-query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-query.js","sourceRoot":"","sources":["../../../../src/browser/components/platform-fields/resource-query.ts"],"names":[],"mappings":"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"}
@@ -101,6 +101,26 @@ pnpm openxiangda spec check
101
101
 
102
102
  本地证据路径必须位于工作区内且文件存在;长期报告也可引用 HTTPS 证据。工具核对引用格式、版本绑定、场景覆盖与数值,不替代对截图、业务含义或外部证据真实性的评估。授权角色成功和禁止角色拒绝分别验证;支持范围之外的渠道在需求范围与未覆盖清单中明确说明。
103
103
 
104
+ 用户明确将性能验收延期时,在同一报告增加 `performanceDeferral`:
105
+
106
+ ```json
107
+ {
108
+ "performanceDeferral": {
109
+ "status": "deferred",
110
+ "reason": "用户实际决定延期的原因与本期范围",
111
+ "followUp": "后续负责方、处理安排及保留的未完成事项",
112
+ "authorizedBy": "实际授权人;若由代理转达,注明真实来源及转达关系",
113
+ "authorizedAt": "实际授权时间ISO8601,不能晚于报告记录时间",
114
+ "authorizationSource": "实际用户消息或需求来源的稳定引用",
115
+ "evidence": ["appspec/product/actual-user-decisions.md"]
116
+ }
117
+ }
118
+ ```
119
+
120
+ 以上仍是格式示例,不代表发生了授权。`performance` 保留已取得的真实测量,包括超标样本;确实未测时可为 `[]`。不得仅挑选成功样本、提高目标或删除原失败来美化结果。延期原因、后续安排、授权人、时间、来源和证据必须完整;工具不从超时或 AI 判断推断授权。由代理转达用户决定时,证据应定位实际用户答复,授权时间取该决定的记录时间,报告生成时间另写 `recordedAt`。
121
+
122
+ `spec verify` / MCP 返回 `performance.status: "deferred"`、测量条数和 `overBudget` 数量;生产阶段同时显示“性能按用户授权延期(未通过)”。这表示该版本的功能验收满足本次交付范围,性能仍未通过。没有延期记录时,缺少测量或超标仍阻断;延期不能豁免任何失败、未测或缺失的 AC,也不能改变原 TEST 版本、包摘要、设计基线和生产授权。结构检查不能证明授权、证据内容或实际体验真实。
123
+
104
124
  ```bash
105
125
  pnpm openxiangda spec verify --deployment <测试运行ID>
106
126
  # 报告也可显式指定;生产晋级按运行 ID 读取默认路径
@@ -59,6 +59,8 @@ pnpm openxiangda status <deployment-id> --watch
59
59
 
60
60
  先按真实操作保存 `appspec/verification/<测试运行ID>.json` 并提交、推送到主线。晋级会从测试源码提交读取原验收计划,核对报告的运行 ID、包摘要、AC 场景与性能证据;主线后来的需求不改变已测范围。
61
61
 
62
+ 性能若由用户明确延期,按 [AppSpec 延期记录](./appspec.md)填写有证据的 `performanceDeferral` 并保留原测量。晋级阶段明确显示性能未通过;功能 AC 和其余版本/权限门禁继续执行。仅升级验收工具和补充报告不会重建原测试制品。
63
+
62
64
  该版本的源码提交必须仍包含在权威远端主分支中。主分支后来有新提交,不会改变本次晋级的制品。若任务分支采用 squash/rebase 合并,应在最终主线提交上重新冻结并验证测试候选,不能继续晋级合并前的提交。
63
65
 
64
66
  ```bash
@@ -11,10 +11,10 @@ OpenXiangda 2.0 默认生成 React 应用和共享契约。普通 CRUD、标准
11
11
  以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
12
12
 
13
13
  ```bash
14
- pnpm dlx openxiangda@2.9.0 skill install --force
15
- pnpm dlx openxiangda@2.9.0 auth status --base-url <平台地址> --json
16
- pnpm dlx openxiangda@2.9.0 login --base-url https://platform.example.com
17
- pnpm dlx openxiangda@2.9.0 create my-app --base-url https://platform.example.com
14
+ pnpm dlx openxiangda@2.9.3 skill install --force
15
+ pnpm dlx openxiangda@2.9.3 auth status --base-url <平台地址> --json
16
+ pnpm dlx openxiangda@2.9.3 login --base-url https://platform.example.com
17
+ pnpm dlx openxiangda@2.9.3 create my-app --base-url https://platform.example.com
18
18
  cd my-app
19
19
  pnpm openxiangda context --json
20
20
  pnpm openxiangda dev
@@ -116,9 +116,9 @@ MCP 的 `docs_read` 可以读取本说明,当前没有独立的源码操作 MC
116
116
  无需本地工作区,使用本 Skill 随包精确版本或已安装的对应 CLI:
117
117
 
118
118
  ```bash
119
- pnpm dlx openxiangda@2.9.0 auth status --base-url <平台> --json
120
- pnpm dlx openxiangda@2.9.0 source resolve <仓库URL> --base-url <平台> --json
121
- pnpm dlx openxiangda@2.9.0 source clone <仓库URL> <新目录> --base-url <平台> --json
119
+ pnpm dlx openxiangda@2.9.3 auth status --base-url <平台> --json
120
+ pnpm dlx openxiangda@2.9.3 source resolve <仓库URL> --base-url <平台> --json
121
+ pnpm dlx openxiangda@2.9.3 source clone <仓库URL> <新目录> --base-url <平台> --json
122
122
  ```
123
123
 
124
124
  登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schemaVersion": "openxiangda.documentation/v1",
3
- "version": "2.9.0",
3
+ "version": "2.9.3",
4
4
  "topics": [
5
5
  {
6
6
  "id": "getting-started",
7
7
  "title": "安装与开始开发",
8
8
  "file": "getting-started.md",
9
- "sha256": "506b785f8a098a56a8adf59ae50a9a5f8d4e56961c62dacb696129fbe68bbad0"
9
+ "sha256": "cf570634f8cde054f242178563b9f3096ae5d36d40f5825ec5ef28d7de26c105"
10
10
  },
11
11
  {
12
12
  "id": "product-design",
@@ -36,7 +36,7 @@
36
36
  "id": "appspec",
37
37
  "title": "需求、设计与交付记录",
38
38
  "file": "appspec.md",
39
- "sha256": "69f3238e8e28538a51128fb3f0e2c4df79820020f74eca93b643ed227e8998c7"
39
+ "sha256": "608562c55c6bbd79d488598df1b02cfa1a5ce8e77ccead9f80e922bbcb6b6093"
40
40
  },
41
41
  {
42
42
  "id": "concepts",
@@ -90,13 +90,13 @@
90
90
  "id": "testing",
91
91
  "title": "检查与真实业务验收",
92
92
  "file": "testing.md",
93
- "sha256": "c948b31d5a9cb4903bf696ce3e14ad556ab6b1c9e03a28fd1275be2a7f58e9f3"
93
+ "sha256": "22c0dc64990a730f368ecea5d2f848da33ea55cf6b5d9a6e8e4ab675ac8b0925"
94
94
  },
95
95
  {
96
96
  "id": "delivery",
97
97
  "title": "部署、生产晋级与恢复",
98
98
  "file": "delivery.md",
99
- "sha256": "30152536bf782d62ba182272086033fa45596e1f9f42eefe59169c9fa25af68f"
99
+ "sha256": "b4456af406889bb9dbd296d6f445baa6ec7b1f25756d5d518adb245f1fc095ae"
100
100
  },
101
101
  {
102
102
  "id": "upgrading",
@@ -114,7 +114,7 @@
114
114
  "id": "mcp",
115
115
  "title": "MCP 配置与工具参考",
116
116
  "file": "reference/mcp.md",
117
- "sha256": "063f4c07f28b7d8d3c0e132d9922ac182d23f28fde1d5e91adaf6015edc17b19"
117
+ "sha256": "509c274e53f6f70db579807fcdfb2598b59d0ae3814b6e4646291ba802c873de"
118
118
  }
119
119
  ]
120
120
  }
@@ -145,7 +145,7 @@ MCP 使用项目锁定的根包;在客户端配置下列 stdio 启动参数,
145
145
 
146
146
  ## appspec_verify
147
147
 
148
- 核对业务验收报告。读取成功测试运行与 Git 中的真实验收报告,核对版本绑定、场景结果和性能证据;不自动编造或执行验收。
148
+ 核对业务验收报告。读取成功测试运行与 Git 中的真实验收报告,核对版本绑定、场景结果和性能证据;有实际授权的性能延期单列为deferred未通过,不豁免功能AC,不自动编造或执行验收。
149
149
 
150
150
  - 只读:是
151
151
  - 可替换文件或改变远端状态:否
@@ -12,6 +12,8 @@ CI、离线开发或尚未发布的候选包使用 `pnpm openxiangda check --loc
12
12
 
13
13
  结果中的 AppSpec/lifecycle 单独列出需求与设计缺口;普通 check 可以继续验证尚未完成的实现。正式测试发布前核对总纲、关联变更、权限、性能预算和 AC 计划,测试部署之后再执行真实角色验收。生产晋级按 [AppSpec 报告](./appspec.md)核对指定测试版本的实际结果。
14
14
 
15
+ 用户明确延期的性能项使用报告的 `performanceDeferral`,记录实际授权与后续安排并保留原超标样本。结果明确区分功能通过与性能延期;不补造测量,不放宽功能 AC。
16
+
15
17
  本地与平台使用同一份纯校验规则,并核对实现摘要和配置投影摘要。必需登录提供方、目标环境的密钥可用性、已有模型的物理字段约束和应用管理权限会在构建前检查;预检不读取密钥明文、不创建物理表、不修改环境。现场变化仍由平台在真正执行时复核。
16
18
 
17
19
  检查会写本地生成结果并按需初始化后端,不是只读操作。前置阶段失败后,下游阶段标为 skipped,不继续构建或上传。保留错误码、pointer、details 和下一步,修正原因后重试。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openxiangda",
3
- "version": "2.9.0",
3
+ "version": "2.9.3",
4
4
  "description": "OpenXiangda 2.0 的统一命令、应用 SDK、MCP 与中文 AI 技能资料。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -60,13 +60,13 @@
60
60
  "antd-mobile": "5.42.3",
61
61
  "dayjs": "1.11.18",
62
62
  "docx-preview": "0.3.7",
63
- "openxiangda-cli": "2.2.13",
63
+ "openxiangda-cli": "2.2.15",
64
64
  "openxiangda-contracts": "2.7.0",
65
- "openxiangda-devkit-core": "2.6.0",
65
+ "openxiangda-devkit-core": "2.6.1",
66
66
  "openxiangda-legacy": "npm:openxiangda@1.0.268",
67
- "openxiangda-mcp": "2.0.11",
67
+ "openxiangda-mcp": "2.0.12",
68
68
  "openxiangda-nest": "2.1.3",
69
- "openxiangda-skill-kit": "2.0.15",
69
+ "openxiangda-skill-kit": "2.0.16",
70
70
  "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"
71
71
  },
72
72
  "peerDependencies": {
@@ -132,36 +132,34 @@
132
132
  },
133
133
  "openxiangdaRelease": {
134
134
  "schemaVersion": "openxiangda.release-notes/v1",
135
- "version": "2.9.0",
135
+ "version": "2.9.3",
136
136
  "status": "reviewed",
137
- "title": "OpenXiangda 2.9.0:声明标准列表导入导出入口",
138
- "summary": "应用可按默认或命名视图配置标准列表的导入、导出任务,PC 与移动端使用相同声明。",
139
- "newFeatures": [
140
- "crud[].list.actions 支持 import 与 export 布尔开关,直接资源声明同样支持。",
141
- "关闭导入适用于原生与流程列表;关闭导出同时覆盖 PC 和移动列表。"
142
- ],
137
+ "title": "OpenXiangda 2.9.3:明确记录用户授权的性能延期",
138
+ "summary": "修复功能验收完成但用户已延期性能时无法正式晋级的问题,保留原测量并明确区分性能通过与延期。",
139
+ "newFeatures": [],
143
140
  "fixes": [
144
- "应用可通过公开配置移除首发范围之外的列表任务,无需修改共享组件或使用 CSS 隐藏。"
141
+ "AppSpec验收报告支持有授权人、实际时间、来源、证据及后续安排的performanceDeferral。",
142
+ "延期时保留真实超标测量,返回deferred与overBudget统计,生产阶段明确显示性能未通过。",
143
+ "没有授权延期时仍要求性能测量达标;延期不豁免功能AC、证据、原测试版本和制品绑定。"
145
144
  ],
146
145
  "affectedUsers": [
147
- "使用标准 CRUD 默认或命名视图,需要控制导入导出入口的 V2 应用开发者。"
146
+ "已由用户明确延期性能验收、需要按实际范围完成V2功能交付的应用开发者。"
148
147
  ],
149
148
  "upgradeSteps": [
150
- "平台采用 openxiangda-contracts 2.7.0,应用采用 openxiangda 2.9.0 后重新生成和检查。",
151
- "在目标视图的 list.actions 中将不需要的入口设为 false,再部署测试候选并验证 PC/移动页面。"
149
+ "更新项目的openxiangda依赖至2.9.3并刷新项目技能;已有测试制品可以沿用,不因验收工具升级而重建。",
150
+ "依据实际用户决定填写延期记录,保留成功与失败测量;正式spec verify后提交推送报告,用原TEST运行晋级。"
152
151
  ],
153
152
  "knownLimitations": [
154
- "省略开关保持既有行为;true 不授予权限,也不改变原生、流程或只读写入归属。",
155
- "这是页面入口配置,Data API 和敏感字段仍按原有授权规则执行。",
156
- "命名视图各自声明开关,不继承默认视图的任务选择;无需新增数据库迁移。"
153
+ "结构验证不证明授权或证据内容真实;不得制造用户确认、提高阈值或仅保留成功样本。",
154
+ "本次仅修复开发交付记录契约,不修复性能,也不修改平台后端、业务数据或运行时权限。"
157
155
  ],
158
156
  "compatibility": {
159
157
  "node": ">=24",
160
- "platform": "openxiangda-contracts 2.7.0"
158
+ "platform": "沿用openxiangda-contracts 2.7.0,无新增平台能力要求"
161
159
  },
162
160
  "issues": [],
163
- "sha256": "c9d413f52c85a7ca1ee5e113ca72d9284efd303b3a99dc8ba71ae35cf7526783",
164
- "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.9.0"
161
+ "sha256": "aea11cf79206afaae7d6a98eb72506bd71f13752ca6178e459d5395cde4b10a8",
162
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.9.3"
165
163
  },
166
164
  "scripts": {
167
165
  "build": "node ../../scripts/prune-package-dist.mjs && tsc -p tsconfig.json && node scripts/copy-assets.mjs",
@@ -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
+ }
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "name": "openxiangda-v2",
6
6
  "description": "使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具体变更出发,通过对话发现模块、完成详细产品设计,再开发、检查和交付应用。维护 1.x 应用时使用对应的 1.x 技能。",
7
- "sha256": "c69da0d5337572356a56c19a9e78fd39c12f7f9828395a1cadc65d9ad3726035"
7
+ "sha256": "2e7e1445a9901266ed02eeed944e423ef8112ee798bd41ebae8932316606a62a"
8
8
  }
9
9
  ]
10
10
  }
@@ -18,10 +18,10 @@ description: 使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具
18
18
  未创建工作区时使用本 Skill 随根包发布的精确版本:
19
19
 
20
20
  ```bash
21
- pnpm dlx openxiangda@2.9.0 auth status --base-url <平台地址> --json
22
- pnpm dlx openxiangda@2.9.0 login --base-url <平台地址>
23
- pnpm dlx openxiangda@2.9.0 create <应用目录> --base-url <同一平台地址>
24
- pnpm dlx openxiangda@2.9.0 skill install --force
21
+ pnpm dlx openxiangda@2.9.3 auth status --base-url <平台地址> --json
22
+ pnpm dlx openxiangda@2.9.3 login --base-url <平台地址>
23
+ pnpm dlx openxiangda@2.9.3 create <应用目录> --base-url <同一平台地址>
24
+ pnpm dlx openxiangda@2.9.3 skill install --force
25
25
  ```
26
26
 
27
27
  创建前把产品要求的目标平台明确带入命令,不从旧登录态推断站点。已有工作区从原绑定恢复,平台不一致时先解决登录与目标,不改 link 文件跨站创建。
@@ -60,7 +60,7 @@ pnpm dlx openxiangda@2.9.0 skill install --force
60
60
 
61
61
  总纲维护领域与模型关系、PC/移动任务页面、页面/操作/行/字段权限、多角色组合和容量预算。新增功能先评估影响,普通 CRUD、流程、消息等复用平台能力。明确数据量、分页/索引、请求次数、并发/批量和延迟目标,避免无界全量读取、逐行请求与无限重试。
62
62
 
63
- 新应用和改变业务含义的工作,先以实际用户答复和设计内容摘要形成评审,确认 readyForImplementation 后再写实施任务;纯文案和无行为调整引用已有有效基线,不新建评审或重复确认。不能只改摘要或虚构确认让检查通过;工具结构检查不证明体验合格。本轮 ChangeSpec 关联评审、需求依据、方案、任务、源码、AC 场景和验收证据;多个变更时用提交说明 `AppSpec: <ID>` 指明本次交付。测试发布前完成设计和计划,部署后按实际角色、拒绝路径和性能样本验收。生产使用绑定测试运行及包摘要的 `appspec/verification/<运行ID>.json`。更新当前规则后归档,保留未覆盖项、失败原因、发布指针和交接。不可编造需求确认或通过结果;参见 [AppSpec](references/appspec.md)。
63
+ 新应用和改变业务含义的工作,先以实际用户答复和设计内容摘要形成评审,确认 readyForImplementation 后再写实施任务;纯文案和无行为调整引用已有有效基线,不新建评审或重复确认。不能只改摘要或虚构确认让检查通过;工具结构检查不证明体验合格。本轮 ChangeSpec 关联评审、需求依据、方案、任务、源码、AC 场景和验收证据;多个变更时用提交说明 `AppSpec: <ID>` 指明本次交付。测试发布前完成设计和计划,部署后按实际角色、拒绝路径和性能样本验收。生产使用绑定测试运行及包摘要的 `appspec/verification/<运行ID>.json`。用户明确延期性能时,按 AppSpec 记录有实际授权来源和后续安排的 `performanceDeferral`,保留原失败测量并报告延期未通过;该记录不豁免功能 AC。更新当前规则后归档,保留未覆盖项、失败原因、发布指针和交接。不可编造需求确认或通过结果;参见 [AppSpec](references/appspec.md)。
64
64
 
65
65
  ## 使用当前事实
66
66
 
@@ -101,6 +101,26 @@ pnpm openxiangda spec check
101
101
 
102
102
  本地证据路径必须位于工作区内且文件存在;长期报告也可引用 HTTPS 证据。工具核对引用格式、版本绑定、场景覆盖与数值,不替代对截图、业务含义或外部证据真实性的评估。授权角色成功和禁止角色拒绝分别验证;支持范围之外的渠道在需求范围与未覆盖清单中明确说明。
103
103
 
104
+ 用户明确将性能验收延期时,在同一报告增加 `performanceDeferral`:
105
+
106
+ ```json
107
+ {
108
+ "performanceDeferral": {
109
+ "status": "deferred",
110
+ "reason": "用户实际决定延期的原因与本期范围",
111
+ "followUp": "后续负责方、处理安排及保留的未完成事项",
112
+ "authorizedBy": "实际授权人;若由代理转达,注明真实来源及转达关系",
113
+ "authorizedAt": "实际授权时间ISO8601,不能晚于报告记录时间",
114
+ "authorizationSource": "实际用户消息或需求来源的稳定引用",
115
+ "evidence": ["appspec/product/actual-user-decisions.md"]
116
+ }
117
+ }
118
+ ```
119
+
120
+ 以上仍是格式示例,不代表发生了授权。`performance` 保留已取得的真实测量,包括超标样本;确实未测时可为 `[]`。不得仅挑选成功样本、提高目标或删除原失败来美化结果。延期原因、后续安排、授权人、时间、来源和证据必须完整;工具不从超时或 AI 判断推断授权。由代理转达用户决定时,证据应定位实际用户答复,授权时间取该决定的记录时间,报告生成时间另写 `recordedAt`。
121
+
122
+ `spec verify` / MCP 返回 `performance.status: "deferred"`、测量条数和 `overBudget` 数量;生产阶段同时显示“性能按用户授权延期(未通过)”。这表示该版本的功能验收满足本次交付范围,性能仍未通过。没有延期记录时,缺少测量或超标仍阻断;延期不能豁免任何失败、未测或缺失的 AC,也不能改变原 TEST 版本、包摘要、设计基线和生产授权。结构检查不能证明授权、证据内容或实际体验真实。
123
+
104
124
  ```bash
105
125
  pnpm openxiangda spec verify --deployment <测试运行ID>
106
126
  # 报告也可显式指定;生产晋级按运行 ID 读取默认路径
@@ -59,6 +59,8 @@ pnpm openxiangda status <deployment-id> --watch
59
59
 
60
60
  先按真实操作保存 `appspec/verification/<测试运行ID>.json` 并提交、推送到主线。晋级会从测试源码提交读取原验收计划,核对报告的运行 ID、包摘要、AC 场景与性能证据;主线后来的需求不改变已测范围。
61
61
 
62
+ 性能若由用户明确延期,按 [AppSpec 延期记录](appspec.md)填写有证据的 `performanceDeferral` 并保留原测量。晋级阶段明确显示性能未通过;功能 AC 和其余版本/权限门禁继续执行。仅升级验收工具和补充报告不会重建原测试制品。
63
+
62
64
  该版本的源码提交必须仍包含在权威远端主分支中。主分支后来有新提交,不会改变本次晋级的制品。若任务分支采用 squash/rebase 合并,应在最终主线提交上重新冻结并验证测试候选,不能继续晋级合并前的提交。
63
65
 
64
66
  ```bash
@@ -11,10 +11,10 @@ OpenXiangda 2.0 默认生成 React 应用和共享契约。普通 CRUD、标准
11
11
  以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
12
12
 
13
13
  ```bash
14
- pnpm dlx openxiangda@2.9.0 skill install --force
15
- pnpm dlx openxiangda@2.9.0 auth status --base-url <平台地址> --json
16
- pnpm dlx openxiangda@2.9.0 login --base-url https://platform.example.com
17
- pnpm dlx openxiangda@2.9.0 create my-app --base-url https://platform.example.com
14
+ pnpm dlx openxiangda@2.9.3 skill install --force
15
+ pnpm dlx openxiangda@2.9.3 auth status --base-url <平台地址> --json
16
+ pnpm dlx openxiangda@2.9.3 login --base-url https://platform.example.com
17
+ pnpm dlx openxiangda@2.9.3 create my-app --base-url https://platform.example.com
18
18
  cd my-app
19
19
  pnpm openxiangda context --json
20
20
  pnpm openxiangda dev
@@ -116,9 +116,9 @@ MCP 的 `docs_read` 可以读取本说明,当前没有独立的源码操作 MC
116
116
  无需本地工作区,使用本 Skill 随包精确版本或已安装的对应 CLI:
117
117
 
118
118
  ```bash
119
- pnpm dlx openxiangda@2.9.0 auth status --base-url <平台> --json
120
- pnpm dlx openxiangda@2.9.0 source resolve <仓库URL> --base-url <平台> --json
121
- pnpm dlx openxiangda@2.9.0 source clone <仓库URL> <新目录> --base-url <平台> --json
119
+ pnpm dlx openxiangda@2.9.3 auth status --base-url <平台> --json
120
+ pnpm dlx openxiangda@2.9.3 source resolve <仓库URL> --base-url <平台> --json
121
+ pnpm dlx openxiangda@2.9.3 source clone <仓库URL> <新目录> --base-url <平台> --json
122
122
  ```
123
123
 
124
124
  登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回
@@ -145,7 +145,7 @@ MCP 使用项目锁定的根包;在客户端配置下列 stdio 启动参数,
145
145
 
146
146
  ## appspec_verify
147
147
 
148
- 核对业务验收报告。读取成功测试运行与 Git 中的真实验收报告,核对版本绑定、场景结果和性能证据;不自动编造或执行验收。
148
+ 核对业务验收报告。读取成功测试运行与 Git 中的真实验收报告,核对版本绑定、场景结果和性能证据;有实际授权的性能延期单列为deferred未通过,不豁免功能AC,不自动编造或执行验收。
149
149
 
150
150
  - 只读:是
151
151
  - 可替换文件或改变远端状态:否
@@ -12,6 +12,8 @@ CI、离线开发或尚未发布的候选包使用 `pnpm openxiangda check --loc
12
12
 
13
13
  结果中的 AppSpec/lifecycle 单独列出需求与设计缺口;普通 check 可以继续验证尚未完成的实现。正式测试发布前核对总纲、关联变更、权限、性能预算和 AC 计划,测试部署之后再执行真实角色验收。生产晋级按 [AppSpec 报告](appspec.md)核对指定测试版本的实际结果。
14
14
 
15
+ 用户明确延期的性能项使用报告的 `performanceDeferral`,记录实际授权与后续安排并保留原超标样本。结果明确区分功能通过与性能延期;不补造测量,不放宽功能 AC。
16
+
15
17
  本地与平台使用同一份纯校验规则,并核对实现摘要和配置投影摘要。必需登录提供方、目标环境的密钥可用性、已有模型的物理字段约束和应用管理权限会在构建前检查;预检不读取密钥明文、不创建物理表、不修改环境。现场变化仍由平台在真正执行时复核。
16
18
 
17
19
  检查会写本地生成结果并按需初始化后端,不是只读操作。前置阶段失败后,下游阶段标为 skipped,不继续构建或上传。保留错误码、pointer、details 和下一步,修正原因后重试。