archive: 紫鸟/HubStudio 文档快照(3889 篇 Markdown)

来源:紫鸟帮助中心/博客/主站资讯 + HubStudio API 文档/帮助中心 + 三个官方 skill 仓库。
只入库 Markdown 与元数据;原始 HTML 与 tarball 留在本机。
This commit is contained in:
admin9webs committed 2026-10-05 12:11:35 +00:00
commit 322b7737eb
3976 files changed
+695714

No files matched your search

+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 ziniao-open
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+244
View File
@@ -0,0 +1,244 @@
# ziniao-skills
紫鸟浏览器 AI Agent Skill 包,覆盖 ERP 管理(员工/角色/设备/标签/部门)和店铺自动化操作,适配 ziniao-cli 与 ZClaw 本地接口。
## Skill 安装
以后 Skill 内置在 `ziniao-cli` 里安装,不再单独走 `npx skills add`:
```bash
ziniao-cli skills install
```
先安装 CLI 后再执行上面的命令。备选(不推荐):`npx skills add ziniao-open/skills -y -g`
## ziniao-cli 安装
```bash
npm install -g @ziniao-open/cli
```
安装后验证:
```bash
ziniao-cli --version
```
## 快速开始
### 1. 初始化配置
```bash
ziniao-cli config init
```
按提示选择"新建应用"或"手动输入 API Key",完成后凭证自动存入系统 Keychain。
### 2. AI Agent 初始化流程
AI Agent 应使用非交互模式:
```bash
ziniao-cli config init --new
```
该命令会阻塞直到审核通过、被拒绝或超时(1 小时),Agent 的处理流程:
1. 后台执行 `config init --new`
2. 从 stderr 输出中提取 URL(包含 `memberAuth?cliRequestId=` 的行)
3. 将链接展示给用户,提示在浏览器中打开完成应用创建
4. 等待命令完成(审核通过/拒绝/超时)
输出示例:
```
请在浏览器中打开以下链接完成应用创建:
https://open.ziniao.com/memberAuth?cliRequestId=a1b2c3d4-...&from=cli
⏳ 等待应用创建及审核... (按 Ctrl+C 取消)
✓ 审核已通过
✓ 企业 ID: 15393*****3459
✓ 配置已保存 (profile: zhangsan)
```
初始化完成后,`isBoss` 字段决定账号权限范围:
| 账号类型 | 服务端 API | ZClaw Bridge(本地浏览器) |
|---------|-----------|--------------------------|
| Boss | 全部可用 | 全部可用 |
| 成员 | 不可用 | 全部可用 |
可通过 `ziniao-cli config show` 查看当前账号类型。
### 3. 多账号管理
支持多个账号配置(profile),通过 `config use` 切换:
```bash
# 列出所有 profile
ziniao-cli config list
# 切换到指定 profile
ziniao-cli config use <name>
# 重命名 profile
ziniao-cli config rename <old> <new>
# 删除 profile(需确认,--yes 跳过)
ziniao-cli config remove --profile <name>
```
### 4. 验证连通性
```bash
ziniao-cli doctor
```
### 5. 开始使用
```bash
# 查看员工列表
ziniao-cli staff list --format table
# 查看部门树
ziniao-cli department list --tree
# 查看角色列表
ziniao-cli role list --format table
```
## 命令概览
### 配置管理
| 命令 | 说明 |
|------|------|
| `config init` | 初始化配置 |
| `config show` | 显示当前配置 |
| `config list` | 列出所有 profile |
| `config use <name>` | 切换当前 profile |
| `config rename <old> <new>` | 重命名 profile |
| `config remove` | 删除 profile(需确认) |
### 部门管理
| 命令 | 说明 |
|------|------|
| `department list` | 查询部门列表 |
| `department create` | 新增部门 |
| `department update` | 修改部门 |
| `department delete` | 删除部门 |
| `department reorder` | 部门排序 |
### 员工管理
| 命令 | 说明 |
|------|------|
| `staff list` | 查询员工列表 |
| `staff create` | 新增员工 |
| `staff update` | 修改员工信息 |
| `staff enable` | 启用员工 |
| `staff disable` | 禁用员工 |
| `staff remove` | 删除员工 |
| `staff transfer` | 员工调岗 |
### 角色管理
| 命令 | 说明 |
|------|------|
| `role list` | 查询角色列表 |
| `role detail` | 查看角色详情 |
| `role create` | 创建角色 |
| `role update` | 修改角色 |
| `role assign` | 分配角色给员工 |
| `role staff-roles` | 查看员工已分配角色 |
| `role permissions` | 查看可用权限列表 |
### 账号(店铺)管理
| 命令 | 说明 |
|------|------|
| `account list` | 查询账号列表 |
| `account create` | 创建账号 |
| `account update` | 修改账号信息 |
| `account delete` | 删除账号 |
| `account auth-add` | 授权员工访问店铺 |
| `account auth-remove` | 撤销员工授权 |
| `account auth-clean` | 清空店铺所有授权 |
| `account auth-list` | 查询员工被授权的店铺 |
| `account auth-users` | 查询店铺已授权的员工 |
| `account tag-list` | 查询企业标签列表 |
| `account tag-create` | 创建标签 |
| `account tag-rename` | 重命名标签 |
| `account tag-delete` | 删除标签 |
| `account tag-bind` | 绑定标签到店铺 |
| `account tag-unbind` | 解绑标签 |
| `account tag-replace` | 全量替换店铺标签 |
| `account tag-clear` | 清空店铺标签 |
| `account tag-remove` | 从店铺移除标签 |
| `account tag-of-store` | 查询店铺绑定的标签 |
### 设备管理
| 命令 | 说明 |
|------|------|
| `device list` | 查询设备列表 |
| `device add-custom` | 添加自有设备 |
| `device update-custom` | 修改自有设备 |
| `device plan-list` | 查询可购买套餐 |
| `device bind` | 绑定设备到店铺 |
| `device unbind` | 解绑设备 |
| `device auto-renew` | 设置自动续费 |
| `device purchase` | 购买设备套餐 |
| `device renew` | 续费设备 |
### 浏览器控制(ZClaw)
| 命令 | 说明 |
|------|------|
| `store list` | 列出已打开的店铺浏览器 |
| `store open` | 打开店铺浏览器 |
| `store close` | 关闭店铺浏览器 |
| `page visit` | 导航到指定 URL |
| `page screenshot` | 页面截图 |
| `page automation` | 页面自动化操作 |
### 通用 API 调用
对于未提供快捷命令的接口(共 73 个接口中 shortcut 覆盖 45 个),可使用通用 `api` 命令:
```bash
ziniao-cli api <path> [--data '{}'] [--format table] [--jq '.field']
ziniao-cli api /superbrowser/rest/v1/erp/store/deletecookie --data '{"storeId":"xxx"}'
```
## Skill 模块
| Skill | 说明 |
|-------|------|
| `ziniao-shared` | 共享基础:配置初始化、认证、输出格式、权限点 |
| `ziniao-staff` | 员工管理 |
| `ziniao-role` | 角色与权限管理 |
| `ziniao-department` | 部门管理 |
| `ziniao-account` | 账号(店铺)管理与标签 |
| `ziniao-device` | 设备管理 |
| `ziniao-store` | 浏览器店铺控制(ZClaw) |
| `ziniao-page` | 浏览器页面操作(ZClaw) |
| `ziniao-access-policy` | 访问策略管理 |
| `ziniao-openapi-explorer` | API 路径清单与探索指引 |
| `ziniao-workflow-batch-account` | 批量账号授权工作流 |
| `ziniao-skill-maker` | 自定义 Skill 创建指引 |
## 适用环境
这些 Skill 文档适用于任何支持工具调用的 AI Agent 环境:
- Claude Code
- Cursor
- OpenClaw
- 其他支持 Skill 协议的 Agent
## License
CC BY 4.0
@@ -0,0 +1,183 @@
---
name: ziniao-access-policy
version: 1.0.0
description: "紫鸟访问策略管理:网页访问规则、网页/网页分组、规则生效成员/账号、账号绑定策略的查询和维护。当前无快捷命令,全部通过 ziniao-cli api 直调。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# 访问策略管理
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../ziniao-shared/SKILL.md`](../ziniao-shared/SKILL.md)**
访问策略接口用于管理 ERP 网页访问权限,包括访问规则、网页配置、网页分组,以及账号与访问策略的绑定关系。
当前没有 `access-policy` 快捷命令,全部使用通用 `api` 命令直调。所有接口均为 `POST`、`application/json`,请求体需要显式传 `companyId`。
## 关键枚举
| 字段 | 值 | 说明 |
|------|----|------|
| `activeUser` | `1` | 除 boss 外所有成员 |
| `activeUser` | `2` | 指定成员 |
| `activeUser` | `3` | 指定部门 |
| `activeUser` | `4` | 指定角色 |
| `activeAccount` | `0` | 所有账号 |
| `activeAccount` | `1` | 指定账号 |
| `activeRange` | `1` | 所有网站 |
| `activeRange` | `2` | 指定网址-黑名单 |
| `activeRange` | `3` | 指定网址-白名单 |
| `isActive` | `0` | 禁用 |
| `isActive` | `1` | 启用 |
## 访问规则
| 操作 | API |
|------|-----|
| 规则列表 | `/superbrowser/rest/v1/erp/security/access_rule/list` |
| 规则详情 | `/superbrowser/rest/v1/erp/security/access_rule/detail` |
| 新建规则 | `/superbrowser/rest/v1/erp/security/access_rule/add` |
| 编辑规则 | `/superbrowser/rest/v1/erp/security/access_rule/edit` |
| 删除规则 | `/superbrowser/rest/v1/erp/security/access_rule/delete` |
| 启用/禁用规则 | `/superbrowser/rest/v1/erp/security/access_rule/active` |
| 设置生效成员 | `/superbrowser/rest/v1/erp/security/access_rule/change_user` |
| 设置生效账号 | `/superbrowser/rest/v1/erp/security/access_rule/change_account` |
| 规则可绑定账号列表 | `/superbrowser/rest/v1/erp/security/access_rule/account/bindable_list` |
```bash
# 查询访问规则
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule/list \
--data '{"companyId":123,"page":1,"limit":20}'
# 查看规则详情
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule/detail \
--data '{"companyId":123,"ruleId":456}'
# 删除规则,ruleIds 是数组
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule/delete \
--data '{"companyId":123,"ruleIds":[456]}'
# 启用规则,禁用时 isActive 传 "0"
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule/active \
--data '{"companyId":123,"ruleIds":[456],"isActive":"1"}'
```
设置生效成员接口无快捷命令,需通过 `api` 直调。请求体字段必须按接口文档发送:
| 字段 | 类型 | 说明 |
|------|------|------|
| `ruleId` | number | 规则 ID |
| `activeUser` | number | `1` 除 boss 外所有成员;`2` 指定成员;`3` 指定部门;`4` 指定角色 |
| `userChange.addIds` | string[] | 新增成员 ID 列表;无新增传 `[]` |
| `userChange.addNames` | string[] | 新增成员用户名列表;无新增传 `[]` |
| `userChange.deleteIds` | string[] | 删除成员 ID 列表;无删除传 `[]` |
| `userChange.deleteNames` | string[] | 删除成员用户名列表;无删除传 `[]` |
| `departmentIds` | number[] | 指定部门列表;非部门模式也传 `[]` |
| `roleIds` | number[] | 指定角色列表;非角色模式也传 `[]` |
`addIds` 和 `addNames` 可任选一个传,两者都传时取并集;`deleteIds/deleteNames` 不能与新增列表重复。`companyId` 由 CLI 自动注入,不要在 `--data` 中手动传入公共参数。
```bash
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule/change_user \
--data '{"companyId":123,"ruleId":456,"activeUser":2,"userChange":{"addIds":["1001"],"deleteIds":[],"addNames":[],"deleteNames":[]},"departmentIds":[],"roleIds":[]}'
```
设置生效账号时,`accountChange.addIds` 和 `accountChange.deleteIds` 传账号 ID 字符串数组。
```bash
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule/change_account \
--data '{"companyId":123,"ruleId":456,"activeAccount":1,"accountChange":{"addIds":["2001"],"deleteIds":[]}}'
```
新建/编辑规则的请求体较复杂,核心结构如下:
```json
{
"companyId": 123,
"name": "限制文件下载",
"desc": "运营角色适用",
"activeUser": 2,
"userChange": { "addIds": ["1001"], "addNames": [] },
"departmentIds": [],
"roleIds": [],
"activeAccount": 0,
"accountChange": { "addIds": [] },
"activeRange": "3",
"configs": [
{
"urlId": 789,
"isAccessible": true,
"isLog": true,
"functions": [
{ "function": "file_download", "permission": 3 }
]
}
],
"isSkipRuleConflictCheck": false,
"effectiveTime": { "timeType": "0", "startTime": 0, "endTime": 0 }
}
```
## 网页与网页分组
| 操作 | API |
|------|-----|
| 网页列表 | `/superbrowser/rest/v1/erp/security/access_rule_url/list` |
| 网页详情 | `/superbrowser/rest/v1/erp/security/access_rule_url/detail` |
| 添加网页 | `/superbrowser/rest/v1/erp/security/access_rule_url/add` |
| 编辑网页 | `/superbrowser/rest/v1/erp/security/access_rule_url/edit` |
| 删除网页 | `/superbrowser/rest/v1/erp/security/access_rule_url/delete` |
| 网页修改分组 | `/superbrowser/rest/v1/erp/security/access_rule_url/change_group` |
| 网页分组列表 | `/superbrowser/rest/v1/erp/security/access_rule_url_group/list` |
| 添加网页分组 | `/superbrowser/rest/v1/erp/security/access_rule_url_group/add` |
| 编辑网页分组 | `/superbrowser/rest/v1/erp/security/access_rule_url_group/edit` |
| 删除网页分组 | `/superbrowser/rest/v1/erp/security/access_rule_url_group/delete` |
```bash
# 查询网页列表
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule_url/list \
--data '{"companyId":123,"page":1,"limit":20}'
# 添加网页
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule_url/add \
--data '{"companyId":123,"name":"Amazon后台","groupId":10,"urlPattern":"https://sellercentral.amazon.com/*","desc":"亚马逊后台"}'
# 移动网页到分组,urlIds 是数组
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule_url/change_group \
--data '{"companyId":123,"groupId":10,"urlIds":[789]}'
# 查询分组树,isAll=true 时返回 children
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule_url_group/list \
--data '{"companyId":123,"groupIdParent":0,"isAll":true}'
```
## 账号绑定策略
| 操作 | API |
|------|-----|
| 账号绑定的访问策略列表 | `/superbrowser/rest/v1/erp/security/access_rule/list/one_account` |
| 账号添加访问策略 | `/superbrowser/rest/v1/erp/security/access_rule/account_ref/add_to_account` |
| 账号移除访问策略 | `/superbrowser/rest/v1/erp/security/access_rule/account_ref/remove_from_account` |
```bash
# 查询某账号已绑定的策略
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule/list/one_account \
--data '{"companyId":123,"accountId":"2001","page":1,"limit":20}'
# 给账号添加访问策略
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule/account_ref/add_to_account \
--data '{"companyId":123,"accountId":"2001","ruleIds":[456],"isSkipRuleConflictCheck":false}'
# 从账号移除访问策略
ziniao-cli api /superbrowser/rest/v1/erp/security/access_rule/account_ref/remove_from_account \
--data '{"companyId":123,"accountId":"2001","ruleIds":[456]}'
```
## 注意事项
- `ruleIds`、`urlIds`、`platformIds`、`tagIds`、`departmentIds`、`roleIds` 都是数组,单个值也要包装成数组。
- 成员相关 `addIds/deleteIds/addNames/deleteNames` 是字符串数组;账号相关 `accountChange.addIds/deleteIds` 也是字符串数组。
- 新建规则文档说明 `userChange.addIds` 和 `userChange.addNames` 可任选一个传,两者都传时取并集。
- `configs.functions.permission` 常用值:`1` 允许、`2` 允许并记录、`3` 限制并记录、`6` 限制。`password`、`mouse_click`、`keyboard_input` 只支持 `1`、`6`。
- `request_id` 会由 CLI 输出到 `meta.requestId`,排查接口问题时优先记录该值。
+131
View File
@@ -0,0 +1,131 @@
---
name: ziniao-account
version: 1.1.0
description: "紫鸟账号(店铺)管理:店铺账号的查询、创建、修改、删除、授权和标签管理。当用户需要查看店铺账号列表、创建/修改/删除账号、管理账号授权或标签时使用。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# 账号(店铺)管理
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../ziniao-shared/SKILL.md`](../ziniao-shared/SKILL.md)**
**CRITICAL — Shortcuts 执行前,务必先读取对应的 references/ 说明文档。**
紫鸟的"账号"指浏览器店铺账号(store),不是员工用户。本模块共覆盖 22 个接口,全部已有快捷命令。
> **注意区分:** `account` 命令通过**服务端 API** 管理店铺账号(创建、删除、授权、标签)。如需控制本地浏览器窗口(打开/关闭/导航/截图),请使用 `store` + `page` 命令(走本地 ZClaw Bridge)。
> **获取店铺列表的选择:**
> - 成员账号没有服务端 `account list` 权限,应使用 `store list`(本地 ZClaw Bridge)获取店铺列表。
> - Boss 账号如果目的是打开店铺浏览器,也应优先使用 `store list` 获取本地可用店铺,而非 `account list`。
> - `account list` 适用于需要管理店铺元数据(标签、授权、批量操作)的场景。
> - 成员类型可通过 `ziniao-cli config show` 结果中的 `isBoss` 字段判断。
## Shortcuts — 账号 CRUD
| 命令 | 说明 | 详细文档 |
|------|------|---------|
| `account list` | 查询账号列表 | [`references/ziniao-account-list.md`](references/ziniao-account-list.md) |
| `account create` | 创建账号 | [`references/ziniao-account-create.md`](references/ziniao-account-create.md) |
| `account update` | 编辑账号基础信息 | 只发修改字段:`--id xxx --name "新名"` |
| `account delete` | 删除账号(高风险) | `--id xxx`,逗号分隔可批量,需 `--yes` |
```bash
# 查询
ziniao-cli account list --name "某店" --format table
ziniao-cli account list --page-all
# 创建
ziniao-cli account create --name "我的店铺" --site-id 1 --remark "测试"
# 修改
ziniao-cli account update --id 123 --name "新名称" --site-id 1
# 删除(批量)
ziniao-cli account delete --id "101,102,103" --yes
```
## Shortcuts — 授权管理
| 命令 | 说明 |
|------|------|
| `account auth-add` | 授权员工访问店铺(`--store-id` 和 `--staff-id` 均支持逗号分隔批量) |
| `account auth-remove` | 撤销员工访问权限(`--store-id` 和 `--staff-id` 均支持逗号分隔批量) |
| `account auth-clean` | 清空店铺所有员工授权(高风险) |
| `account auth-list` | 查询某员工被授权的店铺列表 |
| `account auth-users` | 查询某店铺已授权的员工列表 |
```bash
# 批量授权(把 3 个店铺同时授权给 3 个员工)
ziniao-cli account auth-add --store-id "111,222,333" --staff-id "201,202,203"
# 撤销单人
ziniao-cli account auth-remove --store-id 111 --staff-id 201
# 查看某员工被授权的所有店铺
ziniao-cli account auth-list --user-id 201 --page-all --format table
# 清空授权(高风险)
ziniao-cli account auth-clean --store-id 111 --yes
```
## Shortcuts — 标签管理
| 命令 | 说明 |
|------|------|
| `account tag-list` | 查询企业下所有标签 |
| `account tag-of-store --store-id` | 查询某店铺绑定的标签列表 |
| `account tag-create --name` | 创建标签 |
| `account tag-rename --id --name` | 重命名标签 |
| `account tag-delete --id` | 删除标签(高风险) |
| `account tag-bind --tag-id --store-id` | 绑定标签到店铺(`--store-id` 支持批量) |
| `account tag-unbind --tag-id --store-id` | 解绑(`--store-id` 支持批量) |
| `account tag-replace --store-id --tag-ids` | 全量替换店铺的标签集合 |
| `account tag-clear --store-id` | 清空店铺所有标签(高风险) |
| `account tag-remove --tag-id --store-id` | 从指定店铺移除该标签(高风险,`--store-id` 支持批量) |
底层接口与请求体字段必须严格按接口文档发送,不要补发未记录的别名字段。
| 命令 | API | 请求体字段(不含公共 `companyId`) |
|------|-----|------------------------------------------|
| `account tag-list` | `/superbrowser/rest/v1/erp/tag/list` | 无 |
| `account tag-of-store --store-id` | `/superbrowser/rest/v1/store-tag/list` | `storeId`, 可选 `withSystem` |
| `account tag-create --name` | `/superbrowser/rest/v1/store-tag/add` | `tagName` |
| `account tag-rename --id --name` | `/superbrowser/rest/v1/store-tag/rename` | `tid`, `name` |
| `account tag-delete --id` | `/superbrowser/rest/v1/store-tag/delete` | `tagIds` |
| `account tag-bind --tag-id --store-id` | `/superbrowser/rest/v1/store-tag/bind` | `tagIds`, `storeIds` |
| `account tag-unbind --tag-id --store-id` | `/superbrowser/rest/v1/store-tag/unbind` | `tagIds`, `storeIds` |
| `account tag-replace --store-id --tag-ids` | `/superbrowser/rest/v1/store-tag/replace` | `tagIds`, `storeIds` |
| `account tag-clear --store-id` | `/superbrowser/rest/v1/store-tag/clear` | `storeIds` |
| `account tag-remove --tag-id --store-id` | `/superbrowser/rest/v1/store-tag/remove` | `tagIds`, `storeIds` |
```bash
# 查看所有标签
ziniao-cli account tag-list --format table
# 查看某店铺已有标签
ziniao-cli account tag-of-store --store-id 101
# 创建标签后批量绑定到多个店铺
ziniao-cli account tag-create --name "重点店铺"
ziniao-cli account tag-bind --tag-id 99 --store-id "101,102,103"
# 全量替换(将店铺 101 的标签换成 99 和 100)
ziniao-cli account tag-replace --store-id 101 --tag-ids "99,100"
# 从多个店铺移除某个标签
ziniao-cli account tag-remove --tag-id 99 --store-id "101,102" --yes
```
## 通用 api 覆盖(仅剩的接口)
```bash
# 缓存清理(仅此接口无快捷命令)
ziniao-cli api /superbrowser/rest/v1/erp/store/deletecookie --data '{"removeStoreId":"xxx","removeType":1}'
# removeType: 1=清除所有缓存, 2=仅保留 cookie, 3=仅保留二步验证状态
# 账号授权用户列表 / 用户有权限的账号列表
ziniao-cli api /superbrowser/rest/v1/erp/store/user/list --data '{"storeIdList":["xxx"],"page":1,"limit":10}'
ziniao-cli api /superbrowser/rest/v1/erp/user/stores --data '{"userId":"xxx","page":1,"limit":10}'
```
@@ -0,0 +1,43 @@
# account create
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md)。
创建店铺账号。写入操作。CLI 将嵌套的 `storeData` 数组展平为命名 flag。
## 命令
```bash
ziniao-cli account create --name "新店铺"
ziniao-cli account create --name "US Store" --site-id 123 --proxy-id 456
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--name` | 是 | 账号名称 |
| `--site-id` | 否 | 平台 ID |
| `--proxy-id` | 否 | 代理设备 ID |
| `--group-id` | 否 | 分组 ID |
| `--remark` | 否 | 备注 |
## 底层 API(快捷命令不可用时的兜底)
```bash
ziniao-cli api /superbrowser/rest/v1/erp/store/create \
--data '{"storeData":[{"name":"新店铺","siteId":123}]}'
```
**注意事项:**
- `storeData` 必须是**数组**,即使只创建一个店铺
- 字段名是 `name`(不是 `storeName`)
- 在 **Windows Git Bash** 中,以 `/` 开头的路径会被自动转换为本地文件路径,需加环境变量:
```bash
MSYS_NO_PATHCONV=1 ziniao-cli api /superbrowser/rest/v1/erp/store/create \
--data '{"storeData":[{"name":"新店铺"}]}'
```
- 在 **PowerShell** 或 **CMD** 中无此问题
## 参考
- [ziniao-account](../SKILL.md) — 账号管理全部命令
@@ -0,0 +1,30 @@
# account list
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md)。
查询账号列表。只读操作,支持分页和按名称搜索。
## 命令
```bash
ziniao-cli account list
ziniao-cli account list --format table
ziniao-cli account list --name "Rosehut"
ziniao-cli account list --page-all --page-size 50
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--name` | 否 | 按名称搜索 |
| `--page-size` | 否 | 每页条数(默认 20) |
| `--page-all` | 否 | 自动翻页获取全部 |
| `--page-limit` | 否 | 最大翻页数(默认 10,0 为不限) |
| `--page-delay` | 否 | 翻页间隔毫秒数(默认 200) |
| `--format` | 否 | json \| table \| csv |
| `--jq` | 否 | jq 过滤表达式 |
## 参考
- [ziniao-account](../SKILL.md) — 账号管理全部命令
@@ -0,0 +1,74 @@
---
name: ziniao-department
version: 1.0.0
description: "紫鸟部门管理:部门的查询、创建、修改、删除和排序。当用户需要查看组织架构、创建/修改/删除部门、调整部门排序时使用。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# 部门管理
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../ziniao-shared/SKILL.md`](../ziniao-shared/SKILL.md),其中包含认证、错误处理和安全规则**
**CRITICAL — 所有 Shortcuts 在执行之前,务必先用 Read 工具读取其对应的 references/ 说明文档,禁止直接盲目调用命令。**
## 核心场景
### 查看组织架构
用户想了解公司部门结构时,使用 `--tree` 展示层级关系:
```bash
ziniao-cli department list --tree
```
输出树形结构:
```
├── 技术部 (id: 15868464646076)
│ ├── 前端组 (id: 15954943062431)
│ └── 后端组 (id: 15954943062432)
└── 市场部 (id: 15868464646077)
```
### 创建部门
`hierarchy` 由 CLI 自动推算(查父部门层级 +1),用户无需关心:
```bash
# 在已有部门下创建子部门(parentId 必须为已存在的部门 ID,不支持传 0)
ziniao-cli department create --name "华东区" --parent-id 15868464646076
```
> ⚠ `--parent-id` 不能传 0,必须传已存在的父部门 ID。如需查询可用的父部门 ID,先执行 `department list --tree`。
### 危险操作
删除部门是 `high-risk-write`,会要求确认。**删除父部门会级联删除所有子部门,且不可恢复。** 删除前建议先检查是否有子部门或员工:
```bash
ziniao-cli department list --tree # 检查子部门
ziniao-cli staff list --department-id xxx # 检查是否有员工
ziniao-cli department delete --id xxx # 执行删除(需确认)
```
## Shortcuts
| 命令 | 说明 | 详细文档 |
|------|------|---------|
| `department list` | 查询部门列表 | [`references/ziniao-department-list.md`](references/ziniao-department-list.md) |
| `department create` | 新增部门 | [`references/ziniao-department-create.md`](references/ziniao-department-create.md) |
| `department update` | 修改部门 | 只发修改字段:`--id xxx --name "新名"` |
| `department delete` | 删除部门(子部门及员工归属将被清除) | `high-risk-write`,`--yes` 跳过确认 |
| `department reorder` | 调整排序 | `--parent-id xxx --order "id1,id2,id3"` |
## 通用 api 覆盖
所有部门接口也可通过通用 api 命令调用:
```bash
ziniao-cli api /superbrowser/rest/v1/erp/department/list
ziniao-cli api /superbrowser/rest/v1/erp/department/add --data '{"name":"xxx","parentId":"<父部门ID>","hierarchy":"0"}'
ziniao-cli api /superbrowser/rest/v1/erp/department/update --data '{"id":"xxx","name":"新名"}'
ziniao-cli api /superbrowser/rest/v1/erp/department/delete --data '{"id":"xxx"}'
ziniao-cli api /superbrowser/rest/v1/erp/department/order --data '{"parentId":"xxx","order":["id1","id2"]}'
```
@@ -0,0 +1,31 @@
# department create
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md) 了解认证和安全规则。
新增部门。写入操作。
## 命令
```bash
# 创建顶级部门
ziniao-cli department create --name "市场部"
# 创建子部门(hierarchy 自动推算)
ziniao-cli department create --name "华东区" --parent-id 15868464646076
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--name` | 是 | 部门名称 |
| `--parent-id` | 否 | 父部门 ID(默认 "0" 表示顶级部门) |
## 智能推算
- `hierarchy` 由 CLI 自动推算:无 `--parent-id` 则 `hierarchy=0`;有则查父部门层级 +1
- 用户无需关心 `hierarchy` 参数
## 参考
- [ziniao-department](../SKILL.md) — 部门管理全部命令
@@ -0,0 +1,54 @@
# department list
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md) 了解认证和安全规则。
查询部门列表。只读操作。
## 命令
```bash
# 默认 JSON 输出
ziniao-cli department list
# 树形展示
ziniao-cli department list --tree
# 表格输出
ziniao-cli department list --format table
# jq 过滤顶级部门
ziniao-cli department list --jq '.[] | select(.parentId == 0)'
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--tree` | 否 | 以树形结构展示部门层级(按 parentId 关系渲染) |
| `--format` | 否 | 输出格式:json(默认)\| table \| csv |
| `--jq` / `-q` | 否 | jq 过滤表达式 |
## 输出字段
| 字段 | 说明 |
|------|------|
| `id` | 部门 ID |
| `name` | 部门名称 |
| `parentId` | 父部门 ID(0 表示顶级) |
| `hierarchy` | 层级深度 |
## 树形输出格式
当使用 `--tree` 时,按层级渲染:
```
├── 部门名 (id: 123)
│ ├── 子部门 (id: 456)
│ └── 子部门 (id: 789)
└── 其他部门 (id: 101)
```
## 参考
- [ziniao-department](../SKILL.md) — 部门管理全部命令
- [ziniao-shared](../../ziniao-shared/SKILL.md) — 认证和全局参数
+104
View File
@@ -0,0 +1,104 @@
---
name: ziniao-device
version: 1.1.0
description: "紫鸟设备管理:代理设备(IP)的查询、添加、修改、绑定/解绑、购买续费和自动续费。当用户需要查看代理设备列表、添加/修改自有代理、绑定设备到店铺或管理设备费用时使用。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# 设备管理
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../ziniao-shared/SKILL.md`](../ziniao-shared/SKILL.md)**
管理紫鸟浏览器使用的代理设备(IP)。常用 9 个接口已有快捷命令覆盖;价格查询、历史绑定记录使用通用 `api` 命令。
## 代理类型映射
| CLI 值 | API 值 | 说明 |
|--------|--------|------|
| http | 0 | HTTP 代理 |
| https | 1 | HTTPS 代理 |
| socks5 | 2 | SOCKS5 代理 |
| ssh | 3 | SSH 隧道 |
| ssl | 4 | SSL 代理 |
## Shortcuts — 查询与自有设备
| 命令 | 说明 | 详细文档 |
|------|------|---------|
| `device list` | 查询设备列表 | [`references/ziniao-device-list.md`](references/ziniao-device-list.md) |
| `device add-custom` | 添加自有设备 | [`references/ziniao-device-add-custom.md`](references/ziniao-device-add-custom.md) |
| `device update-custom` | 修改自有设备 | 部分更新:`--id xxx --addr "1.2.3.4"` |
```bash
ziniao-cli device list --format table
ziniao-cli device list --page-all
ziniao-cli device add-custom --name "我的代理" --proxy-type socks5 \
--addr "1.2.3.4" --port 1080 --proxy-user admin --proxy-pass secret
ziniao-cli device update-custom --id 123 --addr "5.6.7.8"
```
底层接口:设备列表 `/superbrowser/rest/v1/erp/ip/page`;添加自有设备 `/superbrowser/rest/v1/erp/ip/self/add/new`;修改自有设备 `/superbrowser/rest/v1/erp/ip/self/edit/new`。
## Shortcuts — 绑定管理
| 命令 | 说明 |
|------|------|
| `device bind --id --store-id` | 将设备绑定到店铺(`--store-id` 支持批量) |
| `device unbind --store-id` | 按店铺 ID 解绑设备(`--store-id` 支持批量) |
```bash
# 将设备 10 绑定到三个店铺
ziniao-cli device bind --id 10 --store-id "101,102,103"
# 批量解绑
ziniao-cli device unbind --store-id "101,102,103"
```
> ⚠ 批量解绑为逐个执行,部分失败不影响已成功项,也不会回滚。
底层接口:绑定 `/superbrowser/rest/v1/erp/ip/bind`;解绑 `/superbrowser/rest/v1/erp/ip/unbind`。
## Shortcuts — 费用相关(涉及真实扣费)
> ⚠ `purchase` 和 `renew` 为 `high-risk-write`,执行前会要求确认或需传 `--yes`。
| 命令 | 说明 |
|------|------|
| `device plan-list` | 查询可购买的套餐列表(先看这里) |
| `device purchase --plan-id --period-id --count` | 购买套餐(涉及费用,不可撤销) |
| `device renew --id --period-id` | 续费设备(`--id` 支持批量,涉及费用) |
| `device auto-renew --id --enable` | 批量开启/关闭自动续费 |
```bash
# 先查套餐,再购买
ziniao-cli device plan-list --format table
ziniao-cli device purchase --plan-id "plan_xxx" --period-id 1 --count 3
# 续费单台
ziniao-cli device renew --id 10 --period-id 1
# 批量开启自动续费
ziniao-cli device auto-renew --id "10,11,12" --enable true
# 关闭自动续费(bool 类型必须用等号连接)
ziniao-cli device auto-renew --id "10,11,12" --enable=false
# 关闭自动续费
ziniao-cli device auto-renew --id 10 --enable=false
```
底层接口:套餐 `/superbrowser/rest/v1/erp/package/new`;购买 `/superbrowser/rest/v1/erp/purchase`;续费 `/superbrowser/rest/v1/erp/renew`;自动续费 `/superbrowser/rest/v1/erp/ip/renewal`。
## 通用 api 覆盖
```bash
# 查询已购设备价格
ziniao-cli api /superbrowser/rest/v1/erp/proxy/purchased_package_info --data '{"proxyId":"123"}'
# 查询设备历史绑定记录
ziniao-cli api /superbrowser/rest/v1/erp/ip/historybind --data '{"proxyId":"123"}'
```
@@ -0,0 +1,52 @@
# device add-custom
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md)。
添加自有代理设备。CLI 将嵌套的 `proxy` 对象展平为命名 flag。
底层 API:`/superbrowser/rest/v1/erp/ip/self/add/new`
## 命令
```bash
# 基础用法
ziniao-cli device add-custom \
--name "美国代理1" \
--proxy-type socks5 \
--addr "1.2.3.4" \
--port 1080
# 带认证
ziniao-cli device add-custom \
--name "美国代理1" \
--proxy-type socks5 \
--addr "1.2.3.4" \
--port 1080 \
--proxy-user admin \
--proxy-pass secret
# 动态 IP
ziniao-cli device add-custom \
--name "动态代理" \
--proxy-type http \
--addr "proxy.example.com" \
--port 8080 \
--dynamic
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--name` | 是 | 设备名称 |
| `--proxy-type` | 是 | http \| https \| socks5 \| ssh \| ssl |
| `--addr` | 是 | 代理地址 |
| `--port` | 是 | 代理端口 |
| `--proxy-user` | 否 | 代理用户名 |
| `--proxy-pass` | 否 | 代理密码 |
| `--dynamic` | 否 | 是否动态 IP |
| `--defy-warning` | 否 | 是否无视风险导入:1=是,0=否,默认 1 |
## 参考
- [ziniao-device](../SKILL.md) — 设备管理全部命令
@@ -0,0 +1,29 @@
# device list
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md)。
查询设备列表。只读操作。
底层 API:`/superbrowser/rest/v1/erp/ip/page`
## 命令
```bash
ziniao-cli device list
ziniao-cli device list --format table
ziniao-cli device list --page-all
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--page-size` | 否 | 每页条数(默认 20) |
| `--page-all` | 否 | 自动翻页获取全部 |
| `--page-limit` | 否 | 最大翻页数(默认 10,0 为不限) |
| `--page-delay` | 否 | 翻页间隔毫秒数(默认 200) |
| `--format` | 否 | json \| table \| csv |
## 参考
- [ziniao-device](../SKILL.md) — 设备管理全部命令
@@ -0,0 +1,137 @@
---
name: ziniao-openapi-explorer
version: 1.1.0
description: "紫鸟 API 探索:当现有快捷命令无法满足需求时,通过通用 api 命令和已知路径清单探索紫鸟全部 73 个 API 接口。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# API 探索
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../ziniao-shared/SKILL.md)。
当用户的需求**无法被现有快捷命令覆盖**时,使用本技能查找对应的 API 路径并通过 `ziniao-cli api` 裸调。
## 探索流程
### Step 1: 确认现有命令不足
```bash
ziniao-cli department --help
ziniao-cli staff --help
ziniao-cli account --help
ziniao-cli device --help
ziniao-cli role --help
```
如果已有对应快捷命令,直接使用。
### Step 2: 从路径清单定位 API
**禁止猜测 API 路径**,必须从以下清单中查找。
#### 部门(5 个)✅ 全部已有快捷命令
| 操作 | 路径 | 快捷命令 |
|------|------|---------|
| 列表 | `/superbrowser/rest/v1/erp/department/list` | `department list` |
| 新增 | `/superbrowser/rest/v1/erp/department/add` | `department create` |
| 修改 | `/superbrowser/rest/v1/erp/department/update` | `department update` |
| 删除 | `/superbrowser/rest/v1/erp/department/delete` | `department delete` |
| 排序 | `/superbrowser/rest/v1/erp/department/order` | `department reorder` |
#### 员工(5 个)✅ 全部已有快捷命令
| 操作 | 路径 | 快捷命令 |
|------|------|---------|
| 列表 | `/superbrowser/rest/v1/erp/staff/list` | `staff list` |
| 新增 | `/superbrowser/rest/v2/erp/staff/add` | `staff create` |
| 修改 | `/superbrowser/rest/v2/erp/staff/modify` | `staff update` |
| 状态 | `/superbrowser/rest/v1/erp/staff/status` | `staff enable/disable/remove` |
| 调岗 | `/superbrowser/rest/v1/erp/staff/department` | `staff transfer` |
#### 账号(23 个)— 仍有 4 个需用 `api`
| 分类 | 路径前缀 | 快捷命令 |
|------|---------|---------|
| CRUD | `/superbrowser/rest/v1/erp/store/list\|create\|update/base\|delete` | `account list/create/update/delete` |
| 缓存 | `/superbrowser/rest/v1/erp/store/deletecookie` | `api` |
| 授权 | `/superbrowser/rest/v1/erp/store/auth/add\|delete\|clean`、`/superbrowser/rest/v1/erp/user/stores`、`/superbrowser/rest/v1/erp/store/user/list` | `account auth-*` |
| 授权查询 | `/superbrowser/rest/v1/erp/store/auth/query` | `api` |
| 用户账号 | `/superbrowser/rest/v1/erp/store/list/by/user` | `api` |
| 附加信息 | `/superbrowser/rest/v1/erp/store/addtion` | `api` |
| 标签 | `/superbrowser/rest/v1/erp/tag/list`、`/superbrowser/rest/v1/store-tag/add\|delete\|rename\|bind\|unbind\|replace\|clear\|remove\|list` | `account tag-*` |
#### 设备(11 个)— 仍有 2 个需用 `api`
| 分类 | 路径前缀 | 快捷命令 |
|------|---------|---------|
| 查询 | `/superbrowser/rest/v1/erp/ip/page`、`/superbrowser/rest/v1/erp/proxy/purchased_package_info`、`/superbrowser/rest/v1/erp/ip/historybind` | `device list`(price/history 用 `api`)|
| 套餐 | `/superbrowser/rest/v1/erp/package/new` | `device plan-list` |
| 购买 | `/superbrowser/rest/v1/erp/purchase\|renew` | `device purchase/renew` |
| 自有 | `/superbrowser/rest/v1/erp/ip/self/add/new\|edit/new` | `device add-custom/update-custom` |
| 绑定 | `/superbrowser/rest/v1/erp/ip/bind\|unbind\|renewal` | `device bind/unbind/auto-renew` |
#### 角色(7 个)✅ 全部已有快捷命令
| 操作 | 路径 | 快捷命令 |
|------|------|---------|
| 列表 | `/superbrowser/rest/v1/erp/per/role/list` | `role list` |
| 详情 | `/superbrowser/rest/v1/erp/per/role/detail` | `role detail` |
| 新增 | `/superbrowser/rest/v1/erp/per/role/add` | `role create` |
| 修改 | `/superbrowser/rest/v1/erp/per/role/edit` | `role update` |
| 分配 | `/superbrowser/rest/v1/erp/staff/change/role` | `role assign` |
| 用户角色 | `/superbrowser/rest/v1/erp/staff/role/list` | `role staff-roles` |
| 权限列表 | `/superbrowser/rest/v1/erp/per/permission/list` | `role permissions` |
#### 访问策略(22 个)— 全部需用 `api`
| 分类 | 路径 |
|------|------|
| 规则 | `/superbrowser/rest/v1/erp/security/access_rule/list` |
| 规则 | `/superbrowser/rest/v1/erp/security/access_rule/detail` |
| 规则 | `/superbrowser/rest/v1/erp/security/access_rule/add` |
| 规则 | `/superbrowser/rest/v1/erp/security/access_rule/edit` |
| 规则 | `/superbrowser/rest/v1/erp/security/access_rule/delete` |
| 规则 | `/superbrowser/rest/v1/erp/security/access_rule/active` |
| 规则成员 | `/superbrowser/rest/v1/erp/security/access_rule/change_user` |
| 规则账号 | `/superbrowser/rest/v1/erp/security/access_rule/change_account` |
| 规则账号 | `/superbrowser/rest/v1/erp/security/access_rule/account/bindable_list` |
| 网页 | `/superbrowser/rest/v1/erp/security/access_rule_url/list` |
| 网页 | `/superbrowser/rest/v1/erp/security/access_rule_url/detail` |
| 网页 | `/superbrowser/rest/v1/erp/security/access_rule_url/add` |
| 网页 | `/superbrowser/rest/v1/erp/security/access_rule_url/edit` |
| 网页 | `/superbrowser/rest/v1/erp/security/access_rule_url/delete` |
| 网页 | `/superbrowser/rest/v1/erp/security/access_rule_url/change_group` |
| 网页分组 | `/superbrowser/rest/v1/erp/security/access_rule_url_group/list` |
| 网页分组 | `/superbrowser/rest/v1/erp/security/access_rule_url_group/add` |
| 网页分组 | `/superbrowser/rest/v1/erp/security/access_rule_url_group/edit` |
| 网页分组 | `/superbrowser/rest/v1/erp/security/access_rule_url_group/delete` |
| 账号策略 | `/superbrowser/rest/v1/erp/security/access_rule/list/one_account` |
| 账号策略 | `/superbrowser/rest/v1/erp/security/access_rule/account_ref/add_to_account` |
| 账号策略 | `/superbrowser/rest/v1/erp/security/access_rule/account_ref/remove_from_account` |
### Step 3: 使用 dry-run 探索
```bash
# 先预览请求
ziniao-cli api /superbrowser/rest/v1/erp/per/role/list --dry-run
# 确认后执行
ziniao-cli api /superbrowser/rest/v1/erp/per/role/list
```
## 安全规则
- **禁止猜测** API 路径或参数,必须从清单中查找
- 写入/删除类操作前确认用户意图
- 建议先用 `--dry-run` 预览
## 参考
- [ziniao-shared](../ziniao-shared/SKILL.md) — 认证和全局参数
- [ziniao-account](../ziniao-account/SKILL.md) — 账号/授权/标签快捷命令
- [ziniao-device](../ziniao-device/SKILL.md) — 设备管理快捷命令
- [ziniao-role](../ziniao-role/SKILL.md) — 角色管理快捷命令
- [ziniao-skill-maker](../ziniao-skill-maker/SKILL.md) — 如需将常用 API 固化为新 Skill
+54
View File
@@ -0,0 +1,54 @@
---
name: ziniao-page
description: "Use when a request concerns a webpage running inside an already-opened 紫鸟/ZClaw store browser, including navigation, inspection, interaction, extraction, or screenshots. If the task starts by identifying or opening a store, use ziniao-store first."
metadata:
requires:
bins: ["ziniao-cli"]
---
# 紫鸟页面能力
本技能负责已打开紫鸟店铺浏览器中的通用网页资源操作,不负责店铺生命周期,也不定义用户的业务流程。
## 负责范围
- 对当前店铺浏览器中的网页进行通用操作或读取。
- 在页面操作中复用已确认的 `store-id`,必要时指定 `target-id`。
- 根据页面状态选择 CLI 已提供的页面命令;参数以 `ziniao-cli page <command> --help` 为准。
- 页面操作需要复杂编排时,按需读取 automation reference。
## 路由边界
- 已有店铺浏览器并且目标是网页资源:直接使用本技能。
- 任务尚未确定或打开店铺:转到 `ziniao-store`,不要自行猜测店铺 ID。
- 不要把用户的业务目标或任务参数写入技能;这些是用户任务,由模型组合通用页面能力完成。
- 配置、认证、Bridge、客户端或网络异常:按需读取 `ziniao-shared` 的诊断规则,不在本技能重复维护环境修复流程。
## 最小执行规则
1. 确认店铺已打开,并取得有效 `store-id`;页面命令通常都需要它。
2. 先确认当前页面状态,再执行必要的页面操作;页面变化后不要复用失效的目标或定位信息。
3. 对导航、等待、读取、交互、提取和截图等能力,直接使用 CLI 的对应命令;不确定参数时先看 `--help`。
4. 涉及附件或图片上传时,在下载、路径转换或上传调用前,必须完整读取 [page upload 安全规则](references/ziniao-page-upload.md);未读取不得执行上传。
5. 只在当前任务需要时读取 reference,不要默认读取全部页面文档。
6. 报错时区分页面/目标定位问题和环境问题;环境问题再转 `ziniao-shared`/`doctor`。
## 页面读取与定位顺序
1. 页面状态、`target-id` 和稳定 CSS selector 已知时,直接复用并执行必要操作;不要为每一步重复读取页面。
2. 需要理解页面或验证导航、搜索、提交结果时,优先使用 `page content --content-format structured`;只需 URL/title 时也可使用 `page exec`。
3. selector 未知时,先使用 `page content`、`page query` 或 `page exec` 分析 DOM,再使用 `page input` / `page click --selector`。
4. 只有上传控件、自定义或图标控件、多个相似控件存在歧义,或上述 DOM 方法仍无法唯一定位时,才使用 `page snapshot` 和当前页面 ref。
`page snapshot` 不是通用页面状态检查命令。不得为了验证店铺窗口、读取 URL/title/`target-id`、操作已知 selector、普通搜索或结果验证而调用 snapshot;页面未变化时也不得重复创建 snapshot/ref。snapshot ref 只属于当前店铺、tab 和页面,页面导航或刷新后不得复用。
输入后提交只能选择一种方式:使用 `page input --submit` 后等待并验证结果,或不传 `--submit` 再执行提交按钮的 `page click --wait-nav`;不得重复提交。
## 按需参考
- [page visit](references/ziniao-page-visit.md):需要导航时读取。
- [page screenshot](references/ziniao-page-screenshot.md):需要截图时读取。
- [page upload 安全规则](references/ziniao-page-upload.md):涉及附件、图片、文件输入框或 `page upload` 时必须读取。
- [automation run](references/ziniao-page-automation.md):需要多步骤自动化时读取。
- `ziniao-store`:需要确定或打开店铺时使用。
- `ziniao-shared`:仅在环境、配置、认证或 Bridge 诊断时读取。
@@ -0,0 +1,132 @@
# automation run
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md)。紫鸟浏览器必须已启动,且店铺已打开。
执行多步骤自动化流程。将多个页面操作编排为一条命令执行,减少多次调用的开销。
## 命令
```bash
ziniao-cli automation run --steps '[
{"type": "visit", "url": "https://example.com", "waitUntil": "networkidle"},
{"type": "wait", "selector": "#login"},
{"type": "click", "selector": "#login"},
{"type": "input", "selector": "#username", "text": "admin", "clear": true},
{"type": "input", "selector": "#password", "text": "pass123", "clear": true},
{"type": "click", "selector": "#submit", "waitForNavigation": true},
{"type": "screenshot", "fullPage": true, "path": "./result.png"}
]'
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--steps` | 是 | 步骤 JSON 数组 |
## 步骤类型及字段
### visit — 导航到 URL
| 字段 | 必填 | 说明 |
|------|------|------|
| `url` | 是 | 目标 URL |
| `waitUntil` | 否 | 等待条件: domcontentloaded / load / networkidle |
| `timeoutMs` | 否 | 超时毫秒数 |
### click — 点击元素
| 字段 | 必填 | 说明 |
|------|------|------|
| `selector` | 是 | CSS 选择器 |
| `waitForNavigation` | 否 | 点击后等待导航完成 |
| `timeoutMs` | 否 | 超时毫秒数 |
### input — 输入文本
| 字段 | 必填 | 说明 |
|------|------|------|
| `selector` | 是 | CSS 选择器 |
| `text` | 是 | 要输入的文本 |
| `clear` | 否 | 输入前清空已有内容 |
| `submit` | 否 | 输入后提交表单 |
| `timeoutMs` | 否 | 超时毫秒数 |
### scroll — 滚动页面
| 字段 | 必填 | 说明 |
|------|------|------|
| `x` | 否 | 水平滚动像素 |
| `y` | 否 | 垂直滚动像素 |
| `selector` | 否 | 滚动目标元素选择器 |
| `behavior` | 否 | 滚动行为: auto / smooth |
### screenshot — 截图
| 字段 | 必填 | 说明 |
|------|------|------|
| `fullPage` | 否 | 全页截图 |
| `path` | 否 | 保存路径 |
### wait — 等待
| 字段 | 必填 | 说明 |
|------|------|------|
| `selector` | 否* | 等待元素出现(与 timeout 二选一) |
| `timeout` | 否* | 延时毫秒数(与 selector 二选一) |
| `timeoutMs` | 否 | 等待超时上限 |
### exec — 执行 JavaScript
| 字段 | 必填 | 说明 |
|------|------|------|
| `script` | 是 | JavaScript 代码 |
| `timeoutMs` | 否 | 超时毫秒数 |
## 使用示例
### 登录流程
```bash
ziniao-cli automation run --steps '[
{"type": "visit", "url": "https://sellercentral.amazon.com", "waitUntil": "networkidle"},
{"type": "input", "selector": "#ap_email", "text": "seller@example.com", "clear": true},
{"type": "input", "selector": "#ap_password", "text": "password123", "clear": true},
{"type": "click", "selector": "#signInSubmit", "waitForNavigation": true},
{"type": "screenshot", "fullPage": true}
]'
```
### 滚动加载 + 截图
```bash
ziniao-cli automation run --steps '[
{"type": "visit", "url": "https://www.amazon.com/dp/B0XXXXX", "waitUntil": "networkidle"},
{"type": "scroll", "y": 500, "behavior": "smooth"},
{"type": "wait", "timeout": 1000},
{"type": "scroll", "y": 1000, "behavior": "smooth"},
{"type": "wait", "timeout": 1000},
{"type": "screenshot", "fullPage": true, "path": "./listing-full.png"}
]'
```
### 提取数据后截图确认
```bash
ziniao-cli automation run --steps '[
{"type": "visit", "url": "https://example.com/dashboard", "waitUntil": "networkidle"},
{"type": "wait", "selector": ".data-table"},
{"type": "exec", "script": "document.querySelector('.data-table').style.border = '2px solid red'"},
{"type": "screenshot", "path": "./dashboard.png"}
]'
```
## 注意事项
- steps 必须为合法 JSON 数组,建议用单引号包裹避免转义问题
- 步骤按顺序执行,任何一步失败会终止后续步骤
- 复杂的条件逻辑(if/else)不适合用 automation run,应拆分为多条单独命令由 Agent 控制
## 参考
- [ziniao-page](../SKILL.md) — 页面操作全部命令
@@ -0,0 +1,35 @@
# page screenshot
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md)。店铺必须已打开。
对当前页面截图。
## 命令
```bash
# 视口截图
ziniao-cli page screenshot --store-id abc123
# 全页截图
ziniao-cli page screenshot --store-id abc123 --full-page
# 保存到指定路径
ziniao-cli page screenshot --store-id abc123 --path "./output.png"
# 指定超时
ziniao-cli page screenshot --store-id abc123 --timeout 10000
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--store-id` | 是 | 店铺 ID |
| `--full-page` | 否 | 全页截图(默认仅视口) |
| `--path` | 否 | 保存路径 |
| `--timeout` | 否 | 超时毫秒数 |
| `--target-id` | 否 | 目标页面 ID(多 tab 时指定) |
## 参考
- [ziniao-page](../SKILL.md) — 页面操作全部命令
@@ -0,0 +1,55 @@
# page upload 安全规则
页面附件或图片上传属于写操作。执行任何下载、路径转换、文件选择或上传调用前,先完成来源、页面目标和用户确认检查。
## 来源边界
- `page upload` 只接受用户提供的本地文件路径。
- 若附件来源是 `http://` 或 `https://` URL,立即停止上传并原样回复:
> 暂不支持从 URL 上传附件,请提供本地文件路径。
- 不得先下载、复制、缓存或转换 URL 内容,再把生成的本地文件当作可信来源上传。用户要求跳过该限制也不能改变来源边界。
- 不得把导航 URL、页面链接或下载链接解释为附件路径。
## 页面与控件定位
1. 上传前确认当前 `store-id`、当前页面和唯一 `target-id`。多个可用标签页而用户未指定目标时,停止并让用户确认,不得任意选择。
2. 只使用当前页面快照产生的 ref。页面 reload、URL 变化、标签页切换或 ref 失效后,重新执行 `page snapshot`。
3. 上传控件不唯一时,根据当前快照的可访问名称和上下文,通过 `--trigger-ref` 或 `--hint` 消歧;不要先单独点击上传入口,也不要猜测泛选择器。
错误处理:
- `PAGE_TARGET_AMBIGUOUS`:重新获取当前页面快照并确定唯一 `target-id`;不得任意选择其他标签页。
- `PAGE_TARGET_NOT_FOUND`:原目标已失效;重新获取当前店铺快照,不得回退到其他标签页。
- `UPLOAD_CONTROL_NOT_DISCOVERED`:重新快照检查动态上传入口;仍未发现时停止并报告。
- `UPLOAD_CONTROL_AMBIGUOUS`:使用当前快照的 `--trigger-ref` 或 `--hint` 消歧;仍无法唯一确认时停止并让用户选择。
## 外部本地路径确认
当下载目录外的本地路径返回 `confirmationRequired` 时:
本轮最终用户可见回复必须是一个不可拆分的确认包,并按以下顺序同时包含:
1. 原样输出完整 `confirmationMessage`,不得摘要、改写或删除字段。
2. 紧接着实际显示 `screenshotFilePath` 指向的截图。
3. 明确说明文件尚未上传。
4. 最后等待用户按照 `confirmationMessage` 的要求明确确认。
仅调用图片读取工具、仅在中间进度消息或折叠区域显示图片、或只输出截图路径,均不算已经向用户展示截图。结束本轮前必须确认最终回复中同时可见完整确认文字和实际截图。
截图无法读取或无法在最终回复中展示时,本轮不得索要确认,也不得重试上传。用户明确确认后,只以相同的 `store-id`、`target-id`、文件来源、目标控件和上传意图,追加原响应的 `--confirmation-token <token>` 重试一次。不得换标签页、换文件、换控件或改写来源。先前的笼统授权或“无需再确认”不能替代本次确认。
页面、店铺会话或任一上传参数发生变化时,原 token 不再用于新的上传意图;重新开始定位和确认流程。
## 结果判定与重试
上传命令的结果只描述文件控件状态,不能单独证明网站业务提交完成:
- `confirmationRequired=true` 或 `stage=confirmation_pending`:尚未获得上传授权;不得声称已上传。
- `attached=true, stage=input_attached`:文件仍在网页文件输入控件中;继续根据页面可见文件名、缩略图、进度或错误提示验证。
- `attached=true, stage=input_consumed`:网页组件已接收并消费或清空输入;仍需等待页面可见的处理结果。
- `attached=false, stage=input_unverified`:CDP 已执行但页面是否接收无法确认;不得报告成功或失败,也不得自动重试。先通过新快照、截图、文件名、进度或错误提示确认;只有页面明确失败,或把本次不确定结果告知用户后用户再次明确要求时才重试。任务开始前的笼统授权不构成这次重试授权。
- `UPLOAD_ATTACH_VERIFY_FAILED`:重新快照并检查页面可见状态;不得盲目重试或声称成功。
只有页面出现与目标文件对应的可见业务结果,才能报告网站侧上传完成。文件进入控件、命令退出码为 0、`attached=true` 或 `input_consumed` 都不是业务完成证明。
@@ -0,0 +1,37 @@
# page visit
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md)。店铺必须已打开。
导航到指定 URL。
## 命令
```bash
ziniao-cli page visit --store-id abc123 --url "https://www.amazon.com"
# 等待 networkidle 后再返回
ziniao-cli page visit --store-id abc123 --url "https://www.amazon.com" --wait-until networkidle
# 指定超时
ziniao-cli page visit --store-id abc123 --url "https://www.amazon.com" --timeout 60000
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--store-id` | 是 | 店铺 ID |
| `--url` | 是 | 目标 URL |
| `--wait-until` | 否 | 等待条件: domcontentloaded \| load \| networkidle |
| `--timeout` | 否 | 超时毫秒数 |
| `--target-id` | 否 | 目标页面 ID(多 tab 时指定) |
## 提示
- 导航后建议用 `page wait-nav` 等待页面加载完成
- 可用 `page content` 获取页面内容确认是否到达目标页面
- `--wait-until networkidle` 适合 SPA 页面,等待所有网络请求完成
## 参考
- [ziniao-page](../SKILL.md) — 页面操作全部命令
+94
View File
@@ -0,0 +1,94 @@
---
name: ziniao-role
version: 1.0.0
description: "紫鸟角色管理:角色的查询、创建、修改、分配和权限查看。当用户需要查看角色列表、创建/修改角色、将角色分配给员工或查看角色成员时使用。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# 角色管理
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../ziniao-shared/SKILL.md`](../ziniao-shared/SKILL.md)**
管理紫鸟 ERP 中的角色(权限组)。角色决定员工能看到哪些功能、能操作哪些店铺。
创建员工时需要传入 `--role-id`,可通过 `role list` 获取。
## Shortcuts
| 命令 | 说明 |
|------|------|
| `role list` | 查询所有角色 |
| `role detail --id` | 查看角色详情(含权限列表) |
| `role create --name --identity-id --permission-ids` | 创建角色 |
| `role update --id --name --identity-id --permission-ids` | 修改角色(需全量提交,不传的字段可能被清空) |
| `role assign --role-id --staff-id` | 将角色分配给员工(`--staff-id` 支持批量) |
| `role staff-roles --staff-id` | 查看某员工已分配的角色列表 |
| `role permissions --identity-id` | 查看指定身份的可用权限项 |
## 核心场景
### 查看角色与权限
```bash
# 查询所有角色(先获取 role-id)
ziniao-cli role list --format table
# 查看某角色详情
ziniao-cli role detail --id 123
# 查看系统支持的全部权限项(创建角色前先查)
ziniao-cli role permissions --identity-id 2
```
### 创建与修改角色
```bash
# 创建角色(权限使用权限 ID,多个权限用逗号分隔)
ziniao-cli role create --name "店铺运营" --identity-id 2 --permission-ids "100,101" --desc "负责日常店铺操作"
# 修改角色(需全量提交,建议先 role detail 查看当前值)
ziniao-cli role update --id 123 --name "高级运营" --identity-id 2 --permission-ids "100,101,102"
```
### 分配角色给员工
```bash
# 将角色分配给单个员工
ziniao-cli role assign --role-id 123 --staff-id 456
# 批量分配给多人
ziniao-cli role assign --role-id 123 --staff-id "456,789,101"
# 查看某员工已分配的角色
ziniao-cli role staff-roles --staff-id 456 --format table
```
### 典型工作流:新建角色并批量分配
```bash
# 1. 查看系统已有角色,避免重复创建
ziniao-cli role list --format table
# 2. 查看普通成员可用权限项
ziniao-cli role permissions --identity-id 2 --jq '.[] | .id'
# 3. 创建新角色
ziniao-cli role create --name "跨境运营" --identity-id 2 --permission-ids "100,101,102"
# 4. 获取新角色 ID(从上一步输出的 data.id 取)
# 5. 批量分配给员工
ziniao-cli role assign --role-id <new-id> --staff-id "201,202,203"
```
## 通用 api 覆盖
```bash
ziniao-cli api /superbrowser/rest/v1/erp/per/role/list
ziniao-cli api /superbrowser/rest/v1/erp/per/role/detail --data '{"roleId":"xxx"}'
ziniao-cli api /superbrowser/rest/v1/erp/per/role/add --data '{"roleName":"xxx","identityId":2,"permissionIds":[100,101]}'
ziniao-cli api /superbrowser/rest/v1/erp/per/role/edit --data '{"roleId":"xxx","roleName":"yyy","identityId":2,"permissionIds":[100,101]}'
ziniao-cli api /superbrowser/rest/v1/erp/staff/change/role --data '{"roleId":"xxx","staffIds":["yyy"]}'
ziniao-cli api /superbrowser/rest/v1/erp/staff/role/list --data '{"staffId":"yyy"}'
ziniao-cli api /superbrowser/rest/v1/erp/per/permission/list --data '{"identityId":2}'
```
+401
View File
@@ -0,0 +1,401 @@
---
name: ziniao-shared
version: 1.0.0
description: "紫鸟 CLI 共享基础:应用配置初始化、ZClaw 客户端与 Bridge 就绪、统一 apiKey 认证、错误处理、输出格式和安全规则。当用户需要首次使用 ziniao-cli、配置 API Key、启动紫鸟客户端、登录 ZClaw 或排查认证/Bridge 问题时触发。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# ziniao-cli 共享规则
本技能指导你如何通过 ziniao-cli 操作紫鸟开放平台资源和控制紫鸟浏览器,以及有哪些注意事项。
## 配置初始化
首次使用需运行 `ziniao-cli config init` 完成应用配置。
### 初始化模式
| 命令 | 场景 | 行为 |
|------|------|------|
| `ziniao-cli config init --new` | **AI Agent(推荐)** | 直接进入新建应用流程,输出浏览器链接后轮询等待 |
| `ziniao-cli config init` | 人类用户交互 | 菜单选择:[1] 新建应用 [2] 手动输入 Key |
| `ziniao-cli config init --api-key-stdin` | CI/CD 管道 | 从 stdin 读取已有 API Key |
| `ziniao-cli config init --api-key-stdin --member` | 成员账号 CI | 跳过企业信息获取,仅用于控制浏览器 |
| `ziniao-cli config init --profile <name>` | 多账号 | 指定 profile 名称(不传则自动命名) |
### AI Agent 初始化流程
使用 background 方式执行以下命令,启动后读取 stderr 输出,从中提取浏览器链接并展示给用户:
```bash
# 直接进入新建应用流程(该命令会阻塞直到审核通过、被拒绝或超时 1 小时)
ziniao-cli config init --new
```
输出示例(Boss 账号):
```
请在浏览器中打开以下链接完成应用创建:
https://open.ziniao.com/memberAuth?cliRequestId=a1b2c3d4-...&from=cli
⏳ 等待应用创建及审核... (按 Ctrl+C 取消)
⏳ 等待中... 已等待 30s
✓ 审核已通过
⏳ 正在获取企业信息...
✓ 企业 ID: 15393571083459
✓ 配置已保存
```
输出示例(成员账号):
```
...
✓ 审核已通过
✓ 成员账号,跳过企业信息获取
✓ 配置已保存
```
Agent 应该:
1. 后台执行 `config init --new`
2. 从输出中提取 URL(包含 `memberAuth?cliRequestId=` 的行)
3. 将链接展示给用户,提示在浏览器中打开完成应用创建
4. 等待命令完成(审核通过/拒绝/超时)
5. 如果审核被拒绝,告知用户联系 Boss 审批
apiKey 加密后写入本地。沙箱/容器可直接使用,无需系统钥匙串。
### Boss 与成员账号
初始化时服务端返回 `isBoss` 标识,决定账号权限范围:
| 账号类型 | 服务端 API | ZClaw Bridge(本地浏览器) |
|---------|-----------|--------------------------|
| Boss | ✓ 全部可用 | ✓ 全部可用 |
| 成员 | ✗ 不可用(返回 auth 错误) | ✓ 全部可用 |
服务端 API 权限仅 Boss 账号可申请和调用。成员账号不能开通这些权限点,也不存储 companyId;所有通过 `api` 命令或服务端快捷命令(account/staff/department/role/device)的请求会被拦截并提示"需要 Boss 权限"。
### 检查配置
```bash
ziniao-cli config show # 查看当前配置(含 profile 名称)
ziniao-cli config list # 列出所有 profile
ziniao-cli doctor # 全面自检(配置 + apiKey + 网络 + ZClaw Bridge)
```
## ZClaw 客户端与 Bridge 就绪
ZClaw 本地浏览器操作依赖紫鸟客户端和本地 Bridge。本次任务首次执行店铺或页面命令前,先运行以下命令检查环境:
### 登录命令硬约束
本节所有“登录”“自动登录”“先登录”都只表示逐字执行 `ziniao-cli zclaw login`。不存在可替代的 `ziniao-cli login`,也不得省略 `zclaw`。在输出或执行登录步骤前先核对完整命令。
```bash
ziniao-cli doctor
```
如果 `doctor` 各项明细确认配置、API Key、服务端连通性、Bridge 连通且客户端账号与当前 profile 一致,直接执行原店铺或页面命令;不要只依据最后的汇总文字。一次任务内已经检查通过且认证、profile 和客户端状态未变化时,不要为每个后续命令重复检查。
当 `doctor` 的客户端明细明确显示“紫鸟客户端已启动,但尚未登录”或 `[CLIENT_LOGGED_OUT]`,且 Bridge 已连通、没有 API Key、终端绑定或账号不一致错误时,这已经是确定的未登录状态。未登录恢复命令固定且只能是 `ziniao-cli zclaw login`;`ziniao-cli login` 不是有效命令,不得缩写或替换。必须在任何 `store`、`page` 业务命令之前按以下顺序执行:
```bash
ziniao-cli zclaw login
ziniao-cli doctor
# 仅当 doctor 明细全部通过时,执行一次原业务命令
```
禁止先调用 `store list`、`store resolve`、`store open` 或 `page` 命令来再次探测登录状态,即使 `doctor` 退出码为 0 或 Bridge 显示正常也不例外。登录失败或复查仍未通过时立即停止并报告实际错误。
仅当 `doctor` 的客户端检查明确显示“紫鸟客户端未启动或本地服务未就绪”时,才可尝试启动客户端。调用前按**当前 Shell**选择一种命令检查 `ziniao` 是否可解析,不得把某一种检测命令用于所有平台,也不得依次执行多种检测命令:
| 当前 Shell | 命令检测 |
|------------|----------|
| Windows PowerShell | `Get-Command ziniao -ErrorAction SilentlyContinue` |
| Windows CMD | `where.exe ziniao` |
| macOS/Linux Bash、Zsh、sh,或 Windows Git Bash | `command -v ziniao` |
若当前 Shell 找不到 `ziniao`,不得调用或重试 `ziniao start`。macOS 例外:如果 `/Applications/ziniao.app` 存在,可执行一次 `open -a "/Applications/ziniao.app"` 启动桌面客户端,然后重新运行 `ziniao-cli doctor`;不得把 `open` 当作 Bridge 就绪证明。其他平台提示用户手动启动紫鸟客户端,用户完成后重新运行 `ziniao-cli doctor`。只有找到 `ziniao` 命令时,才执行一次:
```bash
ziniao start
ziniao-cli doctor
```
`ziniao start` 只用于启动或唤起单实例紫鸟客户端,不能修复 API Key、终端绑定、账号不一致或登录会话问题。Bridge 可能在客户端启动后才就绪;启动后可短间隔重新运行 `doctor`,总等待时间最多 30 秒。若 `ziniao start` 返回 Windows 错误 1113 或其他启动错误,或命令成功返回但 macOS 上 `doctor` 仍明确显示客户端未启动,可在 `/Applications/ziniao.app` 存在时额外执行一次 `open -a "/Applications/ziniao.app"`,随后重新运行 `doctor`;不得再次重试 `ziniao start`。仍未通过则报告启动错误和 doctor 明细后停止。
如果 ZClaw Bridge 暂时不可连接,不要再次执行 `ziniao start`,也不要执行 `zclaw login`;只短间隔重新运行 `doctor`,总等待时间最多 30 秒,仍未恢复则停止并报告。即使同一次 `doctor` 还显示客户端未登录,也必须先等 Bridge 恢复。Bridge 恢复后的下一步只能是读取最新一次 `doctor` 明细并重新分流:仍未登录才执行 `ziniao-cli zclaw login`,全部通过才执行原业务命令;禁止在复查前预先执行或承诺执行 `store open`。不要把启动或登录当作状态探测。
独立的运行中会话失效分支:如果此前 `doctor` 明细已经通过,但原始 `store`、`page` 或其他 ZClaw 本地命令随后明确返回 `Ziniao user is not logged in`,下一条命令必须逐字为:
```bash
ziniao-cli zclaw login
```
这里同样只能使用完整命令 `ziniao-cli zclaw login`,不得写成不存在的 `ziniao-cli login`。登录成功后,使用相同参数只重试刚才失败的原命令一次;不要为了这次恢复额外执行 `doctor`。不得在尚未尝试 `zclaw login` 前要求用户手工登录。
若 `zclaw login` 失败,直接报告其实际错误。API Key 无效或被拒绝、终端未绑定、账号不一致,或 Bridge 不可连接时,必须立即停止,禁止重复登录、重复发送店铺请求,或笼统要求用户“先登录客户端”。只有原始错误不是该精确未登录错误、或登录命令本身无法恢复时,才按对应原因要求用户处理前置条件。
只有 `doctor` 显示配置、API Key、服务端连通性、ZClaw Bridge 和客户端账号一致时,才继续浏览器操作:
- 店铺窗口操作使用 `ziniao-store` Skill。
- 页面浏览器自动化使用 `ziniao-page` Skill。
- 查询可用 Bridge 工具使用 `ziniao-cli zclaw tools`;仅在没有快捷命令或用户明确要求调试原始工具时,才使用 `ziniao-cli zclaw invoke <tool>`。
| 现象 | 处理 |
|------|------|
| `config init --new` 提示客户端未登录 | 启动并登录紫鸟客户端,再重新执行初始化。 |
| `doctor` 提示客户端未启动或本地服务未就绪 | 按当前 Shell 使用 PowerShell `Get-Command`、CMD `where.exe` 或 POSIX/Git Bash `command -v` 检测;找到命令才执行一次 `ziniao start`。若 macOS 上 `ziniao start` 失败或执行后仍未启动,且存在 `/Applications/ziniao.app`,可再执行一次 `open -a "/Applications/ziniao.app"`,随后重新运行 `doctor`;若 macOS 找不到命令但应用存在,也直接使用一次 `open`;其他情况提示用户手动启动。 |
| `doctor` 明确显示客户端已启动但未登录,且 Bridge 已连通 | 直接执行一次 `ziniao-cli zclaw login`,不得先发店铺或页面命令探测;登录后重新运行 `doctor`,明细全部通过后才执行原业务命令。 |
| `127.0.0.1:9481` 暂不可连接(无论客户端是否同时显示未登录) | 不启动、不登录;短间隔重新运行 `doctor`,最多等待 30 秒。Bridge 恢复后再按最新客户端明细分流。 |
| `ziniao start` 返回 Windows 错误 1113 或其他启动错误 | 不重试启动;立即重新运行一次 `doctor`,明细通过则继续,否则同时报告启动错误和 doctor 明细后停止。 |
| `zclaw login` 提示无法连接 ZClaw Bridge | 不把登录当作启动探测;回到 `doctor` 判断 9481 不可连接的具体原因。 |
| API Key 无效或未配置 | 使用正确的 Key 重新执行 `ziniao-cli config init`,或重新运行 `ziniao-cli config init --new`。 |
| 初始化后 ZClaw 仍提示 API Key 认证失败 | 前往 https://open.ziniao.com 的用户应用「终端管理」,绑定当前终端识别码(在紫鸟浏览器设置中查看),然后重新执行 `ziniao-cli zclaw login` 和 `ziniao-cli doctor`。 |
| `doctor` 提示客户端登录用户与当前 profile 不一致 | 明确说明当前 profile 与客户端登录账号及其不一致,询问用户是否切换到当前 profile 对应账号并继续原请求;不要只要求用户手工切换。用户确认后按既有登录流程继续。 |
### 多账号切换
支持多个账号配置(profile),通过 `config use` 切换:
```bash
# 列出所有 profile
ziniao-cli config list
# * zhangsan
# staging
# 切换到指定 profile
ziniao-cli config use staging
# 重命名 profile
ziniao-cli config rename staging production
```
初始化时通过 `--profile` 指定名称,浏览器创建流程会自动用账号用户名命名。
### 删除配置
删除操作会弹出确认提示,`--yes` 可跳过:
```bash
ziniao-cli config remove # 删除当前 profile(需确认)
ziniao-cli config remove --profile staging # 删除指定 profile(需确认)
ziniao-cli config remove --yes # 跳过确认直接删除
```
## 认证
### 认证模型
ziniao-cli 使用**统一 apiKey**(Bearer Token),一个 Key 同时用于:
| 用途 | 地址 | 说明 |
|------|------|------|
| 服务端 API | `sbappstoreapi.ziniao.com` | 部门/员工/账号/设备等业务接口 |
| 本地 ZClaw Bridge | `127.0.0.1:9481` | 紫鸟浏览器店铺/页面操控 |
**没有** OAuth、token 刷新、双身份(user/bot)等复杂机制。apiKey 是静态凭证,不过期。
### ISV 应用权限点
调用服务端 API 前,需在紫鸟开放平台为应用开通对应的权限点。这些权限仅 Boss 账号可申请和调用。以下是各模块所需的权限点:
| 模块 | 权限点 | 覆盖接口 |
|------|--------|---------|
| 部门员工 | ERP-部门与员工接口 | 部门 CRUD + 员工查询/新增/修改/启禁用(9 个) |
| 部门员工 | ERP-用户的部门变更 | 员工调岗(1 个) |
| 角色权限 | ERP-角色列表查询 | 角色列表 + 用户角色列表(2 个) |
| 角色权限 | ERP-角色详情 | 角色详情(1 个) |
| 角色权限 | ERP-权限列表 | 权限项列表(1 个) |
| 角色权限 | ERP-角色添加、修改权限 | 添加/修改/调整角色(3 个) |
| 设备管理 | ERP-设备查询 | 设备列表 + 历史绑定记录(2 个) |
| 设备管理 | ERP-设备套餐列表查询权限 | 套餐列表(1 个) |
| 设备管理 | ERP-设备绑定权限 | 绑定设备(1 个) |
| 设备管理 | ERP-解绑设备 | 解绑设备(1 个) |
| 设备管理 | ERP-开关自动续费 | 自动续费开关(1 个) |
| 设备管理 | ERP-设备购买与续费权限 | 购买 + 续费(2 个) |
| 设备管理 | ERP-添加自有设备(新) | 添加自有设备(1 个) |
| 设备管理 | ERP-修改自有设备信息(新) | 修改自有设备(1 个) |
| 设备管理 | ERP-查询已购设备价格接口 | 已购设备价格(1 个) |
| 账号管理 | ERP-账号查看权限 | 账号列表/授权查询/用户账号列表/授权用户列表(4 个) |
| 账号管理 | ERP-创建与删除账号权限 | 创建 + 删除账号(2 个) |
| 账号管理 | ERP-编辑账号基础信息 | 编辑账号信息(1 个) |
| 账号管理 | ERP-账号授权权限 | 授权新增 + 授权删除(2 个) |
| 账号管理 | ERP-清除账号授权 | 清除全部授权(1 个) |
| 账号管理 | ERP-清除账号缓存 | 清除缓存(1 个) |
| 账号管理 | ERP-标签列表 | 企业标签列表(1 个) |
| 账号管理 | ERP-查询某用户有权限的账号列表 | 用户有权限的账号(1 个) |
| 账号管理 | ERP-获取附加网站信息 | 附加网站信息(1 个) |
| 账号管理 | 账号标签管理权限 | 标签 CRUD + 绑定/解绑/替换/清空/移除(9 个) |
| 访问策略 | ERP-网页访问权限 | 访问规则/网页/网页分组全部操作(22 个) |
> 如果调用接口返回 `isv.invalid-method`(不存在的方法名),通常是该权限点未开通。前往 [紫鸟开放平台](https://open.ziniao.com) → 应用管理 → 权限管理 中开通。
### 公共参数
每个服务端 API 请求都需要 `companyId`,**CLI 自动注入并强制使用配置值**,无需也不应手动传递。该值在 `config init` 时通过 `/app/builtin/company` 接口自动获取并写入配置;即使 `--data` 中显式传入 `companyId`,CLI 也会用配置值覆盖。
## 两层命令体系
### 第一层:通用 api 命令(覆盖全部 73 个接口)
任何紫鸟服务端 API 都可以通过 `api` 命令调用,无需专门的快捷命令:
```bash
ziniao-cli api <path> [--data '{}'] [--format table] [--jq '.data[]']
ziniao-cli api GET /app/builtin/company
ziniao-cli api /superbrowser/rest/v1/erp/department/list
ziniao-cli api /superbrowser/rest/v1/erp/staff/list --data '{"page":1,"limit":10}' --format table
```
- 默认 POST 方法,支持 GET/POST/PUT/DELETE
- `companyId` 由框架自动注入,并强制覆盖 `--data` 中的同名字段
- `--page-all` 自动翻页(默认最多 10 页,需取全部时配合 `--page-limit 0`)
- `--page-size N` 每页条数(默认 20)
- `--page-limit N` 最大翻页数(默认 10,0 为不限,配合 `--page-all`)
- `--page-delay MS` 翻页间隔毫秒数(默认 200,配合 `--page-all`)
- `--dry-run` 预览请求不执行
- `--jq` 内置 jq 过滤
### 第二层:快捷命令(高频场景优化)
为复杂接口提供命名 flag + 智能默认值:
```bash
ziniao-cli department list --tree
ziniao-cli staff create --username "zhangsan" --name "张三" --password "Pass123!" --role-id 16691047257645
ziniao-cli store list --format table
```
## `account` 与 `store` 的区别
两组命令都涉及"店铺",但职责和通道完全不同:
| | `account` 命令 | `store` 命令 |
|--|---------------|-------------|
| 通道 | 服务端 API(`sbappstoreapi.ziniao.com`) | 本地 ZClaw Bridge(`127.0.0.1:9481`) |
| 职责 | 店铺账号的 CRUD、授权、标签等**管理操作** | 控制已打开的浏览器实例:列出、打开、关闭 |
| 前置条件 | 只需 apiKey + 网络 | 紫鸟浏览器客户端必须已启动 |
| 典型场景 | 创建店铺、批量授权员工、管理标签 | 打开店铺浏览器 → 导航 → 截图 → 自动化操作 |
**简单记忆:** `account` = 管理后台增删改查,`store` = 控制本地浏览器窗口。
## 命令优先级
AI Agent 调用时按优先级选择:
1. **快捷命令** -- `staff list`、`department create`、`store open` 等(参数简化,体验最好)
2. **通用 api 命令** -- `api <path>` 兜底(任意接口都能调,需要手写 JSON body)
3. **zclaw invoke** -- `zclaw invoke <tool>` 兜底(任意 ZClaw 工具都能调)
### ZClaw 快捷命令硬约束
若某个 ZClaw 工具已有对应快捷命令,**必须只调用快捷命令**,禁止再调用
`ziniao-cli zclaw invoke <tool>`。两者最终都会请求同一个 Bridge 工具;重复调用会重复执行操作。
`zclaw invoke` 仅用于没有快捷命令的 Bridge 工具,或用户明确要求按原始工具名和 JSON 参数调试。
例如 `visit_page` 已由 `page visit` 封装,必须使用 `ziniao-cli page visit ...`。
### 店铺环境结果硬约束
当用户要求店铺浏览器、店铺代理或该店铺登录态下的结果时,结果只能来自该店铺环境。
店铺页面操作失败后,禁止改用公开网页、搜索引擎、其他店铺、服务端 API 或供应来源来“替代”结果;除非用户明确将任务范围改为公开信息检索。
发生 `ERR_SOCKS_CONNECTION_FAILED` 时,保持当前店铺打开,等待 5 秒后以相同参数重试;最多 3 次总尝试。仍失败时,报告该店铺环境暂时无法访问及已尝试次数,并停止该店铺任务;不得声称已取得店铺环境结果。
## 输出格式
所有命令支持 `--format json|table|csv` 和 `--jq` 过滤:
```bash
ziniao-cli staff list --format table
ziniao-cli staff list --jq '.[].name'
ziniao-cli department list --format csv
```
### 输出结构
成功(stdout):
```json
{"ok": true, "data": ..., "meta": {"count": 10}}
```
失败(stderr):
```json
{"ok": false, "error": {"type": "gateway|business|auth|validation", "code": 1001, "message": "...", "hint": "..."}}
```
### 错误类型与处理
| 错误类型 | 含义 | AI Agent 应该做什么 |
|---------|------|-------------------|
| `auth` | apiKey 缺失或无效 | 提示用户运行 `ziniao-cli config init` |
| `gateway` | 网关层错误 (code != "0") | 报告错误,检查网络/apiKey |
| `business` | 业务层错误 (ret != 0) | 报告错误信息,根据 msg 判断原因 |
| `validation` | 参数校验失败 | 检查命令参数是否正确 |
| `network` | 网络不通/Bridge 未启动 | ZClaw 相关:回到 `doctor` 明细路由,只有客户端未启动时才进入启动流程;API 相关:检查网络 |
## 更新检查
ziniao-cli 命令执行后,如果检测到新版本,JSON 输出中会包含 `_notice.update` 字段:
```json
{
"ok": true,
"data": ...,
"_notice": {
"update": {
"current": "1.0.0",
"latest": "1.1.0",
"message": "ziniao-cli 1.1.0 可用,当前 1.0.0,运行 npm update -g @ziniao-open/cli 更新"
}
}
}
```
**当你在输出中看到 `_notice.update` 时:**
1. 先完成用户当前请求
2. 然后将 `message` 字段内容展示给用户,提议帮其更新
3. 若用户同意,执行 `npm update -g @ziniao-open/cli`
更新提示仅通过 stdout JSON 的 `_notice` 字段传递,不会输出到 stderr。可通过环境变量 `ZINIAO_CLI_NO_UPDATE_CHECK=1` 禁用检查。
## 环境兼容说明
### Windows Git Bash 路径转义问题
在 **Git Bash** 中,以 `/` 开头的字符串会被 MSYS 自动转换为 Windows 本地路径(如 `/superbrowser/...` → `C:/Program Files/Git/superbrowser/...`),导致 `api` 命令的路径参数被破坏。
**PowerShell 和 CMD 无此问题。**
**解决方式一(推荐):写入 `.bashrc` 永久生效**
```bash
echo 'export MSYS_NO_PATHCONV=1' >> ~/.bashrc
source ~/.bashrc
```
**解决方式二:每次命令前加前缀**
```bash
MSYS_NO_PATHCONV=1 ziniao-cli api /superbrowser/rest/v1/erp/store/create \
--data '{"storeData":[{"name":"新店铺"}]}'
```
## 安全规则
- **API Key 是静态敏感凭证**:不得请求用户在聊天中发送完整 Key,也不得在回复、终端输出或错误信息中展示完整 Key
- **禁止把完整 API Key 写入命令行参数、Shell 历史、脚本、截图、录屏、聊天消息、日志或 Git**
- 人工交互环境使用 `ziniao-cli config init` 输入 Key;输入期间避免屏幕共享、录屏和终端日志采集
- CI/CD 使用 `ziniao-cli config init --api-key-stdin`,由 Secret Manager 或受保护的标准输入提供 Key;不得把 Key 直接写在流水线命令中
- **写入/删除操作前必须确认用户意图**
- `high-risk-write` 操作(department delete、staff remove)会要求交互式确认,可用 `--yes` 跳过
- 建议先用 `--dry-run` 预览危险请求
## 重要行为规则
- **ZClaw 本地接口必须通过 ziniao-cli 调用**:调用紫鸟浏览器本地接口(store/page/zclaw 命令)时,必须使用本技能体系中的 ziniao-cli 能力,不要使用 ziniao-assistant 技能自行调用 ZClaw Bridge。
- **店铺列表优先使用本地接口**:如果用户要求获取店铺列表,应优先使用 `store list` 快捷命令(走本地 ZClaw Bridge),因为普通成员没有服务端 `account list` 接口权限。成员类型可通过 `ziniao-cli config show` 结果中的 `isBoss` 字段判断。
- **ZClaw 认证失败排查**:如果帮用户初始化应用(`config init`)之后,请求 ZClaw 接口仍返回 API Key 认证失败,应提醒用户前往紫鸟开放平台 https://open.ziniao.com 查看自己的用户应用里「终端管理」是否已绑定当前终端识别码(识别码在紫鸟浏览器设置中查看)。
@@ -0,0 +1,81 @@
---
name: ziniao-skill-maker
version: 1.0.0
description: "创建 ziniao-cli 的自定义 Skill。当用户需要把紫鸟 API 操作封装成可复用的 Skill(包装原子 API 或编排多步流程)时使用。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# Skill Maker
基于 ziniao-cli 创建新 Skill。Skill = 一份 `SKILL.md`,教 AI 用 CLI 命令完成任务。
## CLI 核心能力
```bash
ziniao-cli <service> <command> # 快捷命令
ziniao-cli api [METHOD] <path> [--data/--format] # 任意服务端 API
ziniao-cli zclaw invoke <tool> [--args] # 任意 ZClaw 工具
ziniao-cli store/page <command> # ZClaw 快捷命令
```
优先级:快捷命令 > 通用 api/zclaw invoke。
## 调研 API
```bash
# 1. 查看已有快捷命令
ziniao-cli department --help
ziniao-cli staff --help
# 2. 查看 ZClaw 工具
ziniao-cli zclaw tools
# 3. 通用 api 裸调
ziniao-cli api /superbrowser/rest/v1/erp/per/role/list
```
如果命令不够用,使用 [ziniao-openapi-explorer](../ziniao-openapi-explorer/SKILL.md) 查找 API 路径。
## SKILL.md 模板
文件放在 `skills/ziniao-<name>/SKILL.md`:
```markdown
---
name: ziniao-<name>
version: 1.0.0
description: "<功能描述>。当用户需要<触发场景>时使用。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# <标题>
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../ziniao-shared/SKILL.md`](../ziniao-shared/SKILL.md)**
## 命令
\```bash
# 单步操作
ziniao-cli api POST /superbrowser/rest/v1/erp/xxx --data '{...}'
# 多步编排
# Step 1: ...(记录返回的 xxx_id)
# Step 2: 使用 Step 1 的 xxx_id
\```
## 参考
- [ziniao-shared](../ziniao-shared/SKILL.md) — 认证和全局参数
```
## 关键原则
- **description 决定触发** — 包含功能关键词 + "当用户需要...时使用"
- **CRITICAL 依赖** — 所有 Skill 必须强制读取 ziniao-shared
- **安全** — 写入操作前确认用户意图
- **编排** — 说明步骤间的数据传递和失败处理
+77
View File
@@ -0,0 +1,77 @@
---
name: ziniao-staff
version: 1.0.0
description: "紫鸟员工管理:员工的查询、创建、修改、启用/禁用/删除和调岗。当用户需要查询员工信息、创建新员工、修改员工信息、启用/禁用/删除员工或调整员工部门时使用。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# 员工管理
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../ziniao-shared/SKILL.md`](../ziniao-shared/SKILL.md),其中包含认证、错误处理和安全规则**
**CRITICAL — 所有 Shortcuts 在执行之前,务必先用 Read 工具读取其对应的 references/ 说明文档,禁止直接盲目调用命令。**
## 核心场景
### 查询员工
支持多种筛选条件,枚举值已映射为人类可读。注意:默认返回包含已删除员工,取 ID 做后续操作时建议加 `--status active`。
```bash
ziniao-cli staff list --name "张三" --status active --format table
ziniao-cli staff list --role boss --page-all
ziniao-cli staff list --department-id 15868464646076
```
### 创建员工
原始 API 需要 20+ 字段的嵌套 JSON,CLI 简化为核心 flag + 智能默认值(`--department-id` 必填):
```bash
ziniao-cli staff create --username "zhangsan" --name "张三" --password "Pass123!" --role-id 16691047257645 --department-id 15868464646076
```
智能默认值:`authDevide=1`(全设备授权)、`authClient=全部允许`、`isLimitLogin=0`。
登录日期默认发送有效日期:`loginLimitStartDate=今天`、`loginLimitEndDate=2099-12-31`,也可通过 `--login-start-date` / `--login-end-date` 指定。
### 启用/禁用/删除
原始 API 是一个接口通过 `status` 字段区分,CLI 拆为 3 个语义化命令:
```bash
ziniao-cli staff enable --id 16524289555087
ziniao-cli staff disable --id "id1,id2,id3" # 支持批量
ziniao-cli staff remove --id 16524289555087 # high-risk-write
```
## 枚举映射
| flag | 可选值 | 对应 API 值 |
|------|--------|-----------|
| `--status` | active / disabled / deleted | delflag: 0/1/2 |
| `--role` | boss / manager / employee / admin | level: 0/1/2/3 |
| `--device-auth` | auto / first / approve / phone | authDevide: 1/2/3/4 |
| `--allow-clients` | windows,mac,web,android,ios,linux,miniapp 或 all | authClient 嵌套对象 |
## Shortcuts
| 命令 | 说明 | 详细文档 |
|------|------|---------|
| `staff list` | 查询员工列表 | [`references/ziniao-staff-list.md`](references/ziniao-staff-list.md) |
| `staff create` | 新增员工 | [`references/ziniao-staff-create.md`](references/ziniao-staff-create.md) |
| `staff update` | 修改员工 | 只发修改字段:`--id xxx --name "新名"`,底层路径 `/superbrowser/rest/v2/erp/staff/modify` |
| `staff enable` | 启用员工 | [`references/ziniao-staff-enable-disable.md`](references/ziniao-staff-enable-disable.md) |
| `staff disable` | 禁用员工 | 同上 |
| `staff remove` | 删除员工 | `high-risk-write` |
| `staff transfer` | 调岗 | `--staff-id xxx --department-id yyy` |
## 通用 api 覆盖
```bash
ziniao-cli api /superbrowser/rest/v1/erp/staff/list --data '{"page":1,"limit":10}'
ziniao-cli api /superbrowser/rest/v2/erp/staff/add --data '{...}'
ziniao-cli api /superbrowser/rest/v2/erp/staff/modify --data '{...}'
ziniao-cli api /superbrowser/rest/v1/erp/staff/status --data '{"staffIds":["xxx"],"status":"1"}'
ziniao-cli api /superbrowser/rest/v1/erp/staff/department --data '{"staffIds":["xxx"],"departmentIds":["yyy"]}'
```
@@ -0,0 +1,60 @@
# staff create
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md)。
新增员工。写入操作。原始 API 需要 20+ 字段,CLI 简化为核心 flag,并补齐服务端需要的登录日期字段。
## 命令
```bash
# 最简用法(5 个必填参数)
ziniao-cli staff create \
--username "zhangsan" \
--name "张三" \
--password "Pass123!" \
--role-id 16691047257645 \
--department-id 15868464646076
# 指定部门 + 限制登录终端
ziniao-cli staff create \
--username "zhangsan" \
--name "张三" \
--password "Pass123!" \
--role-id 16691047257645 \
--department-id 15868464646076 \
--allow-clients windows,mac,web
```
## 参数
| 参数 | 必填 | 默认值 | 说明 |
|------|------|--------|------|
| `--username` | 是 | — | 登录账号 |
| `--name` | 是 | — | 姓名 |
| `--password` | 是 | — | 密码 |
| `--role-id` | 是 | — | 角色 ID(用 `ziniao-cli role list` 或 `ziniao-cli api /superbrowser/rest/v1/erp/per/role/list` 查询) |
| `--department-id` | 是 | — | 部门 ID |
| `--mobile` | 否 | 无 | 手机号 |
| `--allow-clients` | 否 | all | 允许登录终端(windows,mac,web,android,ios,linux,miniapp) |
| `--device-auth` | 否 | auto | 设备授权模式(auto\|first\|approve\|phone) |
| `--login-start-date` | 否 | 今天 | 可登录起始日期,格式 yyyy-MM-dd |
| `--login-end-date` | 否 | 2099-12-31 | 可登录结束日期,格式 yyyy-MM-dd |
## 智能默认值
以下字段使用智能默认值,用户无需指定:
| 原始 API 字段 | 默认值 | 说明 |
|--------------|--------|------|
| `authDevide` | 1 | 全设备自动永久授权 |
| `isUpdatePersonInfo` | 1 | 允许修改个人信息 |
| `isLimitLogin` | 0 | 不限制登录时间 |
| `isTwoStepVerify` | 0 | 不开启二步验证 |
| `enablePhoneLogin` | 0 | 不开启手机号登录 |
| `authClient` | 全部 "1" | 允许所有终端 |
| `loginLimitStartDate` | 今天 | 服务端需要非空有效日期 |
| `loginLimitEndDate` | 2099-12-31 | 服务端需要非空有效日期 |
## 参考
- [ziniao-staff](../SKILL.md) — 员工管理全部命令
@@ -0,0 +1,47 @@
# staff enable / disable / remove
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md)。
启用、禁用或删除员工。原始 API 是一个接口(`/erp/staff/status`),CLI 拆为 3 个语义化命令。
## 命令
```bash
# 启用
ziniao-cli staff enable --id 16524289555087
# 禁用(支持批量)
ziniao-cli staff disable --id 16524289555087
ziniao-cli staff disable --id "id1,id2,id3"
# 删除(高风险,需确认)
ziniao-cli staff remove --id 16524289555087
ziniao-cli staff remove --id 16524289555087 --yes # 跳过确认
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--id` | 是 | 员工 ID(逗号分隔可批量) |
| `--yes` | 否 | 跳过确认(仅 remove) |
## 风险等级
| 命令 | 风险等级 | 是否需确认 |
|------|---------|----------|
| `staff enable` | write | 否 |
| `staff disable` | write | 否 |
| `staff remove` | high-risk-write | 是(交互式确认) |
## 内部映射
| 命令 | API status 值 |
|------|--------------|
| enable | "0" |
| disable | "1" |
| remove | "2" |
## 参考
- [ziniao-staff](../SKILL.md) — 员工管理全部命令
@@ -0,0 +1,64 @@
# staff list
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md)。
查询员工列表。只读操作。
## 命令
```bash
# 查询全部
ziniao-cli staff list
# 按姓名搜索(模糊)
ziniao-cli staff list --name "张三"
# 精确匹配
ziniao-cli staff list --name "张三" --exact
# 按状态筛选 + 表格输出
ziniao-cli staff list --status active --format table
# 按角色筛选
ziniao-cli staff list --role boss
# 按部门筛选
ziniao-cli staff list --department-id 15868464646076
# 自动翻页
ziniao-cli staff list --page-all --page-size 50
# jq 过滤
ziniao-cli staff list --jq '.[].name'
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--name` | 否 | 按姓名搜索 |
| `--username` | 否 | 按账号搜索 |
| `--department-id` | 否 | 按部门 ID 筛选(逗号分隔) |
| `--status` | 否 | active \| disabled \| deleted |
| `--role` | 否 | boss \| manager \| employee \| admin |
| `--exact` | 否 | 精确匹配(默认模糊) |
| `--page-size` | 否 | 每页条数(默认 20) |
| `--page-all` | 否 | 自动翻页获取全部 |
| `--page-limit` | 否 | 最大翻页数(默认 10,0 为不限) |
| `--page-delay` | 否 | 翻页间隔毫秒数(默认 200) |
| `--format` | 否 | json \| table \| csv |
| `--jq` / `-q` | 否 | jq 过滤表达式 |
## 输出字段翻译
表格输出时,枚举值自动翻译:
- `level "0"` -> `role: "Boss"`
- `delflag "0"` -> `statusText: "正常"`
## 注意事项
- 默认返回所有状态的员工(含已禁用和已删除)。如果需要取员工 ID 做后续操作(分配角色、授权店铺等),建议加 `--status active` 筛选,避免使用已删除员工 ID 导致"无效的 staffId"错误。
## 参考
- [ziniao-staff](../SKILL.md) — 员工管理全部命令
+47
View File
@@ -0,0 +1,47 @@
---
name: ziniao-store
description: "Use when a request concerns the local 紫鸟/ZClaw browser, a store name or ID, listing/resolving/opening/reusing/closing a store browser, or a store-scoped task that starts from a store. Do not use for server-side account CRUD or for a webpage task on an already-open store."
metadata:
requires:
bins: ["ziniao-cli"]
---
# 紫鸟店铺入口
本技能负责“店铺”这一资源及其本地浏览器生命周期,不负责定义用户的业务目标,也不复制 CLI 帮助文档。
## 负责范围
- 列出、解析、打开、复用、关闭本地紫鸟店铺浏览器。
- 保存本次任务确认过的 `store-id`,供后续步骤复用。
- 用户从某个店铺开始并继续操作网页时,按需使用 `ziniao-page`。
- 任务涉及配置、认证、Bridge、客户端或网络异常时,按需读取 `ziniao-shared` 的诊断规则。
## 路由边界
- 请求以店铺名称/ID或“本地紫鸟店铺”为起点:先处理店铺,再判断是否需要页面能力。
- 已有明确且正在运行的店铺,只需网页操作:使用 `ziniao-page`,不要重复打开店铺。
- 店铺后台账号的创建、删除、授权、标签等服务端管理:使用 `ziniao-account`,不是本技能。
- 不要把用户的业务目标或任务参数写入本技能;这些属于任务内容,不是店铺能力。
## 最小执行规则
1. 需要店铺对象时,使用 CLI 的 `store list` 或 `store resolve` 获取并确认目标。
2. 需要浏览器窗口时,使用 `store open`;已有有效 `store-id` 且店铺仍运行时直接复用。
3. 需要网页资源操作时,继续使用 `ziniao-page`;不要在本技能中重述页面命令。
4. 店铺命令失败时,根据错误按需运行 `ziniao-cli doctor`;不要无条件登录、启动或重复重试。
5. 具体参数不确定时,使用 `ziniao-cli store <command> --help`,复杂命令再读取对应 reference。
## 打开后的验证边界
- 用户只要求打开店铺时,精确解析店铺并成功执行带 `--expected-name` 的 `store open` 即可结束;不得为了证明窗口存在而追加 `page snapshot`。
- 用户同时给出目标 URL 时,首次打开优先使用同一次 `store open --url`,不要再对同一 URL 重复执行 `page visit`。
- 用户要求确认最终页面或业务状态时,转到 `ziniao-page`,使用导航返回值、`page content` 或 `page exec` 验证 URL/title/正文;不得用 snapshot 代替普通页面验证。
- 只有后续页面任务本身满足上传、自定义控件或复杂歧义定位条件时,才由 `ziniao-page` 决定使用 snapshot。
## 按需参考
- [store list](references/ziniao-store-list.md):需要列出店铺时读取。
- [store open](references/ziniao-store-open.md):需要打开或复用店铺时读取。
- `ziniao-shared`:仅在配置、认证、Bridge 或诊断问题出现时读取。
- `ziniao-page`:仅在任务继续操作已打开店铺内网页时读取。
@@ -0,0 +1,50 @@
# store list
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md),再检查店铺操作所需状态:
>
> ```bash
> ziniao-cli doctor
> ```
>
> `doctor` 明细确认通过后直接执行 `store list`,不得无条件启动或登录。检查未通过时,严格按照 `ziniao-shared` 的「ZClaw 客户端与 Bridge 就绪」流程处理;只有客户端未登录或 `store list` 明确返回会话缺失/过期时,才允许登录一次,随后重新检查并只重试一次。API Key、终端或账号认证失败时立即停止。
列出所有店铺。只读操作。
## 命令
```bash
ziniao-cli store list
ziniao-cli store list --format table
ziniao-cli store list --keyword "Rose" --limit 10
ziniao-cli store list --all
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--page` | 否 | 页码 |
| `--limit` | 否 | 每页数量 |
| `--all` | 否 | 获取全部店铺 |
| `--keyword` | 否 | 按关键词筛选 |
| `--type` | 否 | 店铺列表类型 |
| `--format` | 否 | 输出格式: json \| table |
| `--jq` | 否 | jq 过滤表达式 |
## 输出字段
| 字段 | 说明 |
|------|------|
| storeId | 店铺 ID(后续操作需要) |
| storeName | 店铺名称 |
| platformName | 平台名称 |
| ip | 绑定的 IP |
## 提示
- storeId 是后续所有页面操作(page visit/click/screenshot 等)的必填参数
- 建议先用 `store list --format table` 查看所有店铺
## 参考
- [ziniao-store](../SKILL.md) — 店铺管理全部命令
@@ -0,0 +1,48 @@
# store open
> **前置条件:** 先阅读 [`../ziniao-shared/SKILL.md`](../../ziniao-shared/SKILL.md),再检查店铺操作所需状态:
>
> ```bash
> ziniao-cli doctor
> ```
>
> `doctor` 明细确认通过后直接执行 `store open`,不得无条件启动或登录。检查未通过时,严格按照 `ziniao-shared` 的「ZClaw 客户端与 Bridge 就绪」流程处理;只有客户端未登录或 `store open` 明确返回会话缺失/过期时,才允许登录一次,随后重新检查并只重试一次。API Key、终端或账号认证失败时立即停止。
打开或复用店铺浏览器窗口;带 `--url` 时导航到目标页面。
> 首次进入目标页面时,优先使用 `store open --url <url>`,即使店铺为 `reused: true` 也会直接导航当前页面。已建立会话后的后续 URL 跳转使用 `page visit`。同一个 URL 不得连续执行 `store open --url` 与 `page visit`。
## 命令
```bash
# 按名称打开
ziniao-cli store open --name "Rosehut"
# 按 ID 打开
ziniao-cli store open --id abc123
# 打开并直接访问 URL
ziniao-cli store open --name "Rosehut" --url "https://www.amazon.com"
# 无头模式打开
ziniao-cli store open --name "Rosehut" --headless
# 隐私模式打开
ziniao-cli store open --name "Rosehut" --privacy
```
## 参数
| 参数 | 必填 | 说明 |
|------|------|------|
| `--name` | 否* | 店铺名称(与 --id 二选一) |
| `--id` | 否* | 店铺 ID(与 --name 二选一) |
| `--expected-name` | 否 | 期望匹配的名称(用于验证) |
| `--url` | 否 | 打开后直接导航到的 URL(对应 launchUrl) |
| `--headless` | 否 | 无头模式 |
| `--privacy` | 否 | 隐私模式 |
| `--window-ratio` | 否 | 窗口比例 |
## 参考
- [ziniao-store](../SKILL.md) — 店铺管理全部命令
@@ -0,0 +1,80 @@
---
name: ziniao-workflow-batch-account
version: 1.0.0
description: "批量账号授权工作流:编排 account list + staff list + api 调用完成批量授权店铺给员工。适用于新员工入职时批量分配店铺权限。"
metadata:
requires:
bins: ["ziniao-cli"]
---
# 批量账号授权工作流
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../ziniao-shared/SKILL.md`](../ziniao-shared/SKILL.md)**
## 适用场景
- "给新员工分配店铺权限"
- "批量授权店铺给某个员工"
- "新人入职,需要授权所有店铺"
## 前置条件
- 已配置 apiKey(`ziniao-cli config init`)
## 工作流
```
staff list ──► 找到目标员工 ID
account list ──► 找到目标店铺 ID 列表
│
├──► 对每个店铺:
│ api /superbrowser/rest/v1/erp/store/auth/add { storeIdList, staffId }
│
└──► 汇总授权结果
```
### Step 1: 查找员工
```bash
# 按姓名查找
ziniao-cli staff list --name "张三" --format table
# 记录 userId
```
### Step 2: 查找要授权的店铺
```bash
# 列出所有店铺
ziniao-cli account list --format table --page-all
# 或按名称搜索
ziniao-cli account list --name "US" --format table
```
### Step 3: 逐个授权
对每个店铺执行:
```bash
ziniao-cli api /superbrowser/rest/v1/erp/store/auth/add \
--data '{"storeIdList":["<storeId>"],"staffId":"<staffId>"}'
```
### Step 4: 验证
```bash
# 查看该员工已授权的店铺
ziniao-cli api /superbrowser/rest/v1/erp/user/stores \
--data '{"userId":"<userId>","page":1,"limit":10}'
```
## 注意事项
- 授权是写入操作,执行前确认用户意图
- 如果需要授权大量店铺,建议先列出计划并确认
- 授权失败时记录错误并继续下一个
## 参考
- [ziniao-account](../ziniao-account/SKILL.md) — 账号管理
- [ziniao-staff](../ziniao-staff/SKILL.md) — 员工管理
- [ziniao-shared](../ziniao-shared/SKILL.md) — 认证和全局参数