openyida 2026.7.26-beta.2 → 2026.7.27-beta.1
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 +2 -0
- package/bin/yida.js +12 -0
- package/lib/core/command-manifest.js +27 -0
- package/lib/core/locales/en.js +2 -0
- package/lib/core/locales/zh.js +2 -0
- package/lib/core/utils.js +12 -0
- package/lib/document/document-markdown.js +113 -0
- package/lib/document/tingji.js +61 -0
- package/package.json +1 -1
- package/yida-skills/SKILL.md +5 -3
- package/yida-skills/skills/yida-app/SKILL.md +3 -3
- package/yida-skills/skills/yida-create-page/SKILL.md +1 -0
- package/yida-skills/skills/yida-document-markdown/SKILL.md +46 -0
- package/yida-skills/skills/yida-tingji/SKILL.md +44 -0
- package/yida-skills/skills-index.json +29 -0
package/README.md
CHANGED
|
@@ -414,6 +414,8 @@ Run `openyida --help` or `openyida <command> --help` for detailed usage.
|
|
|
414
414
|
| `openyida data <action> <resource> [args]` | Unified data management (form/process/task/subform) |
|
|
415
415
|
| `openyida task-center <type> [options]` | Global task center (todo/processed/cc etc.) |
|
|
416
416
|
| `openyida basic-info <overview\|commodity\|grant\|capacity\|quota\|abs-path\|dataflow\|i18n\|domain>` | Query organization basic info, capacity, quotas, and domain settings |
|
|
417
|
+
| `openyida read-dingtalk-doc <docUrl> [--output <file>] [--json]` | Fetch Markdown content from a DingTalk document |
|
|
418
|
+
| `openyida read-dingtalk-tingji <taskUuid> [--json]` | Fetch DingTalk Tingji details by task UUID |
|
|
417
419
|
| `openyida get-permission <appType> <formUuid>` | Query form permission config |
|
|
418
420
|
| `openyida save-permission <appType> <formUuid> ...` | Save form permission config |
|
|
419
421
|
| `openyida corp-manager <search-user\|list\|add\|remove\|address-book> ...` | Manage platform admins and address book permissions |
|
package/bin/yida.js
CHANGED
|
@@ -869,6 +869,18 @@ async function main() {
|
|
|
869
869
|
break;
|
|
870
870
|
}
|
|
871
871
|
|
|
872
|
+
case 'read-dingtalk-doc': {
|
|
873
|
+
const { run } = require('../lib/document/document-markdown');
|
|
874
|
+
await run(args);
|
|
875
|
+
break;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
case 'read-dingtalk-tingji': {
|
|
879
|
+
const { run } = require('../lib/document/tingji');
|
|
880
|
+
await run(args);
|
|
881
|
+
break;
|
|
882
|
+
}
|
|
883
|
+
|
|
872
884
|
case 'doctor': {
|
|
873
885
|
const { run } = require('../lib/core/doctor');
|
|
874
886
|
await run(args);
|
|
@@ -402,9 +402,17 @@ const COMMAND_SIDE_EFFECTS = new Map([
|
|
|
402
402
|
'integration.list',
|
|
403
403
|
'list-forms',
|
|
404
404
|
'process.preview',
|
|
405
|
+
'read-dingtalk-tingji',
|
|
405
406
|
'verify-short-url',
|
|
406
407
|
], sideEffect('remote_read')),
|
|
407
408
|
|
|
409
|
+
['read-dingtalk-doc', sideEffect('mixed', {
|
|
410
|
+
mutates_yida: false,
|
|
411
|
+
mutates_local: true,
|
|
412
|
+
read_actions: ['<docUrl>', '<docUrl> --json'],
|
|
413
|
+
mutating_actions: ['<docUrl> --output <file>', '<docUrl> -o <file>'],
|
|
414
|
+
})],
|
|
415
|
+
|
|
408
416
|
['asset', sideEffect('mixed', {
|
|
409
417
|
mutates_yida: false,
|
|
410
418
|
mutates_local: true,
|
|
@@ -620,11 +628,24 @@ const COMMAND_PERMISSIONS = new Map([
|
|
|
620
628
|
'integration.list',
|
|
621
629
|
'list-forms',
|
|
622
630
|
'process.preview',
|
|
631
|
+
'read-dingtalk-tingji',
|
|
623
632
|
'verify-short-url',
|
|
624
633
|
], permission('allow', 'read', {
|
|
625
634
|
reason: 'Read-only, diagnostic, validation, or manifest discovery command.',
|
|
626
635
|
})),
|
|
627
636
|
|
|
637
|
+
['read-dingtalk-doc', actionDependentPermission({
|
|
638
|
+
preauthorized_actions: [
|
|
639
|
+
'<docUrl> --output <file>',
|
|
640
|
+
'<docUrl> -o <file>',
|
|
641
|
+
],
|
|
642
|
+
preauthorized_patterns: [{
|
|
643
|
+
type: 'argv_contains_any',
|
|
644
|
+
values: ['http://', 'https://'],
|
|
645
|
+
description: 'A valid document URL is present; optional output writes are non-destructive local operations.',
|
|
646
|
+
}],
|
|
647
|
+
})],
|
|
648
|
+
|
|
628
649
|
...permissionEntries([
|
|
629
650
|
'eval',
|
|
630
651
|
], actionDependentPermission({
|
|
@@ -1038,6 +1059,12 @@ const COMMAND_GROUPS = [
|
|
|
1038
1059
|
command('basic-info', ['basic-info'], 'basic-info <overview|commodity|grant|capacity|quota|abs-path|dataflow|i18n|domain>', 'help.cmd_basic_info', {
|
|
1039
1060
|
output: 'json',
|
|
1040
1061
|
}),
|
|
1062
|
+
command('read-dingtalk-doc', ['read-dingtalk-doc'], 'read-dingtalk-doc <docUrl> [--output <file>] [--json]', 'help.cmd_read_dingtalk_doc', {
|
|
1063
|
+
output: 'text|json',
|
|
1064
|
+
}),
|
|
1065
|
+
command('read-dingtalk-tingji', ['read-dingtalk-tingji'], 'read-dingtalk-tingji <taskUuid> [--json]', 'help.cmd_read_dingtalk_tingji', {
|
|
1066
|
+
output: 'json',
|
|
1067
|
+
}),
|
|
1041
1068
|
command('get-permission', ['get-permission'], 'get-permission <appType> <formUuid>', 'help.cmd_get_permission'),
|
|
1042
1069
|
command('save-permission', ['save-permission'], 'save-permission <appType> <formUuid> ...', 'help.cmd_save_permission'),
|
|
1043
1070
|
command('corp-manager', ['corp-manager'], 'corp-manager <search-user|list|add|remove|address-book> ...', 'help.cmd_corp_manager', { output: 'json' }),
|
package/lib/core/locales/en.js
CHANGED
|
@@ -47,6 +47,8 @@ module.exports = {
|
|
|
47
47
|
cmd_data: 'Unified data management (form/process/task/subform)',
|
|
48
48
|
cmd_task_center: 'Global task center (todo/processed/cc etc.)',
|
|
49
49
|
cmd_basic_info: 'Query organization basic info, capacity, quotas, and domain settings',
|
|
50
|
+
cmd_read_dingtalk_doc: 'Fetch Markdown content from a DingTalk document',
|
|
51
|
+
cmd_read_dingtalk_tingji: 'Fetch DingTalk Tingji details by task UUID',
|
|
50
52
|
cmd_get_permission: 'Query form permission config',
|
|
51
53
|
cmd_save_permission: 'Save form permission config',
|
|
52
54
|
cmd_corp_manager: 'Manage platform admins and address book permissions',
|
package/lib/core/locales/zh.js
CHANGED
|
@@ -47,6 +47,8 @@ module.exports = {
|
|
|
47
47
|
cmd_data: '统一数据管理(表单/流程/任务/子表单)',
|
|
48
48
|
cmd_task_center: '全局任务中心(待办/已处理/抄送等)',
|
|
49
49
|
cmd_basic_info: '查询组织基本信息、容量、额度和域名设置',
|
|
50
|
+
cmd_read_dingtalk_doc: '获取钉钉文档的 Markdown 内容',
|
|
51
|
+
cmd_read_dingtalk_tingji: '按任务 UUID 获取钉钉听记详情',
|
|
50
52
|
cmd_get_permission: '查询表单权限配置',
|
|
51
53
|
cmd_save_permission: '保存表单权限配置',
|
|
52
54
|
cmd_corp_manager: '管理平台管理员与通讯录权限',
|
package/lib/core/utils.js
CHANGED
|
@@ -916,6 +916,18 @@ async function httpGet(baseUrl, requestPath, queryParams, cookiesOrOptions, mayb
|
|
|
916
916
|
});
|
|
917
917
|
return;
|
|
918
918
|
}
|
|
919
|
+
if (optionsOverride.responseType === 'text') {
|
|
920
|
+
if (Number(res.statusCode) < 200 || Number(res.statusCode) >= 300) {
|
|
921
|
+
resolve({
|
|
922
|
+
success: false,
|
|
923
|
+
errorMsg: `HTTP ${res.statusCode}`,
|
|
924
|
+
__httpStatus: res.statusCode,
|
|
925
|
+
});
|
|
926
|
+
return;
|
|
927
|
+
}
|
|
928
|
+
resolve(data);
|
|
929
|
+
return;
|
|
930
|
+
}
|
|
919
931
|
try {
|
|
920
932
|
const parsed = JSON.parse(data);
|
|
921
933
|
if (isLoginExpired(parsed)) {
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { createAuthRef, createYidaClient } = require('../core/yida-client');
|
|
6
|
+
const { throwUsage } = require('../core/command-errors');
|
|
7
|
+
|
|
8
|
+
const API_PATH = '/query/document/markdown.json';
|
|
9
|
+
|
|
10
|
+
function parseArgs(args) {
|
|
11
|
+
const parsed = { docUrl: '', output: '', json: false, help: false };
|
|
12
|
+
for (let index = 0; index < args.length; index++) {
|
|
13
|
+
const arg = args[index];
|
|
14
|
+
if (arg === '--help' || arg === '-h') {
|
|
15
|
+
parsed.help = true;
|
|
16
|
+
} else if (arg === '--json') {
|
|
17
|
+
parsed.json = true;
|
|
18
|
+
} else if ((arg === '--output' || arg === '-o') && args[index + 1]) {
|
|
19
|
+
parsed.output = args[++index];
|
|
20
|
+
} else if (!arg.startsWith('--') && !parsed.docUrl) {
|
|
21
|
+
parsed.docUrl = arg;
|
|
22
|
+
} else {
|
|
23
|
+
throwUsage('Usage: openyida read-dingtalk-doc <docUrl> [--output <file>] [--json]');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return parsed;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function validateDocUrl(docUrl) {
|
|
30
|
+
if (!docUrl) {
|
|
31
|
+
throwUsage('Usage: openyida read-dingtalk-doc <docUrl> [--output <file>] [--json]');
|
|
32
|
+
}
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = new URL(docUrl);
|
|
36
|
+
} catch {
|
|
37
|
+
throw new Error('docUrl must be a valid HTTP(S) URL');
|
|
38
|
+
}
|
|
39
|
+
if (!['http:', 'https:'].includes(parsed.protocol)) {
|
|
40
|
+
throw new Error('docUrl must be a valid HTTP(S) URL');
|
|
41
|
+
}
|
|
42
|
+
return parsed.toString();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function unwrapMarkdownResponse(response) {
|
|
46
|
+
if (typeof response !== 'string') {
|
|
47
|
+
const detail = response && (response.errorMsg || response.message);
|
|
48
|
+
throw new Error(detail || 'Failed to fetch document Markdown');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const trimmed = response.trim();
|
|
52
|
+
if (!trimmed.startsWith('{')) {
|
|
53
|
+
return response;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let parsed;
|
|
57
|
+
try {
|
|
58
|
+
parsed = JSON.parse(trimmed);
|
|
59
|
+
} catch {
|
|
60
|
+
return response;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
64
|
+
return response;
|
|
65
|
+
}
|
|
66
|
+
if (parsed.success === false) {
|
|
67
|
+
throw new Error(parsed.errorMsg || parsed.message || 'Failed to fetch document Markdown');
|
|
68
|
+
}
|
|
69
|
+
if (typeof parsed.content === 'string') {
|
|
70
|
+
return parsed.content;
|
|
71
|
+
}
|
|
72
|
+
return response;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function fetchDocumentMarkdown(docUrl, options = {}) {
|
|
76
|
+
const authRef = options.authRef || createAuthRef();
|
|
77
|
+
const client = options.client || createYidaClient({ authRef });
|
|
78
|
+
const response = await client.get(API_PATH, { docUrl: validateDocUrl(docUrl) }, {
|
|
79
|
+
responseType: 'text',
|
|
80
|
+
timeout: options.timeout || 300000,
|
|
81
|
+
});
|
|
82
|
+
return unwrapMarkdownResponse(response);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function run(args) {
|
|
86
|
+
const parsed = parseArgs(args);
|
|
87
|
+
if (parsed.help) {
|
|
88
|
+
console.log('Usage: openyida read-dingtalk-doc <docUrl> [--output <file>] [--json]');
|
|
89
|
+
return { help: true };
|
|
90
|
+
}
|
|
91
|
+
const docUrl = validateDocUrl(parsed.docUrl);
|
|
92
|
+
const content = await fetchDocumentMarkdown(docUrl);
|
|
93
|
+
if (parsed.output) {
|
|
94
|
+
const outputPath = path.resolve(parsed.output);
|
|
95
|
+
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
96
|
+
fs.writeFileSync(outputPath, content, 'utf8');
|
|
97
|
+
const result = { success: true, docUrl, output: outputPath, length: content.length };
|
|
98
|
+
console.log(JSON.stringify(result, null, 2));
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
const result = { success: true, docUrl, content };
|
|
102
|
+
console.log(parsed.json ? JSON.stringify(result, null, 2) : content);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
module.exports = {
|
|
107
|
+
API_PATH,
|
|
108
|
+
parseArgs,
|
|
109
|
+
validateDocUrl,
|
|
110
|
+
unwrapMarkdownResponse,
|
|
111
|
+
fetchDocumentMarkdown,
|
|
112
|
+
run,
|
|
113
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { createAuthRef, createYidaClient } = require('../core/yida-client');
|
|
4
|
+
const { throwUsage } = require('../core/command-errors');
|
|
5
|
+
|
|
6
|
+
const API_PATH = '/query/document/tingji.json';
|
|
7
|
+
|
|
8
|
+
function parseArgs(args) {
|
|
9
|
+
const parsed = { taskUuid: '', help: false };
|
|
10
|
+
for (const arg of args) {
|
|
11
|
+
if (arg === '--help' || arg === '-h') {
|
|
12
|
+
parsed.help = true;
|
|
13
|
+
} else if (arg === '--json') {
|
|
14
|
+
continue;
|
|
15
|
+
} else if (!arg.startsWith('--') && !parsed.taskUuid) {
|
|
16
|
+
parsed.taskUuid = arg;
|
|
17
|
+
} else {
|
|
18
|
+
throwUsage('Usage: openyida read-dingtalk-tingji <taskUuid> [--json]');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return parsed;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function validateTaskUuid(taskUuid) {
|
|
25
|
+
const normalized = String(taskUuid || '').trim();
|
|
26
|
+
if (!normalized) {
|
|
27
|
+
throwUsage('Usage: openyida read-dingtalk-tingji <taskUuid> [--json]');
|
|
28
|
+
}
|
|
29
|
+
if (normalized.length > 256 || /[\r\n]/.test(normalized)) {
|
|
30
|
+
throw new Error('taskUuid is invalid');
|
|
31
|
+
}
|
|
32
|
+
return normalized;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function fetchTingjiDetail(taskUuid, options = {}) {
|
|
36
|
+
const authRef = options.authRef || createAuthRef();
|
|
37
|
+
const client = options.client || createYidaClient({ authRef });
|
|
38
|
+
const response = await client.get(API_PATH, { taskUuid: validateTaskUuid(taskUuid) }, {
|
|
39
|
+
timeout: options.timeout || 300000,
|
|
40
|
+
});
|
|
41
|
+
if (!response || response.success === false || response.__needLogin || response.__csrfExpired) {
|
|
42
|
+
const detail = response && (response.errorMsg || response.message);
|
|
43
|
+
throw new Error(detail || 'Failed to fetch Tingji detail');
|
|
44
|
+
}
|
|
45
|
+
return response.content !== undefined ? response.content : response;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function run(args) {
|
|
49
|
+
const parsed = parseArgs(args);
|
|
50
|
+
if (parsed.help) {
|
|
51
|
+
console.log('Usage: openyida read-dingtalk-tingji <taskUuid> [--json]');
|
|
52
|
+
return { help: true };
|
|
53
|
+
}
|
|
54
|
+
const taskUuid = validateTaskUuid(parsed.taskUuid);
|
|
55
|
+
const detail = await fetchTingjiDetail(taskUuid);
|
|
56
|
+
const result = { success: true, taskUuid, detail };
|
|
57
|
+
console.log(JSON.stringify(result, null, 2));
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
module.exports = { API_PATH, parseArgs, validateTaskUuid, fetchTingjiDetail, run };
|
package/package.json
CHANGED
package/yida-skills/SKILL.md
CHANGED
|
@@ -99,7 +99,7 @@ OpenYida builder 默认使用 `create-app / create-form / create-page / generate
|
|
|
99
99
|
- 已解析到目标自定义页面 URL / `formUuid` / bound page 时,默认写源码并发布到该页面,不执行 `yida-create-page`;只有缺少目标 display page 且本次意图允许新增页面时才创建。
|
|
100
100
|
- 已解析到目标表单 `formUuid` 时,字段结构诉求默认走 `yida-create-form-page` 的 update/patch/rule/bind-datasource 模式,不创建同名或同类表单。
|
|
101
101
|
- 已解析到目标流程表单 / `processCode` 时,默认走 `yida-process-rule` 配置/更新流程,不从零执行 `yida-create-process`。
|
|
102
|
-
- 完整应用 `fast_build`
|
|
102
|
+
- 完整应用 `fast_build` 也遵守本规则:先占位主页面,再建表单,最后回填发布。
|
|
103
103
|
|
|
104
104
|
验收心智模型:
|
|
105
105
|
|
|
@@ -134,7 +134,7 @@ OpenYida builder 默认使用 `create-app / create-form / create-page / generate
|
|
|
134
134
|
> 用户说“按默认方案 / 不要追问 / 直接创建 / 尽快搭建”时,`yida-app` 选择 `fast_build`:先解析并复用已有资源,只创建缺失且允许创建的应用/表单/页面,最后发布并输出链接。
|
|
135
135
|
> `yida-app fast_build` 使用常规 OpenYida 命令编排。
|
|
136
136
|
|
|
137
|
-
**默认链路**:`fast_build` 必须只做 `resolve app →
|
|
137
|
+
**默认链路**:`fast_build` 必须只做 `resolve app → reserve main page → resolve forms → 编写/更新主页面源码 → 发布 → 返回访问链接`。若需要首页/工作台/智能助手/门户门面且主页面缺失,先创建空 display page 占位,再建表单,最后回填发布;不要因此默认执行导航重排。不要因为应用名里有“看板 / 系统 / 管理”就升级到 `deep_design` 或 `full_demo`。
|
|
138
138
|
|
|
139
139
|
**fast_build 默认加载边界**:只加载 `yida-app` 和当前阶段必需的子技能。`yida-create-app`、`yida-create-page`、`yida-create-form-page` 只有在目标资源缺失且本次意图允许创建时才加载;已有资源时进入对应 update / publish 分支。页面默认走 Code Canvas;当用户明确要求普通自定义页面 JSX/Jsx 组件链路,或页面强依赖普通自定义页实例桥(`this.$(fieldId)` / `this.utils.yida.*` / `this.dataSourceMap` / 表单提交或字段双向绑定深度耦合)时,选择 `yida-custom-page`。不要默认加载 `yida-page-uiux`、`yida-data-source-connectors`、`yida-data-management`、`yida-nav-group`、`yida-dashboard`,也不要默认深读 `references/`。
|
|
140
140
|
|
|
@@ -167,13 +167,15 @@ OpenYida builder 默认使用 `create-app / create-form / create-page / generate
|
|
|
167
167
|
| `yida-skills/integration` | 连接器、外部 API、执行动作、设计器数据源、集成自动化、逻辑流 | `yida-integration`、`yida-connector`、`yida-connector-safe-actions`、`yida-data-source-connectors` |
|
|
168
168
|
| `yida-skills/access` | 平台/应用/表单/页面权限、公开访问、分享 | `yida-corp-manager`、`yida-app-permission`、`yida-form-permission`、`yida-page-config` |
|
|
169
169
|
| `yida-skills/ops` | Sequence、主键冲突、VOC 反馈 | `yida-db-seq-fix`、`yida-voc` |
|
|
170
|
-
| `yida-skills/agent` |
|
|
170
|
+
| `yida-skills/agent` | 导出对话、读取钉钉文档/听记、会议纪要/闪记转 PRD | `yida-export-conversation`、`yida-document-markdown`、`yida-tingji`、`yida-flash-note-to-prd` |
|
|
171
171
|
|
|
172
172
|
### 高频分歧
|
|
173
173
|
|
|
174
174
|
| 用户意图 | 选哪个 |
|
|
175
175
|
|------|------|
|
|
176
176
|
| 从零搭一个完整应用/系统 | `yida-app`;默认 `fast_build`,不要自动升级到深度设计 |
|
|
177
|
+
| 读取钉钉在线文档正文 | `yida-document-markdown`,使用登录态接口获取 Markdown |
|
|
178
|
+
| 按 taskUuid 读取钉钉听记 | `yida-tingji`,将听记任务 ID 原样传入命令 |
|
|
177
179
|
| 只创建应用壳并拿 appType | `yida-create-app` |
|
|
178
180
|
| 创建自定义展示页资源 | `yida-create-page`,之后默认接 `yida-canvas-custom-page` 和 `yida-publish-page` |
|
|
179
181
|
| 开发表单字段结构 / 增删改字段 | `yida-create-form-page` |
|
|
@@ -13,7 +13,7 @@ description: 宜搭完整应用开发编排技能。对普通 OpenYida 应用做
|
|
|
13
13
|
|
|
14
14
|
用户说“按默认方案”“不要追问”“直接创建”“尽快搭建”等,必须选择 `fast_build`,用合理 MVP 假设直接执行,不展开深度 PRD 讨论。
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
**默认判定**:完整应用搭建或补齐时,用户表达“默认方案 / 不要追问 / 直接创建 / 尽快搭建”等快速交付信号,就命中 `fast_build`。默认链路:`resolve app → reserve main page → resolve forms → 编写/更新主页面源码 → 发布 → 返回访问链接`。
|
|
17
17
|
|
|
18
18
|
> 资源边界:本技能是默认完整应用编排。目标不明时先只读确认或询问用户。
|
|
19
19
|
|
|
@@ -170,8 +170,8 @@ UI 不是独立替代主流程的步骤,而是按模式插入到页面生成
|
|
|
170
170
|
| 0. 解析资源上下文 | 无 | 合并本轮显式资源、agent bound context、workspace config/cache、会话历史;本轮显式目标覆盖 bound context;判定 app/page/form/process 的 `source` 和 `allowCreate` | 明确复用、创建缺口或需要 ask_human |
|
|
171
171
|
| 1. resolve app | `yida-create-app` 仅在 app 缺失且允许创建时加载;不自动修改应用名称 | 已有 `appType`/应用 URL/bound app 时直接复用;否则创建应用并提取真实 `appType` | 拿到真实目标 `appType`,且不会重复创建同类 app |
|
|
172
172
|
| 2. 记录最小需求 | 无 | 写 `prd/<项目名>.md`:只记录 MVP 假设、核心表单/页面、完成标准;写/更新 `.cache/<项目名>-schema.json` 本地 ID 映射;不要写长 PRD | 业务语义和 ID 存储位置明确 |
|
|
173
|
-
| 3.
|
|
174
|
-
| 4. resolve
|
|
173
|
+
| 3. reserve main page | `yida-create-page` 仅在主页面缺失且允许创建时加载 | 已有页面 URL / `formUuid` / bound page 时直接作为主页面;若需要首页/工作台/智能助手/门户门面且缺少主页面,先创建空 display page 占位,暂不写最终源码 | 拿到真实主页面 `formUuid`,且不会重复创建页面 |
|
|
174
|
+
| 4. resolve forms | `yida-create-form-page` | 已有目标表单时 update/patch/rule/bind-datasource;简单字段属性更新直接用 compact changes 让 CLI 内部按 label 读 schema/定位字段并输出 resolved evidence;缺少支撑 MVP 的核心表单且允许创建时才 create;字段配置文件写入 `.cache/openyida/<项目名>/`;页面/数据/流程/公式确需多字段映射时,对每个目标表单最多一次性获取完整 `--field-map-json` 并合并写回 `.cache/<项目名>-schema.json` | 拿到或确认表单 `formUuid`,并在需要时拿到真实 `fieldId` |
|
|
175
175
|
| 5. 编写/更新页面 | 默认 `yida-canvas-custom-page`;明确要求 JSX/Jsx 组件链路或实例桥强依赖时选择 `yida-custom-page` | 生成或修改主页面源码;只实现 MVP 首屏和核心操作。可用已解析表单链接、真实空态、表单入口和轻量指标口径完成主页面;若展示业务列表/看板/详情记录,必须接本轮真实表单 `dataBinding.mode=form`,或先写入 demo records 后再读取;不要加载视觉/密度/报表/数据源等额外技能 | 本地源码通过对应页面技能的基础校验;未执行 publish 时仍是“源码已修改,尚未发布” |
|
|
176
176
|
| 6. 发布页面 | `yida-publish-page` | 按页面链路校验后发布到已解析主页面:Canvas `.canvas.jsx` 使用 `openyida publish` 的 Canvas 编译阶段或 `compileCanvasLocal` 快检;普通自定义页面 `.oyd.jsx` / `.jsx` 跑 `check-page` / `compile`;再执行 `openyida publish <source> <appType> <displayPageFormUuid>` 发布主页面 | 发布成功并获得可访问 URL |
|
|
177
177
|
| 7. 输出结果 | 无 | 返回应用链接、主页面链接、复用/创建/更新的资源摘要、后续可选项 | 用户拿到 URL |
|
|
@@ -25,6 +25,7 @@ description: 创建自定义展示页面(display 类型)并返回 formUuid
|
|
|
25
25
|
|
|
26
26
|
- **创建前必须确认**:单点创建页面时,执行创建命令前必须向用户确认页面名称和目标应用。由 `yida-app fast_build` 编排且用户已说“默认方案 / 不要追问 / 直接创建”时,合理命名并直接创建,不再二次追问。
|
|
27
27
|
- 创建成功后,将 formUuid 记录到 `.cache/<项目名>-schema.json`
|
|
28
|
+
- 由 `yida-app fast_build` 编排的首页/工作台/智能助手/门户门面页,可以先于业务表单创建;先占位记录 `formUuid`,待表单 ID 明确后再写源码并发布。
|
|
28
29
|
- 创建页面后,必须继续选择一个页面实现链路编写页面源码,再用 `yida-publish-page` 发布:Code Canvas 链路用 `yida-canvas-custom-page`;普通自定义页面 JSX/Jsx 组件链路用 `yida-custom-page`
|
|
29
30
|
- 用户明确要求 JSX / Jsx 组件 / 普通自定义页,或页面强依赖 `this.$`、`this.utils.yida.*`、`this.dataSourceMap` 时,创建后进入 `yida-custom-page`;涉及成员、部门、附件上传或图片上传时必须读取 `component-jsx-guide.md`,上传还必须读取 `attachment-upload-guide.md`
|
|
30
31
|
- **本技能不读写 memory**:formUuid 等信息输出到 stdout,通过 `.cache/<项目名>-schema.json` 持久化,不依赖跨会话的 memory 状态
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: yida-document-markdown
|
|
3
|
+
description: 获取钉钉文档、钉钉在线文档或知识库文档的完整 Markdown 内容。用户提供文档链接并要求读取、提取、总结或继续处理文档内容时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 获取钉钉文档 Markdown
|
|
7
|
+
|
|
8
|
+
## 严格要求 (MUST DO)
|
|
9
|
+
|
|
10
|
+
- 使用 `openyida read-dingtalk-doc "<docUrl>"` 读取文档内容
|
|
11
|
+
- 将用户提供的钉钉文档 URL 原样传给 `docUrl` 参数
|
|
12
|
+
- 仅基于命令返回的 Markdown 执行总结、转 PRD 或其他下游任务
|
|
13
|
+
|
|
14
|
+
## 命令
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
openyida read-dingtalk-doc "<docUrl>"
|
|
18
|
+
openyida read-dingtalk-doc "<docUrl>" --json
|
|
19
|
+
openyida read-dingtalk-doc "<docUrl>" --output ./document.md
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
| 参数 | 必填 | 说明 |
|
|
23
|
+
|------|------|------|
|
|
24
|
+
| `docUrl` | 是 | 可访问的钉钉文档 HTTP(S) 链接 |
|
|
25
|
+
| `--json` | 否 | 输出包含原始链接和 Markdown 的 JSON |
|
|
26
|
+
| `--output`, `-o` | 否 | 将 Markdown 写入指定文件;若文件已存在则覆盖 |
|
|
27
|
+
|
|
28
|
+
## 执行流程
|
|
29
|
+
|
|
30
|
+
1. 确认用户已提供文档链接。
|
|
31
|
+
2. 默认运行 `openyida read-dingtalk-doc "<docUrl>"` 获取纯 Markdown;需要结构化结果时使用 `--json`。
|
|
32
|
+
3. 仅在用户要求保存文件或后续任务需要文件输入时使用 `--output`,并明确告知写入路径。
|
|
33
|
+
4. 检查命令成功结果,再按用户要求处理 Markdown。
|
|
34
|
+
|
|
35
|
+
## 异常处理
|
|
36
|
+
|
|
37
|
+
| 场景 | 处理方式 |
|
|
38
|
+
|------|----------|
|
|
39
|
+
| 未登录或登录失效 | 运行 `openyida auth status`,必要时执行 `openyida login` |
|
|
40
|
+
| 400 | 检查 `docUrl` 是否为空或格式错误 |
|
|
41
|
+
| 文档无权限或不存在 | 请用户确认当前钉钉账号权限与链接有效性 |
|
|
42
|
+
| 请求超时 | 稍后重试;文档转换最长可能等待 300 秒 |
|
|
43
|
+
|
|
44
|
+
## 完成标准
|
|
45
|
+
|
|
46
|
+
命令成功返回非推测的 Markdown 内容,或成功写入用户指定文件。
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: yida-tingji
|
|
3
|
+
description: 按 taskUuid 获取钉钉听记、会议录音转写、会议纪要或 AI 听记的完整详情。用户提供听记任务 ID 并要求读取、整理、总结或转 PRD 时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 获取钉钉听记详情
|
|
7
|
+
|
|
8
|
+
## 严格要求 (MUST DO)
|
|
9
|
+
|
|
10
|
+
- 使用 `openyida read-dingtalk-tingji "<taskUuid>"` 读取听记详情
|
|
11
|
+
- 将用户提供的 `taskUuid` 原样传入,不自行转换或校验其格式
|
|
12
|
+
- 读取成功后,根据用户要求提取会议摘要、关键决策、行动项或生成 PRD
|
|
13
|
+
- 默认不要在回复中展示带签名参数的资源 URL;用户明确要求原始结果时再输出完整 JSON
|
|
14
|
+
|
|
15
|
+
## 命令
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
openyida read-dingtalk-tingji "<taskUuid>"
|
|
19
|
+
openyida read-dingtalk-tingji "<taskUuid>" --json
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
| 参数 | 必填 | 说明 |
|
|
23
|
+
|------|------|------|
|
|
24
|
+
| `taskUuid` | 是 | 钉钉听记任务 ID,按原值传入 |
|
|
25
|
+
| `--json` | 否 | 显式声明 JSON 输出;当前命令默认即为 JSON |
|
|
26
|
+
|
|
27
|
+
## 执行流程
|
|
28
|
+
|
|
29
|
+
1. 从用户输入或听记链接上下文中取得准确的 `taskUuid`;无法确定时请用户补充。
|
|
30
|
+
2. 运行 `openyida read-dingtalk-tingji "<taskUuid>" --json`。
|
|
31
|
+
3. 检查成功结果,再按用户要求提取会议摘要、发言内容、决策或待办。
|
|
32
|
+
|
|
33
|
+
## 异常处理
|
|
34
|
+
|
|
35
|
+
| 场景 | 处理方式 |
|
|
36
|
+
|------|----------|
|
|
37
|
+
| 未登录或登录失效 | 运行 `openyida auth status`,必要时执行 `openyida login` |
|
|
38
|
+
| 400 | 检查 `taskUuid` 是否为空 |
|
|
39
|
+
| 听记无权限或不存在 | 请用户确认当前钉钉账号权限和 `taskUuid` |
|
|
40
|
+
| 请求超时 | 稍后重试;接口最长可能等待 300 秒 |
|
|
41
|
+
|
|
42
|
+
## 完成标准
|
|
43
|
+
|
|
44
|
+
命令成功返回指定 `taskUuid` 对应的真实听记详情。
|
|
@@ -89,6 +89,30 @@
|
|
|
89
89
|
"基础信息"
|
|
90
90
|
]
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
"name": "yida-document-markdown",
|
|
94
|
+
"path": "skills/yida-document-markdown/SKILL.md",
|
|
95
|
+
"display_name": "钉钉文档 Markdown",
|
|
96
|
+
"description": "获取钉钉文档、钉钉在线文档或知识库文档的完整 Markdown 内容。用户提供文档链接并要求读取、提取、总结或继续处理文档内容时使用。",
|
|
97
|
+
"category": "yida-skills/agent",
|
|
98
|
+
"tags": ["钉钉文档", "Markdown", "文档链接", "内容提取"],
|
|
99
|
+
"aliases": ["读取钉钉文档", "文档转 Markdown"],
|
|
100
|
+
"command_ids": ["read-dingtalk-doc"],
|
|
101
|
+
"done_when": "命令成功返回真实 Markdown 内容,或成功写入指定文件。",
|
|
102
|
+
"requires_login": true
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"name": "yida-tingji",
|
|
106
|
+
"path": "skills/yida-tingji/SKILL.md",
|
|
107
|
+
"display_name": "钉钉听记详情",
|
|
108
|
+
"description": "按 taskUuid 获取钉钉听记、会议录音转写、会议纪要或 AI 听记的完整详情。用户提供听记任务 ID 并要求读取、整理、总结或转 PRD 时使用。",
|
|
109
|
+
"category": "yida-skills/agent",
|
|
110
|
+
"tags": ["钉钉听记", "会议纪要", "taskUuid", "语音转写"],
|
|
111
|
+
"aliases": ["读取听记", "获取会议记录"],
|
|
112
|
+
"command_ids": ["read-dingtalk-tingji"],
|
|
113
|
+
"done_when": "命令成功返回指定 taskUuid 对应的真实听记详情。",
|
|
114
|
+
"requires_login": true
|
|
115
|
+
},
|
|
92
116
|
{
|
|
93
117
|
"name": "yida-business-rule",
|
|
94
118
|
"path": "skills/yida-business-rule/SKILL.md",
|
|
@@ -1159,6 +1183,11 @@
|
|
|
1159
1183
|
"description": "非宜搭业务资源本身的 agent 辅助能力:导出对话、会议/闪记转 PRD。",
|
|
1160
1184
|
"signals": [
|
|
1161
1185
|
"导出对话",
|
|
1186
|
+
"钉钉文档",
|
|
1187
|
+
"读取文档",
|
|
1188
|
+
"Markdown 内容",
|
|
1189
|
+
"钉钉听记",
|
|
1190
|
+
"taskUuid",
|
|
1162
1191
|
"会议纪要",
|
|
1163
1192
|
"闪记",
|
|
1164
1193
|
"PRD"
|