first commit

This commit is contained in:
zyl
2026-03-06 03:36:12 +08:00
commit 4e32b3193f
64 changed files with 42394 additions and 0 deletions

View File

@@ -0,0 +1,474 @@
# L0 — 产品白皮书与能力全景层
**文档版本**: 1.0
**适用项目**: sgClaw (业数融合一平台 AI Agent 底座)
**编制日期**: 2026-03-03
---
## 1. 产品定位
sgClaw 是面向国家电网"业数融合一平台"的 **AI 驱动智能代理平台**。它并非一个独立应用程序,而是作为核心能力嵌入 SuperRPA 定制 Chromium 浏览器内核之中,通过浏览器 Side Panel 中的控制按钮一键激活。
用户只需用自然语言描述业务意图sgClaw 即可自主理解指令语义,规划执行步骤,在 ERP、OA、财务、人力资源、经济法务等复杂业务系统中完成跨系统操作——**无需编写任何代码**。
> **核心比喻:一位会思考、能学习、永不犯错的数字员工。**
sgClaw 从浏览器内核层面发起操作,与真实用户行为完全一致,不可被反自动化机制识别,从根本上解决了传统外部 RPA 工具被检测、被拦截的行业痛点。
```
┌─────────────────────────────────────────────────────────────────┐
│ SuperRPA 定制 Chromium 浏览器 │
│ │
│ ┌──────────────────────┐ ┌────────────────────────────────┐ │
│ │ 浏览器主窗口 │ │ Side Panel 控制区 │ │
│ │ │ │ │ │
│ │ ┌────────────────┐ │ │ ┌──────────────────────────┐ │ │
│ │ │ ERP / OA / │ │ │ │ [启动 Agent] [停止] │ │ │
│ │ │ 财务 / HR 等 │ │ │ │ │ │ │
│ │ │ 业务系统页面 │ │ │ │ 指令输入: │ │ │
│ │ │ │ │ │ │ "导出本月合规报表" │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ └────────────────┘ │ │ │ ▼ 任务进度 │ │ │
│ │ ▲ │ │ │ ████████░░ 80% │ │ │
│ │ │ 内核级操作 │ │ │ │ │ │
│ │ │ │ │ │ ✓ 已登录 ERP │ │ │
│ │ ┌──────┴─────────┐ │ │ │ ✓ 已导出财务报表 │ │ │
│ │ │ sgClaw 引擎 │◄─┼────┼──│ ► 正在导出合规报表... │ │ │
│ │ │ (Rust Binary) │ │ │ │ │ │ │
│ │ └────────────────┘ │ │ └──────────────────────────┘ │ │
│ └──────────────────────┘ └────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
---
## 2. 行业痛点
国家电网及大型央企的业务运营高度依赖多套信息系统协同。一线业务人员每天需要在 5 至 10 余套系统之间反复切换,手工搬运数据,面临以下核心痛点:
### 2.1 效率低下
一线员工日常需在 ERP、OA、财务管控、人力资源、经济法务、营销等多套系统间反复登录、切换、手工录入。一项跨系统操作如合规线索提报平均需要 **15-30 分钟**,涉及 **3-5 个系统** 的数据交叉核对。全年此类重复操作累计耗费数万人时。
### 2.2 人工差错
手工跨系统数据搬运极易出错。财务合规场景下,一个数字的录入错误可能导致审计异常,引发合规风险。据行业统计,人工跨系统操作的 **错误率约为 2%-5%**,在高强度、高压力的月末结算期间错误率更高。
### 2.3 培训成本高
新员工需要 **3-6 个月** 才能熟练掌握多套业务系统的操作流程和业务规则。人员调动频繁时,培训成本成倍增长,且经验难以沉淀、传承。
### 2.4 合规风险
手工操作缺乏完整的审计轨迹,难以事后追溯"谁在什么时间对哪个系统做了什么操作"。在日趋严格的内控与合规要求下,这构成了显著的制度性风险。
### 2.5 重复劳动
经调研分析,一线业务人员 **约 80%** 的跨系统操作属于规则明确、流程固定的重复性工作。这些工作本应由自动化工具承担,但因系统间壁垒和技术限制,长期依赖人力完成。
### 2.6 传统 RPA 局限
外部 RPA 工具UiPath、BluePrism 等)通过屏幕抓取、模拟点击等方式操控浏览器,存在根本性缺陷:
- **易被检测**:反自动化机制可识别 WebDriver、Selenium 等注入痕迹
- **被系统拦截**:越来越多的业务系统部署了 Bot Detection直接阻断 RPA 操作
- **需专业脚本**:每个流程需要专门开发自动化脚本,维护成本高
- **环境依赖**:对操作系统版本、屏幕分辨率、系统界面变更高度敏感
---
## 3. 核心能力矩阵
| 能力维度 | 能力描述 | 关键指标 |
|---------|---------|---------|
| **自然语言驱动** | 用户以自然语言中文描述业务意图Agent 自主理解语义、分解任务、规划步骤并执行 | 支持复杂多步指令,意图识别准确率 > 95% |
| **内核级隐蔽操作** | 从浏览器内核层面发起 DOM 操作与事件派发,与真实用户行为在技术栈上完全一致 | 反自动化检测通过率 100%,零注入痕迹 |
| **自进化学习** | 每次成功执行的操作序列自动沉淀为 Skill后续同类任务直接复用无需重复推理 | Skill 复用率随使用时长持续提升 |
| **三层安全防御** | Pipeline 协议层安全 + Rust 命令验证层 + C++ 内核 MAC 强制访问控制 | 纵深防御,任一层均可独立拦截非法操作 |
| **Skill 技能仓库** | 预置覆盖财务合规、风险管控、营销、人力资源、经济法务等业务领域的操作技能包 | 开箱即用,支持自定义扩展 |
| **多模型适配** | 支持 Claude、GPT 系列、本地化模型Qwen、ChatGLM 等),可按安全等级灵活切换 | 模型切换零代码,响应延迟 < 2s |
| **跨平台支持** | 原生支持 Linux银河麒麟 V10与 Windows满足国产化适配要求 | 信创环境全面兼容 |
| **极致轻量** | Rust 编写的 Agent 引擎,资源占用极低 | 内存 ~5MB冷启动 < 10ms |
```
┌─────────────────────────────────────────────────────────────┐
│ sgClaw 核心能力全景图 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 自然语言 │ │ 自进化学习 │ │ 多模型适配 │ │
│ │ 理解与规划 │ │ Skill 沉淀 │ │ Claude/GPT/Qwen │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ sgClaw Agent 引擎 (Rust) │ │
│ │ 内存 ~5MB | 冷启动 < 10ms │ │
│ └───────────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌─────────────┐ ┌────────────────┐ │
│ │ Pipeline │ │ Rust 命令 │ │ C++ 内核 MAC │ │
│ │ 协议层安全 │ │ 验证层 │ │ 强制访问控制 │ │
│ └────────────┘ └─────────────┘ └────────────────┘ │
│ │ │ │ │
│ └────────────────┼────────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 内核级隐蔽操作 (Chromium C++ 层) │ │
│ │ DOM 操作 · 事件派发 · 与真实用户行为完全一致 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌─────────────┐ ┌────────────────┐ │
│ │ Skill 仓库 │ │ 跨平台支持 │ │ 全链路审计 │ │
│ │ 业务技能包 │ │ 麒麟/Windows │ │ trace_id 追溯 │ │
│ └────────────┘ └─────────────┘ └────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
```
---
## 4. 典型业务场景
### 4.1 财务合规
**场景示例**:合规线索提报与交叉核查
用户指令:*"将本月 ERP 中的异常交易记录与财务管控系统的合规规则交叉比对,生成合规线索提报清单。"*
sgClaw 执行流程:
1. 自动登录 ERP 系统,导航至异常交易模块
2. 按时间范围筛选并导出本月异常交易数据
3. 切换至财务管控系统,调取对应合规规则库
4. 逐条交叉比对,标记命中合规规则的记录
5. 自动生成合规线索提报清单,填入指定模板
6. 提交至审批流程,附加完整操作审计记录
**业务价值**:原需 2-3 小时的人工操作压缩至 **5-8 分钟**,错误率从 3% 降至 **0%**
### 4.2 风险管控
**场景示例**:跨系统风险指标监测与异常预警
用户指令:*"每日自动检查 ERP 和风控系统中的关键风险指标,发现异常立即生成预警报告。"*
sgClaw 执行流程:
1. 定时自动巡检 ERP 系统中的关键财务指标
2. 同步核查风控系统中的风险阈值配置
3. 对比分析指标偏离情况,识别异常模式
4. 异常触发时自动截屏取证、生成预警报告
5. 推送至相关负责人,并在 OA 系统创建跟踪工单
**业务价值**:实现 **7x24 小时** 不间断风险监控,预警响应时间从 "次日发现" 缩短至 **实时告警**
### 4.3 营销
**场景示例**:电费异常批量处理与账单核对
用户指令:*"批量处理本月电费账单异常记录,对比营销系统与财务系统的数据差异。"*
sgClaw 执行流程:
1. 进入营销系统,筛选本月标记为异常的电费账单
2. 逐条提取异常记录的用户编号、金额、异常类型
3. 在财务系统中查询对应的收费记录
4. 自动比对金额差异,生成差异明细报表
5. 对可自动修正的记录执行批量修正操作
6. 对需人工确认的记录生成待办清单
**业务价值**:月均处理量从 **200 条/人日** 提升至 **5000+ 条/小时**,释放大量人力投入高价值工作。
### 4.4 人力资源
**场景示例**:社保表单自动填报与薪酬数据核验
用户指令:*"从 HR 系统导出本月社保基数变更人员名单,自动填入社保申报表并交叉验证薪酬数据。"*
sgClaw 执行流程:
1. 登录 HR 系统,导出社保基数变更人员明细
2. 自动填入社保局在线申报表单的对应字段
3. 同步查询薪酬系统中的工资明细数据
4. 交叉验证社保基数与实际薪酬的一致性
5. 标记不一致记录,生成差异报告
6. 合规记录自动提交,异常记录流转至人工复核
**业务价值**:每月社保申报工作从 **3-5 个工作日** 压缩至 **2-4 小时**
### 4.5 经济法务
**场景示例**:合同履约监测与法律风险预警
用户指令:*"监控即将到期的合同,检查履约状态,对存在违约风险的合同生成法律风险预警。"*
sgClaw 执行流程:
1. 在合同管理系统中筛选 30 天内到期的合同
2. 逐一核查合同关键条款的履约状态
3. 交叉查询 ERP 系统中的付款/交货记录
4. 识别履约偏差,评估违约风险等级
5. 生成法律风险预警报告,按风险等级排序
6. 自动推送至法务部门,创建跟踪任务
**业务价值**:合同风险识别从 "事后补救" 转变为 **"事前预警"**,法律纠纷发生率显著降低。
### 4.6 协同办公
**场景示例**:跨系统数据同步与报表整合
用户指令:*"从 ERP、财务、HR 三个系统导出本月关键运营数据,汇总生成月度经营分析报表。"*
sgClaw 执行流程:
1. 依次登录 ERP、财务、HR 系统
2. 按预设模板提取各系统的关键运营数据
3. 自动对齐数据口径,统一格式
4. 汇总计算关键指标,生成月度经营分析报表
5. 导出为标准格式,上传至 OA 系统
**业务价值**:月度报表整合从 **2-3 天人工汇总** 缩短至 **30 分钟自动生成**
### 4.7 通用场景
用户只需一句自然语言指令sgClaw 即可自主完成端到端的跨系统操作:
| 自然语言指令 | Agent 自主完成的操作 |
|------------|-------------------|
| "导出本月所有合规报表" | 依次登录各业务系统 → 定位报表模块 → 设定时间范围 → 导出 → 汇总 |
| "检查上周新入职员工的系统权限配置" | HR 系统查询入职名单 → 各业务系统逐一核查权限 → 生成核查报告 |
| "把 ERP 里的采购订单数据同步到财务系统" | ERP 导出订单 → 格式转换 → 财务系统录入 → 数据校验 |
| "统计各部门本季度差旅报销总额" | OA 系统提取差旅审批 → 财务系统核查报销 → 按部门汇总 → 生成报表 |
---
## 5. 技术优势对比
### 5.1 综合对比矩阵
| 对比维度 | 人工操作 | 传统 RPA (UiPath/BluePrism) | 外部 Agent (OpenClaw) | **sgClaw** |
|---------|---------|---------------------------|---------------------|-----------|
| **架构方式** | N/A | 外部进程控制浏览器 | 外部进程 + WebSocket | **嵌入浏览器内核** |
| **反检测能力** | 天然通过 | 易被检测拦截 | 可被端口扫描发现 | **原生行为,不可检测** |
| **安全层级** | 依赖人员素质 | 应用层安全 | 应用层安全 | **三层纵深防御** |
| **通信方式** | N/A | HTTP / COM | HTTP / WebSocket (端口暴露) | **STDIO Pipe (进程私有)** |
| **内存占用** | N/A | 200-500MB | 394MB+ | **~5MB** |
| **冷启动时间** | N/A | 10-30s | 5-15s | **< 10ms** |
| **技能复用** | 经验口传 | 需重新开发脚本 | 需重新训练 | **复用已有 JS 业务代码** |
| **部署方式** | N/A | 独立安装 + 配置 | 独立安装 + 配置 | **内嵌浏览器,零独立安装** |
| **自然语言** | N/A | 不支持 | 部分支持 | **完整支持中文自然语言** |
| **国产化适配** | N/A | 有限支持 | 不支持 | **银河麒麟 V10 原生支持** |
| **学习门槛** | 3-6 个月 | 需专业 RPA 开发 | 需技术配置 | **自然语言,零学习成本** |
### 5.2 关键差异化优势
```
┌──────────────────────────────────────────────────────────────────┐
│ 架构差异:外部控制 vs 内核嵌入 │
├──────────────────────────────────────────────────────────────────┤
│ │
│ 传统 RPA / 外部 Agent 方案: │
│ │
│ ┌────────────┐ HTTP/WS ┌──────────────┐ │
│ │ RPA Engine │ ──────────────→│ 浏览器 │ │
│ │ (外部进程) │ 端口暴露 │ (被外部控制) │ │
│ └────────────┘ 可被检测 └──────────────┘ │
│ 394MB+ 反自动化机制 │
│ 可识别拦截 │
│ │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ │
│ sgClaw 方案: │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ SuperRPA Chromium 浏览器 │ │
│ │ │ │
│ │ ┌──────────┐ STDIO Pipe ┌──────────────┐ │ │
│ │ │ sgClaw │ ◄──────────► │ Chromium C++ │ │ │
│ │ │ (Rust) │ 进程私有 │ 内核层 │ │ │
│ │ │ ~5MB │ 零端口暴露 │ │ │ │
│ │ └──────────┘ └──────────────┘ │ │
│ │ │ │
│ │ 操作 = 原生用户行为,不可被检测 │ │
│ └──────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────┘
```
---
## 6. 安全与合规保障
sgClaw 将安全视为产品基因而非附加功能,构建了从通信层到内核层的 **三层纵深防御体系**
### 6.1 进程隔离通信
- 采用 **STDIO Pipe** 作为 Agent 与浏览器内核的唯一通信通道
- 不开放任何网络端口,外部进程无法探测或连接
- 通信数据仅存在于父子进程的文件描述符中,操作系统级别的隐私保护
### 6.2 MAC 强制访问控制
- 浏览器 C++ 内核层实施 **Mandatory Access Control**
- 严格的域名白名单机制Agent 仅可操作授权的业务系统域名
- 敏感操作(如支付、审批)需额外的内核级权限校验
- 白名单策略由管理员统一配置Agent 无法自行绕过
### 6.3 凭证安全保护
- 用户凭证由浏览器 Zombie Session Pool 统一管理
- 凭证信息 **永远不会通过 Pipe 协议传输** 至 Agent 进程
- Agent 通过 BrowserAction API 间接使用已建立的会话,无需接触明文密码
### 6.4 人工激活机制
- Agent 功能 **默认关闭**,需用户在 Side Panel 中显式点击启动按钮
- 每次启动均需用户确认,杜绝后台无感自动运行
- 用户可随时一键停止 Agent 的所有操作
### 6.5 全链路审计追溯
- 每次 Agent 会话分配唯一 **trace_id**
- 所有操作步骤(页面导航、元素点击、数据读取、表单提交)均有完整日志记录
- 日志包含操作时间戳、目标系统、操作类型、执行结果
- 支持事后审计回溯与合规举证
### 6.6 防失控熔断机制
- 内置 **Circuit Breaker** 机制,防止 Agent 进入死循环或失控状态
- 单次任务设置最大步骤数上限
- 连续失败自动熔断,暂停执行并通知用户
- 关键操作设置人工确认断点human-in-the-loop
---
## 7. 产品形态与交付方式
### 7.1 产品形态
| 组件 | 形态 | 规格 |
|------|------|------|
| Agent 引擎 | Rust 编译二进制 | 约 8.8MB |
| 宿主环境 | SuperRPA 定制 Chromium 浏览器 | 集成交付 |
| 用户界面 | 浏览器 Side Panel 控制区 | 启停按钮 + 指令输入 + 任务进度 |
| Skill 仓库 | JSON 格式技能定义文件 | 随浏览器内置,支持在线更新 |
| 运行时依赖 | 无 | Rust 静态编译,零外部依赖 |
### 7.2 交付方式
- **Linux (银河麒麟 V10)**:集成于 `superrpa-chromium` .deb 安装包
- **Windows**:集成于 `superrpa-chromium` .exe 安装包
- **无需独立安装**:随浏览器一并部署,无额外配置步骤
- **无需独立升级**:随浏览器版本统一升级管理
### 7.3 用户交互流程
```
用户操作流程:
打开 SuperRPA 浏览器
访问业务系统(自动登录)
打开 Side Panel ──→ 看到 sgClaw 控制区
点击 [启动 Agent] 按钮
输入自然语言指令 ──→ "导出本月所有合规报表"
Agent 自主执行 ──→ Side Panel 实时显示进度
执行完成 ──→ 结果展示 / 文件下载
(可选)点击 [停止] 终止任务
```
---
## 8. 与 SuperRPA 浏览器的协同关系
sgClaw 并非独立产品,而是与 SuperRPA 浏览器深度耦合的 **智能增强层**。两者各司其职,协同构成完整的"智能数字员工"平台。
### 8.1 能力分工
```
┌────────────────────────────────────────────────────────────────────┐
│ "智能数字员工" 完整能力栈 │
├────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ sgClaw 智能增强层 │ │
│ │ │ │
│ │ ┌────────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │
│ │ │ LLM 智能 │ │ 自然语言 │ │ 多步自主 │ │ 自进化学习 │ │ │
│ │ │ 推理引擎 │ │ 理解 │ │ 任务执行 │ │ Skill 沉淀 │ │ │
│ │ └────────────┘ └──────────┘ └──────────┘ └──────────────┘ │ │
│ │ │ │
│ └──────────────────────────┬───────────────────────────────────┘ │
│ │ STDIO Pipe │
│ ┌──────────────────────────┴───────────────────────────────────┐ │
│ │ SuperRPA 浏览器基础设施层 │ │
│ │ │ │
│ │ ┌────────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │
│ │ │ Zombie │ │ SDK │ │ Browser │ │ 凭证与会话 │ │ │
│ │ │ Session │ │ 注入引擎 │ │ Action │ │ 安全管理 │ │ │
│ │ │ Pool │ │ │ │ API │ │ │ │ │
│ │ └────────────┘ └──────────┘ └──────────┘ └──────────────┘ │ │
│ │ │ │
│ │ ┌────────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │
│ │ │ 反检测 │ │ 多标签页 │ │ 域名 │ │ C++ 内核 │ │ │
│ │ │ 指纹伪装 │ │ 并发管理 │ │ 白名单 │ │ MAC 控制 │ │ │
│ │ └────────────┘ └──────────┘ └──────────┘ └──────────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
├────────────────────────────────────────────────────────────────────┤
│ 协同价值 │
│ │
│ SuperRPA 提供: sgClaw 增加: │
│ ├─ Zombie Session Pool 会话池 ├─ LLM 智能推理能力 │
│ ├─ SDK 注入与 JS 执行环境 ├─ 自然语言理解与意图解析 │
│ ├─ BrowserAction API 操作接口 ├─ 自主多步任务规划与执行 │
│ ├─ 凭证管理与自动登录 ├─ 自进化学习与 Skill 积累 │
│ ├─ 反自动化检测基础设施 ├─ 跨系统业务流程编排 │
│ └─ 内核级安全强制控制 └─ 业务语义理解与异常处理 │
│ │
│ 单独的 SuperRPA = 强大的自动化浏览器 │
│ SuperRPA + sgClaw = 会思考的智能数字员工 │
│ │
└────────────────────────────────────────────────────────────────────┘
```
### 8.2 典型协同流程
以"自动完成月度合规报表导出"为例:
| 步骤 | 执行者 | 操作 |
|------|-------|------|
| 1 | SuperRPA | Zombie Session Pool 提供已登录的各系统会话 |
| 2 | sgClaw | LLM 理解用户指令,规划任务步骤 |
| 3 | sgClaw | 通过 BrowserAction API 向浏览器发送操作指令 |
| 4 | SuperRPA | SDK 注入层执行 DOM 操作(内核级,不可检测) |
| 5 | SuperRPA | C++ 内核 MAC 校验操作合法性(域名白名单) |
| 6 | sgClaw | 解析操作结果,决定下一步行动 |
| 7 | sgClaw | 任务完成后将操作序列沉淀为 Skill |
| 8 | SuperRPA | 记录完整操作审计日志(含 trace_id |
### 8.3 价值总结
sgClaw 与 SuperRPA 浏览器的结合,实现了 **"能力 + 智能"** 的完整闭环:
- **SuperRPA 浏览器** 解决了 "如何安全、隐蔽地操作业务系统" 的基础设施问题
- **sgClaw** 解决了 "如何智能地理解业务意图并自主执行" 的上层智能问题
- 两者结合,使"业数融合一平台"真正具备 **"理解自然语言 → 自主规划 → 安全执行 → 持续进化"** 的完整智能数字员工能力
---
> **sgClaw — 让每一位员工都拥有一位永不疲倦、永不犯错的智能数字助手。**

View File

@@ -0,0 +1,996 @@
# L1 — 系统架构与安全模型层
**文档版本**: 1.0
**适用项目**: sgClaw (业数融合一平台 AI Agent 底座)
**编制日期**: 2026-03-03
---
## 1. 全局架构拓扑
### 1.1 完整架构图
以下是 sgClaw 系统的完整进程与组件拓扑。图中标注了新增组件(New)与已有组件(Existing)
以便评估改造范围。
```
superrpa-chromium.sh (wrapper, 启动入口)
├─ watchdog (background) ─────────────────────────── [Existing, 不变]
│ └─ node local_service [Existing, 不变]
│ ├─ 本地 HTTP API (端口 9527)
│ └─ 文件上传 / 下载辅助
└─ chrome (main process, foreground) ─────────────── [Existing, 不变]
├─ SgClawProcessHost ────────────────────────── [New, Singleton in Browser Process]
│ │
│ ├── STDIO Pipe (stdin/stdout) ──────────→ sgclaw (Rust child process)
│ │ │
│ │ ├─ Agent Runtime ──────── ZeroClaw ReAct Loop
│ │ │ └─ think → act → observe → repeat
│ │ │
│ │ ├─ LLM Provider ──────── Claude / GPT / 本地模型
│ │ │ ├─ streaming 支持
│ │ │ └─ token 用量统计
│ │ │
│ │ ├─ BrowserPipeTool ──── 自定义 Tool trait 实现
│ │ │ └─ 将 Agent action 序列化为 pipe command
│ │ │
│ │ ├─ SkillLoader ──────── 加载 JS 业务技能脚本
│ │ │ ├─ 技能签名校验
│ │ │ └─ 沙箱执行环境
│ │ │
│ │ ├─ MAC Policy ──────── 域 / Action 白名单
│ │ │ └─ rules.json 配合浏览器侧双重校验
│ │ │
│ │ ├─ Critic ─────────── 输出质量评估
│ │ │ └─ Circuit Breaker (熔断器)
│ │ │
│ │ ├─ Memory ─────────── SQLite + Vector 向量存储
│ │ │ ├─ 短期对话记忆
│ │ │ └─ 长期任务知识库
│ │ │
│ │ └─ MCP Client ─────── rmcp (Rust MCP SDK)
│ │ └─ 连接外部 MCP Server 获取工具
│ │
│ ├─ PipeListener (async read loop)
│ │ └─ 解析 JSON Line分发到 MAC 校验
│ │
│ ├─ MAC Whitelist Check ──────────────────── [New, ~100 lines C++]
│ │ ├─ 校验 action 是否在 pipe 允许列表
│ │ └─ 校验 expected_domain 是否匹配当前页
│ │
│ └─→ CommandRouter ──────────────────────── [Existing, 40+ actions, 不变]
│ ├─ CdpCommandExecutor → 页面操作
│ ├─ ZombiePageManager → 后台会话池
│ └─ SessionManager → 会话状态机
├─ CdpBridgeManager ────────────────────────── [Existing, 页内 JS SDK, 不变]
│ └─ 页面 JS → CDP binding → CommandRouter
├─ ZombiePageManager ───────────────────────── [Existing, 后台会话池, 不变]
│ └─ 最多 5 个 zombie page自动回收
├─ SessionManager ──────────────────────────── [Existing, 会话状态机, 不变]
│ └─ login → active → expired → re-login
└─ RpaGlobalStorage ────────────────────────── [Existing, 跨页存储, 不变]
└─ key-value 存储,持久化到磁盘
```
### 1.2 简化四组件视图
从系统集成的角度sgClaw 的架构可简化为四个核心组件的交互:
```
┌─────────────────────┐ STDIO Pipe ┌─────────────────────┐
│ │ ◄──────────────────────────► │ │
│ SuperRPA Browser │ JSON Line Protocol │ sgClaw (Rust) │
│ (C++ Chromium) │ 单连接、进程私有 │ 基于 ZeroClaw │
│ │ │ │
│ • CommandRouter │ │ • Agent Runtime │
│ • CdpBridgeManager│ │ • BrowserPipeTool │
│ • ZombiePageMgr │ │ • SkillLoader │
│ • SessionManager │ │ • Memory │
│ • SgClawProcessHost│ │ • MAC Policy │
│ (New) │ │ • Critic │
└─────────┬───────────┘ └──────┬──┬──────────┘
│ │ │
│ 页面渲染 API 调用 │ │ 加载技能
│ 用户交互 │ │
▼ ▼ ▼
┌─────────────────────┐ ┌────────────────────────────┐
│ │ │ │
│ 用户 (前台浏览器) │ │ LLM Cloud / Local │
│ │ │ ├─ Claude API │
│ • Side Panel UI │ │ ├─ GPT API │
│ • 启动/停止按钮 │ │ └─ 本地模型 (Ollama 等) │
│ • 任务输入框 │ │ │
│ • 执行日志 │ ├────────────────────────────┤
│ │ │ │
└─────────────────────┘ │ Skill Repository │
│ ├─ 内置技能 (OA 审批等) │
│ ├─ 用户自定义技能 │
│ └─ 签名校验 + 版本管理 │
│ │
└────────────────────────────┘
```
---
## 2. 技术选型决策记录
### 2.1 基底框架选型: ZeroClaw
在确定 sgClaw 的 Agent Runtime 底座时,团队对 Rust 生态中主流 Agent 框架进行了系统评估。
评估维度包括:社区活跃度、内存占用、可嵌入性(是否支持替换浏览器控制层)、以及与我们
STDIO Pipe 架构的兼容性。
| Framework | Language | Stars | Runtime Memory | Embeddability | Browser Layer Replaceable | 备注 |
|------------|----------|-------|----------------|----------------------|---------------------------|---------------------------|
| **ZeroClaw** | Rust | 17K | ~5 MB | High (trait-driven) | **Best** | 活跃社区trait 抽象完善 |
| Rig | Rust | 6.2K | Minimal | Best (cargo add) | Full custom | 轻量但 Agent loop 需自建 |
| Moltis | Rust | - | ~40 MB | Medium | Via MCP only | 内存偏高,嵌入需改造 |
| OpenFang | Rust | New | ~40 MB | Low (API only) | Difficult | API Server 架构,不适合嵌入 |
| MicroClaw | Rust | 152 | - | Low (fork needed) | Via MCP only | 社区不活跃,需 fork 维护 |
**决策ZeroClaw**
核心理由:
1. **trait-driven 架构**ZeroClaw 将 Tool、Provider、Memory、Security 全部定义为 trait
允许我们用自定义的 `BrowserPipeTool` 替换默认的浏览器控制层(如 Playwright/Puppeteer
同时复用其 Agent Runtime、Provider 抽象、Memory 系统和安全模块。
2. **内存优势**~5 MB 的运行时内存占用,在 8 GB 总内存预算内几乎可以忽略不计。
相比 Moltis/OpenFang 的 ~40 MB差异显著。
3. **ReAct Loop 成熟**ZeroClaw 内置 think → act → observe 循环,支持 streaming、
multi-turn、tool-use无需从零构建。
4. **MCP 生态兼容**:内置 rmcp client可在需要时连接外部 MCP Server 扩展工具集。
### 2.2 通信协议选型: STDIO Pipe
sgClaw (Rust) 与 SuperRPA Browser (C++) 之间的 IPC 通道是整个架构的关键路径。
团队评估了四种 IPC 机制:
| 方式 | Linux 支持 | Windows 支持 | 安全性 | 多连接支持 | 延迟 |
|------------------|-------------|---------------------|---------------------------------|-----------|----------|
| **STDIO Pipe** | fd inherit | HANDLE inherit | **最高** (进程私有,无法外部连接) | 否 | ~0.1 ms |
| Unix Domain Socket| /tmp/sock | 不支持 | 高 (文件权限控制) | 是 | ~0.2 ms |
| Named Pipe | 不支持 | \\\\.\pipe\ | 高 (DACL) | 是 | ~0.2 ms |
| TCP localhost | 支持 | 支持 | **低** (任意进程可连) | 是 | ~0.5 ms |
**决策STDIO Pipe**
核心理由:
1. **安全性最高**STDIO Pipe 是进程私有的文件描述符Linux或句柄Windows
只有父子进程间可以访问。本机其他进程无法连接、监听或注入命令。
这从物理层面杜绝了 Pipe Hijack 攻击。
2. **跨平台统一**Chromium 的 `base::LaunchProcess` 已经抽象了跨平台的管道创建,
Linux 使用 `pipe()` + `fork()`/`exec()`Windows 使用 `CreatePipe()` + `CreateProcess()`
我们不需要编写任何平台特定代码。
3. **单连接足够**sgClaw 是 Browser 的唯一 Rust 子进程,一条 STDIO Pipe 即可满足
全部双向通信需求。不需要多客户端并发连接的能力。
4. **延迟最低**:内核态 pipe bufferLinux 默认 64 KB的读写延迟约 0.1 ms
远低于 socket 方案。
### 2.3 Why Rust
为什么 sgClaw 选择 Rust 而非 C++/Python/Node.js
1. **内存安全无 GC**:在 8 GB 总内存限制下GC 语言的内存开销和暂停不可接受。
Rust 的零成本抽象确保 ~5 MB 运行时内存,无 GC 停顿。
2. **跨平台编译**:目标平台包括 Linux 银河麒麟 V10 SP1 (x86_64) 和 Windows 10/11。
Rust 的 cross-compilation 工具链 (`cross`, `cargo-zigbuild`) 可直接生成两个平台的二进制。
3. **极小二进制体积**release 构建约 8.8 MB含 LLM provider、memory、MCP client 全部功能),
Windows 约 9 MB。无需额外运行时依赖。
4. **冷启动极快**< 10 ms 内完成进程初始化和 pipe handshake用户点击"启动"后几乎无感。
5. **ZeroClaw 生态**ZeroClaw 本身及其核心依赖rmcp、tokenizers 等)均为 Rust 实现,
选择 Rust 可直接复用,无需 FFI 桥接。
---
## 3. 进程模型与生命周期
### 3.1 进程层次结构
sgClaw 嵌入 SuperRPA 浏览器的既有进程树中,作为 Chrome 主进程的子进程存在。
```
superrpa-chromium.sh (wrapper, PID 1001)
├─ watchdog (PID 1002, background, 守护进程)
│ └─ node local_service (PID 1003, HTTP API)
│ ├─ 监听 127.0.0.1:9527
│ ├─ 文件上传/下载
│ └─ 与浏览器通过 HTTP 通信
└─ chrome (PID 1004, foreground, 用户交互主进程)
│ 当用户在 Side Panel 点击 [启动] 按钮时:
│ SgClawProcessHost::Start() 被调用
└─ sgclaw (PID 1005, child of chrome)
├─ stdin ← chrome stdout (接收命令响应/事件)
├─ stdout → chrome stdin (发送命令请求)
├─ Agent Runtime (ReAct loop)
├─ LLM Provider (网络出口)
└─ Memory (SQLite 文件 I/O)
```
关键特征:
- sgclaw 是 chrome 的**直接子进程**,继承 chrome 的 UID/GID 权限
- STDIO Pipe 的文件描述符在 `fork()`/`exec()` 时自动继承,无需额外传递
- 当 chrome 进程退出时sgclaw 会收到 SIGPIPE/EOF自行退出
- watchdog 和 local_service 与 sgclaw **无直接通信**,完全独立
### 3.2 生命周期状态机
```
┌──────────────────────────────────┐
│ Side Panel UI: [启动] 按钮 │
└──────────────┬───────────────────┘
│ 用户点击
┌──────────────────────────────────┐
│ SgClawProcessHost::Start() │
│ │
│ 1. Check: sgclaw 二进制存在? │
│ → 不存在: 报错,终止 │
│ │
│ 2. Check: 是否已有实例运行? │
│ → 已运行: 直接返回 │
│ │
│ 3. 创建 pipe pair (读端+写端) │
│ │
│ 4. base::LaunchProcess( │
│ "sgclaw", pipe_opts) │
│ │
│ 5. 启动 PipeReader async loop │
│ │
│ 6. 发送 handshake: │
│ {"type":"init","version":"1.0"}│
│ │
│ 7. 等待 sgClaw ack (超时 5s) │
│ → 超时: Kill + 报错 │
│ │
│ 8. Notify UI: Running │
└──────────────┬───────────────────┘
┌──────────────┴───────────────────┐
│ Running (正常运行) │
│ │
│ • PipeReader 持续监听响应 │
│ • Agent Runtime 接受用户任务 │
│ • 命令经 pipe 发往 Browser │
└──────┬──────────┬──────────┬─────┘
│ │ │
用户点击 浏览器 sgClaw
[停止] 正常退出 异常崩溃
│ │ │
▼ ▼ ▼
┌──────────┐ ┌─────────┐ ┌──────────────────┐
│ Stop() │ │Shutdown()│ │ OnProcessCrash() │
│ │ │ │ │ │
│ 发送 │ │ 发送 │ │ 1. 记录崩溃日志 │
│ shutdown │ │ SIGTERM │ │ 2. 收集 stderr │
│ 命令 │ │ + 等待 │ │ 3. 通知 UI 异常 │
│ 等待退出 │ │ 2s 超时 │ │ 4. 关闭 pipe │
│ Kill │ │ SIGKILL │ │ │
└────┬─────┘ └────┬────┘ │ *** 不自动重启 ***│
│ │ └────────┬─────────┘
▼ ▼ ▼
┌──────────────────────────────────┐
│ Stopped (已停止) │
│ │
│ • Pipe 已关闭 │
│ • 子进程已退出 │
│ • UI 显示 [启动] 按钮 │
│ • 用户可再次点击启动 │
└──────────────────────────────────┘
```
**关键决策:崩溃不自动重启**
当 sgclaw 进程崩溃时(如 panic、OOM、非零退出码系统**不会**自动重启。
用户必须显式点击 [启动] 按钮才能再次启动。理由:
- 防止恶意 prompt injection 导致的无限崩溃重启循环
- 防止异常状态下的资源耗尽(内存泄漏累积、日志磁盘写满)
- 给用户明确的故障感知,而非静默恢复后行为异常
### 3.3 内存预算 (8 GB 约束)
目标部署环境为 8 GB 内存的银河麒麟工作站。以下是各组件的内存分配:
```
┌───────────────────────────────────┬────────────┬──────────┐
│ 组件 │ 内存占用 │ 备注 │
├───────────────────────────────────┼────────────┼──────────┤
│ OS + Desktop (银河麒麟 V10) │ ~2.0 GB │ 固定开销 │
│ Browser Process (主进程) │ ~0.2 GB │ 已有 │
│ Foreground Tabs (1-3 tabs) │ ~0.3-0.9 GB│ 用户页面 │
│ Side Panel (Agent UI) │ ~0.05 GB │ Vue SPA │
│ Zombie Page Pool (max 5) │ ~0.15-0.25 GB│ 后台会话 │
│ local_service (Node.js) │ ~0.1 GB │ 已有 │
│ sgClaw (Rust binary) │ ~0.005 GB │ 5 MB │
│ LLM context cache (对话历史) │ ~0.05 GB │ 内存缓存 │
│ SQLite + vector memory │ ~0.02 GB │ 磁盘为主 │
├───────────────────────────────────┼────────────┼──────────┤
│ **Total** │ **~3.0-3.6 GB** │ │
│ **Headroom** │ **~4.4-5.0 GB** │ >50% │
└───────────────────────────────────┴────────────┴──────────┘
```
sgClaw 的 ~5 MB 内存占用仅为总预算的 0.06%,对系统几乎零负担。
即使在极端场景下3 个前台标签 + 5 个 zombie page + LLM 长对话),
总内存使用也不超过 4 GB保留超过 50% 的余量供操作系统和突发需求使用。
---
## 4. 安全架构
### 4.1 三层纵深防御模型
sgClaw 的安全架构采用纵深防御Defense in Depth策略从内到外设置三道独立的安全层。
任何单一层被突破时,上层仍能有效阻止攻击。
```
┌─────────────────────────────────────────────────────────────────────────┐
│ │
│ Layer 3: 浏览器内核层 (C++ Browser Process) │
│ 最后一道防线 —— 不信任外部一切输入 │
│ │
│ ┌─ MAC 强制访问控制 ───────────────────────────────────────────┐ │
│ │ │ │
│ │ • 域白名单: 仅 rules.json 中配置的域允许特权操作 │ │
│ │ → 未知域的 click/type 等操作直接拒绝 │ │
│ │ │ │
│ │ • Action 白名单: pipe 来源命令受限于安全子集 │ │
│ │ → eval、executeJsInPage 等危险操作禁止通过 pipe 调用 │ │
│ │ │ │
│ │ • 凭证隔离: credential_store 数据永不通过 pipe 暴露 │ │
│ │ → 登录操作由 SessionManager 内部完成 │ │
│ │ │ │
│ │ • 速率限制: 单域每秒最多 N 次特权操作 (可配置,默认 10) │ │
│ │ → 超限后暂停该域操作 30 秒 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ Layer 2: Rust 中枢层 (sgClaw Agent) │
│ 核心原则 —— 不信任 LLM 输出 │
│ │
│ ┌─ 命令校验沙箱 ──────────────────────────────────────────────┐ │
│ │ │ │
│ │ • JSON Schema 严格校验: LLM 输出必须符合预定义的命令格式 │ │
│ │ → 非法字段、类型错误、缺失必要参数均被拒绝 │ │
│ │ │ │
│ │ • 禁止危险命令: LLM 不可生成 eval / executeJsInPage 类命令 │ │
│ │ → BrowserPipeTool 的 action 枚举中不包含这些操作 │ │
│ │ │ │
│ │ • Human-in-the-loop: 敏感操作弹窗确认 │ │
│ │ → sessionLogin / sessionLogout / 大批量操作 │ │
│ │ │ │
│ │ • 序列号 + HMAC: 每条 pipe 消息携带递增 sequence_id │ │
│ │ → 防止消息重放和篡改 │ │
│ │ │ │
│ │ • 熔断器 (Circuit Breaker): 连续失败 N 次自动停止 Agent │ │
│ │ → 默认阈值 10 次,指数退避冷却 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ Layer 1: 管道传输层 (STDIO Pipe) │
│ 物理隔离 —— 传输通道本身不可被第三方访问 │
│ │
│ ┌─ 安全通道 ──────────────────────────────────────────────────┐ │
│ │ │ │
│ │ • STDIO Pipe: 进程私有 fd/HANDLE无法被外部进程连接 │ │
│ │ → 不经过文件系统、不绑定端口、不暴露地址 │ │
│ │ │ │
│ │ • Handshake 校验: 启动时双向版本握手 │ │
│ │ → 版本不匹配则立即断开 │ │
│ │ │ │
│ │ • 递增 sequence_id: 所有消息附带全局递增序列号 │ │
│ │ → 检测到乱序或重复即报警并断开 │ │
│ │ │ │
│ │ • 格式约束: JSON Line 格式,单消息最大 1 MB │ │
│ │ → 超大消息直接丢弃,防止内存 DoS │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 4.2 各层防御详解
**Layer 1 — 管道传输层**
本层的设计目标是确保 sgClaw 与 Browser 之间的通信通道从物理层面不可被第三方窃听或注入。
防御对象:
- 本机恶意进程尝试连接或嗅探 IPC 通道
- 中间人攻击(消息篡改、注入伪造命令)
- 消息重放(录制合法命令序列后重新发送)
实现机制:
- STDIO Pipe 使用操作系统内核的匿名管道,文件描述符仅在父子进程间继承,
`/proc/[pid]/fd/` 对其他用户不可见(取决于 procfs 挂载选项,银河麒麟默认安全)
- 启动时的 handshake 消息包含协议版本号,防止二进制版本不匹配导致的解析错误
- 每条消息的 `sequence_id` 全局递增,接收方校验连续性,检测到跳号或重复立即断开 pipe
**Layer 2 — Rust 中枢层**
本层的核心假设是 **LLM 的输出不可信**。无论是 prompt injection 还是 hallucination
LLM 可能生成任何格式、任何内容的输出。sgClaw 必须在将命令发往 Browser 之前进行严格校验。
防御对象:
- Prompt injection恶意网页内容被 LLM 读取后,诱导其生成危险操作
- HallucinationLLM 生成不存在的 action 或格式错误的参数
- 无限循环LLM 陷入 retry 死循环,持续消耗资源
实现机制:
- `BrowserPipeTool` 定义了一个封闭的 action 枚举enumLLM 只能选择预定义的安全操作
- 每个 action 都有对应的 JSON Schema参数类型、范围、必填项均有严格约束
- Critic 模块在 Agent 每步 observe 后评估输出质量,异常时触发终止
- Circuit Breaker 在连续 10 次操作失败后自动停止 Agent loop需用户手动恢复
- 敏感操作(涉及登录、批量删除等)通过 Side Panel UI 弹窗请求用户确认
**Layer 3 — 浏览器内核层**
本层是安全架构的最后防线。即使 sgClaw 的 Rust 层被完全绕过(理论上几乎不可能),
Browser 的 C++ 代码仍会独立执行 MAC 检查。
防御对象:
- 已突破 Layer 2 的命令(假设 sgClaw 被完全控制)
- 未授权域上的操作sgClaw 试图操作不在白名单中的网站)
- 凭证窃取(任何试图通过 pipe 读取存储密码的操作)
实现机制:
- `rules.json` 白名单由管理员配置,列出允许 Agent 操作的域名(如 `oa.example.com`
- 每条 pipe 命令到达 Browser 后,先校验 `expected_domain` 是否与当前页面的实际域名一致
- `credential_store`Linux Keyring / Windows Credential Manager的 API 在 pipe handler 中
没有任何暴露点——登录凭证只能由 SessionManager 在 Browser 内部使用
- 速率限制器独立于 sgClaw 的 Circuit Breaker即使后者被禁用Browser 侧的限速仍然生效
---
## 5. 威胁模型与对抗策略
### 5.1 威胁分类总表
| # | 威胁名称 | 描述 | 影响 | 防御层 | 对抗策略 |
|----|------------------------|------------------------------------------------|----------------------------|-----------------|---------------------------------------------------------|
| T1 | Pipe Hijack | 本机攻击者劫持 STDIO Pipe | 完全控制浏览器操作 | Layer 1 | STDIO 进程私有fd 不经过文件系统procfs 受限 |
| T2 | LLM Prompt Injection | 恶意页面内容注入 LLM prompt | 执行未授权操作 | Layer 2 | JSON Schema 校验Action 枚举白名单;禁止 eval |
| T3 | Skill Poisoning | 注入恶意 Skill 脚本 | 持久化后门 | Layer 2 + 3 | Skill 签名校验沙箱执行MAC 域名限制 |
| T4 | Credential Leakage | 通过 pipe 读取浏览器存储的密码 | 账户泄露 | Layer 3 | credential_store API 不暴露给 pipe凭证仅内部使用 |
| T5 | Replay Attack | 录制合法命令后重放 | 重复执行敏感操作 | Layer 2 | sequence_id 递增校验 + HMAC 签名 |
| T6 | Retry Storm | LLM 无限重试导致资源耗尽 | CPU/内存/网络耗尽 | Layer 2 | Circuit Breaker (阈值 10);指数退避;最大重试限制 |
### 5.2 各威胁详细分析
**T1: Pipe Hijack管道劫持**
攻击路径:同一台机器上的恶意进程尝试读取/写入 sgClaw 与 Browser 之间的 STDIO Pipe。
分析STDIO Pipe 基于操作系统匿名管道实现,没有文件系统路径,没有网络端口。
攻击者需要获取目标进程的 fdLinux或 HANDLEWindows这在标准安全配置下
需要 root 权限或 `ptrace` 能力。银河麒麟 V10 默认启用 `kernel.yama.ptrace_scope=1`
非父进程无法 ptrace。
残余风险root 用户可以访问任何进程的 fd。但在本部署场景中root 被视为可信实体。
**T2: LLM Prompt Injection提示注入**
攻击路径:用户访问的恶意网页中包含精心构造的文本,当 sgClaw 读取页面内容并发送给 LLM 时,
这些文本被 LLM 误解为指令,导致 Agent 执行非预期操作。
分析:这是 AI Agent 面临的最常见威胁。sgClaw 的防御不依赖于 LLM 本身的抗注入能力
(这是不可靠的),而是在 Rust 层进行硬编码限制:
- LLM 只能输出预定义的 action 枚举值,任何不在枚举中的操作被直接拒绝
- 最危险的 `eval``executeJsInPage` 不在枚举中,从根本上不可能被 LLM 触发
- `expected_domain` 字段要求 LLM 明确声明目标域名Browser 侧校验实际域名是否匹配
**T3: Skill Poisoning技能投毒**
攻击路径:攻击者将恶意 JavaScript Skill 注入到 Skill Repository 中,
当 sgClaw 加载该 Skill 时执行恶意代码。
分析Skill 文件在加载前经过以下校验链:
1. 签名校验:每个 Skill 文件必须附带由构建系统生成的数字签名
2. 沙箱执行Skill 代码在受限的 JavaScript 沙箱中运行,无法访问文件系统或网络
3. MAC 限制:即使 Skill 生成了恶意命令Browser 侧的域白名单仍会阻止未授权操作
**T4: Credential Leakage凭证泄漏**
攻击路径:通过 pipe 发送特制命令,尝试读取 Browser 中存储的登录密码。
分析:`credential_store` 使用 Linux Keyring银河麒麟或 Windows Credential Manager
存储加密凭证。其 C++ API 仅在 `SessionManager::DoLogin()` 内部调用,
没有任何 CommandRouter action 会暴露凭证数据。pipe handler 的代码路径中
完全不存在读取凭证的逻辑。
**T5: Replay Attack重放攻击**
攻击路径:攻击者(假设已突破 Layer 1录制合法的 pipe 命令序列,稍后重放。
分析:每条消息携带递增的 `sequence_id` 和基于共享密钥的 HMAC。
接收方维护已处理的最大 sequence_id拒绝任何小于或等于该值的消息。
HMAC 密钥在每次 sgclaw 启动时通过 handshake 动态协商,重启后旧命令的 HMAC 无效。
**T6: Retry Storm重试风暴**
攻击路径LLM 因 hallucination 或 prompt injection 陷入无限循环,
持续生成失败命令并重试。
分析sgClaw 内置两级防护:
1. Agent Runtime 层:单次任务最大步数限制(默认 50 步),超出自动终止
2. Circuit Breaker连续 10 次操作失败后,断路器打开,停止所有 pipe 通信,
需要用户手动恢复。冷却期间采用指数退避1s → 2s → 4s → ... → 30s max
---
## 6. 通信架构
### 6.1 Pipe 协议概览
sgClaw 与 Browser 之间使用 JSON Line 格式通过 STDIO Pipe 通信。
每条消息占一行(以 `\n` 结尾),单消息最大 1 MB。
**消息类型一览:**
```
sgClaw → Browser:
├─ command (请求执行浏览器操作)
└─ ack (确认收到事件)
Browser → sgClaw:
├─ response (命令执行结果)
├─ event (主动推送的页面事件)
└─ init_ack (handshake 响应)
```
**Request 格式sgClaw → Browser**
```json
{
"seq": 1,
"type": "command",
"action": "click",
"params": {
"selector": "#submit-btn",
"wait_after": 1000
},
"security": {
"expected_domain": "oa.example.com",
"hmac": "a3f8c2..."
}
}
```
字段说明:
- `seq`: 递增序列号,全局唯一,用于匹配 response 和防重放
- `type`: 消息类型,`command` 表示操作请求
- `action`: 操作名称,必须在允许列表中
- `params`: 操作参数,每个 action 有独立的 JSON Schema
- `security.expected_domain`: 期望的目标域名Browser 侧校验
- `security.hmac`: 消息完整性签名
**Response 格式Browser → sgClaw**
```json
{
"seq": 1,
"type": "response",
"success": true,
"data": {
"clicked": true,
"element_text": "提交"
},
"aom_snapshot": [
{"role": "button", "name": "提交", "bounds": [100, 200, 80, 30]}
],
"timing": {
"queue_ms": 2,
"exec_ms": 45
}
}
```
字段说明:
- `seq`: 与请求对应的序列号
- `success`: 操作是否成功
- `data`: 操作结果数据,格式因 action 而异
- `aom_snapshot`: 操作后的 AOMAccessibility Object Model快照
供 Agent 的 observe 阶段使用,理解页面当前状态
- `timing`: 性能计时信息
**Event 格式Browser → sgClaw主动推送**
```json
{
"type": "event",
"event": "page_navigated",
"data": {
"url": "https://oa.example.com/approval/list",
"title": "审批列表 - OA系统",
"domain": "oa.example.com"
},
"timestamp": 1709452800000
}
```
支持的事件类型:
- `page_navigated`: 页面导航完成
- `page_loaded`: 页面 DOMContentLoaded
- `dialog_appeared`: 浏览器对话框弹出alert/confirm/prompt
- `session_expired`: SessionManager 检测到会话过期
- `zombie_ready`: Zombie page 初始化完成
### 6.2 与 CommandRouter 的对接
sgClaw 的命令最终汇入 SuperRPA 已有的 CommandRouter这是一个统一的命令分发器
支持 40+ 种浏览器操作。sgClaw 作为新增的命令来源,与已有的 JS SDK 并行存在。
**sgClaw Pipe 路径(新增):**
```
sgClaw (Rust)
│ JSON Line over STDIO Pipe
SgClawProcessHost (C++, Browser Process)
PipeListener (async read, parse JSON)
├─── MAC Whitelist Check ─────────────────────────────┐
│ │ │
│ ├─ action in allowed_pipe_actions? │
│ │ → No: reject with error response │
│ │ │
│ ├─ expected_domain matches current page? │
│ │ → No: reject with domain_mismatch error │
│ │ │
│ └─ rate limit not exceeded? │
│ → Exceeded: reject with rate_limit error │
│ │
▼ │
CommandRouter (Existing, 40+ actions) ◄──────────────────┘
├───────────┬──────────────┬──────────────┐
▼ ▼ ▼ ▼
CdpCommand ZombiePage Session RpaGlobal
Executor Manager Manager Storage
Page DOM Operations (click, type, getText, etc.)
```
**已有 JS SDK 路径(不变):**
```
页面内 JavaScript
│ CDP binding (chrome.runtime.sendMessage)
CdpBridgeManager (C++, Renderer → Browser IPC)
CommandRouter (Same instance!) ◄── 同一个 CommandRouter
├───────────┬──────────────┬──────────────┐
▼ ▼ ▼ ▼
CdpCommand ZombiePage Session RpaGlobal
Executor Manager Manager Storage
```
两条路径汇聚于同一个 CommandRouter 实例。sgClaw 只是新增了一个命令来源,
不改变 CommandRouter 的任何现有逻辑。区别仅在于:
- JS SDK 路径:无 MAC whitelist check页面 JS 已通过 CSP 和 rules.json 限制)
- Pipe 路径:增加 MAC whitelist check因为 sgClaw 被视为外部进程,需额外校验)
### 6.3 Pipe 允许的 Action 子集
并非所有 CommandRouter 支持的 40+ 个 action 都允许通过 pipe 调用。
出于安全考虑pipe 来源的命令被限制在以下安全子集中:
**允许通过 Pipe 调用(无需确认):**
| Action | 描述 | 备注 |
|------------------|--------------------|---------------------------------|
| click | 点击元素 | 需 expected_domain 匹配 |
| type | 输入文本 | 需 expected_domain 匹配 |
| navigate | 导航到 URL | URL 必须在域白名单内 |
| getText | 获取元素文本 | 只读操作,安全 |
| getHtml | 获取元素 HTML | 只读操作,安全 |
| waitForSelector | 等待元素出现 | 只读操作,安全 |
| pageScreenshot | 页面截图 | 返回 base64用于 Agent observe |
| storageSet | 写 RpaGlobalStorage | key 前缀限制为 sgclaw.* |
| storageGet | 读 RpaGlobalStorage | key 前缀限制为 sgclaw.* |
| zombieSpawn | 创建 zombie page | 受池大小限制max 5 |
| zombieKill | 销毁 zombie page | 只能销毁自己创建的 zombie |
| select | 下拉框选择 | 需 expected_domain 匹配 |
| scrollTo | 滚动页面 | 需 expected_domain 匹配 |
| getAomSnapshot | 获取 AOM 快照 | 只读操作,核心 observe 能力 |
**禁止通过 Pipe 调用(硬编码拒绝):**
| Action | 描述 | 禁止原因 |
|--------------------|--------------------|--------------------------------------------|
| eval | 执行任意 JS | 最高危操作,可绕过一切安全限制 |
| executeJsInPage | 在页面执行 JS | 等同于 evalprompt injection 核心攻击面 |
| registerJsFunction | 注册 JS 回调 | 可植入持久化代码 |
| setRequestInterceptor | 拦截网络请求 | 可窃取请求中的 token/cookie |
| exportCookies | 导出所有 cookie | 可窃取会话凭证 |
**需要用户确认的操作Human-in-the-loop**
| Action | 描述 | 确认原因 |
|------------------|--------------------|---------------------------------|
| sessionLogin | 执行登录流程 | 涉及凭证使用,需用户知情 |
| sessionLogout | 登出会话 | 可能中断用户正在进行的工作 |
| clearStorage | 清空存储 | 不可逆操作 |
---
## 7. 跨平台策略
### 7.1 STDIO Pipe 跨平台实现
STDIO Pipe 的跨平台实现依赖 Chromium 已有的 `base::LaunchProcess` 抽象层,
sgClaw 团队无需编写平台特定的管道代码。
**Linux 实现路径:**
```
Browser Process (C++) sgClaw (Rust)
───────────────────── ─────────────
1. pipe(fds) → fds[0](读), fds[1](写)
2. pipe(fds2) → fds2[0](读), fds2[1](写)
3. fork()
4. 子进程:
dup2(fds[0], STDIN_FILENO)
dup2(fds2[1], STDOUT_FILENO)
exec("sgclaw") ──────────────────→ main()
5. 父进程: std::io::stdin() → 读取命令
write(fds[1], ...) ──────────────→ std::io::stdout() → 写回响应
read(fds2[0], ...) ◄──────────── BufReader + BufWriter
```
Chromium 的 `base::LaunchProcess` 封装了上述 `pipe()` + `fork()` + `exec()` 流程,
通过 `LaunchOptions::fds_to_remap` 配置 fd 映射。
**Windows 实现路径:**
```
Browser Process (C++) sgClaw (Rust)
───────────────────── ─────────────
1. CreatePipe(&hRead1, &hWrite1, ...)
2. CreatePipe(&hRead2, &hWrite2, ...)
3. SetHandleInformation(hRead1, INHERIT)
4. SetHandleInformation(hWrite2, INHERIT)
5. CreateProcess("sgclaw.exe",
STARTUPINFO {
hStdInput = hRead1, main()
hStdOutput = hWrite2 std::io::stdin() → ReadFile
}) std::io::stdout() → WriteFile
6. WriteFile(hWrite1, ...) ──────────→
ReadFile(hRead2, ...) ◄────────
```
Chromium 的 `base::LaunchProcess` 在 Windows 下使用 `CreateProcess` + `STARTUPINFO`
实现句柄继承,与 Linux 的 fd 继承语义一致。
**Rust 侧统一代码:**
无论 Linux 还是 Windowssgclaw 的 Rust 代码完全一致:
```rust
// sgclaw 端无需区分平台
let reader = BufReader::new(std::io::stdin());
let writer = BufWriter::new(std::io::stdout());
for line in reader.lines() {
let msg: PipeMessage = serde_json::from_str(&line?)?;
let response = handle_message(msg).await?;
writeln!(writer, "{}", serde_json::to_string(&response)?)?;
writer.flush()?;
}
```
### 7.2 目标平台
| 平台 | 操作系统 | CPU 架构 | 状态 | 备注 |
|-----------|--------------------------|----------|------------------|-----------------------------|
| Primary | 银河麒麟 V10 SP1 | x86_64 | 目标部署环境 | 政企客户主要使用平台 |
| Secondary | Windows 10 / 11 | x86_64 | 开发 + 部分部署 | 开发团队日常使用 + 部分客户 |
| Future | 银河麒麟 V10 SP1 | aarch64 | 规划中 | 国产 ARM 服务器/终端 |
**银河麒麟 V10 SP1 特殊注意事项:**
- 基于 Ubuntu 内核但定制了安全策略SELinux/AppArmor 变体)
- `procfs` 默认配置限制跨进程 fd 访问,有利于 Pipe Hijack 防御
- `kernel.yama.ptrace_scope=1`,非父进程无法 ptrace增强安全性
- glibc 版本需确认兼容(通常 >= 2.31Rust musl 静态链接可规避
### 7.3 sgClaw 二进制分发
sgClaw 编译为单一静态链接的 Rust 二进制,无外部运行时依赖。
```
sgclaw 二进制产物
├─ Linux: sgclaw (~8.8 MB, musl 静态链接, strip)
│ target: x86_64-unknown-linux-musl
│ 无 glibc 依赖,银河麒麟直接运行
└─ Windows: sgclaw.exe (~9.0 MB, MSVC 链接, strip)
target: x86_64-pc-windows-msvc
无额外 DLL 依赖
```
构建命令:
```bash
# Linux (musl 静态链接,确保银河麒麟兼容)
cargo build --release --target x86_64-unknown-linux-musl
strip target/x86_64-unknown-linux-musl/release/sgclaw
# Windows (交叉编译)
cargo build --release --target x86_64-pc-windows-msvc
```
部署方式:将 `sgclaw` / `sgclaw.exe` 放置在 SuperRPA 浏览器安装目录下:
```
superrpa-browser/
├─ chrome (浏览器主程序)
├─ superrpa-chromium.sh (启动脚本)
├─ sgclaw (AI Agent, 新增)
├─ sgclaw-skills/ (技能目录, 新增)
│ ├─ oa-approval.js
│ └─ ...
└─ resources/
└─ rules.json (域白名单, 已有)
```
---
## 8. 与 SuperRPA 已有子系统的关系
### 8.1 复用与新增总览
sgClaw 的核心设计原则之一是**最小侵入**——最大限度复用 SuperRPA 浏览器的已有基础设施,
将新增代码量控制在最低水平。
```
┌─────────────────────────────────────────────────────────────────────┐
│ SuperRPA Browser 已有子系统 │
│ (全部保持不变,零修改) │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Command │ │ CdpBridge │ │ ZombiePage │ │
│ │ Router │ │ Manager │ │ Manager │ │
│ │ (40+ acts) │ │ (JS SDK) │ │ (5 pools) │ │
│ └──────┬──────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ┌──────┴──────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ CdpCommand │ │ Session │ │ RpaGlobal │ │
│ │ Executor │ │ Manager │ │ Storage │ │
│ │ │ │ (状态机) │ │ (KV store) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ credential │ │ rules.json │ │ BrowserAction│ │
│ │ _store │ │ (URL白名单) │ │ API │ │
│ │ (Keyring) │ │ │ │ (JS 调度) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
├─────────────────────────────────────────────────────────────────────┤
│ sgClaw 新增组件 │
│ (~500 lines C++ in Browser + Rust binary) │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ SgClawProcessHost (C++, ~200-300 lines) │ │
│ │ ├─ 进程生命周期管理 (Start / Stop / OnCrash) │ │
│ │ ├─ PipeListener (~150 lines, async read loop) │ │
│ │ ├─ MAC Whitelist Check (~100 lines) │ │
│ │ └─ FunctionsUI handlers for start/stop (~50 lines) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Side Panel UI Controls (Vue, ~100 lines) │ │
│ │ ├─ [启动] / [停止] 按钮 │ │
│ │ ├─ 状态指示 (Running / Stopped / Error) │ │
│ │ ├─ 任务输入框 │ │
│ │ └─ 执行日志 (streaming output) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ sgclaw Binary (Rust, based on ZeroClaw) │ │
│ │ ├─ Agent Runtime (ReAct loop) │ │
│ │ ├─ BrowserPipeTool (custom Tool trait impl) │ │
│ │ ├─ SkillLoader (JS business skills) │ │
│ │ ├─ LLM Provider (Claude / GPT / local) │ │
│ │ ├─ Memory (SQLite + vector) │ │
│ │ ├─ MAC Policy (domain / action whitelist) │ │
│ │ ├─ Critic + Circuit Breaker │ │
│ │ └─ MCP Client (rmcp) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
```
### 8.2 复用子系统详细说明
| 子系统 | 代码位置 | sgClaw 如何复用 | 是否修改 |
|---------------------|----------------------|---------------------------------------------------|---------|
| CommandRouter | browser/rpa/command/ | sgClaw 通过 pipe → PipeListener → CommandRouter | 不修改 |
| CdpBridgeManager | browser/rpa/cdp/ | 独立运行JS SDK 路径不受影响 | 不修改 |
| ZombiePageManager | browser/rpa/zombie/ | sgClaw 通过 zombieSpawn/zombieKill action 使用 | 不修改 |
| SessionManager | browser/rpa/session/ | sgClaw 可触发 sessionLogin (需确认) | 不修改 |
| RpaGlobalStorage | browser/rpa/storage/ | sgClaw 通过 storageSet/storageGet 读写 | 不修改 |
| BrowserAction API | browser/rpa/action/ | 已有 JS SDK 继续使用,与 sgClaw 独立 | 不修改 |
| credential_store | browser/rpa/cred/ | 仅 SessionManager 内部使用sgClaw 无法访问 | 不修改 |
| rules.json | resources/ | sgClaw 的 MAC Policy 也读取此文件进行域校验 | 不修改 |
### 8.3 新增代码量估算
| 组件 | 语言 | 估计行数 | 位置 |
|-----------------------------|--------|-------------|-------------------------------|
| SgClawProcessHost | C++ | ~200-300 | browser/rpa/sgclaw/ |
| PipeListener | C++ | ~150 | browser/rpa/sgclaw/ |
| MAC Whitelist Check (Pipe) | C++ | ~100 | browser/rpa/sgclaw/ |
| FunctionsUI handlers | C++ | ~50 | browser/rpa/functions_ui/ |
| Side Panel UI controls | Vue | ~100 | resources/side_panel/ |
| **Browser 侧合计** | | **~500-600**| |
| sgclaw binary | Rust | ~3000-5000 | 独立仓库 sgclaw/ |
### 8.4 影响评估
**对已有功能的影响:零。**
具体论证:
1. **CommandRouter 不变**sgClaw 只是新增了一个命令来源pipeCommandRouter 本身的
dispatch 逻辑、action 处理函数、错误处理均不修改。
2. **JS SDK 不变**CdpBridgeManager 独立于 SgClawProcessHost两者通过不同的 IPC 路径
到达同一个 CommandRouter。JS SDK 的用户不会感知到 sgClaw 的存在。
3. **会话管理不变**SessionManager 的状态机login → active → expired → re-login
完全不变。sgClaw 只能通过 CommandRouter 触发 sessionLogin action需用户确认
不直接操作 SessionManager 内部状态。
4. **存储隔离**sgClaw 通过 RpaGlobalStorage 的 key 被限制在 `sgclaw.*` 命名空间下,
不会与已有的 JS SDK 存储的 key 冲突。
5. **二进制独立**sgclaw 是独立二进制,不链接 Chromium 的任何库。
即使 sgclaw 构建失败或缺失,浏览器仍然正常工作——只是 Side Panel 的 [启动] 按钮
会报错"sgclaw binary not found"。
---
*文档结束。本文档为 sgClaw L1 层架构设计参考,后续 L2详细设计、L3实现规范
将在此基础上展开。*

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

21
docs/README.md Normal file
View File

@@ -0,0 +1,21 @@
# docs 目录说明
## 当前有效文档(研发与管理)
- `团队管理标准.md`:团队管理制度、角色清单、变更流程。
- `浏览器对接标准.md`Chromium ↔ sgClaw 联调接口标准P1a/P2 必读)。
- `L0-产品白皮书与能力全景层.md` ~ `L4-工程实现与部署拓扑层.md`:架构分层文档。
- `团队分工.md``协作时间表.md``协作甘特图.md`:协作计划源文档。
## 归档文档(领导演示素材)
为避免研发目录混杂演示资产,以下内容已统一归档到:
- `archive/领导演示资料/docs-html/`:演示网页(架构图、时间表)
- `archive/领导演示资料/docs-pdf/`:演示导出的 PDF
- `archive/领导演示资料/docs-figures/`演示图SVG
- `archive/领导演示资料/docs-scripts/`:演示查看/导出脚本
- `archive/领导演示资料/frontend-pages/`:前端演示网页
- `archive/领导演示资料/frontend-svgs/`:前端演示图源文件
> 归档原则:不影响研发主线文档,演示资产可追溯、可复用、可批量查找。

View File

@@ -0,0 +1,18 @@
# 领导演示资料归档
本目录用于存放“为汇报/演示准备”的图、网页、导出 PDF 与相关脚本。
## 子目录说明
- `docs-html/`HTML 演示页(系统架构图、团队协作图、时间表)
- `docs-pdf/`:对外展示 PDF 版本
- `docs-figures/`:演示图源(如 SVG
- `docs-scripts/`演示查看脚本、PDF 导出脚本
- `frontend-pages/`:前端演示页与备份
- `frontend-svgs/`drawio/mmd/svg/png 等图源
## 使用约定
1. 研发主线文档只保留在 `docs/` 根目录。
2. 面向领导汇报的衍生物统一进入本目录。
3. 归档文件如需更新,保留原文件名,避免引用断链。

View File

@@ -0,0 +1,183 @@
<svg width="1200" height="800" xmlns="http://www.w3.org/2000/svg">
<defs>
<style>
.title { font: bold 24px sans-serif; fill: #1e293b; }
.subtitle { font: 14px sans-serif; fill: #64748b; }
.person { font: bold 14px sans-serif; fill: #334155; }
.day { font: 12px sans-serif; fill: #475569; }
.task { font: 12px sans-serif; fill: #1e293b; }
.critical { fill: #ef4444; stroke: #b91c1c; stroke-width: 2; }
.normal { fill: #60a5fa; stroke: #2563eb; stroke-width: 1; }
.milestone { fill: #10b981; stroke: #059669; stroke-width: 2; }
.grid { stroke: #e2e8f0; stroke-width: 1; }
.axis { stroke: #94a3b8; stroke-width: 2; }
</style>
</defs>
<!-- 标题 -->
<text x="600" y="30" text-anchor="middle" class="title">sgClaw 项目协作甘特图2周</text>
<text x="600" y="55" text-anchor="middle" class="subtitle">⭐ 红色 = 关键路径 | 🔷 蓝色 = 常规任务 | ✅ 绿色 = 里程碑</text>
<!-- 时间轴 -->
<line x1="150" y1="90" x2="1150" y2="90" class="axis"/>
<text x="200" y="110" text-anchor="middle" class="day">Day 1-2</text>
<text x="300" y="110" text-anchor="middle" class="day">Day 3</text>
<text x="400" y="110" text-anchor="middle" class="day">Day 4</text>
<text x="500" y="110" text-anchor="middle" class="day">Day 5</text>
<text x="600" y="110" text-anchor="middle" class="day">Day 6</text>
<text x="700" y="110" text-anchor="middle" class="day">Day 7</text>
<text x="800" y="110" text-anchor="middle" class="day">Day 8</text>
<text x="900" y="110" text-anchor="middle" class="day">Day 9</text>
<text x="1000" y="110" text-anchor="middle" class="day">Day 10</text>
<!-- 网格线 -->
<line x1="200" y1="90" x2="200" y2="750" class="grid"/>
<line x1="300" y1="90" x2="300" y2="750" class="grid"/>
<line x1="400" y1="90" x2="400" y2="750" class="grid"/>
<line x1="500" y1="90" x2="500" y2="750" class="grid"/>
<line x1="600" y1="90" x2="600" y2="750" class="grid"/>
<line x1="700" y1="90" x2="700" y2="750" class="grid"/>
<line x1="800" y1="90" x2="800" y2="750" class="grid"/>
<line x1="900" y1="90" x2="900" y2="750" class="grid"/>
<line x1="1000" y1="90" x2="1000" y2="750" class="grid"/>
<!-- P1a的任务 -->
<text x="30" y="150" class="person">P1a (你)</text>
<rect x="150" y="135" width="100" height="25" class="normal" rx="3"/>
<text x="200" y="153" text-anchor="middle" class="task">环境搭建</text>
<rect x="250" y="135" width="50" height="25" class="critical" rx="3"/>
<text x="275" y="153" text-anchor="middle" class="task" fill="#fff">Pipe协议</text>
<rect x="300" y="135" width="200" height="25" class="critical" rx="3"/>
<text x="400" y="153" text-anchor="middle" class="task" fill="#fff">⭐ 联调Pipe关键路径</text>
<polygon points="500,140 520,147.5 500,155" class="milestone"/>
<text x="535" y="153" class="task" fill="#10b981">W1里程碑</text>
<rect x="550" y="135" width="50" height="25" class="normal" rx="3"/>
<text x="575" y="153" text-anchor="middle" class="task">集成</text>
<rect x="600" y="135" width="100" height="25" class="normal" rx="3"/>
<text x="650" y="153" text-anchor="middle" class="task">MAC安全</text>
<rect x="700" y="135" width="200" height="25" class="normal" rx="3"/>
<text x="800" y="153" text-anchor="middle" class="task">bug修复+测试</text>
<!-- P1b 的任务 -->
<text x="30" y="210" class="person">P1b</text>
<rect x="150" y="195" width="100" height="25" class="normal" rx="3"/>
<text x="200" y="213" text-anchor="middle" class="task">环境搭建</text>
<rect x="250" y="195" width="150" height="25" class="normal" rx="3"/>
<text x="325" y="213" text-anchor="middle" class="task">SkillLoader</text>
<rect x="400" y="195" width="100" height="25" class="normal" rx="3"/>
<text x="450" y="213" text-anchor="middle" class="task">Memory</text>
<rect x="550" y="195" width="50" height="25" class="normal" rx="3"/>
<text x="575" y="213" text-anchor="middle" class="task">集成</text>
<rect x="600" y="195" width="100" height="25" class="normal" rx="3"/>
<text x="650" y="213" text-anchor="middle" class="task">Critic</text>
<rect x="700" y="195" width="200" height="25" class="normal" rx="3"/>
<text x="800" y="213" text-anchor="middle" class="task">bug修复</text>
<!-- P2 的任务 -->
<text x="30" y="270" class="person">P2</text>
<rect x="150" y="255" width="100" height="25" class="normal" rx="3"/>
<text x="200" y="273" text-anchor="middle" class="task">环境搭建</text>
<rect x="250" y="255" width="50" height="25" class="normal" rx="3"/>
<text x="275" y="273" text-anchor="middle" class="task">框架</text>
<rect x="300" y="255" width="200" height="25" class="critical" rx="3"/>
<text x="400" y="273" text-anchor="middle" class="task" fill="#fff">⭐ 联调Pipe</text>
<rect x="500" y="255" width="100" height="25" class="normal" rx="3"/>
<text x="550" y="273" text-anchor="middle" class="task">MAC白名单</text>
<rect x="600" y="255" width="100" height="25" class="normal" rx="3"/>
<text x="650" y="273" text-anchor="middle" class="task">UI对接</text>
<rect x="700" y="255" width="200" height="25" class="normal" rx="3"/>
<text x="800" y="273" text-anchor="middle" class="task">bug修复</text>
<!-- P3 的任务 -->
<text x="30" y="330" class="person">P3</text>
<rect x="150" y="315" width="50" height="25" class="normal" rx="3"/>
<text x="175" y="333" text-anchor="middle" class="task">调研</text>
<rect x="200" y="315" width="150" height="25" class="normal" rx="3"/>
<text x="275" y="333" text-anchor="middle" class="task">黄金样本</text>
<rect x="350" y="315" width="50" height="25" class="normal" rx="3"/>
<text x="375" y="333" text-anchor="middle" class="task">Prompt</text>
<rect x="400" y="315" width="200" height="25" class="normal" rx="3"/>
<text x="500" y="333" text-anchor="middle" class="task">AI批量翻译</text>
<rect x="700" y="315" width="200" height="25" class="normal" rx="3"/>
<text x="800" y="333" text-anchor="middle" class="task">质量抽检</text>
<!-- P4 的任务 -->
<text x="30" y="390" class="person">P4</text>
<rect x="150" y="375" width="100" height="25" class="normal" rx="3"/>
<text x="200" y="393" text-anchor="middle" class="task">环境搭建</text>
<rect x="250" y="375" width="50" height="25" class="normal" rx="3"/>
<text x="275" y="393" text-anchor="middle" class="task">UI设计</text>
<rect x="300" y="375" width="200" height="25" class="normal" rx="3"/>
<text x="400" y="393" text-anchor="middle" class="task">Side Panel + Skill后台</text>
<rect x="600" y="375" width="100" height="25" class="normal" rx="3"/>
<text x="650" y="393" text-anchor="middle" class="task">测试框架</text>
<rect x="700" y="375" width="200" height="25" class="normal" rx="3"/>
<text x="800" y="393" text-anchor="middle" class="task">E2E测试</text>
<polygon points="900,380 920,387.5 900,395" class="milestone"/>
<text x="935" y="393" class="task" fill="#10b981">打包发布</text>
<!-- E2E 测试高亮 -->
<rect x="700" y="440" width="200" height="40" fill="#fef3c7" stroke="#f59e0b" stroke-width="2" rx="5"/>
<text x="800" y="465" text-anchor="middle" class="task">🧪 全员 E2E 测试</text>
<!-- 里程碑标注 -->
<line x1="500" y1="115" x2="500" y2="420" stroke="#10b981" stroke-width="3" stroke-dasharray="5,5"/>
<rect x="450" y="495" width="100" height="60" fill="#d1fae5" stroke="#10b981" stroke-width="2" rx="5"/>
<text x="500" y="515" text-anchor="middle" class="person" fill="#059669">W1 里程碑</text>
<text x="500" y="535" text-anchor="middle" class="task" fill="#065f46">链路打通</text>
<line x1="900" y1="115" x2="900" y2="420" stroke="#10b981" stroke-width="3" stroke-dasharray="5,5"/>
<rect x="850" y="495" width="100" height="60" fill="#d1fae5" stroke="#10b981" stroke-width="2" rx="5"/>
<text x="900" y="515" text-anchor="middle" class="person" fill="#059669">W2 里程碑</text>
<text x="900" y="535" text-anchor="middle" class="task" fill="#065f46">正式发布</text>
<!-- 关键路径高亮 -->
<rect x="250" y="560" width="250" height="60" fill="#fee2e2" stroke="#dc2626" stroke-width="2" rx="5"/>
<text x="375" y="580" text-anchor="middle" class="person" fill="#991b1b">⚠️ 关键路径</text>
<text x="375" y="600" text-anchor="middle" class="task" fill="#7f1d1d">Day 3-5: P1a + P2 联调</text>
<!-- 并行度标注 -->
<rect x="550" y="560" width="200" height="60" fill="#dbeafe" stroke="#2563eb" stroke-width="2" rx="5"/>
<text x="650" y="580" text-anchor="middle" class="person" fill="#1e40af">并行度最高</text>
<text x="650" y="600" text-anchor="middle" class="task" fill="#1e3a8a">Day 6-7: 4组同时开发</text>
<!-- 风险提示 -->
<rect x="100" y="650" width="1000" height="80" fill="#fff7ed" stroke="#f97316" stroke-width="2" rx="5"/>
<text x="600" y="675" text-anchor="middle" class="person" fill="#c2410c">⚠️ 极高风险Day 4-5 如果 Pipe 通信不通,阻塞所有后续工作</text>
<text x="600" y="700" text-anchor="middle" class="task" fill="#9a3412">预案Day 4 晚上还没通 → P1b 全力支援 | Day 5 中午还没通 → 降级 HTTP</text>
<!-- 图例 -->
<rect x="50" y="760" width="30" height="20" class="critical" rx="2"/>
<text x="90" y="775" class="task">关键路径</text>
<rect x="200" y="760" width="30" height="20" class="normal" rx="2"/>
<text x="240" y="775" class="task">常规任务</text>
<polygon points="350,765 365,772.5 350,780" class="milestone"/>
<text x="375" y="775" class="task">里程碑</text>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

@@ -0,0 +1,446 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sgClaw 协作时间表 - 甘特图</title>
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", sans-serif;
background: #0f172a;
color: #f1f5f9;
padding: 40px 20px;
line-height: 1.6;
}
.container { max-width: 1400px; margin: 0 auto; }
h1 {
font-size: 2.5rem;
margin-bottom: 10px;
background: linear-gradient(135deg, #38bdf8, #818cf8);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.subtitle {
color: #94a3b8;
font-size: 1.1rem;
margin-bottom: 40px;
}
.section {
background: rgba(255,255,255,0.05);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 12px;
padding: 30px;
margin-bottom: 30px;
}
.section h2 {
font-size: 1.8rem;
margin-bottom: 20px;
color: #38bdf8;
display: flex;
align-items: center;
gap: 10px;
}
.chart-container {
background: #1e293b;
border-radius: 8px;
padding: 20px;
overflow-x: auto;
}
.alert {
background: rgba(239, 68, 68, 0.1);
border-left: 4px solid #ef4444;
padding: 15px 20px;
margin: 20px 0;
border-radius: 6px;
}
.alert strong { color: #fca5a5; }
.info {
background: rgba(56, 189, 248, 0.1);
border-left: 4px solid #38bdf8;
padding: 15px 20px;
margin: 20px 0;
border-radius: 6px;
}
pre {
background: #1e293b;
padding: 20px;
border-radius: 8px;
overflow-x: auto;
font-size: 0.9rem;
line-height: 1.5;
}
table {
width: 100%;
border-collapse: collapse;
margin: 20px 0;
}
th, td {
padding: 12px;
text-align: left;
border-bottom: 1px solid rgba(255,255,255,0.1);
}
th {
background: rgba(56, 189, 248, 0.1);
color: #38bdf8;
font-weight: 600;
}
.milestone {
display: inline-block;
background: #10b981;
color: #fff;
padding: 4px 12px;
border-radius: 20px;
font-size: 0.85rem;
font-weight: 600;
}
.critical {
display: inline-block;
background: #ef4444;
color: #fff;
padding: 4px 12px;
border-radius: 20px;
font-size: 0.85rem;
font-weight: 600;
}
.nav {
position: fixed;
top: 20px;
right: 20px;
background: rgba(0,0,0,0.8);
backdrop-filter: blur(10px);
padding: 15px;
border-radius: 12px;
border: 1px solid rgba(255,255,255,0.1);
}
.nav a {
display: block;
color: #94a3b8;
text-decoration: none;
padding: 8px 12px;
border-radius: 6px;
transition: all 0.3s;
font-size: 0.9rem;
}
.nav a:hover {
background: rgba(56, 189, 248, 0.2);
color: #38bdf8;
}
</style>
</head>
<body>
<div class="container">
<h1>📊 sgClaw 项目协作时间表</h1>
<p class="subtitle">2周开发计划 · 5人团队 · 关键路径P1a + P2 联调Day 3-5</p>
<div class="nav">
<strong style="color:#38bdf8;margin-bottom:10px;display:block;">快速导航</strong>
<a href="#gantt">甘特图</a>
<a href="#dependency">依赖关系</a>
<a href="#critical">关键路径</a>
<a href="#load">人员负载</a>
<a href="#risk">风险热力图</a>
<a href="#milestone">里程碑</a>
</div>
<!-- 甘特图 -->
<div class="section" id="gantt">
<h2>📊 完整甘特图</h2>
<div class="info">
<strong>💡 图例说明:</strong> 红色任务 = 关键路径(阻塞后续工作) | 菱形 = 里程碑 | active = E2E测试周
</div>
<div class="chart-container">
<div class="mermaid">
gantt
title sgClaw 2周开发计划关键路径P1a+P2
dateFormat YYYY-MM-DD
axisFormat Day %d
section 关键路径⭐
P1a环境搭建 :p1a1, 2026-03-04, 2d
P1a Pipe协议开发 :crit, p1a2, after p1a1, 1d
P1a+P2联调Pipe通信 :crit, p1a3, after p1a2, 2d
P1a完善15个Action :crit, p1a4, after p1a3, 1d
W1里程碑演示 :milestone, m1, after p1a4, 0d
P1a+P1b集成Runtime :p1a5, after p1a4, 1d
P1a MAC安全策略 :p1a6, after p1a5, 1d
P1a bug修复 :p1a7, after p1a6, 2d
P1a代码审查交付 :milestone, m2, after p1a7, 1d
section P2浏览器对接
P2环境搭建 :p2a, 2026-03-04, 2d
P2 ProcessHost框架 :p2b, after p2a, 1d
P2+P1a联调Pipe :crit, p2c, after p2b, 2d
P2 CommandRouter对接 :p2d, after p2c, 1d
P2 MAC白名单 :p2e, after p2d, 1d
P2+P4 UI对接 :p2f, after p2e, 1d
P2 bug修复 :p2g, after p2f, 2d
P2交付 :milestone, after p2g, 1d
section P1b业务支持
P1b环境搭建 :p1b1, 2026-03-04, 2d
P1b SkillLoader开发 :p1b2, after p1b1, 3d
P1b Memory开发 :p1b3, after p1b2, 2d
P1b+P1a集成Runtime :p1b4, after p1b3, 1d
P1b+P3 Skill测试 :p1b5, after p1b4, 1d
P1b Critic评估器 :p1b6, after p1b5, 1d
P1b bug修复 :p1b7, after p1b6, 1d
P1b交付 :milestone, after p1b7, 1d
section P3业务技能
P3场景调研 :p3a, 2026-03-04, 1d
P3黄金样本制作 :p3b, after p3a, 3d
P3提示词工程 :p3c, after p3b, 1d
P3 AI批量翻译 :p3d, after p3c, 3d
P3质量抽检 :p3e, after p3d, 2d
P3交付Skill仓库 :milestone, after p3e, 0d
section P4前端发布
P4环境搭建 :p4a, 2026-03-04, 2d
P4 UI原型设计 :p4b, after p4a, 1d
P4 Side Panel开发 :p4c, after p4b, 2d
P4 Skill后台开发 :p4d, after p4c, 1d
P4+P2 IPC对接 :p4e, after p4d, 1d
P4测试框架搭建 :p4f, after p4e, 1d
P4 E2E测试 :p4g, after p4f, 2d
P4打包发布 :milestone, p4h, after p4g, 1d
section 全员里程碑
环境搭建完成 :milestone, after p1a1 p2a p1b1 p3a p4a, 0d
W1里程碑(链路打通) :milestone, m1_all, 2026-03-08, 0d
E2E测试周 :active, e2e, 2026-03-11, 2d
W2里程碑(正式发布) :milestone, m2_all, 2026-03-14, 0d
</div>
</div>
</div>
<!-- 依赖关系图 -->
<div class="section" id="dependency">
<h2>🔗 依赖关系图</h2>
<div class="chart-container">
<div class="mermaid">
graph TD
A[Day 1-2: 环境搭建] --> B[Day 3: P1a Pipe 协议]
B --> C[Day 4-5: P1a+P2 联调 Pipe ⭐]
C --> D[Day 5 晚: W1 里程碑]
D --> E1[Day 6: P1a+P1b 集成]
D --> E2[Day 6: P1b+P3 Skill]
D --> E3[Day 6: P2+P4 UI]
E1 --> F[Day 7: 安全+AI]
E2 --> F
E3 --> F
F --> G[Day 8-9: E2E 测试]
G --> H[Day 10: P4 打包发布]
style C fill:#ff6b6b,stroke:#c92a2a,color:#fff
style D fill:#51cf66,stroke:#2f9e44,color:#fff
style H fill:#51cf66,stroke:#2f9e44,color:#fff
</div>
</div>
</div>
<!-- 关键路径 -->
<div class="section" id="critical">
<h2>⚡ 关键路径可视化</h2>
<div class="alert">
<strong>⚠️ 极高风险</strong>Day 4-5 的 P1a + P2 联调是整个项目的关键瓶颈。如果这两天 Pipe 通信不通,所有后续工作都会被阻塞!
</div>
<pre>
Day 1-2 ━━━━━━━━━━━━━━━━━━━━━━ 环境搭建(并行)
Day 3 ━━━━━┻━━━━━━━━━━━━━━━━━ P1a Pipe 协议开发 ⭐
Day 4-5 ━━━┻━━━━━━━━━━━━━━━━━ <span style="color:#ef4444">P1a + P2 联调 Pipe ⭐⭐⭐</span>
┃ (关键路径,阻塞所有人)
<span style="color:#10b981">【W1 里程碑】链路打通</span>
Day 6 ━━━━━┻━━━━━━━━━━━━━━━━━ 三组并行集成:
├─ P1a + P1b (Runtime)
├─ P1b + P3 (Skill)
└─ P2 + P4 (UI)
Day 7 ━━━━━┫ 安全策略 + AI 翻译
Day 8-9 ━━━┻━━━━━━━━━━━━━━━━━ 全员 E2E 测试
Day 10 ━━━━▼━━━━━━━━━━━━━━━━━ P4 打包发布
<span style="color:#10b981">【W2 里程碑】正式发布</span>
</pre>
</div>
<!-- 人员负载 -->
<div class="section" id="load">
<h2>👥 人员负载分析</h2>
<table>
<thead>
<tr>
<th>日期</th>
<th>P1a</th>
<th>P1b</th>
<th>P2</th>
<th>P3</th>
<th>P4</th>
<th>总负载</th>
</tr>
</thead>
<tbody>
<tr>
<td>Day 1-2</td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>5 人</td>
</tr>
<tr>
<td>Day 3</td>
<td><span class="critical">🔴 高</span></td>
<td>🟡 低</td>
<td>🟡 低</td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>2 人高负载</td>
</tr>
<tr style="background: rgba(239, 68, 68, 0.1);">
<td><strong>Day 4-5</strong></td>
<td><span class="critical">🔴 极高</span></td>
<td>🟢 中</td>
<td><span class="critical">🔴 极高</span></td>
<td>🟢 中</td>
<td>🟢 中</td>
<td><strong>2 人关键路径</strong></td>
</tr>
<tr>
<td>Day 6</td>
<td><span class="critical">🔴 高</span></td>
<td><span class="critical">🔴 高</span></td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>2 人高负载</td>
</tr>
<tr>
<td>Day 7</td>
<td>🟢 中</td>
<td><span class="critical">🔴 高</span></td>
<td>🟢 中</td>
<td><span class="critical">🔴 高</span></td>
<td>🟢 中</td>
<td>2 人高负载</td>
</tr>
<tr>
<td>Day 8-9</td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>🟢 中</td>
<td>5 人 E2E</td>
</tr>
<tr>
<td>Day 10</td>
<td>🟡 低</td>
<td>🟡 低</td>
<td>🟡 低</td>
<td>🟡 低</td>
<td><span class="critical">🔴 高</span></td>
<td>1 人高负载</td>
</tr>
</tbody>
</table>
<p style="color:#94a3b8;margin-top:10px;">
<strong>图例:</strong> 🔴 极高/高负载 &nbsp; 🟢 正常负载 &nbsp; 🟡 低负载
</p>
</div>
<!-- 风险热力图 -->
<div class="section" id="risk">
<h2>⚠️ 风险热力图</h2>
<pre>
风险等级
时间 │ 低 │ 中 │ 高 │ 极高
─────────┼────┼────┼────┼─────
Day 1-2 │ ✓ │ │ │
Day 3 │ │ ✓ │ │
<span style="color:#ef4444">Day 4-5 │ │ │ │ ⭐⭐⭐ ← Pipe 通信不通</span>
Day 6 │ │ │ ✓ │
Day 7 │ │ ✓ │ │
Day 8-9 │ │ ✓ │ │
Day 10 │ │ ✓ │ │
</pre>
<div class="alert">
<strong>预案Day 4-5 极高风险):</strong><br>
1. Day 4 晚上还没通 → P1b 全力支援<br>
2. Day 5 中午还没通 → 启动降级方案HTTP 替代 Pipe
</div>
</div>
<!-- 里程碑 -->
<div class="section" id="milestone">
<h2>✅ 里程碑验收清单</h2>
<h3 style="color:#10b981;margin-top:20px;">W1 里程碑Day 5 晚上)</h3>
<div class="info">
<strong>演示场景:</strong>
<ol style="margin-left:20px;margin-top:10px;">
<li>P4 打开 Side Panel UI</li>
<li>输入:"点击页面上的登录按钮"</li>
<li>Vue → C++ → Rust → 大模型mock→ Rust → C++ → 浏览器</li>
<li>浏览器真实点击按钮</li>
</ol>
</div>
<p style="margin-top:15px;"><strong>验收标准:</strong></p>
<ul style="margin-left:20px;color:#94a3b8;">
<li>Pipe 双向通信稳定(无消息丢失)</li>
<li>15 个 BrowserAction 全部测试通过</li>
<li>MAC 白名单生效(非白名单域名被拦截)</li>
<li>延迟 < 100ms从命令到执行完成</li>
</ul>
<h3 style="color:#10b981;margin-top:30px;">W2 里程碑Day 10</h3>
<p><strong>交付物:</strong></p>
<ul style="margin-left:20px;color:#94a3b8;">
<li>.deb 安装包(银河麒麟 V10</li>
<li>.exe 安装包Windows 10/11</li>
<li>6 个业务场景演示视频</li>
<li>完整文档API + Skill 开发指南 + 部署手册)</li>
</ul>
<p style="margin-top:15px;"><strong>验收标准:</strong></p>
<ul style="margin-left:20px;color:#94a3b8;">
<li>两平台安装成功</li>
<li>E2E 测试全部通过</li>
<li>单元测试覆盖率 > 70%</li>
<li>内存占用 < 10MBsgClaw 进程</li>
<li>无已知 P0/P1 级 bug</li>
</ul>
</div>
<div style="text-align:center;margin-top:40px;padding:20px;color:#64748b;">
<p>📄 文档版本v1.0 &nbsp;|&nbsp; 最后更新2026-03-04 &nbsp;|&nbsp; 维护者:项目经理</p>
</div>
</div>
<script>
mermaid.initialize({
startOnLoad: true,
theme: 'dark',
themeVariables: {
primaryColor: '#1e293b',
primaryTextColor: '#f1f5f9',
primaryBorderColor: '#38bdf8',
lineColor: '#94a3b8',
secondaryColor: '#334155',
tertiaryColor: '#0f172a'
}
});
</script>
</body>
</html>

View File

@@ -0,0 +1,897 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sgClaw 团队协作架构图</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
background: #0f172a;
color: #f1f5f9;
padding: 40px 20px;
line-height: 1.6;
}
.container { max-width: 1600px; margin: 0 auto; }
h1 {
font-size: 2.5rem;
margin-bottom: 10px;
background: linear-gradient(135deg, #38bdf8, #818cf8);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-align: center;
}
.subtitle {
color: #94a3b8;
font-size: 1.1rem;
margin-bottom: 50px;
text-align: center;
}
.diagram-section {
background: rgba(255,255,255,0.05);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 12px;
padding: 40px;
margin-bottom: 40px;
}
.diagram-section h2 {
font-size: 1.8rem;
margin-bottom: 30px;
color: #38bdf8;
border-bottom: 2px solid rgba(56,189,248,0.3);
padding-bottom: 15px;
}
.diagram-section h3 {
font-size: 1.3rem;
margin: 25px 0 15px;
color: #60a5fa;
}
/* 总架构图样式 */
.overview-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 20px;
margin: 30px 0;
}
.person-card {
background: rgba(30,41,59,0.8);
border: 2px solid;
border-radius: 12px;
padding: 20px;
position: relative;
}
.person-card.p1a { border-color: #ef4444; }
.person-card.p1b { border-color: #f97316; }
.person-card.p2 { border-color: #38bdf8; }
.person-card.p3 { border-color: #10b981; }
.person-card.p4 { border-color: #818cf8; }
.person-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid rgba(255,255,255,0.1);
}
.person-icon {
font-size: 2rem;
}
.person-title {
font-size: 1.1rem;
font-weight: 700;
}
.person-subtitle {
font-size: 0.85rem;
color: #94a3b8;
}
.what-section, .why-section, .output-section {
margin: 15px 0;
}
.section-label {
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
color: #94a3b8;
margin-bottom: 8px;
letter-spacing: 0.5px;
}
.section-content {
font-size: 0.9rem;
color: #cbd5e1;
line-height: 1.6;
}
.tech-stack {
display: flex;
flex-wrap: wrap;
gap: 5px;
margin-top: 8px;
}
.tech-tag {
background: rgba(56,189,248,0.15);
color: #38bdf8;
padding: 3px 8px;
border-radius: 4px;
font-size: 0.7rem;
font-weight: 600;
}
/* 接口连接线 */
.interface-container {
position: relative;
margin: 50px 0;
padding: 30px;
background: rgba(15,23,42,0.5);
border-radius: 12px;
}
.interface-row {
display: flex;
align-items: center;
justify-content: center;
gap: 30px;
margin: 25px 0;
}
.interface-node {
background: rgba(30,41,59,0.9);
border: 2px solid;
border-radius: 10px;
padding: 15px 20px;
min-width: 180px;
text-align: center;
}
.interface-node.p1a { border-color: #ef4444; color: #ef4444; }
.interface-node.p1b { border-color: #f97316; color: #f97316; }
.interface-node.p2 { border-color: #38bdf8; color: #38bdf8; }
.interface-node.p3 { border-color: #10b981; color: #10b981; }
.interface-node.p4 { border-color: #818cf8; color: #818cf8; }
.interface-arrow {
display: flex;
flex-direction: column;
align-items: center;
gap: 5px;
}
.arrow-line {
width: 80px;
height: 3px;
background: #64748b;
position: relative;
}
.arrow-line::after {
content: '';
position: absolute;
right: -1px;
top: -4px;
border: 5px solid transparent;
border-left-color: #64748b;
}
.arrow-label {
font-size: 0.75rem;
color: #94a3b8;
background: #0f172a;
padding: 3px 8px;
border-radius: 4px;
white-space: nowrap;
}
/* 详细架构图 */
.detail-diagram {
background: rgba(15,23,42,0.8);
border-radius: 12px;
padding: 30px;
margin: 20px 0;
}
.layer-stack {
display: flex;
flex-direction: column;
gap: 15px;
}
.layer {
background: rgba(30,41,59,0.6);
border-left: 4px solid;
border-radius: 8px;
padding: 20px;
}
.layer.runtime { border-color: #ef4444; }
.layer.skill { border-color: #f97316; }
.layer.browser { border-color: #38bdf8; }
.layer.ai { border-color: #10b981; }
.layer.ui { border-color: #818cf8; }
.layer-title {
font-size: 1.1rem;
font-weight: 700;
margin-bottom: 10px;
}
.layer-modules {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 10px;
}
.module-box {
background: rgba(56,189,248,0.1);
border: 1px solid rgba(56,189,248,0.3);
padding: 8px 12px;
border-radius: 6px;
font-size: 0.85rem;
}
/* 数据流图 */
.flow-diagram {
background: rgba(15,23,42,0.8);
border-radius: 12px;
padding: 30px;
margin: 20px 0;
}
.flow-step {
display: flex;
align-items: center;
margin: 15px 0;
}
.flow-num {
background: #38bdf8;
color: #0f172a;
width: 35px;
height: 35px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
flex-shrink: 0;
margin-right: 20px;
}
.flow-content {
flex: 1;
}
.flow-actor {
font-size: 0.8rem;
color: #94a3b8;
font-weight: 600;
}
.flow-action {
font-size: 1rem;
color: #f1f5f9;
margin-top: 3px;
}
.critical-badge {
background: #ef4444;
color: white;
padding: 4px 10px;
border-radius: 12px;
font-size: 0.75rem;
font-weight: 700;
display: inline-block;
margin-left: 10px;
}
.nav-buttons {
position: fixed;
bottom: 30px;
right: 30px;
display: flex;
gap: 10px;
z-index: 100;
}
.nav-button {
background: rgba(56,189,248,0.2);
border: 1px solid rgba(56,189,248,0.5);
color: #38bdf8;
padding: 10px 20px;
border-radius: 8px;
cursor: pointer;
font-size: 0.9rem;
font-weight: 600;
transition: all 0.3s;
}
.nav-button:hover {
background: rgba(56,189,248,0.3);
border-color: #38bdf8;
}
@media print {
body { background: white; color: black; }
.diagram-section { page-break-inside: avoid; border: 1px solid #ccc; }
.nav-buttons { display: none; }
}
</style>
</head>
<body>
<div class="container">
<h1>📊 sgClaw 团队协作架构图</h1>
<p class="subtitle">5 人团队 · 2 周开发计划 · 职责分工与接口对接全景</p>
<!-- 第一图:总架构图 -->
<div class="diagram-section">
<h2>一、团队协作总架构5 人分工全景)</h2>
<div class="overview-grid">
<!-- P1a 卡片 -->
<div class="person-card p1a">
<div class="person-header">
<div class="person-icon"></div>
<div>
<div class="person-title">P1a · 核心通信</div>
<div class="person-subtitle">赵义仑 <span class="critical-badge">关键路径</span></div>
</div>
</div>
<div class="what-section">
<div class="section-label">干什么?</div>
<div class="section-content">
打通 AI 引擎和浏览器之间的"通信管道",让 AI 能控制浏览器操作
</div>
<div class="tech-stack">
<span class="tech-tag">Rust</span>
<span class="tech-tag">STDIO Pipe</span>
<span class="tech-tag">~900 行</span>
</div>
</div>
<div class="why-section">
<div class="section-label">为什么?</div>
<div class="section-content">
这是整个系统的"心脏",如果 AI 和浏览器通信不通,后续所有功能都无法实现
</div>
</div>
<div class="output-section">
<div class="section-label">产出物</div>
<div class="section-content">
• Pipe 双向通信协议<br>
• 15 个浏览器操作 API<br>
• MAC 安全策略模块
</div>
</div>
</div>
<!-- P1b 卡片 -->
<div class="person-card p1b">
<div class="person-header">
<div class="person-icon">🧠</div>
<div>
<div class="person-title">P1b · 业务支持</div>
<div class="person-subtitle">Rust 工程师</div>
</div>
</div>
<div class="what-section">
<div class="section-label">干什么?</div>
<div class="section-content">
让 AI 能"记住"操作经验,能加载业务技能包,让 AI 越用越聪明
</div>
<div class="tech-stack">
<span class="tech-tag">Rust</span>
<span class="tech-tag">SQLite</span>
<span class="tech-tag">~600 行</span>
</div>
</div>
<div class="why-section">
<div class="section-label">为什么?</div>
<div class="section-content">
AI 不能每次都重新学习,需要记忆系统沉淀经验,需要技能加载器复用业务逻辑
</div>
</div>
<div class="output-section">
<div class="section-label">产出物</div>
<div class="section-content">
• Skill 加载器与沙箱<br>
• 三层记忆系统<br>
• AI 推理引擎集成
</div>
</div>
</div>
<!-- P2 卡片 -->
<div class="person-card p2">
<div class="person-header">
<div class="person-icon">🌐</div>
<div>
<div class="person-title">P2 · 浏览器对接</div>
<div class="person-subtitle">C++ 工程师</div>
</div>
</div>
<div class="what-section">
<div class="section-label">干什么?</div>
<div class="section-content">
在浏览器内核中嵌入 sgClaw 进程,接收 P1a 的指令,调用现有 70+ 浏览器能力
</div>
<div class="tech-stack">
<span class="tech-tag">C++</span>
<span class="tech-tag">Chromium</span>
<span class="tech-tag">~600 行</span>
</div>
</div>
<div class="why-section">
<div class="section-label">为什么?</div>
<div class="section-content">
浏览器是 C++ 写的,需要 C++ 工程师在内核中启动子进程、转发指令、管理安全白名单
</div>
</div>
<div class="output-section">
<div class="section-label">产出物</div>
<div class="section-content">
• SgClawProcessHost<br>
• Pipe 监听器<br>
• MAC 白名单检查器
</div>
</div>
</div>
<!-- P3 卡片 -->
<div class="person-card p3">
<div class="person-header">
<div class="person-icon">🤖</div>
<div>
<div class="person-title">P3 · AI 辅助迁移</div>
<div class="person-subtitle">业务 + AI 工程</div>
</div>
</div>
<div class="what-section">
<div class="section-label">干什么?</div>
<div class="section-content">
用 AI 把现有 400+ 个业务场景自动翻译成 Skill 技能包,人工制作黄金样本
</div>
<div class="tech-stack">
<span class="tech-tag">JavaScript</span>
<span class="tech-tag">Qwen/DeepSeek</span>
<span class="tech-tag">400+ Skill</span>
</div>
</div>
<div class="why-section">
<div class="section-label">为什么?</div>
<div class="section-content">
400+ 场景人工翻译不现实,但全靠 AI 质量没保证。需要人 + AI 配合人做样本AI 批量翻译
</div>
</div>
<div class="output-section">
<div class="section-label">产出物</div>
<div class="section-content">
• 10-15 个黄金样本<br>
• 翻译提示词工程<br>
• 400+ AI 生成 Skill
</div>
</div>
</div>
<!-- P4 卡片 -->
<div class="person-card p4">
<div class="person-header">
<div class="person-icon">🖥️</div>
<div>
<div class="person-title">P4 · 前端发布</div>
<div class="person-subtitle">前端 + DevOps</div>
</div>
</div>
<div class="what-section">
<div class="section-label">干什么?</div>
<div class="section-content">
做 AI 助手面板让用户输入指令,做 Skill 管理后台,搭建测试并打包发布
</div>
<div class="tech-stack">
<span class="tech-tag">Vue</span>
<span class="tech-tag">Jest</span>
<span class="tech-tag">~150 行</span>
</div>
</div>
<div class="why-section">
<div class="section-label">为什么?</div>
<div class="section-content">
AI 能力再强,用户看不到也用不了。需要界面让用户交互,需要 DevOps 发布安装包
</div>
</div>
<div class="output-section">
<div class="section-label">产出物</div>
<div class="section-content">
• Side Panel UI<br>
• Skill 管理后台<br>
• .deb + .exe 安装包
</div>
</div>
</div>
</div>
<div style="margin-top:30px;padding:20px;background:rgba(56,189,248,0.1);border-left:4px solid #38bdf8;border-radius:8px;">
<strong style="color:#38bdf8;">💡 总结</strong><span style="color:#cbd5e1;">
P1a 是<strong style="color:#ef4444;">关键路径</strong>(通信不通,全项目停摆)→ P2 配合 P1a 打通链路 →
P1b 让 AI 有记忆和技能 → P3 用 AI 批量生成内容 → P4 做界面和发布。
5 人各司其职Day 4-5 全员等 P1a+P2 联调成功。
</span>
</div>
</div>
<!-- 第二图:接口对接关系图 -->
<div class="diagram-section">
<h2>二、人员接口对接关系图</h2>
<h3>1. 关键路径对接P1a ↔ P2Day 4-5<span class="critical-badge">极高优先级</span></h3>
<div class="interface-container">
<div class="interface-row">
<div class="interface-node p1a">
<div style="font-weight:700;margin-bottom:5px;">P1a · Rust 端</div>
<div style="font-size:0.8rem;color:#cbd5e1;">发送 JSON 指令</div>
</div>
<div class="interface-arrow">
<div class="arrow-line"></div>
<div class="arrow-label">STDIO Pipe</div>
</div>
<div class="interface-node p2">
<div style="font-weight:700;margin-bottom:5px;">P2 · C++ 端</div>
<div style="font-size:0.8rem;color:#cbd5e1;">接收指令调用浏览器</div>
</div>
</div>
<div style="margin-top:20px;padding:15px;background:rgba(239,68,68,0.1);border:1px solid rgba(239,68,68,0.3);border-radius:8px;">
<div style="font-weight:700;color:#ef4444;margin-bottom:8px;">为什么这是关键路径?</div>
<div style="color:#cbd5e1;font-size:0.9rem;">
这两人如果没对接成功,整个系统就是"两张皮"——AI 引擎和浏览器无法通信,其他人的工作全部白做。
Day 4-5 必须打通否则启动降级方案HTTP 替代)。
</div>
</div>
<div style="margin-top:15px;padding:15px;background:rgba(30,41,59,0.6);border-radius:8px;">
<div style="font-weight:700;color:#38bdf8;margin-bottom:8px;">接口协议示例:</div>
<pre style="background:rgba(15,23,42,0.8);padding:12px;border-radius:6px;overflow-x:auto;font-size:0.85rem;"><code>{
"sequence_id": 1,
"action": "click",
"params": {
"selector": "#submit-button",
"button": "left"
}
}</code></pre>
</div>
</div>
<h3>2. Runtime 集成对接P1a ↔ P1bDay 6</h3>
<div class="interface-container">
<div class="interface-row">
<div class="interface-node p1a">
<div style="font-weight:700;margin-bottom:5px;">P1a</div>
<div style="font-size:0.8rem;color:#cbd5e1;">提供 BrowserPipeTool</div>
</div>
<div class="interface-arrow">
<div class="arrow-line"></div>
<div class="arrow-label">Rust trait</div>
</div>
<div class="interface-node p1b">
<div style="font-weight:700;margin-bottom:5px;">P1b</div>
<div style="font-size:0.8rem;color:#cbd5e1;">注册到 AgentRuntime</div>
</div>
</div>
<div style="margin-top:15px;color:#cbd5e1;font-size:0.9rem;">
<strong>为什么?</strong>P1b 的 AI 引擎需要能调用 P1a 的浏览器操作工具,通过 Rust trait 实现插件式对接。
</div>
</div>
<h3>3. Skill 加载对接P1b ↔ P3Day 6-7</h3>
<div class="interface-container">
<div class="interface-row">
<div class="interface-node p3">
<div style="font-weight:700;margin-bottom:5px;">P3</div>
<div style="font-size:0.8rem;color:#cbd5e1;">提供 Skill.js 文件</div>
</div>
<div class="interface-arrow">
<div class="arrow-line"></div>
<div class="arrow-label">Ed25519 签名</div>
</div>
<div class="interface-node p1b">
<div style="font-weight:700;margin-bottom:5px;">P1b</div>
<div style="font-size:0.8rem;color:#cbd5e1;">扫描、验签、沙箱执行</div>
</div>
</div>
<div style="margin-top:15px;color:#cbd5e1;font-size:0.9rem;">
<strong>为什么?</strong>P3 写的业务技能需要被 P1b 的加载器识别并执行,签名保证安全性。
</div>
</div>
<h3>4. UI 交互对接P2 ↔ P4Day 6</h3>
<div class="interface-container">
<div class="interface-row">
<div class="interface-node p4">
<div style="font-weight:700;margin-bottom:5px;">P4 · Vue 前端</div>
<div style="font-size:0.8rem;color:#cbd5e1;">调用 IPC 接口</div>
</div>
<div class="interface-arrow">
<div class="arrow-line"></div>
<div class="arrow-label">window.superrpa.sgclaw.*</div>
</div>
<div class="interface-node p2">
<div style="font-weight:700;margin-bottom:5px;">P2 · C++ 后端</div>
<div style="font-size:0.8rem;color:#cbd5e1;">暴露浏览器 API</div>
</div>
</div>
<div style="margin-top:15px;color:#cbd5e1;font-size:0.9rem;">
<strong>为什么?</strong>用户界面Vue需要调用 C++ 暴露的接口来启动/停止 sgClaw、查看 Skill 列表等。
</div>
</div>
</div>
<!-- 第三图:数据流全链路 -->
<div class="diagram-section">
<h2>三、数据流全链路(端到端完整流程)</h2>
<div class="flow-diagram">
<div style="text-align:center;margin-bottom:25px;color:#94a3b8;">
从用户输入到浏览器执行,数据经过 5 个角色的系统
</div>
<div class="flow-step">
<div class="flow-num">1</div>
<div class="flow-content">
<div class="flow-actor">P4 · Vue 前端</div>
<div class="flow-action">用户在 Side Panel 输入:"导出 ERP 月度报表"</div>
</div>
</div>
<div class="flow-step">
<div class="flow-num">2</div>
<div class="flow-content">
<div class="flow-actor">P2 · C++ 浏览器层</div>
<div class="flow-action">Vue 通过 IPC 调用 C++ 的 <code>sendCommand(text)</code>C++ 启动 sgClaw 子进程</div>
</div>
</div>
<div class="flow-step">
<div class="flow-num">3</div>
<div class="flow-content">
<div class="flow-actor">P1b · AI Runtime</div>
<div class="flow-action">接收用户指令查询记忆系统L2 SQLite上次怎么导出的检索到 P3 提供的 Skill</div>
</div>
</div>
<div class="flow-step">
<div class="flow-num">4</div>
<div class="flow-content">
<div class="flow-actor">P3 · Skill被加载</div>
<div class="flow-action">Skill 内容:"访问 ERP → 点击报表 → 选择月份 → 导出 Excel",转换成浏览器操作序列</div>
</div>
</div>
<div class="flow-step">
<div class="flow-num">5</div>
<div class="flow-content">
<div class="flow-actor">P1a · Pipe 通信</div>
<div class="flow-action">把操作序列包装成 JSON通过 STDIO Pipe 发送给 P2<code>{"action":"click", "selector":"#export"}</code></div>
</div>
</div>
<div class="flow-step">
<div class="flow-num">6</div>
<div class="flow-content">
<div class="flow-actor">P2 · CommandRouter</div>
<div class="flow-action">C++ 接收 JSON调用现有 CommandRouterCommandRouter 通过 CDP 协议操作浏览器</div>
</div>
</div>
<div class="flow-step">
<div class="flow-num">7</div>
<div class="flow-content">
<div class="flow-actor">浏览器</div>
<div class="flow-action">真实执行:打开 ERP 页面 → 点击按钮 → 下载文件 → 完成✅</div>
</div>
</div>
<div class="flow-step">
<div class="flow-num">8</div>
<div class="flow-content">
<div class="flow-actor">P1b · 记忆系统</div>
<div class="flow-action">把这次成功的操作记录到 L2 长期记忆,下次直接复用,从 8 步降到 1 步</div>
</div>
</div>
</div>
<div style="margin-top:25px;padding:20px;background:rgba(16,185,129,0.1);border-left:4px solid #10b981;border-radius:8px;">
<strong style="color:#10b981;">🚀 自进化</strong><span style="color:#cbd5e1;">
第一次需要 AI 推理 8 步,第二次查到 Skill 缩短到 4 步,多次执行后记忆沉淀,一句话直接执行。
这就是为什么需要 P1b 的记忆系统 + P3 的 Skill 仓库。
</span>
</div>
</div>
<!-- 第四图:关键路径时间轴 -->
<div class="diagram-section">
<h2>四、关键路径时间轴Day 4-5 为什么是瓶颈?)</h2>
<div class="detail-diagram">
<div style="text-align:center;margin-bottom:20px;">
<span style="font-size:1.2rem;color:#ef4444;font-weight:700;">⭐ Day 4-5P1a + P2 联调 Pipe 通信</span>
</div>
<div style="background:rgba(239,68,68,0.1);border:2px solid #ef4444;border-radius:8px;padding:20px;margin-bottom:20px;">
<div style="font-weight:700;color:#ef4444;font-size:1.1rem;margin-bottom:10px;">为什么是极高风险?</div>
<div style="color:#cbd5e1;line-height:1.8;">
1. <strong>阻塞所有人</strong>:如果 P1a 和 P2 的 Pipe 通信打不通AI 引擎就是空转,浏览器接收不到指令。
P1b 做的记忆系统、P3 准备的 Skill、P4 做的界面,全部无法联动测试。<br>
2. <strong>技术难度高</strong>STDIO Pipe 是进程私有通道,需要 C++ 正确传递文件描述符给 Rust 子进程,
一旦出错如管道被关闭、缓冲区满、JSON 格式错误),排查困难。<br>
3. <strong>跨语言调试</strong>C++ ↔ Rust两种语言的调试工具不互通需要两人高度配合才能定位问题。
</div>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:20px;">
<div style="background:rgba(30,41,59,0.6);border-radius:8px;padding:20px;">
<div style="font-weight:700;color:#38bdf8;margin-bottom:10px;">如果成功Day 5 晚)✅</div>
<div style="color:#cbd5e1;line-height:1.7;font-size:0.9rem;">
• W1 里程碑达成,演示全链路<br>
• P1b 可以对接 P1a 的工具<br>
• P3 可以测试 Skill 执行<br>
• P4 可以联调 UI 交互<br>
• 全员进入并行开发模式
</div>
</div>
<div style="background:rgba(30,41,59,0.6);border-radius:8px;padding:20px;">
<div style="font-weight:700;color:#ef4444;margin-bottom:10px;">如果失败Day 5 中午)❌</div>
<div style="color:#cbd5e1;line-height:1.7;font-size:0.9rem;">
<strong>预案 1</strong>P1b 全力支援排查<br>
<strong>预案 2</strong>启动降级方案HTTP 替代 Pipe<br>
<strong>后果</strong>:项目延期 2-3 天或者牺牲安全性HTTP 有端口暴露风险)
</div>
</div>
</div>
</div>
</div>
<!-- 第五图:技术栈分层 -->
<div class="diagram-section">
<h2>五、技术栈分层(每层对应的人员)</h2>
<div class="layer-stack">
<div class="layer ui">
<div class="layer-title" style="color:#818cf8;">
📱 用户交互层 → P4 负责
</div>
<div style="color:#cbd5e1;margin-bottom:10px;">
用户看到的界面,输入指令、查看进度、管理 Skill
</div>
<div class="layer-modules">
<div class="module-box">Side Panel (Vue)</div>
<div class="module-box">Skill Manager (Vue)</div>
<div class="module-box">IPC 调用层</div>
</div>
</div>
<div class="layer browser">
<div class="layer-title" style="color:#38bdf8;">
🌐 浏览器内核层 → P2 负责
</div>
<div style="color:#cbd5e1;margin-bottom:10px;">
在 Chromium 中嵌入 sgClaw 进程,转发指令,调用 70+ 现有浏览器能力
</div>
<div class="layer-modules">
<div class="module-box">SgClawProcessHost (C++)</div>
<div class="module-box">PipeListener (C++)</div>
<div class="module-box">MacWhitelistCheck (C++)</div>
<div class="module-box">CommandRouter (已有)</div>
</div>
</div>
<div class="layer runtime">
<div class="layer-title" style="color:#ef4444;">
⚡ 通信与工具层 → P1a 负责 <span class="critical-badge">关键</span>
</div>
<div style="color:#cbd5e1;margin-bottom:10px;">
Pipe 协议、JSON 消息序列化、浏览器操作 API、MAC 安全策略
</div>
<div class="layer-modules">
<div class="module-box">PipeReader/Writer (Rust)</div>
<div class="module-box">BrowserPipeTool (Rust)</div>
<div class="module-box">MacPolicy (Rust)</div>
<div class="module-box">15 个 BrowserAction</div>
</div>
</div>
<div class="layer skill">
<div class="layer-title" style="color:#f97316;">
🧠 AI 引擎层 → P1b 负责
</div>
<div style="color:#cbd5e1;margin-bottom:10px;">
AI 推理、记忆系统、Skill 加载、自进化能力
</div>
<div class="layer-modules">
<div class="module-box">AgentRuntime (Rust)</div>
<div class="module-box">SkillLoader (Rust)</div>
<div class="module-box">Memory (Ring Buffer + SQLite)</div>
<div class="module-box">Critic 评估器</div>
</div>
</div>
<div class="layer ai">
<div class="layer-title" style="color:#10b981;">
📦 业务技能层 → P3 负责
</div>
<div style="color:#cbd5e1;margin-bottom:10px;">
400+ 业务场景的 Skill 定义,用 AI 批量生成 + 人工质检
</div>
<div class="layer-modules">
<div class="module-box">10-15 黄金样本 (手写)</div>
<div class="module-box">Prompt Engineering</div>
<div class="module-box">400+ AI 生成 Skill</div>
<div class="module-box">Ed25519 签名工具</div>
</div>
</div>
</div>
<div style="margin-top:25px;padding:20px;background:rgba(129,140,248,0.1);border-left:4px solid #818cf8;border-radius:8px;">
<strong style="color:#818cf8;">📐 设计原则</strong><span style="color:#cbd5e1;">
<strong>从下往上依赖</strong>,上层可以调用下层,下层不依赖上层。
P1a 是最底层Pipe 通信P2 调用 P1aP1b 调用 P1aP4 调用 P2。
这样保证模块独立,任何一层出问题不会波及其他层。
</span>
</div>
</div>
<!-- 第六图:为什么这样分工? -->
<div class="diagram-section">
<h2>六、为什么这样分工?(设计依据)</h2>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:20px;">
<div style="background:rgba(30,41,59,0.6);border-radius:8px;padding:20px;">
<div style="font-weight:700;color:#38bdf8;margin-bottom:15px;font-size:1.1rem;">❓ 为什么 P1 要拆成 P1a 和 P1b</div>
<div style="color:#cbd5e1;line-height:1.8;font-size:0.95rem;">
<strong>原因 1</strong>P1a 的 Pipe 通信是<strong style="color:#ef4444;">关键路径</strong>
如果一个人承担 ~1500 行代码Day 4-5 压力太大,容易延期。拆分后 P1a 专注通信900 行),
P1b 做业务支持600 行),风险分散。<br><br>
<strong>原因 2</strong>P1a 负责的模块Pipe/MAC和 P1b 负责的模块Skill/Memory
技术栈不同,耦合度低,可以<strong>并行开发</strong>。Day 6 之前互不依赖Day 6 再对接。
</div>
</div>
<div style="background:rgba(30,41,59,0.6);border-radius:8px;padding:20px;">
<div style="font-weight:700;color:#10b981;margin-bottom:15px;font-size:1.1rem;">❓ 为什么 P3 用 AI 辅助而不是全手写?</div>
<div style="color:#cbd5e1;line-height:1.8;font-size:0.95rem;">
<strong>现实约束</strong>agent-vue 有 400+ 个业务场景,全靠人手写 Skill 需要 <strong>2-3 个月</strong>
项目只有 2 周,不可能做到。<br><br>
<strong>方案</strong>:人工精选 10-15 个代表性场景,写成"黄金样本"(高质量、带详细注释)。
然后用内网大模型Qwen-72B/DeepSeek批量翻译剩余 390 个场景,准确率 85%-90%。
最后人工抽检 20 个,确保质量。<strong>人 + AI 配合</strong>2 周完成 400 个 Skill。
</div>
</div>
<div style="background:rgba(30,41,59,0.6);border-radius:8px;padding:20px;">
<div style="font-weight:700;color:#818cf8;margin-bottom:15px;font-size:1.1rem;">❓ 为什么 P4 工作量这么少(~150 行)?</div>
<div style="color:#cbd5e1;line-height:1.8;font-size:0.95rem;">
<strong>复用现有</strong>SuperRPA 浏览器已经有 Side Panel 框架和 IPC 通道,
P4 只需要写两个 Vue 组件AI 助手面板 + Skill 管理)。<br><br>
<strong>测试与发布</strong>P4 的主要工作在后期Day 8-10搭建测试框架、运行 E2E、
打包 .deb 和 .exe。前期Day 1-7工作量确实少可以支援其他人如帮 P3 做 Skill 质检)。
</div>
</div>
<div style="background:rgba(30,41,59,0.6);border-radius:8px;padding:20px;">
<div style="font-weight:700;color:#f97316;margin-bottom:15px;font-size:1.1rem;">❓ 如果 P1a + P2 联调失败怎么办?</div>
<div style="color:#cbd5e1;line-height:1.8;font-size:0.95rem;">
<strong>预案 1</strong>Day 4 晚P1b 暂停自己的工作,全力支援 P1a 排查 Pipe 问题。
三人配合比两人快。<br><br>
<strong>预案 2</strong>Day 5 中午):如果 Pipe 实在调不通,启动<strong>降级方案</strong>——
改用 HTTP 本地端口通信。牺牲一些安全性(端口可被检测),但能保证项目按时交付。
</div>
</div>
</div>
</div>
</div>
<div class="nav-buttons">
<button class="nav-button" onclick="window.print()">📄 打印 PDF</button>
<button class="nav-button" onclick="window.scrollTo({top:0,behavior:'smooth'})">⬆️ 回到顶部</button>
</div>
</body>
</html>

View File

@@ -0,0 +1,305 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>sgClaw 系统架构图</title>
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: #f8fafc;
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
padding: 40px 20px;
}
h1 {
text-align: center;
font-size: 2rem;
color: #1e293b;
margin-bottom: 8px;
}
.subtitle {
text-align: center;
color: #64748b;
margin-bottom: 30px;
font-size: 1rem;
}
.legend {
display: flex;
justify-content: center;
gap: 24px;
flex-wrap: wrap;
margin-bottom: 36px;
padding: 16px;
background: white;
border-radius: 10px;
border: 1px solid #e2e8f0;
max-width: 1000px;
margin-left: auto;
margin-right: auto;
}
.legend-item {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.88rem;
color: #334155;
font-weight: 500;
}
.legend-dot {
width: 18px;
height: 18px;
border-radius: 4px;
flex-shrink: 0;
}
.diagram-wrap {
background: white;
border-radius: 12px;
border: 1px solid #e2e8f0;
padding: 40px 20px;
margin-bottom: 30px;
max-width: 1600px;
margin-left: auto;
margin-right: auto;
overflow-x: auto;
}
.diagram-wrap h2 {
font-size: 1.25rem;
color: #1e293b;
margin-bottom: 24px;
text-align: center;
padding-bottom: 12px;
border-bottom: 2px solid #e2e8f0;
}
.mermaid {
display: flex;
justify-content: center;
}
.note {
max-width: 1600px;
margin: 0 auto 30px;
padding: 16px 24px;
background: #fff7ed;
border-left: 4px solid #f97316;
border-radius: 8px;
color: #7c3aed;
font-size: 0.9rem;
line-height: 1.7;
color: #334155;
}
.note strong { color: #ea580c; }
@media print { body { background: white; } }
</style>
</head>
<body>
<h1>sgClaw 系统架构图</h1>
<p class="subtitle">浏览器内嵌 AI Agent · 5 人团队 · 关键路径标注</p>
<div class="legend">
<div class="legend-item">
<div class="legend-dot" style="background:#fecaca;border:2px solid #ef4444;"></div>
<span><strong>P1a</strong> 核心通信(赵义仑)</span>
</div>
<div class="legend-item">
<div class="legend-dot" style="background:#fed7aa;border:2px solid #f97316;"></div>
<span><strong>P1b</strong> AI 引擎</span>
</div>
<div class="legend-item">
<div class="legend-dot" style="background:#bfdbfe;border:2px solid #3b82f6;"></div>
<span><strong>P2</strong> 浏览器对接</span>
</div>
<div class="legend-item">
<div class="legend-dot" style="background:#bbf7d0;border:2px solid #22c55e;"></div>
<span><strong>P3</strong> Skill 迁移</span>
</div>
<div class="legend-item">
<div class="legend-dot" style="background:#e9d5ff;border:2px solid #a855f7;"></div>
<span><strong>P4</strong> 前端发布</span>
</div>
<div class="legend-item">
<div class="legend-dot" style="background:#f1f5f9;border:2px dashed #94a3b8;"></div>
<span>已有系统(复用)</span>
</div>
</div>
<!-- 主架构图 -->
<div class="diagram-wrap">
<h2>系统架构总览</h2>
<div class="mermaid">
graph TB
User(["👤 业务人员"])
subgraph BROWSER["🌐 SuperRPA 浏览器Chromium"]
direction TB
subgraph UI["用户交互层 · P4 负责"]
SidePanel["AI 助手 Side Panel\nVue 组件"]
SkillMgr["Skill 管理后台\nVue 组件"]
end
subgraph KERNEL["浏览器内核层 · P2 负责(新增 ~600 行 C++"]
ProcessHost["SgClawProcessHost\n管理 sgClaw 子进程"]
PipeListener["PipeListener\n监听 STDIO Pipe"]
MACCheck["MAC 白名单检查\n校验指令合法性"]
end
subgraph EXISTING["已有系统(直接复用)"]
CommandRouter["CommandRouter\n70+ 浏览器命令"]
CDP["CDP 协议桥\nChrome DevTools"]
end
end
subgraph SGCLAW["⚙️ sgClaw独立 Rust 子进程)"]
direction TB
subgraph P1A["通信与工具层 · P1a 负责(~900 行 Rust⚡ 关键路径"]
PipeRW["Pipe Reader/Writer\nSTDIO 双向通信"]
BrowserTool["BrowserPipeTool\n15 个浏览器 Action"]
MacPolicy["MacPolicy\n安全策略执行"]
end
subgraph P1B["AI 引擎层 · P1b 负责(~600 行 Rust"]
Runtime["AgentRuntime\nZeroClaw ReAct 循环"]
Memory["三层记忆系统\nL0即时 / L1 RingBuffer / L2 SQLite"]
SkillLoader["SkillLoader\nEd25519 验签 + JS 沙箱"]
Critic["Critic 评估器\n自动纠错"]
end
end
subgraph EXT["外部服务"]
direction LR
subgraph LLM["🤖 AI 大模型(内网部署)"]
LLM1["Claude 3.5 / GPT-4\n通用推理"]
LLM2["Qwen-72B / DeepSeek\nSkill 批量翻译"]
end
subgraph SKILLS["📦 Skill 技能仓库 · P3 负责"]
GoldenSkill["黄金样本\n10-15 个手写"]
AISkill["AI 批量生成\n400+ 个业务场景"]
end
end
%% ── 主数据流 ──────────────────────────────
User -->|"输入自然语言指令"| SidePanel
SidePanel <-->|"window.superrpa.sgclaw.*\nIPC 调用"| ProcessHost
SkillMgr <-->|"IPC"| ProcessHost
ProcessHost --> PipeListener
ProcessHost -.->|"复用已有能力"| CommandRouter
CommandRouter -.-> CDP
PipeListener ==>|"⚡ STDIO Pipe\nJSON 消息流\n【关键路径 Day 4-5】"| PipeRW
PipeRW --> BrowserTool
PipeRW --> MacPolicy
BrowserTool --> Runtime
MacPolicy --> Runtime
Runtime <-->|"推理请求 / 流式响应"| LLM1
LLM2 -->|"批量 Skill 翻译"| AISkill
Runtime --> Memory
Runtime --> SkillLoader
Runtime --> Critic
SkillLoader -->|"扫描 + 验签"| GoldenSkill
SkillLoader -->|"扫描 + 验签"| AISkill
BrowserTool ==>|"BrowserAction 结果"| PipeListener
PipeListener --> CommandRouter
%% ── 样式 ──────────────────────────────────
classDef p1a fill:#fecaca,stroke:#ef4444,stroke-width:2px,color:#7f1d1d
classDef p1b fill:#fed7aa,stroke:#f97316,stroke-width:2px,color:#7c2d12
classDef p2 fill:#bfdbfe,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a
classDef p3 fill:#bbf7d0,stroke:#22c55e,stroke-width:2px,color:#14532d
classDef p4 fill:#e9d5ff,stroke:#a855f7,stroke-width:2px,color:#4a1d96
classDef ext fill:#f1f5f9,stroke:#94a3b8,stroke-width:2px,stroke-dasharray:6 3,color:#475569
classDef user fill:#fef9c3,stroke:#eab308,stroke-width:2px,color:#713f12
class PipeRW,BrowserTool,MacPolicy p1a
class Runtime,Memory,SkillLoader,Critic p1b
class ProcessHost,PipeListener,MACCheck p2
class GoldenSkill,AISkill,LLM2 p3
class SidePanel,SkillMgr p4
class CommandRouter,CDP,LLM1 ext
class User user
</div>
</div>
<!-- 人员协作图 -->
<div class="diagram-wrap">
<h2>人员对接关系 · 时间节点</h2>
<div class="mermaid">
graph LR
subgraph W1["第一周Day 1-5"]
direction TB
P1a_W1["P1a · 赵义仑\nPipe 协议 + BrowserTool\nDay 1-5"]
P2_W1["P2 · C++ 工程师\nProcessHost + PipeListener\nDay 1-5"]
P1b_W1["P1b · Rust 工程师\nRuntime + Memory 框架\nDay 1-4等待联调"]
P3_W1["P3 · 业务工程师\n场景调研 + 黄金样本\nDay 1-5"]
P4_W1["P4 · 前端工程师\nSide Panel 界面\nDay 1-4"]
end
subgraph CRIT["⚡ Day 4-5 关键联调"]
Pipe["P1a + P2\nPipe 通信打通\n极高风险 · 全员等待"]
end
subgraph W2["第二周Day 6-10"]
direction TB
INT1["P1a + P1b 对接\nBrowserTool → Runtime\nDay 6"]
INT2["P1b + P3 对接\nSkillLoader ← Skill 文件\nDay 6-7"]
INT3["P2 + P4 对接\nIPC 接口 → UI\nDay 6"]
TEST["全员 E2E 测试\n6 个业务场景验收\nDay 8-9"]
SHIP["P4 打包发布\n.deb + .exe\nDay 10"]
end
W1 --> CRIT --> W2
classDef p1a fill:#fecaca,stroke:#ef4444,stroke-width:2px,color:#7f1d1d
classDef p1b fill:#fed7aa,stroke:#f97316,stroke-width:2px,color:#7c2d12
classDef p2 fill:#bfdbfe,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a
classDef p3 fill:#bbf7d0,stroke:#22c55e,stroke-width:2px,color:#14532d
classDef p4 fill:#e9d5ff,stroke:#a855f7,stroke-width:2px,color:#4a1d96
classDef crit fill:#fef2f2,stroke:#ef4444,stroke-width:3px,color:#7f1d1d
class P1a_W1,INT1 p1a
class P1b_W1,INT2 p1b
class P2_W1,INT3 p2
class P3_W1 p3
class P4_W1,SHIP p4
class Pipe,TEST crit
</div>
</div>
<div class="note">
<strong>关键路径说明:</strong>
Day 4-5 的 P1a + P2 Pipe 联调是整个项目的瓶颈——Pipe 不通sgClaw 引擎和浏览器就是两张皮P1b 的 AI 推理、P3 的 Skill 库、P4 的界面都无法联动测试。
风险预案Day 4 晚未通则 P1b 支援Day 5 中午仍未通则启动 HTTP 降级方案。
</div>
<script>
mermaid.initialize({
startOnLoad: true,
theme: 'default',
themeVariables: {
fontSize: '15px',
fontFamily: '"PingFang SC", "Microsoft YaHei", sans-serif',
edgeLabelBackground: '#ffffff'
},
flowchart: {
useMaxWidth: false,
htmlLabels: true,
curve: 'basis',
padding: 20
}
});
</script>
</body>
</html>

View File

@@ -0,0 +1,561 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sgClaw 系统架构总图</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
background: #0f172a;
color: #f1f5f9;
padding: 40px 20px;
line-height: 1.6;
overflow-x: auto;
}
.container {
max-width: 1800px;
margin: 0 auto;
min-width: 1400px;
}
h1 {
font-size: 2.5rem;
margin-bottom: 10px;
background: linear-gradient(135deg, #38bdf8, #818cf8);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-align: center;
}
.subtitle {
color: #94a3b8;
font-size: 1.1rem;
margin-bottom: 40px;
text-align: center;
}
/* 图例 */
.legend {
display: flex;
justify-content: center;
gap: 30px;
margin-bottom: 40px;
padding: 20px;
background: rgba(255,255,255,0.05);
border-radius: 12px;
flex-wrap: wrap;
}
.legend-item {
display: flex;
align-items: center;
gap: 10px;
}
.legend-box {
width: 50px;
height: 30px;
border-radius: 6px;
border: 2px solid;
}
.legend-box.p1a { background: rgba(239,68,68,0.2); border-color: #ef4444; }
.legend-box.p1b { background: rgba(249,115,22,0.2); border-color: #f97316; }
.legend-box.p2 { background: rgba(56,189,248,0.2); border-color: #38bdf8; }
.legend-box.p3 { background: rgba(16,185,129,0.2); border-color: #10b981; }
.legend-box.p4 { background: rgba(129,140,248,0.2); border-color: #818cf8; }
.legend-box.existing { background: rgba(148,163,184,0.2); border-color: #94a3b8; }
.legend-label {
font-size: 0.9rem;
color: #cbd5e1;
}
/* 主架构图 */
.architecture-diagram {
background: rgba(15,23,42,0.8);
border: 2px solid rgba(56,189,248,0.3);
border-radius: 16px;
padding: 50px;
position: relative;
min-height: 900px;
}
/* 层级容器 */
.layer-container {
position: relative;
margin-bottom: 40px;
}
.layer-label {
font-size: 0.9rem;
color: #94a3b8;
font-weight: 700;
text-transform: uppercase;
margin-bottom: 15px;
letter-spacing: 1px;
}
/* 组件盒子 */
.component-box {
background: rgba(30,41,59,0.9);
border: 3px solid;
border-radius: 12px;
padding: 20px;
position: relative;
box-shadow: 0 4px 20px rgba(0,0,0,0.3);
}
.component-box.p1a { border-color: #ef4444; }
.component-box.p1b { border-color: #f97316; }
.component-box.p2 { border-color: #38bdf8; }
.component-box.p3 { border-color: #10b981; }
.component-box.p4 { border-color: #818cf8; }
.component-box.existing { border-color: #94a3b8; border-style: dashed; }
.component-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 15px;
padding-bottom: 10px;
border-bottom: 2px solid rgba(255,255,255,0.1);
}
.component-title {
font-size: 1.3rem;
font-weight: 700;
}
.component-title.p1a { color: #ef4444; }
.component-title.p1b { color: #f97316; }
.component-title.p2 { color: #38bdf8; }
.component-title.p3 { color: #10b981; }
.component-title.p4 { color: #818cf8; }
.component-title.existing { color: #94a3b8; }
.owner-badge {
background: rgba(255,255,255,0.1);
padding: 6px 14px;
border-radius: 20px;
font-size: 0.85rem;
font-weight: 600;
display: flex;
align-items: center;
gap: 6px;
}
.owner-badge.p1a { background: rgba(239,68,68,0.15); color: #fca5a5; }
.owner-badge.p1b { background: rgba(249,115,22,0.15); color: #fdba74; }
.owner-badge.p2 { background: rgba(56,189,248,0.15); color: #7dd3fc; }
.owner-badge.p3 { background: rgba(16,185,129,0.15); color: #6ee7b7; }
.owner-badge.p4 { background: rgba(129,140,248,0.15); color: #a5b4fc; }
.component-content {
font-size: 0.95rem;
color: #cbd5e1;
line-height: 1.7;
}
.module-list {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 12px;
}
.module-tag {
background: rgba(56,189,248,0.1);
border: 1px solid rgba(56,189,248,0.3);
padding: 6px 12px;
border-radius: 6px;
font-size: 0.85rem;
color: #7dd3fc;
}
/* 布局网格 */
.diagram-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 30px;
margin-bottom: 40px;
}
.full-width {
grid-column: 1 / -1;
}
.two-thirds {
grid-column: span 2;
}
/* 连接线 */
.connection {
position: absolute;
pointer-events: none;
}
.arrow-svg {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
pointer-events: none;
z-index: 1;
}
/* 关键路径标记 */
.critical-badge {
background: #ef4444;
color: white;
padding: 4px 10px;
border-radius: 12px;
font-size: 0.75rem;
font-weight: 700;
display: inline-block;
margin-left: 10px;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.7; }
}
/* 数据流箭头 */
.flow-arrow {
display: flex;
align-items: center;
justify-content: center;
margin: 20px 0;
gap: 15px;
}
.flow-line {
flex: 1;
height: 3px;
background: linear-gradient(90deg, #38bdf8, #818cf8);
position: relative;
}
.flow-line::after {
content: '▶';
position: absolute;
right: -10px;
top: -8px;
color: #818cf8;
font-size: 1.2rem;
}
.flow-label {
background: rgba(56,189,248,0.15);
color: #38bdf8;
padding: 6px 14px;
border-radius: 8px;
font-size: 0.85rem;
font-weight: 600;
white-space: nowrap;
}
/* 信息卡片 */
.info-card {
background: rgba(56,189,248,0.1);
border-left: 4px solid #38bdf8;
border-radius: 8px;
padding: 20px;
margin-top: 30px;
}
.info-card h3 {
color: #38bdf8;
font-size: 1.2rem;
margin-bottom: 10px;
}
/* 响应式 */
@media print {
body { background: white; color: black; }
.component-box { border-width: 2px; }
}
</style>
</head>
<body>
<div class="container">
<h1>🏗️ sgClaw 系统架构总图</h1>
<p class="subtitle">完整系统组件 · 层级关系 · 负责人标注 · 数据流向</p>
<!-- 图例 -->
<div class="legend">
<div class="legend-item">
<div class="legend-box p1a"></div>
<div class="legend-label"><strong>P1a</strong> · 核心通信(赵义仑)</div>
</div>
<div class="legend-item">
<div class="legend-box p1b"></div>
<div class="legend-label"><strong>P1b</strong> · 业务支持</div>
</div>
<div class="legend-item">
<div class="legend-box p2"></div>
<div class="legend-label"><strong>P2</strong> · 浏览器对接</div>
</div>
<div class="legend-item">
<div class="legend-box p3"></div>
<div class="legend-label"><strong>P3</strong> · AI 辅助迁移</div>
</div>
<div class="legend-item">
<div class="legend-box p4"></div>
<div class="legend-label"><strong>P4</strong> · 前端发布</div>
</div>
<div class="legend-item">
<div class="legend-box existing"></div>
<div class="legend-label"><strong>已有系统</strong>(复用)</div>
</div>
</div>
<!-- 主架构图 -->
<div class="architecture-diagram">
<!-- 第一层:用户交互层 -->
<div class="layer-container">
<div class="layer-label">🎨 用户交互层</div>
<div class="diagram-grid">
<div class="component-box p4 full-width">
<div class="component-header">
<div class="component-title p4">AI 助手 Side Panel</div>
<div class="owner-badge p4">👤 P4 · 前端工程师</div>
</div>
<div class="component-content">
<strong>功能:</strong>用户输入自然语言指令,查看执行进度,管理 Skill 启用/禁用
<div class="module-list">
<div class="module-tag">AgentControlPanel.vue</div>
<div class="module-tag">SkillManager.vue</div>
<div class="module-tag">IPC 调用</div>
</div>
</div>
</div>
</div>
</div>
<!-- 向下箭头 -->
<div class="flow-arrow">
<div class="flow-line"></div>
<div class="flow-label">用户指令:"导出 ERP 报表"</div>
<div class="flow-line"></div>
</div>
<!-- 第二层:浏览器内核层 -->
<div class="layer-container">
<div class="layer-label">🌐 浏览器内核层SuperRPA Chromium</div>
<div class="diagram-grid">
<!-- P2 负责的新增部分 -->
<div class="component-box p2 two-thirds">
<div class="component-header">
<div class="component-title p2">sgClaw 进程管理器</div>
<div class="owner-badge p2">👤 P2 · C++ 工程师</div>
</div>
<div class="component-content">
<strong>功能:</strong>启动 sgClaw 子进程,监听 STDIO Pipe转发 JSON 指令MAC 白名单检查
<div class="module-list">
<div class="module-tag">SgClawProcessHost.cc (~600 行)</div>
<div class="module-tag">PipeListener.cc</div>
<div class="module-tag">MacWhitelistCheck.cc</div>
</div>
</div>
</div>
<!-- 已有系统 -->
<div class="component-box existing">
<div class="component-header">
<div class="component-title existing">现有浏览器能力</div>
<div class="owner-badge" style="background:rgba(148,163,184,0.15);color:#94a3b8;">已有系统</div>
</div>
<div class="component-content">
<strong>复用:</strong>CommandRouter70+ 命令、CdpBridge、Zombie 模式等
<div class="module-list">
<div class="module-tag" style="border-color:#94a3b8;color:#94a3b8;">CommandRouter</div>
<div class="module-tag" style="border-color:#94a3b8;color:#94a3b8;">CDP 协议</div>
</div>
</div>
</div>
</div>
</div>
<!-- 向下箭头 - 关键路径 -->
<div class="flow-arrow">
<div class="flow-line"></div>
<div class="flow-label" style="background:rgba(239,68,68,0.15);color:#ef4444;">
<strong>⚡ STDIO Pipe 通信</strong> <span class="critical-badge">关键路径</span>
</div>
<div class="flow-line"></div>
</div>
<!-- 第三层sgClaw AI 引擎层 -->
<div class="layer-container">
<div class="layer-label">🧠 sgClaw AI 引擎层Rust 进程)</div>
<div class="diagram-grid">
<!-- P1a 核心通信 -->
<div class="component-box p1a">
<div class="component-header">
<div class="component-title p1a">通信与工具层</div>
<div class="owner-badge p1a">👤 P1a · 赵义仑 <span class="critical-badge">核心</span></div>
</div>
<div class="component-content">
<strong>功能:</strong>Pipe 双向通信JSON 序列化15 个 BrowserActionMAC 策略
<div class="module-list">
<div class="module-tag">PipeReader/Writer (~900 行)</div>
<div class="module-tag">BrowserPipeTool</div>
<div class="module-tag">MacPolicy</div>
</div>
</div>
</div>
<!-- P1b 业务支持 -->
<div class="component-box p1b">
<div class="component-header">
<div class="component-title p1b">AI Runtime 引擎</div>
<div class="owner-badge p1b">👤 P1b · Rust 工程师</div>
</div>
<div class="component-content">
<strong>功能:</strong>ReAct 循环工具调用三层记忆Critic 评估
<div class="module-list">
<div class="module-tag">AgentRuntime (~600 行)</div>
<div class="module-tag">Memory (L0/L1/L2)</div>
<div class="module-tag">Critic 评估器</div>
</div>
</div>
</div>
<!-- P1b Skill 加载器 -->
<div class="component-box p1b">
<div class="component-header">
<div class="component-title p1b">Skill 加载器</div>
<div class="owner-badge p1b">👤 P1b · Rust 工程师</div>
</div>
<div class="component-content">
<strong>功能:</strong>扫描 Skill 目录Ed25519 验签JS 沙箱执行
<div class="module-list">
<div class="module-tag">SkillLoader.rs</div>
<div class="module-tag">SignatureVerifier</div>
<div class="module-tag">JSRuntime (Deno Core)</div>
</div>
</div>
</div>
</div>
</div>
<!-- 横向连接AI 引擎 ↔ 大模型 -->
<div class="flow-arrow">
<div class="flow-line"></div>
<div class="flow-label">推理请求 / 流式响应</div>
<div class="flow-line"></div>
</div>
<!-- 第四层:外部服务 -->
<div class="layer-container">
<div class="layer-label">🤖 外部服务层</div>
<div class="diagram-grid">
<!-- 大模型 -->
<div class="component-box existing two-thirds">
<div class="component-header">
<div class="component-title existing">AI 大模型(内网部署)</div>
<div class="owner-badge" style="background:rgba(148,163,184,0.15);color:#94a3b8;">已有服务</div>
</div>
<div class="component-content">
<strong>功能:</strong>接收自然语言 + 上下文,返回 JSON 格式的操作序列
<div class="module-list">
<div class="module-tag" style="border-color:#94a3b8;color:#94a3b8;">Claude 3.5 / GPT-4</div>
<div class="module-tag" style="border-color:#94a3b8;color:#94a3b8;">本地 Qwen-72B</div>
<div class="module-tag" style="border-color:#94a3b8;color:#94a3b8;">DeepSeek</div>
</div>
</div>
</div>
<!-- Skill 仓库 -->
<div class="component-box p3">
<div class="component-header">
<div class="component-title p3">Skill 技能仓库</div>
<div class="owner-badge p3">👤 P3 · AI + 业务工程</div>
</div>
<div class="component-content">
<strong>功能:</strong>存储 400+ 业务场景的技能包,带签名验证
<div class="module-list">
<div class="module-tag">10-15 黄金样本(手写)</div>
<div class="module-tag">390 AI 生成 Skill</div>
<div class="module-tag">Ed25519 签名</div>
</div>
</div>
</div>
</div>
</div>
<!-- 底部信息卡 -->
<div class="info-card">
<h3>📊 数据流向总结</h3>
<div style="color:#cbd5e1;line-height:1.8;">
<strong>① 用户输入</strong>P4 Vue 界面)→
<strong>② IPC 传递</strong>P2 C++ 层)→
<strong>③ Pipe 通信</strong>P1a Rust 层,<span style="color:#ef4444;font-weight:700;">关键路径</span>)→
<strong>④ AI 推理</strong>P1b Runtime + 大模型)→
<strong>⑤ Skill 查询</strong>P3 仓库)→
<strong>⑥ 操作执行</strong>P2 CommandRouter → 浏览器)→
<strong>⑦ 记忆沉淀</strong>P1b Memory
</div>
</div>
<div class="info-card" style="background:rgba(239,68,68,0.1);border-color:#ef4444;margin-top:20px;">
<h3 style="color:#ef4444;">⚠️ 关键依赖关系</h3>
<div style="color:#cbd5e1;line-height:1.8;">
<strong>1. P1a + P2 必须先联调成功</strong>Day 4-5否则整个系统无法打通。<br>
<strong>2. P1b 依赖 P1a 的 BrowserPipeTool</strong>Day 6 对接),才能让 AI 调用浏览器。<br>
<strong>3. P3 的 Skill 需要 P1b 的加载器</strong>Day 6-7 验证),才能被执行。<br>
<strong>4. P4 的 UI 需要 P2 的 IPC 接口</strong>Day 6 集成),才能控制 sgClaw。
</div>
</div>
</div>
<!-- 技术栈总结 -->
<div style="margin-top:40px;background:rgba(255,255,255,0.05);border-radius:12px;padding:30px;">
<h2 style="color:#38bdf8;margin-bottom:20px;font-size:1.5rem;">🛠️ 技术栈总结</h2>
<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:20px;">
<div style="background:rgba(30,41,59,0.6);padding:20px;border-radius:8px;">
<div style="color:#ef4444;font-weight:700;margin-bottom:10px;">P1a + P1bRust</div>
<div style="color:#cbd5e1;font-size:0.9rem;line-height:1.6;">
• Rust 1.75+<br>
• ZeroClaw 框架<br>
• Tokio 异步运行时<br>
• SQLite (L2 记忆)<br>
• Ed25519 签名<br>
• Deno Core (JS 沙箱)
</div>
</div>
<div style="background:rgba(30,41,59,0.6);padding:20px;border-radius:8px;">
<div style="color:#38bdf8;font-weight:700;margin-bottom:10px;">P2C++ 浏览器)</div>
<div style="color:#cbd5e1;font-size:0.9rem;line-height:1.6;">
• C++17<br>
• Chromium 120+<br>
• STDIO Pipe<br>
• CDP 协议<br>
• 现有 CommandRouter<br>
• JSON 解析RapidJSON
</div>
</div>
<div style="background:rgba(30,41,59,0.6);padding:20px;border-radius:8px;">
<div style="color:#10b981;font-weight:700;margin-bottom:10px;">P3AI + 业务)</div>
<div style="color:#cbd5e1;font-size:0.9rem;line-height:1.6;">
• JavaScript (ES2022)<br>
• Qwen-72B / DeepSeek<br>
• Prompt Engineering<br>
• agent-vue 场景分析<br>
• Ed25519 签名工具
</div>
</div>
</div>
</div>
<!-- 按钮 -->
<div style="position:fixed;bottom:30px;right:30px;display:flex;gap:10px;z-index:100;">
<button onclick="window.print()" style="background:rgba(56,189,248,0.2);border:1px solid rgba(56,189,248,0.5);color:#38bdf8;padding:12px 24px;border-radius:8px;cursor:pointer;font-size:0.9rem;font-weight:600;">
📄 打印 PDF
</button>
<button onclick="window.scrollTo({top:0,behavior:'smooth'})" style="background:rgba(129,140,248,0.2);border:1px solid rgba(129,140,248,0.5);color:#818cf8;padding:12px 24px;border-radius:8px;cursor:pointer;font-size:0.9rem;font-weight:600;">
⬆️ 回到顶部
</button>
</div>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,261 @@
#!/bin/bash
# sgClaw 文档一键导出 PDF 脚本
# 使用方法chmod +x export-all-pdf.sh && ./export-all-pdf.sh
echo "============================================================"
echo "📄 sgClaw 文档一键导出 PDF"
echo "============================================================"
echo ""
# 创建输出目录
mkdir -p pdfs
echo "✅ 创建输出目录: pdfs/"
echo ""
# 定义需要导出的文档
declare -A docs=(
["协作时间表.html"]="协作时间表_interactive.pdf"
["协作时间表_printable.md"]="协作时间表.pdf"
["协作甘特图_printable.md"]="协作甘特图.pdf"
["团队分工.md"]="团队分工.pdf"
)
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📋 导出清单"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
# 列出所有文件
for src in "${!docs[@]}"; do
if [ -f "$src" ]; then
size=$(du -h "$src" | cut -f1)
dst="${docs[$src]}"
echo " 📄 $src ($size) → pdfs/$dst"
fi
done
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🚀 选择导出方式"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "1) 自动导出(使用 wkhtmltopdf需要安装"
echo "2) 浏览器手动打印(推荐,最美观)"
echo "3) 在线工具(最简单)"
echo "4) VS Code 插件(最专业)"
echo ""
read -p "请选择 (1-4): " choice
case $choice in
1)
# 检查 wkhtmltopdf 是否安装
if ! command -v wkhtmltopdf &> /dev/null; then
echo ""
echo "⚠️ 未安装 wkhtmltopdf正在尝试安装..."
echo ""
if command -v apt-get &> /dev/null; then
sudo apt-get update && sudo apt-get install -y wkhtmltopdf
elif command -v yum &> /dev/null; then
sudo yum install -y wkhtmltopdf
else
echo "❌ 无法自动安装,请手动安装 wkhtmltopdf"
echo " 访问: https://wkhtmltopdf.org/downloads.html"
exit 1
fi
fi
echo ""
echo "开始自动导出..."
echo ""
# 导出 HTML 文件
if [ -f "协作时间表.html" ]; then
echo "📄 处理: 协作时间表.html"
wkhtmltopdf --enable-local-file-access \
--orientation Landscape \
--page-size A4 \
协作时间表.html \
pdfs/协作时间表_interactive.pdf 2>/dev/null
if [ $? -eq 0 ]; then
echo " ✅ 成功: pdfs/协作时间表_interactive.pdf"
else
echo " ❌ 失败"
fi
fi
# 导出 Markdown 文件(先转 HTML
for md_file in 协作时间表_printable.md 协作甘特图_printable.md 团队分工.md; do
if [ -f "$md_file" ]; then
echo ""
echo "📄 处理: $md_file"
# 创建临时 HTML
temp_html="/tmp/${md_file%.md}.html"
cat > "$temp_html" << 'HTML_HEAD'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<style>
body {
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
max-width: 900px;
margin: 40px auto;
padding: 20px;
line-height: 1.8;
}
h1 { color: #1e40af; border-bottom: 3px solid #3b82f6; padding-bottom: 10px; }
h2 { color: #2563eb; margin-top: 30px; }
table { width: 100%; border-collapse: collapse; margin: 20px 0; }
th, td { border: 1px solid #ddd; padding: 10px; }
th { background: #3b82f6; color: white; }
img { max-width: 100%; height: auto; }
code { background: #f1f5f9; padding: 2px 6px; border-radius: 3px; }
pre { background: #1e293b; color: #f1f5f9; padding: 15px; border-radius: 6px; }
</style>
</head>
<body>
HTML_HEAD
# 简单的 Markdown to HTML保留图片链接
sed 's/^# \(.*\)/<h1>\1<\/h1>/g; s/^## \(.*\)/<h2>\1<\/h2>/g; s/^### \(.*\)/<h3>\1<\/h3>/g' "$md_file" >> "$temp_html"
echo '</body></html>' >> "$temp_html"
# 转 PDF
pdf_file="pdfs/${md_file%.md}.pdf"
pdf_file="${pdf_file/_printable/}"
wkhtmltopdf --enable-local-file-access \
--orientation Portrait \
--page-size A4 \
"$temp_html" \
"$pdf_file" 2>/dev/null
if [ $? -eq 0 ]; then
echo " ✅ 成功: $pdf_file"
else
echo " ❌ 失败"
fi
rm -f "$temp_html"
fi
done
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ 导出完成!"
;;
2)
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🌐 浏览器手动打印步骤"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "正在打开文件..."
firefox 协作时间表.html 2>/dev/null &
sleep 1
firefox 协作时间表_printable.md 2>/dev/null &
sleep 1
firefox 团队分工.md 2>/dev/null &
echo ""
echo "✅ 已在浏览器中打开文档"
echo ""
echo "对每个文件:"
echo " 1. 按 Ctrl+P或 Cmd+P"
echo " 2. 目标打印机:选择「另存为 PDF」"
echo " 3. 方向:选择「横向」(甘特图)或「纵向」(其他)"
echo " 4. 保存到 pdfs/ 目录"
echo " 5. 点击「保存」"
;;
3)
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🌍 在线工具"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "推荐工具:"
echo ""
echo " 📄 Markdown to PDF:"
echo " https://markdown2pdf.com"
echo " https://www.markdowntopdf.com"
echo ""
echo " 🎨 HTML to PDF:"
echo " https://www.sejda.com/html-to-pdf"
echo " https://html2pdf.com"
echo ""
echo "使用步骤:"
echo " 1. 访问上述网站"
echo " 2. 上传文件(见下方文件列表)"
echo " 3. 下载生成的 PDF"
echo " 4. 保存到 pdfs/ 目录"
echo ""
echo "文件列表:"
echo " • 协作时间表.html"
echo " • 协作时间表_printable.md"
echo " • 协作甘特图_printable.md"
echo " • 团队分工.md"
echo ""
echo "文件位置: $(pwd)/"
# 打开文件管理器
xdg-open . 2>/dev/null &
;;
4)
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📝 VS Code 插件方法"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "步骤:"
echo " 1. 打开 VS Code"
echo " 2. 安装插件Markdown PDF"
echo " (Ctrl+Shift+X 搜索 \"Markdown PDF\")"
echo ""
echo " 3. 打开 Markdown 文件:"
echo " code 协作时间表_printable.md"
echo " code 协作甘特图_printable.md"
echo " code 团队分工.md"
echo ""
echo " 4. 右键 → \"Markdown PDF: Export (pdf)\""
echo ""
echo " 5. PDF 会自动保存到同目录"
echo ""
# 提供快捷命令
echo "快捷命令:"
echo " code 协作时间表_printable.md &"
;;
*)
echo ""
echo "❌ 无效选择"
exit 1
;;
esac
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📊 输出目录"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "PDF 文件将保存到:"
echo " $(pwd)/pdfs/"
echo ""
# 列出已生成的 PDF
if ls pdfs/*.pdf 1> /dev/null 2>&1; then
echo "已生成的 PDF 文件:"
ls -lh pdfs/*.pdf | awk '{printf " • %s (%s)\n", $9, $5}'
else
echo "(尚无 PDF 文件)"
fi
echo ""
echo "============================================================"
echo "完成!🎉"
echo "============================================================"

View File

@@ -0,0 +1,116 @@
#!/bin/bash
# sgClaw 文档 PDF 导出脚本
# 使用方法chmod +x export-pdf.sh && ./export-pdf.sh
echo "============================================================"
echo "📄 sgClaw 文档 PDF 导出工具"
echo "============================================================"
echo ""
echo "本脚本将帮助你导出所有文档为 PDF"
echo ""
# 创建输出目录
mkdir -p pdfs
echo "✅ 创建输出目录: pdfs/"
echo ""
# 方法说明
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📖 导出方法(推荐)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "方法 1浏览器打印推荐最美观✅"
echo " 1. 在浏览器中打开文件(见下方文件列表)"
echo " 2. 按 Ctrl+P或 Cmd+P"
echo " 3. 选择\"另存为 PDF\""
echo " 4. 保存到 pdfs/ 目录"
echo ""
echo "方法 2在线工具最简单✅"
echo " 对于 Markdown 文件:"
echo " - 访问 https://markdown2pdf.com"
echo " - 或 https://www.markdowntopdf.com"
echo " - 上传 .md 文件,下载 PDF"
echo ""
echo "方法 3VS Code最专业✅"
echo " 1. 安装插件: \"Markdown PDF\""
echo " 2. 打开 .md 文件"
echo " 3. 右键 -> \"Markdown PDF: Export (pdf)\""
echo ""
# 文件列表
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📁 需要导出的文档"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
files=(
"协作时间表.html"
"团队分工.md"
"协作时间表.md"
"协作甘特图.md"
)
for file in "${files[@]}"; do
if [ -f "$file" ]; then
size=$(du -h "$file" | cut -f1)
echo " 📄 $file ($size)"
echo " file://$(pwd)/$file"
echo ""
fi
done
# SVG 文件特殊说明
if [ -f "协作甘特图.svg" ]; then
echo " 🎨 协作甘特图.svg"
echo " 可以用浏览器打开后打印,或直接插入 PPT"
echo " file://$(pwd)/协作甘特图.svg"
echo ""
fi
# 快捷命令
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🚀 快捷命令"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "# 在 Firefox 中打开所有文件"
echo "firefox 协作时间表.html &"
echo "firefox 协作甘特图.svg &"
echo ""
echo "# 在 Chrome 中打开"
echo "google-chrome 协作时间表.html &"
echo ""
echo "# 在文件管理器中打开当前目录"
echo "xdg-open . &"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "💡 提示"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "• HTML 文件包含交互式甘特图,建议保持 HTML 格式或打印为 PDF"
echo "• Markdown 文件可以用 GitHub/GitLab 在线查看(自动渲染)"
echo "• SVG 文件可以直接拖入 PowerPoint/Keynote"
echo "• 打印时建议选择\"横向\"方向,页面更宽"
echo ""
# 提供一个自动打开的选项
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
read -p "是否在浏览器中打开主要文档?(y/n): " choice
if [ "$choice" = "y" ] || [ "$choice" = "Y" ]; then
echo ""
echo "正在打开浏览器..."
firefox 协作时间表.html 2>/dev/null &
sleep 1
firefox 协作甘特图.svg 2>/dev/null &
echo "✅ 已打开!按 Ctrl+P 可以打印为 PDF"
else
echo ""
echo "👋 你可以随时手动打开文件进行打印"
fi
echo ""
echo "============================================================"
echo "完成!祝你汇报顺利!🎉"
echo "============================================================"

View File

@@ -0,0 +1,114 @@
# sgClaw 团队协作架构图
## 📄 文档说明
这是一个**独立的可视化架构图文档**,用于向领导清晰展示 sgClaw 项目的团队分工、协作关系和技术架构。
## 🎯 包含的图表
1. **团队协作总架构5 人分工全景)**
- 每个人干什么?
- 为什么要这样干?
- 产出物是什么?
2. **人员接口对接关系图**
- P1a ↔ P2关键路径对接极高优先级
- P1a ↔ P1bRuntime 集成对接
- P1b ↔ P3Skill 加载对接
- P2 ↔ P4UI 交互对接
3. **数据流全链路**
- 从用户输入到浏览器执行的完整流程
- 8 步数据流转详解
4. **关键路径时间轴**
- 为什么 Day 4-5 是瓶颈?
- 风险预案是什么?
5. **技术栈分层**
- 每层对应哪些人员?
- 每层负责什么模块?
6. **为什么这样分工?**
- 设计依据和决策背景
- 常见问题解答
## 🚀 如何查看
### 方法 1本地浏览器直接打开推荐
```bash
# 在文件管理器中双击打开
团队协作架构图.html
```
### 方法 2局域网查看适合开会演示
```bash
cd /home/zyl/projects/sgClaw/docs
./查看架构图.sh
```
然后在浏览器中访问显示的 URL例如
- 本机:`http://localhost:8888/团队协作架构图.html`
- 局域网:`http://192.168.x.x:8888/团队协作架构图.html`
### 方法 3导出为 PDF
在浏览器中打开后:
1. 点击右下角的「📄 打印 PDF」按钮
2. 或按 `Ctrl+P`Windows/Linux/ `Cmd+P`macOS
3. 选择「另存为 PDF」
4. 保存
## 💡 使用建议
### 给领导汇报时
1. **先看"团队协作总架构"**(第一图)
- 一目了然看到 5 个人各自负责什么
- 理解为什么要这样分工
2. **重点讲"关键路径"**(第四图)
- 强调 Day 4-5 的 P1a + P2 联调是整个项目的瓶颈
- 说明有风险预案
3. **数据流全链路**(第三图)
- 演示一个完整的业务场景
- 让领导理解 5 个人的工作如何串联起来
### 给技术人员讲解时
1. **技术栈分层**(第五图)
- 清晰展示模块划分
- 说明依赖关系(从下往上)
2. **接口对接关系**(第二图)
- 详细展示每对人员之间的接口协议
- 包含代码示例
## 📋 文件清单
```
/home/zyl/projects/sgClaw/docs/
├── 团队协作架构图.html # 主文档(独立 HTML无外部依赖
├── 查看架构图.sh # 启动脚本(局域网查看)
└── 架构图使用说明.md # 本文档
```
## 🎨 特性
-**零依赖**:单文件 HTML不需要网络不需要额外资源
-**深色主题**:适合投影演示,保护眼睛
-**响应式设计**:自适应不同屏幕尺寸
-**打印友好**:可直接打印或导出 PDF
-**可视化清晰**颜色编码P1a 红色、P2 蓝色、P3 绿色等)
## 🔄 更新记录
- **v1.0** (2026-03-04):初版发布,包含 6 张核心架构图
---
**维护者**:项目经理
**最后更新**2026-03-04

View File

@@ -0,0 +1,44 @@
#!/bin/bash
# sgClaw 团队协作架构图查看脚本
# 使用方法chmod +x 查看架构图.sh && ./查看架构图.sh
echo "============================================================"
echo "📊 sgClaw 团队协作架构图"
echo "============================================================"
echo ""
# 获取本机 IP
IP=$(hostname -I | awk '{print $1}')
if [ -z "$IP" ]; then
IP="localhost"
fi
PORT=8888
echo "正在启动 HTTP 服务器..."
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📱 在浏览器中访问:"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo " 本机访问:"
echo " http://localhost:$PORT/团队协作架构图.html"
echo ""
echo " 局域网其他设备访问:"
echo " http://$IP:$PORT/团队协作架构图.html"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "💡 提示:"
echo " • 按 Ctrl+C 停止服务器"
echo " • 可以直接打印为 PDF点击右下角「打印 PDF」按钮"
echo " • 或在浏览器中按 Ctrl+P 打印"
echo ""
echo "============================================================"
echo ""
# 启动 HTTP 服务器
cd "$(dirname "$0")"
python3 -m http.server $PORT --bind 0.0.0.0

View File

@@ -0,0 +1,52 @@
#!/bin/bash
# sgClaw 系统架构总图查看脚本
echo "============================================================"
echo "🏗️ sgClaw 系统架构图"
echo "============================================================"
echo ""
# 获取本机 IP
IP=$(hostname -I | awk '{print $1}')
if [ -z "$IP" ]; then
IP="localhost"
fi
PORT=8889
echo "正在启动 HTTP 服务器..."
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📱 在浏览器中访问:"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo " 【推荐】Mermaid 流程图版本:"
echo " http://localhost:$PORT/系统架构图_Mermaid.html"
echo ""
echo " 方框布局版本:"
echo " http://localhost:$PORT/系统架构总图.html"
echo ""
echo " 局域网访问:"
echo " http://$IP:$PORT/系统架构图_Mermaid.html"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "💡 Mermaid 版本特点:"
echo " ✓ 专业流程图风格(不是方框布局)"
echo " ✓ 带箭头和连接线,展示数据流向"
echo " ✓ 包含 3 张图:"
echo " - 系统架构总览(所有组件关系)"
echo " - 端到端数据流10 步完整流程)"
echo " - 人员协作依赖5 人对接关系)"
echo " ✓ 颜色区分负责人(红=P1a橙=P1b绿=P2蓝=P3紫=P4"
echo " ✓ 关键路径用粗线标注"
echo ""
echo "按 Ctrl+C 停止服务器"
echo ""
echo "============================================================"
echo ""
cd "$(dirname "$0")"
python3 -m http.server $PORT --bind 0.0.0.0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,413 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sgClaw 指令执行全链路解析</title>
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
<style>
:root {
--bg-color: #f8fafc;
--text-main: #0f172a;
--text-muted: #64748b;
--card-bg: #ffffff;
--border-color: #e2e8f0;
--blue: #3b82f6;
--blue-light: #eff6ff;
--blue-dark: #1e3a8a;
--orange: #f97316;
--orange-light: #fff7ed;
--orange-dark: #7c2d12;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
background-color: var(--bg-color);
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif;
color: var(--text-main);
line-height: 1.6;
padding: 40px 20px;
}
.container {
max-width: 1400px;
margin: 0 auto;
}
/* ============ 页头 ============ */
.header {
text-align: center;
margin-bottom: 48px;
}
.header h1 {
font-size: 2.2rem;
font-weight: 800;
margin-bottom: 12px;
color: var(--text-main);
}
.header p {
font-size: 1.05rem;
color: var(--text-muted);
max-width: 800px;
margin: 0 auto;
}
/* ============ 主流程容器 ============ */
.flow-container {
display: flex;
flex-direction: column;
gap: 40px;
}
/* ============ 卡片通用 ============ */
.flow-card {
background: var(--card-bg);
border: 1px solid var(--border-color);
border-radius: 20px;
padding: 32px 28px;
box-shadow: 0 8px 28px rgba(0,0,0,0.04);
}
.flow-title {
font-size: 1.35rem;
font-weight: 800;
color: var(--text-main);
margin-bottom: 10px;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
.flow-desc {
font-size: 0.95rem;
color: var(--text-muted);
text-align: center;
margin-bottom: 28px;
line-height: 1.6;
padding: 0 20px;
}
/* ============ 路由卡:中性色 ============ */
.card-router {
border-left: 5px solid #a855f7;
}
.card-router .flow-title { color: #6b21a8; }
/* ============ 简单指令卡:蓝色 ============ */
.card-simple {
border-left: 5px solid var(--blue);
}
.card-simple .flow-title { color: var(--blue-dark); }
/* ============ 复杂指令卡:橙色 ============ */
.card-complex {
border-left: 5px solid var(--orange);
}
.card-complex .flow-title { color: var(--orange-dark); }
/* ============ 图表包装器 ============ */
.mermaid-wrapper {
width: 100%;
overflow-x: auto;
display: flex;
justify-content: center;
background: #fcfcfc;
border-radius: 12px;
padding: 24px 8px;
border: 1px dashed #cbd5e1;
}
.mermaid {
min-width: 500px;
}
/* ============ 对比表格 ============ */
.compare-section {
margin-bottom: 40px;
}
.compare-table {
width: 100%;
border-collapse: collapse;
font-size: 0.92rem;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 12px rgba(0,0,0,0.05);
}
.compare-table th {
padding: 14px 20px;
font-weight: 700;
text-align: center;
font-size: 0.95rem;
}
.compare-table td {
padding: 12px 20px;
border-bottom: 1px solid var(--border-color);
vertical-align: middle;
}
.compare-table tr:last-child td { border-bottom: none; }
.compare-table tbody tr:hover { background: #f8fafc; }
.th-dim { background: #f1f5f9; color: #475569; text-align: left; }
.th-simple { background: var(--blue-light); color: var(--blue-dark); }
.th-complex { background: var(--orange-light); color: var(--orange-dark); }
.badge {
display: inline-block;
padding: 3px 10px;
border-radius: 6px;
font-size: 0.82rem;
font-weight: 700;
}
.badge-blue { background: var(--blue-light); color: var(--blue); border: 1px solid #bfdbfe; }
.badge-orange { background: var(--orange-light); color: var(--orange); border: 1px solid #fed7aa; }
.badge-green { background: #f0fdf4; color: #16a34a; border: 1px solid #bbf7d0; }
.badge-red { background: #fef2f2; color: #dc2626; border: 1px solid #fecaca; }
/* ============ 底部说明 ============ */
.footer-note {
margin-top: 16px;
padding: 18px 24px;
background: #eff6ff;
border-left: 4px solid var(--blue);
border-radius: 8px;
font-size: 0.95rem;
color: var(--blue-dark);
line-height: 1.7;
}
.footer-note strong { color: #1d4ed8; }
code {
background: #e0e7ff;
color: #3730a3;
padding: 2px 6px;
border-radius: 4px;
font-size: 0.88rem;
}
</style>
</head>
<body>
<div class="container">
<!-- 页头 -->
<div class="header">
<h1>sgClaw 指令执行全链路解析</h1>
<p>同一个 Agent 框架,面对"简单直调"与"复杂规划"两类指令走完全不同的路径。本文拆解两条路径的内部时序,帮助研发与业务团队建立准确认知。</p>
</div>
<div class="flow-container">
<!-- ===== 0. 指令路由决策 ===== -->
<div class="flow-card card-router">
<h2 class="flow-title"><span style="font-size:1.5rem;">🔀</span> 0. 指令路由:走哪条路?</h2>
<p class="flow-desc">
sgClaw 在执行任何操作前,先由引擎分析指令语义,判断是否能从技能库中直接命中一个 Skill。<br>
<strong>命中率高 → 跳过大模型,走简单路径;</strong>&nbsp;&nbsp;<strong>需要拆解 → 交由大模型规划,走复杂路径。</strong>
</p>
<div class="mermaid-wrapper">
<div class="mermaid">
flowchart LR
Input(["💬 用户指令"])
Router{"🔍 引擎意图分析\n语义匹配技能库"}
Simple["⚡ 简单路径\nSingle-Skill Direct\n无 LLM 调用"]
Complex["🧠 复杂路径\nReAct Planning Loop\n动态拆解 + 多轮 LLM"]
Input --> Router
Router -->|"Skill 命中率高\n单一、明确意图"| Simple
Router -->|"无匹配 Skill\n模糊或组合目标"| Complex
style Simple fill:#eff6ff,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a
style Complex fill:#fff7ed,stroke:#f97316,stroke-width:2px,color:#7c2d12
style Router fill:#faf5ff,stroke:#a855f7,stroke-width:2px,color:#6b21a8
</div>
</div>
</div>
<!-- ===== 对比速览表 ===== -->
<div class="compare-section">
<table class="compare-table">
<thead>
<tr>
<th class="th-dim">对比维度</th>
<th class="th-simple">⚡ A. 简单指令Single-Skill</th>
<th class="th-complex">🧠 B. 复杂指令ReAct Planning</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>典型场景</strong></td>
<td>提取当前页面表格、截图保存</td>
<td>对比A/B公司财报、跨系统数据同步</td>
</tr>
<tr>
<td><strong>大模型调用次数</strong></td>
<td><span class="badge badge-green">0 次</span>无需LLM</td>
<td><span class="badge badge-orange">2 ~ 8+ 次</span>(规划 + 每步评估)</td>
</tr>
<tr>
<td><strong>预计完成时间</strong></td>
<td><span class="badge badge-blue">< 1 </span></td>
<td><span class="badge badge-orange">5 ~ 30 秒</span></td>
</tr>
<tr>
<td><strong>Skill 调用数量</strong></td>
<td>1 个 Skill直接命中</td>
<td>N 个 Skill动态加载</td>
</tr>
<tr>
<td><strong>记忆系统使用</strong></td>
<td>不写入记忆(一次性操作)</td>
<td>每步写入 L1 短期记忆,汇总写入 L2</td>
</tr>
<tr>
<td><strong>失败恢复</strong></td>
<td>无 Critic直接报错返回</td>
<td>Critic 评估后可自动纠错重试</td>
</tr>
<tr>
<td><strong>适用前提</strong></td>
<td>技能库中已有对应 Skill</td>
<td>技能库有原子 Skill需 LLM 组合编排</td>
</tr>
</tbody>
</table>
</div>
<!-- ===== A. 简单指令 ===== -->
<div class="flow-card card-simple">
<h2 class="flow-title"><span style="font-size:1.5rem;"></span> A. 简单指令执行 (Single-Skill)</h2>
<p class="flow-desc">
当用户输入目的极其明确的指令(如"提取当前表格"),引擎直接命中对应的预设 Skill
<strong>全程零 LLM 调用,执行延迟 &lt; 1 秒</strong>。Skill 在 Deno Core 沙箱中运行,直接向浏览器内核下发 CDP 动作。
</p>
<div class="mermaid-wrapper">
<div class="mermaid">
sequenceDiagram
autonumber
actor U as 👤 用户
participant UI as 💻 UI面板(P4)
participant Core as ⚙️ 引擎(P1a+P1b)
participant Sandbox as 📦 Skill沙箱(Deno)
participant Browser as 🌐 浏览器内核(P2)
U->>UI: "提取当前页面表格"
UI->>Core: 发送执行请求(含页面上下文)
rect rgb(239, 246, 255)
Note over Core,Sandbox: 语义匹配:命中 TableExtract_Skill跳过大模型
Core->>Sandbox: 加载并 Ed25519 验签 TableExtract_Skill
Sandbox-->>Core: 验签通过JS 沙箱就绪
end
Sandbox->>Browser: 下发 BrowserActionCDP 获取 DOM 结构
Browser-->>Sandbox: 返回页面 HTML / 表格节点
Sandbox-->>Core: Skill 执行完毕,返回结构化数据
Core-->>UI: 格式化结果JSON → 可读表格)
UI-->>U: 界面展示提取结果 ✅
</div>
</div>
</div>
<!-- ===== B. 复杂指令 ===== -->
<div class="flow-card card-complex">
<h2 class="flow-title"><span style="font-size:1.5rem;">🧠</span> B. 复杂指令执行 (ReAct Planning)</h2>
<p class="flow-desc">
面对模糊或组合型任务(如"对比A、B公司最新财报"),引擎依赖大模型进行<strong>动态拆解</strong>,并多次调用不同 Skill。
每一步执行后经 <strong>Critic 评估器</strong>判断是否继续或纠错,同时将中间结果写入记忆系统。
</p>
<div class="mermaid-wrapper">
<div class="mermaid">
sequenceDiagram
autonumber
actor U as 👤 用户
participant UI as 💻 UI面板(P4)
participant Core as ⚙️ 引擎(P1a+P1b)
participant LLM as 🤖 大模型底座
participant Memory as 🗄️ 记忆系统(L0/L1/L2)
participant Sandbox as 📦 Skill沙箱(Deno)
participant Browser as 🌐 浏览器内核(P2)
U->>UI: "对比 A 和 B 公司最新财报"
UI->>Core: 发送复杂任务请求
rect rgb(255, 247, 237)
Note over Core,LLM: Think 阶段:大模型拆解目标
Core->>LLM: 意图分析 + 生成执行计划 (Plan)
LLM-->>Core: 返回步骤列表:① 搜 A 财报 → ② 搜 B 财报 → ③ 对比汇总
end
rect rgb(254, 242, 242)
Note over Core,Browser: ReAct 循环:逐步执行,每步评估
loop 针对每个拆解步骤Step 1..N
Core->>Sandbox: Act加载当前步骤对应的 Skill
Sandbox->>Browser: 执行 BrowserAction操作页面
Browser-->>Sandbox: 返回页面反馈Observation
Sandbox-->>Core: Skill 执行结果
Core->>Memory: 写入 L1 短期记忆RingBuffer
Core->>LLM: Critic 评估:当前步骤是否成功?
LLM-->>Core: 决断:✅ 继续下一步 / ⚠️ 纠错重试
end
end
Core->>LLM: 汇总所有步骤结果,生成最终报告
LLM-->>Core: 输出多维度财报对比分析
Core->>Memory: 将成功路径写入 L2 长期记忆SQLite
Core-->>UI: 返回完整分析报告
UI-->>U: 界面展示多维度对比结果 ✅
</div>
</div>
</div>
</div><!-- /.flow-container -->
<div class="footer-note">
<strong>💡 架构启示:</strong><br>
两条路径共享同一套底层基础设施Pipe 通信 + Skill 沙箱 + 浏览器内核),区别仅在于<strong>是否经过 LLM 规划层与 Critic 评估层</strong>
这意味着:① <code>P1a Pipe 通信稳定性</code> 是两条路径的共同命脉;
<code>P1b Prompt 工程质量</code> 决定了复杂路径的拆解准确率与 Critic 纠错能力;
<code>P3 Skill 覆盖度</code> 决定了有多少指令可以走成本更低的简单路径。
三者互相支撑,缺一不可。
</div>
</div>
<script>
mermaid.initialize({
startOnLoad: true,
theme: 'base',
securityLevel: 'loose',
themeVariables: {
fontFamily: '-apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif',
fontSize: '14px',
primaryColor: '#ffffff',
primaryTextColor: '#1e293b',
primaryBorderColor: '#cbd5e1',
lineColor: '#64748b',
secondaryColor: '#f1f5f9',
tertiaryColor: '#f8fafc',
activationBorderColor: '#3b82f6',
activationBkgColor: '#eff6ff',
sequenceNumberColor: '#64748b',
},
sequence: {
useMaxWidth: false,
actorMargin: 50,
messageMargin: 30,
boxMargin: 12,
noteMargin: 12,
mirrorActors: false,
},
flowchart: {
useMaxWidth: false,
htmlLabels: true,
curve: 'basis',
nodeSpacing: 60,
rankSpacing: 50,
}
});
</script>
</body>
</html>

View File

@@ -0,0 +1,435 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sgClaw 架构研讨看板 (自适应排版修复版)</title>
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
<style>
:root {
--bg-color: #f4f7f9;
--blue-light: #eff6ff; --blue-border: #93c5fd; --blue-dark: #1e3a8a;
--red-light: #fef2f2; --red-border: #fca5a5; --red-dark: #7f1d1d;
--green-light: #f0fdf4; --green-border: #86efac; --green-dark: #14532d;
--conn-color: #94a3b8;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
background-color: var(--bg-color);
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif;
color: #334155;
line-height: 1.6;
overflow-x: hidden; /* 防止全局横向滚动 */
}
/* ================= 1. 顶部导航 ================= */
.header-nav {
position: sticky; top: 0; z-index: 1000;
height: 64px; background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(10px);
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
display: flex; justify-content: space-between; align-items: center; padding: 0 40px;
}
.header-titles { display: flex; align-items: baseline; gap: 16px; }
.header-titles h1 { font-size: 1.3rem; font-weight: 800; color: #0f172a; margin: 0; }
.header-titles p { font-size: 0.9rem; color: #64748b; margin: 0; display: none; }
.jump-links { display: flex; gap: 10px; }
.jump-links a {
text-decoration: none; color: #475569; font-weight: 600; font-size: 0.85rem;
padding: 6px 12px; border-radius: 6px; background: #f1f5f9; transition: all 0.2s;
}
.jump-links a:hover { background: #e2e8f0; color: #0f172a; }
@media (min-width: 768px) {
.header-titles h1 { font-size: 1.4rem; }
.header-titles p { display: block; }
}
/* ================= 2. 首屏高管总图 (弹性高度) ================= */
.hero-screen {
/* 使用 min-height 而不是 height避免内容过多时被裁剪 */
min-height: calc(100vh - 64px);
display: flex; flex-direction: column; align-items: center; justify-content: center;
padding: 40px 20px 80px; position: relative;
width: 100%;
}
.hero-header { text-align: center; margin-bottom: 40px; }
.hero-header h2 { font-size: 2rem; font-weight: 800; color: #0f172a; margin-bottom: 10px; }
.hero-header p { font-size: 1rem; color: #64748b; max-width: 800px; margin: 0 auto; }
/* 核心三模块的 Flex 容器 */
.architecture-container {
display: flex;
flex-direction: row;
align-items: stretch; /* 让三个卡片等高 */
width: 100%;
max-width: 1400px;
margin: 0 auto;
}
/* 模块卡片 */
.module-card {
flex: 1; /* 平分空间 */
border-radius: 20px; padding: 25px 20px;
display: flex; flex-direction: column;
border: 2px solid; background: white;
box-shadow: 0 8px 24px rgba(0,0,0,0.04);
transition: transform 0.3s, box-shadow 0.3s;
min-width: 0; /* 防止内容撑破 flex 布局 */
}
.module-card:hover { transform: translateY(-4px); box-shadow: 0 12px 32px rgba(0,0,0,0.08); }
.mod-ui { border-color: var(--blue-border); }
.mod-ai { border-color: var(--red-border); }
.mod-biz { border-color: var(--green-border); }
.module-header { text-align: center; padding-bottom: 15px; margin-bottom: 15px; border-bottom: 2px dashed rgba(0,0,0,0.08); }
.module-title-text { font-size: 1.35rem; font-weight: 800; margin-bottom: 12px; }
.mod-ui .module-title-text { color: var(--blue-dark); }
.mod-ai .module-title-text { color: var(--red-dark); }
.mod-biz .module-title-text { color: var(--green-dark); }
.meta-tags { display: flex; flex-direction: column; gap: 8px; align-items: center; }
.meta-tag { padding: 4px 10px; border-radius: 6px; font-size: 0.8rem; font-weight: 600; text-align: center; width: 100%; }
.tag-who { background: #fffbeb; color: #b45309; border: 1px solid #fde68a; }
.tag-why { background: #f8fafc; color: #475569; border: 1px solid #e2e8f0; font-weight: 500;}
/* 内部组件列表 */
.comp-list { display: flex; flex-direction: column; gap: 10px; flex: 1; }
.comp-item { background: #f8fafc; padding: 14px; border-radius: 12px; border: 1px solid #e2e8f0; }
.comp-name { font-weight: 800; color: #1e293b; margin-bottom: 4px; font-size: 0.95rem; }
.comp-desc { font-size: 0.8rem; color: #64748b; line-height: 1.5; }
/* ================= 安全的流式连接桥梁 ================= */
.connection-bridge {
flex: 0 0 70px; /* 固定宽度,不拉伸不缩小 */
display: flex; flex-direction: column; justify-content: center; align-items: center;
position: relative;
}
.bridge-line {
position: absolute;
width: 100%; height: 4px; z-index: 1;
background: repeating-linear-gradient(90deg, var(--conn-color) 0, var(--conn-color) 8px, transparent 8px, transparent 16px);
}
.bridge-label {
position: relative; z-index: 2;
background: white; border: 2px solid var(--conn-color);
padding: 8px 12px; border-radius: 8px;
text-align: center; width: 140px; /* 固定标签宽度以保证文字排版 */
box-shadow: 0 4px 12px rgba(0,0,0,0.06);
}
.bridge-label.risk { border-color: #ef4444; box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.1); }
.bridge-main-text { font-size: 0.85rem; font-weight: 800; color: #1e293b; display: block; }
.risk .bridge-main-text { color: #b91c1c; }
.bridge-sub-text { font-size: 0.7rem; font-weight: normal; margin-top: 4px; color: #64748b; display: block; }
.risk .bridge-sub-text { color: #ef4444; }
/* 向下指示器 */
.scroll-indicator {
position: absolute; bottom: 20px; left: 50%; transform: translateX(-50%);
display: flex; flex-direction: column; align-items: center; gap: 6px;
color: #94a3b8; font-size: 0.8rem; font-weight: 600;
}
.scroll-indicator svg { width: 20px; height: 20px; stroke: #94a3b8; animation: bounce 2s infinite; }
@keyframes bounce {
0%, 20%, 50%, 80%, 100% { transform: translateY(0); }
40% { transform: translateY(-8px); }
60% { transform: translateY(-4px); }
}
/* ================= 3. 下方技术与管理视图 ================= */
.detail-sections {
max-width: 1400px; margin: 0 auto; padding: 20px 20px 80px;
display: flex; flex-direction: column; gap: 40px;
}
.section-block {
background: white; border-radius: 16px; padding: 40px 30px;
box-shadow: 0 4px 20px rgba(0,0,0,0.03);
}
.section-title { text-align: center; font-size: 1.5rem; color: #0f172a; margin-bottom: 8px; font-weight: 800; }
.section-subtitle { text-align: center; color: #64748b; margin-bottom: 30px; font-size: 0.95rem; }
/* 图表防溢出包装器 */
.mermaid-wrapper {
width: 100%;
overflow-x: auto; /* 核心:太宽时允许水平滚动,而不是撑破外框 */
padding: 10px 0;
display: flex; justify-content: center;
}
.mermaid {
min-width: 800px; /* 保证图形不至于被挤压得无法辨认 */
}
.note-box {
margin: 20px auto 0; padding: 16px 20px; background: #fff7ed; border-left: 4px solid #f97316;
border-radius: 8px; font-size: 0.9rem; color: #334155; max-width: 1000px; line-height: 1.6;
}
/* ================= 响应式布局 (适配笔记本与平板) ================= */
@media (max-width: 1024px) {
.architecture-container {
flex-direction: column; /* 小屏改为纵向排列 */
align-items: center;
}
.module-card { width: 100%; max-width: 600px; }
.connection-bridge {
flex: 0 0 80px; width: 100%;
}
.bridge-line {
width: 4px; height: 100%;
background: repeating-linear-gradient(180deg, var(--conn-color) 0, var(--conn-color) 8px, transparent 8px, transparent 16px);
}
.bridge-label { width: auto; max-width: 200px; }
.scroll-indicator { display: none; }
}
</style>
</head>
<body>
<!-- 顶部导航悬浮栏 -->
<div class="header-nav">
<div class="header-titles">
<h1>sgClaw 架构研讨看板</h1>
<p>总图定战略与边界 · 分图定技术与接口</p>
</div>
<div class="jump-links">
<a href="#section-exec">宏观总图</a>
<a href="#section-tech">技术流向</a>
<a href="#section-time">里程碑</a>
</div>
</div>
<!-- ================= 绝佳首屏体验:高管业务总图 ================= -->
<section class="hero-screen" id="section-exec">
<div class="hero-header">
<h2>第一部分:业务全景与宏观分工</h2>
<p>明确“三大核心阵地”的作用、责任人与对接瓶颈 (Left to Right)</p>
</div>
<div class="architecture-container">
<!-- 模块 1浏览器端 -->
<div class="module-card mod-ui">
<div class="module-header">
<div class="module-title-text">🌐 1. 浏览器交互宿主</div>
<div class="meta-tags">
<div class="meta-tag tag-who">👨‍💻 责任人P4 (前端) + P2 (C++)</div>
<div class="meta-tag tag-why">提供界面输入与 Agent 执行环境</div>
</div>
</div>
<div class="comp-list">
<div class="comp-item"><div class="comp-name">UI 面板层 (P4)</div><div class="comp-desc">Side Panel 助手界面 + Skill 管理后台</div></div>
<div class="comp-item"><div class="comp-name">进程守护内核 (P2)</div><div class="comp-desc">启动、管理与保活 sgClaw 独立子进程</div></div>
<div class="comp-item"><div class="comp-name">底层能力复用 (现有)</div><div class="comp-desc">复用 70+ 核心 CDP 浏览器操纵指令</div></div>
</div>
</div>
<!-- 桥梁 1 -->
<div class="connection-bridge">
<div class="bridge-line"></div>
<div class="bridge-label risk">
<span class="bridge-main-text">⚡风险点</span>
<span class="bridge-sub-text">STDIO 跨进程通信流<br>(P2 ↔ P1a)</span>
</div>
</div>
<!-- 模块 2AI 引擎 -->
<div class="module-card mod-ai">
<div class="module-header">
<div class="module-title-text">⚙️ 2. sgClaw AI 引擎</div>
<div class="meta-tags">
<div class="meta-tag tag-who">👨‍💻 责任人P1a (协议) + P1b (Rust AI)</div>
<div class="meta-tag tag-why">系统级智能中枢,负责推理与逻辑</div>
</div>
</div>
<div class="comp-list">
<div class="comp-item"><div class="comp-name">协议枢纽层 (P1a)</div><div class="comp-desc">Pipe 双向流处理、白名单指令拦截</div></div>
<div class="comp-item"><div class="comp-name">推理与记忆引擎 (P1b)</div><div class="comp-desc">ReAct 核心调度循环 + L0/1/2 记忆系统</div></div>
<div class="comp-item"><div class="comp-name">沙箱加载器 (P1b)</div><div class="comp-desc">验证签名并隔离运行外部业务 Skill</div></div>
</div>
</div>
<!-- 桥梁 2 -->
<div class="connection-bridge">
<div class="bridge-line"></div>
<div class="bridge-label">
<span class="bridge-main-text">🔄 逻辑常识支撑</span>
<span class="bridge-sub-text">提示词与技能下发<br>(P1b ↔ P3)</span>
</div>
</div>
<!-- 模块 3业务库 -->
<div class="module-card mod-biz">
<div class="module-header">
<div class="module-title-text">📦 3. 业务技能与基座</div>
<div class="meta-tags">
<div class="meta-tag tag-who">👨‍💻 责任人P3 (业务) + 算法基座</div>
<div class="meta-tag tag-why">提供底层算力与具体场景业务规则</div>
</div>
</div>
<div class="comp-list">
<div class="comp-item"><div class="comp-name">黄金基准样本 (P3)</div><div class="comp-desc">人工手写测试的 15 个高可用业务场景</div></div>
<div class="comp-item"><div class="comp-name">泛化扩容技能库 (P3)</div><div class="comp-desc">通过大模型批量生成的长尾应用技能</div></div>
<div class="comp-item"><div class="comp-name">大模型底座 (内网)</div><div class="comp-desc">Minimax-M2.5/Deepseek v3.2 通用流式推理</div></div>
</div>
</div>
</div>
<div class="scroll-indicator">
<span>向下滚动查看技术架构</span>
<svg fill="none" viewBox="0 0 24 24" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19 14l-7 7m0 0l-7-7m7 7V3" /></svg>
</div>
</section>
<!-- ================= 下方滚动区域:技术分图与时间线 ================= -->
<div class="detail-sections">
<!-- 技术流向图 -->
<div id="section-tech" class="section-block">
<h2 class="section-title">第二部分:技术研发架构与数据流向</h2>
<p class="section-subtitle">面向研发团队明确模块边界、API 交互方式及底层数据流传路径</p>
<div class="mermaid-wrapper">
<div class="mermaid">
graph LR
User(["👤 用户操作"])
subgraph BROWSER["🌐 浏览器侧 (P4+P2)"]
direction TB
SidePanel("UI: AI 面板 (Vue)")
ProcessHost("Host: 进程守护")
PipeListener("IPC: Pipe 监听")
Cmd["Action: CDP 操纵指令"]
SidePanel <-->|"Window IPC"| ProcessHost
ProcessHost --> PipeListener
PipeListener -.->|"复用"| Cmd
end
subgraph SGCLAW["⚙️ sgClaw AI 引擎进程 (P1a+P1b)"]
direction TB
PipeRW("Core: Pipe 双向读写")
BrowserTool("Tool: Action 封装")
Runtime("Brain: ReAct 核心循环")
Memory[("Mem: 记忆层 (SQLite)")]
SkillLoader("Sandbox: 沙箱加载验签")
PipeRW <--> BrowserTool
BrowserTool <--> Runtime
Runtime --> Memory
Runtime --> SkillLoader
end
subgraph EXT["☁️ 远端服务与库 (P3)"]
direction TB
LLM1("LLM: Claude/GPT API")
SkillDB[/"Skill: 黄金/泛化技能库"/]
end
%% 数据流连线
User --> SidePanel
PipeListener == "⚡ 高风险卡点 (STDIO 双工流)" === PipeRW
Runtime <-->|"提示词组装"| LLM1
SkillLoader -->|"签名挂载调用"| SkillDB
BrowserTool -.->|"执行结果回调"| PipeListener
%% 颜色样式
classDef p1 fill:#fff7ed,stroke:#ea580c,stroke-width:1px
classDef p2 fill:#eff6ff,stroke:#2563eb,stroke-width:1px
classDef p3 fill:#f0fdf4,stroke:#16a34a,stroke-width:1px
class PipeRW,BrowserTool,Runtime,Memory,SkillLoader p1
class SidePanel,ProcessHost,PipeListener,Cmd p2
class LLM1,SkillDB p3
</div>
</div>
</div>
<!-- 里程碑与卡点 -->
<div id="section-time" class="section-block">
<h2 class="section-title">第三部分:关键路径与里程碑依赖</h2>
<p class="section-subtitle">面向 PM/TL把握各干系人的研发依赖与联调卡点控制排期风险</p>
<div class="mermaid-wrapper">
<div class="mermaid">
graph TB
subgraph W1["📌 W1 独立开发期 (Day 1-3)"]
direction LR
P1a["P1a 协议层构建"]
P2["P2 内核扩展开发"]
P1b["P1b ReAct框架"]
P3["P3 核心用例设计"]
P4["P4 面板UI开发"]
P1a ~~~ P2 ~~~ P1b ~~~ P3 ~~~ P4
end
CRIT{{"⚠️ W1 末期关键联调 (Day 4-5)\n=====================\nP1a 🤝 P2 联合打通 STDIO Pipe\n(如果阻塞,整个后续测试将无法进行)"}}
subgraph W2["🚀 W2 集成与验收期 (Day 6-10)"]
direction TB
INT1["P1b 🤝 P3\n沙箱能力与用例装载测试"]
INT2["P1a 🤝 P1b\n引擎接入浏览器动作测试"]
INT3["P2 🤝 P4\n前后端 IPC 接口贯通测试"]
TEST["🎯 全链路 E2E 测试\n跑通首批 6 个核心业务场景"]
SHIP["📦 P4 打包发版"]
INT1 --> TEST
INT2 --> TEST
INT3 --> TEST
TEST --> SHIP
end
W1 --> CRIT
CRIT -->|打通后| W2
classDef crit fill:#fef2f2,stroke:#ef4444,stroke-width:2px,color:#991b1b
class CRIT crit
</div>
</div>
<div class="note-box">
<strong>🚨 风险管控重点说明:</strong><br>
Day 4-5 的 <strong>P1a (协议层) 与 P2 (内核层) 的 Pipe 通信</strong>是整个项目的物理连通基石。如果这个桥梁不通P1b (AI 引擎)、P3 (业务技能) 和 P4 (UI 面板) 将沦为孤岛,无法进行端到端全链路验证。建议在此节点安排 <strong>Daily Sync 重点跟进</strong>,必要时准备 HTTP 兜底预案。
</div>
</div>
</div>
<script>
mermaid.initialize({
startOnLoad: true,
theme: 'base',
securityLevel: 'loose',
themeVariables: {
fontFamily: '-apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif',
fontSize: '14px',
primaryColor: '#ffffff',
primaryTextColor: '#334155',
primaryBorderColor: '#cbd5e1',
lineColor: '#64748b',
secondaryColor: '#f8fafc',
tertiaryColor: '#ffffff'
},
flowchart: {
useMaxWidth: false, /* 配合外部 div 的 overflow-x 实现可滑动,而不被强行压扁 */
htmlLabels: true,
curve: 'basis',
nodeSpacing: 40,
rankSpacing: 40
}
});
</script>
</body>
</html>

View File

@@ -0,0 +1,176 @@
<mxfile host="Electron" modified="2024-03-05T10:00:00.000Z" agent="Mozilla/5.0" version="24.0.0" type="device">
<diagram id="sgclaw_arch" name="sgClaw Architecture">
<mxGraphModel dx="1400" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="900" background="#F4F7F9" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<!-- Swimlanes (Subgraphs) -->
<mxCell id="browser_bg" value="🌐 浏览器侧 (P4+P2)" style="swimlane;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;strokeWidth=2;fontStyle=1;startSize=36;rounded=1;shadow=1;" vertex="1" parent="1">
<mxGeometry x="160" y="40" width="280" height="460" as="geometry" />
</mxCell>
<mxCell id="sgclaw_bg" value="⚙️ sgClaw AI 引擎进程 (P1a+P1b)" style="swimlane;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;strokeWidth=2;fontStyle=1;startSize=36;rounded=1;shadow=1;" vertex="1" parent="1">
<mxGeometry x="580" y="40" width="280" height="560" as="geometry" />
</mxCell>
<mxCell id="ext_bg" value="☁️ 远端服务与库 (P3)" style="swimlane;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#cbd5e1;strokeWidth=2;fontStyle=1;startSize=36;dashed=1;rounded=1;shadow=1;" vertex="1" parent="1">
<mxGeometry x="980" y="40" width="280" height="560" as="geometry" />
</mxCell>
<!-- Node: User -->
<mxCell id="user" value="👤 用户操作" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fef9c3;strokeColor=#eab308;strokeWidth=2;fontStyle=1;shadow=1;" vertex="1" parent="1">
<mxGeometry x="20" y="100" width="100" height="60" as="geometry" />
</mxCell>
<!-- Nodes in BROWSER -->
<mxCell id="sidepanel" value="UI: AI 面板 (Vue)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eff6ff;strokeColor=#2563eb;strokeWidth=2;fontStyle=1;" vertex="1" parent="browser_bg">
<mxGeometry x="40" y="60" width="200" height="60" as="geometry" />
</mxCell>
<mxCell id="processhost" value="Host: 进程守护" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eff6ff;strokeColor=#2563eb;strokeWidth=2;fontStyle=1;" vertex="1" parent="browser_bg">
<mxGeometry x="40" y="160" width="200" height="60" as="geometry" />
</mxCell>
<mxCell id="pipelistener" value="IPC: Pipe 监听" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eff6ff;strokeColor=#2563eb;strokeWidth=2;fontStyle=1;" vertex="1" parent="browser_bg">
<mxGeometry x="40" y="260" width="200" height="60" as="geometry" />
</mxCell>
<mxCell id="cmd" value="Action: CDP 操纵指令" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#eff6ff;strokeColor=#2563eb;strokeWidth=2;fontStyle=1;" vertex="1" parent="browser_bg">
<mxGeometry x="40" y="360" width="200" height="60" as="geometry" />
</mxCell>
<!-- Nodes in SGCLAW -->
<mxCell id="runtime" value="Brain: ReAct 核心循环" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff7ed;strokeColor=#ea580c;strokeWidth=2;fontStyle=1;" vertex="1" parent="sgclaw_bg">
<mxGeometry x="40" y="60" width="200" height="60" as="geometry" />
</mxCell>
<mxCell id="browsertool" value="Tool: Action 封装" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff7ed;strokeColor=#ea580c;strokeWidth=2;fontStyle=1;" vertex="1" parent="sgclaw_bg">
<mxGeometry x="40" y="160" width="200" height="60" as="geometry" />
</mxCell>
<mxCell id="piperw" value="Core: Pipe 双向读写" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff7ed;strokeColor=#ea580c;strokeWidth=2;fontStyle=1;" vertex="1" parent="sgclaw_bg">
<mxGeometry x="40" y="260" width="200" height="60" as="geometry" />
</mxCell>
<mxCell id="memory" value="Mem: 记忆层 (SQLite)" style="shape=cylinder3;boundedLbl=1;backgroundOutline=1;size=10;whiteSpace=wrap;html=1;fillColor=#fff7ed;strokeColor=#ea580c;strokeWidth=2;fontStyle=1;" vertex="1" parent="sgclaw_bg">
<mxGeometry x="40" y="360" width="200" height="60" as="geometry" />
</mxCell>
<mxCell id="skillloader" value="Sandbox: 沙箱加载验签" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff7ed;strokeColor=#ea580c;strokeWidth=2;fontStyle=1;" vertex="1" parent="sgclaw_bg">
<mxGeometry x="40" y="460" width="200" height="60" as="geometry" />
</mxCell>
<!-- Nodes in EXT -->
<mxCell id="llm1" value="LLM: Minimax-M2.5 API" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f0fdf4;strokeColor=#16a34a;strokeWidth=2;fontStyle=1;" vertex="1" parent="ext_bg">
<mxGeometry x="40" y="60" width="200" height="60" as="geometry" />
</mxCell>
<mxCell id="skilldb" value="Skill: 黄金/泛化技能库" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#f0fdf4;strokeColor=#16a34a;strokeWidth=2;fontStyle=1;size=15;" vertex="1" parent="ext_bg">
<mxGeometry x="30" y="460" width="220" height="60" as="geometry" />
</mxCell>
<!-- Edges -->
<!-- User -> SidePanel -->
<mxCell id="e_user_ui" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#64748b;strokeWidth=2;" edge="1" parent="1" source="user" target="sidepanel">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- SidePanel <-> ProcessHost -->
<mxCell id="e_ui_host" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;startArrow=classic;endArrow=classic;strokeColor=#64748b;strokeWidth=2;" edge="1" parent="1" source="sidepanel" target="processhost">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_ui_host_l" value="Window IPC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fillColor=#ffffff;fontStyle=1;fontColor=#475569;" vertex="1" connectable="0" parent="e_ui_host">
<mxGeometry x="-0.1" y="0" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<!-- ProcessHost -> PipeListener -->
<mxCell id="e_host_listener" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#64748b;strokeWidth=2;" edge="1" parent="1" source="processhost" target="pipelistener">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- PipeListener -.-> Cmd -->
<mxCell id="e_listener_cmd" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;strokeColor=#64748b;strokeWidth=2;" edge="1" parent="1" source="pipelistener" target="cmd">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_listener_cmd_l" value="复用" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fillColor=#ffffff;fontStyle=1;fontColor=#475569;" vertex="1" connectable="0" parent="e_listener_cmd">
<mxGeometry x="-0.1" y="0" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<!-- Internal SGCLAW Edges -->
<!-- PipeRW <-> BrowserTool -->
<mxCell id="e_piperw_tool" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;startArrow=classic;endArrow=classic;strokeColor=#64748b;strokeWidth=2;" edge="1" parent="1" source="piperw" target="browsertool">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- BrowserTool <-> Runtime -->
<mxCell id="e_tool_runtime" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;startArrow=classic;endArrow=classic;strokeColor=#64748b;strokeWidth=2;" edge="1" parent="1" source="browsertool" target="runtime">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- Runtime -> Memory (Routed around left side) -->
<mxCell id="e_runtime_mem" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#64748b;strokeWidth=2;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="runtime" target="memory">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="600" y="130" />
<mxPoint x="600" y="430" />
</Array>
</mxGeometry>
</mxCell>
<!-- Runtime -> SkillLoader (Routed around right side) -->
<mxCell id="e_runtime_skill" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#64748b;strokeWidth=2;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="runtime" target="skillloader">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="840" y="130" />
<mxPoint x="840" y="530" />
</Array>
</mxGeometry>
</mxCell>
<!-- Cross-Boundary Edges -->
<!-- PipeListener == PipeRW (Critical Path) -->
<mxCell id="e_critical" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;endArrow=none;strokeColor=#ef4444;strokeWidth=4;" edge="1" parent="1" source="pipelistener" target="piperw">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_critical_l" value="⚡ 高风险卡点 (STDIO 双工流)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fillColor=#fef2f2;strokeColor=#fca5a5;fontColor=#991b1b;fontStyle=1;spacing=4;rounded=1;" vertex="1" connectable="0" parent="e_critical">
<mxGeometry x="0" y="0" relative="1" as="geometry">
<mxPoint y="-15" as="offset" />
</mxGeometry>
</mxCell>
<!-- Runtime <-> LLM1 -->
<mxCell id="e_runtime_llm" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;startArrow=classic;endArrow=classic;strokeColor=#64748b;strokeWidth=2;" edge="1" parent="1" source="runtime" target="llm1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_runtime_llm_l" value="提示词组装" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fillColor=#ffffff;fontStyle=1;fontColor=#475569;" vertex="1" connectable="0" parent="e_runtime_llm">
<mxGeometry x="0" y="0" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<!-- SkillLoader -> SkillDB -->
<mxCell id="e_skill_db" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#64748b;strokeWidth=2;" edge="1" parent="1" source="skillloader" target="skilldb">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e_skill_db_l" value="签名挂载调用" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fillColor=#ffffff;fontStyle=1;fontColor=#475569;" vertex="1" connectable="0" parent="e_skill_db">
<mxGeometry x="0" y="0" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<!-- BrowserTool -.-> PipeListener (Callback) -->
<mxCell id="e_tool_cb" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;strokeColor=#2563eb;strokeWidth=2;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="browsertool" target="pipelistener">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="540" y="230" />
<mxPoint x="540" y="315" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="e_tool_cb_l" value="执行结果回调" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fillColor=#eff6ff;fontColor=#1e3a8a;fontStyle=1;" vertex="1" connectable="0" parent="e_tool_cb">
<mxGeometry x="-0.15" y="0" relative="1" as="geometry">
<mxPoint x="10" y="-12" as="offset" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,48 @@
graph LR
User(["👤 用户操作"])
subgraph BROWSER["🌐 浏览器侧 (P4+P2)"]
direction TB
SidePanel("UI: AI 面板 (Vue)")
ProcessHost("Host: 进程守护")
PipeListener("IPC: Pipe 监听")
Cmd["Action: CDP 操纵指令"]
SidePanel <-->|"Window IPC"| ProcessHost
ProcessHost --> PipeListener
PipeListener -.->|"复用"| Cmd
end
subgraph SGCLAW["⚙️ sgClaw AI 引擎进程 (P1a+P1b)"]
direction TB
PipeRW("Core: Pipe 双向读写")
BrowserTool("Tool: Action 封装")
Runtime("Brain: ReAct 核心循环")
Memory[("Mem: 记忆层 (SQLite)")]
SkillLoader("Sandbox: 沙箱加载验签")
PipeRW <--> BrowserTool
BrowserTool <--> Runtime
Runtime --> Memory
Runtime --> SkillLoader
end
subgraph EXT["☁️ 远端服务与库 (P3)"]
direction TB
LLM1("LLM: Minimax-M2.5 API")
SkillDB[/"Skill: 黄金/泛化技能库"/]
end
User --> SidePanel
PipeListener == "⚡ 高风险卡点 (STDIO 双工流)" === PipeRW
Runtime <-->|"提示词组装"| LLM1
SkillLoader -->|"签名挂载调用"| SkillDB
BrowserTool -.->|"执行结果回调"| PipeListener
classDef p1 fill:#fff7ed,stroke:#ea580c,stroke-width:2px
classDef p2 fill:#eff6ff,stroke:#2563eb,stroke-width:2px
classDef p3 fill:#f0fdf4,stroke:#16a34a,stroke-width:2px
class PipeRW,BrowserTool,Runtime,Memory,SkillLoader p1
class SidePanel,ProcessHost,PipeListener,Cmd p2
class LLM1,SkillDB p3

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 342 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 37 KiB

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,32 @@
graph TB
subgraph W1["📌 W1 独立开发期 (Day 1-3)"]
direction LR
P1a["P1a 协议层构建"]
P2["P2 内核扩展开发"]
P1b["P1b ReAct框架"]
P3["P3 核心用例设计"]
P4["P4 面板UI开发"]
P1a ~~~ P2 ~~~ P1b ~~~ P3 ~~~ P4
end
CRIT{{"⚠️ W1 末期关键联调 (Day 4-5)\n=====================\nP1a 🤝 P2 联合打通 STDIO Pipe\n(如果阻塞,整个后续测试将无法进行)"}}
subgraph W2["🚀 W2 集成与验收期 (Day 6-10)"]
direction TB
INT1["P1b 🤝 P3\n沙箱能力与用例装载测试"]
INT2["P1a 🤝 P1b\n引擎接入浏览器动作测试"]
INT3["P2 🤝 P4\n前后端 IPC 接口贯通测试"]
TEST["🎯 全链路 E2E 测试\n跑通首批 6 个核心业务场景"]
SHIP["📦 P4 打包发版"]
INT1 --> TEST
INT2 --> TEST
INT3 --> TEST
TEST --> SHIP
end
W1 --> CRIT
CRIT -->|打通后| W2
classDef crit fill:#fef2f2,stroke:#ef4444,stroke-width:2px,color:#991b1b
class CRIT crit

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 23 KiB

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,13 @@
flowchart LR
Input(["💬 用户指令"])
Router{"🔍 引擎意图分析\n语义匹配技能库"}
Simple["⚡ 简单路径\nSingle-Skill Direct\n无 LLM 调用"]
Complex["🧠 复杂路径\nReAct Planning Loop\n动态拆解 + 多轮 LLM"]
Input --> Router
Router -->|"Skill 命中率高\n单一、明确意图"| Simple
Router -->|"无匹配 Skill\n模糊或组合目标"| Complex
style Simple fill:#eff6ff,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a
style Complex fill:#fff7ed,stroke:#f97316,stroke-width:2px,color:#7c2d12
style Router fill:#faf5ff,stroke:#a855f7,stroke-width:2px,color:#6b21a8

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 53 KiB

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,23 @@
sequenceDiagram
autonumber
actor U as 用户
participant UI as UI面板(P4)
participant Core as 引擎(P1a+P1b)
participant Sandbox as Skill沙箱(Deno)
participant Browser as 浏览器内核(P2)
U->>UI: "提取当前页面表格"
UI->>Core: 发送执行请求(含页面上下文)
rect rgb(239, 246, 255)
Note over Core,Sandbox: 语义匹配:命中 TableExtract_Skill跳过大模型
Core->>Sandbox: 加载并 Ed25519 验签 TableExtract_Skill
Sandbox-->>Core: 验签通过JS 沙箱就绪
end
Sandbox->>Browser: 下发 BrowserActionCDP 获取 DOM 结构
Browser-->>Sandbox: 返回页面 HTML / 表格节点
Sandbox-->>Core: Skill 执行完毕,返回结构化数据
Core-->>UI: 格式化结果JSON → 可读表格)
UI-->>U: 界面展示提取结果

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 25 KiB

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
sequenceDiagram
autonumber
actor U as 用户
participant UI as UI面板(P4)
participant Core as 引擎(P1a+P1b)
participant LLM as 大模型底座
participant Memory as 记忆系统(L0/L1/L2)
participant Sandbox as Skill沙箱(Deno)
participant Browser as 浏览器内核(P2)
U->>UI: "对比 A 和 B 公司最新财报"
UI->>Core: 发送复杂任务请求
rect rgb(255, 247, 237)
Note over Core,LLM: Think 阶段:大模型拆解目标
Core->>LLM: 意图分析 + 生成执行计划 (Plan)
LLM-->>Core: 返回步骤列表:① 搜 A 财报 → ② 搜 B 财报 → ③ 对比汇总
end
rect rgb(254, 242, 242)
Note over Core,Browser: ReAct 循环:逐步执行,每步评估
loop 针对每个拆解步骤Step 1..N
Core->>Sandbox: Act加载当前步骤对应的 Skill
Sandbox->>Browser: 执行 BrowserAction操作页面
Browser-->>Sandbox: 返回页面反馈Observation
Sandbox-->>Core: Skill 执行结果
Core->>Memory: 写入 L1 短期记忆RingBuffer
Core->>LLM: Critic 评估:当前步骤是否成功?
LLM-->>Core: 决断:继续下一步 / 纠错重试
end
end
Core->>LLM: 汇总所有步骤结果,生成最终报告
LLM-->>Core: 输出多维度财报对比分析
Core->>Memory: 将成功路径写入 L2 长期记忆SQLite
Core-->>UI: 返回完整分析报告
UI-->>U: 界面展示多维度对比结果

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,26 @@
{
"theme": "base",
"themeVariables": {
"fontFamily": "PingFang SC, Microsoft YaHei, Arial, sans-serif",
"fontSize": "15px",
"primaryColor": "#ffffff",
"primaryTextColor": "#1e293b",
"primaryBorderColor": "#cbd5e1",
"lineColor": "#64748b",
"secondaryColor": "#f1f5f9",
"tertiaryColor": "#f8fafc"
},
"flowchart": {
"useMaxWidth": false,
"htmlLabels": true,
"curve": "basis",
"nodeSpacing": 50,
"rankSpacing": 50
},
"sequence": {
"useMaxWidth": false,
"actorMargin": 50,
"messageMargin": 30,
"mirrorActors": false
}
}

View File

@@ -0,0 +1,3 @@
{
"args": ["--no-sandbox", "--disable-setuid-sandbox"]
}

546
docs/协作时间表.md Normal file
View File

@@ -0,0 +1,546 @@
# sgClaw 项目协作时间表
> **💡 提示**:本文档包含完整的甘特图、依赖关系图和详细时间表。建议使用支持 Mermaid 的 Markdown 查看器(如 VS Code、Typora、GitHub查看。
## 快速导航
- [📊 甘特图](#甘特图)
- [🔗 依赖关系图](#依赖关系图)
- [📅 每日详细里程碑](#二每日详细里程碑按人员)
- [🔌 关键接口对接清单](#三关键接口对接清单)
- [📢 每日站会议程](#四每日站会议程)
- [⚠️ 风险预案](#五风险预案)
- [✅ 交付物 Checklist](#六交付物-checklist)
---
## 📊 甘特图
![甘特图 1](./archive/领导演示资料/docs-figures/协作甘特图.svg)
## 可视化图表
### 关键路径
```
Day 1-2 ━━━━━━━━━━━━━━━━━━━━━━ 环境搭建(并行)
Day 3 ━━━━━┻━━━━━━━━━━━━━━━━━ P1a Pipe 协议开发 ⭐
Day 4-5 ━━━┻━━━━━━━━━━━━━━━━━ P1a + P2 联调 Pipe ⭐⭐⭐
┃ (关键路径,阻塞所有人)
【W1 里程碑】链路打通
Day 6 ━━━━━┻━━━━━━━━━━━━━━━━━ 三组并行集成:
├─ P1a + P1b (Runtime)
├─ P1b + P3 (Skill)
└─ P2 + P4 (UI)
Day 7 ━━━━━┫ 安全策略 + AI 翻译
Day 8-9 ━━━┻━━━━━━━━━━━━━━━━━ 全员 E2E 测试
Day 10 ━━━━▼━━━━━━━━━━━━━━━━━ P4 打包发布
【W2 里程碑】正式发布
```
### 并行度分析
```
Day 1-2: ████████████████████ 5 人并行(环境搭建)
Day 3: ████ P1a 单人关键路径
Day 4-5: ████████ P1a+P2 双人关键路径 ⭐
Day 6-7: ████████████████ 4 人并行P3 独立)
Day 8-9: ████████████████████ 5 人并行E2E 测试)
Day 10: ████ P4 单人发布
关键瓶颈Day 4-5P1a + P2 联调)
```
---
## 🔗 依赖关系图
```mermaid
graph TD
A[Day 1-2: 环境搭建] --> B[Day 3: P1a Pipe 协议]
B --> C[Day 4-5: P1a+P2 联调 Pipe ⭐]
C --> D[Day 5 晚: W1 里程碑]
D --> E1[Day 6: P1a+P1b 集成]
D --> E2[Day 6: P1b+P3 Skill]
D --> E3[Day 6: P2+P4 UI]
E1 --> F[Day 7: 安全+AI]
E2 --> F
E3 --> F
F --> G[Day 8-9: E2E 测试]
G --> H[Day 10: P4 打包发布]
style C fill:#ff6b6b,stroke:#c92a2a,color:#fff
style D fill:#51cf66,stroke:#2f9e44,color:#fff
style H fill:#51cf66,stroke:#2f9e44,color:#fff
```
---
## 一、关键依赖关系图
```
Day 1-2: 环境搭建(所有人独立)
Day 3-5: 【关键路径】P1a + P2 联调打通 Pipe
↓ ↓
Day 6-7: P1a+P1b 集成 P2+P4 UI 对接
↓ ↓
P1b+P3 Skill 加载测试
Day 8-9: 全员 E2E 测试
Day 10: P4 发布打包
```
---
## 二、每日详细里程碑(按人员)
### Day 1 - 环境搭建日(并行,无依赖)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a赵义仑** | 搭建 Rust 环境,创建项目骨架 | `sgClaw/src/main.rs` + Cargo.toml | `cargo build` 成功 |
| **P1b** | 同 P1a克隆仓库 | 环境就绪 | `cargo test` 通过 |
| **P2** | 搭建 Chromium 编译环境 | depot_tools + gn + ninja | 能编译出 Chrome |
| **P3** | 调研 agent-vue 现有场景 | 场景清单 Excel400+ 条) | 分类完成:表单/审批/采集/同步/巡检 |
| **P4** | 搭建 Vue 开发环境 | npm install 完成 | `npm run dev` 启动 |
**晚上站会**:同步进度,确认明天 P1a + P2 联调计划
---
### Day 2 - 基础框架日(并行,开始有少量依赖)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a** | 实现 Pipe Protocol 基础结构 | `pipe/protocol.rs`, `pipe/reader.rs`, `pipe/writer.rs` | 单元测试:能序列化/反序列化 JSON Line |
| **P1b** | 设计 Skill 元数据格式 | `skill/metadata.rs`, `schema/skill-metadata.json` | JSON Schema 验证通过 |
| **P2** | 实现 SgClawProcessHost 基础框架 | `sgclaw_process_host.h`, `.cc` | 能启动 dummy 进程(`echo "hello"` |
| **P3** | 精选 10 个代表性场景 | 10 个场景的业务流程文档 | 覆盖 5 种模式(表单/审批/采集/同步/巡检) |
| **P4** | 设计 Side Panel UI 原型 | Figma/手绘原型 | 产品经理审核通过 |
**晚上站会**P1a 和 P2 确认明天联调细节JSON 格式、错误码)
---
### Day 3 - 联调开始日P1a + P2 关键路径)
| 角色 | 任务 | 产出物 | 验收标准 | 协作对象 |
|-----|------|--------|---------|---------|
| **P1a** ⭐ | 实现 STDIN 读取、STDOUT 写入 | Pipe 双向通信代码 | 能收发 JSON 消息 | **→ P2** |
| **P1b** | 开始 SkillLoader 开发 | `skill/loader.rs` 初版 | 能扫描目录、读取 .js 文件 | - |
| **P2** ⭐ | 实现 PipeListener 异步读取 | `pipe_listener.cc` | 能从 STDOUT 读取 JSON Line | **→ P1a** |
| **P3** | 手工编写前 3 个黄金样本 | 3 个 Skill.js 文件 | 代码能手动执行mock browserAction | - |
| **P4** | 开发 Side Panel UI 框架 | `AgentControlPanel.vue` 初版 | 能渲染基本界面 | - |
**下午联调**P1a + P2
1. P1a 启动 Rust 进程,监听 STDIN
2. P2 用 C++ 创建子进程,传递 fd
3. 互相发送 JSON 消息:`{"action":"ping"}``{"status":"pong"}`
**验收标准**:双向通信成功,能在 Chrome 控制台看到 Rust 日志
---
### Day 4 - 核心功能日P1a + P2 继续打通)
| 角色 | 任务 | 产出物 | 验收标准 | 协作对象 |
|-----|------|--------|---------|---------|
| **P1a** ⭐ | 实现 BrowserPipeTool3 个 Action | `tool/browser_pipe.rs` | 支持 click / type / navigate | **→ P2** |
| **P1b** | SkillLoader 签名验证 | `skill/signature.rs` | Ed25519 验证通过/失败 | - |
| **P2** ⭐ | CommandRouter 对接 | `sgclaw_process_host.cc` 集成 CommandRouter | 能调用现有 70+ 命令 | **→ P1a** |
| **P3** | 手工编写剩余 7 个黄金样本 | 10 个 Skill.js 全部完成 | 每个都有详细注释 | - |
| **P4** | 开发 Skill 管理后台 | `SkillManager.vue` | 能列表显示 Skill | **→ P2**IPC 接口确认)|
**下午联调**P1a + P2
1. P1a 发送 `{"action":"click", "params":{"selector":"#btn"}}`
2. P2 接收后调用 CommandRouter → CdpBridge → Chrome DevTools Protocol
3. 浏览器真实执行点击
**验收标准**:能用 Rust 控制浏览器点击按钮
---
### Day 5 - W1 里程碑Pipe 全链路打通)
| 角色 | 任务 | 产出物 | 验收标准 | 协作对象 |
|-----|------|--------|---------|---------|
| **P1a** ⭐ | 完善 BrowserPipeTool15 个 Action | 完整工具 | 所有 Action 测试通过 | **→ P2** |
| **P1b** | Memory 模块开发 | `memory/ring_buffer.rs`, `memory/sqlite_store.rs` | Ring Buffer 存取、SQLite 初始化 | - |
| **P2** ⭐ | MAC 白名单检查 | `mac_whitelist_check.cc`, `rules.json` | 白名单校验生效 | **→ P1a** |
| **P3** | 设计 System Prompt | `prompts/translation-system.txt` | 在 10 个样本上测试准确率 | - |
| **P4** | UI 集成测试 | Vue ↔ C++ IPC 调通 | 能从 UI 启动/停止 sgClaw | **→ P2** |
**下午全体演示**W1 里程碑验收):
1. P4 打开 Side Panel输入"点击登录按钮"
2. Vue → C++ → Rust → 大模型mock→ Rust → C++ → 浏览器
3. 浏览器真实执行操作
**验收标准****LLM → Pipe → Browser 链路全通**
---
### Day 6 - 并行集成日(三组同时进行)
#### 组 1P1a + P1b集成 AgentRuntime
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a** | 提供 BrowserPipeTool 给 P1b | 完整 Tool trait 实现 | P1b 能注册工具 |
| **P1b** | AgentRuntime 集成 | `agent/runtime.rs` | ZeroClaw ReAct Loop 运行 |
**下午联调**
- P1b 创建 `AgentRuntime`,注册 `BrowserPipeTool`
- 模拟 LLM 输出:`{"tool":"browser","action":"click","params":{...}}`
- 验证工具调用成功
#### 组 2P1b + P3Skill 加载测试)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1b** | SkillLoader 完善 | JS 沙箱执行 | 能执行 Skill.js |
| **P3** | 10 个 Skill 加签名 | 签名完成的 Skill | 验证通过 |
**下午联调**
- P1b 扫描 `skills/` 目录
- 加载 P3 的 10 个 Skill
- 执行一个 Skill调用 `browserAction`
#### 组 3P2 + P4UI 对接)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P2** | 暴露 IPC 接口给 P4 | `window.superrpa.sgclaw.*` | P4 能调用 |
| **P4** | 完善 UI + Skill 后台 | 两个 Vue 组件 | 能管理 Skill 启用/禁用 |
**下午联调**
- P4 调用 `window.superrpa.sgclaw.listSkills()`
- P2 返回 Skill 列表
- P4 在界面上显示
---
### Day 7 - 安全与优化日
| 角色 | 任务 | 产出物 | 验收标准 | 协作对象 |
|-----|------|--------|---------|---------|
| **P1a** | MAC Policy 集成到 BrowserPipeTool | 安全策略生效 | 非白名单域名被拦截 | **→ P2**(确认拦截反馈)|
| **P1b** | Critic 评估器 | `agent/critic.rs` | 能判断成功/失败/重试 | - |
| **P2** | Human-in-the-loop 确认弹窗 | C++ 对话框 | 敏感操作弹窗确认 | **→ P1a**(定义敏感操作列表)|
| **P3** | 批量 AI 翻译(第 1 批) | 100 个 Skill 候选 | 翻译准确率 >90% | - |
| **P4** | 测试框架搭建 | Jest + Puppeteer 配置 | 能运行单元测试 | - |
**下午安全测试**
- 尝试访问非白名单域名(应被拦截)
- 尝试执行敏感操作(应弹窗确认)
- 连续失败 10 次触发熔断
---
### Day 8 - E2E 测试日(全员参与)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a** | 修复 Pipe 通信 bug | 稳定版本 | 无消息丢失 |
| **P1b** | 修复 Memory 存取 bug | 稳定版本 | SQLite 读写正常 |
| **P2** | 修复浏览器端 bug | 稳定版本 | 进程不崩溃 |
| **P3** | 批量 AI 翻译(第 2-4 批) | 400 个 Skill 全部完成 | 自动检查通过率 >85% |
| **P4** | E2E 测试脚本 | 6 个业务场景测试 | 全部通过 |
**E2E 测试场景**
1. 财务合规:导出 ERP 月度报表
2. OA 审批:批量审批 10 个单据
3. 风险监测:巡检风险指标
4. 人资社保:办理社保增减员
5. 营销数据:跨平台采集数据
6. 跨系统同步ERP → 财务数据同步
**验收标准**:每个场景端到端运行成功,无崩溃
---
### Day 9 - 稳定性测试日
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a** | 性能优化 | Pipe 通信延迟 <10ms | 性能达标 |
| **P1b** | Memory 压力测试 | L2 存 1000 条记录 | 无内存泄漏 |
| **P2** | 长时间运行测试 | 24 小时稳定性 | 进程不崩溃 |
| **P3** | Skill 质量抽检 | 抽检 20 个 Skill | 人工验证通过 |
| **P4** | 集成测试 + 打包预演 | 测试报告 | 覆盖率 >70% |
**压力测试**
- 连续执行 100 次操作
- 8GB 内存限制下运行
- 监控内存占用sgClaw 应 <10MB
---
### Day 10 - 发布日W2 里程碑)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a** | 代码审查 + 交付 | 完整 Rust 代码 | P2 审查通过 |
| **P1b** | 代码审查 + 交付 | 完整 Rust 代码 | P1a 审查通过 |
| **P2** | 代码审查 + 交付 | 完整 C++ 代码 | P1a 审查通过 |
| **P3** | Skill 仓库交付 | 400+ Skill + 文档 | P1b 审查通过 |
| **P4** | **打包发布** | `.deb` + `.exe` 安装包 | 两平台安装成功 |
**发布物清单**
- `sgclaw-v1.0.0-kylin-v10-amd64.deb` (~456MB)
- `sgclaw-v1.0.0-windows-x64.exe` (~460MB)
- `CHANGELOG.md`
- `INSTALL.md`
- 演示视频6 个场景)
---
## 三、关键接口对接清单
### 1. P1a ↔ P2 接口(最重要)
**协议**JSON Line over STDIO Pipe
**Request 示例**C++ → Rust:
```json
{
"sequence_id": 1,
"action": "click",
"params": {
"selector": "#submit-button",
"button": "left"
},
"timestamp": 1709499600000
}
```
**Response 示例**Rust → C++:
```json
{
"sequence_id": 1,
"status": "success",
"result": {
"clicked": true
},
"error": null,
"timestamp": 1709499601000
}
```
**对接时间**Day 3-5关键路径
**验收标准**
- Day 3能互相发送 ping/pong
- Day 4能调用 3 个 Actionclick/type/navigate
- Day 5能调用全部 15 个 Action
---
### 2. P1a ↔ P1b 接口
**模块依赖**
- P1b 的 `AgentRuntime` 依赖 P1a 的 `BrowserPipeTool`
**接口代码**
```rust
// P1a 提供
pub struct BrowserPipeTool {
pipe_writer: PipeWriter,
mac_policy: MacPolicy,
sequence_id: AtomicU64,
}
impl Tool for BrowserPipeTool {
async fn execute(&self, input: &str) -> Result<String>;
}
// P1b 使用
let browser_tool = BrowserPipeTool::new(...);
agent_runtime.register_tool(Box::new(browser_tool));
```
**对接时间**Day 6
**验收标准**
- P1b 能注册 P1a 的工具
- Agent 能调用浏览器操作
---
### 3. P1b ↔ P3 接口
**Skill 元数据规范**
```javascript
/**
* @skill erp-monthly-report
* @version 1.0.0
* @domains erp.example.com
* @params { month: string, format: enum }
* @signature <ed25519_base64>
*/
async function execute(params, browserAction) {
await browserAction('navigate', {...});
await browserAction('click', {...});
return { success: true };
}
```
**BrowserAction API**
```javascript
await browserAction(action, params)
// 返回 Promise<result>
```
**对接时间**Day 6-7
**验收标准**
- P1b 能扫描并加载 P3 的 Skill
- 签名验证通过
- Skill 能正常执行
---
### 4. P2 ↔ P4 接口
**FunctionsUI IPC**Vue ↔ C++:
```javascript
// P4 调用Vue
window.superrpa.sgclaw.start()
window.superrpa.sgclaw.stop()
window.superrpa.sgclaw.sendCommand(text)
window.superrpa.sgclaw.listSkills()
window.superrpa.sgclaw.toggleSkill(skillId, enabled)
// P2 回调C++ → Vue
window.superrpa.sgclaw.onStatusChange((status) => { ... })
window.superrpa.sgclaw.onLog((log) => { ... })
```
**对接时间**Day 4-6
**验收标准**
- P4 能启动/停止 sgClaw 进程
- P4 能接收日志更新
- P4 能管理 Skill 列表
---
## 四、每日站会议程
**时间**:每天 10:0015 分钟
**Day 1-2 站会重点**:环境搭建进度
**Day 3-5 站会重点**(关键路径):
- P1a + P2 联调进度
- 遇到的技术问题
- 是否需要其他人支援
**Day 6-7 站会重点**
- 三组并行集成进度
- 接口冲突解决
- 安全测试结果
**Day 8-9 站会重点**
- E2E 测试通过率
- Bug 修复优先级
- 性能优化方向
**Day 10 站会**
- 发布 Checklist 确认
- 演示视频录制分工
---
## 五、风险预案
### 风险 1P1a + P2 联调卡住Day 3-5
**影响**:阻塞所有后续工作(极高风险)
**预案**
- Day 3 晚上如果还没通P1b 暂停自己的工作,全力支援
- Day 4 晚上如果还没通启动降级方案HTTP 替代 Pipe
---
### 风险 2P3 AI 翻译质量不达标Day 7-9
**影响**Skill 不可用(中风险)
**预案**
- 准确率 <80%:人工介入修正 Prompt
- 准确率 <60%:放弃 AI 翻译,只交付 10 个黄金样本
---
### 风险 3银河麒麟适配问题Day 9-10
**影响**:无法打包 .deb中风险
**预案**
- P4 提前在 Day 7 开始真机测试
- 如果 Day 9 还有问题,先发布 Windows 版本
---
## 六、交付物 Checklist
### P1a 交付物Day 10
- [ ] `src/pipe/` 完整代码
- [ ] `src/tool/browser_pipe.rs`
- [ ] `src/security/mac_policy.rs`
- [ ] 单元测试(覆盖率 >70%
- [ ] API 文档Rust Doc
### P1b 交付物Day 10
- [ ] `src/skill/` 完整代码
- [ ] `src/memory/` 完整代码
- [ ] `src/agent/` 完整代码
- [ ] 单元测试(覆盖率 >70%
- [ ] Memory 压力测试报告
### P2 交付物Day 10
- [ ] `sgclaw_process_host.*`
- [ ] `pipe_listener.*`
- [ ] `mac_whitelist_check.*`
- [ ] `rules.json`
- [ ] C++ 单元测试
- [ ] 接口文档
### P3 交付物Day 10
- [ ] 10-15 个黄金样本
- [ ] 400+ AI 生成 Skill
- [ ] `prompts/translation-system.txt`
- [ ] `README.md`Skill 开发指南)
- [ ] 签名工具脚本
### P4 交付物Day 10
- [ ] `AgentControlPanel.vue`
- [ ] `SkillManager.vue`
- [ ] E2E 测试脚本6 个场景)
- [ ] 测试报告(覆盖率 >70%
- [ ] `.deb` 安装包
- [ ] `.exe` 安装包
- [ ] `CHANGELOG.md`
- [ ] `INSTALL.md`
---
**文档版本**v1.0
**最后更新**2026-03-04
**维护者**:项目经理

View File

@@ -0,0 +1,622 @@
# sgClaw 项目协作时间表
> **💡 提示**:本文档包含完整的甘特图、依赖关系图和详细时间表。建议使用支持 Mermaid 的 Markdown 查看器(如 VS Code、Typora、GitHub查看。
## 快速导航
- [📊 甘特图](#甘特图)
- [🔗 依赖关系图](#依赖关系图)
- [📅 每日详细里程碑](#二每日详细里程碑按人员)
- [🔌 关键接口对接清单](#三关键接口对接清单)
- [📢 每日站会议程](#四每日站会议程)
- [⚠️ 风险预案](#五风险预案)
- [✅ 交付物 Checklist](#六交付物-checklist)
---
## 📊 甘特图
![甘特图 1](./archive/领导演示资料/docs-figures/协作甘特图.svg)
<details>
<summary>📋 点击查看 Mermaid 源码</summary>
```mermaid
gantt
title sgClaw 2周开发计划关键路径P1a+P2
dateFormat YYYY-MM-DD
axisFormat Day %d
section 关键路径⭐
P1a环境搭建 :p1a1, 2026-03-04, 2d
P1a Pipe协议开发 :crit, p1a2, after p1a1, 1d
P1a+P2联调Pipe通信 :crit, p1a3, after p1a2, 2d
P1a完善15个Action :crit, p1a4, after p1a3, 1d
W1里程碑演示 :milestone, m1, after p1a4, 0d
P1a+P1b集成Runtime :p1a5, after p1a4, 1d
P1a MAC安全策略 :p1a6, after p1a5, 1d
P1a bug修复 :p1a7, after p1a6, 2d
P1a代码审查交付 :milestone, m2, after p1a7, 1d
section P2浏览器对接
P2环境搭建 :p2a, 2026-03-04, 2d
P2 ProcessHost框架 :p2b, after p2a, 1d
P2+P1a联调Pipe :crit, p2c, after p2b, 2d
P2 CommandRouter对接 :p2d, after p2c, 1d
P2 MAC白名单 :p2e, after p2d, 1d
P2+P4 UI对接 :p2f, after p2e, 1d
P2 bug修复 :p2g, after p2f, 2d
P2交付 :milestone, after p2g, 1d
section P1b业务支持
P1b环境搭建 :p1b1, 2026-03-04, 2d
P1b SkillLoader开发 :p1b2, after p1b1, 3d
P1b Memory开发 :p1b3, after p1b2, 2d
P1b+P1a集成Runtime :p1b4, after p1b3, 1d
P1b+P3 Skill测试 :p1b5, after p1b4, 1d
P1b Critic评估器 :p1b6, after p1b5, 1d
P1b bug修复 :p1b7, after p1b6, 1d
P1b交付 :milestone, after p1b7, 1d
section P3业务技能
P3场景调研 :p3a, 2026-03-04, 1d
P3黄金样本制作 :p3b, after p3a, 3d
P3提示词工程 :p3c, after p3b, 1d
P3 AI批量翻译 :p3d, after p3c, 3d
P3质量抽检 :p3e, after p3d, 2d
P3交付Skill仓库 :milestone, after p3e, 0d
section P4前端发布
P4环境搭建 :p4a, 2026-03-04, 2d
P4 UI原型设计 :p4b, after p4a, 1d
P4 Side Panel开发 :p4c, after p4b, 2d
P4 Skill后台开发 :p4d, after p4c, 1d
P4+P2 IPC对接 :p4e, after p4d, 1d
P4测试框架搭建 :p4f, after p4e, 1d
P4 E2E测试 :p4g, after p4f, 2d
P4打包发布 :milestone, p4h, after p4g, 1d
section 全员里程碑
环境搭建完成 :milestone, after p1a1 p2a p1b1 p3a p4a, 0d
W1里程碑(链路打通) :milestone, m1_all, 2026-03-08, 0d
E2E测试周 :active, e2e, 2026-03-11, 2d
W2里程碑(正式发布) :milestone, m2_all, 2026-03-14, 0d
```
</details>
## 可视化图表
### 关键路径
```
Day 1-2 ━━━━━━━━━━━━━━━━━━━━━━ 环境搭建(并行)
Day 3 ━━━━━┻━━━━━━━━━━━━━━━━━ P1a Pipe 协议开发 ⭐
Day 4-5 ━━━┻━━━━━━━━━━━━━━━━━ P1a + P2 联调 Pipe ⭐⭐⭐
┃ (关键路径,阻塞所有人)
【W1 里程碑】链路打通
Day 6 ━━━━━┻━━━━━━━━━━━━━━━━━ 三组并行集成:
├─ P1a + P1b (Runtime)
├─ P1b + P3 (Skill)
└─ P2 + P4 (UI)
Day 7 ━━━━━┫ 安全策略 + AI 翻译
Day 8-9 ━━━┻━━━━━━━━━━━━━━━━━ 全员 E2E 测试
Day 10 ━━━━▼━━━━━━━━━━━━━━━━━ P4 打包发布
【W2 里程碑】正式发布
```
### 并行度分析
```
Day 1-2: ████████████████████ 5 人并行(环境搭建)
Day 3: ████ P1a 单人关键路径
Day 4-5: ████████ P1a+P2 双人关键路径 ⭐
Day 6-7: ████████████████ 4 人并行P3 独立)
Day 8-9: ████████████████████ 5 人并行E2E 测试)
Day 10: ████ P4 单人发布
关键瓶颈Day 4-5P1a + P2 联调)
```
---
## 🔗 依赖关系图
![依赖关系图 2](https://mermaid.ink/img/Z3JhcGggVEQKICAgIEFbRGF5IDEtMjog546v5aKD5pCt5bu6XSAtLT4gQltEYXkgMzogUDFhIFBpcGUg5Y2P6K6uXQogICAgQiAtLT4gQ1tEYXkgNC01OiBQMWErUDIg6IGU6LCDIFBpcGUg4q2QXQogICAgQyAtLT4gRFtEYXkgNSDmmZo6IFcxIOmHjOeoi+eikV0KICAgIAogICAgRCAtLT4gRTFbRGF5IDY6IFAxYStQMWIg6ZuG5oiQXQogICAgRCAtLT4gRTJbRGF5IDY6IFAxYitQMyBTa2lsbF0KICAgIEQgLS0+IEUzW0RheSA2OiBQMitQNCBVSV0KICAgIAogICAgRTEgLS0+IEZbRGF5IDc6IOWuieWFqCtBSV0KICAgIEUyIC0tPiBGCiAgICBFMyAtLT4gRgogICAgCiAgICBGIC0tPiBHW0RheSA4LTk6IEUyRSDmtYvor5VdCiAgICBHIC0tPiBIW0RheSAxMDogUDQg5omT5YyF5Y+R5biDXQogICAgCiAgICBzdHlsZSBDIGZpbGw6I2ZmNmI2YixzdHJva2U6I2M5MmEyYSxjb2xvcjojZmZmCiAgICBzdHlsZSBEIGZpbGw6IzUxY2Y2NixzdHJva2U6IzJmOWU0NCxjb2xvcjojZmZmCiAgICBzdHlsZSBIIGZpbGw6IzUxY2Y2NixzdHJva2U6IzJmOWU0NCxjb2xvcjojZmZmCg==)
<details>
<summary>📋 点击查看 Mermaid 源码</summary>
```mermaid
graph TD
A[Day 1-2: 环境搭建] --> B[Day 3: P1a Pipe 协议]
B --> C[Day 4-5: P1a+P2 联调 Pipe ⭐]
C --> D[Day 5 晚: W1 里程碑]
D --> E1[Day 6: P1a+P1b 集成]
D --> E2[Day 6: P1b+P3 Skill]
D --> E3[Day 6: P2+P4 UI]
E1 --> F[Day 7: 安全+AI]
E2 --> F
E3 --> F
F --> G[Day 8-9: E2E 测试]
G --> H[Day 10: P4 打包发布]
style C fill:#ff6b6b,stroke:#c92a2a,color:#fff
style D fill:#51cf66,stroke:#2f9e44,color:#fff
style H fill:#51cf66,stroke:#2f9e44,color:#fff
```
</details>
---
## 一、关键依赖关系图
```
Day 1-2: 环境搭建(所有人独立)
Day 3-5: 【关键路径】P1a + P2 联调打通 Pipe
↓ ↓
Day 6-7: P1a+P1b 集成 P2+P4 UI 对接
↓ ↓
P1b+P3 Skill 加载测试
Day 8-9: 全员 E2E 测试
Day 10: P4 发布打包
```
---
## 二、每日详细里程碑(按人员)
### Day 1 - 环境搭建日(并行,无依赖)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a赵义仑** | 搭建 Rust 环境,创建项目骨架 | `sgClaw/src/main.rs` + Cargo.toml | `cargo build` 成功 |
| **P1b** | 同 P1a克隆仓库 | 环境就绪 | `cargo test` 通过 |
| **P2** | 搭建 Chromium 编译环境 | depot_tools + gn + ninja | 能编译出 Chrome |
| **P3** | 调研 agent-vue 现有场景 | 场景清单 Excel400+ 条) | 分类完成:表单/审批/采集/同步/巡检 |
| **P4** | 搭建 Vue 开发环境 | npm install 完成 | `npm run dev` 启动 |
**晚上站会**:同步进度,确认明天 P1a + P2 联调计划
---
### Day 2 - 基础框架日(并行,开始有少量依赖)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a** | 实现 Pipe Protocol 基础结构 | `pipe/protocol.rs`, `pipe/reader.rs`, `pipe/writer.rs` | 单元测试:能序列化/反序列化 JSON Line |
| **P1b** | 设计 Skill 元数据格式 | `skill/metadata.rs`, `schema/skill-metadata.json` | JSON Schema 验证通过 |
| **P2** | 实现 SgClawProcessHost 基础框架 | `sgclaw_process_host.h`, `.cc` | 能启动 dummy 进程(`echo "hello"` |
| **P3** | 精选 10 个代表性场景 | 10 个场景的业务流程文档 | 覆盖 5 种模式(表单/审批/采集/同步/巡检) |
| **P4** | 设计 Side Panel UI 原型 | Figma/手绘原型 | 产品经理审核通过 |
**晚上站会**P1a 和 P2 确认明天联调细节JSON 格式、错误码)
---
### Day 3 - 联调开始日P1a + P2 关键路径)
| 角色 | 任务 | 产出物 | 验收标准 | 协作对象 |
|-----|------|--------|---------|---------|
| **P1a** ⭐ | 实现 STDIN 读取、STDOUT 写入 | Pipe 双向通信代码 | 能收发 JSON 消息 | **→ P2** |
| **P1b** | 开始 SkillLoader 开发 | `skill/loader.rs` 初版 | 能扫描目录、读取 .js 文件 | - |
| **P2** ⭐ | 实现 PipeListener 异步读取 | `pipe_listener.cc` | 能从 STDOUT 读取 JSON Line | **→ P1a** |
| **P3** | 手工编写前 3 个黄金样本 | 3 个 Skill.js 文件 | 代码能手动执行mock browserAction | - |
| **P4** | 开发 Side Panel UI 框架 | `AgentControlPanel.vue` 初版 | 能渲染基本界面 | - |
**下午联调**P1a + P2
1. P1a 启动 Rust 进程,监听 STDIN
2. P2 用 C++ 创建子进程,传递 fd
3. 互相发送 JSON 消息:`{"action":"ping"}``{"status":"pong"}`
**验收标准**:双向通信成功,能在 Chrome 控制台看到 Rust 日志
---
### Day 4 - 核心功能日P1a + P2 继续打通)
| 角色 | 任务 | 产出物 | 验收标准 | 协作对象 |
|-----|------|--------|---------|---------|
| **P1a** ⭐ | 实现 BrowserPipeTool3 个 Action | `tool/browser_pipe.rs` | 支持 click / type / navigate | **→ P2** |
| **P1b** | SkillLoader 签名验证 | `skill/signature.rs` | Ed25519 验证通过/失败 | - |
| **P2** ⭐ | CommandRouter 对接 | `sgclaw_process_host.cc` 集成 CommandRouter | 能调用现有 70+ 命令 | **→ P1a** |
| **P3** | 手工编写剩余 7 个黄金样本 | 10 个 Skill.js 全部完成 | 每个都有详细注释 | - |
| **P4** | 开发 Skill 管理后台 | `SkillManager.vue` | 能列表显示 Skill | **→ P2**IPC 接口确认)|
**下午联调**P1a + P2
1. P1a 发送 `{"action":"click", "params":{"selector":"#btn"}}`
2. P2 接收后调用 CommandRouter → CdpBridge → Chrome DevTools Protocol
3. 浏览器真实执行点击
**验收标准**:能用 Rust 控制浏览器点击按钮
---
### Day 5 - W1 里程碑Pipe 全链路打通)
| 角色 | 任务 | 产出物 | 验收标准 | 协作对象 |
|-----|------|--------|---------|---------|
| **P1a** ⭐ | 完善 BrowserPipeTool15 个 Action | 完整工具 | 所有 Action 测试通过 | **→ P2** |
| **P1b** | Memory 模块开发 | `memory/ring_buffer.rs`, `memory/sqlite_store.rs` | Ring Buffer 存取、SQLite 初始化 | - |
| **P2** ⭐ | MAC 白名单检查 | `mac_whitelist_check.cc`, `rules.json` | 白名单校验生效 | **→ P1a** |
| **P3** | 设计 System Prompt | `prompts/translation-system.txt` | 在 10 个样本上测试准确率 | - |
| **P4** | UI 集成测试 | Vue ↔ C++ IPC 调通 | 能从 UI 启动/停止 sgClaw | **→ P2** |
**下午全体演示**W1 里程碑验收):
1. P4 打开 Side Panel输入"点击登录按钮"
2. Vue → C++ → Rust → 大模型mock→ Rust → C++ → 浏览器
3. 浏览器真实执行操作
**验收标准****LLM → Pipe → Browser 链路全通**
---
### Day 6 - 并行集成日(三组同时进行)
#### 组 1P1a + P1b集成 AgentRuntime
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a** | 提供 BrowserPipeTool 给 P1b | 完整 Tool trait 实现 | P1b 能注册工具 |
| **P1b** | AgentRuntime 集成 | `agent/runtime.rs` | ZeroClaw ReAct Loop 运行 |
**下午联调**
- P1b 创建 `AgentRuntime`,注册 `BrowserPipeTool`
- 模拟 LLM 输出:`{"tool":"browser","action":"click","params":{...}}`
- 验证工具调用成功
#### 组 2P1b + P3Skill 加载测试)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1b** | SkillLoader 完善 | JS 沙箱执行 | 能执行 Skill.js |
| **P3** | 10 个 Skill 加签名 | 签名完成的 Skill | 验证通过 |
**下午联调**
- P1b 扫描 `skills/` 目录
- 加载 P3 的 10 个 Skill
- 执行一个 Skill调用 `browserAction`
#### 组 3P2 + P4UI 对接)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P2** | 暴露 IPC 接口给 P4 | `window.superrpa.sgclaw.*` | P4 能调用 |
| **P4** | 完善 UI + Skill 后台 | 两个 Vue 组件 | 能管理 Skill 启用/禁用 |
**下午联调**
- P4 调用 `window.superrpa.sgclaw.listSkills()`
- P2 返回 Skill 列表
- P4 在界面上显示
---
### Day 7 - 安全与优化日
| 角色 | 任务 | 产出物 | 验收标准 | 协作对象 |
|-----|------|--------|---------|---------|
| **P1a** | MAC Policy 集成到 BrowserPipeTool | 安全策略生效 | 非白名单域名被拦截 | **→ P2**(确认拦截反馈)|
| **P1b** | Critic 评估器 | `agent/critic.rs` | 能判断成功/失败/重试 | - |
| **P2** | Human-in-the-loop 确认弹窗 | C++ 对话框 | 敏感操作弹窗确认 | **→ P1a**(定义敏感操作列表)|
| **P3** | 批量 AI 翻译(第 1 批) | 100 个 Skill 候选 | 翻译准确率 >90% | - |
| **P4** | 测试框架搭建 | Jest + Puppeteer 配置 | 能运行单元测试 | - |
**下午安全测试**
- 尝试访问非白名单域名(应被拦截)
- 尝试执行敏感操作(应弹窗确认)
- 连续失败 10 次触发熔断
---
### Day 8 - E2E 测试日(全员参与)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a** | 修复 Pipe 通信 bug | 稳定版本 | 无消息丢失 |
| **P1b** | 修复 Memory 存取 bug | 稳定版本 | SQLite 读写正常 |
| **P2** | 修复浏览器端 bug | 稳定版本 | 进程不崩溃 |
| **P3** | 批量 AI 翻译(第 2-4 批) | 400 个 Skill 全部完成 | 自动检查通过率 >85% |
| **P4** | E2E 测试脚本 | 6 个业务场景测试 | 全部通过 |
**E2E 测试场景**
1. 财务合规:导出 ERP 月度报表
2. OA 审批:批量审批 10 个单据
3. 风险监测:巡检风险指标
4. 人资社保:办理社保增减员
5. 营销数据:跨平台采集数据
6. 跨系统同步ERP → 财务数据同步
**验收标准**:每个场景端到端运行成功,无崩溃
---
### Day 9 - 稳定性测试日
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a** | 性能优化 | Pipe 通信延迟 <10ms | 性能达标 |
| **P1b** | Memory 压力测试 | L2 存 1000 条记录 | 无内存泄漏 |
| **P2** | 长时间运行测试 | 24 小时稳定性 | 进程不崩溃 |
| **P3** | Skill 质量抽检 | 抽检 20 个 Skill | 人工验证通过 |
| **P4** | 集成测试 + 打包预演 | 测试报告 | 覆盖率 >70% |
**压力测试**
- 连续执行 100 次操作
- 8GB 内存限制下运行
- 监控内存占用sgClaw 应 <10MB
---
### Day 10 - 发布日W2 里程碑)
| 角色 | 任务 | 产出物 | 验收标准 |
|-----|------|--------|---------|
| **P1a** | 代码审查 + 交付 | 完整 Rust 代码 | P2 审查通过 |
| **P1b** | 代码审查 + 交付 | 完整 Rust 代码 | P1a 审查通过 |
| **P2** | 代码审查 + 交付 | 完整 C++ 代码 | P1a 审查通过 |
| **P3** | Skill 仓库交付 | 400+ Skill + 文档 | P1b 审查通过 |
| **P4** | **打包发布** | `.deb` + `.exe` 安装包 | 两平台安装成功 |
**发布物清单**
- `sgclaw-v1.0.0-kylin-v10-amd64.deb` (~456MB)
- `sgclaw-v1.0.0-windows-x64.exe` (~460MB)
- `CHANGELOG.md`
- `INSTALL.md`
- 演示视频6 个场景)
---
## 三、关键接口对接清单
### 1. P1a ↔ P2 接口(最重要)
**协议**JSON Line over STDIO Pipe
**Request 示例**C++ → Rust:
```json
{
"sequence_id": 1,
"action": "click",
"params": {
"selector": "#submit-button",
"button": "left"
},
"timestamp": 1709499600000
}
```
**Response 示例**Rust → C++:
```json
{
"sequence_id": 1,
"status": "success",
"result": {
"clicked": true
},
"error": null,
"timestamp": 1709499601000
}
```
**对接时间**Day 3-5关键路径
**验收标准**
- Day 3能互相发送 ping/pong
- Day 4能调用 3 个 Actionclick/type/navigate
- Day 5能调用全部 15 个 Action
---
### 2. P1a ↔ P1b 接口
**模块依赖**
- P1b 的 `AgentRuntime` 依赖 P1a 的 `BrowserPipeTool`
**接口代码**
```rust
// P1a 提供
pub struct BrowserPipeTool {
pipe_writer: PipeWriter,
mac_policy: MacPolicy,
sequence_id: AtomicU64,
}
impl Tool for BrowserPipeTool {
async fn execute(&self, input: &str) -> Result<String>;
}
// P1b 使用
let browser_tool = BrowserPipeTool::new(...);
agent_runtime.register_tool(Box::new(browser_tool));
```
**对接时间**Day 6
**验收标准**
- P1b 能注册 P1a 的工具
- Agent 能调用浏览器操作
---
### 3. P1b ↔ P3 接口
**Skill 元数据规范**
```javascript
/**
* @skill erp-monthly-report
* @version 1.0.0
* @domains erp.example.com
* @params { month: string, format: enum }
* @signature <ed25519_base64>
*/
async function execute(params, browserAction) {
await browserAction('navigate', {...});
await browserAction('click', {...});
return { success: true };
}
```
**BrowserAction API**
```javascript
await browserAction(action, params)
// 返回 Promise<result>
```
**对接时间**Day 6-7
**验收标准**
- P1b 能扫描并加载 P3 的 Skill
- 签名验证通过
- Skill 能正常执行
---
### 4. P2 ↔ P4 接口
**FunctionsUI IPC**Vue ↔ C++:
```javascript
// P4 调用Vue
window.superrpa.sgclaw.start()
window.superrpa.sgclaw.stop()
window.superrpa.sgclaw.sendCommand(text)
window.superrpa.sgclaw.listSkills()
window.superrpa.sgclaw.toggleSkill(skillId, enabled)
// P2 回调C++ → Vue
window.superrpa.sgclaw.onStatusChange((status) => { ... })
window.superrpa.sgclaw.onLog((log) => { ... })
```
**对接时间**Day 4-6
**验收标准**
- P4 能启动/停止 sgClaw 进程
- P4 能接收日志更新
- P4 能管理 Skill 列表
---
## 四、每日站会议程
**时间**:每天 10:0015 分钟
**Day 1-2 站会重点**:环境搭建进度
**Day 3-5 站会重点**(关键路径):
- P1a + P2 联调进度
- 遇到的技术问题
- 是否需要其他人支援
**Day 6-7 站会重点**
- 三组并行集成进度
- 接口冲突解决
- 安全测试结果
**Day 8-9 站会重点**
- E2E 测试通过率
- Bug 修复优先级
- 性能优化方向
**Day 10 站会**
- 发布 Checklist 确认
- 演示视频录制分工
---
## 五、风险预案
### 风险 1P1a + P2 联调卡住Day 3-5
**影响**:阻塞所有后续工作(极高风险)
**预案**
- Day 3 晚上如果还没通P1b 暂停自己的工作,全力支援
- Day 4 晚上如果还没通启动降级方案HTTP 替代 Pipe
---
### 风险 2P3 AI 翻译质量不达标Day 7-9
**影响**Skill 不可用(中风险)
**预案**
- 准确率 <80%:人工介入修正 Prompt
- 准确率 <60%:放弃 AI 翻译,只交付 10 个黄金样本
---
### 风险 3银河麒麟适配问题Day 9-10
**影响**:无法打包 .deb中风险
**预案**
- P4 提前在 Day 7 开始真机测试
- 如果 Day 9 还有问题,先发布 Windows 版本
---
## 六、交付物 Checklist
### P1a 交付物Day 10
- [ ] `src/pipe/` 完整代码
- [ ] `src/tool/browser_pipe.rs`
- [ ] `src/security/mac_policy.rs`
- [ ] 单元测试(覆盖率 >70%
- [ ] API 文档Rust Doc
### P1b 交付物Day 10
- [ ] `src/skill/` 完整代码
- [ ] `src/memory/` 完整代码
- [ ] `src/agent/` 完整代码
- [ ] 单元测试(覆盖率 >70%
- [ ] Memory 压力测试报告
### P2 交付物Day 10
- [ ] `sgclaw_process_host.*`
- [ ] `pipe_listener.*`
- [ ] `mac_whitelist_check.*`
- [ ] `rules.json`
- [ ] C++ 单元测试
- [ ] 接口文档
### P3 交付物Day 10
- [ ] 10-15 个黄金样本
- [ ] 400+ AI 生成 Skill
- [ ] `prompts/translation-system.txt`
- [ ] `README.md`Skill 开发指南)
- [ ] 签名工具脚本
### P4 交付物Day 10
- [ ] `AgentControlPanel.vue`
- [ ] `SkillManager.vue`
- [ ] E2E 测试脚本6 个场景)
- [ ] 测试报告(覆盖率 >70%
- [ ] `.deb` 安装包
- [ ] `.exe` 安装包
- [ ] `CHANGELOG.md`
- [ ] `INSTALL.md`
---
**文档版本**v1.0
**最后更新**2026-03-04
**维护者**:项目经理

206
docs/协作甘特图.md Normal file
View File

@@ -0,0 +1,206 @@
# sgClaw 项目协作甘特图
## 一、完整时间线Mermaid 甘特图)
```mermaid
gantt
title sgClaw 2周开发计划关键路径P1a+P2
dateFormat YYYY-MM-DD
axisFormat Day %d
section 关键路径⭐
P1a环境搭建 :p1a1, 2026-03-04, 2d
P1a Pipe协议开发 :crit, p1a2, after p1a1, 1d
P1a+P2联调Pipe通信 :crit, p1a3, after p1a2, 2d
P1a完善15个Action :crit, p1a4, after p1a3, 1d
W1里程碑演示 :milestone, m1, after p1a4, 0d
P1a+P1b集成Runtime :p1a5, after p1a4, 1d
P1a MAC安全策略 :p1a6, after p1a5, 1d
P1a bug修复 :p1a7, after p1a6, 2d
P1a代码审查交付 :milestone, m2, after p1a7, 1d
section P2浏览器对接
P2环境搭建 :p2a, 2026-03-04, 2d
P2 ProcessHost框架 :p2b, after p2a, 1d
P2+P1a联调Pipe :crit, p2c, after p2b, 2d
P2 CommandRouter对接 :p2d, after p2c, 1d
P2 MAC白名单 :p2e, after p2d, 1d
P2+P4 UI对接 :p2f, after p2e, 1d
P2 bug修复 :p2g, after p2f, 2d
P2交付 :milestone, after p2g, 1d
section P1b业务支持
P1b环境搭建 :p1b1, 2026-03-04, 2d
P1b SkillLoader开发 :p1b2, after p1b1, 3d
P1b Memory开发 :p1b3, after p1b2, 2d
P1b+P1a集成Runtime :p1b4, after p1b3, 1d
P1b+P3 Skill测试 :p1b5, after p1b4, 1d
P1b Critic评估器 :p1b6, after p1b5, 1d
P1b bug修复 :p1b7, after p1b6, 1d
P1b交付 :milestone, after p1b7, 1d
section P3业务技能
P3场景调研 :p3a, 2026-03-04, 1d
P3黄金样本制作 :p3b, after p3a, 3d
P3提示词工程 :p3c, after p3b, 1d
P3 AI批量翻译 :p3d, after p3c, 3d
P3质量抽检 :p3e, after p3d, 2d
P3交付Skill仓库 :milestone, after p3e, 0d
section P4前端发布
P4环境搭建 :p4a, 2026-03-04, 2d
P4 UI原型设计 :p4b, after p4a, 1d
P4 Side Panel开发 :p4c, after p4b, 2d
P4 Skill后台开发 :p4d, after p4c, 1d
P4+P2 IPC对接 :p4e, after p4d, 1d
P4测试框架搭建 :p4f, after p4e, 1d
P4 E2E测试 :p4g, after p4f, 2d
P4打包发布 :milestone, p4h, after p4g, 1d
section 全员里程碑
环境搭建完成 :milestone, after p1a1 p2a p1b1 p3a p4a, 0d
W1里程碑(链路打通) :milestone, m1_all, 2026-03-08, 0d
E2E测试周 :active, e2e, 2026-03-11, 2d
W2里程碑(正式发布) :milestone, m2_all, 2026-03-14, 0d
```
## 二、关键路径可视化
```
Day 1-2 ━━━━━━━━━━━━━━━━━━━━━━ 环境搭建(并行)
Day 3 ━━━━━┻━━━━━━━━━━━━━━━━━ P1a Pipe 协议开发 ⭐
Day 4-5 ━━━┻━━━━━━━━━━━━━━━━━ P1a + P2 联调 Pipe ⭐⭐⭐
┃ (关键路径,阻塞所有人)
【W1 里程碑】链路打通
Day 6 ━━━━━┻━━━━━━━━━━━━━━━━━ 三组并行集成:
├─ P1a + P1b (Runtime)
├─ P1b + P3 (Skill)
└─ P2 + P4 (UI)
Day 7 ━━━━━┫ 安全策略 + AI 翻译
Day 8-9 ━━━┻━━━━━━━━━━━━━━━━━ 全员 E2E 测试
Day 10 ━━━━▼━━━━━━━━━━━━━━━━━ P4 打包发布
【W2 里程碑】正式发布
```
## 三、并行度分析
```
Day 1-2: ████████████████████ 5 人并行(环境搭建)
Day 3: ████ P1a 单人关键路径
Day 4-5: ████████ P1a+P2 双人关键路径 ⭐
Day 6-7: ████████████████ 4 人并行P3 独立)
Day 8-9: ████████████████████ 5 人并行E2E 测试)
Day 10: ████ P4 单人发布
关键瓶颈Day 4-5P1a + P2 联调)
```
## 四、依赖关系图
```mermaid
graph TD
A[Day 1-2: 环境搭建] --> B[Day 3: P1a Pipe 协议]
B --> C[Day 4-5: P1a+P2 联调 Pipe ⭐]
C --> D[Day 5 晚: W1 里程碑]
D --> E1[Day 6: P1a+P1b 集成]
D --> E2[Day 6: P1b+P3 Skill]
D --> E3[Day 6: P2+P4 UI]
E1 --> F[Day 7: 安全+AI]
E2 --> F
E3 --> F
F --> G[Day 8-9: E2E 测试]
G --> H[Day 10: P4 打包发布]
style C fill:#ff6b6b,stroke:#c92a2a,color:#fff
style D fill:#51cf66,stroke:#2f9e44,color:#fff
style H fill:#51cf66,stroke:#2f9e44,color:#fff
```
## 五、人员负载分析
| 日期 | P1a| P1b | P2 | P3 | P4 | 总负载 |
|-----|---------|-----|----|----|----|----|
| Day 1-2 | 🟢 中 | 🟢 中 | 🟢 中 | 🟢 中 | 🟢 中 | 5 人 |
| Day 3 | 🔴 高 | 🟡 低 | 🟡 低 | 🟢 中 | 🟢 中 | 2 人高负载 |
| Day 4-5 | 🔴 极高 | 🟢 中 | 🔴 极高 | 🟢 中 | 🟢 中 | **2 人关键路径** |
| Day 6 | 🔴 高 | 🔴 高 | 🟢 中 | 🟢 中 | 🟢 中 | 2 人高负载 |
| Day 7 | 🟢 中 | 🔴 高 | 🟢 中 | 🔴 高 | 🟢 中 | 2 人高负载 |
| Day 8-9 | 🟢 中 | 🟢 中 | 🟢 中 | 🟢 中 | 🟢 中 | 5 人 E2E |
| Day 10 | 🟡 低 | 🟡 低 | 🟡 低 | 🟡 低 | 🔴 高 | 1 人高负载 |
**图例**:🔴 极高/高负载 🟡 低负载 🟢 正常负载
---
## 六、风险热力图
```
风险等级
时间 │ 低 │ 中 │ 高 │ 极高
─────────┼────┼────┼────┼─────
Day 1-2 │ ✓ │ │ │
Day 3 │ │ ✓ │ │
Day 4-5 │ │ │ │ ⭐⭐⭐ ← Pipe 通信不通
Day 6 │ │ │ ✓ │
Day 7 │ │ ✓ │ │
Day 8-9 │ │ ✓ │ │
Day 10 │ │ ✓ │ │
```
**极高风险Day 4-5**P1a + P2 联调失败,阻塞所有后续工作
**预案**
1. Day 4 晚上还没通 → P1b 全力支援
2. Day 5 中午还没通 → 启动降级方案HTTP
---
## 七、里程碑验收清单
### ✅ W1 里程碑Day 5 晚上)
**演示场景**
1. P4 打开 Side Panel UI
2. 输入:"点击页面上的登录按钮"
3. Vue → C++ → Rust → 大模型mock→ Rust → C++ → 浏览器
4. 浏览器真实点击按钮
**验收标准**
- [ ] Pipe 双向通信稳定(无消息丢失)
- [ ] 15 个 BrowserAction 全部测试通过
- [ ] MAC 白名单生效(非白名单域名被拦截)
- [ ] 延迟 < 100ms从命令到执行完成
---
### ✅ W2 里程碑Day 10
**交付物**
- [ ] `.deb` 安装包(银河麒麟 V10
- [ ] `.exe` 安装包Windows 10/11
- [ ] 6 个业务场景演示视频
- [ ] 完整文档API + Skill 开发指南 + 部署手册)
**验收标准**
- [ ] 两平台安装成功
- [ ] E2E 测试全部通过
- [ ] 单元测试覆盖率 > 70%
- [ ] 内存占用 < 10MBsgClaw 进程)
- [ ] 无已知 P0/P1 级 bug
---
**文档版本**v1.0
**最后更新**2026-03-04
**维护者**:项目经理

View File

@@ -0,0 +1,222 @@
# sgClaw 项目协作甘特图
## 一、完整时间线Mermaid 甘特图)
![甘特图 1](https://mermaid.ink/img/Z2FudHQKICAgIHRpdGxlIHNnQ2xhdyAy5ZGo5byA5Y+R6K6h5YiS77yI5YWz6ZSu6Lev5b6E77yaUDFhK1Ay77yJCiAgICBkYXRlRm9ybWF0IFlZWVktTU0tREQKICAgIGF4aXNGb3JtYXQgRGF5ICVkCiAgICAKICAgIHNlY3Rpb24g5YWz6ZSu6Lev5b6E4q2QCiAgICBQMWHnjq/looPmkK3lu7ogICAgICAgICAgIDpwMWExLCAyMDI2LTAzLTA0LCAyZAogICAgUDFhIFBpcGXljY/orq7lvIDlj5EgICAgICA6Y3JpdCwgcDFhMiwgYWZ0ZXIgcDFhMSwgMWQKICAgIFAxYStQMuiBlOiwg1BpcGXpgJrkv6EgICAgOmNyaXQsIHAxYTMsIGFmdGVyIHAxYTIsIDJkCiAgICBQMWHlrozlloQxNeS4qkFjdGlvbiAgICAgOmNyaXQsIHAxYTQsIGFmdGVyIHAxYTMsIDFkCiAgICBXMemHjOeoi+eikea8lOekuiAgICAgICAgICA6bWlsZXN0b25lLCBtMSwgYWZ0ZXIgcDFhNCwgMGQKICAgIFAxYStQMWLpm4bmiJBSdW50aW1lICAgIDpwMWE1LCBhZnRlciBwMWE0LCAxZAogICAgUDFhIE1BQ+WuieWFqOetlueVpSAgICAgICA6cDFhNiwgYWZ0ZXIgcDFhNSwgMWQKICAgIFAxYSBidWfkv67lpI0gICAgICAgICAgIDpwMWE3LCBhZnRlciBwMWE2LCAyZAogICAgUDFh5Luj56CB5a6h5p+l5Lqk5LuYICAgICAgIDptaWxlc3RvbmUsIG0yLCBhZnRlciBwMWE3LCAxZAogICAgCiAgICBzZWN0aW9uIFAy5rWP6KeI5Zmo5a+55o6lCiAgICBQMueOr+Wig+aQreW7uiAgICAgICAgICAgIDpwMmEsIDIwMjYtMDMtMDQsIDJkCiAgICBQMiBQcm9jZXNzSG9zdOahhuaetiAgICA6cDJiLCBhZnRlciBwMmEsIDFkCiAgICBQMitQMWHogZTosINQaXBlICAgICAgICA6Y3JpdCwgcDJjLCBhZnRlciBwMmIsIDJkCiAgICBQMiBDb21tYW5kUm91dGVy5a+55o6lICA6cDJkLCBhZnRlciBwMmMsIDFkCiAgICBQMiBNQUPnmb3lkI3ljZUgICAgICAgICAgOnAyZSwgYWZ0ZXIgcDJkLCAxZAogICAgUDIrUDQgVUnlr7nmjqUgICAgICAgICAgOnAyZiwgYWZ0ZXIgcDJlLCAxZAogICAgUDIgYnVn5L+u5aSNICAgICAgICAgICAgOnAyZywgYWZ0ZXIgcDJmLCAyZAogICAgUDLkuqTku5ggICAgICAgICAgICAgICAgOm1pbGVzdG9uZSwgYWZ0ZXIgcDJnLCAxZAogICAgCiAgICBzZWN0aW9uIFAxYuS4muWKoeaUr+aMgQogICAgUDFi546v5aKD5pCt5bu6ICAgICAgICAgICA6cDFiMSwgMjAyNi0wMy0wNCwgMmQKICAgIFAxYiBTa2lsbExvYWRlcuW8gOWPkSAgIDpwMWIyLCBhZnRlciBwMWIxLCAzZAogICAgUDFiIE1lbW9yeeW8gOWPkSAgICAgICAgOnAxYjMsIGFmdGVyIHAxYjIsIDJkCiAgICBQMWIrUDFh6ZuG5oiQUnVudGltZSAgICA6cDFiNCwgYWZ0ZXIgcDFiMywgMWQKICAgIFAxYitQMyBTa2lsbOa1i+ivlSAgICAgIDpwMWI1LCBhZnRlciBwMWI0LCAxZAogICAgUDFiIENyaXRpY+ivhOS8sOWZqCAgICAgIDpwMWI2LCBhZnRlciBwMWI1LCAxZAogICAgUDFiIGJ1Z+S/ruWkjSAgICAgICAgICAgOnAxYjcsIGFmdGVyIHAxYjYsIDFkCiAgICBQMWLkuqTku5ggICAgICAgICAgICAgICA6bWlsZXN0b25lLCBhZnRlciBwMWI3LCAxZAogICAgCiAgICBzZWN0aW9uIFAz5Lia5Yqh5oqA6IO9CiAgICBQM+WcuuaZr+iwg+eglCAgICAgICAgICAgIDpwM2EsIDIwMjYtMDMtMDQsIDFkCiAgICBQM+m7hOmHkeagt+acrOWItuS9nCAgICAgICAgOnAzYiwgYWZ0ZXIgcDNhLCAzZAogICAgUDPmj5DnpLror43lt6XnqIsgICAgICAgICAgOnAzYywgYWZ0ZXIgcDNiLCAxZAogICAgUDMgQUnmibnph4/nv7vor5EgICAgICAgICA6cDNkLCBhZnRlciBwM2MsIDNkCiAgICBQM+i0qOmHj+aKveajgCAgICAgICAgICAgIDpwM2UsIGFmdGVyIHAzZCwgMmQKICAgIFAz5Lqk5LuYU2tpbGzku5PlupMgICAgICAgOm1pbGVzdG9uZSwgYWZ0ZXIgcDNlLCAwZAogICAgCiAgICBzZWN0aW9uIFA05YmN56uv5Y+R5biDCiAgICBQNOeOr+Wig+aQreW7uiAgICAgICAgICAgIDpwNGEsIDIwMjYtMDMtMDQsIDJkCiAgICBQNCBVSeWOn+Wei+iuvuiuoSAgICAgICAgIDpwNGIsIGFmdGVyIHA0YSwgMWQKICAgIFA0IFNpZGUgUGFuZWzlvIDlj5EgICAgIDpwNGMsIGFmdGVyIHA0YiwgMmQKICAgIFA0IFNraWxs5ZCO5Y+w5byA5Y+RICAgICAgOnA0ZCwgYWZ0ZXIgcDRjLCAxZAogICAgUDQrUDIgSVBD5a+55o6lICAgICAgICAgOnA0ZSwgYWZ0ZXIgcDRkLCAxZAogICAgUDTmtYvor5XmoYbmnrbmkK3lu7ogICAgICAgIDpwNGYsIGFmdGVyIHA0ZSwgMWQKICAgIFA0IEUyRea1i+ivlSAgICAgICAgICAgIDpwNGcsIGFmdGVyIHA0ZiwgMmQKICAgIFA05omT5YyF5Y+R5biDICAgICAgICAgICAgOm1pbGVzdG9uZSwgcDRoLCBhZnRlciBwNGcsIDFkCiAgICAKICAgIHNlY3Rpb24g5YWo5ZGY6YeM56iL56KRCiAgICDnjq/looPmkK3lu7rlrozmiJAgICAgICAgICAgOm1pbGVzdG9uZSwgYWZ0ZXIgcDFhMSBwMmEgcDFiMSBwM2EgcDRhLCAwZAogICAgVzHph4znqIvnopEo6ZO+6Lev5omT6YCaKSAgICA6bWlsZXN0b25lLCBtMV9hbGwsIDIwMjYtMDMtMDgsIDBkCiAgICBFMkXmtYvor5XlkaggICAgICAgICAgICAgOmFjdGl2ZSwgZTJlLCAyMDI2LTAzLTExLCAyZAogICAgVzLph4znqIvnopEo5q2j5byP5Y+R5biDKSAgICA6bWlsZXN0b25lLCBtMl9hbGwsIDIwMjYtMDMtMTQsIDBkCg==)
<details>
<summary>📋 点击查看 Mermaid 源码</summary>
```mermaid
gantt
title sgClaw 2周开发计划关键路径P1a+P2
dateFormat YYYY-MM-DD
axisFormat Day %d
section 关键路径⭐
P1a环境搭建 :p1a1, 2026-03-04, 2d
P1a Pipe协议开发 :crit, p1a2, after p1a1, 1d
P1a+P2联调Pipe通信 :crit, p1a3, after p1a2, 2d
P1a完善15个Action :crit, p1a4, after p1a3, 1d
W1里程碑演示 :milestone, m1, after p1a4, 0d
P1a+P1b集成Runtime :p1a5, after p1a4, 1d
P1a MAC安全策略 :p1a6, after p1a5, 1d
P1a bug修复 :p1a7, after p1a6, 2d
P1a代码审查交付 :milestone, m2, after p1a7, 1d
section P2浏览器对接
P2环境搭建 :p2a, 2026-03-04, 2d
P2 ProcessHost框架 :p2b, after p2a, 1d
P2+P1a联调Pipe :crit, p2c, after p2b, 2d
P2 CommandRouter对接 :p2d, after p2c, 1d
P2 MAC白名单 :p2e, after p2d, 1d
P2+P4 UI对接 :p2f, after p2e, 1d
P2 bug修复 :p2g, after p2f, 2d
P2交付 :milestone, after p2g, 1d
section P1b业务支持
P1b环境搭建 :p1b1, 2026-03-04, 2d
P1b SkillLoader开发 :p1b2, after p1b1, 3d
P1b Memory开发 :p1b3, after p1b2, 2d
P1b+P1a集成Runtime :p1b4, after p1b3, 1d
P1b+P3 Skill测试 :p1b5, after p1b4, 1d
P1b Critic评估器 :p1b6, after p1b5, 1d
P1b bug修复 :p1b7, after p1b6, 1d
P1b交付 :milestone, after p1b7, 1d
section P3业务技能
P3场景调研 :p3a, 2026-03-04, 1d
P3黄金样本制作 :p3b, after p3a, 3d
P3提示词工程 :p3c, after p3b, 1d
P3 AI批量翻译 :p3d, after p3c, 3d
P3质量抽检 :p3e, after p3d, 2d
P3交付Skill仓库 :milestone, after p3e, 0d
section P4前端发布
P4环境搭建 :p4a, 2026-03-04, 2d
P4 UI原型设计 :p4b, after p4a, 1d
P4 Side Panel开发 :p4c, after p4b, 2d
P4 Skill后台开发 :p4d, after p4c, 1d
P4+P2 IPC对接 :p4e, after p4d, 1d
P4测试框架搭建 :p4f, after p4e, 1d
P4 E2E测试 :p4g, after p4f, 2d
P4打包发布 :milestone, p4h, after p4g, 1d
section 全员里程碑
环境搭建完成 :milestone, after p1a1 p2a p1b1 p3a p4a, 0d
W1里程碑(链路打通) :milestone, m1_all, 2026-03-08, 0d
E2E测试周 :active, e2e, 2026-03-11, 2d
W2里程碑(正式发布) :milestone, m2_all, 2026-03-14, 0d
```
</details>
## 二、关键路径可视化
```
Day 1-2 ━━━━━━━━━━━━━━━━━━━━━━ 环境搭建(并行)
Day 3 ━━━━━┻━━━━━━━━━━━━━━━━━ P1a Pipe 协议开发 ⭐
Day 4-5 ━━━┻━━━━━━━━━━━━━━━━━ P1a + P2 联调 Pipe ⭐⭐⭐
┃ (关键路径,阻塞所有人)
【W1 里程碑】链路打通
Day 6 ━━━━━┻━━━━━━━━━━━━━━━━━ 三组并行集成:
├─ P1a + P1b (Runtime)
├─ P1b + P3 (Skill)
└─ P2 + P4 (UI)
Day 7 ━━━━━┫ 安全策略 + AI 翻译
Day 8-9 ━━━┻━━━━━━━━━━━━━━━━━ 全员 E2E 测试
Day 10 ━━━━▼━━━━━━━━━━━━━━━━━ P4 打包发布
【W2 里程碑】正式发布
```
## 三、并行度分析
```
Day 1-2: ████████████████████ 5 人并行(环境搭建)
Day 3: ████ P1a 单人关键路径
Day 4-5: ████████ P1a+P2 双人关键路径 ⭐
Day 6-7: ████████████████ 4 人并行P3 独立)
Day 8-9: ████████████████████ 5 人并行E2E 测试)
Day 10: ████ P4 单人发布
关键瓶颈Day 4-5P1a + P2 联调)
```
## 四、依赖关系图
![依赖关系图 2](https://mermaid.ink/img/Z3JhcGggVEQKICAgIEFbRGF5IDEtMjog546v5aKD5pCt5bu6XSAtLT4gQltEYXkgMzogUDFhIFBpcGUg5Y2P6K6uXQogICAgQiAtLT4gQ1tEYXkgNC01OiBQMWErUDIg6IGU6LCDIFBpcGUg4q2QXQogICAgQyAtLT4gRFtEYXkgNSDmmZo6IFcxIOmHjOeoi+eikV0KICAgIAogICAgRCAtLT4gRTFbRGF5IDY6IFAxYStQMWIg6ZuG5oiQXQogICAgRCAtLT4gRTJbRGF5IDY6IFAxYitQMyBTa2lsbF0KICAgIEQgLS0+IEUzW0RheSA2OiBQMitQNCBVSV0KICAgIAogICAgRTEgLS0+IEZbRGF5IDc6IOWuieWFqCtBSV0KICAgIEUyIC0tPiBGCiAgICBFMyAtLT4gRgogICAgCiAgICBGIC0tPiBHW0RheSA4LTk6IEUyRSDmtYvor5VdCiAgICBHIC0tPiBIW0RheSAxMDogUDQg5omT5YyF5Y+R5biDXQogICAgCiAgICBzdHlsZSBDIGZpbGw6I2ZmNmI2YixzdHJva2U6I2M5MmEyYSxjb2xvcjojZmZmCiAgICBzdHlsZSBEIGZpbGw6IzUxY2Y2NixzdHJva2U6IzJmOWU0NCxjb2xvcjojZmZmCiAgICBzdHlsZSBIIGZpbGw6IzUxY2Y2NixzdHJva2U6IzJmOWU0NCxjb2xvcjojZmZmCg==)
<details>
<summary>📋 点击查看 Mermaid 源码</summary>
```mermaid
graph TD
A[Day 1-2: 环境搭建] --> B[Day 3: P1a Pipe 协议]
B --> C[Day 4-5: P1a+P2 联调 Pipe ⭐]
C --> D[Day 5 晚: W1 里程碑]
D --> E1[Day 6: P1a+P1b 集成]
D --> E2[Day 6: P1b+P3 Skill]
D --> E3[Day 6: P2+P4 UI]
E1 --> F[Day 7: 安全+AI]
E2 --> F
E3 --> F
F --> G[Day 8-9: E2E 测试]
G --> H[Day 10: P4 打包发布]
style C fill:#ff6b6b,stroke:#c92a2a,color:#fff
style D fill:#51cf66,stroke:#2f9e44,color:#fff
style H fill:#51cf66,stroke:#2f9e44,color:#fff
```
</details>
## 五、人员负载分析
| 日期 | P1a| P1b | P2 | P3 | P4 | 总负载 |
|-----|---------|-----|----|----|----|----|
| Day 1-2 | 🟢 中 | 🟢 中 | 🟢 中 | 🟢 中 | 🟢 中 | 5 人 |
| Day 3 | 🔴 高 | 🟡 低 | 🟡 低 | 🟢 中 | 🟢 中 | 2 人高负载 |
| Day 4-5 | 🔴 极高 | 🟢 中 | 🔴 极高 | 🟢 中 | 🟢 中 | **2 人关键路径** |
| Day 6 | 🔴 高 | 🔴 高 | 🟢 中 | 🟢 中 | 🟢 中 | 2 人高负载 |
| Day 7 | 🟢 中 | 🔴 高 | 🟢 中 | 🔴 高 | 🟢 中 | 2 人高负载 |
| Day 8-9 | 🟢 中 | 🟢 中 | 🟢 中 | 🟢 中 | 🟢 中 | 5 人 E2E |
| Day 10 | 🟡 低 | 🟡 低 | 🟡 低 | 🟡 低 | 🔴 高 | 1 人高负载 |
**图例**:🔴 极高/高负载 🟡 低负载 🟢 正常负载
---
## 六、风险热力图
```
风险等级
时间 │ 低 │ 中 │ 高 │ 极高
─────────┼────┼────┼────┼─────
Day 1-2 │ ✓ │ │ │
Day 3 │ │ ✓ │ │
Day 4-5 │ │ │ │ ⭐⭐⭐ ← Pipe 通信不通
Day 6 │ │ │ ✓ │
Day 7 │ │ ✓ │ │
Day 8-9 │ │ ✓ │ │
Day 10 │ │ ✓ │ │
```
**极高风险Day 4-5**P1a + P2 联调失败,阻塞所有后续工作
**预案**
1. Day 4 晚上还没通 → P1b 全力支援
2. Day 5 中午还没通 → 启动降级方案HTTP
---
## 七、里程碑验收清单
### ✅ W1 里程碑Day 5 晚上)
**演示场景**
1. P4 打开 Side Panel UI
2. 输入:"点击页面上的登录按钮"
3. Vue → C++ → Rust → 大模型mock→ Rust → C++ → 浏览器
4. 浏览器真实点击按钮
**验收标准**
- [ ] Pipe 双向通信稳定(无消息丢失)
- [ ] 15 个 BrowserAction 全部测试通过
- [ ] MAC 白名单生效(非白名单域名被拦截)
- [ ] 延迟 < 100ms从命令到执行完成
---
### ✅ W2 里程碑Day 10
**交付物**
- [ ] `.deb` 安装包(银河麒麟 V10
- [ ] `.exe` 安装包Windows 10/11
- [ ] 6 个业务场景演示视频
- [ ] 完整文档API + Skill 开发指南 + 部署手册)
**验收标准**
- [ ] 两平台安装成功
- [ ] E2E 测试全部通过
- [ ] 单元测试覆盖率 > 70%
- [ ] 内存占用 < 10MBsgClaw 进程)
- [ ] 无已知 P0/P1 级 bug
---
**文档版本**v1.0
**最后更新**2026-03-04
**维护者**:项目经理

1024
docs/团队分工.md Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,84 @@
# sgClaw 团队管理标准V1.1
> 适用范围P1a、P1b、P2、P3、P4 五角色并行开发。
> 管理原则:清单驱动、里程碑验收、接口先行、变更可追溯。
## 1. 全员统一工作清单
### 1.1 每日清单Daily
- [ ] 站会前更新:昨日产出、今日计划、阻塞项(各不超过 3 条)
- [ ] 当日最少 1 次提交,提交信息带角色前缀(如 `P2: ...`
- [ ] 若存在接口变更,必须同步公告并更新文档
- [ ] 下班前完成最小可运行验证(本地或联调环境)
### 1.2 里程碑清单DoD
- [ ] 代码通过本角色测试(单测/集成)
- [ ] 产出物齐全(代码、配置、文档、示例)
- [ ] 日志可定位(必须包含 `seq``action``error.code`
- [ ] 通过上下游联调验收并留存证据
## 2. 五角色职责清单
### P1a核心通信Rust
- [ ] Pipe 协议实现JSON Line、`seq` 递增、消息上限 1MB
- [ ] BrowserPipeTool + MAC/HMAC 校验落地
- [ ] command/response 关联能力按 `seq` 保证可追踪
- [ ] 提供协议级成功/失败样例
### P1b业务支持Rust
- [ ] Skill 加载、签名校验、沙箱执行
- [ ] 记忆分层L0/L1/L2可读写可检索
- [ ] AgentRuntime 与 P1a 工具链路打通
- [ ] Critic 与熔断策略生效
### P2浏览器对接Chromium C++
- [ ] SgClawProcessHost 生命周期start/stop/crash
- [ ] PipeListener 收发与 Schema 校验
- [ ] MAC 白名单检查与 CommandRouter 映射一致
- [ ] 错误码标准化回传(`PIPE_*`/`MAC_*`/`CMD_*`
### P3业务技能JS
- [ ] Skill 元数据、参数 Schema、签名文件齐备
- [ ] 每个 skill 提供最小可运行示例
- [ ] 关键场景具备降级与异常处理
- [ ] 与 P1b 联调加载、执行、回滚路径
### P4前端与发布Vue/DevOps
- [ ] 控制面板支持启停、状态、日志展示
- [ ] human-in-the-loop 确认链路闭环
- [ ] 打包脚本一键产物deb/exe
- [ ] 发布与回滚文档完整
## 3. 个人任务卡模板(分配即执行)
```markdown
负责人:
角色P1a / P1b / P2 / P3 / P4
本周必须交付:
1)
2)
3)
联调对象:
阻塞项:
验收证据(必填):
- 提交记录:
- 测试结果:
- 日志/截图:
```
## 4. 接口标准与变更管理
- 浏览器联调标准统一使用:`docs/浏览器对接标准.md`
- 任何接口字段变更必须提交 RFC影响面、兼容策略、回滚方案
- 合并门槛P1a + P2 + 管理者三方评审通过。
- 文档更新顺序:先改接口文档,再改实现代码,最后改测试与演示资料。

9667
docs/团队管理标准.pdf Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,77 @@
# sgClaw 浏览器对接标准Chromium ↔ sgClaw
> 适用范围P1aRust与 P2Chromium C++)联调开发。
> 目标:双方只要严格按本文档实现,即可稳定联调。
## 1. 协议边界与责任
- 单一事实来源:`docs/L2-核心模块与接口契约层.md` 第 5 章5.1~5.4)。
- 协议版本冻结:`1.0`字段、action、错误码变更均视为协议变更。
- P1a 负责:`seq` 生成、command 组包、HMAC 计算、response 关联。
- P2 负责message 解析、Schema 校验、MAC 检查、CommandRouter 执行、结构化回包。
## 2. Wire Contract双方 MUST
| 项目 | 强约束 | 违规错误码 |
|---|---|---|
| 传输层 | STDIO + JSON Line每行一条完整 JSON | `PIPE_INVALID_JSON` |
| 编码 | UTF-8 | `PIPE_INVALID_JSON` |
| 消息大小 | 单条消息 `<= 1MB` | `PIPE_MESSAGE_TOO_LARGE` |
| 序列号 | `seq` 从 1 开始、严格递增、不可重复 | `PIPE_SEQ_DUPLICATE` / `PIPE_SEQ_OUT_OF_ORDER` |
| 安全字段 | command 必含 `security.expected_domain``security.hmac` | `PIPE_HMAC_INVALID` / `MAC_*` |
| 一问一答 | 一个 `seq` 必须且只能对应一个 response | `INTERNAL_UNKNOWN` |
## 3. 握手协议(启动门禁)
1. Browser 启动 sgClaw 子进程。
2. Browser 发送:`{"type":"init","version":"1.0","hmac_seed":"<hex>"}`
3. sgClaw 返回:`{"type":"init_ack","version":"1.0","agent_id":"<uuid-v4>","supported_actions":[...]}`
4. Browser 超时 `5000ms` 未收到 `init_ack`Kill 子进程并置状态 `Crashed`
5. 任一方 `version` 不一致:立即失败,不进入 Running。
## 4. 命令/响应字段标准
- command 必填:`seq``type=command``action``params``security`
- response 必填:`seq``type=response``success`
- 失败 response 必填:`error.code``error.message`(禁止纯文本错误)。
- `action``params` 必须通过 L2 的枚举和 Schema 校验。
**标准 command 示例**
```json
{"seq":12,"type":"command","action":"click","params":{"selector":"#submit"},"security":{"expected_domain":"erp.example.com","hmac":"<hex>"}}
```
## 5. HMAC 统一规则(避免两端实现不一致)
- 算法:`HMAC-SHA256`,输出小写 hex。
- 密钥:由 `hmac_seed` 派生后在会话内固定。
- 签名原文canonical string
```text
<seq>\n<action>\n<stable_json(params)>\n<expected_domain>
```
- `stable_json(params)`键名按字典序、无多余空格、UTF-8 编码。
## 6. 错误处理与重试矩阵
| 错误类型 | 重试策略 |
|---|---|
| `PIPE_*` | 不重试,直接失败 |
| `MAC_*` | 不重试,等待配置/人工确认 |
| `CMD_SELECTOR_TIMEOUT` | 最多重试 2 次500ms、1000ms |
| `CMD_NAVIGATION_FAILED` | 最多重试 1 次1000ms |
| `INTERNAL_*` | 最多重试 1 次,仍失败则熔断 |
- 同一 action 连续失败 `>10` 次:触发熔断并通知 UI。
## 7. 联调验收(全部通过才算完成)
- [ ] `init -> init_ack` 连续 100 次成功率 100%。
- [ ] 版本不匹配时稳定失败并返回可读日志。
- [ ] `seq` 重复/乱序场景可复现并返回标准错误码。
- [ ] >1MB 消息可稳定被拒绝。
- [ ] 核心 actionclick/type/navigate/getText成功率 `>=99%`
- [ ] 所有失败场景均返回结构化 `error.code` + `error.message`
- [ ] 日志可按 `seq` 贯通请求、执行、响应。

Binary file not shown.