From ba0d7ec3e4c9db762b1a81e407f5c4a7f389b8b9 Mon Sep 17 00:00:00 2001 From: wangqiucheng Date: Thu, 16 Apr 2026 16:48:04 +0800 Subject: [PATCH 1/4] feat(base): add identity priority strategy and 91403 error handling Establish user-first identity selection with graceful degradation to bot, and add no-retry rule for error code 91403 (permission denied on Base). Co-Authored-By: Claude Opus 4.6 --- skills/lark-base/SKILL.md | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/skills/lark-base/SKILL.md b/skills/lark-base/SKILL.md index 07710b2e4..4d216e386 100644 --- a/skills/lark-base/SKILL.md +++ b/skills/lark-base/SKILL.md @@ -250,11 +250,30 @@ metadata: | `slides` | 转到 Drive 相关 skill | 不继续使用本 skill 的 Base 命令 | | `mindnote` | 转到 Drive 相关 skill | 不继续使用本 skill 的 Base 命令 | -### 3.5 执行身份与人员字段 +### 3.5 身份选择与权限降级策略 + +多维表格通常属于用户的个人或团队资源。**默认应优先使用 `--as user`(用户身份)执行所有 Base 操作**,始终显式指定身份。 + +- **`--as user`(推荐)**:以当前登录用户身份操作其有权访问的 Base。执行前先完成用户授权: + +```bash +lark-cli auth login --domain bitable +``` + +- **`--as bot`(降级)**:仅当 user 身份权限不足、且 bot 身份确实拥有目标 Base 的访问权限时,才降级使用。bot 看不到用户私有资源,行为以应用身份执行。 + +**执行规则**: + +1. 所有操作默认先用 `--as user`。 +2. 若 user 身份返回权限错误,检查错误响应中是否包含 `permission_violations` / `hint` 等提权引导信息: + - **有提权引导**:按 `lark-shared` 权限不足处理流程,先引导用户完成 user 身份提权(`auth login --scope`);确认提权成功后,以 `--as user` 重试。 + - **无提权引导**(如资源级无访问权限、非 scope 不足):切换到 `--as bot` 重试**一次**。 +3. 若 bot 身份仍然返回权限错误,**立即停止重试**,根据错误响应按 `lark-shared` 流程引导用户解决(引导去开发者后台开通 scope 或确认资源访问权限)。 +4. 只有在用户明确要求"用应用身份 / bot 身份操作",或当前工作流就是 bot 创建资源后再做协作授权时,才跳过 user 直接使用 `--as bot`。 + +**补充说明**: - 人员字段 / 用户字段:注意 `user_id_type` 与执行身份(user / bot)差异。 -- bot 身份:bot 看不到用户私有资源;行为以应用身份执行。 -- user 身份:依赖用户授权和 scope;更适合操作用户资源。 ## 4. 执行规则 @@ -313,6 +332,7 @@ metadata: | 系统字段 / 公式字段写入失败 | 只读字段被当成可写字段 | 改为写存储字段,计算结果交给 formula / lookup / 系统字段自动产出 | | `1254104` | 批量超 200 条 | 分批调用 | | `1254291` | 并发写冲突 | 串行写入 + 批次间延迟 | +| `91403` | 无权限访问该 Base | **不要重试**。按 `lark-shared` 权限不足处理流程引导用户解决权限问题 | ## 6. 参考文档 From 006e92accaf48ae2c3071bc06fb3995ff28f7dec Mon Sep 17 00:00:00 2001 From: wangqiucheng Date: Thu, 16 Apr 2026 16:50:07 +0800 Subject: [PATCH 2/4] fix(base): add 91403 early-exit before identity fallback logic Move non-retryable error code check (e.g. 91403) to a dedicated step before the user/bot fallback decision, resolving conflicting instructions between the error table and the execution rules. Co-Authored-By: Claude Opus 4.6 --- skills/lark-base/SKILL.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/skills/lark-base/SKILL.md b/skills/lark-base/SKILL.md index 4d216e386..6352c232b 100644 --- a/skills/lark-base/SKILL.md +++ b/skills/lark-base/SKILL.md @@ -265,11 +265,12 @@ lark-cli auth login --domain bitable **执行规则**: 1. 所有操作默认先用 `--as user`。 -2. 若 user 身份返回权限错误,检查错误响应中是否包含 `permission_violations` / `hint` 等提权引导信息: +2. 若 user 身份返回权限错误,先判断是否为**不可重试错误码**(如 `91403`)。若是,**立即停止**,不做任何重试或降级,直接按 `lark-shared` 权限不足处理流程引导用户解决。 +3. 非不可重试错误码时,检查错误响应中是否包含 `permission_violations` / `hint` 等提权引导信息: - **有提权引导**:按 `lark-shared` 权限不足处理流程,先引导用户完成 user 身份提权(`auth login --scope`);确认提权成功后,以 `--as user` 重试。 - **无提权引导**(如资源级无访问权限、非 scope 不足):切换到 `--as bot` 重试**一次**。 -3. 若 bot 身份仍然返回权限错误,**立即停止重试**,根据错误响应按 `lark-shared` 流程引导用户解决(引导去开发者后台开通 scope 或确认资源访问权限)。 -4. 只有在用户明确要求"用应用身份 / bot 身份操作",或当前工作流就是 bot 创建资源后再做协作授权时,才跳过 user 直接使用 `--as bot`。 +4. 若 bot 身份仍然返回权限错误,**立即停止重试**,根据错误响应按 `lark-shared` 流程引导用户解决(引导去开发者后台开通 scope 或确认资源访问权限)。 +5. 只有在用户明确要求"用应用身份 / bot 身份操作",或当前工作流就是 bot 创建资源后再做协作授权时,才跳过 user 直接使用 `--as bot`。 **补充说明**: From d24b6027c2a17a6a90ddbcb8492390ab252c883f Mon Sep 17 00:00:00 2001 From: wangqiucheng2bd <86334092+wangqiucheng2bd@users.noreply.github.com> Date: Thu, 16 Apr 2026 17:48:14 +0800 Subject: [PATCH 3/4] Update SKILL.md --- skills/lark-base/SKILL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skills/lark-base/SKILL.md b/skills/lark-base/SKILL.md index 6352c232b..7661a7121 100644 --- a/skills/lark-base/SKILL.md +++ b/skills/lark-base/SKILL.md @@ -257,7 +257,7 @@ metadata: - **`--as user`(推荐)**:以当前登录用户身份操作其有权访问的 Base。执行前先完成用户授权: ```bash -lark-cli auth login --domain bitable +lark-cli auth login --domain base ``` - **`--as bot`(降级)**:仅当 user 身份权限不足、且 bot 身份确实拥有目标 Base 的访问权限时,才降级使用。bot 看不到用户私有资源,行为以应用身份执行。 @@ -270,7 +270,7 @@ lark-cli auth login --domain bitable - **有提权引导**:按 `lark-shared` 权限不足处理流程,先引导用户完成 user 身份提权(`auth login --scope`);确认提权成功后,以 `--as user` 重试。 - **无提权引导**(如资源级无访问权限、非 scope 不足):切换到 `--as bot` 重试**一次**。 4. 若 bot 身份仍然返回权限错误,**立即停止重试**,根据错误响应按 `lark-shared` 流程引导用户解决(引导去开发者后台开通 scope 或确认资源访问权限)。 -5. 只有在用户明确要求"用应用身份 / bot 身份操作",或当前工作流就是 bot 创建资源后再做协作授权时,才跳过 user 直接使用 `--as bot`。 +5. 只有在用户明确要求"用应用身份 / bot 身份操作",才跳过 user 直接使用 `--as bot`。 **补充说明**: From 3d01e20d1bd7f1a69321f0503522be12526f7b41 Mon Sep 17 00:00:00 2001 From: wangqiucheng2bd <86334092+wangqiucheng2bd@users.noreply.github.com> Date: Thu, 16 Apr 2026 20:09:07 +0800 Subject: [PATCH 4/4] Update SKILL.md --- skills/lark-base/SKILL.md | 46 --------------------------------------- 1 file changed, 46 deletions(-) diff --git a/skills/lark-base/SKILL.md b/skills/lark-base/SKILL.md index 7661a7121..7ed0c4d87 100644 --- a/skills/lark-base/SKILL.md +++ b/skills/lark-base/SKILL.md @@ -334,49 +334,3 @@ lark-cli auth login --domain base | `1254104` | 批量超 200 条 | 分批调用 | | `1254291` | 并发写冲突 | 串行写入 + 批次间延迟 | | `91403` | 无权限访问该 Base | **不要重试**。按 `lark-shared` 权限不足处理流程引导用户解决权限问题 | - -## 6. 参考文档 - -- [lark-base-shortcut-field-properties.md](references/lark-base-shortcut-field-properties.md) — `+field-create/+field-update` 调用前必看,各类型 field JSON 规范 -- [role-config.md](references/role-config.md) — 角色权限配置详解 -- [lark-base-shortcut-record-value.md](references/lark-base-shortcut-record-value.md) — record 写入(`+record-upsert / +record-batch-create / +record-batch-update`)调用前必看,各类型 record JSON 规范 -- [lark-base-record-batch-create.md](references/lark-base-record-batch-create.md) — `+record-batch-create` 用法与 `--json` 结构 -- [lark-base-record-batch-update.md](references/lark-base-record-batch-update.md) — `+record-batch-update` 用法与 `--json` 结构 -- [formula-field-guide.md](references/formula-field-guide.md) — formula 字段写法、函数约束、CurrentValue 规则、跨表计算模式 -- [lookup-field-guide.md](references/lookup-field-guide.md) — lookup 字段配置规则、where/aggregate 约束、与 formula 的取舍 -- [lark-base-view-set-filter.md](references/lark-base-view-set-filter.md) — 视图筛选配置 -- [lark-base-record-list.md](references/lark-base-record-list.md) — 记录列表读取与分页 -- [lark-base-record-search.md](references/lark-base-record-search.md) — 关键词搜索记录 -- [lark-base-advperm-enable.md](references/lark-base-advperm-enable.md) — `+advperm-enable` 启用高级权限 -- [lark-base-advperm-disable.md](references/lark-base-advperm-disable.md) — `+advperm-disable` 停用高级权限 -- [lark-base-role-list.md](references/lark-base-role-list.md) — `+role-list` 列出角色 -- [lark-base-role-get.md](references/lark-base-role-get.md) — `+role-get` 获取角色详情 -- [lark-base-role-create.md](references/lark-base-role-create.md) — `+role-create` 创建角色 -- [lark-base-role-update.md](references/lark-base-role-update.md) — `+role-update` 更新角色 -- [lark-base-role-delete.md](references/lark-base-role-delete.md) — `+role-delete` 删除角色 -- [lark-base-dashboard.md](references/lark-base-dashboard.md) — dashboard 模块工作流指引 -- [dashboard-block-data-config.md](references/dashboard-block-data-config.md) — Block `data_config` 结构、图表类型、filter 规则 -- [lark-base-workflow.md](references/lark-base-workflow.md) — workflow 命令索引 -- [lark-base-workflow-schema.md](references/lark-base-workflow-schema.md) — `+workflow-create/+workflow-update` JSON body 结构详解 -- [lark-base-data-query.md](references/lark-base-data-query.md) — `+data-query` 聚合分析,含 DSL 结构、支持字段类型、聚合函数 -- [examples.md](references/examples.md) — 完整操作示例 - -## 7. 命令分组 - -> **执行前必做:** 从下表定位到命令后,务必先阅读对应命令的 reference 文档,再调用命令。 - -| 命令分组 | 说明 | -|----------|------| -| [`table commands`](references/lark-base-table.md) | `+table-list / +table-get / +table-create / +table-update / +table-delete` | -| [`field commands`](references/lark-base-field.md) | `+field-list / +field-get / +field-create / +field-update / +field-delete / +field-search-options` | -| [`record commands`](references/lark-base-record.md) | `+record-search / +record-list / +record-get / +record-upsert / +record-batch-create / +record-batch-update / +record-upload-attachment / +record-delete` | -| [`view commands`](references/lark-base-view.md) | `+view-list / +view-get / +view-create / +view-delete / +view-get-* / +view-set-* / +view-rename` | -| [`data-query commands`](references/lark-base-data-query.md) | `+data-query` | -| [`history commands`](references/lark-base-history.md) | `+record-history-list` | -| [`base / workspace commands`](references/lark-base-workspace.md) | `+base-create / +base-get / +base-copy` | -| [`advperm commands`](references/lark-base-advperm-enable.md) | `+advperm-enable / +advperm-disable` | -| [`role commands`](references/lark-base-role-list.md) | `+role-list / +role-get / +role-create / +role-update / +role-delete` | -| [`form commands`](references/lark-base-form-create.md) | `+form-list / +form-get / +form-create / +form-update / +form-delete` | -| [`form questions commands`](references/lark-base-form-questions-create.md) | `+form-questions-list / +form-questions-create / +form-questions-update / +form-questions-delete` | -| [`workflow commands`](references/lark-base-workflow.md) | `+workflow-list / +workflow-get / +workflow-create / +workflow-update / +workflow-enable / +workflow-disable` | -| [`dashboard / dashboard-block commands`](references/lark-base-dashboard.md) | `+dashboard-list / +dashboard-get / +dashboard-create / +dashboard-update / +dashboard-delete / +dashboard-arrange / +dashboard-block-list / +dashboard-block-get / +dashboard-block-create / +dashboard-block-update / +dashboard-block-delete` |