feat:移除了弹窗,服务器添加sls

This commit is contained in:
2026-09-08 22:39:45 +08:00
commit 6a295f9a7a
4082 changed files with 1322534 additions and 0 deletions

View File

@ -0,0 +1,114 @@
# markdown +create
> **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
在 Drive 中创建一个原生 Markdown 文件(`.md`),支持创建到普通 Drive 文件夹或 Wiki 节点下。
## 命令
```bash
# 直接用行内内容创建
lark-cli markdown +create \
--name README.md \
--content '# Hello'
# 从本地 .md 文件创建
lark-cli markdown +create \
--file ./README.md
# 从本地文件读取内容,但仍走 --content
lark-cli markdown +create \
--name README.md \
--content @./README.md
# 从 stdin 读取内容
printf '# Hello\n\nfrom stdin\n' | \
lark-cli markdown +create \
--name README.md \
--content -
# 创建到指定文件夹
lark-cli markdown +create \
--folder-token fldcn_xxx \
--file ./README.md
# 创建到指定文件夹(可直接传 Drive folder URL
lark-cli markdown +create \
--folder-token "https://feishu.cn/drive/folder/fldcn_xxx" \
--file ./README.md
# 创建到指定 wiki 节点
lark-cli markdown +create \
--wiki-token wikcn_xxx \
--file ./README.md
# 创建到指定 wiki 节点(可直接传 wiki URL
lark-cli markdown +create \
--wiki-token "https://feishu.cn/wiki/wikcn_xxx" \
--file ./README.md
# 预览底层请求
lark-cli markdown +create \
--name README.md \
--content '# Hello' \
--dry-run
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--folder-token` | 否 | 目标 Drive 文件夹 token 或 Drive folder URL`--wiki-token` 互斥;省略时创建到根目录 |
| `--wiki-token` | 否 | 目标 wiki 节点 token 或 wiki URL`--folder-token` 互斥;传入后自动映射为 `parent_type=wiki` |
| `--name` | 条件必填 | 文件名,**必须显式带 `.md` 后缀**;使用 `--content` 时必填;使用 `--file` 时可省略,默认取本地文件名 |
| `--content` | 条件必填 | Markdown 内容;与 `--file` 互斥;支持直接传字符串、`@file``-`stdin |
| `--file` | 条件必填 | 本地 `.md` 文件路径;与 `--content` 互斥 |
## 关键约束
- `--content``--file` 必须二选一
- `--folder-token``--wiki-token` 互斥
- `--folder-token` 只能是 Drive 文件夹;不要传 wiki/doc/sheet/base/file token 或 URL
- `--wiki-token` 只能是 Wiki 节点;如果只有 docx/sheet/base 等文档 URL先用 `lark-cli wiki +node-get --node-token <url>` 解析出 `node_token`
- `--name` 必须带 `.md` 后缀
- `--file` 指向的本地文件名也必须带 `.md` 后缀
-`--wiki-token` 时,返回值中不会附带 `/file/<token>` URL因为 wiki 承载文件没有稳定的独立 file URL
## 返回值
```json
{
"ok": true,
"identity": "user",
"data": {
"file_token": "boxcnxxxx",
"file_name": "README.md",
"size_bytes": 1234
}
}
```
> [!IMPORTANT]
> 如果 Markdown 文件是**以应用身份bot创建**的,如 `lark-cli markdown +create --as bot`在创建成功后CLI 会**尝试为当前 CLI 用户自动授予该文件的 `full_access`(可管理权限)**。
>
> 以应用身份创建时,结果里会额外返回 `permission_grant` 字段,明确说明授权结果:
> - `status = granted`:当前 CLI 用户已获得该文件的可管理权限
> - `status = skipped`:本地没有可用的当前用户 `open_id`,因此不会自动授权;可提示用户先完成 `lark-cli auth login`,再让 AI / agent 继续使用应用身份bot授予当前用户权限
> - `status = failed`Markdown 文件已创建成功,但自动授权用户失败;会带上失败原因,并提示稍后重试或继续使用 bot 身份处理该文件
>
> `permission_grant.perm = full_access` 表示该资源已授予“可管理权限”。
>
> **不要擅自执行 owner 转移。** 如果用户需要把 owner 转给自己,必须单独确认。
## 失败处理
- `not_found` / `1061044`:父目录或 wiki 节点不存在,或 token 类型放错参数。修正 `--folder-token` / `--wiki-token` 后再试,不要重复提交同一参数。
- `quota_exceeded` / `1061101`:目标存储空间配额已满。释放空间、换父目录/节点或请管理员扩容后再试。
- `permission_denied` / `missing_scope`:区分身份处理。`--as user` 看用户授权和目标 ACL`--as bot` 看应用 scope 与目标目录/节点 ACL。
- `rate_limit`:停止立即重试,使用退避。
- `server_error` / `233523001`:可以稍后有限重试;若重复出现,保留 `log_id` / request id 给服务端排查。
## 参考
- [lark-markdown](../SKILL.md) — Markdown 域总览
- [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数

View File

@ -0,0 +1,156 @@
# markdown +diff
> **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
比较 Drive 中原生 Markdown 的两个历史版本,或比较远端 Markdown 与本地 `.md` 草稿。需要历史版本号时,先用 [`drive +version-history`](../../lark-drive/references/lark-drive-version-history.md) 获取 `version`,不要使用 `tag`
## 命令
```bash
# 比较两个远端版本
lark-cli markdown +diff \
--file-token boxcnxxxx \
--from-version 7633658129540910621 \
--to-version 7633658129540910628
# 比较历史版本与远端最新版本
lark-cli markdown +diff \
--file-token boxcnxxxx \
--from-version 7633658129540910621
# 比较远端最新版本与本地草稿
lark-cli markdown +diff \
--file-token boxcnxxxx \
--file ./draft.md \
--format pretty
# 比较指定远端版本与本地草稿
lark-cli markdown +diff \
--file-token boxcnxxxx \
--from-version 7633658129540910621 \
--file ./draft.md
# 预览底层请求
lark-cli markdown +diff \
--file-token boxcnxxxx \
--from-version 7633658129540910621 \
--to-version 7633658129540910628 \
--dry-run
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--file-token` | 是 | 目标 Markdown 文件 token |
| `--from-version` | 否 | 基准远端版本;不传 `--file` 时必填,传 `--file` 时省略表示“远端最新 vs 本地文件” |
| `--to-version` | 否 | 目标远端版本;要求同时传 `--from-version`,且不能与 `--file` 一起使用。省略时表示远端最新版本 |
| `--file` | 否 | 本地 `.md` 文件路径;传入后进入“远端 vs 本地”比较模式 |
| `--context-lines` | 否 | unified diff 每个 hunk 前后保留的上下文行数,默认 `3` |
| `--format` | 否 | 仅支持 `json`(默认)和 `pretty` |
## 关键行为
- `--file` 存在时:
- 省略 `--from-version` = 比较“远端最新版本 vs 本地文件”
- 传入 `--from-version` = 比较“指定远端版本 vs 本地文件”
- `--to-version` 只能用于“远端版本 vs 远端版本”,不能与 `--file` 同时出现
- `--format pretty` 输出带颜色的 unified diff`--format json` 返回结构化摘要和完整 diff 文本
- 无差异时:
- `json` 输出里 `changed=false`
- `pretty` 输出固定为 `No differences.`
## 返回值
```json
{
"ok": true,
"identity": "user",
"data": {
"changed": true,
"mode": "remote_vs_remote",
"file_token": "boxcnxxxx",
"from_version": "7633658129540910621",
"to_version": "7633658129540910628",
"from_label": "a/boxcnxxxx@version:7633658129540910621",
"to_label": "b/boxcnxxxx@version:7633658129540910628",
"added_lines": 3,
"deleted_lines": 2,
"context_lines": 3,
"hunks": [
{
"header": "@@ -1,6 +1,7 @@",
"old_start": 1,
"old_lines": 6,
"new_start": 1,
"new_lines": 7
}
],
"diff": "--- a/boxcnxxxx@version:7633658129540910621\n+++ b/boxcnxxxx@version:7633658129540910628\n@@ -1,2 +1,2 @@\n..."
}
}
```
完整字段说明:
| 字段 | 层级 | 含义 |
|------|------|------|
| `ok` | 顶层 | CLI 通用成功标记;`true` 表示命令执行成功 |
| `identity` | 顶层 | 本次执行使用的身份,通常是 `user``bot` |
| `data` | 顶层 | 本次 diff 的业务结果对象 |
| `changed` | `data` | 是否存在差异;`true` 表示两侧内容不同,`false` 表示完全一致 |
| `mode` | `data` | 比较模式;`remote_vs_remote` = 远端对远端,`remote_vs_local` = 远端对本地 |
| `file_token` | `data` | 被比较的远端 Markdown 文件 token |
| `from_version` | `data` | 基准远端版本号;远端最新 vs 本地时可能为空字符串 |
| `to_version` | `data` | 目标远端版本号;当目标侧是远端最新版本或本地文件时通常为空字符串 |
| `from_label` | `data` | unified diff 基准侧标签名,会直接出现在 `diff` 文本的 `---` 头部 |
| `to_label` | `data` | unified diff 目标侧标签名,会直接出现在 `diff` 文本的 `+++` 头部 |
| `added_lines` | `data` | 新增行数统计 |
| `deleted_lines` | `data` | 删除行数统计 |
| `context_lines` | `data` | 每个 hunk 前后保留的上下文行数,对应传入的 `--context-lines` |
| `hunks` | `data` | 结构化的变更块摘要数组;每个元素对应 patch 里的一个 `@@ ... @@` 段 |
| `diff` | `data` | 完整 unified diff 文本;最适合直接阅读或保存 |
| `local_file` | `data` | 仅在 `remote_vs_local` 模式下出现;值就是传给 `--file` 的本地 Markdown 路径 |
标签字段补充:
- `from_label` / `to_label` 只用于标识 diff 两侧,不代表额外 API 字段
- `from_label` 表示基准侧,`to_label` 表示目标侧
- 远端版本通常形如 `a/<file_token>@version:<version>``b/<file_token>@version:<version>`
- 当目标侧是远端最新版本时,`to_label` 形如 `b/<file_token>@latest`
- 当目标侧是本地文件时,`to_label` 形如 `b/./draft.md`
`hunks` 子字段说明:
| 字段 | 含义 |
|------|------|
| `header` | 原始 hunk 头,例如 `@@ -3,1 +3,1 @@` |
| `old_start` | 旧内容从第几行开始 |
| `old_lines` | 旧内容这段覆盖多少行 |
| `new_start` | 新内容从第几行开始 |
| `new_lines` | 新内容这段覆盖多少行 |
补充说明:
- `hunks` 适合 agent 或脚本快速定位变更范围;完整逐行内容仍以 `diff` 字段为准
- `changed=false` 时,`hunks` 通常为空数组,`diff` 通常为空字符串;如果使用 `--format pretty`,终端输出会是 `No differences.`
远端 vs 本地时会额外返回:
```json
{
"local_file": "./draft.md"
}
```
- `local_file`
- 只有传了 `--file`、进入“远端 vs 本地”模式时才会返回
- 值就是本次命令实际比较的本地 Markdown 路径,也就是你传给 `--file` 的那个路径
- 它表示“目标侧本地文件”,不是临时下载文件,也不是远端文件名
- 如果没有这个字段,说明本次是“远端版本 vs 远端版本”
## 参考
- [lark-markdown](../SKILL.md) — Markdown 域总览
- [lark-drive-version-history](../../lark-drive/references/lark-drive-version-history.md) — 获取可用于 diff 的历史版本号
- [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数

View File

@ -0,0 +1,79 @@
# markdown +fetch
> **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
读取 Drive 中原生 Markdown 文件的内容;也支持把内容保存到本地。
## 命令
```bash
# 直接返回 Markdown 文本
lark-cli markdown +fetch --file-token boxcnxxxx
# 保存到本地
lark-cli markdown +fetch \
--file-token boxcnxxxx \
--output ./README.md
# 传目录时,使用远端文件名保存到该目录下
lark-cli markdown +fetch \
--file-token boxcnxxxx \
--output ./downloads/
# 覆盖已存在文件
lark-cli markdown +fetch \
--file-token boxcnxxxx \
--output ./README.md \
--overwrite
# 预览底层请求
lark-cli markdown +fetch \
--file-token boxcnxxxx \
--output ./README.md \
--dry-run
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--file-token` | 是 | 目标 Markdown 文件 token |
| `--output` | 否 | 本地保存路径;既可传具体文件名,也可传目录路径。传目录时使用远端文件名保存;省略时直接返回 Markdown 内容 |
| `--overwrite` | 否 | 覆盖已存在的本地输出文件;仅在传入 `--output` 时生效 |
## 返回值
不传 `--output`
```json
{
"ok": true,
"identity": "user",
"data": {
"file_token": "boxcnxxxx",
"file_name": "README.md",
"content": "# Hello\n",
"size_bytes": 8
}
}
```
传入 `--output`
```json
{
"ok": true,
"identity": "user",
"data": {
"file_token": "boxcnxxxx",
"file_name": "README.md",
"saved_path": "/abs/path/README.md",
"size_bytes": 8
}
}
```
## 参考
- [lark-markdown](../SKILL.md) — Markdown 域总览
- [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数

View File

@ -0,0 +1,85 @@
# markdown +overwrite
> **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
覆盖更新 Drive 中已有的原生 Markdown 文件,并返回覆盖后的新版本号。
## 命令
```bash
# 用行内内容覆盖
lark-cli markdown +overwrite \
--file-token boxcnxxxx \
--content '# Updated'
# 用本地 .md 文件覆盖
lark-cli markdown +overwrite \
--file-token boxcnxxxx \
--file ./README.md
# 覆盖内容时顺便显式指定新文件名
lark-cli markdown +overwrite \
--file-token boxcnxxxx \
--name NEW-README.md \
--content '# Updated'
# 用 --content 从本地文件读取
lark-cli markdown +overwrite \
--file-token boxcnxxxx \
--content @./README.md
# 用 stdin 覆盖
printf '# Updated\n' | \
lark-cli markdown +overwrite \
--file-token boxcnxxxx \
--content -
# 预览底层请求
lark-cli markdown +overwrite \
--file-token boxcnxxxx \
--content '# Updated' \
--dry-run
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--file-token` | 是 | 目标 Markdown 文件 token |
| `--name` | 否 | 显式指定覆盖后的文件名;必须带 `.md` 后缀。传入时优先使用它 |
| `--content` | 条件必填 | 新 Markdown 内容;与 `--file` 互斥;支持直接传字符串、`@file``-`stdin |
| `--file` | 条件必填 | 本地 `.md` 文件路径;与 `--content` 互斥 |
## 关键约束
- `--content``--file` 必须二选一
- 如果传了 `--name`,直接使用它作为覆盖后的文件名
- 如果没传 `--name` 且使用 `--content`,默认保留远端原文件名
- 如果没传 `--name` 且使用 `--file`,默认使用本地文件名
- `--file` 指向的本地文件名必须带 `.md` 后缀
- 覆盖成功后 **必须** 返回 `version`
## 返回值
```json
{
"ok": true,
"identity": "user",
"data": {
"file_token": "boxcnxxxx",
"file_name": "README.md",
"version": "7633658129540910621",
"size_bytes": 2048
}
}
```
其中:
- `version` 是覆盖写入后的新版本号
- `size_bytes` 是本次覆盖后的内容大小
## 参考
- [lark-markdown](../SKILL.md) — Markdown 域总览
- [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数

View File

@ -0,0 +1,160 @@
# markdown +patch
> **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
对 Drive 中已有的原生 Markdown 文件做局部文本替换,并返回是否实际写入了新版本。
## 命令
```bash
# 字面量替换
lark-cli markdown +patch \
--file-token boxcnxxxx \
--pattern 'hello markdown' \
--content 'hello patched'
# 正则替换RE2
lark-cli markdown +patch \
--file-token boxcnxxxx \
--regex \
--pattern 'hello (.+)' \
--content 'hi $1'
# 正则 pattern 含特殊字符时要显式转义
lark-cli markdown +patch \
--file-token boxcnxxxx \
--regex \
--pattern 'version \\(1\\.0\\)' \
--content 'version (2.0)'
# 删除匹配内容
lark-cli markdown +patch \
--file-token boxcnxxxx \
--pattern ' debug' \
--content ''
# --pattern / --content 也支持 @file
lark-cli markdown +patch \
--file-token boxcnxxxx \
--pattern @./pattern.txt \
--content @./replacement.md
# 从 stdin 读取 replacement
printf 'hi patched\n' | \
lark-cli markdown +patch \
--file-token boxcnxxxx \
--pattern 'hello markdown' \
--content -
# 预览底层编排
lark-cli markdown +patch \
--file-token boxcnxxxx \
--pattern 'hello markdown' \
--content 'hello patched' \
--dry-run
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--file-token` | 是 | 目标 Markdown 文件 token |
| `--pattern` | 是 | 要匹配的文本;默认按字面量处理;支持直接传字符串、`@file``-`stdin |
| `--content` | 是 | 替换后的内容;支持直接传字符串、`@file``-`stdin允许空字符串 `''`,表示删除匹配内容 |
| `--regex` | 否 | 将 `--pattern` 按 Go RE2 正则解释;`--content` 支持 `$1` 这类分组替换;如果需要字面 `$`,请写成 `$$` |
## 关键约束
- 当前只支持**单组** `--pattern` / `--content`
- `--pattern` 必须显式传入且不能为空字符串
- `--content` 必须显式传入,但允许为空字符串
- 未加 `--regex` 时,行为等价于对整份 Markdown 文本执行 `strings.ReplaceAll`
- 加了 `--regex` 时,行为等价于对整份 Markdown 文本执行 RE2 全量替换;`--content` 里的 `$1``${name}` 会按 Go regexp replacement template 解释,字面 `$` 请写成 `$$`
- 替换后的最终 Markdown 不能为空;如果 patch 结果是空字符串CLI 会直接报错,不会上传空文件,因为 Drive 不支持零字节 Markdown且空文件通常是误操作
- `0` 命中时命令仍然成功返回,但不会上传新版本
## Good / Bad
```bash
# BAD: pattern 含正则特殊字符但未转义,容易匹配错误位置
lark-cli markdown +patch \
--file-token boxcnxxxx \
--regex \
--pattern 'version (1.0)' \
--content 'version (2.0)'
# GOOD: 显式转义括号和点号
lark-cli markdown +patch \
--file-token boxcnxxxx \
--regex \
--pattern 'version \\(1\\.0\\)' \
--content 'version (2.0)'
```
## 实现边界
- 该命令的内部语义是:**download -> local replace -> overwrite upload**
- 它不是服务端原子 patch如果有人在你下载后、上传前更新了同一文件本次 patch 仍可能覆盖那次中间修改
- 它不会返回详细匹配位置,只返回命中数量
- `--dry-run` 会同时展示两种可能的上传路径:`upload_all`(小文件)和 `upload_prepare/upload_part/upload_finish`(大文件分片上传)
## 返回值
命中并写入新版本:
```json
{
"ok": true,
"identity": "user",
"data": {
"updated": true,
"mode": "literal",
"match_count": 1,
"version": "7639217385152646325",
"size_bytes_before": 39,
"size_bytes_after": 41
}
}
```
未命中:
```json
{
"ok": true,
"identity": "user",
"data": {
"updated": false,
"mode": "literal",
"match_count": 0,
"version": "",
"size_bytes_before": 41,
"size_bytes_after": 41
}
}
```
其中:
- `updated` 表示本次是否真的上传了新版本
- `mode``literal``regex`
- `match_count` 是匹配次数
- `version` 只有在 `updated=true` 时才会有值
- `size_bytes_before` / `size_bytes_after` 分别是替换前后的 Markdown 大小
## 适用场景
- 只需要替换一小段 Markdown 文本,而不想自己手动 `fetch -> edit -> overwrite`
- 需要基于正则做简单批量替换
- 需要判断“这次是否真的改到了内容”
## 不适用场景
- 需要 rename / move / delete / permission / comment 管理:切到 [`lark-drive`](../../lark-drive/SKILL.md)
- 需要多组 patch 一次完成:当前不支持,改为多次调用 `markdown +patch`
- 需要真正原子更新:当前能力不提供
## 参考
- [lark-markdown](../SKILL.md) — Markdown 域总览
- [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数