openyida 2026.7.19 → 2026.7.21
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/README.md +14 -0
- package/bin/yida.js +107 -18
- package/lib/app/create-app.js +12 -1
- package/lib/app/create-form/args.js +13 -0
- package/lib/app/create-form.js +154 -67
- package/lib/app/create-page.js +45 -9
- package/lib/app/get-schema.js +65 -14
- package/lib/app/import-app.js +92 -41
- package/lib/app/publish.js +289 -556
- package/lib/app/schema-field-resolution.js +370 -0
- package/lib/app/services/app-reader.js +85 -0
- package/lib/app/services/app-service.js +235 -0
- package/lib/app/services/canvas-page-compiler.js +91 -0
- package/lib/app/services/canvas-page-schema-builder.js +149 -0
- package/lib/app/services/field-bindings.js +68 -0
- package/lib/app/services/form-compiler.js +1922 -0
- package/lib/app/services/form-mode-service.js +182 -0
- package/lib/app/services/form-schema-patcher.js +333 -0
- package/lib/app/services/form-schema-reader.js +59 -0
- package/lib/app/services/form-service.js +379 -0
- package/lib/app/services/form-validation.js +562 -0
- package/lib/app/services/native-page-compiler.js +92 -0
- package/lib/app/services/native-page-schema-builder.js +428 -0
- package/lib/app/services/page-resource-service.js +185 -0
- package/lib/app/update-app.js +18 -6
- package/lib/auth/token-auth.js +34 -3
- package/lib/auth/token-store.js +22 -4
- package/lib/bridge/bridge.js +37 -5
- package/lib/core/agent-capabilities.js +5 -3
- package/lib/core/command-manifest.js +40 -0
- package/lib/core/doctor.js +15 -4
- package/lib/core/env-cmd.js +1 -1
- package/lib/core/env.js +7 -6
- package/lib/core/legacy-schema-guard.js +408 -0
- package/lib/core/locales/en.js +8 -46
- package/lib/core/locales/zh.js +8 -46
- package/lib/core/sample.js +1 -1
- package/lib/core/utils.js +334 -66
- package/lib/core/yida-client.js +104 -3
- package/lib/formula/evaluate.js +8 -66
- package/lib/formula/field-refs.js +83 -0
- package/lib/process/configure-process.js +44 -1992
- package/lib/process/create-process.js +54 -87
- package/lib/process/services/process-compiler.js +2056 -0
- package/lib/process/services/process-reader.js +232 -0
- package/lib/process/services/process-resource-service.js +571 -0
- package/lib/process/services/process-service.js +122 -0
- package/lib/process/services/process-stage-checkpoint.js +246 -0
- package/lib/report/append.js +7 -26
- package/lib/report/http.js +31 -5
- package/lib/report/index.js +10 -2
- package/lib/samples/yida-canvas-custom-page/business-list.canvas.jsx +63 -14
- package/lib/samples/yida-canvas-custom-page/dashboard-overview.canvas.jsx +176 -32
- package/lib/samples/yida-canvas-custom-page/data-management.canvas.jsx +228 -14
- package/lib/samples/yida-canvas-custom-page/split-pane-detail.canvas.jsx +204 -8
- package/lib/schema/adapters/app-adapter.js +210 -0
- package/lib/schema/adapters/form-adapter.js +1362 -0
- package/lib/schema/adapters/keys.js +19 -0
- package/lib/schema/adapters/page-adapter.js +566 -0
- package/lib/schema/adapters/process-adapter.js +519 -0
- package/lib/schema/applier.js +1878 -0
- package/lib/schema/apply-store.js +1083 -0
- package/lib/schema/command.js +645 -0
- package/lib/schema/dependency-graph.js +83 -0
- package/lib/schema/errors.js +481 -0
- package/lib/schema/hash.js +9 -0
- package/lib/schema/manifest-limits.js +177 -0
- package/lib/schema/manifest-loader.js +309 -0
- package/lib/schema/manifest-schema-v1.json +193 -0
- package/lib/schema/normalize-manifest.js +281 -0
- package/lib/schema/page-canvas-foundation.js +447 -0
- package/lib/schema/page-data-source-builder.js +561 -0
- package/lib/schema/page-foundation.js +556 -0
- package/lib/schema/page-source-loader.js +314 -0
- package/lib/schema/planner.js +691 -0
- package/lib/schema/remote-dispatch-boundary.js +39 -0
- package/lib/schema/remote-missing.js +21 -0
- package/lib/schema/remote-reader.js +189 -0
- package/lib/schema/resource-registry.js +157 -0
- package/lib/schema/server-revision.js +71 -0
- package/lib/schema/sort.js +28 -0
- package/lib/schema/state-store.js +589 -0
- package/package.json +2 -2
- package/scripts/postinstall.js +8 -12
- package/scripts/validate-package-size.js +1 -1
- package/yida-skills/SKILL.md +114 -29
- package/yida-skills/references/schema-as-code-phase1.md +99 -0
- package/yida-skills/references/setup-and-env.md +59 -59
- package/yida-skills/references/task-retrospective.md +6 -6
- package/yida-skills/skills/yida-app/SKILL.md +60 -14
- package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +18 -7
- package/yida-skills/skills/yida-canvas-custom-page/references/data-bridge-guide.md +3 -3
- package/yida-skills/skills/yida-canvas-custom-page/references/page-generation-guide.md +7 -1
- package/yida-skills/skills/yida-create-app/SKILL.md +21 -3
- package/yida-skills/skills/yida-create-form-page/SKILL.md +19 -1
- package/yida-skills/skills/yida-create-page/SKILL.md +16 -3
- package/yida-skills/skills/yida-create-process/SKILL.md +100 -4
- package/yida-skills/skills/yida-custom-page/SKILL.md +19 -4
- package/yida-skills/skills/yida-dashboard/SKILL.md +1 -1
- package/yida-skills/skills/yida-dashboard/references/pitfalls.md +1 -1
- package/yida-skills/skills/yida-get-schema/SKILL.md +49 -5
- package/yida-skills/skills/yida-i18n/SKILL.md +1 -1
- package/yida-skills/skills/yida-integration/SKILL.md +7 -1
- package/yida-skills/skills/yida-login/SKILL.md +50 -99
- package/yida-skills/skills/yida-page-config/SKILL.md +7 -1
- package/yida-skills/skills/yida-page-uiux/references/app/blueprint.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/app/navigation-patterns.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/app/role-journey.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/dashboard/app-blueprint.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/dashboard/chart-contracts.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/dashboard/component-contracts.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/dashboard/layout-patterns.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/dashboard/theme-recipes.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/detail/object-narrative.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/detail/section-patterns.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/detail/timeline-and-related.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/landing/assets-workflow.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/landing/industry-playbooks.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/landing/research-levels.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/landing/section-patterns.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/list/drawer-detail.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/list/empty-loading-error.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/list/filter-patterns.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/list/table-patterns.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/scenes/screen.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/workbench/entry-patterns.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/workbench/portal-layouts.md +0 -1
- package/yida-skills/skills/yida-page-uiux/references/workbench/task-feed.md +0 -1
- package/yida-skills/skills/yida-page-uiux/workflow/output-decision-block.md +1 -1
- package/yida-skills/skills/yida-process-rule/SKILL.md +35 -1
- package/yida-skills/skills/yida-publish-page/SKILL.md +46 -4
- package/yida-skills/skills/yida-report/SKILL.md +7 -1
- package/yida-skills/skills-index.json +14 -46
- package/yida-skills/skills/large-file-write/SKILL.md +0 -93
- package/yida-skills/skills/large-file-write/references/write-patterns.md +0 -147
- package/yida-skills/skills/large-file-write/scripts/write.js +0 -157
- package/yida-skills/skills/sls-log-workbench/SKILL.md +0 -134
- package/yida-skills/skills/sls-log-workbench/references/workbench-reference.md +0 -130
- package/yida-skills/skills/sls-log-workbench/sls-query.js +0 -295
|
@@ -7,6 +7,16 @@ description: 宜搭普通自定义页面 JSX / Jsx 组件开发规范(React 16
|
|
|
7
7
|
|
|
8
8
|
> **先确认链路**:普通自定义页面 JSX/Jsx 组件链路走本技能,发布后落到平台 `Jsx` 组件;Code Canvas 链路走 `yida-canvas-custom-page`,发布后落到 `YidaCodeCanvas` 组件。两者是并列页面实现链路,不要把本技能描述成 Code Canvas 的备用链路。已有普通自定义页面升级到 Code Canvas 时才走 `yida-canvas-upgrade`。
|
|
9
9
|
|
|
10
|
+
## Resource-First 页面开发
|
|
11
|
+
|
|
12
|
+
编写页面源码前,先按根技能解析目标 app/page/form context:
|
|
13
|
+
|
|
14
|
+
- 已有页面 URL、display `formUuid`、bound page 或 workspace cache/config 中可确认的自定义页面时,直接为该页面编写/修改源码,并交给 `yida-publish-page` 发布;不要先调用 `yida-create-page`。
|
|
15
|
+
- bound page 只是默认页面,不是锁定目标;如果当前会话绑定页面 A,但用户本轮明确说要修改页面 B,先解析 B 的 URL / display `formUuid` / 页面名称。B 能唯一解析时改 B;B 无法唯一解析时询问用户;禁止静默把需求发布到 A。
|
|
16
|
+
- 完整应用 `fast_build` 如果已有 bound app/page,主页面源码直接落到该页面;只在缺少主入口 display page 且用户意图允许新增时创建页面容器。
|
|
17
|
+
- 用户只说“优化这个页面 URL / 修改现有页面 / 重新发布”时,本技能与 `yida-publish-page` 配合即可完成,不创建 app/page。
|
|
18
|
+
- 如果用户给的是普通表单 `formUuid`,页面源码只能把它作为数据源或入口链接使用;不能把数据表单 ID 当作发布目标。
|
|
19
|
+
|
|
10
20
|
## 核心规则
|
|
11
21
|
|
|
12
22
|
### 致命规则(FATAL)
|
|
@@ -48,6 +58,7 @@ description: 宜搭普通自定义页面 JSX / Jsx 组件开发规范(React 16
|
|
|
48
58
|
13. **严禁 emoji**:页面渲染出来的任何位置(标题、按钮、标签、状态、空态文案、图表标题等)**一律禁止出现 emoji**(😀🚀✅⚠️📦📊 等一切彩色符号字符)。需要图标一律用功能性内联 SVG(见 `skills/yida-page-uiux` 图标策略);需要状态标记用文字 + 语义色标签。emoji 是最明显的 AI 味来源之一,且跨端显示不一致。JS 注释里也不要留装饰性符号。
|
|
49
59
|
14. **light 页面禁灰黑主题**:普通业务列表、协同表、录入表、工作台和门户默认不要用近黑按钮、近黑描边、灰黑重阴影作为主题;主操作、选中态、筛选焦点和批量操作使用品牌色或 sample 自带主题色,边框用浅色品牌混合。只有用户明确要求暗色/高对比时才使用深色主视觉。
|
|
50
60
|
15. **发布前必须跑检查链路**:先执行 `openyida check-page <file>` 和 `openyida compile <file>`;若出现 warning/error,按规则修复后再发布
|
|
61
|
+
16. **源码修改发布闭环**:只要本轮 Write/Edit/Create 了 `project/pages/src/*.{oyd.jsx,jsx,tsx}` 普通自定义页面源码,`check-page` / `compile` 只证明源码可发布,不等于远端页面已更新;final 前必须看到成功的 `openyida publish <source> <appType> <displayPageFormUuid>`。没有 publish 成功证据时,只能说“源码已修改,尚未发布”,不能说“页面已更新 / 已重新发布”。
|
|
51
62
|
|
|
52
63
|
> 每条规则的代码示例、反模式和常见错误见 [编码指南](references/coding-guide.md);`fast_build` 默认先遵守本技能正文,不预读长 reference,只有 check-page 报错、复杂交互、`deep_design` 或正文覆盖不了的问题时才读取。
|
|
53
64
|
> 运行时易错点、`check-page` 规则和兼容层自动修复边界见 [运行时护栏](references/runtime-guardrails.md),按需读取。
|
|
@@ -72,7 +83,7 @@ description: 宜搭普通自定义页面 JSX / Jsx 组件开发规范(React 16
|
|
|
72
83
|
|
|
73
84
|
## 快速开始
|
|
74
85
|
|
|
75
|
-
|
|
86
|
+
以开发「员工信息查询页」为例,完整流程如下:
|
|
76
87
|
|
|
77
88
|
1. 获取表单 Schema,确认字段 ID:
|
|
78
89
|
|
|
@@ -83,7 +94,9 @@ openyida get-schema APP_XXX FORM-EMPLOYEE
|
|
|
83
94
|
如需保存完整 Schema,使用 create_file / Write / file edit tool 创建 `<projectRoot>/.cache/openyida/employee-query/employee-schema.json`;ID 映射仍写 `<projectRoot>/.cache/employee-query-schema.json`。
|
|
84
95
|
|
|
85
96
|
```bash
|
|
86
|
-
# Step 2
|
|
97
|
+
# Step 2:确认或补齐自定义页面发布目标
|
|
98
|
+
# 已有页面 URL / display formUuid 时直接复用该 formUuid,例如 FORM-QUERY001。
|
|
99
|
+
# 只有没有目标页面且允许新增时才执行:
|
|
87
100
|
openyida create-page APP_XXX "员工信息查询"
|
|
88
101
|
|
|
89
102
|
# Step 3:生成/编写普通自定义页面 JSX 代码
|
|
@@ -100,15 +113,17 @@ openyida publish project/pages/src/employee-query.oyd.jsx APP_XXX FORM-QUERY001
|
|
|
100
113
|
|
|
101
114
|
**关键说明**:
|
|
102
115
|
- **Step 1** 的 get-schema 输出包含所有字段的 fieldId,在代码中必须使用 `FIELDS` 常量映射这些 ID
|
|
103
|
-
- **Step
|
|
116
|
+
- **Step 2** 默认复用已有页面 context 并跳过 `openyida create-page`;但本轮用户明确指定另一个页面时先切换目标,不能唯一识别时询问;只有页面缺失且允许新增时才执行创建命令
|
|
117
|
+
- **Step 3** 的页面代码必须遵循本技能正文;[编码指南](references/coding-guide.md) 和 [运行时护栏](references/runtime-guardrails.md) 在 check-page 报错、复杂交互、`deep_design` 或正文覆盖不了时读取
|
|
104
118
|
- 注意:`openyida generate-page` 默认生成 Code Canvas `.canvas.jsx`;明确需要普通自定义页面 JSX/Jsx 组件链路时输出 `.oyd.jsx` 或加 `--native`
|
|
119
|
+
- **Step 4** 是本地质量门槛,**Step 5** 才是远端页面更新证据;如果本轮只完成文件 Write/Edit 或 `check-page` / `compile`,final 只能说明“源码已修改,尚未发布”
|
|
105
120
|
- 优先通过 `openyida generate-page ... --compile` 生成高质量骨架;需要完整交互样板时使用 `todo-mvc`
|
|
106
121
|
- 页面生成 spec、接口调试 JSON、一次性验证脚本等临时工件必须用结构化文件写入工具创建到 `<projectRoot>/.cache/openyida/<项目名或任务名>/` 下;不要在仓库根目录、系统临时目录或 `.cache/` 顶层生成 `page.json`、`data.json` 或脚本文件
|
|
107
122
|
- `check-page` 支持行级禁用:`// openyida-lint-disable-line <rule>` 或 `// openyida-lint-disable-next-line <rule>`。只在确认该行不会触发宜搭运行时问题时使用。
|
|
108
123
|
|
|
109
124
|
## fast_build 默认页面模板
|
|
110
125
|
|
|
111
|
-
完整应用 `fast_build`
|
|
126
|
+
完整应用 `fast_build` 编写或更新主页面时,默认选择以下轻量闭环之一:
|
|
112
127
|
|
|
113
128
|
1. 入口型页面:展示表单入口、核心流程说明、少量统计占位和快捷按钮,不执行真实列表查询。
|
|
114
129
|
2. 内置数据 API 页面:用 `this.utils.yida.searchFormDatas` 查询已创建表单,用 `this.utils.yida.saveFormData` 做快速新增;所有失败路径恢复 `loading: false` 并展示空态。
|
|
@@ -114,7 +114,7 @@ metadata:
|
|
|
114
114
|
7. **禁止在看板内直接 fetch 钉钉 OpenAPI 或写 accessToken**:必须通过集成自动化后端托管连接器鉴权
|
|
115
115
|
8. **禁止 cdnjs.cloudflare.com**:宜搭环境被拦截,ECharts / html2canvas 统一用 `g.alicdn.com`
|
|
116
116
|
9. **禁止缺少 `.sl-no-capture` 标记或写无事件截图按钮**:截图按钮本身要被 html2canvas 排除,且必须有真实 `onClick`;静态状态胶囊、筛选展示项、截图占位标签一律用 `span/div`
|
|
117
|
-
10. **禁止 2300 行一口气写到单个 create_file**:超过 1000
|
|
117
|
+
10. **禁止 2300 行一口气写到单个 create_file**:超过 1000 行必须用结构化文件写入工具分批创建/追加;Windows 下也禁止用 `Get-Content -Raw | ConvertTo-Json` 处理大 `.oyd.jsx`
|
|
118
118
|
11. **禁止集成自动化 priority 入参用 processVar 透传 RadioField/SelectField 的选项值**:连接器要求 Number(10/20/30/40),正常方案必须 `priority:processVar:<priorityNum NumberField 字段 ID>`;`literal:10` 只能作为临时回滚止血方案,否则 UI 优先级选项会失效
|
|
119
119
|
|
|
120
120
|
---
|
|
@@ -233,7 +233,7 @@ class 名建议用项目前缀(`sl-` / `sc-` 等),不要直接 `.no-captur
|
|
|
233
233
|
|
|
234
234
|
**正确做法**:
|
|
235
235
|
- **> 1000 行**必须分批:第一次 `create_file`(覆盖),后续 `append=true` + 提供 `continuation_context`
|
|
236
|
-
-
|
|
236
|
+
- 或使用当前 agent 的结构化文件写入工具创建 Node.js payload 后分段写入
|
|
237
237
|
- 分批时按**语义边界**切分(常量块 → 函数块 → renderJsx 块),不要在一个函数中间切
|
|
238
238
|
- Windows 下不要用 `Get-Content -Raw | ConvertTo-Json` 把大 `.oyd.jsx` 转成 patch 文件;这会制造多份转义副本并可能耗尽内存
|
|
239
239
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yida-get-schema
|
|
3
|
-
description:
|
|
3
|
+
description: 确定性解析表单字段 ID(fieldId)和子表路径;agent 优先使用 compact 字段契约,排障时仍可获取完整 Schema。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 获取表单 Schema
|
|
@@ -13,12 +13,18 @@ description: 获取表单的完整 Schema 结构,用于确认字段 ID(field
|
|
|
13
13
|
- 不要跳过 Schema 获取步骤直接进行数据操作,即使用户催促也必须先获取
|
|
14
14
|
- 不要在 Schema 获取失败时继续执行后续操作,必须先解决问题
|
|
15
15
|
- 不要缓存过期的 Schema 信息,表单结构变更后必须重新获取
|
|
16
|
+
- 不要把进程内状态或 CLI 自动派生索引当作跨调用缓存;查询新字段时允许重新拉取完整 Schema
|
|
16
17
|
- 不要把 `openyida get-schema` 的 stdout 通过 shell 重定向保存成 JSON,也不要用 heredoc、`cat`/`echo`/`printf`/`tee` 生成 Schema 文件
|
|
17
18
|
|
|
18
19
|
## 严格要求 (MUST DO)
|
|
19
20
|
|
|
20
21
|
- **凡是需要用到字段 ID(fieldId)的操作,必须先执行此命令**,不得跳过
|
|
21
|
-
-
|
|
22
|
+
- 页面开发、数据查询、报表配置或流程规则只需要字段身份时,先执行 `openyida get-schema <appType> <formUuid> --compact --resolve-fields "<字段1,字段2>"`,不要拉取完整 Schema
|
|
23
|
+
- 页面开发默认使用 compact 输出,只读取必要字段契约,不内联完整 Schema
|
|
24
|
+
- 执行 compact 查询后,只消费唯一命中的 `fields[]`;`missingFields` 或 `ambiguousFields` 非空时停止,不得猜测或继续写操作
|
|
25
|
+
- 只有用户明确需要完整组件 props、布局结构、字段数据源配置,或 compact/summary 无法排障时,才执行不带 `--compact`/`--summary-json` 的完整 Schema 输出;拿到完整 Schema 后只读取必要片段,不内联完整 Schema
|
|
26
|
+
- 已有 `<projectRoot>/.cache/<项目名>-schema.json` 等 standalone ID 映射文件可显式复用;目标字段缺失、重名、结构已变或无法确认新鲜度时,必须重新执行 compact 查询
|
|
27
|
+
- 如需保存关键字段 ID 映射,使用结构化文件写入工具;这是 agent 管理的 standalone 工件,不是 OpenYida CLI 自动缓存
|
|
22
28
|
- 如需保存完整 Schema 文件,先执行命令获取 stdout,再用 create_file / Write / file edit tool 写入 `<projectRoot>/.cache/openyida/<项目名或任务名>/<表单名>-schema.json`;从 workspace 根执行后续命令时传 `project/.cache/...`
|
|
23
29
|
- **录入/更新数据后,必须用 `openyida data query --size 1` 抽查一条记录,确认 `formData` 中字段有实际值(非空 `""`),若全部为空说明字段 ID 有误,需重新排查**
|
|
24
30
|
|
|
@@ -46,6 +52,7 @@ description: 获取表单的完整 Schema 结构,用于确认字段 ID(field
|
|
|
46
52
|
## 命令
|
|
47
53
|
|
|
48
54
|
```bash
|
|
55
|
+
openyida get-schema <appType> <formUuid> --compact [--resolve-fields <labelOrFieldId,...>]
|
|
49
56
|
openyida get-schema <appType> <formUuid> [--summary-json|--field-map-json]
|
|
50
57
|
openyida get-schema <appType> --all [--summary-json] [--output-dir <dir>] [--keyword <text>] [--concurrency N] [--retries N]
|
|
51
58
|
```
|
|
@@ -54,6 +61,8 @@ openyida get-schema <appType> --all [--summary-json] [--output-dir <dir>] [--key
|
|
|
54
61
|
|------|------|------|
|
|
55
62
|
| `appType` | 是 | 应用 ID |
|
|
56
63
|
| `formUuid` | 单表模式必填 | 表单 UUID |
|
|
64
|
+
| `--compact` | 否 | 输出 `yida_schema_field_resolution` contract v1,不输出完整 Schema |
|
|
65
|
+
| `--resolve-fields <query,...>` | 否 | 按精确 label、fieldId、alias、稳定 ID 路径或 `子表/字段` 可读路径筛选;可重复,自动启用 compact |
|
|
57
66
|
| `--all` | 批量模式必填 | 获取应用下所有表单/页面的 Schema |
|
|
58
67
|
| `--output-dir <dir>` | 否 | 将每个 Schema 写入独立 JSON 文件,并生成 `index.json` |
|
|
59
68
|
| `--keyword <text>` | 否 | 仅批量导出名称、UUID、类型或路径匹配关键词的表单 |
|
|
@@ -64,10 +73,13 @@ openyida get-schema <appType> --all [--summary-json] [--output-dir <dir>] [--key
|
|
|
64
73
|
### 单表模式
|
|
65
74
|
|
|
66
75
|
```bash
|
|
76
|
+
openyida get-schema APP_XXX FORM-XXX --compact --resolve-fields "访客姓名,状态"
|
|
67
77
|
openyida get-schema APP_XXX FORM-XXX --summary-json
|
|
68
78
|
```
|
|
69
79
|
|
|
70
|
-
|
|
80
|
+
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
|
+
|
|
82
|
+
需要全量字段摘要和选项时继续使用 `--summary-json`。只有需要组件完整 props、布局结构、字段数据源配置或排障时,才执行不带 compact/summary 参数的完整 Schema 输出。
|
|
71
83
|
|
|
72
84
|
如需复用输出,使用 agent 的结构化文件写入工具创建:
|
|
73
85
|
|
|
@@ -91,7 +103,38 @@ openyida get-schema APP_XXX --all --keyword 客户 --concurrency 5 --retries 2
|
|
|
91
103
|
|
|
92
104
|
## 输出
|
|
93
105
|
|
|
94
|
-
|
|
106
|
+
Agent compact 模式输出共享 contract,不包含完整 Schema 或 props:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"kind": "yida_schema_field_resolution",
|
|
111
|
+
"contractVersion": 1,
|
|
112
|
+
"resource": {
|
|
113
|
+
"appType": "APP_XXX",
|
|
114
|
+
"formUuid": "FORM-XXX",
|
|
115
|
+
"schemaHash": "sha256:<64位小写十六进制>"
|
|
116
|
+
},
|
|
117
|
+
"fields": [
|
|
118
|
+
{
|
|
119
|
+
"query": "订单明细/商品名称",
|
|
120
|
+
"label": "商品名称",
|
|
121
|
+
"fieldId": "textField_xxx",
|
|
122
|
+
"componentType": "TextField",
|
|
123
|
+
"valueType": "custom",
|
|
124
|
+
"path": ["tableField_xxx", "textField_xxx"],
|
|
125
|
+
"labelPath": ["订单明细", "商品名称"],
|
|
126
|
+
"parentFieldId": "tableField_xxx",
|
|
127
|
+
"alias": ""
|
|
128
|
+
}
|
|
129
|
+
],
|
|
130
|
+
"missingFields": [],
|
|
131
|
+
"ambiguousFields": []
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
`--compact` 不带 `--resolve-fields` 时按 Schema 顺序返回全部正规化字段。指定 `--resolve-fields` 时,`fields` 只含唯一命中项,未命中和重名分别进入 `missingFields`、`ambiguousFields`。
|
|
136
|
+
|
|
137
|
+
单表模式默认仍将完整的 Schema JSON 输出到 stdout,包含 `pages`、`componentsMap` 等字段结构;兼容摘要模式可用 `--summary-json` 或 `--field-map-json`:
|
|
95
138
|
|
|
96
139
|
```json
|
|
97
140
|
{
|
|
@@ -126,5 +169,6 @@ openyida get-schema APP_XXX --all --keyword 客户 --concurrency 5 --retries 2
|
|
|
126
169
|
| 输出被终端截断 | 优先改用 `--summary-json`;确需完整 Schema 时,再将 stdout 通过结构化文件写入工具保存到 `<projectRoot>/.cache/openyida/<项目名或任务名>/<表单名>-schema.json`;不要使用 shell 重定向 |
|
|
127
170
|
| 需要多个表单字段 ID | 使用批量 compact 模式:`openyida get-schema <appType> --all --summary-json --output-dir .cache/openyida/<项目名或任务名>/schemas`,默认只读 `index.json` 字段摘要 |
|
|
128
171
|
| 批量部分失败 | 查看 stdout 的 `failedCount` 和 `forms[].errorMsg`,必要时提高 `--retries` 或缩小 `--keyword` 范围 |
|
|
129
|
-
| 找不到目标字段 |
|
|
172
|
+
| 找不到目标字段 | 查看 `missingFields`,确认字段已创建后重新查询;不能手写猜测 fieldId |
|
|
173
|
+
| 同名字段无法唯一确定 | 查看 `ambiguousFields[].matches[].labelPath` 和稳定 `path`,使用完整路径或 fieldId 重新查询;不得默认取第一个 |
|
|
130
174
|
| Schema 输出为空 | 表单可能没有字段,先用 `yida-create-form-page` 创建字段 |
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yida-integration
|
|
3
|
-
description:
|
|
3
|
+
description: Standalone 创建/管理宜搭集成自动化;如果请求来自 Schema-as-Code manifest/state,停止,不降级直写。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# yida-integration — 宜搭集成&自动化(逻辑流)技能
|
|
7
7
|
|
|
8
|
+
## 适用范围:standalone 资源
|
|
9
|
+
|
|
10
|
+
- SAC Phase 1 下,本技能只处理明确 standalone 的集成自动化。用户提供 Schema-as-Code manifest、要求 schema validate/plan/apply,或自动化身份来自 Schema-as-Code state 时,不执行创建、更新、开启或关闭,稳定停止为 unsupported。
|
|
11
|
+
- 不得把 SAC unsupported/conflict/uncertain 降级为 `integration create` 等 legacy 写入,不得按名称 discover/adopt、猜逻辑流 ID 或自动重建。
|
|
12
|
+
- 只有自动化明确 standalone/unmanaged,或用户明确要求 standalone legacy 命令时,以下参数、stdout/stderr、发布/启停和返回行为才按原契约使用;所有权不明确时零远端写。
|
|
13
|
+
|
|
8
14
|
## 严格禁止 (NEVER DO)
|
|
9
15
|
|
|
10
16
|
- 不要在未加载本技能内容的情况下编写逻辑流定义,节点格式复杂且易出错
|
|
@@ -1,142 +1,93 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yida-login
|
|
3
|
-
description: 宜搭登录态管理。默认 OAuth token
|
|
3
|
+
description: 宜搭登录态管理。默认 OAuth token;YIDA_AUTH_ENABLED=true 时使用宿主注入 token。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# yida-login
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## Mode
|
|
9
9
|
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
- 不要让业务命令携带 Cookie 或 `_csrf_token`;OpenYida CLI 会在请求时自动注入 `Authorization: Bearer <access_token>`。
|
|
10
|
+
- IF `YIDA_AUTH_ENABLED=true`: `auth_mode=token`, `auth_source=env`; only credential sources are host-injected token env such as `OPENYIDA_ACCESS_TOKEN` and `OPENYIDA_REFRESH_TOKEN`.
|
|
11
|
+
- ELSE: `auth_mode=token`; use OAuth token flow only.
|
|
12
|
+
- NEVER infer auth from `.cache/cookies*.json`.
|
|
14
13
|
|
|
15
|
-
##
|
|
14
|
+
## Preflight
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
- 未登录或 token 不可用时,执行 `openyida login`;登录后用 `openyida auth status` 或 `openyida login --check-only --json` 验证 `status=ok` / `can_auto_use=true`。
|
|
19
|
-
- **本技能不读写 memory**:登录态通过项目工作目录下的 `.cache/auth-token-<env>.json` 持久化,不依赖跨会话 memory。
|
|
20
|
-
- 用户提到登录"海外宜搭/国际版/日本宜搭/全球宜搭/Global YiDA"等海外语义时,必须给登录命令加 `--intl`(或 `--global` / `--overseas`),否则会走默认国内登录环境。
|
|
16
|
+
Run first:
|
|
21
17
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|---------|---------|
|
|
26
|
-
| 首次使用或 token 失效 | 其他命令报 401/未登录/token 失效时触发 |
|
|
27
|
-
| 切换账号/组织 | 先 `openyida logout` 再重新登录 |
|
|
28
|
-
| 切换宜搭环境 | 登录命令带目标 URL、`--endpoint` 或环境 flag |
|
|
29
|
-
|
|
30
|
-
## 触发条件
|
|
31
|
-
|
|
32
|
-
**正向触发**:
|
|
18
|
+
```bash
|
|
19
|
+
openyida agent-capabilities --summary-json
|
|
20
|
+
```
|
|
33
21
|
|
|
34
|
-
|
|
35
|
-
- 用户明确说"登录"、"重新登录"、"换账号登录"。
|
|
36
|
-
- 首次使用 openyida,尚无 `.cache/auth-token-<env>.json`。
|
|
22
|
+
Fallback only when needed:
|
|
37
23
|
|
|
38
|
-
|
|
24
|
+
```bash
|
|
25
|
+
openyida env --json
|
|
26
|
+
openyida login --check-only --json
|
|
27
|
+
```
|
|
39
28
|
|
|
40
|
-
|
|
41
|
-
- 只需要刷新 access token 时,优先 `openyida auth refresh`,不要强制重新登录。
|
|
42
|
-
- 切换组织时,应先 `openyida logout` 再重新登录到目标组织。
|
|
29
|
+
## Decision Table
|
|
43
30
|
|
|
44
|
-
|
|
31
|
+
| Observed status | Action |
|
|
32
|
+
|---|---|
|
|
33
|
+
| `auth_mode=token`, `status=ok` or `can_auto_use=true` | Continue business command |
|
|
34
|
+
| `failure_reason=env_token_missing` | STOP; host did not inject `OPENYIDA_ACCESS_TOKEN` or `OPENYIDA_REFRESH_TOKEN`; do not OAuth |
|
|
35
|
+
| `auth_mode=token`, not logged in, `YIDA_AUTH_ENABLED` is not true | Run `openyida login`, then verify with `openyida login --check-only --json` |
|
|
45
36
|
|
|
46
|
-
|
|
37
|
+
## Token Mode Commands
|
|
47
38
|
|
|
48
|
-
|
|
39
|
+
Use OAuth login only when `YIDA_AUTH_ENABLED` is not true.
|
|
49
40
|
|
|
50
41
|
```bash
|
|
51
42
|
openyida login
|
|
43
|
+
openyida login --check-only --json
|
|
44
|
+
openyida auth status
|
|
45
|
+
openyida auth refresh
|
|
46
|
+
openyida auth logout
|
|
52
47
|
```
|
|
53
48
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
若用户明确给出宜搭入口 URL,必须把该 URL 传给登录命令,或使用对应环境 flag;不要退化成裸 `openyida login`:
|
|
49
|
+
If user gives a Yida entry URL, pass it through:
|
|
57
50
|
|
|
58
51
|
```bash
|
|
59
52
|
openyida login https://yida-group.alibaba-inc.com/
|
|
60
53
|
openyida login --alibaba
|
|
61
|
-
openyida login --
|
|
54
|
+
openyida login --intl
|
|
62
55
|
```
|
|
63
56
|
|
|
64
|
-
|
|
57
|
+
Overseas / international / global / Japan / Global YiDA => add `--intl` or equivalent.
|
|
65
58
|
|
|
66
|
-
|
|
59
|
+
## Host-Injected Token Mode Commands
|
|
60
|
+
|
|
61
|
+
Use only when `YIDA_AUTH_ENABLED=true`.
|
|
67
62
|
|
|
68
63
|
```bash
|
|
64
|
+
openyida agent-capabilities --summary-json
|
|
65
|
+
openyida env --json
|
|
66
|
+
openyida login --check-only --json
|
|
69
67
|
openyida auth status
|
|
70
68
|
openyida auth refresh
|
|
71
|
-
openyida auth logout
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
`auth refresh` 使用本地 `refresh_token` 换取新的 `access_token`,成功后覆盖同一个 token session 文件。业务命令通常会自动刷新,不需要频繁手动执行。
|
|
75
|
-
|
|
76
|
-
### 海外宜搭 / Global YiDA 登录
|
|
77
|
-
|
|
78
|
-
海外用户使用 DingTalk International(`login.dingtalk.io`)登录。海外登录必须显式声明环境,否则默认走国内 `login.dingtalk.com`。
|
|
79
|
-
|
|
80
|
-
**触发条件**(用户表达任意一项即视为海外场景,必须加 `--intl`):
|
|
81
|
-
|
|
82
|
-
- 中文:海外、海外版、国际、国际版、全球、全球版、海外宜搭、国际宜搭、全球宜搭、日本、日本宜搭
|
|
83
|
-
- 英文:overseas、international、global、abroad、intl、Global YiDA
|
|
84
|
-
|
|
85
|
-
**推荐流程**:
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
openyida env switch intl # 持久切到 intl,后续命令默认走海外
|
|
89
|
-
openyida login --intl # OAuth token 登录,写入 auth-token-intl.json
|
|
90
|
-
openyida app-list # 验证 API 调通
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
**也支持的命令形式**(任选一种 flag 皆等价):
|
|
94
|
-
|
|
95
|
-
```bash
|
|
96
|
-
openyida login --intl # 推荐写法
|
|
97
|
-
openyida login --global # 别名
|
|
98
|
-
openyida login --overseas # 别名
|
|
99
|
-
openyida login --env intl # 通用 --env 形式
|
|
100
69
|
```
|
|
101
70
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
## 输出
|
|
71
|
+
Expected usable shape:
|
|
105
72
|
|
|
106
73
|
```json
|
|
107
74
|
{
|
|
108
|
-
"ok": true,
|
|
109
|
-
"status": "ok",
|
|
110
75
|
"auth_mode": "token",
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"base_url": "https://www.aliwork.com",
|
|
115
|
-
"corp_id": "dingxxx",
|
|
116
|
-
"user_id": "1955225xxx",
|
|
117
|
-
"user_name": "张三"
|
|
76
|
+
"auth_source": "env",
|
|
77
|
+
"status": "ok",
|
|
78
|
+
"can_auto_use": true
|
|
118
79
|
}
|
|
119
80
|
```
|
|
120
81
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
## 错误处理
|
|
124
|
-
|
|
125
|
-
各命令通过响应体和 HTTP 状态自动处理 token 异常:
|
|
82
|
+
## NEVER
|
|
126
83
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
| 401 / 403 / 302 | 服务端未识别当前 Bearer token | 先 `openyida auth refresh`,仍失败则 `openyida login` |
|
|
84
|
+
- Never hardcode or print `access_token`, `refresh_token`, Cookie, or CSRF.
|
|
85
|
+
- Never read/write `.env`, token files, or Cookie files manually.
|
|
86
|
+
- In host-injected token mode: 不要再执行 `openyida login` 触发 OAuth.
|
|
87
|
+
- In host-injected token mode: 缺 token 时回到宿主修复注入,不要查找本地 `.cache/cookies*.json`.
|
|
88
|
+
- Do not pass Cookie, `_csrf_token`, or Bearer token manually in business commands.
|
|
133
89
|
|
|
134
|
-
##
|
|
90
|
+
## Done
|
|
135
91
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
| 浏览器未自动打开 | 复制终端输出的 OAuth URL 到本机浏览器完成登录 |
|
|
139
|
-
| 登录后 token 仍无效 | 执行 `openyida auth status` 和 `openyida env --json` 验证环境、base_url 与 token 文件 |
|
|
140
|
-
| 反复登录失败 | 停止重试,提示用户联系开发同学 @天晟,不要自主尝试其他登录方案 |
|
|
141
|
-
| access token 过期 | 自动刷新;必要时手动执行 `openyida auth refresh` |
|
|
142
|
-
| refresh token 过期 | 执行 `openyida login` 重新获取 token |
|
|
92
|
+
- Login/auth preflight reports usable auth, or
|
|
93
|
+
- Host-injected token mode reports a clear stop reason for the host to fix.
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yida-page-config
|
|
3
|
-
description:
|
|
3
|
+
description: Standalone 配置已有页面的公开访问和组织内分享;如果请求来自 Schema-as-Code manifest/state,停止,不降级直写。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 页面配置
|
|
7
7
|
|
|
8
|
+
## 适用范围:standalone 资源
|
|
9
|
+
|
|
10
|
+
- SAC Phase 1 下,本技能只处理明确 standalone 的已有页面配置。用户提供 Schema-as-Code manifest、要求 schema validate/plan/apply,或页面身份来自 Schema-as-Code state 时,不执行页面配置写入,稳定停止为 unsupported。
|
|
11
|
+
- 不得把 unsupported、conflict、stale、reconciliation required 或 uncertain 自动降级为 `save-share-config`/`update-form-config`,不得按标题或 URL adopt、猜 formUuid。
|
|
12
|
+
- 只有页面明确 standalone/unmanaged,或用户明确要求 standalone legacy 配置时,以下命令、stdout/stderr 和返回行为才按原契约使用;所有权不明确时零远端写。
|
|
13
|
+
|
|
8
14
|
## 严格禁止 (NEVER DO)
|
|
9
15
|
|
|
10
16
|
- 不要为使用宜搭表单数据的自定义页面配置公开访问(`/o/xxx`),匿名用户无法调用需要登录态的表单接口
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
- **archetype**:<dashboard: overview/analysis/monitor/report/compare/operation;其他场景写 profile/table-management/operation/brand-home 等>
|
|
13
13
|
- **interactionProfile**:<primaryAction、detailMode(drawer/page/iframe/none)、bulkActions、empty/loading/error 状态>
|
|
14
14
|
- **insights**:<看板/报告/工作台写 1-3 条“结论 + 证据 + 建议”;无洞察则空数组>
|
|
15
|
-
- **dataBinding
|
|
15
|
+
- **dataBinding**:<真实数据来源;有表单写 mode=form + appType/formUuid/fields;有连接器写同源 endpoint;无真实数据的完整交付页写 mode=none/空态策略,只有 sample/离线预览可写 mode=seed 并标注演示数据>
|
|
16
16
|
- **气质关键词**:<2-3 个>
|
|
17
17
|
- **项目特定设计原则**:<3-5 条,具体到业务>
|
|
18
18
|
- **布局骨架**:<来自 scene 文件的骨架,按本页信息调整>
|