yidaconnector 2026.6.11
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/LICENSE +21 -0
- package/README.md +383 -0
- package/bin/yida.js +670 -0
- package/lib/app/form-navigation.js +58 -0
- package/lib/app/get-schema.js +538 -0
- package/lib/auth/auth.js +294 -0
- package/lib/auth/cdp-browser-login.js +390 -0
- package/lib/auth/codex-login.js +71 -0
- package/lib/auth/login.js +475 -0
- package/lib/auth/org.js +363 -0
- package/lib/auth/qr-login.js +1563 -0
- package/lib/core/chalk.js +384 -0
- package/lib/core/check-update.js +82 -0
- package/lib/core/cli-error.js +39 -0
- package/lib/core/command-manifest.js +106 -0
- package/lib/core/env-cmd.js +545 -0
- package/lib/core/env-manager.js +601 -0
- package/lib/core/env.js +287 -0
- package/lib/core/i18n.js +177 -0
- package/lib/core/locales/ar.js +805 -0
- package/lib/core/locales/de.js +805 -0
- package/lib/core/locales/en.js +1623 -0
- package/lib/core/locales/es.js +805 -0
- package/lib/core/locales/fr.js +805 -0
- package/lib/core/locales/hi.js +805 -0
- package/lib/core/locales/ja.js +1197 -0
- package/lib/core/locales/ko.js +807 -0
- package/lib/core/locales/pt.js +805 -0
- package/lib/core/locales/vi.js +805 -0
- package/lib/core/locales/zh-HK.js +1233 -0
- package/lib/core/locales/zh.js +1584 -0
- package/lib/core/query-data.js +781 -0
- package/lib/core/redact.js +100 -0
- package/lib/core/utils.js +799 -0
- package/lib/core/yida-client.js +117 -0
- package/package.json +94 -0
- package/project/config.json +4 -0
- package/project/pages/src/demo-birthday-game.oyd.jsx +832 -0
- package/project/pages/src/demo-chip-insight.oyd.jsx +983 -0
- package/project/pages/src/demo-compat-smoke.oyd.jsx +58 -0
- package/project/pages/src/demo-crm-batch-entry.oyd.jsx +805 -0
- package/project/pages/src/demo-crm-dashboard.oyd.jsx +677 -0
- package/project/pages/src/demo-future-vision-2026.oyd.jsx +1102 -0
- package/project/pages/src/demo-ppt.oyd.jsx +1192 -0
- package/project/pages/src/demo-salary-calculator.oyd.jsx +904 -0
- package/project/pages/src/yidaconnector-knowledge-doc.oyd.jsx +1714 -0
- package/project/prd/demo-birthday-game.md +39 -0
- package/project/prd/demo-crm.md +463 -0
- package/project/prd/demo-dingtalk-ai-solution-center.md +425 -0
- package/project/prd/demo-future-vision-2026.md +78 -0
- package/project/prd/demo-salary-calculator.md +101 -0
- package/scripts/build-skills-package.js +406 -0
- package/scripts/check-syntax.js +59 -0
- package/scripts/demo-dws.sh +106 -0
- package/scripts/e2e-real/cleanup.js +67 -0
- package/scripts/e2e-real/fixtures/form-fields.json +18 -0
- package/scripts/e2e-real/full-runner.js +1566 -0
- package/scripts/e2e-real/runner.js +293 -0
- package/scripts/e2e-real/skill-coverage.js +115 -0
- package/scripts/generate-command-docs.js +109 -0
- package/scripts/nightly-smoke.js +134 -0
- package/scripts/postinstall.js +545 -0
- package/scripts/solution-center-runner.js +368 -0
- package/scripts/validate-ci.sh +50 -0
- package/scripts/validate-command-manifest.js +119 -0
- package/scripts/validate-package-size.js +78 -0
- package/scripts/validate-skills.js +247 -0
- package/scripts/validate-structure.js +66 -0
- package/yida-skills/SKILL.md +163 -0
- package/yida-skills/references/yida-api.md +1309 -0
- package/yida-skills/skills/large-file-write/SKILL.md +91 -0
- package/yida-skills/skills/large-file-write/references/write-patterns.md +149 -0
- package/yida-skills/skills/large-file-write/scripts/write.js +157 -0
- package/yida-skills/skills/yida-data-management/SKILL.md +252 -0
- package/yida-skills/skills/yida-data-management/references/api-matrix.md +49 -0
- package/yida-skills/skills/yida-data-management/references/data-format-guide.md +159 -0
- package/yida-skills/skills/yida-data-management/references/verified-endpoints.md +62 -0
- package/yida-skills/skills/yida-login/SKILL.md +159 -0
- package/yida-skills/skills/yida-logout/SKILL.md +67 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# API Matrix
|
|
2
|
+
|
|
3
|
+
## 表单实例
|
|
4
|
+
|
|
5
|
+
| 接口 | 方法 | 路径 | 必填参数 | 常用可选参数 |
|
|
6
|
+
| --- | --- | --- | --- | --- |
|
|
7
|
+
| `searchFormDatas` | GET | `/dingtalk/web/{appType}/v1/form/searchFormDatas.json` | `appType`, `formUuid` | `searchFieldJson`, `currentPage`, `pageSize`, `originatorId`, `createFrom`, `createTo`, `modifiedFrom`, `modifiedTo`, `dynamicOrder` |
|
|
8
|
+
| `searchFormDataIds` | GET | `/dingtalk/web/{appType}/v1/form/searchFormDataIds.json` | `appType`, `formUuid` | `searchFieldJson`, `currentPage`, `pageSize`, `originatorId`, `createFrom`, `createTo`, `modifiedFrom`, `modifiedTo`, `dynamicOrder` |
|
|
9
|
+
| `getFormDataById` | GET | `/dingtalk/web/{appType}/v1/form/getFormDataById.json` | `appType`, `formInstId` | - |
|
|
10
|
+
| `saveFormData` | POST | `/dingtalk/web/{appType}/v1/form/saveFormData.json` | `appType`, `formUuid`, `formDataJson` | `deptId` |
|
|
11
|
+
| `updateFormData` | POST | `/dingtalk/web/{appType}/v1/form/updateFormData.json` | `appType`, `formInstId`, `updateFormDataJson` | `useLatestVersion` |
|
|
12
|
+
| `listTableDataByFormInstIdAndTableId` | GET | `/dingtalk/web/{appType}/v1/form/listTableDataByFormInstIdAndTableId.json` | `appType`, `formUuid`, `formInstanceId`, `tableFieldId`, `currentPage`, `pageSize` | - |
|
|
13
|
+
|
|
14
|
+
## 流程实例
|
|
15
|
+
|
|
16
|
+
| 接口 | 方法 | 路径 | 必填参数 | 常用可选参数 |
|
|
17
|
+
| --- | --- | --- | --- | --- |
|
|
18
|
+
| `startProcessInstance` | POST | `/dingtalk/web/{appType}/v1/process/startInstance.json` | `appType`, `processCode`, `formUuid`, `formDataJson` | `deptId` |
|
|
19
|
+
| `getInstanceIds` | GET | `/dingtalk/web/{appType}/v1/process/getInstanceIds.json` | `appType`, `formUuid` | `searchFieldJson`, `taskId`, `instanceStatus`, `approvedResult`, `currentPage`, `pageSize`, `originatorId`, `createFrom`, `createTo`, `modifiedFrom`, `modifiedTo` |
|
|
20
|
+
| `getInstances` | GET | `/dingtalk/web/{appType}/v1/process/getInstances.json` | `appType`, `formUuid` | `searchFieldJson`, `taskId`, `instanceStatus`, `approvedResult`, `currentPage`, `pageSize`, `originatorId`, `createFrom`, `createTo`, `modifiedFrom`, `modifiedTo` |
|
|
21
|
+
| `getInstanceById` | GET | `/dingtalk/web/{appType}/v1/process/getInstanceById.json` | `appType`, `processInstanceId` | - |
|
|
22
|
+
| `updateInstance` | POST | `/dingtalk/web/{appType}/v1/process/updateInstance.json` | `appType`, `processInstanceId`, `updateFormDataJson` | - |
|
|
23
|
+
| `getOperationRecords` | GET | `/dingtalk/web/{appType}/v1/process/getOperationRecords.json` | `appType`, `processInstanceId` | - |
|
|
24
|
+
| `executeTask` | POST | `/dingtalk/web/{appType}/v1/task/executeTask.json` | `appType`, `taskId`, `procInstId`, `outResult`, `remark` | `formDataJson`, `noExecuteExpressions` |
|
|
25
|
+
|
|
26
|
+
## 任务中心
|
|
27
|
+
|
|
28
|
+
| 接口 | 方法 | 路径 | 必填参数 | 常用可选参数 |
|
|
29
|
+
| --- | --- | --- | --- | --- |
|
|
30
|
+
| `getMySubmitInApp` | GET | `/dingtalk/web/{appType}/v1/process/getMySubmitInApp.json` | `appType`, `currentPage`, `pageSize` | `keyword` |
|
|
31
|
+
| `getTodoTasksInApp` | GET | `/dingtalk/web/{appType}/v1/task/getTodoTasksInApp.json` | `appType`, `currentPage`, `pageSize` | `keyword` |
|
|
32
|
+
| `getDoneTasksInApp` | GET | `/dingtalk/web/{appType}/v1/task/getDoneTasksInApp.json` | `appType`, `currentPage`, `pageSize` | `keyword` |
|
|
33
|
+
| `getNotifyMeTasksInApp` | GET | `/dingtalk/web/{appType}/v1/task/getNotifyMeTasksInApp.json` | `appType`, `currentPage`, `pageSize` | `keyword`, `processCodes`, `instanceStatus` |
|
|
34
|
+
|
|
35
|
+
## 常见返回字段
|
|
36
|
+
|
|
37
|
+
### 表单实例
|
|
38
|
+
|
|
39
|
+
- 列表:`content.totalCount`, `content.currentPage`, `content.data[]`
|
|
40
|
+
- 详情:`result.formInstId`, `result.formUuid`, `result.formData`, `result.originator`
|
|
41
|
+
|
|
42
|
+
### 流程实例
|
|
43
|
+
|
|
44
|
+
- 列表:`result.totalCount`, `result.currentPage`, `result.data[]`
|
|
45
|
+
- 详情:`result.data.processInstanceId`, `result.data.processCode`, `result.data.instanceStatus`, `result.data.data`
|
|
46
|
+
|
|
47
|
+
### 任务中心
|
|
48
|
+
|
|
49
|
+
- 列表:`result.totalCount`, `result.currentPage`, `result.data[]`, `result.data[].taskId`
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Data Format Guide
|
|
2
|
+
|
|
3
|
+
## 基础规则
|
|
4
|
+
|
|
5
|
+
- `searchFieldJson` 传字符串,不直接传对象
|
|
6
|
+
- `formDataJson` 传字符串,不直接传对象
|
|
7
|
+
- `updateFormDataJson` 传字符串,不直接传对象
|
|
8
|
+
- `dynamicOrder` 传字符串,不直接传对象
|
|
9
|
+
- `DateField` / `CascadeDateField` 的保存、更新和测试数据值必须使用**13 位毫秒时间戳**,不要传日期字符串
|
|
10
|
+
|
|
11
|
+
## 查询条件格式
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
[
|
|
15
|
+
{
|
|
16
|
+
"key": "字段ID",
|
|
17
|
+
"value": "搜索值",
|
|
18
|
+
"type": "字段类型",
|
|
19
|
+
"operator": "操作符",
|
|
20
|
+
"componentName": "组件名称"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
示例:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
--search-json '[{"key":"textField_xxx","value":"测试","type":"TEXT","operator":"eq","componentName":"TextField"}]'
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 保存 / 更新格式
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"textField_xxx": "文本",
|
|
36
|
+
"numberField_xxx": 10,
|
|
37
|
+
"dateField_xxx": 1719705600000,
|
|
38
|
+
"employeeField_xxx": ["2212173665758008"]
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
更新时只传要修改的字段:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"textField_xxx": "更新后的值"
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 排序格式
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{"numberField_1ac":"+"}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 常见字段值格式
|
|
57
|
+
|
|
58
|
+
| 组件类型 | 查询格式 | 保存 / 更新格式 |
|
|
59
|
+
| --- | --- | --- |
|
|
60
|
+
| 单行 / 多行文本 | `"文本"` | `"文本"` |
|
|
61
|
+
| 数字 | `["1","10"]` 或单值 | `1` |
|
|
62
|
+
| 单选 | `"选项一"` | `"选项一"` |
|
|
63
|
+
| 多选 | `["选项一"]` | `["选项一","选项二"]` |
|
|
64
|
+
| 日期 | `[开始毫秒时间戳,结束毫秒时间戳]` | `13 位毫秒时间戳` |
|
|
65
|
+
| 成员 | `["userId"]` | `["userId"]` |
|
|
66
|
+
| 部门 | `1123456` 或 `["1123456"]` | `["1123456"]` |
|
|
67
|
+
| 城市 | `[省ID,市ID,区ID]` | `[省ID,市ID,区ID]` |
|
|
68
|
+
| 子表单 | `"模糊搜索文本"` | `[{"textField_xxx":"值"}]` |
|
|
69
|
+
| 关联表单 | 不支持直接查询 | `[{"appType":"xxx","formUuid":"xxx","instanceId":"xxx"}]` |
|
|
70
|
+
|
|
71
|
+
## 日期字段(DateField / CascadeDateField)
|
|
72
|
+
|
|
73
|
+
生成测试数据、录入或更新数据时,日期字段必须写入毫秒级时间戳:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"dateField_xxx": 1719705600000,
|
|
78
|
+
"cascadeDateField_xxx": [1719705600000, 1722384000000]
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
不要写成日期字符串:
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"dateField_xxx": "2024-06-30"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
可用 JavaScript 转换固定日期:
|
|
91
|
+
|
|
92
|
+
```js
|
|
93
|
+
new Date('2024-06-30T00:00:00+08:00').getTime()
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
如果传 `YYYY-MM-DD`、`YYYY-MM-DD HH:mm:ss` 或 ISO 字符串,宜搭可能保存失败、保存为空,或导致报表/筛选异常。
|
|
97
|
+
|
|
98
|
+
## 关联表单字段(AssociationFormField)
|
|
99
|
+
|
|
100
|
+
关联表单字段用于引用其他表单的数据记录,数据格式较为特殊。
|
|
101
|
+
|
|
102
|
+
### 保存格式
|
|
103
|
+
|
|
104
|
+
必须传入**数组对象**,每个对象包含三个必填字段:
|
|
105
|
+
|
|
106
|
+
```json
|
|
107
|
+
[
|
|
108
|
+
{
|
|
109
|
+
"appType": "APP_xxx",
|
|
110
|
+
"formUuid": "FORM-xxx",
|
|
111
|
+
"instanceId": "FINST-xxx"
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
| 字段 | 说明 |
|
|
117
|
+
| --- | --- |
|
|
118
|
+
| `appType` | 被关联表单所属应用的 appType |
|
|
119
|
+
| `formUuid` | 被关联表单的 formUuid |
|
|
120
|
+
| `instanceId` | 被关联数据的 formInstId(注意:字段名是 instanceId,不是 formInstId) |
|
|
121
|
+
|
|
122
|
+
### 示例
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
# 1. 先查询被关联表单获取 formInstId
|
|
126
|
+
yidaconnector data query form APP_xxx FORM-客户表 --size 1
|
|
127
|
+
# 返回: formInstId: "FINST-ABC123"
|
|
128
|
+
|
|
129
|
+
# 2. 创建带关联的数据
|
|
130
|
+
yidaconnector data create form APP_xxx FORM-商机表 --data-json '{
|
|
131
|
+
"textField_xxx": "商机名称",
|
|
132
|
+
"associationFormField_xxx": [{"appType":"APP_xxx","formUuid":"FORM-客户表","instanceId":"FINST-ABC123"}]
|
|
133
|
+
}'
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 查询返回格式
|
|
137
|
+
|
|
138
|
+
查询时返回的 `formData` 中,关联表单字段以 `_id` 后缀显示:
|
|
139
|
+
|
|
140
|
+
```json
|
|
141
|
+
{
|
|
142
|
+
"associationFormField_xxx_id": "\"[{...}]\""
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 注意事项
|
|
147
|
+
|
|
148
|
+
- **instanceId 命名**:保存时字段名必须是 `instanceId`,不是 `formInstId`
|
|
149
|
+
- **数组格式**:即使只关联一条数据,也必须使用数组格式 `[{...}]`
|
|
150
|
+
- **三字段必填**:`appType`、`formUuid`、`instanceId` 缺一不可,否则返回参数校验失败
|
|
151
|
+
- **跨应用关联**:如果关联的是其他应用的表单,需要使用对应应用的 appType
|
|
152
|
+
- **API 限制**:部分宜搭环境可能限制通过 API 写入关联表单数据,建议在表单界面手动测试确认
|
|
153
|
+
|
|
154
|
+
## 实现建议
|
|
155
|
+
|
|
156
|
+
- 统一把 CLI 传入的 JSON 参数当作字符串接收
|
|
157
|
+
- 在发送请求前再做 `json.dumps(...)` 或直接透传字符串
|
|
158
|
+
- `currentPage` 从 `1` 开始
|
|
159
|
+
- `pageSize` 建议不超过 `100`
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Verified Endpoints
|
|
2
|
+
|
|
3
|
+
以下接口已在当前环境实际验证通过。
|
|
4
|
+
|
|
5
|
+
环境:
|
|
6
|
+
- baseUrl: `https://lvsumd.aliwork.com`
|
|
7
|
+
- appType: `APP_AQGJYC78UTS6B66B7I80`
|
|
8
|
+
|
|
9
|
+
## 表单实例
|
|
10
|
+
|
|
11
|
+
| 能力 | 方法 | 路径 |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| 查询详情列表 | GET | `/dingtalk/web/{appType}/v1/form/searchFormDatas.json` |
|
|
14
|
+
| 查询 ID 列表 | GET | `/dingtalk/web/{appType}/v1/form/searchFormDataIds.json` |
|
|
15
|
+
| 查询单条详情 | GET | `/dingtalk/web/{appType}/v1/form/getFormDataById.json` |
|
|
16
|
+
| 新增表单实例 | POST | `/dingtalk/web/{appType}/v1/form/saveFormData.json` |
|
|
17
|
+
| 更新表单实例 | POST | `/dingtalk/web/{appType}/v1/form/updateFormData.json` |
|
|
18
|
+
| 查询子表单 | GET | `/dingtalk/web/{appType}/v1/form/listTableDataByFormInstIdAndTableId.json` |
|
|
19
|
+
|
|
20
|
+
## 流程实例
|
|
21
|
+
|
|
22
|
+
| 能力 | 方法 | 路径 |
|
|
23
|
+
| --- | --- | --- |
|
|
24
|
+
| 发起流程 | POST | `/dingtalk/web/{appType}/v1/process/startInstance.json` |
|
|
25
|
+
| 查询流程列表 | GET | `/dingtalk/web/{appType}/v1/process/getInstances.json` |
|
|
26
|
+
| 查询流程 ID 列表 | GET | `/dingtalk/web/{appType}/v1/process/getInstanceIds.json` |
|
|
27
|
+
| 查询流程详情 | GET | `/dingtalk/web/{appType}/v1/process/getInstanceById.json` |
|
|
28
|
+
| 更新流程实例 | POST | `/dingtalk/web/{appType}/v1/process/updateInstance.json` |
|
|
29
|
+
| 获取审批记录 | GET | `/dingtalk/web/{appType}/v1/process/getOperationRecords.json` |
|
|
30
|
+
|
|
31
|
+
## 任务与审批
|
|
32
|
+
|
|
33
|
+
| 能力 | 方法 | 路径 |
|
|
34
|
+
| --- | --- | --- |
|
|
35
|
+
| 执行单个任务 | POST | `/dingtalk/web/{appType}/v1/task/executeTask.json` |
|
|
36
|
+
| 查询待办任务 | GET | `/dingtalk/web/{appType}/v1/task/getTodoTasksInApp.json` |
|
|
37
|
+
| 查询已完成任务 | GET | `/dingtalk/web/{appType}/v1/task/getDoneTasksInApp.json` |
|
|
38
|
+
| 查询已提交任务 | GET | `/dingtalk/web/{appType}/v1/process/getMySubmitInApp.json` |
|
|
39
|
+
| 查询抄送任务 | GET | `/dingtalk/web/{appType}/v1/task/getNotifyMeTasksInApp.json` |
|
|
40
|
+
|
|
41
|
+
## 已验证的参数能力
|
|
42
|
+
|
|
43
|
+
- `query form --search-json`
|
|
44
|
+
- `query form --ids-only`
|
|
45
|
+
- `query process --search-json`
|
|
46
|
+
- `query process --ids-only`
|
|
47
|
+
- `create process --process-code --data-json --dept-id`
|
|
48
|
+
- `update process --data-json`
|
|
49
|
+
- `execute task --out-result --remark`
|
|
50
|
+
- `execute task --data-json`
|
|
51
|
+
- `execute task --no-execute-expressions`
|
|
52
|
+
|
|
53
|
+
## 说明
|
|
54
|
+
|
|
55
|
+
- 文档历史版本中的部分接口名在当前环境不可用,例如:
|
|
56
|
+
- `createFormInstance`
|
|
57
|
+
- `updateFormInstance`
|
|
58
|
+
- `getProcessInstances`
|
|
59
|
+
- `getProcessInstanceById`
|
|
60
|
+
- `updateProcessInstance`
|
|
61
|
+
- `getTodoTasks`
|
|
62
|
+
- 以上已统一替换为本文件列出的真实可用接口。
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: yida-login
|
|
3
|
+
description: 宜搭登录态管理。扫码登录,Cookie 持久化到 .cache/cookies.json。不适用于:已有有效登录态时(先用 yidaconnector env 确认),或切换组织时(应先 logout 再重新登录)。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 宜搭登录态管理
|
|
7
|
+
|
|
8
|
+
## 严格禁止 (NEVER DO)
|
|
9
|
+
|
|
10
|
+
- 不要在代码中硬编码 Cookie 或凭证,Cookie 必须通过 `yidaconnector login` 命令获取并缓存到 `.cache/cookies.json`
|
|
11
|
+
- 不要在 Cookie 失效时手动修改 `.cache/cookies.json`,必须重新执行登录流程
|
|
12
|
+
|
|
13
|
+
## 严格要求 (MUST DO)
|
|
14
|
+
|
|
15
|
+
- 执行任何宜搭操作前,必须先运行 `yidaconnector env` 确认环境和登录态
|
|
16
|
+
- Cookie 失效时,重新登录后必须验证新 Cookie 可用(运行任意查询命令确认)
|
|
17
|
+
- **本技能不读写 memory**:登录态通过 `.cache/cookies.json` 持久化,不依赖跨会话的 memory 状态
|
|
18
|
+
- 用户提到登录"海外宜搭/国际版/日本宜搭/全球宜搭/Global YiDA"等海外语义时,必须给登录命令加 `--intl`(或 `--global` / `--overseas`),否则会生成中国钉钉的二维码,海外 DingTalk 无法扫码
|
|
19
|
+
|
|
20
|
+
## 适用场景
|
|
21
|
+
|
|
22
|
+
| 用户意图 | 触发条件 |
|
|
23
|
+
|---------|---------|
|
|
24
|
+
| 首次使用或 Cookie 失效 | 其他命令报 401/未登录错误时自动触发 |
|
|
25
|
+
| 切换账号/组织 | 先 `yidaconnector logout` 再重新登录 |
|
|
26
|
+
|
|
27
|
+
## 触发条件
|
|
28
|
+
|
|
29
|
+
**正向触发**:
|
|
30
|
+
- 其他命令返回 401 / 未登录 / Cookie 失效错误时自动触发
|
|
31
|
+
- 用户明确说"登录"、"重新登录"、"扫码登录"
|
|
32
|
+
- 首次使用 yidaconnector,尚无 `.cache/cookies.json`
|
|
33
|
+
|
|
34
|
+
**不适用场景(不要触发)**:
|
|
35
|
+
- 已有有效登录态(先用 `yidaconnector env` 确认)
|
|
36
|
+
- 切换组织时(应先 `yidaconnector logout` 再重新登录)
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
> 通常无需手动调用,其他命令在 Cookie 失效时会自动触发登录。
|
|
42
|
+
|
|
43
|
+
## 命令
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
yidaconnector login
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
默认登录路径不需要 Playwright:优先复用缓存;Codex、Qoder、悟空、Claude Code、OpenCode、Cursor 等可检测到的 AI 工具先尝试本地 Chrome/Edge/Chromium CDP 登录,CDP 不可用时再使用二维码 handoff;其他终端环境使用二维码登录。`yidaconnector login --browser` 优先使用本地 Chrome/Edge/Chromium CDP,CDP 不可用时才用 Playwright 兜底。
|
|
50
|
+
|
|
51
|
+
若用户明确给出宜搭入口 URL,必须把该 URL 传给登录命令,或使用对应环境 flag;不要退化成裸 `yidaconnector login`:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
yidaconnector login https://yida-group.alibaba-inc.com/
|
|
55
|
+
yidaconnector login --alibaba
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`https://yida-group.alibaba-inc.com/` 属于阿里内网宜搭,登录态应写入 `cookies-alibaba.json`;`www.aliwork.com`/`cookies-public.json` 表示走了默认公有云环境。
|
|
59
|
+
|
|
60
|
+
### AI 工具二维码登录模式
|
|
61
|
+
|
|
62
|
+
在 AI 对话框环境中没有有效缓存,且本地 CDP 浏览器登录不可用时,`yidaconnector login` 返回 `need_qr_scan` JSON,包含 `qr_image_markdown`、`agent_response_markdown`、`qr_image_file`、`qr_url`、`poll_command` 和 `session_file`。
|
|
63
|
+
|
|
64
|
+
收到 `need_qr_scan` 后:
|
|
65
|
+
|
|
66
|
+
1. 必须在对话框中直接渲染 `qr_image_markdown`,或原样粘贴 `agent_response_markdown`;不要只展示 `qr_image_file` 文件路径或 `qr_url`
|
|
67
|
+
2. 让用户使用钉钉扫码并确认登录
|
|
68
|
+
3. 用户确认后执行 `poll_command`
|
|
69
|
+
4. 若返回 `need_corp_selection`,优先调用 YidaConnector MCP 工具 `select_yida_login_organization`,传入 `session_file`,由 MCP 原生选择控件完成组织选择和 Cookie 写入
|
|
70
|
+
|
|
71
|
+
不要手动编造或写入 Cookie。多组织选择优先使用 `--corp-id <corpId>` 或 MCP 原生组织选择控件,不要把组织列表塞进普通聊天选择控件。
|
|
72
|
+
|
|
73
|
+
### 显式浏览器模式
|
|
74
|
+
|
|
75
|
+
需要强制本地浏览器登录时使用:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
yidaconnector login --browser
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`--browser` 优先使用本地 Chrome / Edge / Chromium CDP,CDP 不可用时才用 Playwright 兜底。
|
|
82
|
+
|
|
83
|
+
下面这些是兼容旧版 AI 内置浏览器 handoff 的显式命令,只有用户明确要求内置浏览器 handoff 时才使用:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
yidaconnector login --codex
|
|
87
|
+
yidaconnector login --qoder
|
|
88
|
+
yidaconnector login --wukong
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
若宿主 in-app browser 缺少 Cookie 导出到 CLI 缓存的桥接能力,不要手动编造或写入 Cookie,改用默认登录或显式 `yidaconnector login --agent-qr`。
|
|
92
|
+
|
|
93
|
+
### 显式二维码命令
|
|
94
|
+
|
|
95
|
+
需要强制使用 AI 工具二维码 handoff 时:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
yidaconnector login --agent-qr
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
该命令返回 `need_qr_scan` JSON,包含可直接渲染的 `qr_image_markdown` 和 `agent_response_markdown`。扫码后执行 `poll_command`。兼容旧命令 `yidaconnector login --codex-qr`。
|
|
102
|
+
|
|
103
|
+
### 海外宜搭 / Global YiDA 登录
|
|
104
|
+
|
|
105
|
+
海外用户使用 DingTalk International(`login.dingtalk.io`)扫码,中国钉钉账号无法扫码海外二维码、反之亦然。海外登录必须显式声明环境,否则默认走国内 `login.dingtalk.com`。
|
|
106
|
+
|
|
107
|
+
**触发条件**(用户表达任意一项即视为海外场景,必须加 `--intl`):
|
|
108
|
+
|
|
109
|
+
- 中文:海外、海外版、国际、国际版、全球、全球版、海外宜搭、国际宜搭、全球宜搭、日本、日本宜搭
|
|
110
|
+
- 英文:overseas、international、global、abroad、intl、Global YiDA
|
|
111
|
+
|
|
112
|
+
**推荐流程(已知能稳定调通业务 API)**:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
yidaconnector env switch intl # 持久切到 intl,后续命令默认走海外
|
|
116
|
+
yidaconnector login --browser # 浏览器登录拿 cookies(写入 cookies-intl.json)
|
|
117
|
+
yidaconnector app-list # 验证 API 调通
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**也支持的命令形式**(任选一种 flag 皆等价):
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
yidaconnector login --intl # 推荐写法
|
|
124
|
+
yidaconnector login --global # 别名
|
|
125
|
+
yidaconnector login --overseas # 别名
|
|
126
|
+
yidaconnector login --agent-qr --intl # AI 工具二维码 + 海外环境
|
|
127
|
+
yidaconnector login --env intl # 通用 --env 形式
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`--intl` 标志会在生成二维码时使用 `login.dingtalk.io`,海外 DingTalk 可扫码完成 OAuth。
|
|
131
|
+
|
|
132
|
+
**Known limitation(海外环境)**:CLI 二维码登录(`--qr` / `--agent-qr`)拿到的 session cookies 当前不被 `www.yidaapps.com` 业务 API 完整认可——OAuth 链路本身能完成(可拿到 csrf_token / corp_id),但接下来调 `app-list` / `create-app` / `create-form` 等 API 时服务端返回 `errorCode:302 LOGIN FAILED`。在该问题修复前,海外环境优先用 `--browser` 模式登录;浏览器登录拿到的 cookies 可正常调用所有业务 API。
|
|
133
|
+
|
|
134
|
+
## 输出
|
|
135
|
+
|
|
136
|
+
```json
|
|
137
|
+
{"csrf_token":"b2a5d192-xxx","corp_id":"dingxxx","user_id":"1955225xxx","base_url":"https://abcd.aliwork.com"}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
> `base_url` 取自登录后浏览器实际跳转到的域名,可能与 `config.json` 中的 `loginUrl` 不同。后续所有 API 请求使用此值。
|
|
141
|
+
|
|
142
|
+
## 错误处理
|
|
143
|
+
|
|
144
|
+
各命令通过响应体 `errorCode` 自动处理登录态异常:
|
|
145
|
+
|
|
146
|
+
| errorCode | 含义 | 处理方式 |
|
|
147
|
+
|-----------|------|---------|
|
|
148
|
+
| `TIANSHU_000030` | CSRF Token 过期 | 自动无头刷新 |
|
|
149
|
+
| `307` | Cookie 失效 | 自动重新登录 |
|
|
150
|
+
|
|
151
|
+
## 异常处理
|
|
152
|
+
|
|
153
|
+
| 异常场景 | 处理方式 |
|
|
154
|
+
|---------|----------|
|
|
155
|
+
| 扫码超时 | 重新执行 `yidaconnector login`,二维码有时效限制 |
|
|
156
|
+
| 登录后 Cookie 仍无效 | 检查 `.cache/cookies.json` 是否正确写入,执行 `yidaconnector env` 验证 |
|
|
157
|
+
| 反复登录失败 | 停止重试,提示用户联系开发同学 @天晟,不要自主尝试其他登录方案 |
|
|
158
|
+
| CSRF Token 过期(TIANSHU_000030) | 自动无头刷新,无需手动干预 |
|
|
159
|
+
| Cookie 失效(307) | 自动重新登录,无需手动干预 |
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: yida-logout
|
|
3
|
+
description: 退出宜搭登录,清空本地 Cookie 缓存。不适用于:仅需刷新 Cookie(应等待自动刷新),或登录态正常但命令失败(先排查其他原因)。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 退出登录
|
|
7
|
+
|
|
8
|
+
## 严格禁止 (NEVER DO)
|
|
9
|
+
|
|
10
|
+
- 不要在退出登录后立即执行需要登录态的命令,必须先重新登录
|
|
11
|
+
- 不要手动删除 `.cache/cookies.json` 文件,必须通过 `yidaconnector logout` 命令清空
|
|
12
|
+
|
|
13
|
+
## 严格要求 (MUST DO)
|
|
14
|
+
|
|
15
|
+
- 退出后如需继续使用,必须重新执行 `yidaconnector login` 获取新的登录态
|
|
16
|
+
- **本技能不读写 memory**:退出操作仅清空 `.cache/cookies.json`,不依赖跨会话的 memory 状态
|
|
17
|
+
|
|
18
|
+
## 适用场景
|
|
19
|
+
|
|
20
|
+
| 用户意图 | 触发条件 |
|
|
21
|
+
|---------|---------|
|
|
22
|
+
| 切换账号 | "切换账号"、"换个账号登录" |
|
|
23
|
+
| 切换组织 | "切换组织"、Cookie 失效无法自动刷新 |
|
|
24
|
+
|
|
25
|
+
## 触发条件
|
|
26
|
+
|
|
27
|
+
**正向触发**:
|
|
28
|
+
- "切换账号"、"换个账号登录"、"退出登录"
|
|
29
|
+
- "切换组织"、"换个组织"
|
|
30
|
+
- Cookie 失效且无法自动刷新,需要重置登录态
|
|
31
|
+
|
|
32
|
+
**不适用场景(不要触发)**:
|
|
33
|
+
- 仅需刷新 Cookie(等待自动刷新即可)
|
|
34
|
+
- 登录态正常但命令失败(先排查其他原因)
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## 命令
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
yidaconnector logout
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
清空 `.cache/cookies.json` 文件内容,下次调用任意命令时自动触发重新扫码登录。
|
|
46
|
+
|
|
47
|
+
**适用场景**:切换账号、切换组织、Cookie 失效无法自动刷新。
|
|
48
|
+
|
|
49
|
+
## 异常处理
|
|
50
|
+
|
|
51
|
+
| 异常场景 | 处理方式 |
|
|
52
|
+
|---------|----------|
|
|
53
|
+
| logout 后忘记重新登录 | 执行任意命令时会自动触发扫码登录 |
|
|
54
|
+
| 手动删除了 cookies.json | 效果等同于 logout,下次命令会自动触发登录 |
|
|
55
|
+
| logout 后立即执行需要登录的命令 | 等待扫码登录完成后再继续 |
|
|
56
|
+
|
|
57
|
+
## Agent 错误处理策略
|
|
58
|
+
|
|
59
|
+
当 Agent 执行本技能遇到错误时,必须遵循以下默认行为:
|
|
60
|
+
|
|
61
|
+
| 错误类型 | 默认处理策略 |
|
|
62
|
+
|---------|-------------|
|
|
63
|
+
| 命令执行失败 | 停止执行,向用户展示错误信息,询问是否重试 |
|
|
64
|
+
| cookies.json 文件不存在 | 无需处理,说明已处于未登录状态 |
|
|
65
|
+
| 文件权限不足 | 提示用户检查 `.cache/` 目录权限 |
|
|
66
|
+
| logout 后需要继续操作 | 提示用户执行 `yidaconnector login` 重新登录 |
|
|
67
|
+
| 未知错误 | 停止执行,完整展示错误信息,建议用户反馈问题 |
|