openyida 2026.7.22 → 2026.7.23

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.
@@ -17,6 +17,26 @@ function readJsonInput(value, options) {
17
17
  return fs.readFileSync(resolvedPath, 'utf-8');
18
18
  }
19
19
 
20
+ function normalizeCreateFields(fields) {
21
+ if (
22
+ !Array.isArray(fields)
23
+ || fields.length === 0
24
+ || !fields.every((item) => (
25
+ item
26
+ && typeof item === 'object'
27
+ && !Array.isArray(item)
28
+ && String(item.action || '').toLowerCase() === 'add'
29
+ && item.field
30
+ && typeof item.field === 'object'
31
+ && !Array.isArray(item.field)
32
+ ))
33
+ ) {
34
+ return fields;
35
+ }
36
+
37
+ return fields.map((item) => item.field);
38
+ }
39
+
20
40
  function createDefinitionReaders(dependencies) {
21
41
  const {
22
42
  fs,
@@ -43,9 +63,9 @@ function createDefinitionReaders(dependencies) {
43
63
  let columns = 1;
44
64
 
45
65
  if (Array.isArray(parsed)) {
46
- fields = parsed;
66
+ fields = normalizeCreateFields(parsed);
47
67
  } else if (typeof parsed === 'object' && parsed !== null) {
48
- fields = parsed.fields || [];
68
+ fields = normalizeCreateFields(parsed.fields || []);
49
69
  columns = parsed.columns !== undefined ? parsed.columns : 1;
50
70
  if (Array.isArray(parsed.validations)) {
51
71
  validations = parsed.validations;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openyida",
3
- "version": "2026.7.22",
3
+ "version": "2026.7.23",
4
4
  "description": "OpenYida CLI - 宜搭低代码 AI 开发工具(安装即用,零配置)",
5
5
  "bin": {
6
6
  "openyida": "bin/yida.js",
@@ -259,6 +259,10 @@ openyida copy
259
259
 
260
260
  fast_build 页面源码默认不得使用 \`this.dataSourceMap.*\`,除非本轮已经明确创建并绑定设计器数据源;默认使用入口型页面或 \`this.utils.yida.*\` 查询已创建表单。
261
261
 
262
+ fast_build 创建/解析多个表单后,页面阶段需要字段映射时,对每个目标表单默认只执行一次 \`openyida get-schema <appType> <formUuid> --field-map-json\`,读取完整 JSON 并写入/复用 \`.cache/<项目名>-schema.json\`;不要用 \`head\` / \`tail\` / \`grep\` 截断 schema stdout 后重复拉取。
263
+
264
+ Canvas 页面实现二选一:走模板路径时先写业务化 \`page-spec.json\` 再 \`openyida generate-page ... --spec ... --compile\`,之后只做必要小范围 Edit/patch;如果已经明确最终页面结构,跳过 \`generate-page\`,直接 Write 最终 \`.canvas.jsx\`。不要 generate-page 后马上 Read 大段源码并全量 Write 覆盖同一路径。
265
+
262
266
  不要默认加载 \`yida-page-uiux\`、\`yida-data-source-connectors\`、\`yida-data-management\`、\`yida-nav-group\`、\`yida-dashboard\`,也不要默认做示例数据、导航整理、截图验收、公开访问、长 PRD 或深读 references;这些只在用户明确要求或 \`full_demo\` / \`deep_design\` 时执行。
263
267
 
264
268
  ## 子技能目录
@@ -149,6 +149,10 @@ schema-managed create/update 必须等待用户对当前 `planId` 显式批准
149
149
 
150
150
  **Canvas 数据边界**:完整应用/真实交付页如果展示列表、看板或详情记录,必须优先把本轮真实 `appType/formUuid/fieldId` 写入 `page-spec.json` 的 `dataBinding.mode=form`;需要演示记录时先写入真实表单再读取。未接真实表单且未写入 demo records 时,页面展示空态/入口,不用前端 seedRows 冒充业务数据。
151
151
 
152
+ **Schema 获取去重**:完整应用创建/解析多个表单后,页面阶段需要字段映射时,对每个目标表单默认只执行一次 `openyida get-schema <appType> <formUuid> --field-map-json`,读取完整 JSON 并合并到 `.cache/<项目名>-schema.json` 复用。不要用 `head`/`tail`/`grep` 截断 get-schema stdout 作为字段证据,也不要因此对同一表单重复拉取多轮 schema。
153
+
154
+ **Canvas 生成路径二选一**:走模板路径时,先写业务化 `page-spec.json` 再 `openyida generate-page ... --spec ... --compile`,后续只读 manifest/摘要并小范围 Edit;不要立即 Read 大段源码再全量 Write 覆盖同一路径。若已经明确最终页面结构,跳过 `generate-page` 直接 Write 最终 `.canvas.jsx`。
155
+
152
156
  **doneWhen**:`yida-app` 发布主页面成功并输出可访问 URL。到这里默认完成;不要发布后继续 TaskCreate、重复读技能或继续规划。
153
157
 
154
158
  **optionalAfterDone**:导航整理、示例数据、公开访问、截图验证、深度视觉方向、数据源/连接器深度接入、报表/大屏,只在用户明确要求或 `yida-app` 模式为 `full_demo` / `deep_design` 时执行。
@@ -232,7 +236,7 @@ schema-managed create/update 必须等待用户对当前 `planId` 显式批准
232
236
 
233
237
  1. **按阶段加载必要技能**:按意图选 1 个主技能;完整应用按阶段加载当下唯一需要的子技能,禁止并发批量读取多个 `SKILL.md` 或预读未来阶段技能。
234
238
  2. **Resource-First**:任何 legacy 写操作前先解析本轮显式资源、agent bound context、workspace cache/config、历史上下文;已有目标资源时默认修改/补齐/发布,只有目标缺失且意图允许创建时才加载 create 类技能。
235
- 3. **优先复用 direct 映射**:仅对 direct/standalone 资源,已有 `.cache/<项目名>-schema.json` 中可确认新鲜的 `appType`/`formUuid`/`fieldId` 可复用;该文件不是 Schema-as-Code state,也不是远端真相。字段缺失、重名或结构变化时执行 `get-schema --compact --resolve-fields`,不得猜测。
239
+ 3. **优先复用 direct 映射**:仅对 direct/standalone 资源,已有 `.cache/<项目名>-schema.json` 中可确认新鲜的 `appType`/`formUuid`/`fieldId` 可复用;该文件不是 Schema-as-Code state,也不是远端真相。字段缺失、重名或结构变化时执行 `get-schema --compact --resolve-fields`;完整应用页面需要多字段/多表单映射时每表单一次性执行 `get-schema --field-map-json` 并缓存完整字段摘要。不得猜测字段 ID,也不要用 `head`/`tail`/`grep` 截断 schema stdout 当证据。
236
240
  4. **模板优先**:复杂产物先用 `openyida sample` 或现有示例生成骨架,再做最小改动。
237
241
  5. **配置承载优先于代码**:字段/公式/联动/报表/审批/集成交给对应技能,自定义页面只做展示与胶水。
238
242
  6. **数据性能优先**:统计聚合用 `yida-report` 服务端聚合,不在前端拉全量后自行聚合。
@@ -36,6 +36,7 @@ description: 宜搭完整应用开发编排技能。对普通 OpenYida 应用做
36
36
  - 只有用户只给应用名称、存在多个候选、resource context 冲突,或需要诊断目标 app 访问失败时,才运行 `openyida app-list [--size N]`。
37
37
  - 已知 `appType` 后,查询该应用下表单/页面用 `openyida list-forms <appType> [--keyword <text>]`;选择页面发布目标时只用 `formType=display`。
38
38
  - 查询表单/页面 Schema、字段 ID 或批量字段摘要用 `openyida get-schema <appType> <formUuid|--all> ...`。
39
+ - 完整应用页面阶段如果需要多个表单的字段映射,默认对每个目标业务表单执行一次 `openyida get-schema <appType> <formUuid> --field-map-json`,读取完整 JSON 并合并到 `.cache/<项目名>-schema.json`;不要对同一表单用 `tail/head/grep` 截断 stdout 后再重复拉取。
39
40
  - 阶段 0 禁止编造 `list-apps` / `get-app`;也不要把 `--app-type` / `--form-uuid` 当成 `list-forms` 或 `get-schema` 的参数。按目的在 `app-list`、`list-forms`、`get-schema` 三者中选择。
40
41
 
41
42
  该阶段只决定普通 OpenYida resource context;schema-managed 路径仍以 schema CLI 的 validate/plan/apply 结果为准。schema-managed create/update 必须停在当前 `planId`,等待用户显式批准后才可执行 `apply`;`nextAction`、错误恢复或本技能判断都不能授予 `mixed/write`。Phase 1 中 report、automation、page config、delete、pull 不从 Manifest fallback 到本技能的 legacy workflow。
@@ -91,6 +92,7 @@ description: 宜搭完整应用开发编排技能。对普通 OpenYida 应用做
91
92
 
92
93
  [Step 6] 编写自定义页面代码 → 默认 use_skill("yida-canvas-custom-page", "生成 Code Canvas 主页面")
93
94
  ↓ 先写业务化 page-spec.json,再 openyida generate-page <模板> --theme-profile yida-app-theme --theme-scope page --spec <page-spec.json> --compile
95
+ ↓ 字段映射来自 `.cache/<项目名>-schema.json`;同一表单不要重复 get-schema,除非刚修改字段或缓存不完整
94
96
  ↓ 本轮已创建/解析业务表单且页面需要列表/看板/详情数据时,必须在 spec.dataBinding 写 mode=form + 真实 appType/formUuid/fieldId;深度接入再加载 yida-canvas-data-binding
95
97
  ↓ 明确要求普通自定义页面 JSX/Jsx 组件链路,或强依赖 this.$ / this.utils.yida.* / this.dataSourceMap 等实例桥时选择 yida-custom-page
96
98
 
@@ -154,11 +156,16 @@ UI 不是独立替代主流程的步骤,而是按模式插入到页面生成
154
156
  | `yida-data-management` | `openyida sample yida-data-management form-field-template` | 表单字段定义和数据插入 |
155
157
  | `yida-create-app` | `openyida sample yida-create-app ipd-app-template` | 完整应用创建示例 |
156
158
 
157
- 代码生成前必须:
159
+ 页面实现必须二选一:
160
+
161
+ - **模板路径**:先写业务化 `page-spec.json`,再执行 `openyida generate-page ... --spec <page-spec.json> --compile`。生成后只读取 `.openyida-page.json` / CLI 摘要判断 `domainFidelity` 和 dataBinding 状态;若需要补业务语义或样式,基于生成文件做小范围 Edit/patch。禁止在 `generate-page` 后立即 Read 500+ 行源码再全量 Write 覆盖同一路径。
162
+ - **手写路径**:如果已经明确最终页面结构、数据桥和视觉细节,跳过 `generate-page`,直接 Write 最终 `.canvas.jsx`,再做本地快检和 publish。不要先生成模板再把模板完全覆盖。
163
+
164
+ 选择模板路径时必须:
158
165
 
159
166
  1. 先从 PRD 提炼当前业务自己的 page spec;
160
167
  2. 再执行对应的 `openyida generate-page` 命令生成 Code Canvas 骨架;
161
- 3. 读取 manifest `domainFidelity`,若仍是 sample-reference / draft,则补 spec 或改源码;
168
+ 3. 读取 manifest / CLI 摘要的 `domainFidelity`,若仍是 sample-reference / draft,则补 spec 或小范围改源码;
162
169
  4. 以模板为基础扩展交互和真实数据;
163
170
  5. 验证所有参数名称与 CLI 一致。
164
171
 
@@ -171,7 +178,7 @@ UI 不是独立替代主流程的步骤,而是按模式插入到页面生成
171
178
  | 0. 解析资源上下文 | 无 | 合并本轮显式资源、agent bound context、workspace config/cache、会话历史;本轮显式目标覆盖 bound context;判定 app/page/form/process 的 `source` 和 `allowCreate` | 明确复用、创建缺口或需要 ask_human |
172
179
  | 1. resolve app + app name | `yida-create-app` 仅在 app 缺失且允许创建时加载;`openyida update-app` 仅用于预创建占位 app 改名 | 已有 `appType`/应用 URL/bound app 时直接复用;若 bound/precreated app 仍是占位名,在语义名稳定后执行 `openyida update-app <appType> --name "<语义应用名>"`;否则创建应用并提取真实 `appType` | 拿到真实目标 `appType`,预创建占位 app 已改成语义名或明确跳过,且不会重复创建同类 app |
173
180
  | 2. 记录最小需求 | 无 | 写 `prd/<项目名>.md`:只记录 MVP 假设、核心表单/页面、完成标准;写/更新 `.cache/<项目名>-schema.json` standalone 映射;不要写长 PRD | 业务语义和 ID 存储位置明确 |
174
- | 3. resolve forms | `yida-create-form-page` | 已有目标表单时 update/patch/rule/bind-datasource;缺少支撑 MVP 的核心表单且允许创建时才 create;字段配置文件写入 `.cache/openyida/<项目名>/` | 拿到或确认表单 `formUuid` 和真实 `fieldId` |
181
+ | 3. resolve forms | `yida-create-form-page` | 已有目标表单时 update/patch/rule/bind-datasource;缺少支撑 MVP 的核心表单且允许创建时才 create;字段配置文件写入 `.cache/openyida/<项目名>/`;创建/解析多个表单后,对每个目标表单最多一次性获取完整 `--field-map-json` 并合并写回 `.cache/<项目名>-schema.json` | 拿到或确认表单 `formUuid` 和真实 `fieldId` |
175
182
  | 4. resolve main page | `yida-create-page` 仅在主页面缺失且允许创建时加载 | 已有页面 URL / `formUuid` / bound page 时直接作为主页面;否则创建一个用户主入口 display page | 拿到真实目标页面 `formUuid`,且不会重复创建页面 |
176
183
  | 5. 编写/更新页面 | 默认 `yida-canvas-custom-page`;明确要求 JSX/Jsx 组件链路或实例桥强依赖时选择 `yida-custom-page` | 生成或修改主页面源码;只实现 MVP 首屏和核心操作。可用已解析表单链接、真实空态、表单入口和轻量指标口径完成主页面;若展示业务列表/看板/详情记录,必须接本轮真实表单 `dataBinding.mode=form`,或先写入 demo records 后再读取;不要加载视觉/密度/报表/数据源等额外技能 | 本地源码通过对应页面技能的基础校验;未执行 publish 时仍是“源码已修改,尚未发布” |
177
184
  | 6. 发布页面 | `yida-publish-page` | 按页面链路校验后发布到已解析主页面:Canvas `.canvas.jsx` 使用 `openyida publish` 的 Canvas 编译阶段或 `compileCanvasLocal` 快检;普通自定义页面 `.oyd.jsx` / `.jsx` 跑 `check-page` / `compile`;再执行 `openyida publish <source> <appType> <displayPageFormUuid>` 发布主页面 | 发布成功并获得可访问 URL |
@@ -105,6 +105,7 @@ openyida sample yida-canvas-custom-page portal-native-components --output projec
105
105
  8. **门户运行态组件要补必需 props 和局部降级**:`QuickAccessCard` / `RecentlyUsedCard` 必须传 `theme="row-white"` 等必需 props,避免运行态读取 `theme.includes(...)` 报错;所有门户/字段/上传增强组件外层加局部 ErrorBoundary,单个组件不兼容时只降级该块,不让整页进入 Canvas 错误态。
106
106
  9. **自定义主题必须页面内注入**:`--theme` 只接受平台预置 key;如果页面设计使用非预置主题(例如活力橙、深玫红、自定义暗黑金),Canvas 页面必须在自身源码中注入 `style#yida-global-theme` 或等价 scoped CSS vars,并在根节点设置 `data-theme-scope="page"`。官方 sample 每个页面都要做,避免宿主应用 `black` 主题把页面染成黑灰。
107
107
  10. **真实交付不使用前端 seed 冒充业务数据**:`openyida sample` 原样发布可以保留 sample/seed 数据,但必须在页面上标注为 sample/seed。完整应用或真实交付页只要需要列表、看板、详情记录,并且本轮已经创建/解析业务表单,就必须在 `page-spec.json` 写入 `dataBinding.mode=form`、真实 `appType/formUuid` 和字段映射,让页面从表单读取。若需要演示数据,先通过表单数据写入链路创建 demo/mock records,再由 Canvas 读取这些真实表单记录;未写入 demo records 且没有真实数据时展示空态、表单入口、刷新/登记按钮。
108
+ 11. **页面生成二选一**:选择模板路径时,`openyida generate-page ... --spec ... --compile` 之后只读取 CLI 摘要或 `.openyida-page.json` 判断 `domainFidelity` / dataBinding,并对生成源码做小范围 Edit/patch;禁止立刻 Read 大段源码后全量 Write 覆盖同一路径。选择手写路径时,直接 Write 最终 `.canvas.jsx` 并快检/发布,不要先跑 `generate-page` 再完全覆盖。
108
109
 
109
110
  ## 数据真实性边界
110
111
 
@@ -165,12 +166,14 @@ openyida login --check-only --json
165
166
  # 2. 如需新页面,先创建空白自定义页拿 formUuid
166
167
  openyida create-page <appType> "<页面名>"
167
168
 
168
- # 3. 生成或复制 Canvas 源码
169
+ # 3. 生成或编写 Canvas 源码
170
+ # 模板路径:生成后基于 manifest/摘要和小范围 patch 演进,不全量覆盖生成文件。
169
171
  openyida generate-page workbench-home --theme-profile yida-app-theme --theme-scope page --output project/pages/src/workbench-home.canvas.jsx --compile
170
172
  openyida generate-page dashboard-overview --theme-profile yida-app-theme --theme-scope page --output project/pages/src/dashboard-overview.canvas.jsx --compile
171
173
  openyida generate-page portal-shell-home --theme-profile yida-app-theme --theme-scope page --output project/pages/src/portal-shell-home.canvas.jsx --compile
172
174
  openyida sample yida-canvas-custom-page native-components-smoke --output project/pages/src/native-components-smoke.canvas.jsx
173
175
  openyida sample yida-canvas-custom-page portal-native-components --output project/pages/src/portal-native-components.canvas.jsx
176
+ # 手写路径:已明确最终页面结构时,跳过 generate-page,直接 Write 最终 .canvas.jsx。
174
177
 
175
178
  # 4. 本地 Canvas 快检
176
179
  node -e "const fs=require('fs'); const {compileCanvasLocal}=require('./lib/app/canvas-compile'); const src=fs.readFileSync('project/pages/src/<页面名>.canvas.jsx','utf8'); console.log(compileCanvasLocal(src).importedModules)"
@@ -178,8 +181,8 @@ node -e "const fs=require('fs'); const {compileCanvasLocal}=require('./lib/app/c
178
181
  # 5. 发布(本轮修改源码后的远端完成证据)
179
182
  openyida publish project/pages/src/<页面名>.canvas.jsx <appType> <formUuid>
180
183
 
181
- # 6. 发布后回读 Schema 验收
182
- openyida get-schema <appType> <formUuid> > .cache/openyida/<页面名>-schema.json
184
+ # 6. 发布后回读字段摘要验收;如需留证,用结构化文件写入工具保存 stdout,不用 shell 重定向
185
+ openyida get-schema <appType> <formUuid> --field-map-json
183
186
  ```
184
187
 
185
188
  `openyida check-page` / `openyida compile` 当前面向普通自定义页面 `.oyd.jsx` / `.jsx`;Canvas 以 `compileCanvasLocal` 和 `openyida publish .canvas.jsx` 的 Canvas 编译阶段为准。`compileCanvasLocal` 是发布前快检,不能替代 `openyida publish` 的远端写入证据。
@@ -8,6 +8,8 @@
8
8
 
9
9
  `generate-page` 的模板只用于选定运行时契约、数据桥、主题变量和首版 primitives;它不是最终视觉稿。生成真实页面时,必须结合 `yida-page-uiux` 的视觉方向决策块重写区块顺序、信息层级、局部构图、文案和样式节奏。可以保留模板的编译安全结构和必要 primitive class,但不要照搬默认 Hero、卡片网格、三段式卖点或库存文案。
10
10
 
11
+ 页面生成路径必须二选一:走模板路径时,先写业务化 `page-spec.json` 并执行 `openyida generate-page ... --spec ... --compile`,之后只读取 CLI 摘要或 `.openyida-page.json`,再对生成源码做小范围 Edit/patch;不要立刻 Read 大段源码后全量 Write 覆盖同一路径。若已经明确最终页面结构、数据桥和视觉细节,走手写路径,跳过 `generate-page`,直接 Write 最终 `.canvas.jsx`。
12
+
11
13
  生成器会在 `.openyida-page.json` 中写入 `domainFidelity`,并在 CLI 输出中提示当前页面是否还依赖 sample fallback:
12
14
 
13
15
  - `domain-ready`:主要业务语义已覆盖,sample 只剩编译骨架。
@@ -15,12 +15,16 @@ description: 确定性解析表单字段 ID(fieldId)和子表路径;agent
15
15
  - 不要缓存过期的 Schema 信息,表单结构变更后必须重新获取
16
16
  - 不要把进程内状态或 CLI 自动派生索引当作跨调用缓存;查询新字段时允许重新拉取完整 Schema
17
17
  - 不要把 `openyida get-schema` 的 stdout 通过 shell 重定向保存成 JSON,也不要用 heredoc、`cat`/`echo`/`printf`/`tee` 生成 Schema 文件
18
+ - 不要把 `openyida get-schema` 的 stdout 再接 `head`、`tail`、`grep`、`sed`、`awk` 等截断/筛选命令作为 Schema 证据;这会丢字段、选项或子表路径,导致后续重复拉取
19
+ - 不要在同一阶段对同一个 `formUuid` 连续执行 `--compact`、`--field-map-json`、完整 Schema 等多轮“探一段 stdout”式查询;除非表单刚被修改、上次命令失败/不完整,或排障需要完整组件 props
18
20
 
19
21
  ## 严格要求 (MUST DO)
20
22
 
21
23
  - **凡是需要用到字段 ID(fieldId)的操作,必须先执行此命令**,不得跳过
22
24
  - 页面开发、数据查询、报表配置或流程规则只需要字段身份时,先执行 `openyida get-schema <appType> <formUuid> --compact --resolve-fields "<字段1,字段2>"`,不要拉取完整 Schema
23
25
  - 页面开发默认使用 compact 输出,只读取必要字段契约,不内联完整 Schema
26
+ - 完整应用页面、看板、列表或详情页需要一个表单的大部分字段,或需要跨多个表单建立 `dataBinding` 时,优先对每个表单执行一次 `openyida get-schema <appType> <formUuid> --field-map-json`,消费完整 JSON 后解析所需字段,不用 shell 截断 stdout
27
+ - 多表单场景同一阶段同一 `formUuid` 默认最多拉取一次字段映射;把 `appType`、`formUuid`、`fieldId`、`label`、`componentName`、`options` 等合并写入 `<projectRoot>/.cache/<项目名>-schema.json`,后续页面 spec 和源码复用该 standalone ID 映射
24
28
  - 执行 compact 查询后,只消费唯一命中的 `fields[]`;`missingFields` 或 `ambiguousFields` 非空时停止,不得猜测或继续写操作
25
29
  - 只有用户明确需要完整组件 props、布局结构、字段数据源配置,或 compact/summary 无法排障时,才执行不带 `--compact`/`--summary-json` 的完整 Schema 输出;拿到完整 Schema 后只读取必要片段,不内联完整 Schema
26
30
  - 已有 `<projectRoot>/.cache/<项目名>-schema.json` 等 standalone ID 映射文件可显式复用;目标字段缺失、重名、结构已变或无法确认新鲜度时,必须重新执行 compact 查询
@@ -74,13 +78,15 @@ openyida get-schema <appType> --all [--summary-json] [--output-dir <dir>] [--key
74
78
 
75
79
  ```bash
76
80
  openyida get-schema APP_XXX FORM-XXX --compact --resolve-fields "访客姓名,状态"
77
- openyida get-schema APP_XXX FORM-XXX --summary-json
81
+ openyida get-schema APP_XXX FORM-XXX --field-map-json
78
82
  ```
79
83
 
80
84
  Agent 只需要少量字段 ID 时,默认使用 `--compact --resolve-fields`,读取 `fields[].label`、`fields[].fieldId`、`fields[].componentType`、`fields[].valueType`、`fields[].path`、`fields[].labelPath` 和 `fields[].parentFieldId`。`path` 是稳定的 fieldId 数组,`labelPath` 是可读路径;所有可用语言的 label 都参与精确匹配。同名字段会进入 `ambiguousFields[].matches`,必须使用完整 `labelPath`、稳定 `path` 或已返回的 fieldId 重新精确选择,禁止取第一个。
81
85
 
82
86
  需要全量字段摘要和选项时继续使用 `--summary-json`。只有需要组件完整 props、布局结构、字段数据源配置或排障时,才执行不带 compact/summary 参数的完整 Schema 输出。
83
87
 
88
+ 消费输出时读取完整 JSON,再由 agent / 脚本解析字段;不要用 `tail -20`、`head -30` 或 `grep` 只看局部 stdout。局部查看可以作为人工调试,但不能作为后续写页面、写数据或配置流程的字段证据。
89
+
84
90
  如需复用输出,使用 agent 的结构化文件写入工具创建:
85
91
 
86
92
  ```text
@@ -167,7 +173,7 @@ Agent compact 模式输出共享 contract,不包含完整 Schema 或 props:
167
173
  |---------|----------|
168
174
  | 命令返回失败 | 确认 appType 和 formUuid 正确,检查登录态 |
169
175
  | 输出被终端截断 | 优先改用 `--summary-json`;确需完整 Schema 时,再将 stdout 通过结构化文件写入工具保存到 `<projectRoot>/.cache/openyida/<项目名或任务名>/<表单名>-schema.json`;不要使用 shell 重定向 |
170
- | 需要多个表单字段 ID | 使用批量 compact 模式:`openyida get-schema <appType> --all --summary-json --output-dir .cache/openyida/<项目名或任务名>/schemas`,默认只读 `index.json` 字段摘要 |
176
+ | 需要多个表单字段 ID | 使用批量摘要或每表单完整字段映射:`openyida get-schema <appType> --all --summary-json --output-dir .cache/openyida/<项目名或任务名>/schemas`,或对目标表单逐个执行一次 `--field-map-json`;默认只读完整 JSON / `index.json` 字段摘要,不用 `head`/`tail`/`grep` 截断 |
171
177
  | 批量部分失败 | 查看 stdout 的 `failedCount` 和 `forms[].errorMsg`,必要时提高 `--retries` 或缩小 `--keyword` 范围 |
172
178
  | 找不到目标字段 | 查看 `missingFields`,确认字段已创建后重新查询;不能手写猜测 fieldId |
173
179
  | 同名字段无法唯一确定 | 查看 `ambiguousFields[].matches[].labelPath` 和稳定 `path`,使用完整路径或 fieldId 重新查询;不得默认取第一个 |