推荐透明桌面 Widget 生产力工具 ------ 待办、便签、AI常驻桌面:忙蜂了(BitzBee Todos)
透明桌面 Widget 生产力工具 ------ 待办、便签常驻桌面,开机即用,不打扰工作流。效果如下:



| |
| 模板 · 纸色 · 显隐管理 | 独立贴窗 · 纸色主题 · 收起/关闭 |
AI 助手
在设置中配置 LLM 提供商并开启 AI 总开关后,Widget 叠加可选、可撤销的 AI 能力(关闭时完全退化为纯手动 Widget)。
| AI 配置 | 智能焦点 | 专家模式 · 任务分解 |


快速下载
最新版本下载
建设背景
桌面用户每天需要在「记录想法」「跟进任务」「切换工具」之间频繁跳转。现有方案各有短板:
| 方案 | 局限 |
|---|---|
| 独立 Todo 应用 | 需要 Alt+Tab 切换,打断心流 |
| 浏览器插件 / Web 应用 | 依赖浏览器常驻,无法真正嵌入桌面 |
| 系统自带便签 | 功能单一,缺少清单、标签、归档等组织能力 |
忙蜂了 (产品名,仓库代号 BitzBee Todos)面向这一场景:以透明磨砂 Widget 形式嵌入桌面,适配任意壁纸;按需显示待办清单与便签池,开机自启、托盘管理、贴边自动隐藏,让生产力工具像桌面的一部分而非额外窗口。
项目采用 OpenSpec 分 Release 迭代:Release 1 搭建 Widget 骨架与基础能力,Release 2 增强待办(多视图、层级、独立窗口),Release 3 重建 UI 并叠加 AI 一体化助手(基础设施、自然语言捕获、专家技能、每日焦点均已实现)。
解决的问题
- 常驻不打扰 --- 透明 Widget 浮于桌面,无需切换应用即可查看和操作
- 隐私可控 --- 快速隐藏、贴近屏幕边缘自动收缩,避免内容被他人看到
- 多清单并行 --- 每个待办清单对应独立窗口,可同时查看多个项目/场景
- 任务深度组织 --- 树形子任务、看板状态、优先级四象限、截止日期与日程视图
- 快速捕获 --- 快加条语法(
!P @日期 #标签)、右键菜单、行内重命名 - 便签即贴即用 --- 便签池统一管理,独立便签窗口可设纸色、模板,收起后仍可从池中恢复
- 本地优先 --- SQLite 本地存储,数据留在设备,为多端同步预留 UUID 与软删除模型
- 跨 Widget 同步 --- 写操作后 Rust 广播事件,所有窗口 Zustand Store 自动刷新
- AI 可选叠加 --- 总开关关闭时零侵入;开启后以 Rig 驱动捕获、焦点与专家技能,API Key 本地加密存储
- 自然语言捕获 ---
Alt+Space唤出胶囊,一句话解析为结构化任务(时间、优先级、标签等),乐观 UI + 失败降级 - 主动建议而非替代 --- 每日焦点 Strip、专家 Skill 分解任务,用户确认后才写入,可随时撤销或忽略
特性功能
Widget 与系统集成
- 透明无边框多窗口(待办清单窗、便签池、便签贴窗)
- Windows Mica / Acrylic、macOS NSVisualEffectView 磨砂效果
- 系统托盘:显示/隐藏各 Widget、动态清单菜单、新建便签、退出
- 开机自启(
tauri-plugin-autostart) - 窗口位置与宽度持久化(含多显示器越界校验与级联默认布局)
- 边缘自动隐藏:贴近屏幕边缘 ≤20px 时收缩,悬停展开(200ms 动画)
待办清单
- 多清单 --- 每个清单独立 Tauri 窗口,托盘动态管理
- 六种视图 --- 树形 / 看板 / 卡片 / 日程(日·周·月)/ 详情页 / 归档
- 任务能力 --- 任意深度子任务、四级优先级、Markdown 内容、备注、进度聚合、截止日期
- 交互 --- 拖拽排序(dnd-kit)、置顶、完成归档(3 秒延迟)、快加条、新建 Popover、右键上下文菜单
- 组织 --- 自定义标签、默认标签自动贴标、搜索与多标签 AND 过滤
- 侧栏 --- 覆盖式抽屉:清单切换、智能视图(今天/逾期)、标签过滤
便签
- 便签池(任务中心式列表):模板预设、纸色选择、显隐状态、数量上限
- 独立便签贴窗:纸色主题、收起/关闭、托盘快速新建空白便签
- 拖拽排序、置顶、归档与恢复
外观与品牌
- 「忙蜂了」品牌标识(顶栏蜜蜂图标 + 文案)
- 五套全局主题(default / dark / warm / cool / bright)
- 四套清单调色板(sage / sky / lavender / sand)+ 紧凑密度模式
- 清单级主题与强调色
AI 助手(Release 3)
设计原则:可选、透明、可撤销 --- AI 关闭时不影响任何基础 Widget 功能。
基础设施
- 多提供商:DeepSeek(默认)、OpenAI 兼容接口、本地 Ollama
- 安全存储:API Key 加密(Windows DPAPI / macOS Keychain),不上传第三方
- 总开关 + Feature 开关:捕获、焦点、专家等可逐项启用
- 隐私门禁:首次启用需确认数据发送范围;支持完全离线(Ollama)
自然语言捕获
- 全局快捷键
Alt+Space唤出 CaptureCapsule 浮层 - 输入自然语言 → AI 解析为结构化 Item(标题、截止、优先级、标签、清单等)
- 乐观 UI:立即显示「解析中」草稿,完成后静默回填;失败保留原文
- 歧义确认(最多一问)、剪贴板时间语义建议、速率限制与防抖
每日智能焦点
- 清单窗顶部 FocusStrip:每日推荐 3--5 条今日焦点任务
- 由当前活跃专家(时间管理大师 / 个人成长教练)的 Skill 驱动,附方法论理由
- 支持接受 / 推迟 / 替换 / 跳过反馈,「就做这 N 件」一键聚焦其余折叠
- 按本地日期缓存,切换专家后重新排序
专家与技能系统
- 两位内置专家:时间管理大师(GTD 导向)、个人成长教练(高能时段 × 微习惯)
- ExpertPanel 对话面板:Skill 按钮托盘、多轮对话、任务上下文注入
- 11 个系统 Skill (
SKILL.md文件驱动):含任务分解、GTD 分类、每日焦点等 - 显式 Skill 调用 + NL 意图路由;被动模式可后台自动 GTD 标注
- 专家名册、技能管理(开关 / 重新扫描 / 用户自定义 Skill 目录)
设计层面
视觉语言
- 透明磨砂优先 :窗口背景透明,内容区使用带 alpha 的 CSS Token(
--paper、--ink、--accent等),与系统 vibrancy 叠加 - 优先级色系 :P1--P4 四色块 + 逾期警示色
--warn,全局一致 - Widget Shell 结构:双行标题栏 → 工具栏(视图切换)→ FilterBar(搜索 + 标签 chips)→ 内容区 → Footer(快捷键提示)
- 响应式窗口宽度:树形/卡片 420px、看板 720px、详情 960px,随视图自动调整
交互原则
- IME 安全:中文输入法组合期间 Enter 不误提交(QuickAdd、InlineRename、树节点等)
- 软删除 + 撤销:删除任务 5 秒 Toast 可撤销,归档可还原
- 乐观反馈 :操作后立即更新 UI,后端写库成功后广播
data:*-changed - 设计稿驱动 :UI v2 对齐
design/gui/todosV1/线框与 Token 规范
信息架构
#mermaid-svg-pouZwwXnAyj9iDjf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pouZwwXnAyj9iDjf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pouZwwXnAyj9iDjf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pouZwwXnAyj9iDjf .error-icon{fill:#552222;}#mermaid-svg-pouZwwXnAyj9iDjf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pouZwwXnAyj9iDjf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pouZwwXnAyj9iDjf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pouZwwXnAyj9iDjf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pouZwwXnAyj9iDjf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pouZwwXnAyj9iDjf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pouZwwXnAyj9iDjf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pouZwwXnAyj9iDjf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pouZwwXnAyj9iDjf .marker.cross{stroke:#333333;}#mermaid-svg-pouZwwXnAyj9iDjf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pouZwwXnAyj9iDjf p{margin:0;}#mermaid-svg-pouZwwXnAyj9iDjf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pouZwwXnAyj9iDjf .cluster-label text{fill:#333;}#mermaid-svg-pouZwwXnAyj9iDjf .cluster-label span{color:#333;}#mermaid-svg-pouZwwXnAyj9iDjf .cluster-label span p{background-color:transparent;}#mermaid-svg-pouZwwXnAyj9iDjf .label text,#mermaid-svg-pouZwwXnAyj9iDjf span{fill:#333;color:#333;}#mermaid-svg-pouZwwXnAyj9iDjf .node rect,#mermaid-svg-pouZwwXnAyj9iDjf .node circle,#mermaid-svg-pouZwwXnAyj9iDjf .node ellipse,#mermaid-svg-pouZwwXnAyj9iDjf .node polygon,#mermaid-svg-pouZwwXnAyj9iDjf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pouZwwXnAyj9iDjf .rough-node .label text,#mermaid-svg-pouZwwXnAyj9iDjf .node .label text,#mermaid-svg-pouZwwXnAyj9iDjf .image-shape .label,#mermaid-svg-pouZwwXnAyj9iDjf .icon-shape .label{text-anchor:middle;}#mermaid-svg-pouZwwXnAyj9iDjf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pouZwwXnAyj9iDjf .rough-node .label,#mermaid-svg-pouZwwXnAyj9iDjf .node .label,#mermaid-svg-pouZwwXnAyj9iDjf .image-shape .label,#mermaid-svg-pouZwwXnAyj9iDjf .icon-shape .label{text-align:center;}#mermaid-svg-pouZwwXnAyj9iDjf .node.clickable{cursor:pointer;}#mermaid-svg-pouZwwXnAyj9iDjf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pouZwwXnAyj9iDjf .arrowheadPath{fill:#333333;}#mermaid-svg-pouZwwXnAyj9iDjf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pouZwwXnAyj9iDjf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pouZwwXnAyj9iDjf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pouZwwXnAyj9iDjf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pouZwwXnAyj9iDjf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pouZwwXnAyj9iDjf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pouZwwXnAyj9iDjf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pouZwwXnAyj9iDjf .cluster text{fill:#333;}#mermaid-svg-pouZwwXnAyj9iDjf .cluster span{color:#333;}#mermaid-svg-pouZwwXnAyj9iDjf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pouZwwXnAyj9iDjf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pouZwwXnAyj9iDjf rect.text{fill:none;stroke-width:0;}#mermaid-svg-pouZwwXnAyj9iDjf .icon-shape,#mermaid-svg-pouZwwXnAyj9iDjf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pouZwwXnAyj9iDjf .icon-shape p,#mermaid-svg-pouZwwXnAyj9iDjf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pouZwwXnAyj9iDjf .icon-shape .label rect,#mermaid-svg-pouZwwXnAyj9iDjf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pouZwwXnAyj9iDjf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pouZwwXnAyj9iDjf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pouZwwXnAyj9iDjf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 桌面 Widget 窗口
NL 解析创建任务
创建/显隐
系统托盘
显隐 · 新建便签 · 动态清单菜单 · 退出
待办清单窗 × N
?widget=list&listId=...
FocusStrip · ExpertPanel
便签池
?widget=note
便签贴窗 × N
?widget=sticky¬eId=...
捕获胶囊
Alt+Space · CaptureCapsule
技术层面
技术栈
| 层次 | 技术 |
|---|---|
| 桌面框架 | Tauri 2.x(Rust 后端 + WebView 前端) |
| 前端 | React 18 + TypeScript + Vite |
| 样式 | Tailwind CSS + CSS 自定义属性(Design Token) |
| 状态管理 | Zustand |
| 拖拽 | @dnd-kit |
| Markdown | react-markdown、@uiw/react-md-editor |
| 数据库 | SQLite(rusqlite bundled,WAL 模式) |
| AI 框架 | Rig(rig-core,Rust 端 LLM Agent / Extractor) |
| 透明磨砂 | window-vibrancy |
| 平台 | Windows 11+、macOS 13+ |
架构图
系统分层
#mermaid-svg-tz18XJCKQlHcpSt6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tz18XJCKQlHcpSt6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tz18XJCKQlHcpSt6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tz18XJCKQlHcpSt6 .error-icon{fill:#552222;}#mermaid-svg-tz18XJCKQlHcpSt6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tz18XJCKQlHcpSt6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tz18XJCKQlHcpSt6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tz18XJCKQlHcpSt6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tz18XJCKQlHcpSt6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tz18XJCKQlHcpSt6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tz18XJCKQlHcpSt6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tz18XJCKQlHcpSt6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tz18XJCKQlHcpSt6 .marker.cross{stroke:#333333;}#mermaid-svg-tz18XJCKQlHcpSt6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tz18XJCKQlHcpSt6 p{margin:0;}#mermaid-svg-tz18XJCKQlHcpSt6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tz18XJCKQlHcpSt6 .cluster-label text{fill:#333;}#mermaid-svg-tz18XJCKQlHcpSt6 .cluster-label span{color:#333;}#mermaid-svg-tz18XJCKQlHcpSt6 .cluster-label span p{background-color:transparent;}#mermaid-svg-tz18XJCKQlHcpSt6 .label text,#mermaid-svg-tz18XJCKQlHcpSt6 span{fill:#333;color:#333;}#mermaid-svg-tz18XJCKQlHcpSt6 .node rect,#mermaid-svg-tz18XJCKQlHcpSt6 .node circle,#mermaid-svg-tz18XJCKQlHcpSt6 .node ellipse,#mermaid-svg-tz18XJCKQlHcpSt6 .node polygon,#mermaid-svg-tz18XJCKQlHcpSt6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tz18XJCKQlHcpSt6 .rough-node .label text,#mermaid-svg-tz18XJCKQlHcpSt6 .node .label text,#mermaid-svg-tz18XJCKQlHcpSt6 .image-shape .label,#mermaid-svg-tz18XJCKQlHcpSt6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-tz18XJCKQlHcpSt6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tz18XJCKQlHcpSt6 .rough-node .label,#mermaid-svg-tz18XJCKQlHcpSt6 .node .label,#mermaid-svg-tz18XJCKQlHcpSt6 .image-shape .label,#mermaid-svg-tz18XJCKQlHcpSt6 .icon-shape .label{text-align:center;}#mermaid-svg-tz18XJCKQlHcpSt6 .node.clickable{cursor:pointer;}#mermaid-svg-tz18XJCKQlHcpSt6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tz18XJCKQlHcpSt6 .arrowheadPath{fill:#333333;}#mermaid-svg-tz18XJCKQlHcpSt6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tz18XJCKQlHcpSt6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tz18XJCKQlHcpSt6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tz18XJCKQlHcpSt6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tz18XJCKQlHcpSt6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tz18XJCKQlHcpSt6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tz18XJCKQlHcpSt6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tz18XJCKQlHcpSt6 .cluster text{fill:#333;}#mermaid-svg-tz18XJCKQlHcpSt6 .cluster span{color:#333;}#mermaid-svg-tz18XJCKQlHcpSt6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tz18XJCKQlHcpSt6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tz18XJCKQlHcpSt6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-tz18XJCKQlHcpSt6 .icon-shape,#mermaid-svg-tz18XJCKQlHcpSt6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tz18XJCKQlHcpSt6 .icon-shape p,#mermaid-svg-tz18XJCKQlHcpSt6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tz18XJCKQlHcpSt6 .icon-shape .label rect,#mermaid-svg-tz18XJCKQlHcpSt6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tz18XJCKQlHcpSt6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tz18XJCKQlHcpSt6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tz18XJCKQlHcpSt6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 存储层
Rust 后端
IPC 层 · Tauri Commands
表现层 · React WebView × N
listen()
widget:near-edge
invoke()
AI 核心层 · Rig
LlmClientFacade
DeepSeek / OpenAI / Ollama
CaptureAgent · Extractor
FocusAgent · Extractor
ExpertAgent · Agent + Memory
SkillLoader · ExpertRegistry · SkillDispatcher
App.tsx
URL 路由 + 全局事件订阅
ListWidget · StickyManager · StickyWidget
Shell / Todo / Tags / Settings 组件
Zustand Stores
items · lists · tags
lists.rs
items.rs
tags.rs
settings.rs
ai/* · ai_parse_nl · ai_daily_focus · ai_invoke_skill ...
窗口管理
动态创建清单窗/便签窗
edge_monitor.rs
边缘检测 100ms
系统托盘 · 自启 · vibrancy
emit_all 事件总线
DbState
Mutex Connection
Migration Runner
SQLite WAL
t_lists · t_items · t_tags · t_app_settings
单 SPA 多 Widget 路由
所有 WebviewWindow 加载同一 React 构建产物,由 URL 参数决定渲染内容:
#mermaid-svg-z5SI4oLuPVTREwjq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-z5SI4oLuPVTREwjq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-z5SI4oLuPVTREwjq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-z5SI4oLuPVTREwjq .error-icon{fill:#552222;}#mermaid-svg-z5SI4oLuPVTREwjq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-z5SI4oLuPVTREwjq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-z5SI4oLuPVTREwjq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-z5SI4oLuPVTREwjq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-z5SI4oLuPVTREwjq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-z5SI4oLuPVTREwjq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-z5SI4oLuPVTREwjq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-z5SI4oLuPVTREwjq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-z5SI4oLuPVTREwjq .marker.cross{stroke:#333333;}#mermaid-svg-z5SI4oLuPVTREwjq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-z5SI4oLuPVTREwjq p{margin:0;}#mermaid-svg-z5SI4oLuPVTREwjq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-z5SI4oLuPVTREwjq .cluster-label text{fill:#333;}#mermaid-svg-z5SI4oLuPVTREwjq .cluster-label span{color:#333;}#mermaid-svg-z5SI4oLuPVTREwjq .cluster-label span p{background-color:transparent;}#mermaid-svg-z5SI4oLuPVTREwjq .label text,#mermaid-svg-z5SI4oLuPVTREwjq span{fill:#333;color:#333;}#mermaid-svg-z5SI4oLuPVTREwjq .node rect,#mermaid-svg-z5SI4oLuPVTREwjq .node circle,#mermaid-svg-z5SI4oLuPVTREwjq .node ellipse,#mermaid-svg-z5SI4oLuPVTREwjq .node polygon,#mermaid-svg-z5SI4oLuPVTREwjq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-z5SI4oLuPVTREwjq .rough-node .label text,#mermaid-svg-z5SI4oLuPVTREwjq .node .label text,#mermaid-svg-z5SI4oLuPVTREwjq .image-shape .label,#mermaid-svg-z5SI4oLuPVTREwjq .icon-shape .label{text-anchor:middle;}#mermaid-svg-z5SI4oLuPVTREwjq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-z5SI4oLuPVTREwjq .rough-node .label,#mermaid-svg-z5SI4oLuPVTREwjq .node .label,#mermaid-svg-z5SI4oLuPVTREwjq .image-shape .label,#mermaid-svg-z5SI4oLuPVTREwjq .icon-shape .label{text-align:center;}#mermaid-svg-z5SI4oLuPVTREwjq .node.clickable{cursor:pointer;}#mermaid-svg-z5SI4oLuPVTREwjq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-z5SI4oLuPVTREwjq .arrowheadPath{fill:#333333;}#mermaid-svg-z5SI4oLuPVTREwjq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-z5SI4oLuPVTREwjq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-z5SI4oLuPVTREwjq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z5SI4oLuPVTREwjq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-z5SI4oLuPVTREwjq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z5SI4oLuPVTREwjq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-z5SI4oLuPVTREwjq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-z5SI4oLuPVTREwjq .cluster text{fill:#333;}#mermaid-svg-z5SI4oLuPVTREwjq .cluster span{color:#333;}#mermaid-svg-z5SI4oLuPVTREwjq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-z5SI4oLuPVTREwjq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-z5SI4oLuPVTREwjq rect.text{fill:none;stroke-width:0;}#mermaid-svg-z5SI4oLuPVTREwjq .icon-shape,#mermaid-svg-z5SI4oLuPVTREwjq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z5SI4oLuPVTREwjq .icon-shape p,#mermaid-svg-z5SI4oLuPVTREwjq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-z5SI4oLuPVTREwjq .icon-shape .label rect,#mermaid-svg-z5SI4oLuPVTREwjq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z5SI4oLuPVTREwjq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-z5SI4oLuPVTREwjq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-z5SI4oLuPVTREwjq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} list + listId
note
sticky + noteId
其他
Vite 构建的 React SPA
?widget=
ListWidget
树形/看板/卡片/日程/详情/归档/设置
StickyManagerWidget
便签池
StickyWidget
便签贴窗
Unknown widget
TreeView · KanbanView · CardsView
AgendaView · DetailPage · ArchiveView
数据流与跨窗口同步
写操作串行(Mutex),读可并发;变更通过 Tauri Event 广播到所有 WebView:
React Widget B emit_all SQLite Tauri Command React Widget A React Widget B emit_all SQLite Tauri Command React Widget A #mermaid-svg-CGHrpPRXoZ8ahRVp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CGHrpPRXoZ8ahRVp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CGHrpPRXoZ8ahRVp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CGHrpPRXoZ8ahRVp .error-icon{fill:#552222;}#mermaid-svg-CGHrpPRXoZ8ahRVp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CGHrpPRXoZ8ahRVp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CGHrpPRXoZ8ahRVp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CGHrpPRXoZ8ahRVp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CGHrpPRXoZ8ahRVp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CGHrpPRXoZ8ahRVp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CGHrpPRXoZ8ahRVp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CGHrpPRXoZ8ahRVp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CGHrpPRXoZ8ahRVp .marker.cross{stroke:#333333;}#mermaid-svg-CGHrpPRXoZ8ahRVp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CGHrpPRXoZ8ahRVp p{margin:0;}#mermaid-svg-CGHrpPRXoZ8ahRVp .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-CGHrpPRXoZ8ahRVp text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-CGHrpPRXoZ8ahRVp .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-CGHrpPRXoZ8ahRVp .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-CGHrpPRXoZ8ahRVp .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-CGHrpPRXoZ8ahRVp .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-CGHrpPRXoZ8ahRVp #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-CGHrpPRXoZ8ahRVp .sequenceNumber{fill:white;}#mermaid-svg-CGHrpPRXoZ8ahRVp #sequencenumber{fill:#333;}#mermaid-svg-CGHrpPRXoZ8ahRVp #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-CGHrpPRXoZ8ahRVp .messageText{fill:#333;stroke:none;}#mermaid-svg-CGHrpPRXoZ8ahRVp .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-CGHrpPRXoZ8ahRVp .labelText,#mermaid-svg-CGHrpPRXoZ8ahRVp .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-CGHrpPRXoZ8ahRVp .loopText,#mermaid-svg-CGHrpPRXoZ8ahRVp .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-CGHrpPRXoZ8ahRVp .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-CGHrpPRXoZ8ahRVp .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-CGHrpPRXoZ8ahRVp .noteText,#mermaid-svg-CGHrpPRXoZ8ahRVp .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-CGHrpPRXoZ8ahRVp .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-CGHrpPRXoZ8ahRVp .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-CGHrpPRXoZ8ahRVp .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-CGHrpPRXoZ8ahRVp .actorPopupMenu{position:absolute;}#mermaid-svg-CGHrpPRXoZ8ahRVp .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-CGHrpPRXoZ8ahRVp .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-CGHrpPRXoZ8ahRVp .actor-man circle,#mermaid-svg-CGHrpPRXoZ8ahRVp line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-CGHrpPRXoZ8ahRVp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 清单窗、便签池等同进程内所有窗口均收到广播 invoke("create_item", args) 1 INSERT(Mutex 串行写) 2 OK 3 data:items-changed 4 listen → itemsStore.refresh() 5 listen → itemsStore.refresh() 6
主要 IPC 事件:
| 事件 | 触发时机 |
|---|---|
data:items-changed |
条目增删改、归档、排序等 |
data:lists-changed |
清单增删改 |
data:tags-changed |
标签增删改 |
widget:near-edge |
窗口贴近屏幕边缘 |
settings:ui-theme-changed |
全局 UI 主题切换 |
ai:parse-complete / ai:parse-failed |
NL 捕获解析完成 / 失败 |
ai:focus-ready |
每日焦点计算完成 |
项目结构(概要)
octopus-todos/
├── src/ # React 前端
│ ├── App.tsx # Widget 路由 + 全局事件订阅
│ ├── widgets/ # ListWidget、StickyManagerWidget、StickyWidget、CaptureWidget
│ ├── components/ # todo/、shell/、sticky/、tags/、settings/、ai/
│ ├── stores/ # itemsStore、listsStore、tagsStore、aiStore
│ └── types/ # 共享 TypeScript 类型
├── src-tauri/ # Rust 后端
│ └── src/
│ ├── commands/ # lists、items、tags、settings、ai/
│ ├── skills/system/ # 系统预置 SKILL.md
│ ├── db/ # 连接、Migration
│ └── edge_monitor.rs # 边缘检测
├── docs/ # 界面截图(含 AI/)
├── design/ # PRD 与 UI 设计稿
├── openspec/ # OpenSpec 变更与任务追踪
└── scripts/ # setup.ps1、dev.ps1、build.ps1
快速开始
powershell
# 1. 安装环境(首次,需管理员权限)
.\scripts\setup.ps1
# 2. 重新打开终端后启动开发模式
.\scripts\dev.ps1
# 3. 生产打包
.\scripts\build.ps1
当前完成的功能
以下按 OpenSpec Release / 变更汇总,✅ 表示代码已实现;⏳ 表示规划或未开始。
Release 1 --- 核心 Widget ✅
- Tauri 多窗口 Widget 系统(透明、磨砂、边缘隐藏、位置记忆)
- 待办清单:多清单、CRUD、拖拽排序、置顶、完成归档、归档视图
- 便签:多清单、CRUD、拖拽排序、置顶、归档
- 标签系统:创建/编辑/删除、默认标签、FilterBar 过滤
- 本地 SQLite 数据层与 IPC 事件广播
- 系统托盘与开机自启
Release 2 --- 待办增强 ✅(代码完成,部分 E2E 待验)
- 每清单独立 WebviewWindow,托盘动态管理
- 树形视图(任意深度、折叠、进度聚合)
- 看板视图(待开始 / 进行中 / 已完成,跨列拖拽)
- 四级优先级与 Markdown 富文本输入
- 清单主题 / 视图模式持久化
- Migration 002 字段扩展(parent_id、priority、kanban_status 等)
Release 3 UI v2 --- 界面重建 ✅(代码完成,部分 E2E 待验)
- Design Token 与四套调色板
- Widget Shell 重构(TitleBar / FilterBar / Footer)
- 自定义 SVG 图标系统(替代 lucide-react)
- 右键上下文菜单、行内重命名、QuickAdd 语法解析
- 新建任务 Popover、Cards 视图、Agenda 视图(日/周/月)
- 详情大页(DetailPage)、侧栏抽屉、归档 v2、设置 v2
-
due_date字段(Migration 004)
便签任务中心 ✅
- 便签池 UI(模板、纸色、显隐状态)
- 独立便签贴窗(StickyWidget)
- 纸色与模板预设 IPC(Migration 005--008)
主题与品牌 ✅
- 「忙蜂了」品牌(顶栏、托盘图标、应用名)
- 五套全局 UI 主题,跨窗口同步
窗口位置持久化 ✅
- 清单 / 便签 / 便签池坐标 DB 存储与级联默认布局(Migration 009--010)
Release 3 AI 核心 ✅
- AI 基础设施:多提供商、API Key 加密、总开关、隐私门禁、Feature 开关
- 自然语言捕获:
Alt+SpaceCaptureCapsule、乐观 UI、歧义确认、剪贴板建议 - 每日智能焦点:FocusStrip、专家 Skill 驱动、反馈闭环、日期缓存
- 专家技能系统:ExpertPanel、ExpertRoster、11 个系统 Skill、Skill 管理
- Rig 集成:CaptureAgent / FocusAgent / ExpertAgent、FeatureExtractor、OutputValidator
- Harness 加固:上下文预算、Tool 并发安全、DPAPI/Keychain、速率限制
规划中 ⏳
- NL 捕获 Level 1 微执行(日历草稿、消息复制、搜索摘要等,需用户确认)
- 桌面日历清单(月/周/日视图、拖拽排程)
- 重复待办 / 农历重复、提醒通知
- 日期倒数、多端同步、移动端
许可证
见仓库内 LICENSE 文件(如有)。
相关文档
| 文档 | 说明 |
|---|---|
| CLAUDE.md | 开发约定与架构速查 |
| design/prd/ | 产品需求(Release 1--3) |
| openspec/changes/ | 变更提案、设计、任务清单 |
| openspec/changes/release3-ai-core/ | AI 核心设计与任务 |
| design/gui/todosV1/ | UI v2 线框与设计稿 |
| design/gui/v2/ | AI 界面设计稿 |
| docs/AI/ | AI 功能运行截图 |