diff --git a/skills/lark-drive/SKILL.md b/skills/lark-drive/SKILL.md index 6e62d1227..066dbfe8e 100644 --- a/skills/lark-drive/SKILL.md +++ b/skills/lark-drive/SKILL.md @@ -16,6 +16,7 @@ metadata: ## 快速决策 +- 用户要**整理云盘 / 文件夹 / 文档库 / 知识库 / 个人文档库**,或要“盘点目录结构、找出未归档/临时/重复/空目录、生成整理方案”,必须先阅读 [`references/lark-drive-workflow-knowledgeOrganize.md`](references/lark-drive-workflow-knowledgeOrganize.md)。默认只生成方案;创建目录、移动资源、重命名、申请权限都必须单独确认。 - 用户要**搜文档 / Wiki / 电子表格 / 多维表格 / 云空间对象**,优先使用 `lark-cli drive +search`。自然语言里"最近我编辑过的"、"我创建的"(→ `--mine`,实为 owner 语义)、"最近一周我打开过的 xxx"、"某人 owner 的 docx" 等直接映射到扁平 flag,避免手写嵌套 JSON。 - 用户要把本地 `.xlsx` / `.csv` / `.base` 导入成 Base / 多维表格 / bitable,第一步必须使用 `lark-cli drive +import --type bitable`。 - 用户要把本地 `.md` / `.docx` / `.doc` / `.txt` / `.html` 导入成在线文档,使用 `lark-cli drive +import --type docx`。 diff --git a/skills/lark-drive/references/lark-drive-workflow-knowledgeOrganize.md b/skills/lark-drive/references/lark-drive-workflow-knowledgeOrganize.md new file mode 100644 index 000000000..f416eec40 --- /dev/null +++ b/skills/lark-drive/references/lark-drive-workflow-knowledgeOrganize.md @@ -0,0 +1,624 @@ +# 知识整理工作流 + +**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md),其中包含认证、身份切换、权限处理和写操作确认规则。** + +需要处理 Wiki / 知识库节点时,还必须读取 [`../../lark-wiki/SKILL.md`](../../lark-wiki/SKILL.md)。需要读取云文档内容辅助分类时,还必须读取 [`../../lark-doc/SKILL.md`](../../lark-doc/SKILL.md) 和 [`../../lark-doc/references/lark-doc-fetch.md`](../../lark-doc/references/lark-doc-fetch.md)。 + +## 目标 + +本工作流用于对指定 Drive 文件夹、Wiki 知识库、个人文档库或搜索范围做知识整理。默认只产出可审阅的整理方案,不直接执行写操作。 + +目标产物包括: + +- 资源盘点清单和结构统计 +- 当前目录 / 节点结构的问题识别 +- 可解释的整理规则 +- 目标目录树 +- 移动 / 创建计划 +- 用户确认后的执行和验证结果 + +## 非目标 + +本工作流第一版不默认生成: + +- 研究报告 +- 对比分析 +- 风险 / 结论 / 行动项 +- 引用来源列表 +- 权限治理报告 + +本工作流也不默认执行以下高风险操作: + +- 删除文件、文件夹、Wiki 节点或知识空间 +- 转移 owner +- 批量申请权限 +- 批量修改公开权限或协作者权限 +- 批量重命名 + +如果用户明确要求这些能力,必须转入对应专项流程,并单独确认风险。 + +## 成功标准 + +一次成功的知识整理应满足: + +1. 入口范围明确,且正确分流到 Drive / Wiki / 搜索 / 单资源链路。 +2. 资源清单可去重、可追溯,Wiki 节点实例不被错误合并。 +3. 每个整理建议都有来源路径、原因、证据和置信度。 +4. 默认只输出方案;写操作必须在用户确认后执行。 +5. 执行后能逐条验证计划项是否达到预期位置。 + +## 适用场景 + +- "帮我整理我的云盘 / 文档库 / 知识库" +- "帮我盘点这个知识库,给出整理后的目录结构" +- "这个文件夹太乱了,先给我一个整理方案" +- "把知识库里的文档按项目 / 客户 / 时间 / 类型归类" +- "帮我找出未归档、临时、重复、空目录和命名混乱的内容" + +## 前置条件 + +优先使用 **user 身份**。知识库、用户云空间都强依赖当前用户可见范围;除非用户明确要求应用视角,否则命令显式带 `--as user`。 + +推荐先完成基础授权: + +```bash +lark-cli auth login --domain drive,wiki,docs +``` + +如果后续执行写操作,还需要根据 CLI 提示补齐具体写权限。写操作包括创建目录、移动文件 / 节点、重命名、权限申请。 + +权限问题分两类处理: + +1. 缺少 API scope:按 CLI hint 重新执行 `lark-cli auth login --scope ...` 或补齐对应 `--domain`。 +2. 当前用户没有目标资源访问权限:只能在用户明确确认后,使用 `drive +apply-permission` 发起单个资源的权限申请。该命令仅支持 `--as user`,会通知 owner,不允许批量自动调用。 + +```bash +lark-cli drive +apply-permission --token "" --type --perm view --as user +``` + +## 工作流 + +``` +{用户输入的整理目标:URL / 名称 / token / 范围描述} + │ + ▼ + 入口解析(识别资源类型并分流到 Drive / Wiki / 单资源链路) + │ + ▼ + 递归盘点资源 ──► 标准化 ResourceItem 清单 + │ + ▼ + 现状统计 ──► 轻量内容读取(仅低置信度资源) + │ + ▼ + 问题识别 ──► 整理规则生成 + │ + ▼ + 目标目录树 ──► 移动 / 创建计划 + │ + ▼ + 用户确认 + │ + ├─► 不执行:输出整理方案 + │ + └─► 执行:创建目录 / 移动资源 / 重新扫描验证 +``` + +## 能力分层 + +本工作流提到的 skill / shortcut 不是全部在每次执行中都必须调用。按入口和阶段分层: + +| 层级 | 能力 | 什么时候使用 | +|------|------|--------------| +| 通用前置 | `lark-shared` | 每次执行都必须读取,用于身份、权限和写操作确认 | +| 入口解析 | `drive +inspect` | 用户给 URL,需要判断资源类型、提取 token,或自动解包 Wiki 到底层对象时使用 | +| 入口解析 | `drive +search` | 用户没有给明确文件夹 / Wiki 入口,只给关键词、名称、时间范围、"我的文档"等范围描述时使用 | +| 入口解析 | `wiki +space-list` | 用户只给知识空间名称,需要先找到 `space_id` 时使用;不用于发现 `my_library` | +| Drive 链路核心 | `lark-drive` + `drive files.list` | 目标是 Drive 文件夹时,用于递归盘点文件夹树 | +| Wiki 链路核心 | `lark-wiki` + `wiki +node-list` | 目标是 Wiki / 知识库 / 个人文档库时,用于递归盘点节点树 | +| Wiki 链路补充 | `wiki +node-get` | 需要确认 `space_id`、`parent_node_token`、`node_type`、`origin_node_token`、`owner` 等节点身份时使用 | +| 内容下钻条件必需 | `docs +fetch --api-version v2` | 标题、路径、类型不足以判断分类,且资源是可读取云文档时使用 | +| 内容下钻条件必需 | `lark-sheets` / `lark-base` | sheet / bitable 只靠标题和路径无法分类,需要读取对象内部结构时使用 | +| 执行条件必需 | `drive +create-folder` / `drive +move` | 用户确认执行,且目标是 Drive 文件夹树时使用 | +| 执行条件必需 | `wiki +node-create` / `wiki +move` | 用户确认执行,且目标是 Wiki / 知识库节点树时使用 | +| 执行条件必需 | `drive +task_result` | `drive +move` 或 `wiki +move` 返回异步任务、`ready=false`、`next_command` 时用于续跑查询 | +| 权限补救条件必需 | `drive +apply-permission` | 当前用户没有资源访问权限,且用户明确确认发起单个资源权限申请时使用 | +| 可选增强 | `drive metas batch_query` | 需要批量补充 URL、owner、创建时间、编辑时间等元数据时使用 | +| 可选增强 | `drive files.patch` | 用户明确同意重命名时使用;第一版不默认重命名 | + +## Step 1: 入口解析 + +先判断用户给出的目标属于哪一类,再进入对应链路。 + +| 输入形态 | 处理方式 | +|----------|----------| +| `/wiki/` URL | 先用 `drive +inspect` 或 `wiki +node-get` 解析真实类型、`space_id`、`node_token`、`obj_token` | +| 知识空间名称 / `space_id` | 用 `wiki +space-list` 或已知 `space_id` 进入 Wiki 盘点;`wiki +space-list` 不返回个人文档库 | +| `我的文档库` / `个人知识库` / `my_library` | 个人文档库属于 Wiki / 知识库语义;读取时可用 `wiki +node-list --space-id my_library --as user`,写入或移动到根目录前先解析真实 `space_id` | +| `/drive/folder/` URL | 提取 `folder_token`,进入 Drive 文件夹盘点 | +| 单个云空间资源 URL | 用 `drive +inspect` 判断类型;支持 `docx` / `doc` / `sheet` / `bitable` / `slides` / `file` / `folder` / `wiki` 等类型。若只是单资源,不进入大范围整理 | +| 真实关键词 / 名称 | 用 `drive +search --query "<关键词>"` 搜索资源 | +| 范围浏览 / 统计描述 | 没有真实关键词时,用 `drive +search --query ""` 搭配时间、owner、类型、空间或文件夹过滤条件 | + +常用命令: + +```bash +# 检视文档或 Wiki URL,Wiki 会自动解包到底层对象 +lark-cli drive +inspect --url "" --as user --format json + +# 获取 Wiki 节点详情 +lark-cli wiki +node-get --token "" --as user --format json + +# 列出当前用户可访问的知识空间 +lark-cli wiki +space-list --as user --page-all --format json + +# 解析个人文档库真实 space_id;写入或移动到 my_library 根目录前必须做 +lark-cli wiki spaces get --params '{"space_id":"my_library"}' --as user --format json + +# 真实关键词 / 名称搜索必须进入 --query +lark-cli drive +search --query "季度总结" --doc-types doc,docx,sheet,bitable,mindnote,file,wiki,folder,slides,shortcut --as user --format json + +# 范围浏览没有真实关键词时保持 --query "" +lark-cli drive +search --query "" --doc-types doc,docx,sheet,bitable,mindnote,file,wiki,folder,slides,shortcut --as user --format json + +# 只有当用户明确说"我的 / 我负责的 / 我 owner 的"时才加 --mine +lark-cli drive +search --query "" --mine --doc-types doc,docx,sheet,bitable,mindnote,file,wiki,folder,slides,shortcut --as user --format json +``` + +## Step 2: 资源递归盘点 + +### 默认规模控制 + +默认先做可控范围内的盘点,避免一次性拉取过大知识库或云盘范围。 + +| 场景 | 默认限制 | 超出后的处理 | +|------|----------|--------------| +| Wiki 节点递归 | `max_depth=3`,`max_items=500`,`wiki +node-list --page-all --page-limit 10` | 输出 `partial=true`,列出已覆盖路径和建议继续盘点的一级目录 | +| Drive 文件夹递归 | `max_depth=3`,`max_items=500`,单文件夹最多 10 页,每页 `page_size=50` | 输出 `partial=true`,列出未继续下钻的文件夹 token | +| Search 结果发现 | 单轮最多 5 页,每页 `page_size=20` | 输出 `partial=true`,保留 `page_token` 和下一页命令 | +| 内容读取 | 只读取低置信度资源;先 `outline`,再 `keyword`,最后 `section` | 超出阈值时只标记 `needs_review=true`,不继续读全文 | + +如果用户明确要求全量处理,应按一级目录、知识空间或时间窗口分批执行,不要一次性取消全部限制。 + +### Wiki / 知识库 + +从空间根节点或指定父节点开始递归调用 `wiki +node-list`。 + +```bash +# 列出知识空间根节点 +lark-cli wiki +node-list --space-id --as user --page-all --page-limit 10 --format json + +# 列出某个父节点下的子节点 +lark-cli wiki +node-list --space-id --parent-node-token --as user --page-all --page-limit 10 --format json + +# 个人文档库 +lark-cli wiki +node-list --space-id my_library --as user --page-all --page-limit 10 --format json +``` + +递归规则: + +1. 对返回的每个 `node` 记录当前路径。 +2. 当 `has_child=true` 时,以该节点的 `node_token` 作为 `--parent-node-token` 继续下钻。 +3. 默认先限制递归规模;大型知识库应先按一级目录分批盘点。 +4. 遇到 `has_more=true` 时必须继续翻页,直到页数上限或 `has_more=false`。 +5. 达到 `max_depth`、`max_items` 或 `page-limit` 时停止继续下钻,并在输出里标记 `partial=true`。 + +### Drive 文件夹 + +Drive 文件夹树使用 Meta API `drive files.list`。使用前先查看 schema,不要猜字段。 + +```bash +lark-cli schema drive.files.list + +lark-cli drive files list \ + --params '{"folder_token":"","page_size":50}' \ + --as user \ + --format json +``` + +递归规则: + +1. 当前项是 `folder` 时,继续以该项 token 调用 `drive files.list`。 +2. 普通文件 / docx / sheet / bitable / slides 只入清单,不递归。 +3. 需要 URL、owner、编辑时间等元数据时,用 `drive metas batch_query` 批量补充。 +4. `drive files.list` 返回的翻页字段是 `has_more` 和 `next_page_token`;继续翻页时把 `next_page_token` 填回请求参数 `page_token`。 +5. 根目录查询不填 `folder_token` 或填空字符串时,服务端可能返回根目录全部数据且不支持分页;文件夹递归时优先使用明确的 `folder_token`。 +6. 达到 `max_depth`、`max_items` 或单文件夹页数上限时停止继续下钻,并在输出里标记 `partial=true`。 + +```bash +lark-cli drive metas batch_query \ + --data '{"request_docs":[{"doc_type":"docx","doc_token":""}],"with_url":true}' \ + --as user \ + --format json +``` + +## Step 3: 标准化 ResourceItem 清单 + +将 Wiki、Drive、搜索结果统一整理成同一种结构,后续统计和归类都只基于这个结构处理。 + +```json +{ + "source": "wiki|drive|search", + "title": "资源标题", + "type": "doc|docx|sheet|bitable|mindnote|file|wiki|folder|slides|shortcut|catalog", + "path": "当前路径/资源标题", + "depth": 2, + "url": "https://...", + "token": "canonical_token", + "node_token": "wiki_node_token_or_empty", + "obj_token": "wiki_obj_token_or_drive_file_token", + "node_type": "origin|shortcut|empty", + "origin_node_token": "wiki_origin_node_token_or_empty", + "space_id": "wiki_space_id_or_empty", + "parent_token": "parent_node_or_folder_token", + "has_child": false, + "dedupe_key": "wiki::|drive::|search::", + "created_at": "optional", + "updated_at": "optional" +} +``` + +处理规则: + +1. `path` 必须由递归过程生成,不要只使用标题。 +2. Wiki URL 中的 token 不一定是底层文档 token,必须保留 `node_token` 和 `obj_token`。 +3. `type` 以 API 返回的 `obj_type` / `doc_type` 为准,不要凭标题猜。 +4. Wiki 盘点时,一个 Wiki 节点实例就是一个 ResourceItem,优先使用 `wiki::` 作为 `dedupe_key`。 +5. 不要只按 `obj_token` 合并 Wiki 节点;同一个底层文档可能出现在不同 Wiki 节点或快捷方式路径下,知识整理必须保留这些路径实例。 +6. `node_type=shortcut` 或去重不确定时,用 `wiki +node-get` 补充 `origin_node_token`;如果当前接口没有返回该字段,则保留为空并标记 `needs_review=true`。 +7. Drive 文件夹树按 `drive::` 去重。 +8. 搜索结果只能和已有递归结果做精确合并:Wiki 结果必须命中同一 `node_token`,Drive 结果必须命中同一 `type + token`;不能用相同标题或相同 `obj_token` 强行合并。 + +## Step 4: 现状统计 + +基于 ResourceItem 输出当前范围的结构化统计。 + +至少包含: + +```text +总资源数 +各类型资源数 +一级目录数量 +根目录直接资源数 +空目录数量 +疑似临时 / 测试 / 未整理资源数 +低置信度待确认资源数 +``` + +推荐统计维度: + +| 指标 | 计算方式 | +|------|----------| +| 总资源数 | 按 `dedupe_key` 去重后的 ResourceItem 数量 | +| 类型分布 | 按 `type` 分组 | +| 一级目录分布 | `depth=1` 的目录 / 节点及其后代数量 | +| 根目录堆积 | `depth=1` 且非目录类资源数量 | +| 空目录 | 目录类资源没有子资源 | +| 临时内容 | 标题或路径包含 `临时` / `测试` / `tmp` / `draft` / `转移` / `未整理` | + +## Step 5: 轻量内容读取 + +默认不要读取所有文档正文。只有标题、路径、类型无法判断分类时,才对低置信度资源做局部读取。 + +优先顺序: + +```bash +# 先读目录 +lark-cli docs +fetch --api-version v2 --doc "" --scope outline --max-depth 3 --as user --format json + +# 只有明确关键词时才读关键词命中片段 +lark-cli docs +fetch --api-version v2 --doc "" --scope keyword --keyword "项目|客户|会议|周报|方案" --as user --format json + +# 已知标题 block id 后再读某一节 +lark-cli docs +fetch --api-version v2 --doc "" --scope section --start-block-id --as user --format json +``` + +读取规则: + +1. 只读取 `docx` / 可由 `docs +fetch --api-version v2` 支持的文档。 +2. 读取结果只用于分类,不生成研究报告。 +3. 对 sheet / bitable 只在标题和路径不足时下钻;一旦需要下钻,`lark-sheets` / `lark-base` 属于条件必需能力: + - sheet:转 [`../../lark-sheets/SKILL.md`](../../lark-sheets/SKILL.md) + - bitable:转 [`../../lark-base/SKILL.md`](../../lark-base/SKILL.md) +4. 若读取失败或权限不足,将该资源标记为 `needs_review=true`,不要编造分类依据。 + +## Step 6: 问题识别 + +从整理角度识别问题,不做业务研究判断。 + +常见问题规则: + +| 问题 | 识别规则 | +|------|----------| +| 根目录堆积 | 根目录直接资源过多,或超过总资源的明显比例 | +| 同类文件分散 | 标题/类型相似的资源分布在多个无关路径 | +| 命名不统一 | 同类资源日期、客户、项目命名格式明显不一致 | +| 临时内容过多 | 标题/路径含 `临时`、`测试`、`draft`、`转移`、`未整理` | +| 空目录 | 目录类节点无后代资源 | +| 重复目录 | 目录名归一化后相同或高度相似 | +| 过旧归档内容 | 旧年份资源仍散落在活跃目录 | + +输出问题时必须给出证据数量或示例路径,不要只给抽象判断。 + +## Step 7: 整理规则生成 + +根据资源清单生成可解释的分类规则。优先复用已有清晰目录,不要强行套固定模板覆盖用户已有结构。 + +默认分类维度: + +```text +00-归档区:旧年份、已完成、低频访问内容 +01-客户项目:客户、项目、外部合作资料 +02-内部运营:团队管理、周报、1on1、业务管理 +03-会议记录:智能纪要、文字记录、会议纪要 +04-知识资产:方案、模板、案例、使用手册、Skill/Agent 文档 +05-数据看板:多维表格、仪表盘、统计报表 +06-转移待整理:他人转移、归属不明、需要二次确认的内容 +99-临时/测试:测试、临时、草稿、短期内容 +``` + +分类原则: + +1. 能从标题 / 路径 / 类型判断的,不读取正文。 +2. 只有低置信度资源才轻量读取内容。 +3. 不确定资源进入 `06-转移待整理` 或 `99-临时/测试`,并标记 `needs_review=true`。 +4. 现有目录已经清晰时,保留现有目录名和层级。 +5. 不建议一次性移动全部资源;优先先整理根目录堆积和明显临时内容。 + +## Step 8: 目标目录树生成 + +输出一棵可执行的目标目录树,至少展示到二级目录;必要时展示三级目录。 + +示例格式: + +```text +目标目录结构 +├── 00-归档区 +│ ├── 2024年文件归档 +│ └── 2025年文件归档 +├── 01-客户项目 +│ ├── 客户A +│ │ ├── 01-会议纪要 +│ │ ├── 02-方案文档 +│ │ └── 03-数据报表 +│ └── 其他客户 +├── 02-内部运营 +│ ├── 01-团队管理 +│ ├── 02-周报 +│ └── 03-业务管理 +├── 03-会议记录 +├── 04-知识资产 +├── 05-数据看板 +├── 06-转移待整理 +└── 99-临时/测试 +``` + +目录树必须和移动计划一致:如果某个目标路径出现在移动计划里,它也必须出现在目录树中。 + +## Step 9: 移动 / 创建计划生成 + +默认只生成计划,不执行写操作。 + +移动计划字段: + +| 字段 | 说明 | +|------|------| +| `source_path` | 当前路径 | +| `title` | 资源标题 | +| `type` | 资源类型 | +| `source_token` | Drive token 或普通资源 token | +| `source_node_token` | Wiki 节点 token;非 Wiki 资源为空 | +| `target_path` | 目标路径 | +| `target_parent_path` | 目标父目录 / 父节点路径 | +| `target_parent_token` | 执行前或创建后解析出的目标父 token;生成计划时可为空,执行前必须补齐 | +| `action` | `keep` / `create_folder` / `create_node` / `move` / `rename` / `review` | +| `reason` | 归类原因 | +| `evidence_paths` | 支撑判断的样例路径 | +| `evidence_count` | 支撑判断的资源数量或命中次数 | +| `confidence` | `high` / `medium` / `low` | +| `needs_review` | 是否需要人工确认 | +| `needs_review_reason` | 需要人工确认的原因 | + +示例: + +```text +| 当前位置 | 标题 | 类型 | 目标位置 | 动作 | 原因 | 证据 | 置信度 | 待确认原因 | +|----------|------|------|----------|------|------|------|--------|------------| +| /智能纪要-客户A周会 | 客户A周会纪要 | docx | /01-客户项目/客户A/01-会议纪要 | move | 标题包含客户A和周会 | /智能纪要-客户A周会 | high | | +| /测试表格 | 测试表格 | sheet | /99-临时/测试 | move | 标题命中测试关键词 | /测试表格 | medium | | +| /未知资料 | 未知资料 | docx | /06-转移待整理 | review | 标题和目录不足以判断 | /未知资料 | low | 标题、路径和类型不足以判断归类 | +``` + +## Step 10: 用户确认和可选执行 + +写操作前必须先向用户展示: + +```text +将创建哪些目录 / 节点 +将移动哪些资源 +将重命名哪些资源 +哪些资源仍需人工确认 +预计影响范围 +``` + +用户明确确认后,才执行写操作。 + +### 写操作白名单 + +本工作流只允许在用户确认后执行以下写操作: + +- 创建 Drive 文件夹:`drive +create-folder` +- 移动 Drive 文件 / 文件夹:`drive +move` +- 创建 Wiki 节点:`wiki +node-create` +- 移动 Wiki 节点或将 Drive 文档迁入 Wiki:`wiki +move` +- 续跑异步移动任务:`drive +task_result` +- 单个资源权限申请:`drive +apply-permission` +- 明确确认后的单个或少量重命名:`drive files.patch` + +默认禁止删除、owner 转移、批量权限申请、批量公开权限修改和批量重命名。 + +### 目标路径到 token 映射 + +执行前必须先把 `target_path` 转换成真实 token,不要直接拿路径字符串执行移动。 + +1. 先构建 `PathTokenMap`: + - Drive:`path -> folder_token` + - Wiki:`path -> node_token`,并保留 `space_id` +2. 先扫描已有目标目录 / 节点,把已存在路径写入 `PathTokenMap`。 +3. 对计划中的 `create_folder` / `create_node` 按路径深度从浅到深执行,父路径必须已经有 token。 +4. 每创建成功一个目录 / 节点,立即从命令返回值保存 `folder_token` 或 `node_token`。 +5. 只有当 `target_parent_path` 能在 `PathTokenMap` 中解析到 token 时,才执行 `move`。 +6. 如果同一父路径下出现同名目标,先读取现有子节点 / 子文件夹确认是否复用;无法确认时标记 `needs_review=true`,不要创建重复目录。 +7. 对 `my_library` 根目录执行写操作前,先用 `wiki spaces get --params '{"space_id":"my_library"}'` 解析真实 `space_id`。 + +### Drive 文件夹执行 + +```bash +# 创建文件夹 +lark-cli drive +create-folder --name "" --folder-token --as user + +# 移动文件或文件夹 +lark-cli drive +move --file-token --type --folder-token --as user + +# 如果移动文件夹返回 ready=false / timed_out=true,继续执行返回值里的 next_command +lark-cli drive +task_result --scenario task_check --task-id --as user +``` + +### Wiki 知识库执行 + +```bash +# 创建知识库节点 +lark-cli wiki +node-create --space-id --parent-node-token --title "" --as user + +# 移动已有 Wiki 节点 +lark-cli wiki +move --node-token --target-parent-token --as user + +# 移动到个人文档库根目录前,先解析真实 space_id +lark-cli wiki spaces get --params '{"space_id":"my_library"}' --as user --format json +lark-cli wiki +move --node-token --target-space-id --as user + +# 如果把 Drive 文档迁入 Wiki 时返回 ready=false / timed_out=true,继续执行返回值里的 next_command +lark-cli drive +task_result --scenario wiki_move --task-id --as user +``` + +### 重命名 + +重命名使用原生 API 前必须先查看 schema,不要猜参数。 + +```bash +lark-cli schema drive.files.patch +``` + +仅当用户明确同意重命名时再执行。 + +## Step 11: 结果验证 + +执行后必须重新扫描目标范围,验证结果。 + +验证内容: + +```text +目录 / 节点是否创建成功 +资源是否移动到目标位置 +是否存在失败项 +是否还有未归类资源 +最终目录树是否符合计划 +每个 plan item 的实际 path/token 是否符合预期 +``` + +验证命令与 Step 2 相同: + +```bash +lark-cli wiki +node-list --space-id --as user --page-all --format json +lark-cli drive files list --params '{"folder_token":"","page_size":50}' --as user --format json +``` + +验证结果必须按计划逐条比对: + +| plan_id | 动作 | 标题 | 预期目标 | 实际目标 | 预期 token | 实际 token | 状态 | 失败原因 | +|---------|------|------|----------|----------|------------|------------|------|----------| +| P001 | move | 客户A周会纪要 | /01-客户项目/客户A/01-会议纪要 | /01-客户项目/客户A/01-会议纪要 | fld_xxx / wik_xxx | fld_xxx / wik_xxx | success | | + +## 输出格式 + +最终回答按以下结构输出: + +```text +## 知识整理方案 + +### 1. 入口和范围 +- 目标: +- 范围: +- 身份: + +### 2. 现状分析 +| 指标 | 数量 | +|------|------| + +### 3. 发现的问题 +| 问题 | 证据数量 | 样例路径 | 说明 | +|------|----------|----------|------| + +### 4. 整理规则 +1. ... + +### 5. 目标目录结构 +<目录树> + +### 6. 移动 / 创建计划 +| plan_id | 当前位置 | 标题 | 类型 | 目标位置 | 动作 | 原因 | 证据路径 | 证据数量 | 置信度 | 待确认原因 | +|---------|----------|------|------|----------|------|------|----------|----------|--------|------------| + +### 7. 需要确认的事项 +- ... + +### 8. 执行 / 验证结果 +仅在用户确认执行后输出。 + +| plan_id | 动作 | 预期目标 | 实际目标 | 状态 | 失败原因 | +|---------|------|----------|----------|------|----------| +``` + +## 数据处理规则 + +1. **路径优先**:分类时优先使用现有路径和标题,减少不必要的正文读取。 +2. **局部读取优先**:需要读文档时先 `outline`,再 `keyword`,最后才 `section`。 +3. **不确定就标记**:低置信度资源不要强行分类,标记 `needs_review=true`。 +4. **保守执行**:默认只生成计划;写操作必须等待用户确认。 +5. **保持可回溯**:每个移动建议都必须有 `reason` 和来源路径。 +6. **大型范围分批**:资源数很大时先按一级目录分批,不要一次性深度读取所有文档。 +7. **Wiki token 不混用**:Wiki URL 的 `node_token` 和底层 `obj_token` 分开保存,移动 Wiki 节点用 `node_token`。 +8. **Wiki 实例优先**:Wiki 整理以节点实例为单位,优先按 `space_id + node_token` 去重,不按 `obj_token` 合并不同路径。 +9. **超限必须标记**:达到分页、深度或资源数阈值时输出 `partial=true`,并说明未覆盖范围。 + +## 权限表 + +| 命令 / 方法 | 所需 scope | +|-------------|------------| +| `drive +inspect` | `drive:drive.metadata:readonly`;Wiki URL 还需要 `wiki:node:retrieve` | +| `drive +search` | `search:docs:read` | +| `drive files.list` | `space:document:retrieve` | +| `drive metas batch_query` | `drive:drive.metadata:readonly` | +| `docs +fetch --api-version v2` | `docx:document:readonly` | +| `wiki +space-list` | `wiki:space:retrieve` | +| `wiki +node-get` | `wiki:node:retrieve` | +| `wiki +node-list` | `wiki:node:retrieve` | +| `drive +create-folder` | `space:folder:create` | +| `drive +move` | `space:document:move` | +| `drive +task_result` | `task_check` 场景需要 `drive:drive.metadata:readonly`;`wiki_move` 场景需要 `wiki:space:read` | +| `drive +apply-permission` | `docs:permission.member:apply` | +| `wiki +node-create` | `wiki:node:create`、`wiki:node:read`、`wiki:space:read` | +| `wiki +move` | `wiki:node:move`、`wiki:node:read`、`wiki:space:read` | + +## 参考 + +- [lark-shared](../../lark-shared/SKILL.md) — 认证、身份、权限、写操作确认 +- [lark-drive](../SKILL.md) — 云空间搜索、元数据、文件夹、移动、权限 +- [lark-drive-search](lark-drive-search.md) — 关键词搜索、范围浏览和分页策略 +- [lark-drive-apply-permission](lark-drive-apply-permission.md) — 单个资源权限申请 +- [lark-drive-task-result](lark-drive-task-result.md) — 异步移动任务续跑查询 +- [lark-wiki](../../lark-wiki/SKILL.md) — 知识空间、节点列表、节点创建和移动 +- [lark-doc](../../lark-doc/SKILL.md) — 云文档局部读取 +- [lark-doc-fetch](../../lark-doc/references/lark-doc-fetch.md) — `outline` / `keyword` / `section` 局部读取策略 +- [lark-sheets](../../lark-sheets/SKILL.md) — 表格下钻读取 +- [lark-base](../../lark-base/SKILL.md) — 多维表格下钻读取