初始化workbuddy技能和安装wsl方法

This commit is contained in:
2026-07-29 08:55:43 +08:00
commit 2b93f1e138
7 changed files with 1308 additions and 0 deletions
@@ -0,0 +1,217 @@
---
name: lexiang-kb-uploader
description: 乐享知识库(lexiang)上传技能——查找/新建知识库、创建文件夹目录、导入Markdown为在线页面、上传文件附件的完整工作流。当用户要求"传到知识库""上传到乐享""把文件放到知识库""在乐享建个目录""传页面到乐享"等涉及乐享知识库文件操作时触发。
agent_created: true
---
# 乐享知识库上传技能(Lexiang KB Uploader)
## 用途
将本地文件上传到乐享知识库(lexiang),支持四种操作:
1. **查找/新建知识库**——定位个人知识库或团队知识库
2. **创建文件夹目录**——在知识库中建立层级结构
3. **导入页面**——将 Markdown/HTML 内容创建为可在线阅读的页面
4. **上传文件附件**——将任意文件(txt/pdf/docx/zip等)作为附件上传
## 触发场景
- "把文件传到我的知识库"
- "上传到乐享"
- "在知识库里建个目录/文件夹"
- "把这些md文件导成在线页面"
- "把txt文件传到乐享"
## 前置条件
- 乐享知识库 connector 已连接(lexiang: connected)
- 如未连接,引导用户到 connector 管理页面开启
---
## 第一步:查找或新建知识库
### 1.1 获取身份信息与个人知识库
调用 `mcp__lexiang__whoami`(通过 ToolSearch 加载后用 DeferExecuteTool 执行):
- 返回当前用户信息,其中 `personal_space` 包含个人知识库的 `id` 和 `root_entry_id`
- **root_entry_id 是后续创建文件夹/页面的父节点ID**
### 1.2 查找团队知识库
调用 `mcp__lexiang__team_list_teams` 获取用户所属团队列表,每个团队下有多个知识库。
调用 `mcp__lexiang__space_list_spaces` 获取指定团队下的知识库列表。
### 1.3 新建知识库
如果用户需要新建一个知识库(而非使用个人知识库),在乐享网页端操作更便捷。告知用户访问 `https://lexiangla.com` 在相应团队下创建。
> 个人知识库默认存在,无需新建。`whoami` 返回的 `personal_space` 即为个人知识库。
---
## 第二步:创建文件夹目录
调用 `mcp__lexiang__entry_create_entry`,参数:
- `entry_type`: `"folder"`
- `name`: 文件夹名称
- `parent_entry_id`: 父节点ID(个人知识库根目录用 whoami 返回的 `root_entry_id`,或已创建的文件夹ID)
可嵌套创建:先建父文件夹,拿到返回的 `entry.id`,再以它为 `parent_entry_id` 建子文件夹。
### 示例:创建两级目录
```
1. 创建父文件夹"项目资料"
parent_entry_id = root_entry_id(个人知识库根节点)
→ 返回 entry.id = "xxx"
2. 创建子文件夹"文档"
parent_entry_id = "xxx"(上一步返回的ID)
→ 返回 entry.id = "yyy"
```
---
## 第三步:导入页面(Markdown/HTML → 在线页面)
适用于 `.md`、`.html` 文件,或纯文本内容。导入后生成可在线阅读、搜索的页面。
### 单个文件导入
调用 `mcp__lexiang__entry_import_content`,参数:
- `content`: Markdown 或 HTML 原文(**直接传入原文,不要拆分**,接口无长度限制)
- `content_type`: `"markdown"` 或 `"html"`
- `name`: 页面标题
- `parent_id`: 父文件夹 entry_id
- `space_id`: 知识库ID(**必填**,否则报 `parent entry not belong to space` 错误)
> **space_id 获取方式**:个人知识库的 space_id 在 whoami 返回的 `personal_space.id` 中;团队知识库的 space_id 在 space_list_spaces 返回值中。
### 批量导入
当有多个 Markdown 文件需要导入时,推荐用 Agent 工具在后台并行处理:
- 对每个文件:Read 读取内容 → DeferExecuteTool 调用 entry_import_content
- 每个文件导入完再做下一个,避免并发冲突
### 访问链接格式
导入成功后返回 `entry.id`,访问链接为:`https://mcp.lexiang-app.com/pages/{entry_id}`
---
## 第四步:上传文件附件
适用于 `.txt`、`.pdf`、`.docx`、`.zip`、`.mp4` 等任意文件类型。文件以附件形式存储,不转为在线页面。
### 完整上传流程(3步,缺一不可)
#### 第1步:申请上传凭证
调用 `mcp__lexiang__file_apply_upload`,参数:
- `name`: 文件名(含扩展名)
- `mime_type`: 文件MIME类型(如 `text/plain`、`application/pdf`、`application/zip`)
- `size`: 文件大小(字节数,用 `wc -c < "文件路径"` 或 `stat --printf="%s" "文件路径"` 获取)
- `parent_entry_id`: 父文件夹 entry_id
- `upload_type`: `"PRE_SIGNED_URL"`
返回值中需要提取:
- `session_id`:用于第3步
- `upload_url`:用于第2步的 HTTP PUT 地址
#### 第2步:HTTP PUT 上传文件内容
用 Bash 工具执行 curl 命令,将文件内容 PUT 到第1步返回的 `upload_url`:
```bash
# 将 upload_url 存入临时文件(避免特殊字符导致shell解析错误)
echo '<upload_url>' > /tmp/url.txt
# 上传文件(注意 Content-Type 要与第1步的 mime_type 一致)
curl -s -o /dev/null -w "%{http_code}" \
-X PUT \
-H "Content-Type: text/plain" \
-T "本地文件路径" \
"$(cat /tmp/url.txt)"
```
**返回 200 表示成功。**
#### ⚠️ 常见坑(必读)
1. **Content-Type 必须匹配**:curl 默认发送 `application/x-www-form-urlencoded`,如果 mime_type 是 `text/plain`,必须显式加 `-H "Content-Type: text/plain"`,否则 COS 会返回 403。
2. **URL 含特殊字符**:预签名 URL 包含查询参数(`?`、`&`、`=`),直接写在命令行会被 shell 解析。**解决方案**:将 URL 存入临时文件,用 `"$(cat /tmp/url.txt)"` 读取。
3. **文件名含中文/特殊字符**:文件路径必须用双引号包裹,如 `"E:/路径/文件名.txt"`。
4. **清理临时文件**:上传完成后删除临时 URL 文件。
#### 第3步:确认上传
调用 `mcp__lexiang__file_commit_upload`,参数:
- `session_id`: 第1步返回的 session_id
返回 entry 对象,访问链接:`https://mcp.lexiang-app.com/pages/{entry_id}`
### 批量上传
当有大量文件(如 10+ 个)需要上传时,推荐用 Agent 工具在后台处理:
- 对每个文件重复上述3步
- 用脚本自动化(先循环 apply_upload,再循环 PUT,再循环 commit)
### 更新已有文件
如需替换已上传的文件内容(而非新建):
- `file_id`: 填已有文件的 file_id(通过 `mcp__lexiang__entry_describe_entry` 获取,返回的 `target_id` 即为 file_id)
- `parent_entry_id`: **填当前文件条目自己的 entry_id**(不是父节点!)
---
## 完整工作流示例
场景:将本地 `资料/` 目录(含 md 文件和 txt 文件)上传到个人知识库。
```
1. whoami → 获取 personal_space.id(space_id)和 root_entry_id
2. entry_create_entry → 创建文件夹"资料"(parent=root_entry_id)→ 得到 folder_id
3. entry_create_entry → 在"资料"下创建子文件夹"文档"和"附件"
4. 对每个 .md 文件:
Read 文件内容 → entry_import_content(parent=文档文件夹ID, space_id=space_id)
5. 对每个 .txt 文件:
file_apply_upload → curl PUT → file_commit_upload
6. present_files 呈交知识库访问链接
```
---
## 工具速查
| 操作 | 工具名 | 关键参数 |
|------|--------|----------|
| 获取身份/个人库 | `mcp__lexiang__whoami` | 无 |
| 列出团队 | `mcp__lexiang__team_list_teams` | 无 |
| 列出知识库 | `mcp__lexiang__space_list_spaces` | team_id(可选) |
| 获取知识库详情 | `mcp__lexiang__space_describe_space` | space_id |
| 获取个人知识库 | `mcp__lexiang__space_describe_personal_space` | 无 |
| 创建文件夹/条目 | `mcp__lexiang__entry_create_entry` | entry_type, name, parent_entry_id |
| 导入页面 | `mcp__lexiang__entry_import_content` | content, content_type, name, parent_id, space_id |
| 列出子节点 | `mcp__lexiang__entry_list_children` | entry_id |
| 获取条目详情 | `mcp__lexiang__entry_describe_entry` | entry_id |
| 申请文件上传 | `mcp__lexiang__file_apply_upload` | name, mime_type, size, parent_entry_id, upload_type |
| 确认文件上传 | `mcp__lexiang__file_commit_upload` | session_id |
| 搜索知识 | `mcp__lexiang__lexiang_search` | query, type |
> 所有 `mcp__lexiang__` 开头的工具都是 deferred tools,需要先用 ToolSearch 加载 schema,再用 DeferExecuteTool 调用。
---
## 注意事项
- **space_id 必填**:导入页面时如果不传 space_id 会报 `parent entry not belong to space` 错误
- **文件上传3步缺一不可**:apply_upload → HTTP PUT → commit_upload,少任何一步都无法完成
- **Content-Type 匹配**:HTTP PUT 时必须设置与 apply_upload 中 mime_type 一致的 Content-Type header
- **URL 特殊字符**:预签名 URL 含查询参数,不能直接写在命令行,用临时文件中转
- **个人知识库 vs 团队知识库**:个人知识库通过 whoami 获取,团队知识库通过 team_list_teams → space_list_spaces 获取
- **导入 vs 上传的选择**:md/html 文件优先用 import_content 导入为页面(可在线阅读搜索);txt/pdf/docx/zip 等用文件上传(作为附件存储)