Files
clawpal/design.md
zhixian 700c5e9ab2 feat: ClawPal v0.1 — Tauri desktop GUI for OpenClaw
4-page layout (Home, Recipes, Settings, Doctor) with sidebar nav
and integrated Chat panel powered by OpenClaw agent (--local).

- Home: status, agents overview, recommended recipes, recent activity
- Recipes: browse, preview diff, apply with params
- Settings: model profiles CRUD, chat model selection, provider catalog
- Doctor: diagnostics with auto-fix
- Chat: OpenClaw agent integration with session persistence,
  agent selector, read-only advisory context injection
- Progressive data loading to avoid UI blocking
- API key resolution from OpenClaw agent auth-profiles
- Model catalog from openclaw CLI with cache

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 01:16:38 +09:00

565 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ClawPal Design Document
> OpenClaw 配置助手 — 让普通用户也能玩转高级配置
## 1. 产品定位
### 问题
- OpenClaw 配置功能强大但复杂
- 官方 Web UI 是"配置项罗列",用户看晕
- 用户让 Agent 自己配置,经常出错
- 配置出错时 Gateway 起不来,陷入死循环
### 解决方案
**场景驱动的配置助手**
- 不是"列出所有配置项",而是"你想实现什么场景?"
- 用户选场景 → 填几个参数 → 一键应用
- 独立运行,不依赖 Gateway配置坏了也能修
### 核心价值
1. **降低门槛** — 普通用户也能用上高级功能
2. **最佳实践** — 社区沉淀的配置方案,一键安装
3. **急救工具** — 配置出问题时的救命稻草
4. **版本控制** — 改坏了一键回滚
## 2. 产品架构
```
┌─────────────────────────────────────────────────────────┐
│ clawpal.dev (官网) │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Recipe │ │ Recipe │ │ Recipe │ │ Recipe │ │
│ │ Card │ │ Card │ │ Card │ │ Card │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ └────────────┴─────┬──────┴────────────┘ │
│ │ │
│ [一键安装按钮] │
│ │ │
└───────────────────────────┼─────────────────────────────┘
│ clawpal://install/recipe-id
┌─────────────────────────────────────────────────────────┐
│ ClawPal App (本地) │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 首页 │ │
│ │ ┌─────────┐ 当前配置健康状态: ✅ 正常 │ │
│ │ │ 状态 │ OpenClaw 版本: 2026.2.13 │ │
│ │ │ 卡片 │ 活跃 Agents: 4 │ │
│ │ └─────────┘ │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 场景库 │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Discord │ │ Telegram│ │ 模型 │ │ │
│ │ │ 人设 │ │ 配置 │ │ 切换 │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 历史记录 │ │
│ │ ● 2026-02-15 21:30 应用了 "Discord 人设" │ │
│ │ ● 2026-02-15 20:00 手动编辑 │ │
│ │ ● 2026-02-14 15:00 应用了 "性能优化" │ │
│ │ [回滚到此版本] │ │
│ └──────────────────────────────────────────────────┘ │
│ │
└──────────────────────────┬──────────────────────────────┘
│ 直接读写(不依赖 Gateway
~/.openclaw/openclaw.json
```
## 3. 核心功能
### 3.1 场景库 (Recipes)
每个 Recipe 是一个"配置方案",包含:
- 标题、描述、标签
- 需要用户填的参数
- 配置补丁模板
**示例 RecipeDiscord 频道专属人设**
```yaml
id: discord-channel-persona
name: "Discord 频道专属人设"
description: "给特定 Discord 频道注入专属 system prompt让 Agent 在不同频道表现不同"
author: "zhixian"
version: "1.0.0"
tags: ["discord", "persona", "beginner"]
difficulty: "easy"
# 用户需要填的参数
params:
- id: guild_id
label: "服务器 ID"
type: string
placeholder: "右键服务器 → 复制服务器 ID"
- id: channel_id
label: "频道 ID"
type: string
placeholder: "右键频道 → 复制频道 ID"
- id: persona
label: "人设描述"
type: textarea
placeholder: "在这个频道里,你是一个..."
# 配置补丁JSON Merge Patch 格式)
patch: |
{
"channels": {
"discord": {
"guilds": {
"{{guild_id}}": {
"channels": {
"{{channel_id}}": {
"systemPrompt": "{{persona}}"
}
}
}
}
}
}
}
```
### 3.2 引导式安装流程
```
[选择场景] → [填写参数] → [预览变更] → [确认应用] → [完成]
│ │ │ │
│ │ │ └── 自动备份当前配置
│ │ └── Diff 视图,清晰展示改了什么
│ └── 表单 + 实时校验
└── 卡片式浏览,带搜索/筛选
```
### 3.3 版本控制 & 回滚
```
~/.openclaw/
├── openclaw.json # 当前配置
└── .clawpal/
├── history/
│ ├── 2026-02-15T21-30-00_discord-persona.json
│ ├── 2026-02-15T20-00-00_manual-edit.json
│ └── 2026-02-14T15-00-00_performance-tuning.json
└── metadata.json # 历史记录元数据
```
**回滚流程**
1. 选择历史版本
2. 展示 Diff当前 vs 目标版本)
3. 确认回滚
4. 当前版本也存入历史(防止误操作)
### 3.4 配置诊断 (Doctor)
当 Gateway 起不来时ClawPal 可以独立运行诊断:
**检查项**
- [ ] JSON 语法是否正确
- [ ] 必填字段是否存在
- [ ] 字段类型是否正确
- [ ] 端口是否被占用
- [ ] 文件权限是否正确
- [ ] Token/密钥格式是否正确
**自动修复**
- 语法错误:尝试修复常见问题(尾逗号、引号)
- 缺失字段:填充默认值
- 格式错误:自动转换
## 4. 官网设计
### 4.1 首页
```
┌─────────────────────────────────────────────────────────┐
│ ClawPal │
│ 让 OpenClaw 配置变得简单 │
│ │
│ [下载 App] [浏览 Recipes] │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 热门 Recipes │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ │ │ 🎭 │ │ ⚡ │ │ 🔔 │ │ 🤖 │ │ 📝 │ │ │
│ │ │人设 │ │性能 │ │提醒 │ │模型 │ │日记 │ │ │
│ │ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 提交你的 Recipe │ │
│ │ 分享你的最佳实践,帮助更多人 │ │
│ │ [提交] │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 4.2 Recipe 详情页
```
┌─────────────────────────────────────────────────────────┐
│ ← 返回 │
│ │
│ Discord 频道专属人设 v1.0.0 │
│ by zhixian │
│ │
│ ⬇️ 1,234 安装 ⭐ 4.8 (56 评价) │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 给特定 Discord 频道注入专属 system prompt │ │
│ │ 让 Agent 在不同频道表现不同。 │ │
│ │ │ │
│ │ 适用场景: │ │
│ │ • 工作频道严肃,闲聊频道轻松 │ │
│ │ • 不同频道不同语言 │ │
│ │ • 特定频道禁用某些功能 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ 需要填写的参数: │
│ • 服务器 ID │
│ • 频道 ID │
│ • 人设描述 │
│ │
│ [在 ClawPal 中安装] │
│ │
│ ───────────────────────────────────────────────── │
│ │
│ 配置预览 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ channels: │ │
│ │ discord: │ │
│ │ guilds: │ │
│ │ "{{guild_id}}": │ │
│ │ channels: │ │
│ │ "{{channel_id}}": │ │
│ │ systemPrompt: "{{persona}}" │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 4.3 Deep Link 协议
```
clawpal://install/{recipe-id}
clawpal://install/{recipe-id}?source=web&version=1.0.0
```
App 收到 deep link 后:
1. 下载 recipe 元数据
2. 打开安装向导
3. 引导用户填写参数
4. 应用配置
## 5. 技术栈
### 5.1 本地 App
```
ClawPal App (Tauri)
├── src-tauri/ # Rust 后端(轻量,主要用 Tauri API
│ ├── src/
│ │ └── main.rs # 入口 + 少量原生逻辑
│ └── tauri.conf.json # Tauri 配置
└── src/ # Web 前端
├── App.tsx
├── pages/
│ ├── Home.tsx # 首页 + 状态
│ ├── Recipes.tsx # 场景库
│ ├── Install.tsx # 安装向导
│ ├── History.tsx # 历史记录
│ └── Doctor.tsx # 诊断修复
├── components/
│ ├── RecipeCard.tsx
│ ├── ParamForm.tsx
│ ├── DiffViewer.tsx
│ └── ...
└── lib/
├── config.ts # 配置读写(用 Tauri fs API
├── recipe.ts # Recipe 解析/应用
├── backup.ts # 版本控制
└── doctor.ts # 诊断逻辑
```
### 5.2 技术选型
| 组件 | 选型 | 理由 |
|------|------|------|
| App 框架 | Tauri 2.0 | 轻量(5-10MB)JS 为主 |
| 前端框架 | React + TypeScript | 生态成熟 |
| UI 组件 | shadcn/ui | 好看,可定制 |
| 状态管理 | React Context + useReducer | 先用原生,后续再引入 Zustand |
| 配置解析 | json5 | 支持注释 |
| Diff 展示 | monaco-editor diff | 可控性强,定制成本低 |
### 5.3 RecipeEngine 核心接口
```typescript
interface RecipeEngine {
// 校验 recipe 定义 + 用户参数
validate(recipe: Recipe, params: Record<string, unknown>): ValidationResult;
// 预览变更(不实际修改)
preview(recipe: Recipe, params: Record<string, unknown>): PreviewResult;
// 应用配置(自动备份)
apply(recipe: Recipe, params: Record<string, unknown>): ApplyResult;
// 回滚到指定快照
rollback(snapshotId: string): RollbackResult;
// 从损坏状态恢复
recover(): RecoverResult;
}
interface PreviewResult {
diff: string; // 配置 Diff
impactLevel: 'low' | 'medium' | 'high'; // 影响级别
affectedPaths: string[]; // 受影响的配置路径
canRollback: boolean; // 是否可回滚
overwritesExisting: boolean; // 是否覆盖现有配置
warnings: string[]; // 警告信息
}
```
### 5.3 官网
| 组件 | 选型 | 理由 |
|------|------|------|
| 框架 | Next.js | SSR/SSGSEO 友好 |
| 部署 | Vercel / Cloudflare Pages | 免费CDN |
| 数据库 | Supabase / PlanetScale | Recipe 存储 |
| 认证 | GitHub OAuth | 用户提交 recipe |
## 6. MVP 范围(精简版)
> 先做 3 个高价值核心功能,离线可用,快速验证
### MVP 核心功能
#### 1. 安装向导
- [ ] 参数校验schema 验证)
- [ ] 变更预览Diff 视图)
- [ ] 应用配置
- [ ] 自动备份
#### 2. 版本快照与回滚
- [ ] 每次修改前自动快照
- [ ] 历史记录列表
- [ ] 一键回滚
- [ ] 回滚前预览 Diff
#### 3. 配置诊断
- [ ] JSON 语法检查
- [ ] 必填字段验证
- [ ] 端口占用检测
- [ ] 文件权限检查
- [ ] 一键修复 + 显示变更原因
### MVP 不做的事
- ❌ 官网
- ❌ 用户系统 / OAuth
- ❌ 评分/评论体系
- ❌ 在线 Recipe 仓库
### 后续阶段
- Phase 2: 官网 + Recipe 在线分发
- Phase 3: 社区功能(评分、评论、用户提交)
## 7. 初始 Recipe 列表
MVP 内置的 Recipes
1. **Discord 频道专属人设** — 不同频道不同性格
2. **Telegram 群组配置** — 群聊 mention 规则
3. **定时任务配置** — Heartbeat + Cron 基础设置
4. **模型切换** — 快速切换默认模型
5. **性能优化** — contextPruning + compaction 最佳实践
---
## 8. 风险点 & 注意事项
### 8.1 Schema 版本兼容
- OpenClaw 配置 schema 会随版本变化
- 需要锁定版本兼容层v1/v2 schema migration
- Recipe 需标注兼容的 OpenClaw 版本范围
### 8.2 安全性
- **深度链接可信源校验**:防止恶意 recipe 写入本地配置
- **敏感路径白名单**:限制 recipe 可修改的配置路径
- **危险操作提醒**:涉及 token、密钥、敏感路径时 must-have 确认
### 8.3 平台兼容
- Tauri 2.0 在 Windows/macOS 路径权限表现有差异
- 需要测试不同平台的文件读写行为
- 路径处理使用 Tauri 的跨平台 API
### 8.4 WSL2 支持Windows 重点)
很多 Windows 用户通过 WSL2 安装 OpenClaw配置文件在 Linux 文件系统里。
**检测逻辑**
1. 检查 Windows 原生路径 `%USERPROFILE%\.openclaw\`
2. 如果不存在,扫描 `\\wsl$\*\home\*\.openclaw\`
3. 找到多个时让用户选择
**路径映射**
```
WSL2 路径: /home/user/.openclaw/openclaw.json
Windows 访问: \\wsl$\Ubuntu\home\user\.openclaw\openclaw.json
```
**UI 处理**
- 首次启动检测安装方式
- 设置页可手动切换/指定路径
- 显示当前使用的路径来源Windows / WSL2-Ubuntu / 自定义)
### 8.5 JSON5 风格保持
- 用户手写的注释和缩进不能被破坏
- 写回时需保持原有格式风格
- 考虑使用 AST 级别的修改而非 stringify
---
## 9. Recipe 校验规则
### 9.1 参数 Schema
```yaml
params:
- id: guild_id
type: string
required: true
pattern: "^[0-9]+$" # 正则校验
minLength: 17
maxLength: 20
```
### 9.2 路径白名单
```yaml
# 只允许修改这些路径
allowedPaths:
- "channels.*"
- "agents.defaults.*"
- "agents.list[*].identity"
# 禁止修改
forbiddenPaths:
- "gateway.auth.*" # 认证相关
- "*.token" # 所有 token
- "*.apiKey" # 所有 API key
```
### 9.3 危险操作标记
```yaml
dangerousOperations:
- path: "gateway.port"
reason: "修改端口可能导致连接中断"
requireConfirm: true
- path: "channels.*.enabled"
reason: "禁用频道会影响消息收发"
requireConfirm: true
```
---
## 10. 体验细节
### 10.1 影响级别展示
安装按钮显示"预估影响级别"
| 级别 | 条件 | 展示 |
|------|------|------|
| 🟢 低 | 只添加新配置,不修改现有 | "添加新配置" |
| 🟡 中 | 修改现有配置,可回滚 | "修改配置(可回滚)" |
| 🔴 高 | 涉及敏感路径或大范围修改 | "重要变更(请仔细检查)" |
### 10.2 可回滚提示
每个 Recipe 显示:
- ✅ 可回滚 / ⚠️ 部分可回滚 / ❌ 不可回滚
- 是否会覆盖现有配置(高亮显示冲突项)
### 10.3 历史记录增强
- 关键词筛选
- 仅显示可回滚节点
- 按 Recipe 类型分组
### 10.4 Doctor 一键修复
```
发现 2 个问题:
1. ❌ JSON 语法错误(第 42 行)
→ 多余的逗号
[一键修复] 删除第 42 行末尾的逗号
2. ❌ 必填字段缺失
→ agents.defaults.workspace 未设置
[一键修复] 设置为默认值 "~/.openclaw/workspace"
[全部修复] [仅修复语法] [查看变更详情]
```
---
## 11. 落地步骤(推荐顺序)
### Step 1: RecipeEngine 核心
1. 定义 RecipeEngine 接口
2. 实现 `validate``preview``apply``rollback``recover`
3. 编写单元测试
### Step 2: 端到端流程验证
1. 实现一个真实 RecipeDiscord 人设)
2. 完整走通:选择 → 填参数 → 预览 → 应用 → 回滚
3. 验证 JSON5 风格保持
### Step 3: 损坏恢复演练
1. 模拟配置损坏场景
2. 测试 Doctor 诊断流程
3. 验证一键修复功能
### Step 4: 扩展 & 发布
1. 添加 2-3 个 Recipe
2. 完善 UI 细节
3. 打包发布macOS / Windows / Linux
---
## 附录
### A. 隐藏但有用的配置能力
这些是 OpenClaw 支持但用户不一定知道的功能:
| 功能 | 配置路径 | 说明 |
|------|----------|------|
| Channel 级 systemPrompt | `channels.*.guilds.*.channels.*.systemPrompt` | 频道专属人设 |
| Context Pruning | `agents.defaults.contextPruning` | 上下文裁剪策略 |
| Compaction | `agents.defaults.compaction` | Session 压缩 |
| Bindings | `bindings[]` | 按条件路由到不同 Agent |
| Media Audio | `tools.media.audio` | 语音转录配置 |
| Memory Search | `agents.defaults.memorySearch` | 记忆搜索配置 |
### B. 文件路径
| 文件 | 路径 |
|------|------|
| OpenClaw 配置 | `~/.openclaw/openclaw.json` |
| ClawPal 历史 | `~/.openclaw/.clawpal/history/` |
| ClawPal 元数据 | `~/.openclaw/.clawpal/metadata.json` |
---
*Last updated: 2026-02-15*