# 推荐透明桌面 Widget 生产力工具 —— 待办、便签、AI常驻桌面:忙蜂了(BitzBee Todos)

推荐透明桌面 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 个系统 SkillSKILL.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+Space CaptureCapsule、乐观 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 功能运行截图
相关推荐
2601_957879331 小时前
矩阵系统在企业数字化获客中的实践与价值分析
人工智能·数字营销·矩阵系统·企业运营
水上冰石1 小时前
comfui的sd1.5模型,有多少采样算法,详解每一个采样算法
人工智能·算法
Rocky Ding*1 小时前
一文读懂HiDream-I1稀疏 DiT 图像生成基础模型
论文阅读·人工智能·深度学习·机器学习·ai作画·aigc·ai-native
标书畅畅行1 小时前
2026 年 AI 标书工具市场观察:技术迭代与选型指南
大数据·人工智能
Luminbox紫创测控2 小时前
氙弧老化测试全参数解析:滤镜类型、辐照度与黑标温度设定
人工智能·测试工具·安全性测试·测试标准
圣殿骑士-Khtangc2 小时前
OpenAI GPT-5 Agent Mode 正式发布:最长24小时自主任务,AI编程智能体大战升级
人工智能
2601_957884842 小时前
AI赋能的内容工程学:短视频矩阵系统的多模态内容生成与量产边界
人工智能·矩阵·音视频
JEECG低代码平台2 小时前
JimuChatBI — 首款免费开源的 Java 智能问数ChatBI平台,零成本接入,AI对话式智能分析
java·人工智能·开源·aigc·人工智能低代码
黎阳之光2 小时前
视频孪生+空天地水工融合,黎阳之光构建智慧水利监测新范式
大数据·人工智能·物联网·算法·安全