Doramagic 项目包 · 项目说明书
sidebutton 项目
生成时间:2026-05-13 19:19:28 UTC
项目概述
SideButton 是一个开源的 AI Agent 平台,专注于为 AI 代理提供浏览器自动化能力、工作流编排和领域知识管理。该项目通过 MCP(Model Context Protocol)服务器提供浏览器工具集,支持使用 YAML 定义自动化工作流程,并提供知识包(Knowledge Packs)机制来封装特定 Web 应用的领域专业知识。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
项目简介
SideButton 是一个开源的 AI Agent 平台,专注于为 AI 代理提供浏览器自动化能力、工作流编排和领域知识管理。该项目通过 MCP(Model Context Protocol)服务器提供浏览器工具集,支持使用 YAML 定义自动化工作流程,并提供知识包(Knowledge Packs)机制来封装特定 Web 应用的领域专业知识。
资料来源:README.md:1
核心定位
SideButton 的主要目标是为 AI 代理提供与 Web 应用交互的标准化能力,使 AI 代理能够执行以下任务:
- 浏览器操作(导航、点击、输入、截图、提取数据)
- 工作流自动化执行
- 跨平台工具集成
- 领域知识获取与推理
资料来源:AGENTS.md:3
核心特性
主要功能模块
| 功能模块 | 描述 |
|---|---|
| 浏览器工具 | 40+ 浏览器命令,包括 navigate、click、type、extract、scroll、wait、snapshot |
| 工作流引擎 | YAML 驱动的多步骤自动化编排 |
| 知识包系统 | 可安装的领域知识(选择器、数据模型、状态机、角色剧本) |
| MCP 集成 | 支持 Claude Desktop、Claude Code、Cursor 等主流 AI 平台 |
| Chrome 扩展 | 实时 DOM 访问、CSS 选择器操作、WebSocket 连接 |
资料来源:README.md:40-44
浏览器自动化能力
SideButton 通过 Chrome 扩展实现真实的 DOM 访问,采用 CSS 选择器而非像素坐标或截图的方式进行元素定位。这种方式确保了自动化脚本的稳定性和可维护性。
支持的浏览器命令包括:
navigate- 导航到指定 URLclick- 点击页面元素type- 向输入框输入文本snapshot- 获取页面可访问性树extract/extractAll- 提取文本内容screenshot- 页面截图scroll- 页面滚动hover- 悬停操作
资料来源:README.md:42
系统架构
整体架构图
graph TD
A[AI 代理 Client] --> B[MCP Server]
B --> C[浏览器工具]
B --> D[工作流引擎]
B --> E[知识包系统]
C --> F[Chrome 扩展]
F --> G[浏览器页面]
D --> H[YAML 工作流定义]
E --> I[领域知识存储]组件结构
SideButton 采用 Monorepo 架构组织代码,主要包含以下包:
| 包名 | 用途 |
|---|---|
packages/server | MCP 服务器 - 浏览器工具、工作流运行器、REST API |
packages/core | 工作流引擎 - 步骤执行器、共享类型定义 |
packages/dashboard | Web UI - 工作流管理、运行日志、设置页面 |
packages/sidebutton | CLI 入口 - npx sidebutton@latest 命令行工具 |
extension/ | Chrome 扩展 (Manifest V3) - 通过 Chrome Web Store 分发 |
资料来源:AGENTS.md:17-23
技术栈
核心技术选型
- 语言: TypeScript(严格模式)
- 模块系统: ES modules
- 包管理器: pnpm
- 通信协议: MCP (Model Context Protocol)
MCP 工具集
| 工具 | 功能描述 |
|---|---|
run_workflow | 按 ID 执行工作流 |
list_workflows | 列出可用工作流 |
get_workflow | 获取工作流 YAML 定义 |
get_run_log | 获取运行日志 |
list_run_logs | 列出最近执行记录 |
get_browser_status | 检查浏览器扩展连接状态 |
capture_page | 捕获页面选择器 |
navigate | 导航到指定 URL |
snapshot | 获取页面可访问性快照 |
click | 点击元素 |
type | 输入文本 |
scroll | 滚动页面 |
extract | 提取文本 |
screenshot | 截图 |
资料来源:README.md:60-77
安装与部署
环境要求
- Node.js(建议使用最新稳定版本)
- Chrome 浏览器(用于浏览器自动化功能)
安装方式
#### 通过 npm 全局安装
npm install -g sidebutton
#### 通过 npx 直接运行
npx sidebutton@latest
#### 本地开发安装
git clone https://github.com/sidebutton/sidebutton.git
cd sidebutton
pnpm install
pnpm build
pnpm start
资料来源:AGENTS.md:9-15
构建与测试
| 命令 | 功能 |
|---|---|
pnpm install | 安装依赖 |
pnpm build | 构建所有包 |
pnpm start | 启动服务器 |
pnpm dev | 开发模式运行 |
pnpm test | 运行所有测试 |
pnpm test --filter server | 测试指定包 |
资料来源:AGENTS.md:12-16
工作流系统
工作流定义
SideButton 使用 YAML 格式定义工作流,支持多种步骤类型:
steps:
- type: browser.navigate
url: "https://example.com"
- type: browser.click
selector: "#submit-btn"
- type: browser.extract
selector: ".result"
as: result
资料来源:README.md:86-92
步骤类型分类
| 类别 | 支持的步骤 |
|---|---|
| 浏览器 | navigate, click, type, scroll, hover, wait, extract, extractAll, exists, key |
| Shell | shell.run, terminal.open, terminal.run |
| LLM | llm.classify, llm.generate |
| 控制流 | control.if, control.retry, control.stop, workflow.call |
| 数据 | data.first |
资料来源:packages/core/README.md:25-31
变量插值
工作流支持使用 {{variable}} 语法引用提取的值或参数:
steps:
- type: browser.extract
selector: ".username"
as: user
- type: shell.run
cmd: "echo 'Hello, {{user}}!'"
资料来源:README.md:94-99
知识包系统
概念定义
知识包(Knowledge Packs)是 SideButton 的核心特性之一,它封装了特定 Web 应用的领域专业知识,使 AI 代理能够理解并操作各类 Web 应用。
知识包内容
| 内容类型 | 描述 |
|---|---|
| 选择器 | UI 元素的 CSS 选择器 |
| 数据模型 | 实体类型、字段、关系、有效状态 |
| 状态机 | 各状态间的有效转换 |
| 角色剧本 | 角色特定的操作流程(QA、SE、PM、SD) |
| 常见任务 | 分步操作流程、注意事项、边缘情况 |
资料来源:README.md:103-111
知识包命令
| 命令 | 功能 | ||
|---|---|---|---|
| `sidebutton registry add <path | url>` | 从注册表安装所有知识包 | |
sidebutton registry update [name] | 更新已安装的知识包 | ||
sidebutton registry remove <name> | 卸载知识包并移除注册表 | ||
sidebutton registry list | 显示注册表和包数量 | ||
sidebutton search [query] | 跨注册表搜索包 | ||
| `sidebutton install <path | url | name>` | 单个知识包安装 |
sidebutton uninstall <domain> | 移除已安装的知识包 | ||
sidebutton init [domain] | 脚手架新知识包 | ||
sidebutton validate [path] | 验证知识包定义 |
资料来源:packages/sidebutton/README.md:43-56
MCP 集成配置
Claude Desktop 配置
添加到 ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"sidebutton": {
"command": "npx",
"args": ["sidebutton", "--stdio"]
}
}
}
Claude Code 配置
{
"mcpServers": {
"sidebutton": {
"type": "sse",
"url": "http://localhost:9876/mcp"
}
}
}
Cursor 配置
添加到 ~/.cursor/mcp.json:
{
"mcpServers": {
"sidebutton": {
"url": "http://localhost:9876/mcp"
}
}
}
资料来源:README.md:25-51
Chrome 扩展
安装方式
从 Chrome Web Store 安装 SideButton 扩展。
主要功能
- 40+ 浏览器命令: navigate、click、type、extract、scroll、wait、snapshot 等
- 真实 DOM 访问: 通过 CSS 选择器而非像素坐标或截图
- 录制模式: 捕获手动操作并转换为工作流
- 嵌入按钮: 向任意网页注入操作按钮
- WebSocket 连接: 稳定的重连机制,支持本地或远程连接
资料来源:README.md:113-119
许可证
SideButton 采用 Apache-2.0 开源许可证。
资料来源:packages/core/README.md:45, packages/server/README.md:46, packages/sidebutton/README.md:70
相关资源
| 资源类型 | 链接 |
|---|---|
| 官方文档 | https://docs.sidebutton.com |
| GitHub 仓库 | https://github.com/sidebutton/sidebutton |
| 官方网站 | https://sidebutton.com |
| 知识包市场 | https://sidebutton.com/skills |
| Chrome 扩展 | https://chromewebstore.google.com/detail/sidebutton/odaefhmdmgijnhdbkfagnlnmobphgkij |
资料来源:[README.md:1]()
系统架构
SideButton 是一个基于工作流(Workflow)的浏览器自动化与 AI 任务执行框架,采用模块化单体架构(modular monorepo)设计。本文详细介绍其整体系统架构、核心组件及其交互关系。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
架构概览
SideButton 项目采用 pnpm workspaces 实现多包管理,主要包含以下核心包:
| 包名 | 说明 |
|---|---|
@sidebutton/core | 工作流引擎核心,提供工作流执行引擎和基础工具集 |
@sidebutton/server | MCP 服务器,提供 REST API 和 MCP 协议接口 |
@sidebutton/dashboard | Web 管理界面,基于 Vite + TypeScript 构建 |
@sidebutton/sidebutton | CLI 工具,整合所有功能提供命令行入口 |
资料来源:pnpm-workspace.yaml
系统架构图
graph TB
subgraph Client["客户端层"]
CLI[CLI 工具<br/>sidebutton]
BrowserExt[Chrome 扩展]
AI_Agent[AI 代理<br/>Claude/Cursor]
end
subgraph Server["服务端层"]
MCP_Server[MCP Server<br/>:9876]
Dashboard[Web Dashboard<br/>Vite SPA]
WorkflowEngine[工作流引擎<br/>@sidebutton/core]
Providers[Providers<br/>GitHub/Browser/Shell]
end
subgraph Storage["数据层"]
DB[(本地数据库<br/>SQLite/JSON)]
Workflows[工作流定义<br/>YAML]
end
CLI --> MCP_Server
BrowserExt --> MCP_Server
AI_Agent --> MCP_Server
MCP_Server --> Dashboard
MCP_Server --> WorkflowEngine
WorkflowEngine --> Providers
MCP_Server --> DB
WorkflowEngine --> Workflows核心组件详解
MCP 服务器
MCP(Model Context Protocol)服务器是系统的核心通信枢纽,负责接收外部请求并调度工作流执行。
技术实现:
- 基于 Fastify 框架构建,提供高性能 HTTP 服务
- 支持 SSE(Server-Sent Events)传输协议
- 默认端口:9876
资料来源:packages/server/src/server.ts
主要 API 端点:
| 端点 | 方法 | 说明 |
|---|---|---|
/mcp | GET/POST | MCP 协议主端点 |
/workflows | GET | 列出所有工作流 |
/workflows/:id/run | POST | 执行指定工作流 |
/run-logs | GET | 查看执行日志 |
/settings | GET/POST | 系统设置 |
工作流引擎
工作流引擎负责解析和执行 YAML 格式的工作流定义文件。
执行流程:
sequenceDiagram
participant User as 用户/AI Agent
participant MCP as MCP Server
participant Engine as Workflow Engine
participant Provider as Provider
participant Target as 目标系统
User->>MCP: run_workflow(workflowId)
MCP->>Engine: executeWorkflow(workflow, context)
Engine->>Engine: 解析 YAML 定义
loop 遍历每个 Step
Engine->>Provider: 调用对应 Provider
Provider->>Target: 执行实际操作
Target-->>Provider: 返回结果
Provider-->>Engine: 返回 Step 结果
end
Engine-->>MCP: 返回执行结果
MCP-->>User: 返回格式化输出资料来源:packages/core/src/index.ts
Step 类型体系:
| 类别 | Step 类型 | 说明 |
|---|---|---|
| Browser | navigate, click, type, scroll, hover, wait, extract, extractAll, exists, key | 浏览器自动化操作 |
| Shell | shell.run, terminal.open, terminal.run | 命令行/终端操作 |
| LLM | llm.classify, llm.generate, llm.decide | AI 大模型交互 |
| Control | control.if, control.retry, control.stop, workflow.call | 流程控制 |
| Data | data.first, variable.set, data.get | 数据处理 |
Provider 架构
Provider 是工作流引擎与外部系统交互的桥梁,采用策略模式设计。
graph LR
subgraph Providers["Providers"]
GitHub[GitHub Provider]
Browser[Browser Provider]
Shell[Shell Provider]
LLM[LLM Provider]
end
subgraph Actions["工作流 Actions"]
git[git.*]
browser[browser.*]
terminal[terminal.*]
llm[llm.*]
end
git --> GitHub
browser --> Browser
terminal --> Shell
llm --> LLMGitHub Provider 示例:
资料来源:packages/core/src/providers/github.ts
// GitHub Provider 支持的操作
- git.listPRs // 列出 Pull Requests
- git.getPR // 获取 PR 详情
- git.createPR // 创建 Pull Request
- git.listIssues // 列出 Issues
- git.getIssue // 获取 Issue 详情
- issues.comment // 添加评论
- issues.transition // 状态流转
Dashboard 前端
Dashboard 是一个基于 Vite + TypeScript 构建的单页应用(SPA),提供可视化的管理工作流界面。
技术栈:
- 构建工具:Vite
- 框架:React(推断自 SPA 架构)
- 入口文件:
packages/dashboard/index.html
资料来源:packages/dashboard/index.html
主要功能页面:
| 页面 | 路由 | 说明 |
|---|---|---|
| 首页 | / | 显示工作流快捷方式卡片 |
| Actions | /actions | 管理工作流定义 |
| Workflows | /workflows | 浏览和执行工作流 |
| Run Logs | /run-logs | 查看执行历史和日志 |
| Settings | /settings | 系统配置(AI 上下文、LLM、集成等) |
CLI 工具
CLI 是用户与系统交互的主要入口之一,整合了所有核心功能。
命令结构:
sidebutton # 启动服务器(默认端口 9876)
sidebutton --stdio # 以 stdio 传输启动(Claude Desktop 集成)
sidebutton -p 8080 # 自定义端口
sidebutton list # 列出可用工作流
sidebutton run <id> # 执行指定工作流
sidebutton status # 检查服务器状态
# Knowledge Packs 管理
sidebutton registry add <path|url> # 添加知识包注册源
sidebutton registry update [name] # 更新已安装的包
sidebutton publish # 发布知识包到远程注册源
资料来源:packages/server/src/cli.ts
MCP 协议集成
SideButton 通过 MCP 协议实现与 AI 助手(Claude Desktop、Cursor 等)的深度集成。
连接配置
Claude Desktop 配置:
{
"mcpServers": {
"sidebutton": {
"command": "npx",
"args": ["sidebutton", "--stdio"]
}
}
}
Cursor 配置:
{
"mcpServers": {
"sidebutton": {
"url": "http://localhost:9876/mcp"
}
}
}
资料来源:README.md
MCP 工具集
| 工具 | 说明 |
|---|---|
run_workflow | 按 ID 执行工作流 |
list_workflows | 列出所有可用工作流 |
get_workflow | 获取工作流 YAML 定义 |
get_run_log | 获取执行日志 |
list_run_logs | 列出最近执行记录 |
get_browser_status | 检查浏览器扩展连接状态 |
capture_page | 捕获页面选择器 |
navigate | 导航到指定 URL |
snapshot | 获取页面无障碍树 |
click | 点击元素 |
type | 输入文本 |
scroll | 滚动页面 |
extract | 提取文本 |
screenshot | 截取页面截图 |
资料来源:packages/server/src/mcp/handler.ts
工作流执行模型
执行上下文
每个工作流执行都维护一个上下文对象,用于在步骤之间传递数据:
context:
previousResult: 上一步骤的输出结果
extracted: 从页面提取的数据
variables: 用户定义的变量
变量插值
使用 {{variable}} 语法引用上下文中保存的值:
steps:
- type: browser.extract
selector: ".username"
as: user
- type: shell.run
cmd: "echo 'Hello, {{user}}!'"
数据存储
系统采用本地文件存储方式:
| 数据类型 | 存储位置 |
|---|---|
| 工作流定义 | YAML 文件 |
| 执行日志 | 本地数据库/JSON 文件 |
| 用户配置 | 设置页面数据 |
| 知识包 | ~/.sidebutton/ 目录 |
扩展机制
Knowledge Packs(知识包)
知识包是按领域组织的可安装知识集合:
包含内容:
- Selectors — UI 元素的 CSS 选择器
- Data Models — 实体类型、字段、关系
- State Machines — 状态转换规则
- Role Playbooks — 角色特定的操作流程
- Common Tasks — 常见任务步骤和边界情况
安装命令:
sidebutton install github.com
sidebutton install atlassian.net
自定义 Provider
开发者可以通过扩展 Provider 接口来添加新的系统集成:
// Provider 接口伪代码
interface Provider {
name: string;
execute(step: Step, context: Context): Promise<Result>;
}
安全考虑
- MCP 端点支持认证机制(Bearer Token)
- 发布知识包需要验证所有权(通过
403 Permission denied保护) - 敏感操作(如
git.createPR)需要明确的参数传递
资料来源:packages/server/src/cli.ts
总结
SideButton 采用清晰的模块化架构:
- 展示层:CLI 工具、Web Dashboard、Chrome 扩展
- 服务层:MCP Server 统一入口,路由到工作流引擎
- 执行层:工作流引擎解析 YAML,调度 Provider 执行
- 集成层:Provider 封装与外部系统(GitHub、Browser、Shell)的交互
这种架构使得系统既可以通过命令行直接使用,也可以作为 AI 代理的工具后端,实现了灵活性和可扩展性的平衡。
资料来源:[pnpm-workspace.yaml](https://github.com/sidebutton/sidebutton/blob/main/pnpm-workspace.yaml)
工作流引擎
工作流引擎(Workflow Engine)是 SideButton 系统的核心组件,负责解析、调度和执行自动化工作流程。该引擎基于 YAML 配置文件驱动,通过模块化的步骤(Step)架构实现浏览器自动化、Shell 命令执行、LLM 推理以及控制流逻辑。引擎设计遵循声明式优先原则,允许用户通过 YAML 定义复杂的多步骤自动化任务,引擎自动处理变量插值、上下文传递和错误...
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
工作流引擎(Workflow Engine)是 SideButton 系统的核心组件,负责解析、调度和执行自动化工作流程。该引擎基于 YAML 配置文件驱动,通过模块化的步骤(Step)架构实现浏览器自动化、Shell 命令执行、LLM 推理以及控制流逻辑。引擎设计遵循声明式优先原则,允许用户通过 YAML 定义复杂的多步骤自动化任务,引擎自动处理变量插值、上下文传递和错误恢复等机制。资料来源:packages/core/README.md:1-10
核心架构
SideButton 工作流引擎采用分层架构,主要包含以下核心模块:
graph TD
A[工作流 YAML 配置] --> B[解析器 Parser]
B --> C[工作流对象 Workflow]
C --> D[执行器 Executor]
D --> E[执行上下文 Context]
E --> F[步骤处理器 Step Handlers]
F --> G[Browser 步骤]
F --> H[Shell 步骤]
F --> I[LLM 步骤]
F --> J[Control 步骤]
F --> K[Data 步骤]
G --> L[浏览器连接]
H --> M[终端会话]
I --> N[LLM Provider]模块职责
| 模块 | 文件路径 | 职责说明 |
|---|---|---|
| 解析器 | packages/core/src/parser.ts | 解析 YAML 配置文件,验证结构,生成工作流对象 |
| 执行器 | packages/core/src/executor.ts | 遍历步骤数组,调用对应处理器,收集执行结果 |
| 变量插值器 | packages/core/src/interpolate.ts | 处理 {{variable}} 语法,执行变量替换 |
| 执行上下文 | packages/core/src/context.ts | 管理步骤间的状态传递和变量共享 |
| 类型定义 | packages/core/src/types.ts | 定义工作流、步骤、结果的 TypeScript 接口 |
资料来源:packages/core/README.md:1-15
工作流定义
基本结构
工作流使用 YAML 格式定义,包含唯一标识、标题和步骤数组:
id: check_ticket_status
title: "检查 Jira 工单状态"
steps:
- type: browser.navigate
url: "https://your-org.atlassian.net/browse/{{ticket_id}}"
- type: browser.extract
selector: "[data-testid='status-field']"
as: current_status
字段说明
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
id | 是 | string | 工作流唯一标识符,用于调用和引用 |
title | 是 | string | 显示名称,呈现于仪表盘和列表 |
description | 否 | string | 工作流功能描述 |
params | 否 | object | 输入参数定义,键为参数名,值为类型 |
steps | 是 | array | 步骤数组,按顺序执行 |
资料来源:packages/core/README.md:50-70
步骤类型详解
浏览器步骤(Browser Steps)
用于自动化网页操作,支持常见 DOM 交互:
| 步骤类型 | 参数 | 说明 |
|---|---|---|
navigate | url | 导航到指定 URL |
click | selector | 点击匹配元素 |
type | selector, text | 向输入框输入文本 |
scroll | direction, amount | 滚动页面 |
hover | selector | 鼠标悬停 |
wait | selector 或 ms | 等待元素或时间 |
extract | selector, as | 提取单个元素文本 |
extractAll | selector, as | 提取所有匹配元素 |
exists | selector, as | 检查元素是否存在 |
steps:
- type: browser.navigate
url: "https://example.com"
- type: browser.extract
selector: ".username"
as: user
- type: browser.click
selector: "#submit-btn"
资料来源:packages/core/README.md:20-25
Shell 步骤(Shell Steps)
执行本地命令行操作:
| 步骤类型 | 参数 | 说明 |
|---|---|---|
shell.run | cmd | 执行 shell 命令 |
terminal.open | - | 打开可见终端窗口(macOS) |
terminal.run | cmd | 在终端窗口中运行命令 |
steps:
- type: shell.run
cmd: "git status"
- type: shell.run
cmd: "npm test"
资料来源:packages/core/README.md:26-28
LLM 步骤(LLM Steps)
集成大语言模型进行推理和生成:
| 步骤类型 | 参数 | 说明 |
|---|---|---|
llm.classify | prompt, classes, as | 结构化分类,返回预定义类别之一 |
llm.generate | prompt, as | 自由文本生成 |
steps:
- type: llm.classify
prompt: "判断此工单是否紧急:{{description}}"
classes: [urgent, normal, low]
as: priority
- type: llm.generate
prompt: "为以下功能写一份简洁的发布说明:{{changes}}"
as: release_notes
LLM 支持多个 Provider,包括 Ollama(本地)、OpenAI、Anthropic 和 Google。资料来源:packages/core/README.md:29-32
控制流步骤(Control Steps)
管理工作流的执行逻辑:
| 步骤类型 | 参数 | 说明 |
|---|---|---|
control.if | condition, then, else | 条件分支 |
control.retry | times, step | 重试机制 |
control.stop | message | 终止工作流并输出消息 |
workflow.call | id, params | 调用其他工作流 |
steps:
- type: browser.extract
selector: ".status"
as: current_status
- type: control.if
condition: "{{current_status}} != 'Done'"
then:
- type: llm.classify
prompt: "判断是否需要关闭工单"
classes: [close, keep_open]
as: decision
资料来源:packages/core/README.md:33-37
数据处理步骤(Data Steps)
操作和转换数据:
| 步骤类型 | 参数 | 说明 |
|---|---|---|
data.first | from, as | 从列表提取第一个元素 |
资料来源:packages/core/README.md:38
变量系统
插值语法
使用双花括号 {{variable}} 语法引用变量:
steps:
- type: browser.extract
selector: ".username"
as: user
- type: shell.run
cmd: "echo 'Hello, {{user}}!'"
变量作用域
变量在执行上下文中维护,遵循以下规则:
- 步骤输出变量:使用
as参数命名的变量在后续步骤中可用 - 参数变量:工作流参数通过
{{paramName}}传入 - 嵌套属性:支持点号访问,如
{{user.name}}
id: example_workflow
params:
ticket_id: string
steps:
- type: browser.navigate
url: "https://jira.com/browse/{{ticket_id}}"
资料来源:packages/core/README.md:55-65
执行上下文
执行上下文(Context)在整个工作流执行期间维护状态,负责:
- 变量存储:保存每个步骤的输出结果
- 参数传递:管理输入参数和默认值
- 错误传播:记录失败步骤并支持重试逻辑
- 结果聚合:收集步骤执行日志和输出
sequenceDiagram
participant U as 用户调用
participant C as 执行上下文
participant S1 as 步骤 1
participant S2 as 步骤 2
participant S3 as 步骤 3
U->>C: 初始化(参数、环境)
C->>S1: 执行 navigate
S1-->>C: 存储结果 var1
C->>S2: 执行 extract
S2-->>C: 存储结果 var2
C->>S3: 执行 llm.classify
S3-->>C: 存储结果 decision
C-->>U: 返回执行结果MCP 工具集成
工作流引擎通过 MCP(Model Context Protocol)暴露工具接口,支持外部 AI 助手调用:
| MCP 工具 | 功能 |
|---|---|
run_workflow | 根据 ID 执行工作流 |
list_workflows | 列出所有可用工作流 |
get_workflow | 获取工作流 YAML 定义 |
get_run_log | 获取执行日志 |
list_run_logs | 列出最近执行记录 |
{
"mcpServers": {
"sidebutton": {
"command": "npx",
"args": ["sidebutton", "--stdio"]
}
}
}
资料来源:packages/server/README.md:40-55
配置与部署
工作流存储
工作流文件存储在配置的 actions 目录中,使用 YAML 格式:
actions/
├── check_ticket.yaml
├── create_issue.yaml
└── news_daily.yaml
服务器配置
SideButton 服务器默认监听 9876 端口,通过 @sidebutton/server 包部署:
sidebutton # 启动服务器(默认端口 9876)
sidebutton --stdio # 以 stdio 传输模式启动
sidebutton -p 8080 # 自定义端口
执行流程
graph LR
A[解析 YAML] --> B[验证结构]
B --> C[初始化上下文]
C --> D{遍历步骤}
D -->|有步骤| E[解析步骤类型]
E --> F[插值变量]
F --> G[执行处理器]
G --> H{成功?}
H -->|是| I[更新上下文]
I --> D
H -->|否| J{支持重试?}
J -->|是| G
J -->|否| K[记录错误]
K --> L[终止执行]
D -->|无步骤| M[返回结果]扩展工作流引擎
添加新步骤类型
- 在
types.ts中定义新的步骤接口 - 在解析器中添加类型验证
- 在执行器中注册处理器
- 实现具体的执行逻辑
自定义 Provider
LLM Provider 支持扩展,需实现标准接口:
interface LLMProvider {
classify(prompt: string, classes: string[]): Promise<string>;
generate(prompt: string): Promise<string>;
}
相关资源
资料来源:[packages/core/README.md:1-15]()
MCP 服务器
MCP(Model Context Protocol)服务器是 SideButton 的核心组件之一,扮演 AI 代理与浏览器自动化能力之间的桥梁角色。作为一个 MCP 兼容的服务器实现,它向 AI 助手(如 Claude Desktop、Cursor 等)暴露了一系列工具,使得 AI 能够通过标准化的协议执行浏览器操作、工作流自动化以及其他系统任务。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
MCP(Model Context Protocol)服务器是 SideButton 的核心组件之一,扮演 AI 代理与浏览器自动化能力之间的桥梁角色。作为一个 MCP 兼容的服务器实现,它向 AI 助手(如 Claude Desktop、Cursor 等)暴露了一系列工具,使得 AI 能够通过标准化的协议执行浏览器操作、工作流自动化以及其他系统任务。
SideButton 的 MCP 服务器基于 TypeScript 构建,采用 Fastify 作为底层 HTTP 框架,并支持多种传输协议以适应不同的集成场景。资料来源:packages/server/README.md
架构设计
整体架构
MCP 服务器采用了分层架构设计,主要包含以下几个核心模块:
| 模块 | 文件路径 | 职责 |
|---|---|---|
| MCP Handler | packages/server/src/mcp/handler.ts | 处理 MCP 协议消息的接收和响应 |
| STDIO 传输 | packages/server/src/mcp/stdio.ts | 支持标准输入输出的传输模式 |
| 工具注册 | packages/server/src/mcp/tools.ts | 定义和注册所有可用的 MCP 工具 |
| 服务器入口 | packages/server/src/server.ts | 主服务器启动和路由配置 |
| STDIO 模式 | packages/server/src/stdio-mode.ts | CLI 模式下的独立 STDIO 进程 |
传输协议支持
MCP 服务器支持两种主要的传输协议:
- SSE(Server-Sent Events):基于 HTTP 的长连接推送模式,适用于 Web 应用和远程连接场景
- STDIO:标准输入输出模式,专为本地 CLI 工具和 AI 桌面应用集成设计
graph TD
A[AI 助手] -->|MCP 协议| B{MCP 服务器}
B -->|SSE| C[Web/远程连接]
B -->|STDIO| D[本地 CLI]
B --> E[工具执行层]
E --> F[浏览器自动化]
E --> G[工作流引擎]
E --> H[Shell 命令]工具体系
MCP 服务器通过工具(Tools)向 AI 暴露功能,所有工具按照功能域进行分类组织。
工具分类总览
| 类别 | 工具列表 | 说明 |
|---|---|---|
| 工作流 | run_workflow, list_workflows, get_workflow | 工作流的执行和查询 |
| 运行日志 | get_run_log, list_run_logs | 查看工作流执行历史 |
| 浏览器 | navigate, snapshot, click, type, scroll, hover, screenshot, extract, extract_all, extract_map, wait, key, exists, select_option | 浏览器页面操作 |
| 浏览器元数据 | get_browser_status, capture_page | 浏览器连接状态和元素捕获 |
工作流工具
| 工具名称 | 功能描述 |
|---|---|
run_workflow | 根据工作流 ID 执行预构建的工作流自动化 |
list_workflows | 列出所有可用的工作流 |
get_workflow | 获取工作流的 YAML 定义内容 |
get_run_log | 获取指定运行的执行日志详情 |
list_run_logs | 列出最近的工作流执行记录 |
资料来源:packages/server/README.md
浏览器自动化工具
浏览器工具提供了对网页的完整控制能力:
| 工具 | 参数示例 | 功能 | |
|---|---|---|---|
navigate | { url: string } | 导航浏览器到指定 URL | |
snapshot | { ref?: string } | 获取页面可访问性快照 | |
click | { ref: string } | 点击指定元素 | |
type | { ref: string, text: string } | 向输入框输入文本 | |
scroll | `{ direction: 'up' \ | 'down', amount?: number }` | 滚动页面 |
hover | { ref: string } | 鼠标悬停在元素上 | |
extract | { selector: string } | 从页面提取文本内容 | |
extract_all | { selector: string } | 提取所有匹配元素的内容 | |
extract_map | { selector: string, fields: object } | 从重复元素提取结构化数据 | |
screenshot | { name?: string } | 捕获页面截图 | |
select_option | { ref: string, option: string } | 选择下拉选项 | |
get_browser_status | 无参数 | 检查浏览器扩展连接状态 | |
capture_page | 无参数 | 捕获页面选择器信息 |
集成配置
Cursor IDE 配置
在 ~/.cursor/mcp.json 中添加以下配置:
{
"mcpServers": {
"sidebutton": {
"url": "http://localhost:9876/mcp"
}
}
}
Claude Desktop 配置
在 ~/Library/Application Support/Claude/claude_desktop_config.json 中添加:
{
"mcpServers": {
"sidebutton": {
"command": "npx",
"args": ["sidebutton", "--stdio"]
}
}
}
资料来源:packages/sidebutton/README.md
工作流引擎集成
MCP 服务器与核心工作流引擎(@sidebutton/core)紧密集成。工作流引擎负责解析和执行 YAML 格式的工作流定义。
支持的步骤类型
| 类别 | 步骤类型 | 说明 |
|---|---|---|
| 浏览器 | navigate, click, type, scroll, hover, wait, extract, extractAll, exists, key | 页面交互操作 |
| Shell | shell.run, terminal.open, terminal.run | 命令行执行 |
| LLM | llm.classify, llm.generate | AI 生成和分类 |
| 控制流 | control.if, control.retry, control.stop, workflow.call | 流程控制 |
| 数据 | data.first, variable.set, data.get | 数据操作 |
工作流示例
steps:
- type: browser.navigate
url: "https://github.com"
- type: browser.extract
selector: ".username"
as: user
- type: shell.run
cmd: "echo 'Hello, {{user}}!'"
浏览器扩展集成
MCP 服务器通过 WebSocket 与 Chrome 扩展保持稳定连接,实现真正的 DOM 访问能力。这与传统的基于像素坐标或截图的方法有本质区别。
扩展功能特性
- 40+ 浏览器命令:包括导航、点击、输入、提取、滚动、等待、快照等
- 真实 DOM 访问:通过 CSS 选择器精确定位元素
- 录制模式:捕获手动操作并转换为工作流
- 嵌入按钮:向任意网页注入操作按钮
- WebSocket 连接:支持自动重连,适用于本地或远程部署
资料来源:README.md
部署模式
独立服务器模式
默认情况下,启动 MCP 服务器会同时启动 Web UI 仪表板:
sidebutton # 启动服务器(默认端口 9876)
sidebutton -p 8080 # 自定义端口
STDIO 传输模式
适用于 AI 桌面应用的集成模式:
sidebutton --stdio # 启动 stdio 传输模式
服务器端点
| 端点 | 方法 | 功能 |
|---|---|---|
/ | GET | Web UI 仪表板 |
/mcp | GET/POST | MCP 协议端点(SSE) |
/api/workflows | GET | REST API - 获取工作流列表 |
/api/workflows/:id/run | POST | REST API - 执行工作流 |
/api/run-logs | GET | REST API - 获取运行日志 |
与其他组件的关系
graph LR
A[MCP 服务器] -->|调用| B[核心引擎<br>@sidebutton/core]
A -->|WebSocket| C[Chrome 扩展]
A -->|HTTP/WebSocket| D[仪表板 Web UI]
B -->|执行| E[浏览器自动化]
B -->|执行| F[Shell 命令]
B -->|执行| G[LLM 调用]技术栈
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 运行时 | Node.js / TypeScript | 严格模式 + ES 模块 |
| HTTP 框架 | Fastify | 高性能 Web 框架 |
| 包管理 | pnpm | Monorepo 支持 |
| 协议 | MCP (Model Context Protocol) | AI 工具交互标准 |
相关资源
资料来源:[packages/server/README.md]()
Chrome 扩展
SideButton Chrome 扩展是连接用户浏览器与本地工作流引擎的核心桥梁,提供基于真实 DOM 的浏览器自动化能力。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
功能概述
Chrome 扩展通过 WebSocket 与本地服务器建立持久连接,实现以下核心功能:
| 功能类别 | 具体能力 |
|---|---|
| 页面导航 | navigate 打开 URL 地址 |
| 元素交互 | click 点击、type 输入文本、hover 悬停 |
| 内容提取 | extract 提取文本、extract_all 批量提取、extract_map 结构化提取 |
| 页面分析 | snapshot 获取无障碍树、screenshot 截图 |
| 表单操作 | fill 填充表单值(兼容 React)、select_option 选择下拉选项 |
| 元素状态 | exists 检查元素是否存在、wait 等待元素或延迟 |
| 高级能力 | scroll 滚动页面、scroll_into_view 滚动到可视区域、evaluate 执行 JavaScript、press_key 发送键盘事件 |
资料来源:README.md:70-81
安装方式
从 Chrome 应用商店安装
SideButton 扩展已发布至 Chrome Web Store,可直接安装:
安装地址: https://chromewebstore.google.com/detail/sidebutton/odaefhmdmgijnhdbkfagnlnmobphgkij
本地加载开发版本
如需开发或测试最新功能,可加载未打包的扩展程序:
- 打开
chrome://extensions/ - 启用右上角的 Developer mode(开发者模式)
- 点击 Load unpacked(加载已解压的扩展程序)
- 选择项目根目录下的
extension/文件夹
技术架构
连接架构
SideButton 采用客户端-服务器架构,Chrome 扩展作为客户端通过 WebSocket 与本地 MCP 服务器通信:
graph LR
A[Chrome 浏览器] -->|WebSocket| B[SideButton 扩展]
B -->|WebSocket| C[本地服务器 :9876]
C --> D[MCP 工具层]
D --> E[Core 工作流引擎]
C --> F[REST API]通信协议
扩展与服务器之间使用 WebSocket 协议,支持稳定重连机制,无论服务器运行在本地还是远程均可正常工作。
资料来源:README.md:52-54
核心交互流程
sequenceDiagram
participant User as 用户
participant Extension as Chrome 扩展
participant Server as 本地服务器
participant Browser as 目标网页
User->>Extension: 点击扩展图标
Extension->>Server: 建立 WebSocket 连接
Server-->>Extension: 连接确认
User->>Extension: 执行浏览器命令
Extension->>Browser: DOM 操作
Browser-->>Extension: 操作结果
Extension-->>User: 展示结果浏览器命令详解
页面导航与快照
| 命令 | 参数 | 说明 |
|---|---|---|
navigate | url | 导航至指定 URL |
snapshot | - | 获取页面无障碍快照(YAML 格式),返回元素引用 ref=N |
screenshot | - | 捕获页面截图 |
capture_page | - | 捕获当前页面的 CSS 选择器 |
snapshot 命令返回结构化的 YAML 格式数据,每个可交互元素都有对应的引用编号,可用于后续的 click、type 等操作:
- ref: 1
role: button
name: "提交"
focused: false
- ref: 2
role: textbox
name: "用户名"
focused: true
资料来源:packages/server/defaults/roles/qa.md:68-74
元素定位与交互
SideButton 使用 CSS 选择器 进行元素定位,而非像素坐标或截图方式:
| 命令 | 参数 | 说明 |
|---|---|---|
click | selector | 点击匹配选择器的元素 |
type | selector, text | 向匹配的元素输入文本 |
hover | selector | 悬停至匹配的元素 |
scroll | direction | 滚动页面(up/down) |
extract | selector | 从匹配的元素提取文本 |
exists | selector | 检查元素是否存在 |
所有浏览器操作均基于真实 DOM 访问,确保与 React、Vue 等现代前端框架的完全兼容性。
资料来源:packages/server/README.md:44-53
表单处理
| 命令 | 参数 | 说明 |
|---|---|---|
fill | selector, value | 直接填充输入值(React 友好) |
select_option | selector, value | 选择下拉选项 |
press_key | keys | 发送键盘组合键 |
fill 命令专为 React 等虚拟 DOM 框架设计,能够正确触发 onChange 事件:
steps:
- type: browser.fill
selector: "#search-input"
value: "SideButton"
资料来源:README.md:80-81
高级操作
| 命令 | 参数 | 说明 |
|---|---|---|
evaluate | script | 在浏览器上下文中执行 JavaScript |
scroll_into_view | selector | 将元素滚动到可视区域 |
wait | selector 或 ms | 等待元素出现或延时 |
extract_all | selector | 提取所有匹配元素的文本 |
extract_map | selector | 从重复元素提取结构化数据 |
evaluate 命令允许执行任意 JavaScript,可用于复杂的前端交互场景:
steps:
- type: browser.evaluate
script: "document.querySelector('.modal').style.display = 'none'"
扩展状态指示
Chrome 扩展图标会显示当前连接状态:
- 已连接:扩展图标高亮,浏览器扩展已成功连接服务器
- 未连接:扩展图标灰显,无法执行浏览器命令
验证连接状态
通过 MCP 工具 get_browser_status 可检查扩展连接:
{
"connected": true,
"url": "https://github.com"
}
资料来源:packages/server/README.md:42-43
录制模式
扩展内置录制功能,可将用户在浏览器中的手动操作捕获为工作流 YAML:
- 启用录制模式
- 在目标页面上执行操作
- 停止录制
- 导出的 YAML 可直接作为工作流使用
录制模式大幅降低了自动化脚本的创建门槛,非技术用户也能快速生成浏览器自动化流程。
资料来源:README.md:51
嵌入按钮
SideButton 支持向任意网页注入自定义操作按钮(Embed Buttons),适用于:
- 在第三方网站中注入快捷操作
- 为特定业务场景定制操作入口
- 扩展现有网站的功能
资料来源:README.md:51
与 GitHub 浏览器集成的目标配置
SideButton 提供专门针对 GitHub 的浏览器目标配置,可通过设置环境变量配置:
| 环境变量 | 说明 | 示例值 |
|---|---|---|
GITHUB_BROWSER_URL | GitHub 网站地址 | https://github.com |
GitHub 浏览器操作示例
graph TD
A[打开 PR 页面] --> B[使用 snapshot 读取详情]
B --> C[点击 Files changed 标签]
C --> D[查看 diff 内容]
E[列出 PR 列表] --> F[导航到 /owner/repo/pulls]
F --> G[使用 snapshot 读取列表]
H[创建 Issue] --> I[运行 github_browser_create_issue 工作流]
I --> J[或直接导航到 /owner/repo/issues/new]使用浏览器工具查看 PR 详情:
steps:
- type: browser.navigate
url: "{GITHUB_BROWSER_URL}/owner/repo/pull/123"
- type: browser.snapshot
as: pr_details
- type: browser.click
selector: ".tabnav-tab[href*='files']"
资料来源:packages/server/defaults/targets/_provider-github-browser.md
常见问题排查
扩展显示未连接
- 确认本地服务器已启动(运行
pnpm dev:server或sidebutton start) - 验证服务器端口为 9876
- 在 Chrome 中检查扩展是否已启用
- 刷新扩展页面或重启服务器
浏览器命令执行失败
- 使用
snapshot检查页面是否正确加载 - 确认选择器是否仍然有效(页面结构可能已变化)
- 添加
wait步骤等待页面元素加载 - 检查服务器日志获取详细错误信息
录制模式无法捕获操作
- 确保选择正确的标签页
- 某些 iframe 内容可能无法录制
- 检查是否有 JavaScript 错误阻止事件监听
工作流集成
Chrome 扩展命令通常作为工作流步骤的一部分执行:
id: github_review_pr
title: "Review GitHub PR"
steps:
- type: browser.navigate
url: "{{pr_url}}"
- type: browser.snapshot
as: page_structure
- type: browser.extract
selector: ".pr-description"
as: description
- type: llm.classify
input: "{{description}}"
categories:
- bug
- feature
- refactor
as: type
- type: browser.click
selector: "button[data-tab='files']"
通过 workflow.call 可以在工作流中链式调用其他工作流,实现复杂的浏览器自动化场景。
相关文档
资料来源:[README.md:70-81]()
Dashboard 仪表盘
Dashboard 是 SideButton 项目的可视化控制中心,为用户提供工作流(Workflow)和快捷方式(Shortcut)的集中管理界面。它作为 Web 前端应用运行在浏览器中,通过 REST API 与后端服务器通信,实现工作流的创建、编辑、执行和监控功能。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
Dashboard 是 SideButton 项目的可视化控制中心,为用户提供工作流(Workflow)和快捷方式(Shortcut)的集中管理界面。它作为 Web 前端应用运行在浏览器中,通过 REST API 与后端服务器通信,实现工作流的创建、编辑、执行和监控功能。
资料来源:packages/dashboard/index.html:1-11
技术架构
组件结构
Dashboard 采用 Svelte 框架构建,核心组件结构如下:
graph TD
A[App.svelte] --> B[DashboardView.svelte]
A --> C[WorkflowsView.svelte]
A --> D[ActionsView.svelte]
A --> E[RunLogsView.svelte]
A --> F[SettingsView.svelte]
B --> G[api.ts]
C --> G
D --> G
E --> G
G --> H[Server API<br/>localhost:9876]
H --> I[Workflow Engine<br/>@sidebutton/core]入口文件
Dashboard 的入口点是 packages/dashboard/index.html,它加载 Svelte 应用并挂载到 #app 容器中:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>SideButton</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
资料来源:packages/dashboard/index.html:1-11
核心视图
DashboardView 工作流视图
DashboardView 是仪表盘的主页面,负责展示快捷方式网格和工作流卡片。每个快捷方式卡片显示工作流标题和运行按钮,点击运行按钮可打开参数模态框(如果工作流需要参数)或立即执行。
资料来源:packages/server/defaults/roles/qa.md:32-45
#### 页面验证清单
| 验证项 | 预期结果 |
|---|---|
| 快捷方式网格显示 | 显示工作流标题和运行按钮 |
| 参数模态框 | 需要参数的工作流打开参数输入界面 |
| 立即执行 | 无参数工作流点击后直接执行 |
| 添加到仪表盘 | 从 Actions/Workflows 页面可添加快捷方式 |
WorkflowsView 工作流库视图
WorkflowsView 展示工作流库中的所有可用工作流,提供搜索、排序和分类筛选功能。
#### 功能特性
| 功能 | 说明 |
|---|---|
| 搜索过滤 | 按标题和描述文本过滤工作流卡片 |
| 分类筛选 | 按类别(Category)筛选工作流 |
| 排序选项 | 支持按名称A-Z、运行次数、成功率、最近验证时间排序 |
| 详情查看 | 点击卡片查看工作流详细信息(只读视图) |
资料来源:packages/server/defaults/roles/qa.md:58-73
其他视图页面
| 页面路由 | 功能描述 |
|---|---|
/actions | 动作管理页面,展示所有自定义动作 |
/actions/:id | 动作详情页,显示步骤和参数配置 |
/recordings | 录制回放页面 |
/run-logs | 运行日志页面,展示执行历史和统计 |
/settings | 设置页面,包含 AI 上下文、LLM 提供商配置 |
资料来源:packages/server/defaults/roles/qa.md:48-67
API 集成
API 模块结构
packages/dashboard/src/lib/api.ts 封装了所有与后端服务器的通信接口,提供类型安全的 API 调用方法。
核心 API 端点
| 端点 | 方法 | 描述 |
|---|---|---|
/health | GET | 服务器健康状态检查 |
/api/workflows | GET | 获取工作流列表 |
/api/workflows/:id | GET | 获取单个工作流详情 |
/api/workflows/:id/run | POST | 执行工作流 |
/api/run-logs | GET | 获取运行日志列表 |
/api/run-logs/:id | GET | 获取单条运行日志详情 |
/api/shortcuts | GET/POST/DELETE | 快捷方式管理 |
资料来源:packages/dashboard/src/lib/api.ts
健康检查流程
sequenceDiagram
participant D as Dashboard
participant S as Server
participant B as Browser Extension
D->>S: GET /health
S-->>D: {status: "ok", version: "...", browser_connected: true}
alt browser_connected: false
D->>D: 显示连接警告
D->>B: 提示用户检查扩展状态
end资料来源:packages/server/defaults/roles/qa.md:24-30
运行日志与监控
运行日志页面
Run Logs 页面展示工作流执行的历史记录,包含以下信息:
- KPI 统计栏(总执行次数、成功率、平均执行时间)
- 执行状态(成功、失败、进行中)
- 步骤级执行详情
| 指标 | 说明 |
|---|---|
| 执行总数 | 累计执行的工作流数量 |
| 成功率 | 成功执行占总执行的比例 |
| 平均耗时 | 所有执行步骤的平均时间 |
| 清空日志 | 提供一键清空所有运行日志功能 |
资料来源:packages/server/defaults/roles/qa.md:48-52
执行详情
每个运行日志条目包含:
- 工作流 ID 和名称
- 开始和结束时间戳
- 每一步的输入输出数据
- 错误信息和堆栈跟踪(如有)
- 最终状态(success/failure/running)
设置页面
Settings 页面提供系统配置功能,包含多个子选项卡:
子选项卡结构
| 选项卡 | 功能 |
|---|---|
| AI Context | 全局 AI 上下文配置 |
| Persona | AI 角色扮演 persona 文本编辑 |
| Roles | 角色定义和开关管理 |
| Targets | 目标网站匹配规则配置 |
| Integrations | 第三方提供商连接状态 |
| Inline | 内联上下文和环境变量 |
资料来源:packages/server/defaults/roles/qa.md:54-67
开发与部署
开发环境启动
pnpm dev # 启动所有组件(热重载)
pnpm dev:server # 仅启动服务器 :9876
pnpm dev:dashboard # 仅启动仪表盘 :5173
pnpm dev:core # 核心库监视构建
资料来源:CONTRIBUTING.md
生产构建
Dashboard 作为 Vite 构建的单页应用,输出静态资源供服务器托管。
烟雾测试清单
在部署或更新后,应验证以下功能正常工作:
| 步骤 | 测试项 | 验证方法 |
|---|---|---|
| 1 | 服务器健康 | GET /health 返回 status: "ok" |
| 2 | 扩展连接 | get_browser_status 返回 connected: true |
| 3 | 仪表盘首页 | 导航栏、快捷方式网格正常显示 |
| 4 | Actions 页面 | 动作卡片、搜索、筛选功能正常 |
| 5 | Library 页面 | 工作流卡片、排序、搜索正常 |
| 6 | Run Logs 页面 | 统计栏、日志列表正常 |
| 7 | Settings 页面 | 所有子选项卡加载正常 |
| 8 | 工作流执行 | 成功运行工作流并生成日志 |
| 9 | MCP 快照 | snapshot 返回结构化数据 |
资料来源:packages/server/defaults/roles/qa.md:18-85
故障排除
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 页面空白 | 服务器未启动 | 执行 pnpm dev 启动服务 |
| 快捷方式不显示 | 数据库未初始化 | 检查 browser_connected 状态 |
| 工作流执行失败 | 扩展未连接 | 在 Chrome 扩展页面验证 SideButton 扩展已启用 |
| API 调用超时 | 端口冲突或防火墙 | 检查 9876 端口占用情况 |
资料来源:[packages/dashboard/index.html:1-11]()
步骤类型参考
本文档详细介绍 SideButton 工作流引擎支持的所有步骤类型。步骤是工作流的基本构建单元,每个步骤执行特定的操作并可产生输出供后续步骤使用。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
SideButton 工作流采用 YAML 格式定义步骤,支持七大类步骤类型:
| 类别 | 用途 | 示例步骤 |
|---|---|---|
| Browser | 浏览器自动化操作 | navigate, click, type, extract |
| Shell | 命令行和终端操作 | shell.run, terminal.open, terminal.run |
| LLM | AI 驱动的决策和生成 | llm.generate, llm.decide, llm.classify |
| Control | 工作流控制流 | control.if, control.retry, control.stop, workflow.call |
| Data | 数据操作和变量管理 | variable.set, data.first, data.get |
| Git | GitHub/GitLab 操作 | git.getPR, git.createPR, git.listIssues |
| Issues | 任务追踪系统操作 | issues.search, issues.create, issues.transition |
Browser 步骤类型
Browser 步骤用于自动化浏览器操作,是 SideButton 的核心功能之一。通过 Chrome 扩展连接浏览器后,可以执行各种 DOM 操作。
页面导航与交互
| 步骤类型 | 参数 | 说明 |
|---|---|---|
browser.navigate | url (必需) | 导航到指定 URL |
browser.click | selector (必需) | 点击匹配选择器的元素 |
browser.type | selector, text (必需) | 向输入框输入文本 |
browser.hover | selector (必需) | 鼠标悬停在元素上 |
browser.key | keys (必需) | 模拟键盘按键 |
browser.scroll | direction, amount | 滚动页面 |
# 示例:导航并登录
steps:
- type: browser.navigate
url: "https://github.com/login"
- type: browser.type
selector: "#login_field"
text: "[email protected]"
- type: browser.type
selector: "#password"
text: "{{password}}"
- type: browser.click
selector: "[type='submit']"
内容提取
| 步骤类型 | 参数 | 说明 |
|---|---|---|
browser.extract | selector (必需), as | 从单个元素提取文本 |
browser.extract_all | selector (必需), as | 提取所有匹配元素的文本 |
browser.extract_map | selector, as | 从重复元素提取结构化数据 |
browser.snapshot | - | 获取页面可访问性树 |
browser.screenshot | - | 捕获页面截图 |
# 示例:提取页面数据
steps:
- type: browser.extract
selector: ".username"
as: user
- type: browser.extract_all
selector: ".comment"
as: comments
- type: browser.extract_map
selector: ".repo-card"
as: repos
fields:
- selector: ".repo-name"
as: name
- selector: ".repo-stars"
as: stars
状态检查
| 步骤类型 | 参数 | 说明 |
|---|---|---|
browser.exists | selector (必需), as | 检查元素是否存在 |
browser.wait | selector, timeout | 等待元素出现 |
# 示例:等待并验证
steps:
- type: browser.wait
selector: "#loading-complete"
timeout: 5000
- type: browser.exists
selector: ".error-message"
as: hasError
Shell 步骤类型
Shell 步骤用于执行命令行操作,支持 shell 命令和交互式终端会话。
命令执行
| 步骤类型 | 参数 | 说明 |
|---|---|---|
shell.run | cmd (必需), cwd, env | 执行单条 shell 命令 |
shell.exec | script (必需) | 执行多行脚本 |
# 示例:执行 shell 命令
steps:
- type: shell.run
cmd: "git status"
cwd: "/path/to/repo"
- type: shell.run
cmd: "npm test -- --coverage"
env:
CI: "true"
交互式终端
| 步骤类型 | 参数 | 说明 |
|---|---|---|
terminal.open | cmd (必需) | 打开新的终端会话 |
terminal.run | cmd (必需), session | 在终端会话中执行命令 |
# 示例:交互式终端
steps:
- type: terminal.open
cmd: "ssh user@server"
- type: terminal.run
session: ssh_session
cmd: "ls -la"
LLM 步骤类型
LLM 步骤利用 AI 能力进行内容生成、决策判断和文本分类。
内容生成
| 步骤类型 | 参数 | 说明 |
|---|---|---|
llm.generate | prompt (必需), as | 根据提示词生成内容 |
llm.complete | text (必需), as | 补全给定文本 |
# 示例:生成内容
steps:
- type: llm.generate
prompt: |
为以下代码写一个简洁的提交信息:
{{diff}}
as: commit_message
- type: shell.run
cmd: "git commit -m '{{commit_message}}'"
AI 决策
| 步骤类型 | 参数 | 说明 |
|---|---|---|
llm.decide | options (必需), context, as | 从多个选项中选择 |
llm.classify | categories (必需), text, as | 将文本分类到预定义类别 |
# 示例:AI 决策
steps:
- type: llm.decide
context: "Issue 描述:{{issue.description}}"
options:
- value: bug
label: "Bug 修复"
- value: feature
label: "新功能"
- value: refactor
label: "代码重构"
as: issue_type
# 示例:文本分类
steps:
- type: llm.classify
text: "{{user_feedback}}"
categories:
- positive
- negative
- neutral
as: sentiment
Control 步骤类型
Control 步骤用于控制工作流的执行流程,实现条件分支、重试机制和子工作流调用。
条件执行
| 步骤类型 | 参数 | 说明 |
|---|---|---|
control.if | condition (必需), then, else | 条件分支执行 |
# 示例:条件分支
steps:
- type: control.if
condition: "{{has_error}} == true"
then:
- type: issues.create
title: "Build Failed"
body: "Error: {{error_message}}"
else:
- type: shell.run
cmd: "echo 'Build successful'"
重试机制
| 步骤类型 | 参数 | 说明 |
|---|---|---|
control.retry | max_attempts (必需), steps, on_error | 重试失败的步骤 |
# 示例:重试机制
steps:
- type: control.retry
max_attempts: 3
steps:
- type: shell.run
cmd: "curl -f https://api.example.com/data"
on_error:
- type: llm.generate
prompt: "分析错误:{{error}}"
as: error_analysis
工作流停止与调用
| 步骤类型 | 参数 | 说明 |
|---|---|---|
control.stop | message (必需), status | 停止工作流并返回消息 |
workflow.call | workflow_id (必需), params | 调用子工作流 |
# 示例:调用子工作流
steps:
- type: workflow.call
workflow_id: "send-notification"
params:
channel: "slack"
message: "部署完成"
Data 步骤类型
Data 步骤用于变量管理和数据操作,实现工作流各步骤间的数据流转。
变量管理
| 步骤类型 | 参数 | 说明 |
|---|---|---|
variable.set | name (必需), value (必需) | 设置变量值 |
variable.get | name (必需), as | 获取变量值 |
# 示例:变量操作
steps:
- type: variable.set
name: "counter"
value: 0
- type: variable.set
name: "counter"
value: "{{counter}} + 1"
数据提取
| 步骤类型 | 参数 | 说明 |
|---|---|---|
data.first | items (必需), as | 获取数组第一个元素 |
data.get | path (必需), from, as | 从嵌套数据结构获取值 |
# 示例:数据提取
steps:
- type: data.first
items: "{{users}}"
as: first_user
- type: data.get
path: "user.profile.name"
from: "{{response}}"
as: user_name
Git 步骤类型
Git 步骤通过 GitHub CLI (gh) 与 GitHub 平台交互,实现 PR 和 Issue 的自动化管理。
Pull Request 操作
| 步骤类型 | 参数 | 说明 |
|---|---|---|
git.listPRs | repo, state, limit | 列出 Pull Requests |
git.getPR | repo (必需), number (必需) | 获取 PR 详情 |
git.createPR | title, head, base, body, repo | 创建 Pull Request |
# 示例:获取并创建 PR
steps:
- type: git.getPR
repo: "owner/repo"
number: 123
as: pr_details
- type: git.createPR
repo: "owner/repo"
title: "Add new feature"
head: "feature-branch"
base: "main"
body: "## Changes\n\n- Feature implementation"
Issue 操作
| 步骤类型 | 参数 | 说明 |
|---|---|---|
git.listIssues | repo, state, labels, limit | 列出 Issues |
git.getIssue | repo (必需), number (必需) | 获取 Issue 详情 |
# 示例:列出 Issues
steps:
- type: git.listIssues
repo: "owner/repo"
state: "open"
labels: "bug,high-priority"
limit: 10
as: issues
Issues 步骤类型
Issues 步骤用于与任务追踪系统交互,支持多种提供商(GitHub Issues、Jira 等)。
搜索与获取
| 步骤类型 | 参数 | 说明 |
|---|---|---|
issues.search | query (必需), provider, as | 搜索 Issues |
issues.get | id (必需), provider, as | 获取 Issue 详情 |
# 示例:搜索 Issues
steps:
- type: issues.search
query: "is:issue is:open label:bug"
provider: "github"
as: bug_issues
创建与管理
| 步骤类型 | 参数 | 说明 |
|---|---|---|
issues.create | title (必需), body, labels, provider | 创建 Issue |
issues.comment | id, body, provider | 添加评论 |
issues.transition | id, status, provider | 状态转换 |
issues.attach | id, file, provider | 添加附件 |
# 示例:创建 Issue 并添加评论
steps:
- type: issues.create
title: "Login button not working"
body: |
## Description
The login button doesn't respond on the dashboard page.
## Steps to Reproduce
1. Navigate to /dashboard
2. Click the login button
3. Nothing happens
labels:
- bug
- priority:high
as: created_issue
- type: issues.comment
id: "{{created_issue.id}}"
body: "This issue has been assigned to the engineering team."
变量插值
SideButton 支持 {{variable}} 语法在步骤间传递数据:
steps:
- type: browser.extract
selector: ".title"
as: page_title
- type: llm.generate
prompt: "Summarize: {{page_title}}"
as: summary
- type: shell.run
cmd: "echo '{{summary}}' > /tmp/summary.txt"
步骤执行顺序
┌─────────────────────────────────────────┐
│ 工作流执行流程 │
├─────────────────────────────────────────┤
│ 1. 解析 YAML 定义 │
│ 2. 按顺序执行步骤(除非 control.* 改变) │
│ 3. 每个步骤产出输出到上下文 │
│ 4. 后续步骤通过 {{}} 引用前序输出 │
│ 5. 异常处理(根据 control.retry 配置) │
└─────────────────────────────────────────┘
最佳实践
1. 选择合适的步骤类型
优先使用专用 API 步骤而非浏览器自动化:
| 场景 | 推荐步骤 | 原因 |
|---|---|---|
| 获取 PR 列表 | git.listPRs | API 调用更快、更可靠 |
| 文件修改 | shell.run | 直接操作文件系统 |
| 复杂交互 | browser.* | 通用浏览器控制 |
2. 错误处理
使用 control.retry 处理瞬时失败:
steps:
- type: control.retry
max_attempts: 3
steps:
- type: shell.run
cmd: "curl -X POST https://api.example.com/upload"
3. 数据提取模式
使用结构化提取提高数据质量:
steps:
- type: browser.extract_map
selector: ".item-card"
as: items
fields:
- selector: ".item-title"
as: title
- selector: ".item-price"
as: price
transform: "parseFloat"
相关资源
来源:https://github.com/sidebutton/sidebutton / 项目说明书
知识包系统
知识包(Knowledge Pack)是 SideButton 项目中用于向 AI 代理传授特定 Web 应用操作知识的可安装模块。知识包使 AI 代理能够理解目标应用的结构、交互方式和业务流程,从而执行自动化任务、代码审查、软件工程等复杂工作。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
知识包(Knowledge Pack)是 SideButton 项目中用于向 AI 代理传授特定 Web 应用操作知识的可安装模块。知识包使 AI 代理能够理解目标应用的结构、交互方式和业务流程,从而执行自动化任务、代码审查、软件工程等复杂工作。
资料来源:README.md:45-52
核心概念
什么是知识包
知识包是一种结构化的知识载体,包含以下关键组件:
| 组件类型 | 说明 |
|---|---|
| 选择器(Selectors) | UI 元素的 CSS 选择器 |
| 数据模型(Data Models) | 实体类型、字段、关系、有效状态 |
| 状态机(State Machines) | 各状态间的有效转换 |
| 角色剧本(Role Playbooks) | 角色特定的操作流程(QA、SE、PM、SD) |
| 常见任务(Common Tasks) | 分步骤操作流程、注意事项和边界情况 |
资料来源:README.md:53-61
术语对应关系
在代码和 CLI 命令中,知识包也被称为 Skill Packs(技能包)。两者指代同一概念:
- CLI 命令使用
skill-packs作为 API 端点 - 配置字段如
installedAt用于跟踪安装时间 - 配置文件使用
manifest元数据格式
资料来源:packages/server/src/cli.ts:89-97
系统架构
整体架构图
graph TD
A[用户/AI Agent] --> B[SideButton CLI]
A --> C[Web Dashboard]
A --> D[MCP Client]
B --> E[CLI 命令处理]
C --> F[Web UI]
D --> G[MCP Protocol]
E --> H[知识包管理模块]
G --> H
H --> I[本地存储]
H --> J[远程注册表]
H --> K[Workflow 引擎]
I --> L[~/.sidebutton]
J --> M[sidebutton.com registry]
K --> N[浏览器自动化]
K --> O[Shell 执行]
K --> P[LLM 交互]知识包安装流程
sequenceDiagram
participant User as 用户
participant CLI as SideButton CLI
participant Local as 本地存储
participant Remote as 远程注册表
User->>CLI: sidebutton install <source>
CLI->>CLI: 检测源类型
alt 本地路径
CLI->>Local: 读取本地目录
else Git URL / 远程名称
CLI->>Remote: 获取知识包
end
Remote-->>CLI: 返回 manifest + files
CLI->>Local: 安装到配置目录
CLI->>User: 显示安装结果CLI 命令参考
安装命令
# 从本地目录安装
sidebutton install ./my-pack
# 从 Git URL 安装
sidebutton install https://github.com/org/skill-packs
# 从注册表名称安装
sidebutton install app.example.com
# 查看已安装列表
sidebutton install --list
资料来源:packages/server/src/cli.ts:125-135
注册表管理命令
# 添加注册表并安装所有知识包
sidebutton registry add <path|url>
# 更新已安装的包
sidebutton registry update [name]
# 移除注册表及关联的知识包
sidebutton registry remove <name>
# 列出所有注册表及包数量
sidebutton registry list
资料来源:packages/server/README.md:35-40
搜索与发布命令
# 跨注册表搜索知识包
sidebutton search [query]
# 发布知识包到注册表
sidebutton publish
资料来源:packages/sidebutton/README.md:28-30
知识包开发命令
# 初始化新的知识包
sidebutton init [domain]
# 验证知识包配置
sidebutton validate [path]
资料来源:packages/sidebutton/README.md:33-37
发布 API
知识包通过 REST API 发布到远程注册表:
POST /api/skill-packs/publish
Headers:
Content-Type: application/json
Authorization: Bearer <token>
Body:
{
domain: string, // 域名,如 "github.com"
name: string, // 显示名称
version: string, // 版本号
description: string, // 描述
tagline: string, // 简短标语
modules: array, // 模块列表
roles: array, // 角色定义
category: string, // 分类
manifest: object, // 完整元数据
files: array // 知识包文件
}
资料来源:packages/server/src/cli.ts:89-110
发布响应处理
| HTTP 状态码 | 含义 | 处理方式 |
|---|---|---|
| 200 | 发布成功 | 输出版本号和地址 |
| 401 | 未认证 | 提示运行 sidebutton login |
| 403 | 无权限 | 提示你不是该域名的所有者 |
| 其他 | 发布失败 | 显示错误信息 |
资料来源:packages/server/src/cli.ts:111-125
角色与知识包的关系
软件工程师角色
知识包为 AI 软件工程师角色提供以下能力:
可用步骤类型:
| 类别 | 步骤 |
|---|---|
| Issues | issues.search, issues.get, issues.create, issues.transition, issues.comment, issues.attach |
| Git | git.listPRs, git.getPR, git.createPR, git.listIssues, git.getIssue |
| 聊天 | chat.readChannel, chat.readThread, chat.listChannels |
| 终端 | terminal.open, terminal.run |
| LLM | llm.generate, llm.decide, llm.classify |
| 浏览器 | navigate, snapshot, click, type, scroll, extract |
| 工作流 | workflow.call |
| 数据 | variable.set, data.first, data.get |
资料来源:packages/server/defaults/roles/software-engineer.md:45-55
QA 角色
知识包支持 QA 角色执行测试验证流程:
测试流程:
- 导航到目标页面 (
navigate) - 获取页面快照 (
snapshot) - 验证元素存在
- 测试交互(点击、输入)
- 截图取证 (
screenshot) - 执行工作流 (
run_workflow) - 检查运行日志 (
get_run_log)
资料来源:packages/server/defaults/roles/qa.md:25-45
配置与存储
安装状态追踪
知识包安装后会记录以下元数据:
{
"name": "github.com",
"title": "GitHub",
"version": "1.0.0",
"installedAt": "2024-01-15T10:30:00.000Z"
}
存储位置
- Linux/macOS:
~/.sidebutton/ - Windows:
%USERPROFILE%\.sidebutton\
安装结果输出格式
✓ github.com v1.2.0 — GitHub Integration
Installed: 2024/1/15
资料来源:packages/server/src/cli.ts:140-148
源类型检测
CLI 根据输入自动检测知识包来源类型:
graph TD
A[输入 source] --> B{包含 :// 或 .git 或 git@?}
B -->|是| C[Git URL]
B -->|否| D{以 . / ~ / \\ 开头或路径存在?}
D -->|是| E[本地路径]
D -->|否| F[注册表名称]
C --> G[克隆远程仓库]
E --> H[读取本地目录]
F --> I[查询远程注册表]检测优先级:
- Git URL(最高优先级)
- 本地路径
- 注册表名称
资料来源:packages/server/src/cli.ts:149-155
与其他系统的集成
MCP 工具支持
知识包提供的知识可被 MCP 客户端使用:
| MCP 工具 | 用途 |
|---|---|
run_workflow | 按 ID 执行工作流 |
list_workflows | 列出可用工作流 |
get_workflow | 获取工作流 YAML 定义 |
snapshot | 获取页面无障碍树 |
click, type, scroll | 浏览器交互 |
extract, extract_all | 内容提取 |
浏览器自动化
知识包中的选择器和数据模型驱动浏览器自动化操作:
steps:
- type: browser.extract
selector: ".username"
as: user
- type: shell.run
cmd: "echo 'Hello, {{user}}!'"
常见工作流程
安装新知识包
# 1. 搜索可用的知识包
sidebutton search github
# 2. 安装
sidebutton install github.com
# 3. 验证安装
sidebutton install --list
开发自定义知识包
# 1. 初始化新知识包
sidebutton init myapp.com
# 2. 编辑 manifest.yaml 和模块文件
# 3. 验证配置
sidebutton validate ./myapp.com
# 4. 发布到注册表
sidebutton publish
管理注册表
# 添加团队注册表
sidebutton registry add https://github.com/team/skill-packs
# 更新所有包
sidebutton registry update
# 更新特定包
sidebutton registry update myapp.com
# 查看已注册表
sidebutton registry list
# 移除注册表
sidebutton registry remove myapp.com
错误处理
| 错误场景 | 错误信息 | 解决方案 |
|---|---|---|
| 目录不存在 | Directory not found: /path/to/pack | 检查路径是否正确 |
| 未认证 | Not authenticated. Run 'sidebutton login' first. | 执行登录命令 |
| 无发布权限 | Permission denied — you are not the owner of this domain. | 联系域名所有者 |
| 连接失败 | Failed to connect to <url> | 检查网络连接 |
资料来源:packages/server/src/cli.ts:116-130
相关资源
资料来源:[README.md:45-52](https://github.com/sidebutton/sidebutton/blob/main/README.md)
REST API
SideButton 提供了一套完整的 REST API,用于外部系统集成和工作流远程执行。该 API 与本地 MCP(Model Context Protocol)提供相同的功能,支持从任何可以发送 HTTP 请求的环境触发工作流。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
REST API 是 SideButton 对外暴露的核心接口之一,提供 60+ 个 JSON 端点,支持以下主要功能:
- 工作流远程执行
- 运行日志查询
- 浏览器自动化操作
- MCP 工具调用
- 技能包发布与安装
通过 REST API,用户可以从 Webhook、Cron 任务、移动应用或其他运行在不同机器上的代理触发工作流,实现跨平台的自动化编排。
基础配置
服务地址
默认服务地址为 http://localhost:9876,可通过配置文件修改端口号:
{
"port": 9876
}
认证方式
部分端点需要身份验证,使用 Bearer Token 方式:
Authorization: Bearer <auth_token>
获取认证令牌:sidebutton login
核心端点
工作流执行
#### 运行工作流
执行指定 ID 的工作流:
POST /api/workflows/{workflow_id}/run
Content-Type: application/json
{
"params": {
"ticket_id": "PROJ-123"
}
}
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| workflow_id | string | 是 | 工作流唯一标识符 |
| params | object | 否 | 传递给工作流的参数 |
#### 列出所有工作流
GET /api/workflows
返回服务器上所有可用的工作流定义列表。
#### 获取工作流定义
GET /api/workflows/{workflow_id}
获取指定工作流的完整 YAML 定义。
运行日志
#### 获取最新运行日志
GET /api/runs/latest
返回最近一次工作流执行的完整日志。
#### 列出运行日志
GET /api/runs
列出最近的工作流执行记录。
MCP 端点
SideButton 服务器同时提供 MCP(Model Context Protocol)端点,支持 SSE(Server-Sent Events)连接:
GET /localhost:9876/mcp
MCP 工具列表
| 工具 | 功能 |
|---|---|
run_workflow | 按 ID 执行工作流 |
list_workflows | 列出所有可用工作流 |
get_workflow | 获取工作流 YAML 定义 |
get_run_log | 获取运行执行日志 |
list_run_logs | 列出最近的工作流执行 |
get_browser_status | 检查浏览器扩展连接状态 |
capture_page | 捕获页面选择器 |
navigate | 导航浏览器到指定 URL |
snapshot | 获取页面可访问性快照 |
click | 点击页面元素 |
type | 向元素输入文本 |
scroll | 滚动页面 |
screenshot | 捕获页面截图 |
hover | 鼠标悬停到元素 |
技能包发布
SideButton 支持将工作流发布到远程服务器进行共享。
发布端点
POST /api/skill-packs/publish
Authorization: Bearer <token>
Content-Type: application/json
{
"domain": "string",
"name": "string",
"version": "string",
"description": "string",
"tagline": "string",
"modules": [],
"roles": [],
"category": "string",
"manifest": {},
"files": []
}
| 字段 | 类型 | 说明 |
|---|---|---|
| domain | string | 技能包唯一域名 |
| name | string | 显示名称 |
| version | string | 版本号(语义化版本) |
| description | string | 详细描述 |
| tagline | string | 简短标语 |
| modules | array | 包含的工作流模块 |
| roles | array | 关联的角色定义 |
| category | string | 分类标签 |
| manifest | object | 完整清单对象 |
| files | array | 附加文件列表 |
错误处理
| 状态码 | 说明 |
|---|---|
| 401 | 未认证,需先运行 sidebutton login |
| 403 | 无权限,非技能包所有者 |
| 其他 | 发布失败,显示具体错误信息 |
成功响应示例:
{
"version": "1.0.0"
}
安装流程
安装工作流页面
GET /install/{workflow_id}
返回安装确认页面,提示用户工作流已成功安装到库中。
安装成功页面
显示 HTML 成功页面,包含以下元素:
- 成功图标
- 工作流标题
- 返回网站按钮
- 打开仪表板链接
使用示例
cURL
# 运行工作流
curl -X POST http://localhost:9876/api/workflows/check_ticket/run \
-H "Content-Type: application/json" \
-d '{"params": {"ticket_id": "PROJ-123"}}'
# 列出所有工作流
curl http://localhost:9876/api/workflows
# 获取最新运行日志
curl http://localhost:9876/api/runs/latest
MCP 客户端配置
#### Claude Desktop
{
"mcpServers": {
"sidebutton": {
"command": "npx",
"args": ["sidebutton", "--stdio"]
}
}
}
#### Cursor
{
"mcpServers": {
"sidebutton": {
"url": "http://localhost:9876/mcp"
}
}
}
架构图
graph TD
A[外部系统] -->|HTTP Request| B[REST API]
A -->|MCP Protocol| C[MCP Endpoint]
B --> D{端点路由}
C --> D
D -->|/api/workflows| E[工作流控制器]
D -->|/api/runs| F[运行日志控制器]
D -->|/api/skill-packs| G[技能包控制器]
D -->|/install| H[安装页面]
E --> I[工作流引擎]
F --> J[日志存储]
G --> K[远程服务器]
I --> L[核心执行器]
L --> M[浏览器自动化]
L --> N[Shell 执行]
L --> O[LLM 调用]集成场景
| 场景 | 说明 |
|---|---|
| Webhook 触发 | 接收外部事件自动执行工作流 |
| Cron 定时任务 | 定时执行数据采集或报告生成 |
| 移动应用 | 从移动端触发自动化任务 |
| 跨机器协同 | 在不同机器上运行工作流共享结果 |
| CI/CD 集成 | 在持续集成流程中调用自动化步骤 |
相关文档
来源:https://github.com/sidebutton/sidebutton / 项目说明书
工作流定义语法
工作流定义语法(Workflow Definition Syntax)是 SideButton 自动化引擎的核心部分,用于以声明式 YAML 格式描述可执行的自动化步骤序列。每个工作流由唯一标识符、标题、参数定义和步骤数组组成,支持变量插值、控制流、条件分支和嵌套调用等高级特性。资料来源:[packages/core/README.md]()
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
工作流定义语法(Workflow Definition Syntax)是 SideButton 自动化引擎的核心部分,用于以声明式 YAML 格式描述可执行的自动化步骤序列。每个工作流由唯一标识符、标题、参数定义和步骤数组组成,支持变量插值、控制流、条件分支和嵌套调用等高级特性。资料来源:packages/core/README.md
工作流基本结构
工作流采用 YAML 格式定义,文件结构包含以下核心字段:
id: workflow_unique_id # 唯一标识符(小写字母、数字、连字符)
title: "工作流显示名称" # 人类可读标题
description: "工作流描述" # 可选描述
category: "category_name" # 可选分类
params: # 可选参数定义
param_name: param_type
steps:
- type: step_type # 步骤类型
# 步骤配置...
核心字段说明
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
id | 是 | string | 工作流唯一标识符 |
title | 是 | string | 显示名称 |
description | 否 | string | 工作流描述 |
category | 否 | string | 分类标签 |
params | 否 | object | 参数定义,键为参数名,值为参数类型 |
steps | 是 | array | 步骤数组 |
资料来源:packages/server/src/mcp/handler.ts 资料来源:README.md
步骤类型体系
SideButton 将步骤分为六大类别,每个类别提供不同的自动化能力:
步骤类型总览
| 类别 | 步骤类型 | 说明 |
|---|---|---|
| Browser 浏览器 | navigate, click, type, scroll, hover, wait, extract, extractAll, exists, key | 网页自动化操作 |
| Shell 终端 | shell.run, terminal.open, terminal.run | 命令行和终端操作 |
| LLM 大语言模型 | llm.classify, llm.generate | AI 驱动的决策和生成 |
| Control 控制流 | control.if, control.retry, control.stop, workflow.call | 流程控制 |
| Data 数据处理 | data.first | 数据提取和转换 |
资料来源:packages/core/README.md 资料来源:packages/server/defaults/roles/software-engineer.md
浏览器步骤
浏览器步骤提供对网页的完全自动化控制,通过 CSS 选择器精确定位元素:
基础导航与交互
steps:
- type: browser.navigate
url: "https://example.com/page"
- type: browser.click
selector: "#submit-button"
- type: browser.type
selector: "input[name='username']"
text: "[email protected]"
- type: browser.scroll
direction: down
amount: 300
- type: browser.hover
selector: ".menu-item"
内容提取
steps:
- type: browser.extract
selector: ".status-field"
as: current_status # 将结果存储为变量
- type: browser.extractAll
selector: "table tr"
as: table_rows
- type: browser.extract_map
selector: ".card"
map:
title: ".card-title"
url: "a@href"
as: cards
条件检查
steps:
- type: browser.exists
selector: "#error-message"
as: has_error
资料来源:packages/server/defaults/roles/software-engineer.md 资料来源:packages/server/README.md
Shell 步骤
Shell 步骤用于执行命令行操作和脚本:
steps:
- type: shell.run
cmd: "git status"
- type: shell.run
cmd: "npm run build"
cwd: "/path/to/project"
- type: terminal.open
- type: terminal.run
cmd: "echo 'Hello World'"
LLM 步骤
LLM 步骤集成了大语言模型能力,支持本地 Ollama 或云端服务商(OpenAI、Anthropic、Google):
文本生成
steps:
- type: llm.generate
prompt: "为以下功能写一段简洁的描述:{{feature_name}}"
as: description
分类决策
steps:
- type: llm.classify
prompt: "这个 Issue 应该关闭还是保持开放?上下文:{{issue_status}}"
classes: [close, keep_open]
as: decision
资料来源:README.md
控制流步骤
条件分支
steps:
- type: control.if
condition: "{{current_status}} != 'Done'"
then:
- type: llm.classify
prompt: "应该关闭这个工单吗?"
classes: [close, keep_open]
as: decision
重试机制
steps:
- type: control.retry
max_attempts: 3
delay: 1000
steps:
- type: shell.run
cmd: "curl -f https://api.example.com/health"
停止工作流
steps:
- type: control.stop
message: "前置条件未满足,终止执行"
嵌套调用
steps:
- type: workflow.call
workflow_id: "send_notification"
params:
message: "{{notification_message}}"
资料来源:packages/server/defaults/roles/software-engineer.md
数据处理步骤
steps:
- type: data.first
from: "{{table_rows}}"
as: first_row
变量系统
变量插值语法
使用双花括号 {{variable}} 语法引用变量:
steps:
- type: browser.extract
selector: ".username"
as: user
- type: shell.run
cmd: "echo 'Hello, {{user}}!'"
变量来源
变量可通过以下方式定义:
| 来源 | 说明 |
|---|---|
extract 步骤的 as 参数 | 从页面提取的内容 |
params 参数 | 工作流调用时传入的参数 |
llm.classify 的 as 参数 | LLM 分类结果 |
| 前序步骤输出 | 任何返回数据的步骤 |
资料来源:README.md
工作流示例
GitHub 创建 Release 工作流
id: github-create-release
title: "创建 GitHub Release"
description: "在 GitHub 仓库创建一个新的 Release"
category: GitHub
params:
repo: string
tag: string
name: string
body: string
steps:
- type: git.createRelease
repo: "{{repo}}"
tag: "{{tag}}"
name: "{{name}}"
body: "{{body}}"
Jira 工单状态检查与分类
id: check_ticket_status
title: "检查 Jira 工单并分类"
category: Jira
params:
ticket_id: string
steps:
- type: browser.navigate
url: "https://your-org.atlassian.net/browse/{{ticket_id}}"
- type: browser.extract
selector: "[data-testid='status-field']"
as: current_status
- type: control.if
condition: "{{current_status}} != 'Done'"
then:
- type: llm.classify
prompt: "应该关闭这个工单吗?上下文:{{current_status}}"
classes: [close, keep_open]
as: decision
资料来源:README.md
工作流执行流程
graph TD
A[开始执行工作流] --> B[加载工作流定义]
B --> C{检查参数}
C -->|参数完整| D[执行步骤 1]
C -->|参数缺失| E[报告错误并终止]
D --> F{步骤类型}
F -->|Browser| G[浏览器自动化]
F -->|Shell| H[执行命令]
F -->|LLM| I[调用 AI]
F -->|Control| J[控制流处理]
F -->|Data| K[数据处理]
G --> L[提取变量]
H --> L
I --> L
J --> M{控制类型}
M -->|if| N[条件判断]
M -->|retry| O[重试循环]
M -->|stop| P[终止工作流]
M -->|call| Q[嵌套调用]
N --> R{条件结果}
R -->|true| S[执行 then 分支]
R -->|false| T[跳过或执行 else]
K --> U{还有更多步骤?}
L --> U
S --> U
T --> U
Q --> U
U -->|是| D
U -->|否| V[记录执行日志]
P --> V
E --> W[输出错误信息]参数类型
| 类型 | 说明 | 示例 |
|---|---|---|
string | 字符串文本 | "hello" |
number | 数值 | 42 |
boolean | 布尔值 | true |
array | 数组 | [item1, item2] |
最佳实践
- 使用描述性 ID:工作流 ID 应简洁明了,便于 MCP 调用
- 参数验证:在
params中明确定义参数类型,确保输入正确 - 变量命名:使用有意义的变量名,如
current_status而非val1 - 条件分支:复杂条件使用
control.if,避免嵌套过深 - 错误处理:使用
control.retry处理可能失败的步骤
相关资源
- 完整文档
- @sidebutton/core - 核心工作流引擎
- @sidebutton/server - MCP 服务器与 REST API
资料来源:[packages/server/src/mcp/handler.ts]()
失败模式与踩坑日记
保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。
可能影响升级、迁移或版本选择。
假设不成立时,用户拿不到承诺的能力。
新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
下游已经要求复核,不能在页面中弱化。
Pitfall Log / 踩坑日志
项目:sidebutton/sidebutton
摘要:发现 10 个潜在踩坑项,其中 0 个为 high/blocking;最高优先级:安装坑 - 来源证据:Add control.foreach step type for iterating over lists。
1. 安装坑 · 来源证据:Add control.foreach step type for iterating over lists
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:Add control.foreach step type for iterating over lists
- 对用户的影响:可能影响升级、迁移或版本选择。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_d7567e53b1794e828bb3342cb0699f6f | https://github.com/sidebutton/sidebutton/issues/1 | 来源类型 github_issue 暴露的待验证使用条件。
2. 能力坑 · 能力判断依赖假设
- 严重度:medium
- 证据强度:source_linked
- 发现:README/documentation is current enough for a first validation pass.
- 对用户的影响:假设不成立时,用户拿不到承诺的能力。
- 建议检查:将假设转成下游验证清单。
- 防护动作:假设必须转成验证项;没有验证结果前不能写成事实。
- 证据:capability.assumptions | github_repo:1124378210 | https://github.com/sidebutton/sidebutton | README/documentation is current enough for a first validation pass.
3. 维护坑 · 维护活跃度未知
- 严重度:medium
- 证据强度:source_linked
- 发现:未记录 last_activity_observed。
- 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
- 建议检查:补 GitHub 最近 commit、release、issue/PR 响应信号。
- 防护动作:维护活跃度未知时,推荐强度不能标为高信任。
- 证据:evidence.maintainer_signals | github_repo:1124378210 | https://github.com/sidebutton/sidebutton | last_activity_observed missing
4. 安全/权限坑 · 下游验证发现风险项
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:下游已经要求复核,不能在页面中弱化。
- 建议检查:进入安全/权限治理复核队列。
- 防护动作:下游风险存在时必须保持 review/recommendation 降级。
- 证据:downstream_validation.risk_items | github_repo:1124378210 | https://github.com/sidebutton/sidebutton | no_demo; severity=medium
5. 安全/权限坑 · 存在安全注意事项
- 严重度:medium
- 证据强度:source_linked
- 发现:No sandbox install has been executed yet; downstream must verify before user use.
- 对用户的影响:用户安装前需要知道权限边界和敏感操作。
- 建议检查:转成明确权限清单和安全审查提示。
- 防护动作:安全注意事项必须面向用户前置展示。
- 证据:risks.safety_notes | github_repo:1124378210 | https://github.com/sidebutton/sidebutton | No sandbox install has been executed yet; downstream must verify before user use.
6. 安全/权限坑 · 存在评分风险
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:风险会影响是否适合普通用户安装。
- 建议检查:把风险写入边界卡,并确认是否需要人工复核。
- 防护动作:评分风险必须进入边界卡,不能只作为内部分数。
- 证据:risks.scoring_risks | github_repo:1124378210 | https://github.com/sidebutton/sidebutton | no_demo; severity=medium
7. 安全/权限坑 · 来源证据:Native <select> elements cannot be programmatically selected via click/type tools
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:Native <select> elements cannot be programmatically selected via click/type tools
- 对用户的影响:可能阻塞安装或首次运行。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_a2eadefee45c45b2be1b8501c1a0724f | https://github.com/sidebutton/sidebutton/issues/12 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
8. 安全/权限坑 · 来源证据:v1.1.0
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v1.1.0
- 对用户的影响:可能阻塞安装或首次运行。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_a9cfb55ebc664ee99dcc39773859d715 | https://github.com/sidebutton/sidebutton/releases/tag/v1.1.0 | 来源类型 github_release 暴露的待验证使用条件。
9. 维护坑 · issue/PR 响应质量未知
- 严重度:low
- 证据强度:source_linked
- 发现:issue_or_pr_quality=unknown。
- 对用户的影响:用户无法判断遇到问题后是否有人维护。
- 建议检查:抽样最近 issue/PR,判断是否长期无人处理。
- 防护动作:issue/PR 响应未知时,必须提示维护风险。
- 证据:evidence.maintainer_signals | github_repo:1124378210 | https://github.com/sidebutton/sidebutton | issue_or_pr_quality=unknown
10. 维护坑 · 发布节奏不明确
- 严重度:low
- 证据强度:source_linked
- 发现:release_recency=unknown。
- 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
- 建议检查:确认最近 release/tag 和 README 安装命令是否一致。
- 防护动作:发布节奏未知或过期时,安装说明必须标注可能漂移。
- 证据:evidence.maintainer_signals | github_repo:1124378210 | https://github.com/sidebutton/sidebutton | release_recency=unknown
来源:Doramagic 发现、验证与编译记录