@yosai/cli 0.2.1-test.7 → 0.2.1-test.9
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 +6 -6
- package/dist/cli.js +1 -1
- package/dist/commands/doctor.js +10 -7
- package/dist/commands/login.js +3 -2
- package/dist/domain-commands.js +13 -4
- package/dist/domain-executor.js +3 -0
- package/dist/endpoints.js +4 -4
- package/dist/openapis-client.js +5 -5
- package/dist/skill-sync.js +1 -1
- package/dist/skills/yos/SKILL.md +15 -7
- package/dist/skills/yos-doc-sheet/SKILL.md +330 -0
- package/dist/skills/yos-doc-sheet/references/AGENT_SCHEMA.doc.md +68 -0
- package/dist/skills/yos-doc-sheet/references/AGENT_SCHEMA.sheet.md +105 -0
- package/dist/skills/yos-doc-sheet/references/DOC_DATA_API.md +624 -0
- package/dist/skills/yos-doc-sheet/references/SHEET_DATA_API.md +356 -0
- package/dist/skills/yos-doc-sheet/references/doc-draft.template.json +721 -0
- package/dist/skills/yos-doc-sheet/references/few-shot.draft.json +200 -0
- package/dist/skills/yos-doc-sheet/references/few-shot.workbook.json +41 -0
- package/dist/skills/yos-doc-sheet/references/sheet-workbook.template.json +147 -0
- package/dist/skills/yos-doc-sheet/scripts/validate-runtime-doc.mjs +370 -0
- package/dist/skills/yos-doc-sheet/scripts/validate-runtime-sheet.mjs +404 -0
- package/dist/skills/yos-doc-sheet/scripts/yos-doc.mjs +157 -0
- package/dist/skills/yos-doc-sheet/scripts/yos-sheet.mjs +157 -0
- package/dist/skills/yos-install/SKILL.md +17 -17
- package/dist/skills/yos-knowledge/SKILL.md +19 -6
- package/dist/skills/yos-retrieval/SKILL.md +1 -1
- package/dist/skills/yos-shared/SKILL.md +20 -13
- package/dist/skills/yos-support/SKILL.md +1 -1
- package/dist/skills/yos-transcript/SKILL.md +1 -1
- package/dist/update-check-worker.js +3 -66
- package/dist/update-notice.js +4 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ YOS 能力的 Agent 执行入口:终端直调 YOS 工具 + 知识库文件上
|
|
|
10
10
|
## 快速开始
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
yos login #
|
|
13
|
+
yos login # 配置访问令牌(客户端「个人设置-访问令牌」页创建并复制)
|
|
14
14
|
yos doctor # 诊断配置与连通(显示当前身份)
|
|
15
15
|
yos ping # 探活:连接与令牌有效性(退出码即结论,客户端对接用)
|
|
16
16
|
yos kb list # 我的知识库
|
|
@@ -27,7 +27,7 @@ yos tool list # 底层工具通道(领域命令未覆盖
|
|
|
27
27
|
|
|
28
28
|
| 命令 | 说明 |
|
|
29
29
|
|---|---|
|
|
30
|
-
| `yos login` |
|
|
30
|
+
| `yos login` | 配置访问令牌(校验身份后保存) |
|
|
31
31
|
| `yos doctor` | 诊断配置、访问令牌、连通、Skill 状态与 CLI 版本 |
|
|
32
32
|
| `yos ping` | 探活:检查连接是否成功、令牌是否有效(退出码 0/2/3/4 即结论,客户端检测对接用) |
|
|
33
33
|
| `yos kb <动作>` | 知识库:`list` / `detail` / `update` / `upload`(建库、删库请到 YOS 客户端) |
|
|
@@ -37,7 +37,7 @@ yos tool list # 底层工具通道(领域命令未覆盖
|
|
|
37
37
|
| `yos transcript <动作>` | 转写:`list` / `detail` |
|
|
38
38
|
| `yos tool list` / `schema` / `call` | 底层工具通道(领域命令未覆盖时兜底) |
|
|
39
39
|
| `yos version [--check]` | CLI 版本(`--check` 比对对应通道最新版) |
|
|
40
|
-
| `yos update [--check]` |
|
|
40
|
+
| `yos update [--check]` | 升级到对应通道最新版并自动重同步 Skill(命令执行后检测到新版本会有升级提示,照提示执行即可) |
|
|
41
41
|
| `yos skill install [--target <dir>]` | 安装内置 Skill |
|
|
42
42
|
|
|
43
43
|
所有命令支持 `--json` 输出与统一退出码(0 成功 / 1 业务失败 / 2 参数错误 / 3 网络 / 4 鉴权 / 5 版本过低)。
|
|
@@ -45,7 +45,7 @@ yos tool list # 底层工具通道(领域命令未覆盖
|
|
|
45
45
|
## 给 Agent 使用
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
|
-
yos skill install # 安装
|
|
48
|
+
yos skill install # 安装 8 个内置 Skill(总入口 + 领域 + 安装引导)到 Claude Code / Cursor / Codex / Qoder / WorkBuddy 等技能目录
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
安装后重启 Agent 工具,即可用自然语言驱动(如「把这份报告上传到知识库」)。`yos` 为能力总入口(何时使用 / 能力地图 / 命令使用方式),Agent 据此路由到各领域细则;`yos-shared` 收录跨领域约定(输出解析、退出码契约、仍需自行校验内容的场景、安全纪律);`yos-install` 是自包含的安装配置引导,可单独下载到发布仓库供用户引导装机。
|
|
@@ -56,8 +56,8 @@ yos skill install # 安装 7 个内置 Skill(总入口 + 领域 + 安装
|
|
|
56
56
|
|
|
57
57
|
- 配置文件:`~/.config/yos/config.json`(权限 0600;目录可用 `YOS_CONFIG_DIR` 覆盖)
|
|
58
58
|
- 环境变量(均优先于配置文件,适合 CI/容器场景):`YOS_API_KEY` 访问令牌、`YOS_ENV` 服务环境(prod / test / dev)
|
|
59
|
-
-
|
|
60
|
-
-
|
|
59
|
+
- 版本检查:命令执行后会在后台检查对应通道最新版,落后时以 stderr 提示「请先执行 yos update 升级再继续任务」;升级通道自动跟随服务环境(测试环境跟 test 通道)。CLI 不静默安装,升级由用户或 Agent 按提示显式执行
|
|
60
|
+
- 服务环境(测试/开发用):`yos login --env test` 切到测试环境,`--env dev` 指向本机开发服务(http://localhost:8080)
|
|
61
61
|
|
|
62
62
|
## 故障排查
|
|
63
63
|
|
package/dist/cli.js
CHANGED
package/dist/commands/doctor.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { register } from '../cli.js';
|
|
2
2
|
import { loadConfig, maskKey, resolveEnv, resolveKey } from '../config.js';
|
|
3
|
-
import { endpointOfEnv, envLabel } from '../endpoints.js';
|
|
3
|
+
import { DEFAULT_ENV, endpointOfEnv, envLabel } from '../endpoints.js';
|
|
4
4
|
import { CliError, EXIT } from '../errors.js';
|
|
5
5
|
import { formatIdentity, OpenApisClient } from '../openapis-client.js';
|
|
6
6
|
import { print, printJson } from '../output.js';
|
|
@@ -23,11 +23,13 @@ register({
|
|
|
23
23
|
ok: config !== null,
|
|
24
24
|
detail: config ? '已找到' : '未找到,请执行 yos login',
|
|
25
25
|
});
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
if (env !== DEFAULT_ENV) {
|
|
27
|
+
checks.push({
|
|
28
|
+
name: '服务环境',
|
|
29
|
+
ok: true,
|
|
30
|
+
detail: `${envLabel(env)}(来自 ${endpointSource(config)})`,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
31
33
|
let key = null;
|
|
32
34
|
try {
|
|
33
35
|
key = resolveKey(config);
|
|
@@ -58,10 +60,11 @@ register({
|
|
|
58
60
|
detail: skillDirs.length > 0 ? skillDirs.join(', ') : '尚未安装,执行 yos skill install',
|
|
59
61
|
});
|
|
60
62
|
const meta = readPackageMeta();
|
|
63
|
+
const envNote = env === DEFAULT_ENV ? '' : `(环境=${envLabel(env)})`;
|
|
61
64
|
checks.push({
|
|
62
65
|
name: 'CLI 版本',
|
|
63
66
|
ok: meta !== null,
|
|
64
|
-
detail: meta ? `${meta.version}
|
|
67
|
+
detail: meta ? `${meta.version}${envNote}` : 'unknown(未找到 package.json)',
|
|
65
68
|
});
|
|
66
69
|
const state = loadVersionState();
|
|
67
70
|
checks.push({
|
package/dist/commands/login.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { register } from '../cli.js';
|
|
2
2
|
import { loadConfig, maskKey, resolveEnv, saveConfig } from '../config.js';
|
|
3
|
-
import { endpointOfEnv, envLabel } from '../endpoints.js';
|
|
3
|
+
import { DEFAULT_ENV, endpointOfEnv, envLabel } from '../endpoints.js';
|
|
4
4
|
import { UsageError } from '../errors.js';
|
|
5
5
|
import { formatIdentity, OpenApisClient } from '../openapis-client.js';
|
|
6
6
|
import { print } from '../output.js';
|
|
@@ -30,6 +30,7 @@ register({
|
|
|
30
30
|
}
|
|
31
31
|
const identity = await new OpenApisClient(`${endpoint}/open-apis`, key).whoami();
|
|
32
32
|
saveConfig({ ...config, env, apiKey: key });
|
|
33
|
-
|
|
33
|
+
const envNote = env === DEFAULT_ENV ? '' : `环境=${envLabel(env)},`;
|
|
34
|
+
print(`已保存配置:${envNote}key=${maskKey(key)},身份 ${formatIdentity(identity)}`);
|
|
34
35
|
},
|
|
35
36
|
});
|
package/dist/domain-commands.js
CHANGED
|
@@ -24,19 +24,28 @@ export const DOMAIN_COMMANDS = [
|
|
|
24
24
|
},
|
|
25
25
|
{ flag: 'keyword', param: 'keyword', kind: 'string', description: '名称关键词(仅匹配库名,不搜正文)' },
|
|
26
26
|
{ flag: 'page', param: 'page', kind: 'number', description: '页码(缺省 1)', min: 1 },
|
|
27
|
-
{ flag: 'size', param: 'size', kind: 'number', description: '每页条数(缺省
|
|
27
|
+
{ flag: 'size', param: 'size', kind: 'number', description: '每页条数(缺省 50)', min: 1, max: 50, defaultValue: 50 },
|
|
28
28
|
],
|
|
29
29
|
render: (result) => {
|
|
30
30
|
const data = parseToolJson(result);
|
|
31
31
|
const records = data.records ?? [];
|
|
32
|
+
const total = data.total ?? records.length;
|
|
33
|
+
const page = data.page ?? 1;
|
|
32
34
|
if (records.length === 0) {
|
|
33
|
-
print('(无知识库)');
|
|
35
|
+
print(total > 0 ? `(本页无数据:共 ${total} 条,--page ${page} 超出范围)` : '(无知识库)');
|
|
34
36
|
return;
|
|
35
37
|
}
|
|
36
38
|
print(renderRows(records.map((r) => [
|
|
37
39
|
String(r.kbCode ?? r.kb_code ?? ''),
|
|
38
40
|
String(r.kbName ?? r.kb_name ?? r.name ?? ''),
|
|
39
41
|
])));
|
|
42
|
+
const shown = (page - 1) * (data.size ?? records.length) + records.length;
|
|
43
|
+
if (shown < total) {
|
|
44
|
+
print(`(共 ${total} 条,还有 ${total - shown} 条;翻页加 --page ${page + 1})`);
|
|
45
|
+
}
|
|
46
|
+
else if (page > 1) {
|
|
47
|
+
print(`(共 ${total} 条,已到末页)`);
|
|
48
|
+
}
|
|
40
49
|
},
|
|
41
50
|
},
|
|
42
51
|
{
|
|
@@ -116,7 +125,7 @@ export const DOMAIN_COMMANDS = [
|
|
|
116
125
|
{
|
|
117
126
|
flag: 'type', param: 'doc_type', kind: 'string',
|
|
118
127
|
description: '文档类型(缺省 md):md=Markdown 文本 / cloud=云文档 / sheet=表格;'
|
|
119
|
-
+ 'cloud 与 sheet
|
|
128
|
+
+ 'cloud 与 sheet 的正文为对应草稿 JSON(结构见 yos-doc-sheet 技能),一般场景一律用 md',
|
|
120
129
|
values: ['md', 'cloud', 'sheet'],
|
|
121
130
|
},
|
|
122
131
|
{ flag: 'content', param: 'content', kind: 'string', description: '正文文本(与 --file 二选一)' },
|
|
@@ -154,7 +163,7 @@ export const DOMAIN_COMMANDS = [
|
|
|
154
163
|
flags: [
|
|
155
164
|
{ flag: 'title', param: 'title', kind: 'string', description: '新标题' },
|
|
156
165
|
{ flag: 'content', param: 'content', kind: 'string', description: '新正文,整体覆盖原正文(与 --file 二选一)' },
|
|
157
|
-
{ flag: 'file', param: 'content', kind: 'string', description: '新正文文件路径,整体覆盖原正文(与 --content
|
|
166
|
+
{ flag: 'file', param: 'content', kind: 'string', description: '新正文文件路径,整体覆盖原正文(与 --content 二选一);云文档/云表格节点传对应草稿 JSON(结构见 yos-doc-sheet 技能)' },
|
|
158
167
|
{ flag: 'description', param: 'description', kind: 'string', description: '新简介(≤100 字)' },
|
|
159
168
|
],
|
|
160
169
|
buildArgs: (context) => {
|
package/dist/domain-executor.js
CHANGED
|
@@ -35,6 +35,9 @@ function buildDeclaredArgs(spec, context) {
|
|
|
35
35
|
if (flag.required) {
|
|
36
36
|
throw new UsageError(`缺少 --${flag.flag}`, `用法: ${buildUsageForSpec(spec)}`);
|
|
37
37
|
}
|
|
38
|
+
if (flag.defaultValue !== undefined) {
|
|
39
|
+
args[flag.param] = flag.defaultValue;
|
|
40
|
+
}
|
|
38
41
|
continue;
|
|
39
42
|
}
|
|
40
43
|
const values = Array.isArray(raw) ? raw : [raw];
|
package/dist/endpoints.js
CHANGED
|
@@ -22,12 +22,12 @@ export function channelOfEnv(env) {
|
|
|
22
22
|
export function envLabel(env) {
|
|
23
23
|
return ENVIRONMENTS[env]?.label ?? env;
|
|
24
24
|
}
|
|
25
|
-
export function
|
|
25
|
+
export function envNoteOfEndpoint(endpoint) {
|
|
26
26
|
const normalized = endpoint.replace(/\/+$/, '');
|
|
27
|
-
for (const env of Object.
|
|
27
|
+
for (const [name, env] of Object.entries(ENVIRONMENTS)) {
|
|
28
28
|
if (env.url === normalized) {
|
|
29
|
-
return env.label
|
|
29
|
+
return name === DEFAULT_ENV ? '' : `(${env.label})`;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
return
|
|
32
|
+
return `(${normalized})`;
|
|
33
33
|
}
|
package/dist/openapis-client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFile, stat } from 'node:fs/promises';
|
|
2
2
|
import { basename } from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { envNoteOfEndpoint } from './endpoints.js';
|
|
4
4
|
import { AuthError, BusinessError, NetworkError, UpgradeError } from './errors.js';
|
|
5
5
|
import { getCliVersion } from './npm-meta.js';
|
|
6
6
|
export const MAX_UPLOAD_SIZE_BYTES = 20 * 1024 * 1024;
|
|
@@ -42,13 +42,13 @@ export class OpenApisClient {
|
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
catch (e) {
|
|
45
|
-
throw new NetworkError(`无法连接 YOS
|
|
45
|
+
throw new NetworkError(`无法连接 YOS 服务${envNoteOfBase(this.base)},原因:${e.message}`);
|
|
46
46
|
}
|
|
47
47
|
return parseEnvelope(response);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
function
|
|
51
|
-
return
|
|
50
|
+
function envNoteOfBase(base) {
|
|
51
|
+
return envNoteOfEndpoint(base.replace(/\/open-apis$/, ''));
|
|
52
52
|
}
|
|
53
53
|
async function parseEnvelope(response) {
|
|
54
54
|
if (response.status === 401) {
|
|
@@ -129,7 +129,7 @@ export async function uploadKnowledgeFile(endpoint, apiKey, filePath, kbCode, pa
|
|
|
129
129
|
});
|
|
130
130
|
}
|
|
131
131
|
catch (e) {
|
|
132
|
-
throw new NetworkError(`无法连接 YOS
|
|
132
|
+
throw new NetworkError(`无法连接 YOS 服务${envNoteOfEndpoint(endpoint)},原因:${e.message}`);
|
|
133
133
|
}
|
|
134
134
|
return parseEnvelope(response);
|
|
135
135
|
}
|
package/dist/skill-sync.js
CHANGED
|
@@ -5,7 +5,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
5
5
|
import { readPackageMeta } from './npm-meta.js';
|
|
6
6
|
import { updateConfig } from './config.js';
|
|
7
7
|
import { saveVersionState } from './version-state.js';
|
|
8
|
-
export const BUILTIN_SKILLS = ['yos', 'yos-shared', 'yos-knowledge', 'yos-retrieval', 'yos-transcript', 'yos-support', 'yos-install'];
|
|
8
|
+
export const BUILTIN_SKILLS = ['yos', 'yos-shared', 'yos-knowledge', 'yos-doc-sheet', 'yos-retrieval', 'yos-transcript', 'yos-support', 'yos-install'];
|
|
9
9
|
const AGENT_SKILL_DIRS = ['.claude/skills', '.workbuddy/skills', '.cursor/skills', '.codex/skills', '.qoder/skills', '.qoder-cn/skills', '.agents/skills'];
|
|
10
10
|
export function skillsSourceDir() {
|
|
11
11
|
const here = dirname(fileURLToPath(import.meta.url));
|
package/dist/skills/yos/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yos
|
|
3
|
-
description: YOS 企业 AI
|
|
3
|
+
description: YOS 企业 AI 能力总入口:公司/部门/工作/个人等各类知识的检索与文档管理、云文档/云表格编写、录音转写、帮助手册、客户端升级与反馈。用户提到 yos/YOS 即使用本技能;用户问制度/流程/规范、要查或整理资料文档、要写云文档/云表格、要看会议录音转写、需要 YOS 客户端帮助时使用;不确定该用哪个 YOS 能力时先读本文件
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# YOS 能力总入口
|
|
@@ -10,13 +10,13 @@ YOS 是企业 AI 底座:公司知识、会议录音、帮助手册等能力都
|
|
|
10
10
|
## 0. 开工前先确认环境(30 秒)
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
yos doctor #
|
|
13
|
+
yos doctor # 全部 ✓ 才继续:配置文件 / 访问令牌 / 服务连通(回显身份)/ Skill 安装 / CLI 版本 / Skill 同步
|
|
14
14
|
yos ping # 只要探活,退出码即结论(0 通 / 3 网络 / 4 鉴权 / 5 版本过低)
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
- `command not found: yos` 或 `yos doctor` 报「未找到配置文件」→ 按 `yos-install` skill 引导用户装 CLI 与登录,不要继续猜命令
|
|
18
|
-
-
|
|
19
|
-
- 查版本用 `yos version`(或 `yos --version
|
|
18
|
+
- 已装但检查项没全 ✓ → 先修好再执行任务;`yos doctor` 的失败项自带修复提示
|
|
19
|
+
- 查版本用 `yos version`(或 `yos --version`);命令执行后 stderr 若出现「提示: 有新版本」,先执行 `yos update` 升级再继续任务(约定详见 yos-shared)
|
|
20
20
|
|
|
21
21
|
## 1. 意图路由
|
|
22
22
|
|
|
@@ -28,6 +28,7 @@ yos ping # 只要探活,退出码即结论(0 通 / 3 网络 / 4 鉴
|
|
|
28
28
|
| 浏览/搜索自己的知识库与文档内容 | `kb list` `kb detail` `docs tree` `docs content` | yos-knowledge |
|
|
29
29
|
| 把知识库里的上传文件取回本地 | `docs download <node_code> --out <路径>` | yos-knowledge |
|
|
30
30
|
| 上传本地文件或目录、新建文档/文件夹、改名、移动、删除、回收站恢复 | `kb upload` `docs create` `docs mkdir` `docs update` `docs rename` `docs move` `docs delete` `docs restore` | yos-knowledge |
|
|
31
|
+
| 往知识库**写云文档/云表格**(在线文档、在线表格;非办公文件) | `docs create --type cloud/sheet`、`docs update` | **先读 yos-doc-sheet**(正文是结构化 JSON,结构与编写规范都在这本) |
|
|
31
32
|
| 会议录音转写、纪要、逐句发言 | `transcript list` → `transcript detail` | yos-transcript |
|
|
32
33
|
| 「YOS 怎么用」、客户端最新版本、提交问题反馈 | `support manual*` `support upgrade*` `support feedback` | yos-support |
|
|
33
34
|
| 领域命令没覆盖的能力 | `tool list` → `tool schema <name>` → `tool call <name> --params '{...}'` | yos-shared |
|
|
@@ -41,7 +42,7 @@ yos ping # 只要探活,退出码即结论(0 通 / 3 网络 / 4 鉴
|
|
|
41
42
|
1. **`--json` 是双层包装**:外层 `{"text":"<JSON 字符串>","isError":false}`,要拿字段必须对 `text` 再 `JSON.parse` 一次;`isError:true` 时 `text` 是错误文案而非数据
|
|
42
43
|
2. **参数错误一律 exit=2 且不发请求**:非法枚举、越界 `--size`、日期格式非法或区间倒置、URN 非法、必填缺失都由 CLI 本地拦下,照 `提示:` 改参数即可,不要重试原命令。exit=0 仍需自行校验内容的场景见 yos-shared
|
|
43
44
|
3. **引用作答必须读原文**:`retrieve search` 的 `snippet` 只是线索,不能作为引用依据;未 `retrieve read` 之前不下结论
|
|
44
|
-
4. **写操作先复述再执行**:`kb update`、`docs create/update/mkdir/rename/move`、`kb upload`、`support feedback` 都要让用户确认最终文案;`docs update`
|
|
45
|
+
4. **写操作先复述再执行**:`kb update`、`docs create/update/mkdir/rename/move`、`kb upload`、`support feedback` 都要让用户确认最终文案;`docs update` 是**整体覆盖**(正文传什么就替换什么);写云文档/云表格(`--type cloud/sheet`)的正文前**先读 yos-doc-sheet 技能**——正文是结构化 JSON 且服务端不校验,写错要到客户端打开才暴露
|
|
45
46
|
5. **删除必须两步**:`yos docs count <node_code>` 查受影响文档数 → 展示给用户 → 用户明确同意后才 `yos docs delete`。未经确认不得调用
|
|
46
47
|
6. **令牌不出现在任何输出里**:不写进日志、命令、对用户的回复;只以掩码形式(`xxxxxxxx****xxxx`,即前 8 位 + `****` + 后 4 位)引用
|
|
47
48
|
7. **日期参数分两类,别混用**:`transcript list --start/--end`、`support upgrade-log --start/--end` **只收 `yyyy-MM-dd`**,中文表达由 CLI 本地拒绝(`错误: --start 日期格式应为 yyyy-MM-dd:本周`,exit 2),须自己换算;`retrieve search/outline` 的 `--occurred-*`/`--effective-*` **收自然语言**(`上季度`、`8 月` 直接传,由服务端解析),`retrieve search` 还会把 `--query` 文本里的时间表达解析为时间窗并在 `time_window` 回显
|
|
@@ -50,8 +51,8 @@ yos ping # 只要探活,退出码即结论(0 通 / 3 网络 / 4 鉴
|
|
|
50
51
|
|
|
51
52
|
1. 用户在 YOS 客户端「个人设置-访问令牌」页创建并复制令牌(40 位小写 hex)
|
|
52
53
|
2. `yos login` 交互粘贴(不回显);Agent 代执行时用 `yos login --key <令牌>`
|
|
53
|
-
3. 配置文件 `~/.config/yos/config.json`(0600)。环境变量**优先于配置文件**:`YOS_CONFIG_DIR`(换配置目录)、`YOS_API_KEY`(换令牌)、`YOS_ENV
|
|
54
|
-
4.
|
|
54
|
+
3. 配置文件 `~/.config/yos/config.json`(0600)。环境变量**优先于配置文件**:`YOS_CONFIG_DIR`(换配置目录)、`YOS_API_KEY`(换令牌)、`YOS_ENV`(换服务环境)
|
|
55
|
+
4. 切换服务环境(测试/开发用途):`yos login --env test`(临时可用 `YOS_ENV=test`),本地调试 `--env dev`(指向本机 8080 起的服务)
|
|
55
56
|
5. 退出码 4 = 令牌无效/已吊销/已过期 → 引导重新 `yos login`,不要反复重试同一命令
|
|
56
57
|
|
|
57
58
|
## 4. 常用编排(已实测)
|
|
@@ -69,6 +70,13 @@ yos kb upload ./报告.pdf --kb KB20261009000001 # 单文件上传
|
|
|
69
70
|
yos docs download ND20261009000012 --out ./归档/ # 取回上传的原文件(仅 docType=file)
|
|
70
71
|
yos docs count ND20261009000012 # 删除前查影响范围
|
|
71
72
|
|
|
73
|
+
# 往知识库写云文档 / 云表格(正文是结构化 JSON 而非文本;动手前先读 yos-doc-sheet 技能)
|
|
74
|
+
# 场景:会议结论/方案等沉淀为在线文档 → 云文档 --type cloud;登记表/对照表/排期表 → 云表格 --type sheet
|
|
75
|
+
yos docs create "上线检查清单" --kb KB20261009000001 --type cloud --file draft.yosdoc.json
|
|
76
|
+
yos docs create "值班排期表" --kb KB20261009000001 --type sheet --file draft.sheet.json
|
|
77
|
+
yos docs content ND20261010000030 --json # 写后自查:读回确认正文完整落库、结构未变形
|
|
78
|
+
yos docs update ND20261010000030 --file edited.yosdoc.json # 改正文=整体覆盖:先读回全文,本地编辑后整体回传
|
|
79
|
+
|
|
72
80
|
# 会议内容
|
|
73
81
|
yos transcript list --json # 取 transcriptionUserId(不是 TT 开头编码)
|
|
74
82
|
yos transcript detail 2105108032979103745 --json # 取 summary / sentences
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: yos-doc-sheet
|
|
3
|
+
description: YOS 云文档与云表格的正文编写规范(DocDraft / SheetWorkbook JSON 数据结构)。用户提到 yos/YOS 且要新建或修改知识库里的云文档、云表格(在线文档/在线表格,非办公文件;即 docs create --type cloud/sheet 与 docs update 改正文)时,先读本技能确定正文结构;上传办公文件(kb upload)与写 Markdown 文档(--type md)不需要本技能
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# YOS 云文档与云表格编写(DocDraft / SheetWorkbook)
|
|
7
|
+
|
|
8
|
+
**往 YOS 知识库写"云文档"或"云表格"的正文内容(新建或修改)前,必须先读本技能。** 两者的正文不是纯文本,而是结构化 JSON(不是 Markdown / HTML / CSV),且服务端**不做 schema 校验**(原样存储)——结构写错要到客户端打开时才暴露;本技能自带官方校验器(§5),草稿写完先本地校验再上传。
|
|
9
|
+
|
|
10
|
+
## 0. 适用边界(先分清楚再动手)
|
|
11
|
+
|
|
12
|
+
| 场景 | 走哪个命令 | 用本技能? |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| 上传办公文件(docx/xlsx/pdf/png…) | `yos kb upload`(落库为 docType=file) | 否 |
|
|
15
|
+
| 写 Markdown 文档 | `yos docs create`(缺省 `--type md`) | 否 |
|
|
16
|
+
| **写云文档(在线文档)** | `yos docs create --type cloud`、`yos docs update` | **是,先读本技能** |
|
|
17
|
+
| **写云表格(在线表格)** | `yos docs create --type sheet`、`yos docs update` | **是,先读本技能** |
|
|
18
|
+
| 目录管理(建文件夹 / 改名 / 移动 / 删除 / 恢复) | `yos docs mkdir/rename/move/delete/restore` | 否(见 yos-knowledge) |
|
|
19
|
+
|
|
20
|
+
判断一个已有节点属于哪类:`docs tree` / `docs content` 的 `docType` 字段——`cloud` = 云文档、`sheet` = 云表格、`md` = Markdown、`file` = 上传的办公文件。
|
|
21
|
+
|
|
22
|
+
## 1. 三步流程
|
|
23
|
+
|
|
24
|
+
1. **写 JSON 草稿**:云文档按 §2 的 DocDraft 结构;云表格按 §3 的 SheetWorkbook 结构。草稿一律落成本地文件(多行 JSON 不要用 `--content` 拼字符串),写好后先用技能自带校验器过一遍(§5)
|
|
25
|
+
2. **上传**:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# 新建(--parent 为目标文件夹编码,缺省库根;--kb 与 --parent 至少一个)
|
|
29
|
+
yos docs create "<标题>" --kb <kbCode> [--parent <folderCode>] --type cloud|sheet --file <草稿.json>
|
|
30
|
+
|
|
31
|
+
# 修改已有(正文整体覆盖:先读回完整正文,本地编辑后整体回传)
|
|
32
|
+
yos docs update <nodeCode> --title "<新标题>" --file <草稿.json>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
3. **读回自查**:`yos docs content <nodeCode> --json` 确认 `docType`(cloud/sheet)与正文 JSON 完整落库、结构未变形
|
|
36
|
+
|
|
37
|
+
## 2. 云文档(--type cloud)—— DocDraft JSON
|
|
38
|
+
|
|
39
|
+
对齐编辑器:`@yos/doc-editor`。
|
|
40
|
+
|
|
41
|
+
### 2.1 顶层结构
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"title": "文档标题",
|
|
46
|
+
"attachments": [],
|
|
47
|
+
"content": { "type": "doc", "content": [] }
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- `title`:与 `docs create` 的标题参数保持一致
|
|
52
|
+
- `attachments`:必须为 `[]`(禁止非空、禁止编造 mediaId)
|
|
53
|
+
- `content`:TipTap 文档树,`type` 固定为 `doc`,节点放 `content` 数组
|
|
54
|
+
|
|
55
|
+
### 2.2 节点档位
|
|
56
|
+
|
|
57
|
+
| 档 | 节点 | 用法 |
|
|
58
|
+
| -- | ---- | ---- |
|
|
59
|
+
| **tier A(默认)** | `paragraph` `heading` `blockquote` `horizontalRule` `hardBreak` `bulletList` `orderedList` `listItem` `taskList` `taskItem` `codeBlock` `callout` `table` `tableRow` `tableHeader` `tableCell` `text` | 直接写 |
|
|
60
|
+
| **tier B(用户明确要求)** | `columnBlock` `column`(分栏)、`image`(外链图) | 仅在明确要求时写 |
|
|
61
|
+
| **禁止(永远不写)** | `mindmap` `flowchart` `video` `audio` `file` | — |
|
|
62
|
+
|
|
63
|
+
行内 marks 允许:`bold` `italic` `strike` `underline` `code` `link` `textStyle` `highlight`;禁止 `glossaryTerm`。
|
|
64
|
+
|
|
65
|
+
### 2.3 常用节点示例
|
|
66
|
+
|
|
67
|
+
段落与文本(`attrs` 建议保留为下述形态):
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{"type":"paragraph","attrs":{"indent":0,"textAlign":null},"content":[{"type":"text","text":"正文内容"}]}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
标题(`level` 1~6):
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{"type":"heading","attrs":{"level":2,"indent":0,"textAlign":null,"collapsed":false},"content":[{"type":"text","text":"小节标题"}]}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
无序列表(`bulletList` → `listItem` → `paragraph`,可嵌套;有序列表把 type 换成 `orderedList` 并加 `attrs":{"start":1,"type":null}`,其余相同):
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{"type":"bulletList","content":[
|
|
83
|
+
{"type":"listItem","attrs":{"collapsed":false},"content":[
|
|
84
|
+
{"type":"paragraph","attrs":{"indent":0,"textAlign":null},"content":[{"type":"text","text":"列表项"}]}
|
|
85
|
+
]}
|
|
86
|
+
]}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
任务列表(`taskList` → `taskItem` → `paragraph`,`checked` 控制勾选态):
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{"type":"taskList","content":[
|
|
93
|
+
{"type":"taskItem","attrs":{"checked":false},"content":[
|
|
94
|
+
{"type":"paragraph","attrs":{"indent":0,"textAlign":null},"content":[{"type":"text","text":"待办项"}]}
|
|
95
|
+
]}
|
|
96
|
+
]}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
引用与提示块:
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"textAlign":null},"content":[{"type":"text","text":"引用内容"}]}]}
|
|
103
|
+
{"type":"callout","attrs":{"emoji":"💡","backgroundColor":null,"borderColor":null},"content":[{"type":"paragraph","attrs":{"indent":0,"textAlign":null},"content":[{"type":"text","text":"提示内容"}]}]}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
代码块(换行用 `\n` 写在同一 `text` 内):
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{"type":"codeBlock","attrs":{"language":"plaintext","wrap":false,"caption":"代码块","collapsed":false,"regionFolds":[]},"content":[{"type":"text","text":"yos kb list\nyos doctor"}]}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
表格(`table` → `tableRow` → `tableHeader`/`tableCell` → `paragraph`;首行用 `tableHeader`,数据行用 `tableCell`):
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{"type":"table","content":[
|
|
116
|
+
{"type":"tableRow","attrs":{"height":null},"content":[
|
|
117
|
+
{"type":"tableHeader","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"align":null,"backgroundColor":null},"content":[
|
|
118
|
+
{"type":"paragraph","attrs":{"indent":0,"textAlign":null},"content":[{"type":"text","text":"列 A"}]}
|
|
119
|
+
]}
|
|
120
|
+
]},
|
|
121
|
+
{"type":"tableRow","attrs":{"height":null},"content":[
|
|
122
|
+
{"type":"tableCell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"align":null,"backgroundColor":null},"content":[
|
|
123
|
+
{"type":"paragraph","attrs":{"indent":0,"textAlign":null},"content":[{"type":"text","text":"1"}]}
|
|
124
|
+
]}
|
|
125
|
+
]}
|
|
126
|
+
]}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
分隔线与强制换行:`{"type":"horizontalRule"}`(无 content);`{"type":"hardBreak"}` 放在 paragraph / heading 的 content 内。
|
|
130
|
+
|
|
131
|
+
### 2.4 节点 attrs 速查
|
|
132
|
+
|
|
133
|
+
| type | attrs |
|
|
134
|
+
| ---- | ----- |
|
|
135
|
+
| `paragraph` | `{ "indent": 0, "textAlign": null }`;indent 0~8;textAlign null/left/center/right/justify |
|
|
136
|
+
| `heading` | `{ "level": 1, "indent": 0, "textAlign": null, "collapsed": false }`;level 1~6 |
|
|
137
|
+
| `orderedList` | `{ "start": 1, "type": null }` |
|
|
138
|
+
| `listItem` | `{ "collapsed": false }` |
|
|
139
|
+
| `taskItem` | `{ "checked": false }` |
|
|
140
|
+
| `codeBlock` | `{ "language": "plaintext", "wrap": false, "caption": "代码块", "collapsed": false, "regionFolds": [] }` |
|
|
141
|
+
| `callout` | `{ "emoji": "💡", "backgroundColor": null, "borderColor": null }` |
|
|
142
|
+
| `tableRow` | `{ "height": null }` |
|
|
143
|
+
| `tableHeader` / `tableCell` | `{ "colspan": 1, "rowspan": 1, "colwidth": null, "align": null, "backgroundColor": null }` |
|
|
144
|
+
| `blockquote` `bulletList` `taskList` `table` `horizontalRule` `hardBreak` | 无 attrs |
|
|
145
|
+
|
|
146
|
+
tier B 节点(用户明确要求时):
|
|
147
|
+
|
|
148
|
+
- `columnBlock`:attrs `{ "widths": [50, 50] }`,含 2~5 个 `column`(`column` 无 attrs,内放块节点)
|
|
149
|
+
- `image`:attrs 完整字段 `{ "src": "https://…", "mediaId": "", "alt": null, "title": null, "width": null, "height": null, "align": "left", "caption": "", "originalSrc": null, "uploadStatus": null, "uploadId": "" }`——`src` 仅 http(s);**勿编造 `mediaId` / `upload*`**(媒体由客户端宿主上传)
|
|
150
|
+
|
|
151
|
+
### 2.5 行内 marks
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
{"type":"text","marks":[{"type":"bold"}],"text":"加粗"}
|
|
155
|
+
{"type":"text","marks":[{"type":"italic"}],"text":"斜体"}
|
|
156
|
+
{"type":"text","marks":[{"type":"strike"}],"text":"删除线"}
|
|
157
|
+
{"type":"text","marks":[{"type":"underline"}],"text":"下划线"}
|
|
158
|
+
{"type":"text","marks":[{"type":"code"}],"text":"行内代码"}
|
|
159
|
+
{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"#3370ff"}}],"text":"彩色文字"}
|
|
160
|
+
{"type":"text","marks":[{"type":"highlight","attrs":{"color":"#faf1d1"}}],"text":"高亮"}
|
|
161
|
+
{"type":"text","marks":[{"type":"link","attrs":{"href":"https://example.com","target":"_blank","rel":"noopener noreferrer nofollow","class":"yos-docs-editor-link","title":null}}],"text":"链接"}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
可叠加:加粗+斜体同放数组,如 `[{"type":"bold"},{"type":"italic"}]`。
|
|
165
|
+
|
|
166
|
+
### 2.6 禁止与注意事项
|
|
167
|
+
|
|
168
|
+
- 禁止节点:`mindmap`、`flowchart`、`video`、`audio`、`file`;禁止 mark:`glossaryTerm`
|
|
169
|
+
- 默认只写 tier A 结构;分栏、外链图等 tier B 仅在用户明确要求时使用
|
|
170
|
+
- **不要以 Markdown 作为最终产物**:先定内容结构再落成上述节点 JSON;转换时逐段映射(标题→heading、列表→bulletList、有序列表→orderedList、待办→taskList、引用→blockquote、表格→table、提示→callout)
|
|
171
|
+
|
|
172
|
+
## 3. 云表格(--type sheet)—— SheetWorkbook JSON
|
|
173
|
+
|
|
174
|
+
对齐编辑器:`@yos/sheet-editor`。
|
|
175
|
+
|
|
176
|
+
### 3.1 顶层结构
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"id": "workbook-id",
|
|
181
|
+
"name": "工作簿名称",
|
|
182
|
+
"appVersion": "0.25.1",
|
|
183
|
+
"locale": "zhCN",
|
|
184
|
+
"styles": {},
|
|
185
|
+
"sheetOrder": ["sheet-1"],
|
|
186
|
+
"sheets": {
|
|
187
|
+
"sheet-1": {
|
|
188
|
+
"id": "sheet-1",
|
|
189
|
+
"name": "Sheet1",
|
|
190
|
+
"rowCount": 100,
|
|
191
|
+
"columnCount": 20,
|
|
192
|
+
"cellData": {}
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"resources": []
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- `name`:与 `docs create` 的标题参数保持一致;`id` 自拟唯一字符串即可;工作表 `name` ≤ 31 字符(Excel 限制)
|
|
200
|
+
- `appVersion` 固定 `0.25.1`、`locale` 固定 `zhCN`
|
|
201
|
+
- `sheetOrder` 决定页签顺序(至少 1 项,id 必须在 `sheets` 中存在);多页签时在 `sheets` 中并列多个表对象
|
|
202
|
+
- `styles`:tier B 样式表(见 3.4);纯值表格省略即可
|
|
203
|
+
- `resources` 必须为 `[]`(禁止编造插件数据)
|
|
204
|
+
|
|
205
|
+
### 3.2 单元格 cellData
|
|
206
|
+
|
|
207
|
+
`{ "行索引": { "列索引": { 字段 } } }`——行列索引从 `0` 起、以字符串作键,稀疏存储(空行 / 空列不写):
|
|
208
|
+
|
|
209
|
+
```json
|
|
210
|
+
"cellData": {
|
|
211
|
+
"0": { "0": { "v": "项目", "t": 1 }, "1": { "v": "数量", "t": 1 } },
|
|
212
|
+
"1": { "0": { "v": "示例 A", "t": 1 }, "1": { "v": 2, "t": 2 } },
|
|
213
|
+
"2": { "2": { "f": "=B2*2", "v": 4, "t": 2 } }
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
| 字段 | 说明 |
|
|
218
|
+
| ---- | ---- |
|
|
219
|
+
| `v` | 显示 / 原始值:string / number / boolean / null |
|
|
220
|
+
| `t` | 类型:`1` 文本 / `2` 数字 / `3` 布尔 / `4` 强制文本(建议显式写) |
|
|
221
|
+
| `f` | 公式,须含前导 `=`;建议同时用 `v` 写计算结果(客户端会重算) |
|
|
222
|
+
| `s` | 仅 tier B:样式 id(指向根 `styles`)或内联样式对象 |
|
|
223
|
+
|
|
224
|
+
禁止单元格字段:`p` / `si` / `ref` / `xf`(编辑器内核复杂字段)。
|
|
225
|
+
|
|
226
|
+
### 3.3 工作表字段档位
|
|
227
|
+
|
|
228
|
+
| 字段 | 档 | 说明 |
|
|
229
|
+
| ---- | -- | ---- |
|
|
230
|
+
| `id` / `name` | A | 必有;name ≤ 31 字符 |
|
|
231
|
+
| `rowCount` / `columnCount` | A | 建议写;rowCount ≤ 10000 |
|
|
232
|
+
| `cellData` | A | 稀疏单元格 |
|
|
233
|
+
| `hidden` / `showGridlines` | A | 0 / 1 |
|
|
234
|
+
| `styles`(根)+ 单元格 `s` | B | 样式表 + 引用 |
|
|
235
|
+
| `mergeData` | B | 合并单元格 |
|
|
236
|
+
| `freeze` | B | 冻结行列 |
|
|
237
|
+
| `rowData` / `columnData` | B | 行高 `h` / 列宽 `w` |
|
|
238
|
+
| `tabColor` | B | 页签颜色,如 `"#3491FA"` |
|
|
239
|
+
|
|
240
|
+
tier B 字段仅在用户明确要求(如"表头加样式""调整列宽""冻结首行")时使用;其余工作表字段(defaultColumnWidth 等)见 `references/SHEET_DATA_API.md`。
|
|
241
|
+
|
|
242
|
+
### 3.4 tier B 结构(用户明确要求时)
|
|
243
|
+
|
|
244
|
+
样式表 + 合并 + 冻结 + 列宽 + 页签色综合形态(片段仅示增量字段,实际草稿按 3.1 骨架补全 id/appVersion/locale/sheetOrder/resources 等):
|
|
245
|
+
|
|
246
|
+
```json
|
|
247
|
+
{
|
|
248
|
+
"styles": {
|
|
249
|
+
"header": { "bl": 1, "ht": 2, "bg": { "rgb": "#E8F3FF" }, "cl": { "rgb": "#1F2329" } },
|
|
250
|
+
"number": { "ht": 3, "n": { "pattern": "0.00" } }
|
|
251
|
+
},
|
|
252
|
+
"sheets": {
|
|
253
|
+
"sheet-1": {
|
|
254
|
+
"tabColor": "#3491FA",
|
|
255
|
+
"freeze": { "xSplit": 0, "ySplit": 1, "startRow": 1, "startColumn": 0 },
|
|
256
|
+
"mergeData": [{ "startRow": 0, "startColumn": 0, "endRow": 0, "endColumn": 3 }],
|
|
257
|
+
"rowData": { "0": { "h": 30 } },
|
|
258
|
+
"columnData": { "0": { "w": 120 }, "1": { "w": 96 } },
|
|
259
|
+
"cellData": {
|
|
260
|
+
"0": { "0": { "v": "销售明细", "t": 1, "s": "header" } },
|
|
261
|
+
"1": { "0": { "v": "数量", "t": 1, "s": "header" }, "1": { "v": 2, "t": 2 } },
|
|
262
|
+
"2": { "0": { "v": "示例 A", "t": 1 }, "1": { "v": 2, "t": 2 }, "2": { "f": "=B3*2", "v": 4, "t": 2, "s": "number" } }
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
- 样式常用键:`bl` 粗体、`it` 斜体、`bg` 背景色、`cl` 前景色、`ht` 水平对齐(2=居中)、`vt` 垂直对齐、`n.pattern` 数字格式、`bd` 边框;颜色写成 `{ "rgb": "#E8F3FF" }`
|
|
270
|
+
- `mergeData`:合并区左上角单元格写值,被合并覆盖的格子不写
|
|
271
|
+
- `freeze`:冻结首行 `{ "xSplit": 0, "ySplit": 1, "startRow": 1, "startColumn": 0 }`
|
|
272
|
+
- 行高 / 列宽:`rowData`/`columnData` 按行 / 列索引给 `h` / `w`(单位 px)
|
|
273
|
+
|
|
274
|
+
### 3.5 约束
|
|
275
|
+
|
|
276
|
+
- `rowCount` ≤ 10000;按内容规模设置(简单表 100 行 × 20 列即可)
|
|
277
|
+
- 禁止非空 `resources`、禁止编造 `SHEET_*_PLUGIN` 插件数据
|
|
278
|
+
- 纯空表格骨架(仅建空表时用):`{"id":"","sheetOrder":[],"sheets":{}}`
|
|
279
|
+
|
|
280
|
+
## 4. 常见任务编排
|
|
281
|
+
|
|
282
|
+
**新建云文档并落到指定文件夹**
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
yos kb list --keyword <库名> # 1. 拿 kbCode
|
|
286
|
+
yos docs tree KBxxxx --json # 2. 找目标文件夹 resourceCode(须 resourceType=folder)
|
|
287
|
+
# 3. 写草稿(§2 结构),如 draft.yosdoc.json
|
|
288
|
+
yos docs create "文档标题" --parent NDxxxx --type cloud --file draft.yosdoc.json
|
|
289
|
+
yos docs content NDyyyy --json # 4. 读回自查
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**修改已有云文档的正文**(整体覆盖,保留未改动部分)
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
yos docs content NDyyyy --json # 1. 取回完整正文 content
|
|
296
|
+
# 2. 本地编辑目标段落,其余节点原样保留
|
|
297
|
+
yos docs update NDyyyy --title "标题" --file edited.yosdoc.json # 3. 整体回传
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**云表格**同理:草稿换成 §3 的 SheetWorkbook 结构、`--type sheet`;修改同样走 `docs update` 整体覆盖。
|
|
301
|
+
|
|
302
|
+
## 5. 校验与避坑(实测)
|
|
303
|
+
|
|
304
|
+
### 5.1 本地校验器(技能自带,先校验再上传)
|
|
305
|
+
|
|
306
|
+
本技能自带与官方编辑器同源的校验器(Node ≥ 18,纯 ESM),用法(`<技能目录>` 即本 SKILL.md 所在目录):
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
node "<技能目录>/scripts/yos-sheet.mjs" validate draft.json --tier A|B # 云表格
|
|
310
|
+
node "<技能目录>/scripts/yos-doc.mjs" validate draft.json --tier A|B # 云文档
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
- 默认 tier A;草稿含 tier B 字段(样式/合并/冻结/行列宽、分栏/图片)时必须显式 `--tier B`,否则校验器按字段路径逐条拒绝
|
|
314
|
+
- 通过 exit 0;失败 exit 1 并逐条输出 `字段路径: 原因`;参数错误 exit 2
|
|
315
|
+
- `schema` 子命令打印当前档位白名单(JSON);`paths` 子命令打印 references 各文档的绝对路径
|
|
316
|
+
|
|
317
|
+
### 5.2 参考文档(references/,全量契约)
|
|
318
|
+
|
|
319
|
+
- `references/AGENT_SCHEMA.sheet.md`、`references/AGENT_SCHEMA.doc.md`:官方 Agent 契约完整版(本文档的同源展开)
|
|
320
|
+
- `references/SHEET_DATA_API.md`、`references/DOC_DATA_API.md`:编辑器全量数据 API(本文档未覆盖的字段查这里)
|
|
321
|
+
- `references/few-shot.workbook.json`、`references/few-shot.draft.json`:可直接参考的草稿示例(均过 tier A 校验)
|
|
322
|
+
- 两个模板仅作字段形态参考、不要照抄:`sheet-workbook.template.json` 是 tier B 全特性模板(`--tier B` 通过,简单表勿用);`doc-draft.template.json` 是编辑器全量能力演示(含 attachments、glossaryTerm、禁止节点),任何档位都无法直接通过校验,其中 `attachments` 非空仅为展示、写草稿必须为 `[]`
|
|
323
|
+
|
|
324
|
+
### 5.3 避坑
|
|
325
|
+
|
|
326
|
+
- **没有在线校验**:CLI 与服务端都不校验正文 schema,写入即原样存储。自查手段:草稿先过 5.1 校验器或本地 JSON 语法(如 `jq . draft.json`)→ 上传后 `docs content --json` 读回核对结构
|
|
327
|
+
- `docs content` 读回的 `content` 是 **JSON 字符串**,需对 `text` 再 `JSON.parse` 两次(外层信封 + content 字符串)
|
|
328
|
+
- `docs update` 的正文是**整体覆盖**不是局部替换——改一处也要先取全文再整体回传,否则其余内容会丢
|
|
329
|
+
- 渲染效果(尤其高级结构、代码块、表格样式)以 YOS 客户端打开为准;发现渲染异常先确认草稿结构,必要时用 `yos support feedback` 反馈
|
|
330
|
+
- 同一文件重复上传不会去重;同名云文档可并存,创建前可先 `docs tree` 看目标位置是否已有同名节点
|