Skip to content

Commit 789676d

Browse files
committed
feat(skills): complete secure inventory migration
1 parent 89dc716 commit 789676d

47 files changed

Lines changed: 896 additions & 647 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
MisakaX 是一个开源的桌面 AI Agent 客户端,采用三层架构设计:
1616

1717
- **Rust 后端** — 数据库、文件系统、MCP 协议、LLM 调用(当前对话走 Rig 过渡后端)
18-
- **React 前端** — 会话管理、流式对话 UI、工作目录、Provider / MCP 设置
18+
- **React 前端** — 会话管理、流式对话 UI、工作目录、Provider / MCP / Skills 设置
1919
- **Python Sidecar** — Sidecar 预热与健康检查已就绪;DeepAgents + PowerMem 对话编排(Phase 4 规划中)
2020

2121
> **开发状态:** Phase 3 代码关门(~95%),**请先补齐最终 UI/实机复验记录再进入 Phase 4**
@@ -26,14 +26,14 @@ MisakaX 是一个开源的桌面 AI Agent 客户端,采用三层架构设计
2626
### 基础设施(Phase 0)
2727

2828
- 跨平台桌面应用框架(Tauri 2.x,Windows / macOS / Linux)
29-
- SQLite 数据库 Schema 迁移至 **v6**(WAL、FTS5、sqlite-vec 扩展加载
29+
- SQLite 数据库 Schema 迁移至 **v13**(WAL、FTS5、sqlite-vec、Skills 扫描与迁移状态
3030
- 配置管理(`~/.misakax/config.yaml`
3131
- Tauri 插件(fs、http、shell、dialog、clipboard、notification)
3232

3333
### UI 与设置(Phase 1)
3434

3535
- AppShell 主布局、侧边栏导航、Zustand 路由
36-
- 设置页(通用 / 模型 / MCP / 外观 / 关于)
36+
- 设置页(通用 / 模型 / MCP / Skills / 外观 / 关于)
3737
- Provider API Key CRUD + **加密存储**
3838
- 主题切换(明 / 暗 / 跟随系统)、中 / 英文 i18n
3939

@@ -50,10 +50,17 @@ MisakaX 是一个开源的桌面 AI Agent 客户端,采用三层架构设计
5050
- Sidecar 自动预热、健康检查、前端状态指示
5151
- Tool Call UI、MCP 设置页
5252

53+
### Skills 仓库与安全门
54+
55+
- Settings > Skills 统一管理受管、Codex、Claude 与 Cursor 来源;启用和消息选择使用 stable SkillId + activation generation
56+
- 按需 summary、文件树和分段预览;普通详情不传输整份 `SKILL.md`
57+
- ZIP quarantine、离线静态扫描、findings、审批/撤销、JSON/SARIF 导出和强制激活 Gate
58+
- Schema v13 首次升级会禁用旧豁免 source、持久化显示批量扫描进度并支持失败重试;外部目录只读
59+
5360
### 尚未实现
5461

5562
- DeepAgents 全对话接管(Sidecar `/agent/*` 当前为 501 占位)
56-
- PowerMem 长期记忆、Skills 系统、知识库 RAG
63+
- PowerMem 长期记忆、知识库 RAG、Sandbox 隔离的可选 Skills 深度扫描器
5764
- Dashboard、通知中心、Buddy 桌面伴侣
5865

5966
## 技术架构
@@ -65,7 +72,7 @@ MisakaX 是一个开源的桌面 AI Agent 客户端,采用三层架构设计
6572
│ → Vite 6 开发服务器 (:1420) │
6673
├────────────────────────────────────────────────┤
6774
│ Tauri 2.x (Rust) │
68-
│ - SQLite (WAL) v6 + sqlite-vec + FTS5
75+
│ - SQLite (WAL) v13 + sqlite-vec + FTS5 │
6976
│ - LLM: rig-core(过渡)+ rmcp(MCP) │
7077
│ - 配置 (~/.misakax/config.yaml) │
7178
├────────────────────────────────────────────────┤
@@ -83,7 +90,7 @@ MisakaX 是一个开源的桌面 AI Agent 客户端,采用三层架构设计
8390
| 前端 | React 19 + TypeScript + Vite 6 | Zustand 状态、react-i18next |
8491
| UI | Tailwind CSS v4 + shadcn/ui | 设计规范见 `docs/design/` |
8592
| 后端 | Rust (tokio, rusqlite, rig-core, rmcp) | ~50+ Tauri Commands |
86-
| 数据库 | SQLite + sqlite-vec + FTS5 | Schema v6 |
93+
| 数据库 | SQLite + sqlite-vec + FTS5 | Schema v13 |
8794
| 过渡对话 | rig-core 0.36 | Phase 4 后退役为降级路径 |
8895
| Agent 编排 | DeepAgents(Phase 4) | 替换 Rig 直调 |
8996
| 记忆引擎 | PowerMem(Phase 4) | Sidecar optional 依赖 |
@@ -152,13 +159,13 @@ misaka-x/
152159
│ │ ├── chat/ # 对话、会话、工作区、Composer
153160
│ │ ├── layout/ # AppShell、Sidebar
154161
│ │ └── ui/ # shadcn/ui
155-
│ ├── pages/ # Chat、Settings、Skills
162+
│ ├── pages/ # Chat、Settings、Knowledge
156163
│ ├── stores/ # Zustand(chat、settings、theme…)
157164
│ ├── lib/ipc/ # Tauri IPC 封装
158165
│ └── locales/ # i18n(zh-CN / en)
159166
├── src-tauri/src/
160167
│ ├── commands/ # chat, session, mcp, settings…
161-
│ ├── db/ # migrations (v6), repository
168+
│ ├── db/ # migrations (v13), repository
162169
│ ├── services/
163170
│ │ ├── llm/ # Rig Provider、流式、工厂
164171
│ │ └── mcp/ # rmcp Manager
@@ -189,7 +196,7 @@ misaka-x/
189196
| Phase 2 | Rig 过渡对话、流式渲染、工作目录 ||
190197
| Phase 3 | Sidecar 预热、MCP、会话高级管理 | 🟡 **代码关门,待实机复验** |
191198
| Phase 4 | DeepAgents 全对话迁移 + PowerMem | ⏸️ Phase 3 完成后 |
192-
| Phase 5 | Skills + 知识库 RAG | 未开始 |
199+
| Phase 5 | Skills + 知识库 RAG | 🟡 Skills 已交付;RAG 未开始 |
193200
| Phase 6 | Dashboard、打包、跨平台发布 | 未开始 |
194201

195202
**续做指南:** [`PHASE_3_REMAINING_TODO.md`](docs/planning/PHASE_3_REMAINING_TODO.md)
@@ -199,9 +206,9 @@ misaka-x/
199206
```
200207
~/.misakax/
201208
├── config.yaml # 全局配置(主题、语言、sidecar_port 等)
202-
├── data/misaka.db # SQLite(Schema v6
209+
├── data/misaka.db # SQLite(Schema v13
203210
├── mcp.json # MCP Server 配置(可选)
204-
├── skills/ # 用户 Skills(Phase 5
211+
├── skills/ # 受管 Skills(启用前必须通过扫描 Gate
205212
├── managed/skills/
206213
├── plugins/
207214
├── models/

docs/design/SKILLS_WORKSPACE_TERMINAL_UI_DESIGN.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
> **用途:** 定义 Skills 设置页、按需文件预览、安全报告、输入框下方工作区标识和右侧终端的交互规范。
44
> **受众:** 产品、UI/UX、React、Rust IPC 和测试维护者。
55
> **最后审阅 / Last reviewed:** 2026-08-01
6-
> **状态:** 增量实施中;S1 稳定身份/激活闭环、S2 Settings/按需文件预览与 S3 内置隔离扫描/安全 findings 已落地;Sandbox 隔离的可选深度扫描器按用户范围延后,Workspace/Terminal 由 W1–W6 继续实施。
6+
> **状态:** 增量实施中;S1S3 与 S5 已落地,独立 Skills 路径和旧全文/双写兼容面已删除;Sandbox 隔离的 S4 可选深度扫描器按用户范围延后,Workspace/Terminal 由 W1–W6 继续实施。
77
> **上位规范:** [`frontend-ui-guidelines.md`](./frontend-ui-guidelines.md)[`shell-and-workspace-ui-spec.md`](./shell-and-workspace-ui-spec.md)[`button-menu-design-spec.md`](./button-menu-design-spec.md)
88
99
---
@@ -29,7 +29,7 @@ Skills
2929
关于
3030
```
3131

32-
Skills 紧邻 MCP 下方,使用与其他设置项相同的图标尺寸、选中背景、键盘焦点和 tooltip 规则。旧独立 Skills 入口移除;历史深链重定向后保持选中 Settings > Skills。
32+
Skills 紧邻 MCP 下方,使用与其他设置项相同的图标尺寸、选中背景、键盘焦点和 tooltip 规则。旧独立 Skills route/title/nav/page wrapper 均已删除;所有入口直接打开 Settings > Skills。
3333

3434
Skills tab 需要宽内容模式,但 Settings 的导航和顶部栏不变化。宽度只由 tab descriptor 声明,不能在组件内用负 margin 逃出容器。
3535

@@ -76,6 +76,12 @@ Skills tab 需要宽内容模式,但 Settings 的导航和顶部栏不变化
7676
- 外部 Skill 与受管 Skill 都允许禁用;外部文件仍留在原目录。
7777
-`review_required` 的人工批准是独立动作,不能通过反复点击 Switch 绕过。
7878

79+
### 4.3 首次升级扫描
80+
81+
- v13 将旧豁免 source 先显示为 `unscanned + disabled`;用户仍可进入详情、查看文件或删除受管 Skill,但不得在迁移完成前注入对话。
82+
- toolbar 下方的紧凑状态条显示 `completed / total` 与线性进度,并通过 `role="status"``aria-live="polite"` 汇报;完成且无错误后移除。
83+
- 失败状态显示失败数和 `size="xs"` outline“重试失败项”。重启恢复和重试使用后端持久化 item 状态,不用前端内存推断,也不提供跳过 Gate 的操作。
84+
7985
## 5. Skill 详情
8086

8187
### 5.1 固定头部

docs/design/button-menu-design-spec.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# MisakaX 按钮与菜单 UI 设计规范
22

3-
**最后审阅 / Last reviewed:** 2026-08-01(v12
3+
**最后审阅 / Last reviewed:** 2026-08-01(v13
44

55
> 主色已切换为 **charcoal**(非冷蓝强调色)。文中若仍出现历史「蓝调」示例,以实现侧 CSS 变量与 [frontend-ui-guidelines.md](./frontend-ui-guidelines.md) 为准。
66
>
@@ -1858,6 +1858,7 @@ Skills inventory 与详情头部的 Switch 还必须满足:
18581858
- 批准/拒绝是 reason 输入后的并列动作:拒绝使用 outline,批准使用默认主按钮;输入不足、请求 pending 或 scan 已失效时两者 disabled,禁止用连续 Toast 代替就地状态。
18591859
- “撤销批准”是可逆审计动作,使用 outline,不做 destructive 红色;删除 Skill/拒绝制品等不可逆动作仍遵循 Dialog 确认规则。
18601860
- JSON/SARIF 导出使用带 Download 图标的 outline 小按钮;必须先打开系统保存对话框,取消保存不显示成功 Toast。
1861+
- 存量扫描失败后的“重试失败项”使用 `size="xs"` outline Button,固定出现在迁移状态条右侧;只重试持久化 failed items,不提供“跳过扫描并启用”动作。
18611862

18621863
### 12.3 分段控件 (`.settings-segmented`)
18631864

docs/design/frontend-ui-guidelines.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
- **按钮、下拉菜单、Popover、Select、Dialog、Tooltip 等控件的细节与变体**:编写或调整时须同时对照 [button-menu-design-spec.md](./button-menu-design-spec.md)
99
- **可复刻参考(CodePilot)**[`docs/ui/02-chat.md`](../ui/02-chat.md)[`docs/ui/03-workspace.md`](../ui/03-workspace.md)[`docs/ui/04-settings.md`](../ui/04-settings.md)[`docs/ui/06-markdown-message-tools.md`](../ui/06-markdown-message-tools.md)(视觉与能力对齐;IA 以 shell 规范本期边界为准)。
1010

11-
**最后审阅 / Last reviewed:** 2026-08-01(v25
11+
**最后审阅 / Last reviewed:** 2026-08-01(v26
1212

1313
## 1. 设计理念 (Design Philosophy)
1414

@@ -147,14 +147,15 @@ MisakaX 的目标是打造一个**现代化、专业、克制的桌面端 Agent
147147

148148
### 4.3.z.1 Skills 设置与按需文件预览
149149

150-
- Skills 的稳定入口是 `Settings > Skills`历史 `{ page: "skills" }` 只做兼容重定向。领域 UI 必须由 `SkillsSettingsFeature` 承载,不重新依赖顶层 route
150+
- Skills 的唯一入口是 `Settings > Skills`不得恢复 `{ page: "skills" }`、独立 title/nav 分支或页面 wrapper。领域 UI 必须由 `SkillsSettingsFeature` 承载。
151151
- 选中已安装 Skill 的首屏只允许请求 summary 与目录页,`body_bytes_transferred` 必须为 0;没有明确选择文件前不得调用 `skills_read_file`,也不得默认读取或渲染 `SKILL.md`
152152
- 详情固定使用 `文件 / 安全 / 概览` 顺序并默认文件;安全摘要只在首次打开安全 tab 时按需加载。文件树与预览各自滚动,窄宽度改为上下两区,不让长文件撑高 Settings 根页面。
153153
- 文件树使用标准 tree ARIA 与 roving focus;支持方向键、Home/End、Enter/Space。所有异步目录页、预览段和扫描摘要都必须核对稳定 `skill_id` 与 generation,迟到结果直接丢弃。
154154
- 文本仅以转义后的源码 `<pre>` 展示;单段不超过 200 KiB、总预览不超过后端预算,并由用户显式继续加载。二进制或不支持编码只显示大小、编码和可用 hash 元数据,禁止 Base64/HTML/iframe/远端资源内联。
155155
- 安全 tab 继续按需加载;findings 必须分页并以纯文本展示已脱敏证据与修复建议。严重度筛选使用带 `aria-pressed` 的共享 Button,不以颜色作为唯一状态。
156156
- `review_required` 的批准/拒绝必须要求可审计原因;批准后 Skill 仍保持 disabled。已有有效批准在重新打开详情后必须可恢复并允许撤销,不能只存在于组件内存。
157157
- 内置扫描的隐私说明必须明确“离线且不上传”;任何未来会发送 hash、文件或内容的适配器都需在动作前独立确认,不得沿用内置扫描文案暗示已上传或已认证安全。
158+
- 存量安全迁移在 toolbar 下使用紧凑就地状态条和线性进度,不阻塞列表查看/删除;完成后自动消失,存在失败时保留失败数和“重试失败项”。状态须来自持久化 migration DTO 与事件,不能只存在于组件内存。
158159
- 具体布局、安全空态与 Switch 语义以 [Skills/Workspace/Terminal UI 设计](./SKILLS_WORKSPACE_TERMINAL_UI_DESIGN.md) 为准;本节只记录跨页面必须复用的实现约束。
159160

160161
### 4.4 空页面与占位符 (Empty States)

docs/design/shell-and-workspace-ui-spec.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
|------|------|
55
| **用途** | 定义主窗口混合壳结构、任务侧栏、对话页顶栏、设置页与工作区布局语义。 |
66
| **受众** | 负责 `AppShell``UnifiedTopBar``SessionPanel``SettingsSidebar``ChatPage``WorkspaceBar``SettingsPage` 及相关布局的前端开发者。 |
7-
| **最后审阅** | 2026-08-01(v26|
7+
| **最后审阅** | 2026-08-01(v27|
88

99
## 相关文档
1010

@@ -186,7 +186,7 @@ Provider 目录网格仅 `md:grid-cols-2`。Appearance 主题分段:`rounded-m
186186

187187
### 4.4 Settings > Skills 仓库
188188

189-
- Skills 是 Settings 第四个分区,固定置于 MCP 与 Appearance 之间,沿用 `SettingsSidebar``UnifiedTopBar` 与 resize gutter;旧独立 Skills route 在一个兼容周期内只重定向到 `{ page: "settings", tab: "skills" }`
189+
- Skills 是 Settings 第四个分区,固定置于 MCP 与 Appearance 之间,沿用 `SettingsSidebar``UnifiedTopBar` 与 resize gutter;独立 Skills route/title/nav/page wrapper 已移除,所有入口直接导航到 `{ page: "settings", tab: "skills" }`
190190
- Settings 内容槽为 Skills 使用 `wide` + `max-w-6xl`,同时保持 `h-full min-h-0 overflow-hidden`;禁止新增第二套侧边栏、网页式 Hero 或 feature 内负 margin。
191191
- 顶部固定信息层级为标题/短说明、已安装/在线发现切换、搜索、来源筛选与「上传安装」主操作;列表与详情在宽屏为紧凑双列,在窄宽度自然纵向排列。
192192
- 在线与已安装详情共用固定头部和 `文件 / 安全 / 概览` tabs。普通远端详情只取仓库元数据,不自动下载或解包制品;本地文件也只在用户点击后按相对路径读取。
@@ -202,6 +202,7 @@ Provider 目录网格仅 `md:grid-cols-2`。Appearance 主题分段:`rounded-m
202202
- 文件树默认可见但不默认选中文件,展示相对路径、类型和大小,目录按需展开并分页;未点击文件时正文读取次数必须为 0。文本源码按 200 KiB 分段显式继续加载;二进制/不支持编码显示 metadata 空态。远端未缓存制品必须解释“安装或显式扫描后检查”,不能暗中下载。
203203
- Security tab 的摘要、隐私契约、findings 和审批历史只在首次打开该 tab 后加载;findings 使用后端 cursor 分页,筛选变化必须丢弃旧页。JSON/SARIF 导出先走系统保存对话框,不在 WebView 中拼接下载链接。
204204
- `review_required` 就地显示原因输入与批准/拒绝;少于 3 个非空字符时动作 disabled。批准后的受管 Skill 仍为 disabled,已有有效批准跨详情重开/应用重启可恢复并可撤销;blocked 结论不能显示批准捷径。
205+
- 首次升级扫描状态条位于 toolbar 与双栏内容之间,宽度跟随 Skills 内容槽;pending/running 展示 `completed / total``completed_with_errors` 展示失败数与显式重试,completed 不占布局空间。
205206

206207
---
207208

0 commit comments

Comments
 (0)