openxiangda 2.17.0 → 2.18.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.
- package/dist/browser/route-manifest.js +1 -1
- package/documentation/application-foundation.md +20 -0
- package/documentation/declarations-cheatsheet.md +1 -0
- package/documentation/getting-started.md +7 -7
- package/documentation/manifest.json +4 -4
- package/package.json +22 -24
- package/releases/2.17.1.json +34 -0
- package/releases/2.18.0.json +37 -0
- package/skills/manifest.json +1 -1
- package/skills/openxiangda-v2/SKILL.md +4 -4
- package/skills/openxiangda-v2/references/application-foundation.md +20 -0
- package/skills/openxiangda-v2/references/declarations-cheatsheet.md +1 -0
- package/skills/openxiangda-v2/references/getting-started.md +7 -7
|
@@ -110,7 +110,7 @@ export function createStandardRouteManifestIndex(manifest, appCode) {
|
|
|
110
110
|
(entry.kind === 'resource-records' || entry.kind === 'resource-submit')
|
|
111
111
|
? !(typeof entry.resourceCode === 'string' &&
|
|
112
112
|
/^[a-z][a-z0-9-]{0,62}$/.test(entry.resourceCode) &&
|
|
113
|
-
entry.code === `user
|
|
113
|
+
entry.code === `user.${entry.resourceCode}.${entry.kind === 'resource-records' ? 'records' : 'submit'}`)
|
|
114
114
|
: entry.resourceCode !== undefined ||
|
|
115
115
|
entries.has(entry.code) ||
|
|
116
116
|
!entry.desktop ||
|
|
@@ -175,3 +175,23 @@ import 'openxiangda/mobile/styles.css';
|
|
|
175
175
|
PC 抽屉提供“全屏 / 新开页面 / 关闭”。全屏保留当前表单;新开页面先暂存,再通过草稿 ID 恢复,内容不放入 URL。移动录入使用平台移动字段的分组行式布局、简单标题和底部操作,不放“返回列表”或桌面输入控件;草稿箱和恢复确认使用底部弹层。
|
|
176
176
|
|
|
177
177
|
自定义表单可从 `openxiangda/react` 使用 `createResourceFormDraftClient(resourceCode, mode, recordId?, viewCode?)`,提供 `list/save/remove/submit`。命名视图只能恢复和提交属于当前视图的草稿;所有视图仍共用每人每个模型 20 份的上限。`save` 使用草稿 ID、expectedRevision 和可编辑字段值;`submit` 消费现有 DataTransactionOperation,不另建 CRUD 后端。此能力需要平台的 authenticated-form-drafts SQL 迁移及对应服务端版本,平台未升级时界面会明确显示暂存失败并保留输入。
|
|
178
|
+
|
|
179
|
+
## 列表排序声明 {#sortable-fields}
|
|
180
|
+
|
|
181
|
+
模块化列表视图用 `sortableFields` 声明用户可点击列头排序的列;`defaultSort.field`
|
|
182
|
+
隐式可排序,两者重复出现不报错。与 `filterFields` / `searchableFields` 同构:
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
crud: [{
|
|
186
|
+
model: 'venues',
|
|
187
|
+
list: {
|
|
188
|
+
fields: ['name', 'capacity'],
|
|
189
|
+
filterFields: ['capacity'],
|
|
190
|
+
searchableFields: ['name'],
|
|
191
|
+
sortableFields: ['capacity'],
|
|
192
|
+
defaultSort: { field: 'name', order: 'asc' },
|
|
193
|
+
},
|
|
194
|
+
}]
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
引用未声明字段按编译错误处理;低层 `data.resources[].fields[].sortable` 语义不变。
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
| `audit.read` 可写 `true`(绑定本资源读能力)或能力数组 | `audit: { read: true }` |
|
|
23
23
|
| `resource-ref.*` 必须带 `source` 来源协议 | `{ type: 'resource-ref.single', source: { kind: 'resource', resourceCode: 'repair-requests', labelField: 'title', searchFields: ['title'], pageSize: 20, loadMode: 'search' } }` |
|
|
24
24
|
| `labelField` 必须指向目标资源的 `text.short` / `text.long` 字段 | 不要用流水号/选项字段当 label |
|
|
25
|
+
| 列表可排序列用视图级 `sortableFields` 表达(`defaultSort.field` 隐式可排序) | `list: { sortableFields: ['capacity'], defaultSort: { field: 'name', order: 'asc' } }` |
|
|
25
26
|
| 每个字段都必须带中文/业务 `label`(含子表外键与排序字段) | `{ code: 'requestId', type: 'uuid', label: '所属申请', required: true }` |
|
|
26
27
|
| 子表 `subtable` 的外键是子资源的 **uuid** 字段,排序字段是**可写 number.integer** | 子资源:`{ code: 'requestId', type: 'uuid', required: true }` + `{ code: 'sortOrder', type: 'number.integer', required: true }`;父表:`subtable: { resourceCode: 'repair-items', foreignKey: 'requestId', orderField: 'sortOrder', maxRows: 20 }` |
|
|
27
28
|
| 图片/附件的 `file` 限定数量与大小 | `file: { maxCount: 3, maxSizeMb: 10, accept: ['image/png', 'image/jpeg'] }` |
|
|
@@ -66,10 +66,10 @@ MCP 服务随项目根包一起安装,AI 客户端的 stdio 连接仍需配置
|
|
|
66
66
|
以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
|
-
pnpm dlx openxiangda@2.
|
|
70
|
-
pnpm dlx openxiangda@2.
|
|
71
|
-
pnpm dlx openxiangda@2.
|
|
72
|
-
pnpm dlx openxiangda@2.
|
|
69
|
+
pnpm dlx openxiangda@2.18.0 skill install --force
|
|
70
|
+
pnpm dlx openxiangda@2.18.0 auth status --base-url <平台地址> --json
|
|
71
|
+
pnpm dlx openxiangda@2.18.0 login --cwd my-app --base-url https://platform.example.com
|
|
72
|
+
pnpm dlx openxiangda@2.18.0 create my-app --base-url https://platform.example.com
|
|
73
73
|
cd my-app
|
|
74
74
|
pnpm openxiangda context --json
|
|
75
75
|
pnpm openxiangda dev
|
|
@@ -171,9 +171,9 @@ MCP 的 `docs_read` 可以读取本说明,当前没有独立的源码操作 MC
|
|
|
171
171
|
无需本地工作区,使用本 Skill 随包精确版本或已安装的对应 CLI:
|
|
172
172
|
|
|
173
173
|
```bash
|
|
174
|
-
pnpm dlx openxiangda@2.
|
|
175
|
-
pnpm dlx openxiangda@2.
|
|
176
|
-
pnpm dlx openxiangda@2.
|
|
174
|
+
pnpm dlx openxiangda@2.18.0 auth status --base-url <平台> --json
|
|
175
|
+
pnpm dlx openxiangda@2.18.0 source resolve <仓库URL> --base-url <平台> --json
|
|
176
|
+
pnpm dlx openxiangda@2.18.0 source clone <仓库URL> <新目录> --base-url <平台> --json
|
|
177
177
|
```
|
|
178
178
|
|
|
179
179
|
登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "openxiangda.documentation/v1",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.18.0",
|
|
4
4
|
"topics": [
|
|
5
5
|
{
|
|
6
6
|
"id": "getting-started",
|
|
7
7
|
"title": "安装与开始开发",
|
|
8
8
|
"file": "getting-started.md",
|
|
9
|
-
"sha256": "
|
|
9
|
+
"sha256": "20d2d9f373baec112bcd1238298a6e2d2c1a251c3c42910f81f174f7e774122a"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"id": "product-design",
|
|
@@ -48,13 +48,13 @@
|
|
|
48
48
|
"id": "declarations-cheatsheet",
|
|
49
49
|
"title": "声明速查:一次写对 config",
|
|
50
50
|
"file": "declarations-cheatsheet.md",
|
|
51
|
-
"sha256": "
|
|
51
|
+
"sha256": "cceae7c98fff0bfb5823979b4b7116614917a55647313d931074770b3b2a8c4c"
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
"id": "application-foundation",
|
|
55
55
|
"title": "业务模型与标准 CRUD",
|
|
56
56
|
"file": "application-foundation.md",
|
|
57
|
-
"sha256": "
|
|
57
|
+
"sha256": "28a4d727d773800e59e348287cd38ed011498b4ecab8a5ba0d21a4efade7d64e"
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
"id": "appspec",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openxiangda",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.18.0",
|
|
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.4.
|
|
64
|
-
"openxiangda-contracts": "2.14.
|
|
65
|
-
"openxiangda-devkit-core": "2.
|
|
63
|
+
"openxiangda-cli": "2.4.8",
|
|
64
|
+
"openxiangda-contracts": "2.14.1",
|
|
65
|
+
"openxiangda-devkit-core": "2.14.0",
|
|
66
66
|
"openxiangda-legacy": "npm:openxiangda@1.0.269",
|
|
67
|
-
"openxiangda-mcp": "2.0.
|
|
68
|
-
"openxiangda-nest": "2.4.
|
|
69
|
-
"openxiangda-skill-kit": "2.1.
|
|
67
|
+
"openxiangda-mcp": "2.0.23",
|
|
68
|
+
"openxiangda-nest": "2.4.2",
|
|
69
|
+
"openxiangda-skill-kit": "2.1.7",
|
|
70
70
|
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"
|
|
71
71
|
},
|
|
72
72
|
"peerDependencies": {
|
|
@@ -132,42 +132,40 @@
|
|
|
132
132
|
},
|
|
133
133
|
"openxiangdaRelease": {
|
|
134
134
|
"schemaVersion": "openxiangda.release-notes/v1",
|
|
135
|
-
"version": "2.
|
|
135
|
+
"version": "2.18.0",
|
|
136
136
|
"status": "reviewed",
|
|
137
|
-
"title": "OpenXiangda 2.
|
|
138
|
-
"summary": "
|
|
137
|
+
"title": "OpenXiangda 2.18.0:用户标准面闭合修复、列表可排序声明与发布提效",
|
|
138
|
+
"summary": "共享编译器完成用户标准面契约闭合校验;模块列表视图新增 sortableFields 排序声明(GAP-MODULE-001);发布验证按浏览器字节分级并收窄浏览器证据指纹,纯工具链补丁不再触发浏览器矩阵。",
|
|
139
139
|
"newFeatures": [
|
|
140
|
-
"
|
|
141
|
-
"
|
|
142
|
-
"首个启用资源自动成为登录落地页与根路径;多资源用 user: { home: true } 显式指定;声明式 /home 占位仍可覆盖。"
|
|
140
|
+
"列表视图新增 sortableFields:与 filterFields/searchableFields 同构声明可排序列;defaultSort.field 保持隐式可排序,重复容忍;引用未声明字段报编译错误;低层 data.resources 语义不变。",
|
|
141
|
+
"发布提效:验证计划按“浏览器应用实际加载的字节”分级(根包前端入口/contracts 浏览器入口),共享校验器等 Node 侧改动不再触发浏览器矩阵;浏览器阶段缓存指纹只包含浏览器捆绑包,devkit-core 等候选的字节变化不再使浏览器证据失效(候选版本仍由规范化锁覆盖)。"
|
|
143
142
|
],
|
|
144
143
|
"fixes": [
|
|
145
|
-
"
|
|
144
|
+
"修复 2.17.0 中 user 声明触发 NATIVE_CODE_INVALID / NATIVE_CONTRACT_CLOSURE_MISMATCH:共享校验器按配置事实校验并并入用户标准路由,配置 bundle 不变,旧平台无需升级。",
|
|
145
|
+
"生成码统一为 user.资源码.records / user.资源码.submit,符合稳定码模式。"
|
|
146
146
|
],
|
|
147
147
|
"affectedUsers": [
|
|
148
|
-
"
|
|
149
|
-
"
|
|
148
|
+
"使用 openxiangda 2.17.0 并声明 user 用户面的应用开发者。",
|
|
149
|
+
"从 data.resources 迁移到模块化声明、需要列表列头排序能力的应用(如数智工会 szgh-v2)。"
|
|
150
150
|
],
|
|
151
151
|
"upgradeSteps": [
|
|
152
|
-
"应用精确依赖升级到 openxiangda 2.
|
|
153
|
-
"
|
|
154
|
-
"行级强隔离仍按数据与权限文档声明 dataPolicies;“仅本人”列表是展示过滤。"
|
|
152
|
+
"应用精确依赖升级到 openxiangda 2.18.0 后重新运行 check 与部署。",
|
|
153
|
+
"模块化迁移的列表排序用 sortableFields 声明,与既有低层声明逐字段对齐。"
|
|
155
154
|
],
|
|
156
155
|
"knownLimitations": [
|
|
157
|
-
"
|
|
158
|
-
"详情抽屉按声明字段只读渲染,暂不支持在用户端编辑已有记录(可继续用自定义页面)。"
|
|
156
|
+
"“我的记录”的本人过滤仍是查询层展示过滤,非服务端授权边界。"
|
|
159
157
|
],
|
|
160
158
|
"compatibility": {
|
|
161
159
|
"node": ">=24",
|
|
162
160
|
"workspaceGenerations": [
|
|
163
161
|
"v2"
|
|
164
162
|
],
|
|
165
|
-
"platform": "
|
|
163
|
+
"platform": "无平台配合要求;配置与契约 bundle 对既有平台保持可部署。",
|
|
166
164
|
"v1": "不改变 V1 运行时或应用。"
|
|
167
165
|
},
|
|
168
166
|
"issues": [],
|
|
169
|
-
"sha256": "
|
|
170
|
-
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.
|
|
167
|
+
"sha256": "c5744c1cdd46e8922615d1b3bff521e072108906882a25c4d0f75f93f869c4af",
|
|
168
|
+
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.18.0"
|
|
171
169
|
},
|
|
172
170
|
"scripts": {
|
|
173
171
|
"build": "node ../../scripts/prune-package-dist.mjs && tsc -p tsconfig.json && node scripts/copy-assets.mjs",
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "openxiangda.release-notes/v1",
|
|
3
|
+
"version": "2.17.1",
|
|
4
|
+
"status": "reviewed",
|
|
5
|
+
"title": "OpenXiangda 2.17.1:用户标准面共享契约闭合修复",
|
|
6
|
+
"summary": "共享编译器接受并校验生成式用户标准面的路由契约,2.17.0 声明 user 面的应用可完整通过本地校验与部署;生成码分隔符统一为点号。",
|
|
7
|
+
"newFeatures": [
|
|
8
|
+
"生成码分隔符统一为点号(user.资源码.records / user.资源码.submit),与设备路由码一致。"
|
|
9
|
+
],
|
|
10
|
+
"fixes": [
|
|
11
|
+
"修复 2.17.0 中 user 声明触发 NATIVE_CODE_INVALID / NATIVE_CONTRACT_CLOSURE_MISMATCH:共享校验器按配置事实(资源存在、能力等于 read/create、码与路径形状)校验并并入用户标准路由,配置 bundle 不变,旧平台无需升级。",
|
|
12
|
+
"生成码统一为 user.资源码.records / user.资源码.submit,符合稳定码模式。"
|
|
13
|
+
],
|
|
14
|
+
"affectedUsers": [
|
|
15
|
+
"使用 openxiangda 2.17.0 并声明 user 用户面的应用开发者。"
|
|
16
|
+
],
|
|
17
|
+
"upgradeSteps": [
|
|
18
|
+
"应用精确依赖升级到 openxiangda 2.17.1 后重新运行 check 与部署。"
|
|
19
|
+
],
|
|
20
|
+
"knownLimitations": [
|
|
21
|
+
"“我的记录”的本人过滤仍是查询层展示过滤,非服务端授权边界。"
|
|
22
|
+
],
|
|
23
|
+
"compatibility": {
|
|
24
|
+
"node": ">=24",
|
|
25
|
+
"workspaceGenerations": [
|
|
26
|
+
"v2"
|
|
27
|
+
],
|
|
28
|
+
"platform": "无平台配合要求;配置与契约 bundle 对既有平台保持可部署。",
|
|
29
|
+
"v1": "不改变 V1 运行时或应用。"
|
|
30
|
+
},
|
|
31
|
+
"issues": [],
|
|
32
|
+
"sha256": "365186221004ce60f596db55dca2b53bf9d2d89695956b80daa7b3b4cd028af2",
|
|
33
|
+
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.17.1"
|
|
34
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "openxiangda.release-notes/v1",
|
|
3
|
+
"version": "2.18.0",
|
|
4
|
+
"status": "reviewed",
|
|
5
|
+
"title": "OpenXiangda 2.18.0:用户标准面闭合修复、列表可排序声明与发布提效",
|
|
6
|
+
"summary": "共享编译器完成用户标准面契约闭合校验;模块列表视图新增 sortableFields 排序声明(GAP-MODULE-001);发布验证按浏览器字节分级并收窄浏览器证据指纹,纯工具链补丁不再触发浏览器矩阵。",
|
|
7
|
+
"newFeatures": [
|
|
8
|
+
"列表视图新增 sortableFields:与 filterFields/searchableFields 同构声明可排序列;defaultSort.field 保持隐式可排序,重复容忍;引用未声明字段报编译错误;低层 data.resources 语义不变。",
|
|
9
|
+
"发布提效:验证计划按“浏览器应用实际加载的字节”分级(根包前端入口/contracts 浏览器入口),共享校验器等 Node 侧改动不再触发浏览器矩阵;浏览器阶段缓存指纹只包含浏览器捆绑包,devkit-core 等候选的字节变化不再使浏览器证据失效(候选版本仍由规范化锁覆盖)。"
|
|
10
|
+
],
|
|
11
|
+
"fixes": [
|
|
12
|
+
"修复 2.17.0 中 user 声明触发 NATIVE_CODE_INVALID / NATIVE_CONTRACT_CLOSURE_MISMATCH:共享校验器按配置事实校验并并入用户标准路由,配置 bundle 不变,旧平台无需升级。",
|
|
13
|
+
"生成码统一为 user.资源码.records / user.资源码.submit,符合稳定码模式。"
|
|
14
|
+
],
|
|
15
|
+
"affectedUsers": [
|
|
16
|
+
"使用 openxiangda 2.17.0 并声明 user 用户面的应用开发者。",
|
|
17
|
+
"从 data.resources 迁移到模块化声明、需要列表列头排序能力的应用(如数智工会 szgh-v2)。"
|
|
18
|
+
],
|
|
19
|
+
"upgradeSteps": [
|
|
20
|
+
"应用精确依赖升级到 openxiangda 2.18.0 后重新运行 check 与部署。",
|
|
21
|
+
"模块化迁移的列表排序用 sortableFields 声明,与既有低层声明逐字段对齐。"
|
|
22
|
+
],
|
|
23
|
+
"knownLimitations": [
|
|
24
|
+
"“我的记录”的本人过滤仍是查询层展示过滤,非服务端授权边界。"
|
|
25
|
+
],
|
|
26
|
+
"compatibility": {
|
|
27
|
+
"node": ">=24",
|
|
28
|
+
"workspaceGenerations": [
|
|
29
|
+
"v2"
|
|
30
|
+
],
|
|
31
|
+
"platform": "无平台配合要求;配置与契约 bundle 对既有平台保持可部署。",
|
|
32
|
+
"v1": "不改变 V1 运行时或应用。"
|
|
33
|
+
},
|
|
34
|
+
"issues": [],
|
|
35
|
+
"sha256": "c5744c1cdd46e8922615d1b3bff521e072108906882a25c4d0f75f93f869c4af",
|
|
36
|
+
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.18.0"
|
|
37
|
+
}
|
package/skills/manifest.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
{
|
|
5
5
|
"name": "openxiangda-v2",
|
|
6
6
|
"description": "使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具体变更出发,通过对话发现模块、完成详细产品设计,由 AI 在工作区内调用 OpenDesign 原版 CLI/Skill/MCP 形成整体视觉与可运行原型,再开发、检查和交付应用。OpenDesign 客户端只作为可选预览器;维护 1.x 应用时使用对应的 1.x 技能。",
|
|
7
|
-
"sha256": "
|
|
7
|
+
"sha256": "6f9d3c2d8d8260a9dd82c277fae8567598a3d4a1b8905ac2eaf679aa9c2085c5"
|
|
8
8
|
}
|
|
9
9
|
]
|
|
10
10
|
}
|
|
@@ -40,10 +40,10 @@ AI 接到新应用、页面或改版任务时,在同一个 OpenXiangda 工作
|
|
|
40
40
|
未创建工作区时使用本 Skill 随根包发布的精确版本:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
pnpm dlx openxiangda@2.
|
|
44
|
-
pnpm dlx openxiangda@2.
|
|
45
|
-
pnpm dlx openxiangda@2.
|
|
46
|
-
pnpm dlx openxiangda@2.
|
|
43
|
+
pnpm dlx openxiangda@2.18.0 auth status --cwd <应用目录> --base-url <平台地址> --json
|
|
44
|
+
pnpm dlx openxiangda@2.18.0 login --cwd <应用目录> --base-url <平台地址>
|
|
45
|
+
pnpm dlx openxiangda@2.18.0 create <应用目录> --base-url <同一平台地址>
|
|
46
|
+
pnpm dlx openxiangda@2.18.0 skill install --force
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
创建前把产品要求的目标平台明确带入命令,不从旧登录态推断站点。已有工作区从原绑定恢复,平台不一致时先解决登录与目标,不改 link 文件跨站创建。
|
|
@@ -175,3 +175,23 @@ import 'openxiangda/mobile/styles.css';
|
|
|
175
175
|
PC 抽屉提供“全屏 / 新开页面 / 关闭”。全屏保留当前表单;新开页面先暂存,再通过草稿 ID 恢复,内容不放入 URL。移动录入使用平台移动字段的分组行式布局、简单标题和底部操作,不放“返回列表”或桌面输入控件;草稿箱和恢复确认使用底部弹层。
|
|
176
176
|
|
|
177
177
|
自定义表单可从 `openxiangda/react` 使用 `createResourceFormDraftClient(resourceCode, mode, recordId?, viewCode?)`,提供 `list/save/remove/submit`。命名视图只能恢复和提交属于当前视图的草稿;所有视图仍共用每人每个模型 20 份的上限。`save` 使用草稿 ID、expectedRevision 和可编辑字段值;`submit` 消费现有 DataTransactionOperation,不另建 CRUD 后端。此能力需要平台的 authenticated-form-drafts SQL 迁移及对应服务端版本,平台未升级时界面会明确显示暂存失败并保留输入。
|
|
178
|
+
|
|
179
|
+
## 列表排序声明 {#sortable-fields}
|
|
180
|
+
|
|
181
|
+
模块化列表视图用 `sortableFields` 声明用户可点击列头排序的列;`defaultSort.field`
|
|
182
|
+
隐式可排序,两者重复出现不报错。与 `filterFields` / `searchableFields` 同构:
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
crud: [{
|
|
186
|
+
model: 'venues',
|
|
187
|
+
list: {
|
|
188
|
+
fields: ['name', 'capacity'],
|
|
189
|
+
filterFields: ['capacity'],
|
|
190
|
+
searchableFields: ['name'],
|
|
191
|
+
sortableFields: ['capacity'],
|
|
192
|
+
defaultSort: { field: 'name', order: 'asc' },
|
|
193
|
+
},
|
|
194
|
+
}]
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
引用未声明字段按编译错误处理;低层 `data.resources[].fields[].sortable` 语义不变。
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
| `audit.read` 可写 `true`(绑定本资源读能力)或能力数组 | `audit: { read: true }` |
|
|
23
23
|
| `resource-ref.*` 必须带 `source` 来源协议 | `{ type: 'resource-ref.single', source: { kind: 'resource', resourceCode: 'repair-requests', labelField: 'title', searchFields: ['title'], pageSize: 20, loadMode: 'search' } }` |
|
|
24
24
|
| `labelField` 必须指向目标资源的 `text.short` / `text.long` 字段 | 不要用流水号/选项字段当 label |
|
|
25
|
+
| 列表可排序列用视图级 `sortableFields` 表达(`defaultSort.field` 隐式可排序) | `list: { sortableFields: ['capacity'], defaultSort: { field: 'name', order: 'asc' } }` |
|
|
25
26
|
| 每个字段都必须带中文/业务 `label`(含子表外键与排序字段) | `{ code: 'requestId', type: 'uuid', label: '所属申请', required: true }` |
|
|
26
27
|
| 子表 `subtable` 的外键是子资源的 **uuid** 字段,排序字段是**可写 number.integer** | 子资源:`{ code: 'requestId', type: 'uuid', required: true }` + `{ code: 'sortOrder', type: 'number.integer', required: true }`;父表:`subtable: { resourceCode: 'repair-items', foreignKey: 'requestId', orderField: 'sortOrder', maxRows: 20 }` |
|
|
27
28
|
| 图片/附件的 `file` 限定数量与大小 | `file: { maxCount: 3, maxSizeMb: 10, accept: ['image/png', 'image/jpeg'] }` |
|
|
@@ -66,10 +66,10 @@ MCP 服务随项目根包一起安装,AI 客户端的 stdio 连接仍需配置
|
|
|
66
66
|
以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
|
-
pnpm dlx openxiangda@2.
|
|
70
|
-
pnpm dlx openxiangda@2.
|
|
71
|
-
pnpm dlx openxiangda@2.
|
|
72
|
-
pnpm dlx openxiangda@2.
|
|
69
|
+
pnpm dlx openxiangda@2.18.0 skill install --force
|
|
70
|
+
pnpm dlx openxiangda@2.18.0 auth status --base-url <平台地址> --json
|
|
71
|
+
pnpm dlx openxiangda@2.18.0 login --cwd my-app --base-url https://platform.example.com
|
|
72
|
+
pnpm dlx openxiangda@2.18.0 create my-app --base-url https://platform.example.com
|
|
73
73
|
cd my-app
|
|
74
74
|
pnpm openxiangda context --json
|
|
75
75
|
pnpm openxiangda dev
|
|
@@ -171,9 +171,9 @@ MCP 的 `docs_read` 可以读取本说明,当前没有独立的源码操作 MC
|
|
|
171
171
|
无需本地工作区,使用本 Skill 随包精确版本或已安装的对应 CLI:
|
|
172
172
|
|
|
173
173
|
```bash
|
|
174
|
-
pnpm dlx openxiangda@2.
|
|
175
|
-
pnpm dlx openxiangda@2.
|
|
176
|
-
pnpm dlx openxiangda@2.
|
|
174
|
+
pnpm dlx openxiangda@2.18.0 auth status --base-url <平台> --json
|
|
175
|
+
pnpm dlx openxiangda@2.18.0 source resolve <仓库URL> --base-url <平台> --json
|
|
176
|
+
pnpm dlx openxiangda@2.18.0 source clone <仓库URL> <新目录> --base-url <平台> --json
|
|
177
177
|
```
|
|
178
178
|
|
|
179
179
|
登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回
|