# Lemonclaw Workbuddy

> 用于查询或操作柠檬云 Lemon Cloud 业务数据，覆盖认证、账套、进销存 SCM、业财 ERP、财务 ACC 和独立开票 invoice。支持客户、供应商、商品、仓库等基础资料，以及采购、销售、库存、收付款、往来和经营报表；ERP 还支持销售报价、价格资料、订单汇总、库存账龄、暂估调整、应收应付预警及财务侧能力；ACC 支持独立财务账套的凭证、账簿、资金、发票和财务报表；invoice 支持立即开票、批量开票和问题反馈。用户提到柠檬云、LemonSCM、LemonERP、进销存、业财、财务、凭证、账簿、发票查询或开票操作时使用。

- Skill: `ahang1598/lemonclaw-workbuddy` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ahang1598/lemonclaw-workbuddy`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ahang1598/lemonclaw-workbuddy/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: ahang1598 (https://skillmd.com/u/ahang1598)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/ahang1598/lemonclaw-workbuddy

---


# LemonClaw WorkBuddy Skill

## 使用边界

本连接器有两条执行路径：

- 公共认证、账套以及 ACC、SCM、ERP 业务通过 `lemonclaw-cli` 执行。不要直接执行 bundled skill 中的 `action.py`，不要手写 HTTP 请求、URL、headers、认证信息或账套上下文。
- 独立开票 `invoice` 使用 `direct-script` 模式，不使用通用 `action search/show/run`，也不通过其他 `lemonclaw-cli` 命令包装开票脚本；读取当前 runtime 中的 `invoice/SKILL.md`，按其立即开票、批量开票或反馈提交流程直接执行脚本。

WorkBuddy skill 负责产品路由、账套选择、action 选择、输入输出纪律和最终回复。`lemonclaw-cli action show <product> <action>` 返回公开 `contract` 和实际存在的 `docs` 文档入口；具体 action 的字段、参数位置、返回结构和展示口径，必须通过对应节点的 `readCommand` 读取后确定。

不要把 action 清单、接口路径、字段全集或运行时内部细节写进最终回复。不要向用户展示完整 CLI JSON，除非用户明确要求排查 CLI 协议。

## 认证规则

连接器负责执行 `lemonclaw-cli auth status/login/logout`。ACC、SCM、ERP 业务处理中不要要求用户提供 API Key、access token、Authorization header、cookie 或本地凭据路径，也不要在回复中展示这些信息。

初次连接与常规认证由 WorkBuddy 连接器统一编排。连接器已发起认证时，不要重复执行登录或另开浏览器；当连接器主动要求重新认证，或命中下述“API Key 已过期”恢复条件时，按对应认证流程处理。

### API Key 过期后的重新授权（仅 WorkBuddy）

当且仅当已执行的 ACC、SCM 或 ERP CLI 业务命令失败，且错误信息同时明确表达“对象是 API Key”和“状态是已过期”时，执行以下固定流程。`API Key 已过期`、大小写差异或空格差异可视为同一语义；只出现泛化的“认证失败”或“过期”不满足条件。

1. 保留原业务命令及其标准输入 JSON，不要改变产品、action、账套或查询条件。
2. Windows 执行 `lemonclaw-cli.cmd auth login --browser`；macOS/Linux 执行 `lemonclaw-cli auth login --browser`。
3. CLI 会先输出完整授权 URL，再尝试打开系统浏览器并继续轮询；浏览器未能自动打开时，把已输出的 URL 提供给用户手动打开，不要终止授权流程。
4. 只有授权命令返回 `authenticated` 且退出码为 `0` 后，才原样重试先前业务命令，最多重试一次。
5. 重试仍失败时原样说明错误，不得再次循环登录。

普通 access token 过期由现有认证 helper 使用本地 API Key 静默换取新 token，不调用 `--browser`。API Key 缺失、被删除、被禁用，普通 token 错误，HTTP 401/403，网络、权限及业务错误也不得仅凭“认证失败”或“过期”等宽泛字样自动打开浏览器；按原错误提示用户处理。

独立开票是 API Key 规则的唯一例外：是否需要收集 API Key、如何保存和验证，严格按 `invoice/SKILL.md` 及当前开票流程模板执行。即使在开票流程中，也不得要求用户提供 access token、Authorization header、cookie、baseUrl 或本地凭据路径。

## 账套上下文

ACC、SCM、ERP 业务请求前先执行：

```text
lemonclaw-cli account current
```

当前账套满足用户请求时直接继续业务 action。没有当前账套、已根据产品路由确认需要切换产品，或用户明确要求切换账套时，优先执行：

```text
lemonclaw-cli account switch "<产品或账套线索>"
```

按 `account switch` 的结果继续处理：

- 唯一命中并切换成功：执行 `lemonclaw-cli account current` 核验后继续业务 action。
- 返回多个候选：直接展示本次 `switch` 返回的候选并让用户确认；不要再次执行 `account list`，避免刷新候选缓存和序号。用户确认后执行 `account select`，再执行 `account current`。
- 未找到匹配项且没有返回可选候选：执行 `account list` 获取完整候选，等待用户确认后执行 `account select`，再执行 `account current`。
- 认证、网络、权限或服务异常：保持原错误含义处理，不要改用 `account list` 掩盖异常。

候选确认后优先使用最近一次 `switch` 或 `list` 返回的序号：

```text
lemonclaw-cli account select --index <index>
lemonclaw-cli account current
```

名称在最近候选中唯一时，也可以使用：

```text
lemonclaw-cli account select --product <product> --name "<账套名称>"
```

已取得准确 `asid` 时可以使用 `--product <product> --asid <asid>`；专业版同名账套需要同时使用 `--product <product> --serviceid <serviceid> --name "<账套名称>"` 限定。

账套规则：

- `account switch` 可以按产品、账套名、asid、serviceid、版本等线索匹配；账套名、产品或版本存在歧义时先让用户确认。
- `account select` 只从最近一次 `account switch` 或 `account list` 缓存的候选中选择；没有候选缓存时不要直接按名称选择。
- `account select --index` 的序号必须来自最近一次候选结果，不要固定传 `1`；名称重复时不得自行选择。
- 展示候选时使用 `index`、`productName`、`editionName`、`accountSetName`、`asid`；专业版同名账套需要区分时可附加 `serviceid`。
- 不展示或要求用户提供 `candidateId`、`appasid`、`appAsId`、`accAppId`。
- 每个产品独立保存自己的账套上下文。切换当前产品或账套不应删除其他产品的上下文。
- `account clear` 只清理账套上下文，不清理认证。
- 独立开票所需的销方、购方、认证和公司选择以 `invoice/SKILL.md` 为准；除非开票流程明确要求，否则不要把本节的普通业务账套流程强行套用到 invoice。

## 产品路由

同一时间只有一个 `activeProduct`。如果 `activeProduct` 存在，默认只在当前产品中搜索和执行 action。除非用户明确点名另一个产品、明确要求切换产品、明确要求跨产品汇总，或明确进入独立开票流程，否则不要切换产品。

如果没有 `activeProduct`，且用户没有说明产品，先确认用户要使用财务 ACC、进销存 SCM、业财 ERP，还是独立开票 invoice；确认前不要默认切到 SCM 或跨产品试探。

产品边界：

- `acc`：独立财务账套，包括凭证、账簿、资金、基础资料、财务发票查询、财务报表等。
- `scm`：进销存账套，包括商品、客户、供应商、采购、销售、库存、收付款、经营报表等。
- `erp`：业财账套，包括进销存业务和 ERP 财务侧能力。ERP 财务侧的凭证、账簿、资金、基础资料和财务发票能力应在 ERP 产品内处理，不要为了这些词切到 ACC。
- `invoice`：独立开票流程。仅当用户明确提出独立开票、立即开票、批量开票、确认开票、发票预览、提交开票等开票操作时使用。

容易误判的业务词：客户、供应商、商品、库存、采购、销售、收款、付款、往来、资金、报表、明细、汇总、对账、欠款、利润、发票等在多个产品中都可能存在。不能仅凭这些词切换产品；先在当前 `activeProduct` 范围内搜索候选。

发票业务也必须遵循上述产品路由规则。普通发票查询、发票详情、进项发票、销项发票、发票导出和发票统计，在已确认的当前 ACC、SCM 或 ERP 产品范围内选择 action；没有当前产品且用户未指定产品或账套时，先请用户确认，不得默认选择 ACC。

只有用户明确提出独立开票、立即开票、批量开票、确认开票、提交开票、发票预览或税票平台操作时，才进入 `invoice` 流程。

其他产品已经保存账套上下文，不构成切换产品的依据。当前产品没有匹配能力时，只能说明当前产品暂未找到对应能力并询问用户是否切换；不得静默使用其他产品的 action 或数据代替。

## 独立开票工作流

命中独立开票、立即开票、批量开票、确认开票、开票预览、提交开票或开票问题反馈时：

1. `lemonclaw-cli skill-root --check` 仅用于发现并校验当前 runtime 的 bundled skill 根目录；不得通过该命令传递或执行任何开票业务参数。
2. 根据返回路径建立并校验以下直接脚本运行上下文：

   ```text
   <runtime-root>   = 规范化后的 <skill-root>/../../..
   Windows Python  = <runtime-root>/python/python.exe
   macOS/Linux     = <runtime-root>/python/bin/python3
   cwd             = <runtime-root>
   PYTHONPATH      = <runtime-root>/app
   SSL_CERT_FILE   = <runtime-root>/app/certifi/cacert.pem
   PYTHONUTF8      = 1
   PYTHONIOENCODING= utf-8
   PYTHONNOUSERSITE= 1
   PYTHONDONTWRITEBYTECODE=1
   LEMONCLAW_RUNTIME_ROOT=<runtime-root>
   ```

   执行前确认 `<runtime-root>/runtime.json`、对应平台的 runtime Python 以及 `<runtime-root>/app` 都存在。以上环境变量只覆盖当前开票脚本进程，不修改用户的全局环境。
3. 完整读取 `<skill-root>/invoice/SKILL.md`，并以 `<skill-root>/invoice/` 作为所有相对路径的基准。runtime 文档中的 <SkillsRoot> 即 <skill-root>/invoice/，二者同指 invoice 目录的绝对路径。
4. 开票文档中的 `python`、`python3` 或 `<Python>` 解释器标记统一替换为上述 runtime Python；将脚本相对路径解析为 `<skill-root>/invoice/` 下的绝对路径，然后由 runtime Python 直接执行脚本。不要替换或包装成 `lemonclaw-cli` 命令，也不要使用系统 Python。
5. 路径按当前平台解析，新版文档统一使用 `/` 表示目录层级。若已安装 runtime 的旧版文档仍含 PowerShell 反引号续行或 Windows 反斜杠，只保留原参数及其顺序，按当前平台重新解析路径和参数，不要原样交给 macOS/Linux shell。macOS/Linux 不执行 `.ps1`，预览服务启停直接调用对应 Python 脚本，临时目录清理由当前平台的文件操作完成。
6. 立即开票只按 `references/immediate/flow.md` 执行；批量开票只按 `references/batch/flow.md` 执行；反馈提交只按 `invoice/SKILL.md` 指定的 shared 文档执行。
7. 按开票 Skill 和当前阶段文档调用随 runtime 分发的脚本、references、config 与 assets；不要自行改写开票门禁、固定提示、预览、确认、额度检查、payload、提交或反馈流程。
8. 独立开票不使用通用 `action search/show/run`，也不要用 ACC 或 ERP 的发票查询 action 代替开票流程。普通进项、销项发票查询仍按当前 ACC 或 ERP 产品执行。
9. `invoice/SKILL.md`、当前流程文档和共享输出协议决定业务流程与输出；本节决定标准版的 Python、目录和进程环境。二者发生执行方式冲突时，以本节的标准版直接脚本运行上下文为准。

## Action 选择流程

处理 ACC、ERP、SCM 业务请求时严格按顺序执行：

```text
1. lemonclaw-cli account current
2. lemonclaw-cli action search "用户需求"
3. lemonclaw-cli action show <product> <action>
4. 必要时读取合理候选的 docs.action，确定唯一 action
5. 读取最终 action 的全部现有 docs 节点
6. lemonclaw-cli action run <product> <action> --json-stdin
```

选择规则：

- `search` 只用于找候选，不生成参数、不执行业务请求。
- `search` 结果不是最终 action，第一名或 `ambiguous=false` 都不表示已经选定。先 `show` 最合理候选；仍有合理候选时最多深入比较两个，无法排除时向用户澄清。
- 第一次 `search` 没有候选时，不得直接判断当前产品不支持。先拆解用户请求中的业务对象、操作类型、结果粒度、筛选条件和期望输出，在当前 `activeProduct` 内改写搜索词重新搜索并核对候选；完成语义核对后仍未找到，才说明当前产品暂未找到对应能力。
- `show` 只返回当前 action 的公开 `contract` 和实际存在的 `docs` 节点，不代表该 action 已经成为唯一选择。文档只能执行对应节点的 `readCommand` 读取，不要根据 `path` 猜命令，也不要猜不存在的文档。
- 比较候选时只在需要业务边界时读取候选的 `docs.action`。确定唯一 action 后，读取最终 action 的全部现有文档；如果此前读取过多个候选的 `ACTION.md`，先重新读取最终 action 的 `docs.action`，再读取 `docs.input` 和 `docs.output`。
- `ACTION.md` 用于确认使用边界、前置步骤和依赖；`input.md` 用于构造请求；`output.md` 用于理解预期结果和展示约定。缺少 `input.md` 且 `contract` 不足以确定参数时，不得执行 `run`。
- 不要根据 action 名称、响应字段、页面列名、旧记忆或相邻 action 臆造入参。
- 不要为了找到更像的 action 自动跨产品搜索。跨产品前必须满足产品路由规则。
- `invoice` 产品是独立编排流程，不能通过通用 `action search/show/run` 执行；遇到对应错误时不要改用 ACC 发票查询 action 代替开票流程。

## Action 输入规则

本节只适用于 ACC、SCM、ERP 的 CLI action。`action run` 的 stdin 必须保持嵌套结构：

```json
{
  "query": {},
  "body": {},
  "_outputMode": "full"
}
```

硬规则：

- 顶层只允许 `query`、`body`、`_outputMode`。
- 不要拍平 `query/body`，也不要让 CLI 根据字段名重新分流。
- 不传 `context`、`_context`、headers、token、cookie、appasid、appAsId、accAppId 等运行时字段；CLI 从已选择账套加载上下文。
- `bodyMode:none` 的 action 可省略 `body` 或传 `{}`，业务字段按 `contract.requestParamSchema` 和实际存在的 `docs.input` 放入 `query`。
- `bodyMode:list` 的 action，`body` 必须是数组；其他公开 action 的 `body` 必须是对象。
- 参数是否必填、字段类型、枚举值、日期格式、ID 串格式，以最终 action 的 `docs.input` 文档和 `contract.requestParamSchema` 为准。
- 普通查看省略 `_outputMode`；也可显式传 `basic`。
- 只有统计、分析、二次筛选、Top、核对、下游交接或需要完整结构化数据时才传 `_outputMode:"full"`。
- `internal`、`raw-internal`、`system` 是内部编排模式，禁止从 WorkBuddy 传入。
- ACC、SCM、ERP 写操作只有在用户明确确认后才能追加 CLI 参数 `--user-confirmed`；该标志不写入 JSON。

调用时把 JSON 作为命令 stdin 直接提交，不使用 shell `echo` 拼接 JSON。

## 输出展示规则

本节只适用于 ACC、SCM、ERP 的 CLI action。CLI stdout 是 action 完成取数、展示塑形后的最终 JSON，不是原始业务接口响应。不要再次按接口 `rows/raw/data` 自行拼接展示。

普通查看：

- 在返回结果对象中读取 `mustDisplayVerbatim` 和 `primaryDisplayField`。
- 当 `mustDisplayVerbatim=true` 时，按 `primaryDisplayField` 指定的字段原样展示；常见字段是 `displayMarkdown`、`reportMarkdown`、`markdown` 或 `content`。
- 原样展示时不要改写 Markdown 表头、章节顺序、表格列、排序、金额格式、提示语或文件路径。
- 最终回复直接输出 primaryDisplayField 的 Markdown 原文，让表格在消息中渲染；不得用三反引号代码块包裹、不得转义管道符 |、不得缩进或改成纯文本。
- `primaryDisplayField` 不存在时，再依据已读取的 `docs.output` 文档解释结构化结果。
- 面向用户优先输出中文业务结果和必要结论，不要直接贴完整 JSON、字段名清单、错误码堆栈或 CLI 调试过程。

结构化读取：

- 常见结构为 `data.数据`、`data.数据列表`、`data.总数`；具体以已读取的 `docs.output` 文档为准。
- `action run` 的实际返回是本次数据事实；`docs.output` 只解释实际存在字段的含义和展示约定，不覆盖真实响应。不要根据内部 `fieldMap` 路径直接访问 runtime 文件，也不要把内部 ID 当作普通展示列输出。
- 如果结果包含文件路径、下载路径或导出信息，只在 action 成功且字段真实存在时告知用户。

`basic` 返回的表格只代表默认展示列，不代表 action 的全部返回字段。用户点名查看、筛选、排序、统计或交接默认表格未展示的字段时，先检查实际存在的 `docs.output`；字段已经定义则使用 `_outputMode:"full"` 重新取数，确认未定义后才能说明当前 action 不支持该字段。

## full 模式规则

本节只适用于 ACC、SCM、ERP 的 CLI action。`full` 用于统计分析、二次筛选、Top、核对、下游交接和完整结构化读取；`full` 不等于自动导出 Excel，也不代表可以把全量结构化行直接贴给用户。

使用 `full` 后必须检查数据完整性：

- 比较 `数据列表` 实际长度与 `总数`。
- 如果长度小于总数、存在 `complete=false`、存在分页/截断提示，或 `output.md` 明确说明可能不是全量，不得声称分析覆盖全部数据。
- 数据不完整时，说明当前结果范围和限制，并建议缩小筛选条件、补充期间/账户/类别等条件，或使用系统导出能力。
- 统计金额、数量、Top、占比、异常分析时，如果数据不完整，结论必须标注“基于当前返回数据”。

## 报表规则

本节只适用于 ACC、SCM、ERP 的 CLI action。模板报表和已塑形报表必须优先使用 action 返回的最终正文。只要返回包含 `displayPolicy=verbatim_markdown`、`mustDisplayVerbatim=true` 或明确指定 `primaryDisplayField`，最终回复必须原样展示指定字段。

报表规则：

- 资金日报、资金周报、资金月报等模板报表，最终正文必须来自对应 action 的 `displayMarkdown` 或文档指定字段。
- 不得手写、摘要化、删章节、改标题、改顺序、改表格列、合并表格或只展示局部指标。
- 报表正文（`displayMarkdown` 等）同样直接渲染为 Markdown 输出，不得用代码块包裹。
- 展示前确认正文包含模板要求的固定章节；如果 action 返回显示正文不完整，应按错误或不完整结果处理。
- 对应模板或 `output.md` 明确要求包含 `报告结束` 时，展示前必须核验；ACC/ERP 财务侧 statement query 不强制追加该标记，仍按其 `primaryDisplayField` 和输出契约原样展示。
- ACC 的 `cashier-daily-report`、`cashier-weekly-report`、`cashier-monthly-report` 是 ACC 资金报表入口。
- ERP 中同名资金报表是 ERP 财务侧入口。不要跨产品混用报表入口。
- SCM/ERP 销售经营报表和 ACC/ERP 资金报表都应通过正式报表 action 生成，不要只查底层列表后自行拼报表。

## 写操作规则

ACC、SCM、ERP 的写操作、状态变更、提交、删除、清理和有业务影响的动作，必须先获得用户明确业务确认。确认后在 CLI 命令上追加 `--user-confirmed`，不要把确认标志写入 JSON。

如果用户只是询问、预览、查询、核对或分析，不要执行写操作。支持 dry-run 的命令可先用 `--dry-run` 查看计划，但 dry-run 结果不能当作真实业务结果。

独立开票不得套用 `--user-confirmed`。其预览、用户确认、认证、额度检查和提交门禁严格按 `invoice/SKILL.md` 及当前流程文档执行。

## 错误处理

ACC、SCM、ERP 的 CLI 与账套错误按错误类型处理，不要把所有错误都改写成“CLI 执行失败”。独立开票错误按本节最后一条执行。

- `source:"cli"`：CLI 参数、索引、进程或协议错误。按错误码修正命令、产品、action 或输入信封。
- `active_product_mismatch`：当前产品与请求产品不一致。先确认用户是否要切换产品或账套。
- 缺少账套上下文：执行 `account switch`；唯一命中后执行 `account current` 核验。
- 候选账套歧义：直接展示 `account switch` 返回的候选，用户确认后执行 `account select`；不要在二者之间重新执行 `account list`。
- `account switch` 未找到匹配项且没有返回候选：执行 `account list`，用户确认候选后再执行 `account select`。
- 账套命令返回认证、网络、权限或服务异常：按原错误处理，不要通过刷新候选规避错误。
- action 未找到：在当前产品重新 `action search`。不要直接跨产品乱搜。
- payload 或 request 参数校验失败：重新执行最终 action 的 `show` 和 `docs.input.readCommand`，按 `input.md` 与 `contract` 修正 `query/body`。
- 权限、业务规则、数据不存在、期间未启用等结构化业务错误：保持原业务含义，用中文说明下一步可操作建议。
- 文件导出失败或返回错误文件：不要把错误文件当成 Excel 成果。
- 不得因为接口报错、空数据、无权限、认证失效或服务不可用而自动切换产品、账套、服务或接口域名。先按当前上下文说明问题，只有用户明确要求后才能切换。
- 独立开票的错误、失败反馈和最终措辞按 `invoice/SKILL.md`、当前流程模板和共享输出协议处理，不要改写成通用 CLI 错误。

## 最终回复规则

最终回复使用中文业务语言，优先回答用户问题本身。不要输出 action.py 路径、HTTP 路径、headers、token、appasid、candidateId、完整 CLI JSON、调试日志或不必要的字段名。除账套候选确认确有必要展示的 `asid`、`serviceid` 外，不要向用户展示业务单据 ID、客户 ID、供应商 ID、商品 ID 或其他系统内部 ID。

如果 ACC、SCM、ERP 请求发起或依赖了真实业务数据查询，回复末尾说明本次使用的账套名称和 `serviceid`；如果当前上下文没有账套名称，不要猜测，写“账套名称：未获取”。未发起真实业务请求时，不需要账套尾注。

独立开票最终回复必须按当前开票流程的固定模板和共享输出协议收口；当开票文档要求只输出固定成功或失败文案时，不追加通用账套尾注或其他说明。

当数据为空、被截断、权限不足或筛选条件不完整时，要明确说明范围和限制。不要为了让结果看起来完整而补造数据、猜测金额、猜测期间或猜测业务对象。

用户反馈数据异常、结果不对、不会操作，或明确要求人工、客服、官方帮助时，提示可以前往柠檬云官网联系在线客服。官网地址：https://www.ningmengyun.com/ 。独立开票客服入口和二维码优先使用开票流程规定的 `customer_service_link` 与固定模板。

## CLI 快速参考

```text
lemonclaw-cli auth status
lemonclaw-cli skill-root --check
lemonclaw-cli account current
lemonclaw-cli account switch "<产品或账套线索>"
lemonclaw-cli account list
lemonclaw-cli account select --index <index>
lemonclaw-cli account select --product <product> --name "<账套名称>"
lemonclaw-cli account select --product <product> --asid <asid>
lemonclaw-cli account select --product <product> --serviceid <serviceid> --name "<账套名称>"
lemonclaw-cli action search "用户需求"
lemonclaw-cli action show <product> <action>
lemonclaw-cli action doc <product> <action> --doc action
lemonclaw-cli action doc <product> <action> --doc input
lemonclaw-cli action doc <product> <action> --doc output
lemonclaw-cli action run <product> <action> --json-stdin
```

