版本发布记录
未发布 (Unreleased)
已合入 main、尚未随任何已发布版本出去的改动;它们随下一版一起发布。
v0.176.0 (2026-10-26)
次版本:发进 agent 终端的文字现在按 agent 实际运行的 CLI 来投递,并修复了桌面版同一张卡开多个窗口时的几个问题。 本版没有数据库迁移。后端、桌面应用和 ud daemon 都有改动,请三者一起升级。
改进
- 简报和转发的回复按各个 agent CLI 接受输入的方式投递。 Claude Code 收到的是间隔发送的小块,长简报不再丢字;opencode 收到的是整段粘贴。这覆盖首次简报、卡片线程转发来的回复、以及发给空闲会话的简短提醒,桌面应用和
uddaemon 里都生效。 - agent 按它实际运行的 CLI 来启动和判断,不再看卡片上的工具字段。 daemon 现在只启动目录里列出的 agent CLI,取代原来的黑名单,普通 shell 开关会放行 shell。状态 hooks 和「找不到 CLI」提示都跟随会话实际运行的 CLI。桌面应用每 30 分钟、以及 daemon 连接恢复时,会重新读取 CLI 目录。
- 桌面版:同一张卡有多个工作区窗口时,每个窗口各用各的终端。 调整窗口大小和在窗口里打字,现在都送到该窗口自己的终端;以前都送到这张卡的第一个窗口。
- 桌面版:同一张卡有多个窗口时,「切换工作区」列表可用。 这张卡还开着其他窗口时,它的 Local 行可以点了;自己所在的那一行不再变灰(点它就是重新聚焦当前窗口);会话行显示卡片标题。
问题修复
- 在已经有同一个 agent 在线会话的卡上再点 Run,现在会提示。 对话框保持打开并显示提示,不再毫无反应。卡片上的 Run 对话框、全局启动器和项目启动器都是如此。
升级说明(自托管)
- 本版没有数据库迁移。
- 没有新增配置。 没有增删环境变量。
- 先升级服务端,再升级命令行和客户端, 和每一版一样。
命令行要你自己升级:发布新版本不会改变任何人机器上的 ud。有三条路,只用其中一条。
npm i -g @oatnil/ud # 用 npm 安装的
brew update && brew upgrade ud # 用 Homebrew 安装的
如果你的 ud 来自桌面应用,上面两行都不是你的路:请安装新的桌面应用(从下载页,或用 Homebrew 装的应用执行 brew upgrade --cask undercontrol)。应用里的「Install ud CLI」会把 /usr/local/bin/ud 做成指向应用包内的符号链接,所以你运行的 ud 就是应用自带的那个。
然后确认升级生效:ud --version 必须输出 udctl version 0.176.0。
v0.175.0 (2026-10-26)
次版本,命令行有几处不兼容改动,并且 agent 的 triggers 字段退役。 依赖 ud push 退出码为 0、或依赖未知命令打印帮助的脚本需要检查。本版有两个数据库迁移,升级前请先备份数据库。
不兼容改动
ud push因冲突跳过了条目时,退出码为 3。 以前是 0。条目推送失败或被拒绝时仍然是 1。- 未知命令或资源名报一行错误并以退出码 1 结束。
ud get foobarx、ud describe foobarx abc、ud get timeblock以前会打印帮助并以 0 退出,笔误看起来像成功。单独的ud get和--help输出与以前完全一样。三个曾经悄悄打印帮助的写法恢复可用:ud get saved-query(及sq)、ud upload、ud grep。 ud push读不了 frontmatter 的文件会被拒绝推送, 并说明原因,什么都不会发送,文件也不会被改写。ud status会点名这个文件。- agent 的
triggers字段退役。 每个 agent 都可以被 @ 提及、也可以手动启动,这个字段本来就没有控制过别的事。请求里仍带triggers会被接收,值被忽略;ud apply带spec.triggers的清单照常应用,并在 stderr 打印一行说明已忽略。on_assign和on_subscribe从此没有意义。过渡期内接口响应仍返回一个固定的triggers值,旧客户端照常工作。ud get agents少了TRIGGERS列,ud describe agent少了Triggers行,ud describe agent -o apply少了triggers键。
新功能
- 把文件拖进快速笔记对话框(网页和桌面版)即可附加到新任务。拖入的文件列为待附加,保存前可移除,创建任务时一并附上。拖到编辑器正文里的图片仍和以前一样内嵌。
- 网页里每个 agent 都出现在 @ 列表中, 包括以前没有提及触发器的 agent。agent 的创建、编辑表单不再显示 triggers 控件。
- 桌面版:macOS 上
Cmd+`可在应用的窗口之间切换。 Window 菜单现在带有标准的窗口角色。
改进
ud push和ud pull不再丢掉别人的修改。 只要还有未对账的远端改动(ud push跳过的冲突,或ud pull留下的冲突),同步 token 就不再前移。以前下一次ud pull可能显示「已是最新」,下一次ud push可能在不报冲突的情况下覆盖别人的修改。由此带来的变化:ud pull --keep-local之后再ud push仍会报冲突;要让本地版本胜出,用ud push --force。ud push会推送刚刚编辑过的文件。 以前最近两秒内改过的文件会被推迟,提示不清楚,退出码还是 0,于是「编辑后立刻推送」会把改动留在本地。- 任务 notes 文件夹里新增的
.md文件会作为该任务的 note 推送。 以前会被建成一个新任务。 .udignore只留在本地。 它不会被推送;旧版命令行留在服务端的副本会被忽略。- 刚推送完自己的改动就出现「Remote changes: modified: 1」的假提示已消除, 它影响所有上传过的资源。
- 错误只打印一次, 不再打印两遍;
ud init、clone、pull、push、status的运行时错误不再附带用法说明。服务端连不上、或遇到 401/403 时会加一行「Next:」提示。 - stdin 不是终端时、以及
--dry-run期间,ud push不再提问。ud pull --dry-run会列出有冲突的条目。ud status会写明每一处远端改动及其对应的本地文件。拉取的文件以换行结尾。新建或编辑过的 note 文件会被改名为ud pull按首行得出的名字。删除任务时会一并删除已同步的本地 note 文件(改过的会保留)。 - 内置 skill 把 clone 工作流(clone、本地编辑、push)作为批量编辑卡片的默认做法,并去掉了已被删除的
ud子命令。
问题修复
- 服务端时钟回拨后,登录可能被拒绝。 撤销游标之后签发的 token,时间戳可能早了一秒,被签发它的服务端自己拒绝。现在会等到时钟越过该点再签发。
升级说明(自托管)
- 首次启动会执行两个数据库迁移:00109 和 00110。 00109 从每个 agent 已存的 triggers 里去掉
on_assign和on_subscribe,并把旧值备份在名为agent_triggers_backup_00109的表里。00110 随后删除agent_configs的triggers列。升级前请先备份数据库。 回滚 00110 只会恢复一个带默认值的空列,不会恢复原来的内容。 - 没有新增配置。 没有增删环境变量。
- 先升级服务端,再升级命令行和客户端, 和每一版一样。
命令行要你自己升级:发布新版本不会改变任何人机器上的 ud。有三条路,只用其中一条。
npm i -g @oatnil/ud # 用 npm 安装的
brew update && brew upgrade ud # 用 Homebrew 安装的
如果你的 ud 来自桌面应用,上面两行都不是你的路:请安装新的桌面应用(从下载页,或用 Homebrew 装的应用执行 brew upgrade --cask undercontrol)。应用里的「Install ud CLI」会把 /usr/local/bin/ud 做成指向应用包内的符号链接,所以你运行的 ud 就是应用自带的那个。
然后确认升级生效:ud --version 必须输出 udctl version 0.175.0,ud get foobarx; echo $? 必须打印一行错误和 1。
v0.174.0 (2026-10-26)
次版本,命令行有一处不兼容改动:time block 资源改名为 time slot。 用了旧名字的脚本需要修改。本版没有数据库迁移。
不兼容改动(命令行)
timeblock改名为timeslot。 资源名是timeslot,ud apply文档里的kind由TimeBlock改为TimeSlot。可见别名:timeslots、time-slot、slot、slots。旧名timeblock、timeblocks、time-block、tb以及 kindTimeBlock不再识别,和任何未知词一样报未知资源错误。如果你的脚本里有ud get timeblock、kind: TimeBlock的ud apply、ud describe timeblock,请改成timeslot/TimeSlot。ud cook配方改名:schedule-slot、move-slot、rebind-slot、delete-slot。this-week、layer-agenda、export-week名字不变。- 网页的英文界面里原来的 "time block" 现在写作 "time slot"。
新功能
ud clone <虚拟路径> [目录]把一个虚拟路径检出到新文件夹。 相当于mkdir加第一次ud pull,用法像git clone:ud clone /Work/Alpha/会创建./Alpha,并把/Work/Alpha/下的内容拉进去。目录名默认取路径最后一段(会改成适合文件系统的写法,每处改写都会打印出来)。目标目录非空、或位于已有跟踪文件夹之内会被拒绝且不写入任何文件;根路径/必须显式给出目录。之后cd进去照常使用ud pull、ud push、ud status。这是新命令,没有改动已有命令。- 新用户的 Alfred 默认 prompt 更新。 补进了回复格式、给其他 agent 发消息、几条边界;项目有负责人(lead)时优先经 lead 派工。这只作用于为新用户创建的 Alfred,已有用户的 Alfred 不会被覆盖;已有实例的 agent 配置页里 Default 行可能显示「与系统默认不同(最近一次改动在 v0.174.0)」,这只是在提示出厂文本换了。
升级说明(自托管)
- 没有数据库迁移。 不会对你的数据库做任何操作。
- 没有新增配置。 没有增删环境变量。
- 先升级服务端,再升级命令行和客户端。 新的 Alfred 默认 prompt 来自服务端。
- 升级命令行时,同时修改用了旧
timeblock名字的脚本,改法见上文。
命令行要你自己升级:发布新版本不会改变任何人机器上的 ud。有三条路,只用其中一条。
npm i -g @oatnil/ud # 用 npm 安装的
brew update && brew upgrade ud # 用 Homebrew 安装的
如果你的 ud 来自桌面应用,上面两行都不是你的路:请安装新的桌面应用(从下载页,或用 Homebrew 装的应用执行 brew upgrade --cask undercontrol)。应用里的「Install ud CLI」会把 /usr/local/bin/ud 做成指向应用包内的符号链接,所以你运行的 ud 就是应用自带的那个。
然后确认升级生效:ud --version 必须输出 udctl version 0.174.0,ud clone --help 必须能打印 clone 的用法。
v0.173.1 (2026-10-25)
补丁版本:更正 v0.173.0。 Awaiting Decision 与 Follow-up 两列属于系统自带的 All Tasks 看板,不在新建看板的模板里。本版没有数据库迁移。
对 v0.173.0 的更正
- 更正:撤回「新建看板默认 7 列」。 v0.173.0 的说明写了不带 columns 新建看板会得到 7 列(含 Awaiting Decision 与 Follow-up),这不是原本的意思。现在不带 columns 新建看板得到按状态分的 4 列:To Do、In Progress、Pending、Done。已有的看板不变,包括 v0.173.0 期间你已建好的 7 列看板。
- Awaiting Decision 与 Follow-up 是系统自带 All Tasks 看板最左的两列。 它们沿用固定标签
awaiting-decision和follow-up;在两列之间移动卡片会互换标签、不改状态。命令行读取:ud get task --board __system_all_tasks__ --column Follow-up。无需迁移:这块看板每次读取时由服务端现造,升级服务端后就能看到两列。ud-cliskill、ud cook配方和自然语言查询提示已按此更正。
问题修复
- All Tasks 看板上拖拽卡片报
KANBAN_BOARD_NOT_FOUND。 自 2026-09-26 起这块看板上的任何移动都被拒绝,现已恢复。 - 用不认识的
board_type新建看板返回 500。 现在返回 400,错误信息会指出是哪个字段。
升级说明(自托管)
- 没有数据库迁移。 不会对你的数据库做任何操作。
- 没有新增配置。 没有增删环境变量。
- 先升级服务端,再升级命令行和客户端。 新的列布局和拖拽修复来自服务端。
命令行要你自己升级:发布新版本不会改变任何人机器上的 ud。有三条路,只用其中一条。
npm i -g @oatnil/ud # 用 npm 安装的
brew update && brew upgrade ud # 用 Homebrew 安装的
如果你的 ud 来自桌面应用,上面两行都不是你的路:请安装新的桌面应用(从下载页,或用 Homebrew 装的应用执行 brew upgrade --cask undercontrol)。应用里的「Install ud CLI」会把 /usr/local/bin/ud 做成指向应用包内的符号链接,所以你运行的 ud 就是应用自带的那个。
然后确认升级生效:ud --version 必须输出 udctl version 0.173.1。
v0.173.0 (2026-10-25)
小版本:CLI 里有了日历(ud get timeblock),新建看板自带七列跟进流程,并修了一批月度记账流程里的问题。 本版没有数据库迁移。
新功能
- CLI 里的日历:timeblock。
ud get、ud describe、ud apply、ud delete、ud patch现在都能操作timeblock(slot、task-slot是隐藏别名)。ud get timeblock --since today --until +7d列出你在卡上排好的时段;-o agenda按天排成日程;--saved-query <查询>只看某个已保存查询选中的卡,这就是日历图层的做法。ud describe task和ud describe wctx新增 Schedule 一节:这张卡的全部 timeblock 和合计时长。找不到时段现在报TASK_SLOT_NOT_FOUND,不再报TASK_NOT_FOUND。服务端对应GET /task-slots/{slotId},所有/task-slots/{slotId}路由都认唯一的 id 前缀。 - 新建看板自带七列。 不带列新建的看板现在是 Awaiting Decision、Follow-up、To Do、In Progress、Pending、Done、Recent,并有固定标签
awaiting-decision和follow-up。网页里「新建看板」不用再填列。已有看板不变。ud get task --column在该列按截止时间排序时多显示一列 DEADLINE,内置的ud-cliskill 写进了跟进约定,自然语言查询也认这两个标签(比如「等我拍板的有哪些」)。 - CLI 里的文件操作。
ud download file <id> [-o 路径]会核对大小和存下来的 sha256/md5,不一致就不留下文件(--force覆盖)。ud move file用--from-path和--to-path移动文件夹,或用 id 加--to-path移动文件,不加--yes只预览。ud get file --path <前缀> --recursive一次请求列出整个目录树,带 PATH 列。ud upload resource新增--content-type和--on-conflict。 - CLI 里的记账。
ud get expense和ud get income支持本地筛选--since、--before、--currency、--amount、--min、--max、--title、--account、--budget。ud delete现在能删支出、收入、账户和预算。ud apply一个 Budget 会写入初始金额和每一条计划与调整,更新预算只能追加。 - 定时任务建卡能设置更多。
task_creation任务现在能设置卡的路径、项目、关联、负责人和状态,ud apply和ud apply -o apply都支持;模板新增布局、日期偏移和{{prev_month}},足够让月度记账卡自己建出来。 - iOS 能播放视频附件。 本地文件存储的下载支持 Range 请求(206)和 HEAD,这是 iOS 播放器需要的。
改进
- API Key:90 天和 1 年。 网页提供的这两个有效期之前被后端以 400 拒绝,现在都能用了。
- 日期可以直接写
YYYY-MM-DD。 支出、收入的occurredAt和资产的acquiredAt/disposedAt接受纯日期,日期写错会返回 400 并点名字段。ud apply里不加引号的 YAML 日期不再被丢掉,-o apply会给日期加引号。 - 带空格的文件夹能同步。
ud sync resource遇到带空格的文件夹不再报 400,CLI 现在会转义所有拼进查询串的值。 - 文本预览选对编码。 资源预览先按声明的字符集解码,再试 UTF-8,再试 GB18030,中文文本文件不再显示成乱码。
- 创建预算: 币种不再写死 USD,开始日期可以只写日期,出错时会点名字段并给出提示。
- 支出和收入显示: 没有日期的支出显示
-,ud describe总会打印 Occurred 和 Budget 两行。
问题修复
- 把卡移到另一列 现在会同时刷新其他显示这张卡的列,看板不会再留着一份过期的副本。
ud describe和ud apply -o apply只保留kickoff和deadline的 UTC 日期, 所以 describe、编辑、apply 一圈下来会悄悄丢掉具体时刻。现在保留时刻。- 没有权限的账号创建 API Key 现在返回 403
AUTH_APIKEY_PERMISSION_NOT_HELD(请求有误则是 400),不再是 500。 ud sync resource会重复上传相同的文件。 现在同名且内容相同的文件会被跳过,旧文件的元数据也不会再被覆盖。
行为变化
ud sync resource遇到同名但内容不同的文件,默认替换。 旧文件进回收站,可以恢复。想两份都留,加--on-conflict keep-both;ud upload resource有同样的开关。- 按可为空的列排序时,没有值的卡现在一律排在最后, SQLite 和 Postgres 都一样,升序降序都一样。以前 SQLite 升序时它们排最前,Postgres 降序时它们排最前。
升级注意(自托管)
- 没有数据库迁移。 不会对你的数据库做任何操作。
- 没有新增设置。 没有新增或删除环境变量。
- 先升级服务端,再升级 CLI 和 App。 新的
ud get timeblock、ud download file等命令会调用旧服务端没有的路由和字段。 - 已有看板的列不变。 只有升级之后新建的看板才是七列默认模板。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.173.0。
v0.172.1 (2026-10-23)
小版本:ud get sessions 现在能列出已停止、已结束的会话,内置的 agent-creator 能创建 agent 团队,也能在一次会话里创建多个 agent。 本版没有数据库迁移。
v0.172.0 已作废、从未部署:它的 CLI 和 Linux 桌面包没有通过发版检查。请以 v0.172.1 为准,它包含 v0.172.0 下列出的全部内容,外加发布它们所需的那一处修复。
新功能
ud get sessions --status。 以前这个命令只列活会话(外加 24 小时内 lost 的),已停止或已结束的会话按卡查不到。--status可取pending、running、planning、awaiting_input、stopped、exited、lost、failed,用逗号分隔或重复传入,可与--task、--limit、--page、--all组合。例如ud get sessions --status stopped --task <卡>列出那张卡已停止的会话。不带--status时和以前完全一样。服务端对应GET /workspace/sessions?status=:带上它就没有 24 小时窗口,未知状态会被拒绝,匹配总数放在X-Total-Count响应头里。- agent-creator 能创建和更新 agent 团队。 它的 skill 新增「Agent Teams」一章(团队字段、创建团队、用导出、编辑、再应用的方式更新团队、以及回读成员 id),内置的
ud-cliskill 也写进了团队相关命令。
改进
- agent-creator 一次会话能创建多个 agent。 以前同一次调用里它会拒绝创建第二个;现在可以成批创建,每个 agent 都走完整套流程。agent-creator 的默认 prompt 中英两个版本都有改动。
升级注意(自托管)
- 没有数据库迁移。 不会对你的数据库做任何操作。
- 没有新增设置。 没有新增或删除环境变量。
- 先升级服务端,再升级 CLI。 新 CLI 的
ud get sessions --status打到旧服务端会直接报错、不显示结果,因为旧服务端不认这个筛选,不会给你一份没过滤的列表。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.172.1。
v0.172.0 (2026-10-23)
小版本:ud get sessions 现在能列出已停止、已结束的会话,内置的 agent-creator 能创建 agent 团队,也能在一次会话里创建多个 agent。 本版没有数据库迁移。
已作废:这一版从未部署,CLI 也没有发布。请使用 v0.172.1。
新功能
ud get sessions --status。 以前这个命令只列活会话(外加 24 小时内 lost 的),已停止或已结束的会话按卡查不到。--status可取pending、running、planning、awaiting_input、stopped、exited、lost、failed,用逗号分隔或重复传入,可与--task、--limit、--page、--all组合。例如ud get sessions --status stopped --task <卡>列出那张卡已停止的会话。不带--status时和以前完全一样。服务端对应GET /workspace/sessions?status=:带上它就没有 24 小时窗口,未知状态会被拒绝,匹配总数放在X-Total-Count响应头里。- agent-creator 能创建和更新 agent 团队。 它的 skill 新增「Agent Teams」一章(团队字段、创建团队、用导出、编辑、再应用的方式更新团队、以及回读成员 id),内置的
ud-cliskill 也写进了团队相关命令。
改进
- agent-creator 一次会话能创建多个 agent。 以前同一次调用里它会拒绝创建第二个;现在可以成批创建,每个 agent 都走完整套流程。agent-creator 的默认 prompt 中英两个版本都有改动。
升级注意(自托管)
- 没有数据库迁移。 不会对你的数据库做任何操作。
- 没有新增设置。 没有新增或删除环境变量。
- 先升级服务端,再升级 CLI。 新 CLI 的
ud get sessions --status打到旧服务端会直接报错、不显示结果,因为旧服务端不认这个筛选,不会给你一份没过滤的列表。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.172.0。
v0.171.0 (2026-10-22)
小版本:新增内置 skill-builder agent,新账号不再种出内置的 ud agent,超大文档不再卡死应用。 本版没有数据库迁移。
新功能
- 新增内置 skill-builder。 下次进入工作区时自动出现;被 @ 叫醒后,它会和你一起把一件事跑通,再沉淀成 skill。
改进
ud不再作为内置 agent 种出。 你已有的ud原样保留,只是不再带「默认」标记;想清理可以运行ud delete agent ud(回收站里可以恢复)。新账号得到六个默认 agent,Alfred 遇到「缺的是一套做法而不是一个人」时会转给 skill-builder,而不是去招人。- 超大 markdown 文档不再卡死应用。 10 万字符以内渲染和以前完全一样;10 万到 50 万字符会排版但代码块不做语法高亮;超过 50 万字符先显示源文本并给出提示,可以选择「渲染排版」,上限 200 万字符。编辑器在 10 万字符以上不做高亮,50 万字符以上默认进入源码模式。改动前实测:1 MB 会让页面卡 5.2 秒,5 MB 卡 49 秒。
- 网页端发出的评论用一个 id 对上已保存的那一条。 网页上每一次发送(线程回复、卡片回复、新评论、新会话的第一条消息)现在都带一个客户端消息 id,待确认的那一行先按它去对,评论不会显示两次。
- 资源管理器改用树状连接线, 不再有展开箭头。
ud cook agent列出新的六个默认 agent 名字,ud delete agent的帮助改为指向 @alfred。
升级注意(自托管)
- 没有数据库迁移。 新的 skill-builder 会在你下次进入工作区时加入该工作区。
- 没有新增设置。 没有新增或删除环境变量。
- 已经有
udagent 的账号继续保留它。 只有新账号不再收到。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.171.0。
v0.170.0 (2026-10-22)
小版本:网页和桌面端的聊天更稳(你发出的内容立刻显示、切走也不丢),退出登录不再留下账号数据,agent 更快收到第一条提示词。 本版跑一个数据库迁移,只新增一列。
新功能
- agent 写的评论带可见的「Agent」标记。 别人的 agent 也会标出来,在共享线程里可以分清是人说的还是 agent 说的。
- AI 聊天读线上文档站。 助手的
list_docs和get_doc_section现在读 udctl.com,不再用打包在 App 里的旧副本,所以回答来自当前文档。只会读取 udctl.com;超过 40,000 字符的页面会被截断。
改进
- 发出去的评论不再消失。 还没被服务端确认的评论,以及你正在写的草稿,在切换线程、关闭面板、点「取消」之后都还在。服务端现在会把客户端自选的消息 id 原样回传,App 靠它把你的待确认行和已保存的那一行对上。
- 各处聊天的外观和行为一致。 所有聊天界面用同一种绝对时间格式和按天分隔行。会话线程打开时直接停在底部、没有动画,会记住已打开的线程,你往上翻着看时不会被拉到底。订阅栏在加载时保持高度。
- Alfred 快速输入。 发送失败的消息留在列表里并带重试,第一帧来自缓存。
- AI 聊天更稳。 打开时停在底部,你往上翻时不打扰,并保留草稿。答完的回答一次渲染完,不再跳动。问题在回答开始前会变暗,「停止」立刻结束流,失败的回答可以重试。回答里的链接用链接颜色,指向评论的链接可以用。
- AI 聊天只在你要求打开时才打开页面, 找不到你说的那个东西时,现在会说「查找失败」,而不是说任务不存在。
- agent 更快收到第一条提示词。 桌面 App 和
uddaemon 现在一看到提示词整段上屏就确认送达,不再等固定的延迟。在桌面 App 里对 Claude Code 实测:键入式简报以前约 1.9 秒,现在约 1.1 秒;粘贴式回复以前约 0.95 秒,现在约 0.3 秒。要用上这一项,需要新的桌面 App,或者运行你 agent 的那台电脑上新的udCLI。 udCLI 的试用服务器改为https://api.udctl.com。 你已有的config.yaml不会被改写。
问题修复
- 退出登录现在会清掉属于这个账号的全部数据。 以前只清名字里带「storage」或「cache」的浏览器存储,所以 AI 聊天记录、通知、标签、技能、看板任务列表、提示词历史和快速笔记草稿都留了下来。现在退出登录还会重新加载页面,同一个页面上下一个登录的人看不到上一个账号的数据。服务器地址、语言、布局和已保存的账号会保留。
- 所属用户已不存在或已停用的 API key 会被拒绝。 以前它仍然能用;一个已删除管理员留下的 key 能通过所有管理员路由。
- 删除用户和访客清理任务现在会删掉这个账号拥有的全部内容。 以前只删登录信息和用户行,它的卡片、agent 和群组成员关系还留着,归属于一个已经不存在的用户。管理员可以对「用户行已不在、但还有数据」的 id 再跑一次同样的删除来清理残留。
升级注意(自托管)
- 升级前先备份数据库。 首次启动会跑一个迁移:给评论表加一列
client_message_id,所有已有评论该列为空。已有内容不会被修改或删除。 - 先升级服务端,再升级应用和 CLI。 新版应用发评论时会带一个客户端消息 id,只有 0.170.0 及以后的服务端才会存它。
- 没有新增设置。 没有新增或删除环境变量。
- 已删除或已停用账号的 API key 会失效。 正常、有效的 key 不受影响。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.170.0。
v0.169.0 (2026-10-20)
小版本:AI 聊天可以直接帮你打开页面;管理员可以按人设置每日 AI 额度;「ud desktop」第一版,让 CLI 操作你的桌面 App。 本版跑两个数据库迁移,都只新增表。
新功能
- AI 聊天就地打开页面。 让聊天带你去某处(「打开我的看板」「看一下任务 1a2b3c4d」),它会直接在应用里跳过去,而不只是告诉你怎么走。它只能打开应用自己的页面,每次回复最多一次;任务 id 必须恰好对应一张你看得到的任务。桌面版里,从副窗口发出的请求会在主窗口打开页面。
- 管理员可按人设置 AI 额度。 系统管理员可以给单个用户设一个和全站不同的每日 AI 免费额度,包括「无上限」,也可以让这个用户恢复全站值。管理员后台新增 AI 额度 页面:显示全站默认值和每个有覆盖的用户,以及谁在什么时候改的。没设覆盖的用户行为和以前完全一样。Pro 和 Max 服务端可用。
ud desktop:让 CLI 或 agent 操作你的桌面 App(第一版)。ud desktop open <path>、focus、close、windows、list、status会把命令发给你自己在线的桌面 App,由它执行并回报结果。只允许五种动作,有频率限制;App 带你跳转时会弹一个带「返回」的短提示;Daemons 页面有一个开关可以在这台电脑上关掉这项功能,并列出最近的命令。--daemon可以按 id、前缀、别名或机器名选电脑。你的桌面 App 都不在线时,什么都不会发出去。
改进
- 管理员看到的 AI 用量如实了。 管理员看到的每日额度以前显示「无上限」,实际上管理员和其他人一样受限。现在显示真正生效的额度;不该受限的管理员给他设一个「无上限」覆盖即可。
- 桌面版:只有一个窗口持有和 daemon 的连接。 开着多个窗口时,它们不再大约每秒互相抢一次 daemon 连接。
- 桌面版:查询机器 id 慢时不再卡住应用。 现在 3 秒超时,失败后 60 秒内不再重试。
问题修复
- AI 聊天回复里的链接又能点了。 指向应用内页面(例如某个任务)的链接自 7 月起显示成灰色的「[blocked]」。
- Windows 桌面版不再弹空的控制台窗口。 应用在后台运行的命令不再闪出 cmd.exe 窗口。
已知事项
ud desktop在端到端验收完成之前随版发布。 服务端和桌面端两半都在本版里,但剩下的验收(对真实安装的 App 做大量跳转、用--daemon选另一台电脑)只能在装上本版之后做,目前还没跑。Daemons 页面上的开关默认是开的;不希望命令到达某台电脑,就在那里关掉。
升级注意(自托管)
- 升级前先备份数据库。 首次启动会跑两个迁移:
desktop_commands和ai_user_quota_overrides。两个都只新建表,不修改也不删除任何已有内容。 - 先升级服务端,再升级应用和 CLI。
ud desktop、桌面 App 的命令处理和 AI 额度页面调用的路由,只有 0.169.0 及以后的服务端才有。配旧服务端时,ud desktop用不了,AI 额度页面会显示加载错误。 - 没有新增设置。 没有新增或删除环境变量。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.169.0。
v0.168.0 (2026-10-19)
小版本:图片 AI 描述(默认关闭);桌面版占用的内存大幅减少;标签页右键菜单新增「关闭标签页」。 本版不跑数据库迁移。
新功能
- 图片 AI 描述,默认关闭。 个人资料页新增一个用户级的「自动描述图片」开关(你不打开就一直是关的),以及视觉模型的选择:内置档位,或你自己的 provider。开关打开后,新上传的图片会把一段描述追加到文件说明里,文件 Inspector 会标明这段是 AI 写的。Inspector 里的「生成描述」按钮不论开关开没开都能手动生成一次;点一次加一段。它需要和修改文件一样的权限,并按你选的 provider 和每日额度计算。这个按钮只对能被描述的图片出现。
- 发给 AI 的是什么。 先发应用本来就会生成的小缩略图。只有文件没有缩略图、且原图是不超过 10 MB 的 JPEG、PNG、GIF、WebP 时才发原图。其他情况,包括 SVG 和没有缩略图的 HEIC,不做描述。
- provider 拒绝时你能看到。 开关打开期间,个人资料页会用红字显示最近一次被拒绝的原因:provider、HTTP 状态和 provider 自己的原话,直到之后有一次描述成功。如果你选了内置档位、但服务器没有内置的视觉模型,个人资料页会提示你改选自己的 provider。重试也不会成功的拒绝(除 408 和 429 之外的 4xx)现在会直接结束任务,不再重试。
- 桌面版:标签页右键菜单新增「关闭标签页」。 关闭方式和点 x 一样。
- 桌面版:聊天输入框按 Enter 发送。 桌面版里,评论、回复、撰写和会话输入框按 Enter 发送;Cmd/Ctrl+Enter 和 Shift+Enter 换行。输入法正在组词时按 Enter 不会发送,空草稿也不会发送。网页版仍是 Cmd/Ctrl+Enter 发送。发出的消息会立刻显示,失败时留在屏幕上标成失败并可重试;会话输入框会把你的文字放回去。
改进
- 桌面版占用的内存大幅减少。 终端输出不再在不显示它的窗口之间来回拷贝;主窗口里已结束会话的终端输出,在会话结束 60 秒后释放;界面状态的保存对每项设置最多每秒写一次,会话窗口完全不写。
- Agent 会话窗口会自己关。 Agent 会话的进程退出 60 秒后,它的窗口自动关闭(你正聚焦的窗口保留;你自己开的终端从不关闭)。如果一个会话被误标成「丢失」而它的终端其实还活着,会被重新报告为运行中。
- 桌面版每分钟把渲染进程的内存用量写进日志。 只记录,不做任何处理。
问题修复
- 把视觉 provider 改回内置档位现在能保存了。 设为显式 null 的偏好之前被当成「缺少值」拒绝。
- 生成缩略图时不再把同一时刻写入的描述抹掉。
- 迟到的「运行中」上报不再让已经停止或已退出的会话复活。
- 会话从「丢失」纠正回运行状态后,会重新显示它的输出。
图片 AI 描述的发版说明
以下原文照抄自卡 55bfbe68 的放行裁定:
「用户级自动描述默认关;手动按钮已暴露缩略图路径;8 图读数发版后当天在 udv 补齐,主体一致丢 2/8 及以上就当天出补丁让手动触发改回送原图。」
升级注意(自托管)
- 没有数据库变更。 本版不新增迁移。
- 先升级服务端,再升级网页版和桌面版。 「生成描述」按钮和个人资料页的拒绝提示调用的路由,只有 0.168.0 及以后的服务端才有。新版应用配旧服务端时,只是得不到描述。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.168.0。
v0.167.0 (2026-10-18)
小版本:每个文件都能写一段说明;内置 AI 有了全站每日上限,每个模型有了单独的价格。 本版跑两个数据库迁移,都只是新增。
新功能
- 每个文件都能有说明。 文件现在可以带一段最多 4096 个字符的自由文本说明。在文件 Inspector 里点一下输入框写,点到别处就保存;清空输入框就是删掉说明。文件列表的搜索现在同时匹配文件名和说明,你输入的
%和_按字面匹配。写说明需要的权限和修改文件一样,所以只有只读权限的群组成员改不了。 - 用 CLI 设置文件说明。 对 File 用
ud apply -f现在认description。不写这个键就保留原来的说明;写""就清空;写一段非空文字就替换。同样的文字应用两次不会有任何变化。只写description:而不给值会被拒绝并给出提示,而不是当成「保留」,所以改到一半的文件不会不小心把说明抹掉。ud describe file会显示说明,-o apply也会带上它。 - 内置 AI 有了全站每日上限。 除了每个人自己的每日额度,管理员现在可以用
AI_TOTAL_DAILY_FREE_QUOTA给整台服务器每天的总用量封顶。到顶之后调用会被拒绝,返回新的错误AI_GLOBAL_QUOTA_EXCEEDED(429),而且被拒绝的这次不会占用任何人自己的额度。默认是关闭的,没配置的服务器行为和以前一样。 - 每个内置 AI 模型有自己的价格。 管理员在系统设置
ai.model_rate_multipliers里按模型填写一次调用算多少点数(例如{"openai/gpt-4.1-mini": 1}),填0表示「不计费」。模型选择器里有价格的模型会显示Nx角标,没有价格的模型显示为灰色、不能选。你自己的 provider key 从不计费,也不受影响。
改进
- 内置 AI 的每个请求现在有边界。 请求体超过 256 KB 会被拒绝,返回新的错误
AI_REQUEST_TOO_LARGE(413);要求的回复长度超过 8192 token 会被降到 8192;实际使用的模型总是所选 provider 配置的那个,而不是浏览器自己指定的。这只作用于内置 provider;用你自己的 key 发出的调用原样透传。 - 内置 AI 聊天现在会记录 token 数。 当内置 provider 是 Claude 时,回复结束(或连接断开)之后,用量记录会补上输入和输出 token,这样就能拿一次调用的真实成本去对照给它定的价格。它只记录,不改任何额度或价格。
- 用量计数和额度提示现在说的是 AI「点数」,不再说「免费次数」。
问题修复
- GitHub 回调地址规则变化后,网页版的 GitHub 登录继续可用。 GitHub 不再接受带 "#" 的回调地址,网页版现在同时接受不带 # 的 /oauth/callback/github 路径,并把登录交给登录页完成。你这边无需任何操作;如果你自建了 GitHub App,请把它的回调地址改成你的应用地址加 /oauth/callback/github。
升级注意(自托管)
- 升级前请先备份数据库。 首次启动会跑两个迁移,都只是新增:
00104_add_description_to_resources给文件加一个空的description列,00105_create_ai_global_usage_counter新增一张计数表。两者都不改写已有的行。 - 内置 AI 在你给模型定价之前会拒绝所有模型。
ai.model_rate_multipliers初始是{},没有条目的模型会在计数之前被拒绝,返回AI_MODEL_RATE_NOT_CONFIGURED(503)。如果你的服务器用了内置(管理员或启动时配置的)AI provider,升级后马上以系统管理员身份在系统配置里设好这张表,例如{"openai/gpt-4.1-mini": 1},并读回确认。在此之前,那个 provider 的模型在选择器里是灰色的。用个人自己的 key 发出的调用不受影响。不是「整数值的扁平对象」的设置,保存时就会被拒绝。 - 可选: 把
ai.rate_check_admin_bypass设为true,管理员可以免费调用没有定价的模型(仍然会被记录);用AI_TOTAL_DAILY_FREE_QUOTA给整台服务器每天封顶(默认-1是关闭)。 - 先升级服务端,再升级任何要编辑文件说明的客户端。 说明的路由只有 0.167.0 及以后的服务端才有。新网页配旧服务端时,只是不显示价格角标,所有内置模型照常可选。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.167.0。
v0.166.0 (2026-10-18)
小版本:一次给很多文件打标签,上传时就能带标签,Telegram 和 Discord 桥在全新的自托管服务器上现在能找到你自己的 Alfred。 本版不跑数据库迁移。
新功能
- 文件批量打标签。 新增的
PATCH /api/v1/resources/batch/tags一次请求最多可以给 100 个文件增加和移除标签。它只增加和移除你指名的标签,不会替换文件的整套标签,所以同一时刻从别处设置的标签不会被覆盖。返回结果按文件列出:已更新、因为本来就是你要的结果而跳过、或失败(在回收站里的文件、不存在的文件、你没有权限修改的文件会各自失败,不影响其余文件)。它需要的权限和修改单个文件标签一样。 - 上传时带标签。 发起上传时现在可以带上标签。如果上传的内容和你已有的某个文件完全相同,新标签会加到那个已有文件上,原有标签保留。用同样的标签再传一次同一个文件,不会有任何变化。不带标签的上传和以前一样。
改进
- Alfred 的默认指令新增「回复格式」一节。 它要求回复简短、先给答案,选项带编号并推荐其中一个,卡片和 note 写成可点击的链接而不是裸 id。新用户自动得到。已经有自己 Alfred 的用户,副本不会被改动;agent 配置页会显示「与系统默认不同(最后修改于 v0.166.0)」,你可以对照后自己决定是否采用。
问题修复
- 通过 Telegram、Discord 或快捷输入和 Alfred 聊天时,现在会找你自己的那个 Alfred。 以前这些消息总是发给同一个固定的内置 id,而这个 id 只属于第一个认领它的用户。在全新的自托管服务器上这个 id 根本不存在,于是评论被
TASK_MENTION_NO_ACCESS拒绝,桥对所有用户(包括管理员)都不能用。「Alfred 是否在线」的状态现在检查的也是同一个副本。 - 关于提及的文档页,示例里不再写死某个 agent 的 id,因为每个 agent 的 id 因用户、因实例而不同。
升级注意(自托管)
- 没有数据库变更。 没有要跑的迁移,退回上一个版本也不需要恢复备份。
- 先升级服务端,再升级任何用到批量打标签、或上传时带标签的客户端。 新路由和上传的
tags字段只有 0.166.0 及以后的服务端才有。 - 已有的 Alfred 副本不会被改写。 只有新建的 Alfred 副本才带新的「回复格式」一节。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.166.0。
v0.165.1 (2026-10-17)
补丁版本:设置弹窗在宽窗口下一屏放得下,桌面端「在这里开 Claude Code」打开的终端现在会在最前面,贴给 agent 的设置提示词也多指了几个去处。 本版不跑数据库迁移,服务端代码没有改动。
改进
- 窗口宽度 1024 像素以上时,设置弹窗的两个区块并排显示,设置一屏就能放下,不用滚动。
- 桌面端:「在这里开 Claude Code」打开的终端现在会显示在最前面。 点击之后终端窗口会显示并获得焦点,不再留在 App 后面。
- 贴给 agent 的设置提示词现在还会指向官网、自托管指南、
llms.txt和 Telegram 群。
升级注意(自托管)
- 没有数据库变更。 没有要跑的迁移,退回上一个版本也不需要恢复备份。
- 服务端没有改动。 这一版改的是网页端、桌面端和贴出去的提示词,服务端、App 和 CLI 之间没有必须遵守的升级顺序。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.165.1。
v0.165.0 (2026-10-16)
次版本:首次设置更简单。欢迎弹窗改成两个区块,桌面端首次启动会自动注册这台电脑,一个按钮就能打开 Claude Code 并把设置提示词贴好。 本版不跑数据库迁移。
新功能
- 两区块的设置弹窗,加一个「已连接」页面。 原来的三步向导没有了。弹窗显示哪些已经设好、还差什么,agent 报到之后切换到「已连接」页面。「注册这台电脑」一行有三种状态,能分清「已完成」「还没做」和「失败」。
- 桌面端:「在这里开 Claude Code」。 设置弹窗可以在桌面 App 里打开一个终端,并把 agent 设置提示词已经贴好。它不会替你提交,也不会在任何卡上创建卡或 agent 会话。
- 桌面端:这台电脑首次启动时自动注册。 主窗口在 App 第一次启动时注册本机,不需要点任何东西。
- 设置页新增「这台电脑与 agent」区块。 三行内容显示这台电脑和你的 agent,状态和设置弹窗一致;个人资料页的 Agents 下也显示同样的 CLI 状态。
ud config onboarding --done。 可以在 CLI 里把设置标记为完成。这个命令还会按服务端给上下文命名、给出 agent 提示,并带一行 hooks 授权。ud config onboarding增加 Telegram 一行。 Telegram 不可用时,这一行会说明原因。
改进
- 桌面端:CLI 的安装状态有了统一的判断。 App 会判断
ud是 App 装的、你自己装的,还是没装,并且可以打开或关闭它自己的链接;你自己装的ud不会被覆盖或删除。Linux 上 App 只装到~/.local/bin,不再要管理员权限;旧版本做的/usr/local/bin/ud链接按「你自己装的」处理,永远不会被删除。 - 贴给 agent 的设置提示词只有一个来源,网页弹窗、桌面按钮和文档站不会再各说各的。
- 桌面安装包更小。 桌面包不再额外带一份预压缩的网页文件。
- 欢迎卡片文案重写(链接到「快速开始」,不再让你拖东西),内置的
ud-guide增加了 Alfred 一节。
问题修复
- 在资源页删除文件(单个或批量),现在也会把它们从资源管理器侧栏移除。
ud delete file --permanent现在能处理已经在回收站里的文件,前提是用完整 UUID 指定。
升级注意(自托管)
- 没有数据库变更。 没有要跑的迁移,退回上一个版本也不需要恢复备份。
- 先升服务端,再升 App 和 CLI。 设置弹窗通过一个新接口
POST /api/v1/onboarding/agent-ready报告 agent 已连接,这个接口只有这一版服务端有。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.165.0。
v0.164.0 (2026-10-15)
次版本:任务、agent、skill、文件共用一个回收站,有回收站页面可以恢复或彻底删除;note 可以转成任务;资源管理器里有置顶卡片;日历时间段可以复制。 有四个数据库迁移:升级前请先备份数据库(见升级注意)。
新功能
- 删除 skill、agent 或文件现在会移入回收站。 任务本来就是这样。skill 以前删了就没了;agent 以前数据还在,但恢复不回来。现在删掉的东西都先进回收站,直到你恢复或彻底删除。删掉的文件会从列表和附件中消失,但在彻底删除之前仍占用存储配额;存储配额会显示回收站占了多少。
- 一个回收站页面装下所有删掉的东西。 打开
/trash(原来的任务回收站链接也会跳到这里),删掉的任务、agent、skill 和文件按删除时间倒序排在同一个列表里,可以按类型筛选,列表长时点「加载更多」。「恢复」把它放回原处;如果名字在这期间被新东西占了,会先让你把那个改名。「彻底删除」在原地确认,删了就不能撤销。 - CLI 也能用回收站。
ud restore agent|skill|file <名字或 id>、ud get agents|skills --deleted、ud get file --deleted,以及ud delete agent|skill --permanent(只对已经在回收站里的)。ud delete file现在是移入回收站;ud delete file <id> --permanent一步彻底删除,也是释放存储空间的唯一办法。一个名字对上多个已删除文件时,会列出候选,不会替你挑一个。 - note 转成任务。 在 note 上右键选「转为任务」:用 note 的内容新建一张卡,新卡建好之后才删掉这条 note。只有 note 的所有者能用。
- 资源管理器里的置顶卡片。 你置顶的卡片(在任何客户端置顶的,包括 iOS)出现在资源管理器顶部一个可折叠的区域。在卡片行上右键可以置顶或取消置顶;在置顶行上右键可以在新标签页打开、在树里定位或取消置顶。
- 复制日历时间段。 时间段的预览浮层里有「复制」按钮,拖动时按住 Option(Alt)会放下一份副本而不是移动。副本是同一张卡上的另一个时间段。
- 在详情页改任务所在文件夹。 点 Path 一行,可以选已有文件夹、根目录、未归档,或者新建文件夹;旁边的按钮会在资源管理器里定位这张卡。
- 资源管理器「复制路径」。 在文件夹、卡片或文件行上右键选「复制路径」。只用于阅读和粘贴,ud 仍然按 id 定位条目。
改进
- 桌面端标签页的关闭按钮一直可见,在最后一个标签上点它会关闭窗口,和 Cmd/Ctrl+W 一样。
- agent 详情页把「与系统默认不同」改成顶部横幅,很长的 Soul Prompt 不会再把它挤出屏幕;Soul Prompt 挪到了最后。手机宽度下,标题区的操作按钮换到名字下面一行,
@名字不会被挤掉。 - 加载更快。 服务端会压缩 API 响应和网页端的文件,网页端带哈希的文件由浏览器缓存,整页刷新不再重新下载整个应用。AI 对话的回复重新恢复逐字流式输出,不再一次性整段出现。
- 网络错误按你的界面语言显示,不再是原样的「Failed to fetch」。
- 任务路径选择器 前缀匹配排在前面,回车选中高亮的文件夹,Esc 只关闭选择器。
- 桌面端:agent CLI 试运行和真实会话一样。 它在终端里、用你登录 shell 的配置跑,在会话里能用的 CLI 不会再因为 PATH 不全而试运行失败。
问题修复
- 支出不会再指向一个不存在的预算。 短的预算 id 会解析成完整 id;对不上任何预算或对上多个的 id 会被拒,而不是存下来。AI 记账找不到预算时会丢掉这个预算,而不是整条失败。
ud config onboarding的 skill 一行现在能变成完成。 它建议的命令改用新的ud describe skill <名字> -o skill,写出 agent 能加载的 skill 文件。登录提示里写的桌面端后端端口改成真实的 24816。- CLI:支出和收入的
account_id按账户名称说明,这也是网页端存的值;TUI 里完整显示,不再截成 8 个字符。
升级注意(自托管)
- 升级前请先备份数据库。 本版带四个迁移:
00100_add_derived_from_id_index_to_todolist_items(一个索引)、00101_skills_soft_delete、00102_agent_configs_recycle_bin和00103_resources_soft_delete(skill、agent、文件的回收站字段)。本版之前删掉的 agent,升级后会出现在回收站里。迁移跑过之后,要退回旧版本只能用这份备份恢复:旧版服务端不认识已删除的 skill 和文件,会把它们当成正常的显示出来。 - 先升服务端,再升网页端和 CLI。 回收站页面和回收站命令调用的接口只有这一版服务端有,对着旧服务端会失败。
- 可选: 如果服务端前面的代理已经在压缩响应,可以设
UD_API_COMPRESSION=false关掉服务端自己的压缩。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.164.0。
v0.163.0 (2026-10-12)
次版本:交易、预算、账户可以导出 CSV;写错形态的成员 mention 会被拒,不再悄悄丢掉;停止 agent 会话一次就停。 有一个数据库迁移:升级前请先备份数据库(见升级注意)。
新功能
- 交易导出 CSV。 交易页在盲看开关旁边多了一个下载按钮。选一个日期范围(默认是你在图表里点进去的那个月),先看会导出多少行,再下载 CSV,列为类型、日期、标题、金额、币种、预算、账户、来源、描述和 ID。当前所在的支出 / 收入 / 全部标签会生效,标题搜索不生效。只给了开始或只给了结束日期的范围,文件名写作
from-<日期>或to-<日期>,不会被看成某一天。 - 预算导出 CSV。 预算页也有下载按钮。按月视图导出所选月份每个预算的月预算、已花和剩余;累计视图导出每个预算的总额、已花、剩余和开始日期。超支的预算剩余保留负号。隐藏的预算跟随页面的「显示隐藏」设置。
- 账户可导出快照或余额历史。 账户导出改为打开同一个对话框。可以选当前余额快照(就是以前那份导出),也可以选某个日期范围内的余额历史。历史加载中会显示加载状态,加载失败会报错,而不是给出一份空文件。
改进
- 三个财务页面用同一个导出对话框。 确认后对话框直接关闭,不再弹成功提示;日期控件跟随界面语言。所有 CSV 都是带 BOM 的 UTF-8,表格软件打开时字符正确。
- 负数金额按数字导出。 防止单元格被当成公式执行的保护,不再把
-18这类普通带符号数字变成文本。以=或@开头的值,以及以+、-开头但不是数字的值,仍然受保护。 - agent CLI 编辑器去掉了「选项」一栏。 自从 agent 改成每个模型一行 CLI,预设参数选项就没有任何地方再用;编辑器现在只有 slug、名称和命令。仍带
extra_options的 apply 文件照常接受,该字段被忽略;新版 CLI 会打印一行弃用提示。
问题修复
- 写错形态的成员 mention 在保存时被拒。 形态差一点的 mention 链接(少了方括号、名称前没有
@、漏了member/)以前会被当成普通文字存下,谁也不会收到通知。现在保存含有这种链接的卡片正文、note、评论或回复会失败,错误信息里给出正确写法。编辑时只检查新加的 mention,已有内容不受影响。 ud stop session一次就能停下会话。 以前停止会话只杀掉 daemon 启动的那个 shell,agent 本身还在跑,还可能把已停止的会话又拉回来。现在 daemon 会结束 agent 的整个进程组,CLI 会等到会话真正结束,服务端也不再让迟到的状态上报复活已停止的会话。
升级注意(自托管)
- 升级前请先备份数据库。 本版带迁移
00099_drop_agent_cli_extra_options,删除 agent CLI 表的extra_options列。列里的值会被删掉,这些值没有任何地方在用。迁移跑过之后,要退回旧版本只能用这份备份恢复。 - 先升服务端,再升 CLI。 停止会话的修复分服务端和 CLI 两半,两半都要有。升级 CLI 后请重启 daemon(
ud daemon stop,再ud daemon start),让它跑上新代码。 - 内置 Alfred 提示词。 本版更新了 Alfred 的默认提示词。已有的 Alfred 保留当前提示词;agent 详情页会显示与新默认的差异,点「恢复默认」会用新默认整段替换。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.163.0。
v0.162.0 (2026-10-10)
次版本:网页端和桌面端新增照片页,另修了资源列表的两处问题。 没有新增数据库迁移。自托管:先升服务端,再升网页端和桌面端(见升级注意)。
新功能
- 照片页。 网页端和桌面端的侧栏新增「照片」入口。它按月把你的照片和视频排成时间线,新的在前,往下滚会继续加载。视频缩略图上会显示时长。
- 查找和筛选照片。 筛选栏可以只看照片或只看视频、只看从手机相册同步来的文件、按拍摄日期范围或按文件名筛选。生效的筛选条件显示成可以逐个清除的标签。右侧的年月索引可以直接跳到某个月。
- 全屏查看器。 点照片或视频即可全屏查看。用方向键或屏幕上的箭头在时间线里前后切换,查看文件里存的拍摄信息,直接播放视频,下载原文件。浏览器无法显示的 HEIC 照片,会显示缩略图、拍摄信息和下载按钮。
问题修复
- 按日期筛选现在包含截止日当天。 按拍摄日期筛选资源时,选「截止到某天」会漏掉当天零点之后拍的所有文件。现在整天都包含在内。给出具体时刻的筛选不受影响。
- 一页要很多条时,资源列表的页数对了。 请求每页超过 100 条时,服务端只返回 100 条,却按请求的条数算总页数,客户端于是提前停止翻页。现在返回的每页条数和总页数与实际返回的一致。
升级注意(自托管)
- 没有新增数据库迁移。 升级前备份数据库仍是好习惯。
- 先升服务端,再升网页端和桌面端。 照片页依赖上面那条日期筛选修复;连着旧服务端时,选截止日期或跳到某个月,会漏掉那一天或那个月最后几张照片。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行(从下载页装;如果桌面 App 是用 Homebrew 装的,用 brew upgrade --cask undercontrol)。App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.162.0。
v0.161.2 (2026-10-10)
补丁版本:网页端的照片和视频有缩略图了;拍摄时间会自己更正;CLI 能正确识别 HEIC 和视频;服务端开始清理没传完的上传。 没有新增数据库迁移。自托管:先升服务端、再升网页端和手机 App,并请看新的每日清理说明(见升级注意)。
改进
- 网页端的照片和视频有缩略图了。 在网页端上传图片或视频时,会生成一张小预览图和文件一起存下,同时在上传时读出照片的拍摄时间(会考虑时区)。之前上传、没有缩略图或拍摄时间的文件,第一次在网页端打开时会补上。
- 拍摄时间会自己更正一次。 上传时还不知道拍摄时间的文件,先用上传时间占位。之后第一次被能读出真实拍摄时间的 App 打开时,真实时间会替换占位,文件也就排到时间线上正确的位置。已经是真实拍摄时间的,永远不会被改。
- CLI 按文件内容识别照片和视频。
ud upload resource以前会把 HEIC 照片(某些系统上还有 MP4、MOV 视频)标成普通二进制文件,于是没有预览、也没有拍摄时间。现在它看文件本身,没有扩展名也能标对。
问题修复
- 没传完的上传不再越积越多。 开始了但没完成的上传,以前会一直留在资源里、还占着存储额度。现在服务端每天清理一次(见升级注意)。
升级注意(自托管)
- 没有新增数据库迁移。
- 新增的每日清理默认开启。 每天 04:00(服务器时间),服务端会删除开始上传 24 小时后仍未完成的上传,连同它的文件、与任务的关联、媒体信息和所占的存储额度一起删。我们自己的两台实例上,第一次运行会在一台上删 390 条,另一台没有;抽查的那些背后都没有实际文件。要关掉,设置
PENDING_UPLOAD_CLEANUP_ENABLED=false;PENDING_UPLOAD_TTL_HOURS和PENDING_UPLOAD_CLEANUP_SCHEDULE可以改时长和时间。只在CRON_ENABLED开着时运行(默认开)。 - 先升服务端,再升网页端和手机 App。 新版 App 补照片信息时会发「只补缺的」更新。旧服务端不认识这个选项,会当成普通更新,可能覆盖掉照片已有的信息。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.161.2。
v0.161.1 (2026-10-10)
补丁版本:CLI 里所有类型都能用短 ID;照片和视频记住拍摄时间;npm 上的自托管服务端包只下载你自己平台的那一份。 一个数据库迁移,只新增一张表。自托管:升级前请先备份数据库,并且先升服务端、再升 CLI(见升级注意)。
改进
- CLI 里处处可用短 ID。
ud凡是接 id 的地方,任何类型都接受 id 的任意唯一开头:看板、项目、自建 agent、技能、会话、资源、定时任务、预算、账户、支出、收入等,不再只限任务、笔记和评论。前缀长度不设下限。一个前缀匹配到多项时会列出候选(短 id 加名称),不替你猜;已删除或已结束的对象会如实报出,不再一律说「找不到」。内置 agent 仍用名字指定(例如alfred)。 - 照片和视频记住拍摄时间。 从这一版起上传的媒体,服务端会保存上传端报来的拍摄时间、尺寸、时长和机型。资源列表可以按拍摄时间排序(没有拍摄时间的排在最后),按类型(图片或视频)和拍摄时间范围筛选;资源统计可以按拍摄月份计数。这一版之前上传的文件不做回填。
- npm 上的自托管服务端下载变小。
npm i -g @oatnil/ud-server现在只下载你这个系统的服务端二进制,不再把五个平台全部下下来。如果关掉了可选依赖(--no-optional),安装程序会自己去取本平台的二进制;取不到就停下并告诉你该装哪个包,绝不装一个空壳。
问题修复
ud describe note和ud delete note又能用短 id 了;以前用短前缀会回「Note not found」。- 回收站里的任务会报「已删除」,不再当成一个从没存在过的 id。
升级注意(自托管)
- 升级前请先备份数据库。 首次启动会跑一个迁移:
00098新增media_infos表。只新增,不改动也不搬运任何已有数据。 - 先升服务端,再升 CLI。 0.161.1 的
ud把短 id 交给服务端解析,对着旧服务端时,短 id(包括任务的)可能报找不到。完整 id 两边都照常能用。 - 用 npm 装的服务端: 照旧用
npm i -g @oatnil/ud-server@0.161.1升级;npm 会自己拉取对应平台的包(@oatnil/ud-server-darwin-arm64、-darwin-x64、-linux-x64、-linux-arm64或-win32-x64)。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.161.1。
v0.161.0 (2026-10-09)
次版本:agent CLI 可以先试运行再用;每条派发评论下能看到它起了哪个会话;资源插件和插件库;Excalidraw 编辑器。 三个数据库迁移,其中一个删列。自托管:升级前请先备份数据库,并且 CLI 和服务端一起升级(见「升级注意」)。
新功能
- agent CLI 试运行。 在 agent CLI 编辑对话框里,命令下面多了「试运行」按钮:在你自己的一台在线机器上(优先本机,有多台时让你选)用已保存的命令跑一轮,结果显示「可用」和耗时,或「失败」和 CLI 自己给出的原因。覆盖 claude、codex、pi 三种命令;其他形态显示「不在覆盖范围」。命令有未保存的修改时按钮不可用,因为试运行跑的是已保存的那条。
- 评论下的派发回执。 派发了 agent 的评论下面会多一行回执:哪个 agent 接了、它的会话是在运行、启动失败,还是交给了一个已经在跑的会话。任务评论区和对话线程视图里都有。
- 在提到 agent 的地方直接选 CLI。 在评论里提到一个 agent 时,输入框会显示它将用哪个 CLI 运行,点一下可以只为这一条消息换一个,或者新建一个。链接里也可以按名字指定 CLI,不只是按 id。
ud get sessions多了 CLI 一列,显示每个会话跑的程序和模型,例如claude claude-sonnet-5-5。- 模型不存在的会话几秒内就判失败。 以前 CLI 命令里写错了模型,会话照常启动,大约 90 秒后才以一句笼统的话标成失败。现在第一轮出现的模型错误会立刻让会话失败,原因就是那条错误。
- 资源插件。 设置里多了「资源插件」:安装一个单文件 HTML 插件,让它接管你指定后缀的文件的查看,也可以卸载。插件在不能联网的沙箱里运行,安装前需要你确认风险。「插件库」列出已发布的插件,一键安装,安装前先核对文件哈希;还会提示更新,插件被回退时跟着回退,你装的插件被下架时会提醒。官方提供一个 Jupyter notebook(
.ipynb)查看器作为示例插件。 - 打开方式。 文件详情页和预览里会显示当前用哪个查看器打开,可以换成其他任何一个,或按文本查看、直接下载;也可以把某个选择设为这个后缀的默认打开方式。
- Excalidraw。
.excalidraw文件可以预览,也可以把 Excalidraw 绘图当作资源新建和编辑。字体从应用自身加载,不访问第三方网站。 - 图表从应用自身加载。
.drawio文件的预览和编辑器不再访问 diagrams.net。文档里新增「第三方许可」页,列出为此随附的组件。 - 日历:跨度视图。 新增一个只读视图,把每张卡画成从开工到截止的一整块,可跨天,日、周、月、日程视图都有。
- 队列:可以删除队列任务,在列表或详情页都能删。
问题修复
- 被别人加进群的人,马上就能看到群里的内容。 以前被别人加进群后,最长一小时里访问群里共享的内容都是「找不到」。建群的人现在也能马上看到新群。
- CLI 守护进程登录过期或被吊销后会自己恢复:自己刷新 token,不再一直 401 直到有人重新登录。CLI 写配置文件的方式也改了,别的
ud进程不会再读到写了一半的文件;两个进程同时刷新 token 时也不会丢掉刷新后的那个。 ud tui里切换上下文真的会切过去。 以前用--context启动后再切换,状态栏说已经切了,请求却还发往原来的上下文。- 一个邀请码只能用一次。 在 PostgreSQL 服务端上,邮箱稍长时邀请码标记为已用会失败,于是一个码能注册好几次。注册失败时现在也会显示真正的原因,例如邀请码无效。
- 没有执行者的队列任务类型会被直接拒绝,给出明确的错误,不再建出来一直挂在等待中。会建出这种任务的「运行命令」入口已从队列页移除。
- 内嵌的图表预览不再白屏(在自己托管网页应用的服务端上)。
- 清空的截止时间、开工时间和负责人,在手机端也保持清空。
- 资源插件的文件已经不在时也能卸载;插件出错时,面板里显示错误,不再是一片空白。
- 日期跟随应用语言,不再跟随浏览器语言。任务详情里的评论标签改叫「评论」,不再和侧边栏的「对话」重名。任务详情右侧面板能滚到最后一行。许多只有图标的按钮有了读屏名称,资源页面补全了中文。
升级注意(自托管)
- 升级前请先备份数据库。 首次启动时会跑三个迁移:
00095加宽invite_codes.used_by,00096新建agent_dispatch_receipts表,00097删除agent_configs.agent_cli_args列。 00097不可撤销。 agent 用的模型现在只写在它所用 agent CLI 的命令里。删列之前,每个带额外 CLI 参数的 agent 会得到一份它那个 CLI 的私有副本,参数直接写进命令,并改用这份副本。无法这样带过去的参数(agent 没选 CLI,或它的 CLI 已经不存在)会在启动时连同 agent id 和取值写进服务端日志,然后丢弃。升级后想退回 v0.160.x,需要用升级前的数据库备份:旧版服务端仍然要读这一列。- CLI 和服务端一起升级。 现在把一个人加进群,会让他当前的 token 失效,好让新群马上出现。v0.161.0 之前的
ud守护进程不会自己刷新 token,它的用户被加进群后会一直 401,直到升级 CLI 或重新ud login。 - agent 编辑表单里不再有每个 agent 单独的 CLI 选项下拉框,
ud apply/ud describe也不再带agent_cli_args。 - 用没有执行者的类型创建队列任务,现在返回 400(
QUEUE_TASK_TYPE_NOT_ALLOWED),包括daemon_exec。 - 评论、笔记或描述里提到一个不存在的 agent CLI,保存时会被拒绝。
- 插件库由浏览器从 GitHub(
raw.githubusercontent.com)读取。 如果你的用户访问不到,插件库会是空的;手动安装插件文件仍然可用。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.161.0。
v0.160.4 (2026-10-07)
补丁版:备份不会再让繁忙的 SQLite 服务端存不进数据;自托管服务端的 license 过期后,不再拒绝启动,而是进入恢复模式。 没有新增数据库迁移。用 SQLite 自托管、正在跑 v0.160.3 的:请升级(见「升级注意」)。
新功能
- 自托管服务端 license 过期后,可以在浏览器里恢复。 以前用过期的 license 启动,服务端直接拒绝启动。现在如果 license 是真的、只是过期了,服务端会以受限的恢复模式启动:打开应用会看到恢复页,上面写着是哪张 license、什么时候过期的,管理员可以在这里贴入新的 license。服务端不用重启进程就回到正常状态,之后再启动也沿用这张新 license。数据不受影响。伪造的、或者签给别的服务端的 license,仍然和以前一样拒绝启动。
- 可以从项目直接起一个 agent 会话。 项目详情页和项目列表的每一行都有「启动会话」。它打开平常那个运行对话框,项目已经选好,会话就在项目目录里跑;点运行时会为这个会话建一张卡并关联到该项目。改选一张已有的卡也照常可用。
- 和系统默认值不同的 agent CLI 行,在列表里直接标出来。 在「你的 Agent CLI」里,命令和同名默认值不一样的行,会带一个「与默认值不同」的标记。点标记直接打开差异对比和一键覆盖;一旦这一行和默认值一致,标记就消失。
问题修复
- 备份不会再让 SQLite 服务端存不进数据。 在 v0.160.3 上,服务端写入期间做的备份,可能让一次保存以一种特殊方式失败,之后的每一次保存都跟着失败,直到重启服务端。现在备份在服务端自己的数据库连接上做快照,争用下失败的保存只失败它自己,不再连累后面的保存。复制快照期间,其他数据库操作会等它完成。
- 管理员上传图片不再被卡在 1 GB 存储上限。 快速记录、从图片建任务、待办的图片识别上传、从照片建记账,这几个入口把管理员当成普通 1 GB 用户来查存储配额,超过 1 GB 就报「配额已满」。
- 转进 OpenCode 会话的回复只到一次。 终端转发不认识 OpenCode 的「[Pasted ~N lines]」标记,于是反复粘贴同一条回复,而且一直不按回车。ud CLI 守护进程和桌面端都修了;另外修了一个相关情况:屏幕上残留的上一次粘贴标记可能被误认成这一次的。
- 窄屏:「与默认值不同」标记和系统默认值对比对话框不再溢出到框外。
升级注意(自托管)
- 没有新增数据库迁移。
- 用 SQLite、正在跑 v0.160.3 的,请升级。 v0.160.3 上的一次备份可能让服务端存不进数据,直到重启。如果你的服务端在备份后已经存不进数据,先重启,再升级。
- 备份仍然需要临时空闲磁盘空间,最多与数据库一样大,在服务端的备份目录里,另加备份包本身,和 v0.160.3 一样。
- 在恢复页贴入的 license 会存成服务端数据目录里的
license.token,之后每次启动,只要它仍然有效,就优先于LICENSE_TOKEN和配置文件。如果以后你要通过LICENSE_TOKEN换 license,请删掉这个文件,否则它会一直被优先使用。 - 如果你用启动参数
--license-token传 license,恢复页帮不上你: 这个参数每次启动都优先,所以恢复页会拒绝新 license,并提示你去改启动命令。 - Pro 和 Max:没设
ADMIN_EMAIL时,恢复页会拒绝 license,并写出缺的是哪一项,因为缺了它服务端无法完成启动。 - 恢复页只在服务端用过期 license 启动时出现。 已经在运行的服务端,license 到期后会继续运行。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.160.4。
v0.160.3 (2026-10-06)
补丁版:备份现在是数据库的一致副本,OpenCode 和 GitHub Copilot 两个 agent CLI 能正常启动了。 以前在服务端写入期间做的备份,可能是一个损坏、无法恢复的库。没有新增数据库迁移。用 SQLite 自托管的:升级后请重新做一次备份(见「升级注意」)。
问题修复
- 备份是数据库的一致快照。 在用 SQLite 的服务端上,备份是在应用持续写入的同时直接复制数据库文件,所以写入期间做的备份可能混进了改动前后的数据,恢复时失败。现在每次备份先给数据库做一份一致快照,再把快照打包。已经存下的备份不变。
- 一次备份失败,不会再连带第二晚的备份也报「failed」。 定时备份任务根据上一次备份的结果判断健康,所以失败一晚之后,下一次运行即使自己的备份成功了也会报「failed」。现在孤立的一次失败只记一条警告;连续两次失败,或者在预期时间内没有完成的备份,仍会把这次运行标成失败。
- OpenCode 的 agent 会话能启动了。 OpenCode 把会话的启动短串当成项目目录,启动后马上退出。它的默认启动命令改为
opencode --auto --prompt {{prompt}}。 - GitHub Copilot 的 agent 会话能收到启动短串了。 Copilot 不接受直接跟在后面的提示词,所以启动短串一直没送到。它的默认启动命令改为
copilot --yolo -i {{prompt}},以这句作为第一条消息开启交互会话。 - 新账号的默认 agent CLI 里不再有 aider 和 kimi。 这两个都不能在接收启动短串后保持打开,而 agent 会话需要这一点。
升级注意(自托管)
- 没有新增数据库迁移。
- 升级后重新做一次备份(管理 -> 备份),并确认那里列出了新的备份文件。旧版本在服务端繁忙时做的备份可能恢复不了;这是第一个备份保证一致的版本。
- 备份现在需要临时空闲磁盘空间,最多与数据库一样大,在服务端的备份目录里,另加备份包本身。备份结束后快照会删除。磁盘快满时备份会失败,任务会报出来。
- 你已有的 agent CLI 设置不会被改动。 如果你的 agent CLI 列表(你的 Agent CLI)里已经有 OpenCode 或 GitHub Copilot,它会保留旧命令,仍然起不来。那一行会显示与系统默认值不同(最后修改于 v0.160.3);点开「查看差异」,把命令改成上面的新默认值。已有的 aider 和 kimi 行保持原样。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.160.3。
v0.160.2 (2026-10-05)
补丁版:每晚的备份重新能上传了;agent 会话改为以一条打字输入的消息收到指令。 0.160.0 起,超过单文件上传上限的定时备份会被拒绝,所以没有存下备份文件。没有新增数据库迁移。升级服务端之前先读「升级注意」:ud 早于 0.160.2 的机器,连到 0.160.2 服务端后起不了 agent 会话。
问题修复
- 定时备份重新能存下来。 在 0.160.0 和 0.160.1 上,服务端拿管理设置里的单文件上传上限和个人存储配额去检查备份文件。备份只要比这个上限大(管理员没改过的话是 10 MB)就会失败,报
File size ... exceeds limit,而定时任务仍然显示成功。现在备份只受服务器整体存储上限约束,与 0.160.0 之前相同。普通上传的各项限制都不变。 - 没能真正启动的 agent 会话,现在会说明原因。 会话碰到用量上限、启动后马上退出、或 90 秒内没有读取指令时,会被标成「failed」,并在唤起它的线程里回复原因。以前它会一直显示「running」,之后被标成「lost」,没有任何说明。如果原因是用量上限,回复里会原样引用上限提示,包括恢复时间。现在只有在桌面应用或
udCLI daemon 确认已经把指令打进去并提交之后,会话才算收到了指令;如果指令被权限对话框吞掉,会在 60 秒后重发。 - 发给正停在权限确认框上的 agent 的消息,不会再替它回答那个确认框。 以前消息到达时,如果 agent 的终端正显示权限对话框或菜单,本该发送消息的那个回车可能会批准对话框,消息也丢了。现在桌面应用和
udCLI daemon 打字之前先检查有没有打开的对话框,并且只要没看到消息进入输入框,就绝不按回车。
改进
- agent 会话启动时只跑一条短命令,指令作为普通消息送达。 启动短串改为
ud send-input session <id> --briefing,随后指令以用户消息的形式逐键打进会话终端,不再是粘贴进去或作为命令输出打印出来。想自己读指令的人仍可以用ud describe session <id> -o prompt。 - 附件:附件面板的文字和提示跟随应用语言。以前有一部分总是显示中文。
升级注意(自托管)
- 没有新增数据库迁移。 升级服务端即可恢复备份,这项修复全部在服务端。
- 每台运行 agent 会话的机器都需要
ud0.160.2。 0.160.2 服务端用ud send-input session <id> --briefing启动每个会话。早于 0.160.2 的ud会以Error: unknown flag: --briefing拒绝,所以那台机器上的会话一个都起不来,每个都会在 90 秒后被标成「failed」。请按下面与安装方式对应的那条路升级那些机器上的ud。如果那台机器的ud是从桌面应用装的,唯一的办法是装 0.160.2 桌面应用。 - 那些机器上的 daemon 也要是 0.160.2:装 0.160.2 桌面应用,或者在
ud0.160.2 上重启udCLI daemon。 0.160.2 服务端要等 daemon 确认已经提交了会话的指令,旧版 daemon 永远不会发这个确认。它的会话会在 60 秒后再收到一次启动短串,并在 90 秒后被标成「failed」,即使会话其实在正常工作。 - 如果你在用
udCLI daemon,升级ud之后要重启它:正在跑的 daemon 在重启前仍是旧代码。请用新版ud去停它:旧版ud daemon stop对 0.160.2 的 daemon 会报告成功,而 daemon 其实还在跑。daemon 的本地端口 19514 现在对经由[::1]或主机名发来的请求返回 403,请用127.0.0.1或localhost。 - 升级桌面应用或重启
udCLI daemon 会结束这台机器上正在跑的 agent 会话,请挑一个没有会话做到一半的时机。 - 下一次定时备份之后,到 管理 -> 备份 确认列出了新的备份文件。任务显示「success」不算数,因为上传是在任务标记完成之后才进行的。
- 识别用量上限需要运行 agent 会话的那台机器装 0.160.2 桌面应用。 用旧版应用时,这类会话仍会被标成「failed」,但给出的是通用原因。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.160.2。
v0.160.1 (2026-10-04)
给运行 agent 会话的机器的补丁版:发给运行中 agent 的回复重新完整送进它的终端。 服务端没有改动,没有新增数据库迁移。细节见下面的「升级注意」。
改进
- 日历:peek 里多了一个在新标签页打开任务的图标;编辑抽屉里的「Open full task」会开一个新标签页,抽屉保持打开。
问题修复
- 发给运行中 agent 会话的回复,重新以消息原文送达。 0.160.0 起 agent 收到的是一行
ud describe session <id> -o input <n>指引,要先运行它才能读到消息。现在桌面应用和udCLI daemon 把完整消息粘贴进 agent 的终端,与 0.160.0 之前一样。会话启动仍用短串,消息之后也不会再多打一个go。
升级注意(自托管)
- 没有新增数据库迁移,服务端也没有改动。 0.160.1 的服务端与 0.160.0 行为相同,升级只是让版本对齐。
- 修复在运行 agent 会话的机器上:升级那台机器上的桌面应用或
udCLI daemon。重启桌面应用或 daemon 会结束这台机器上正在跑的 agent 会话,请挑一个没有会话做到一半的时机。 ud describe session <id> -o input <n>仍然可用,用来读按 0.160.0 方式送达的旧消息。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.160.1。
v0.160.0 (2026-10-04)
自托管的用户:先升级服务端,然后紧接着把每台运行 agent 会话的机器(桌面应用或 ud CLI daemon,以及它 PATH 上的 ud)升到 0.160.0。 机器升级之前,上面的 Claude Code 与 Codex 会话起不来。没有新增数据库迁移。细节见下面的「升级注意」。
新功能
- 在任务标题行一键复制任务的 Markdown 链接。 任务详情页(宽窄两种布局)与日历 peek 里都有。
- agent 按它所代表的人的权限办事。 代表管理员的 agent 现在能读写系统配置,和那位管理员一样;代表其他人的 agent 照旧被拒。agent 做的每一次管理员操作都会记日志,同时记下 agent 和它代表的人。
改进
- 任务详情改成台账式。 属性分五组、共用一列标签;日期时间统一成一种格式(
YYYY-MM-DD HH:mm,24 小时制);迭代行显示迭代的标题;自定义字段去掉cf.前缀。看板行把任务所在的看板显示成可点、可增删的标签。 - 手机端任务详情把属性直接列出来,附件单独成节,「Details」改名为「Relationship」,顺序与桌面一致。
- 附件改成简洁的列表行,带上传时间;缩略图加了文件名条。上传的文件在预览、检查器与手机列表里显示上传时间,不再只有日期。
- 日历 peek:点标题打开编辑抽屉;移动、移除时段改成操作行里的图标按钮。
- 桌面应用:在新标签页打开任务的链接,现在在应用内开一个新标签页。
- agent 会话只有一种启动方式,由服务端决定。 每个 agent 会话都以
<agent cli> <短串>启动;整条命令(包括看板的 tmux 设置)由服务端拼好,并原样记录实际执行的那条命令。agent CLI 命令里可以用{{prompt}}占位符标出短串放在哪里。 - 发给运行中 agent 的消息不再粘贴进它的终端。 agent 收到一行指引,从磁盘读取完整消息,长消息、多行消息都能完整到达。任何会话在消息之后都不会再被多打一个
go,人类会话的首条消息也一样。 - agent 一直没读指令的会话会收到提示。 线程里的回帖会建议:对不接受把 prompt 当普通参数的 CLI,把启动命令改成
<cli> <flag> {{prompt}}。 - 内置 Alfred agent 的默认原则改为英文。
问题修复
- 在任务详情页里改地址栏切到另一张卡,不会再偶发整页「Something went wrong」。
- 任务详情页顶部的空白带去掉了。
- 任务属性里
ud.projects与cf.release_train不再重复出现。 - 迭代没有绑定看板时,迭代行不再是空白。
- 任务详情页排期时间原来是 12 小时制,现在与其它地方一致,用 24 小时制。
- 节头与 Relations 的图标尺寸、间距统一了。
- 看板页头「Open in new window」在中文下有了翻译。
- 仅管理员可用的备份接口(发起、状态、下载)现在在服务端也检查调用者的管理员权限,带着过时管理员声明的令牌不能再发起或下载整库备份。
升级注意(自托管)
- 没有新增数据库迁移。
- 先升服务端,再升运行 agent 会话的机器,两者间隔越短越好。 服务端现在自己把短串拼进启动命令。0.159.0 及更早的 daemon 会再追加一次,那台机器上的 Claude Code 与 Codex 会话就起不来;升级 daemon 即恢复。反过来的顺序更安全但也不完全无感:0.160.0 的 daemon 配旧服务端时,agent 启动时没有短串,服务端在 60 秒后重发一次。
- 这些机器
PATH上的ud也必须是 0.160.0。 发给运行中 agent 的消息现在是一行指引,让它运行ud describe session <id> -o input <n>,旧版ud没有这个命令。 - agent CLI 的额外参数有了字符限制:字母、数字、空格和
._=:@/,+-,外加{{prompt}}、{{args}}两个占位符。保存其它字符会被拒绝(AGENT_CLI_ARGS_INVALID)。已经存着其它字符的配置会让会话起不来,原因回帖到线程里;改掉参数即可。 - 看板的 tmux 会话设置改由服务端应用。 在 Windows 机器上,有 tmux 设置的会话会起不来并把原因回帖到线程里,而不是像以前那样静默跳过。会话跑在 Windows 上的看板,请清掉这个设置。
- agent 所代表的人是管理员时,agent 现在拥有管理面。 你以管理员身份派出的会话能读写系统配置、建用户、铸 API key。这些访问都记日志,同时记下 agent 与被代表的人。agent 账号本身不能再被设为管理员;agent 名下的 API key 无论创建时是什么角色,都不算管理员。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.160.0。
v0.159.0 (2026-09-30)
自托管的用户:升级服务端之前,先确认每台运行 agent 会话的机器上 ud 都是 0.158.0 或更新。 从这一版起,每个 agent 会话都以一行短串启动,再从磁盘读取指令;旧版 ud 读不到。没有新增数据库迁移。细节见下面的「升级注意」。
改进
- agent 会话一律用短串启动。 交给 agent 的是一行短串,它自己从磁盘读取完整指令,而不再把整份指令粘贴进它的终端。这原来是可选的实例配置
workspace.promptDelivery=short-string;现在它是唯一的方式,这个配置已删除。 - Claude Code 与 Codex 会话的首条消息后不再多出一个
go。 短串经命令行参数传入,原样提交。 - 没读到指令的会话会被报出来,而不是静默。 agent 在 60 秒内没有确认读取指令,就重发一次短串;120 秒后在发起这个会话的评论线程里回一条消息。
升级注意(自托管)
- 没有新增数据库迁移。
workspace.promptDelivery配置已删除,所有 agent 会话都用短串启动。 升级服务端之前,把每台运行 agent 会话的机器上的桌面应用或 CLI daemon,以及它PATH上的ud,都升到 0.158.0 或更新。旧版ud会忽略短串要求的参数,agent 就拿不到指令;服务端发现缺了读取回执,120 秒后会在发起会话的线程里回一条消息。已经存过的workspace.promptDelivery值(无论哪个)留在数据库里、不再被读取,升级不会因此出错。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.159.0。
v0.158.0 (2026-09-30)
自托管的用户:升级前请先备份数据库。 首次启动会跑一个迁移,只加一列。如果你的服务端启动时带着 --license-private-key 或 LICENSE_PRIVATE_KEY,先把它去掉:这个配置已经不存在,而服务端遇到不认识的命令行参数会拒绝启动。细节见下面的「升级注意」。
新功能
- 桌面端:在应用里激活 Pro / Max license。 设置里新增 License 一节:粘贴 license 即可激活、续期或移除。保存的 license 过期或校验不过时,应用会停在续期页面,而不是照常拉起后端。
- 桌面端:可选的公网访问地址。 如果你用自己的隧道或域名把桌面后端暴露出去,在设置里填上这个地址。附件链接和跨域请求随之改用它,远端浏览器拿到的是能打开的文件链接,而不是
localhost。不填则一切照旧。隧道本身由你自己运行,应用不代管。 - 桌面端:经隧道访问的人能拿到完整的网页界面,由桌面后端自己提供。
改进
- 桌面端:后端固定监听 24816 端口。 过去它从 8888 往上找第一个空闲端口,重启之后隧道或直连地址可能悄悄失效。端口被占用时,应用会显示是谁占着,而不会换一个端口启动。
- 桌面端:后端起不来时,窗口会说明原因:后端日志的末尾、占用端口的进程、端口设置的来源,而不再只是一句「Check Console.app」。
- 评论线程的「标注」改名为「留存」(英文 Keep),图标换成书签。对话列表里加星的线程排在最前,对话的状态标记也有了中文。
- 任务状态颜色与手机端一致:进行中是蓝色,等待中是琥珀色。
- 会话活动颜色在各个会话表里统一。
问题修复
- 粘贴进评论的图片不再出现在卡片的附件列表里。 组成员照样能打开。
- 评论里不带前导
!的已上传文件链接,显示为文件,而不是 markdown 源码。 ud get task --deleted恢复可用,ud describe task --deleted、恢复和彻底删除也接受短 ID。- CLI daemon 拉起的普通 shell 会话,输入按原样键入。 过去
pwd这类命令会被弄乱,而且一个正常运行的 CLI daemon 会话会在刚启动时就被报成已退出。
升级注意(自托管)
- 升级前请先备份数据库。 首次启动会跑一个迁移
00094_add_prompt_read_at_to_workspace_sessions,给workspace_sessions加一列可空的prompt_read_at。没有删除任何东西。 - 服务端签发 license 的功能已移除。
POST /license/generate、GET /license/decode、网页/license与/license-pro、--license-private-key参数、LICENSE_PRIVATE_KEY环境变量和隐藏配置license.private_key都没有了。升级前先从启动命令里去掉--license-private-key:服务端遇到不认识的参数会拒绝启动。残留的LICENSE_PRIVATE_KEY环境变量会被忽略。license 校验(LICENSE_TOKEN、/license/info)不变。 - 自托管的浏览器 Personal 部署不再自动登录。 Personal 档位的密码不再由公开的
/auth/tier-info接口返回——此前任何能访问到该实例的人(包括经隧道访问)都能读到它。浏览器现改为手动登录:用户名personal@undercontrol.local,密码见服务器启动日志或其PERSONAL_TIER_PASSWORD设置。桌面应用仍是一键登录。 - 桌面应用现在为每台安装随机生成独立的 Personal 密码,不再是固定的
personal123。用personal123从 CLI 或其他设备连接桌面后端的用法失效;可在「设置 → 密码」查看或重置本机密码。 - 桌面端:后端端口改为 24816。 指向旧端口的东西(隧道、CLI context、书签)需要改。要用别的端口,设置
UD_BACKEND_PORT,或者在应用数据目录里放一个写着端口号的.port-override文件。 - 新增实例配置
workspace.promptDelivery,默认paste-full,即现有行为。short-string只给 agent 会话一行短串,让它从磁盘读取完整指令。请等所有运行 daemon 的机器都装上 0.158.0 的 CLI 和桌面应用之后再打开:旧版ud会忽略短串要求的参数,agent 就拿不到指令。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.158.0。
v0.157.0 (2026-09-27)
自托管的用户:先升服务端,再升应用和 CLI。 本版的网页、桌面应用和 CLI 调用的 API 路径旧服务端不认,所以 0.157.0 的客户端连旧服务端会失败;旧客户端连新服务端照常可用。升级前请先备份数据库:首次启动会跑两个迁移,都只做加法。细节见下面的「升级注意」。
新功能
ud sprint start <id> --board <board>:在 CLI 里一步开始一个 sprint。 它在同一次写入里把 sprint 置为进行中、并让看板指向它,中途失败两边都不动。--kickoff/--deadline在同一次调用里写上起止日期,ud sprint list --board <board>可以回读。- 关闭 sprint 时,看板也跟着换。 所有指向被关 sprint 的看板,会改指向承接剩余卡片的那个 sprint(剩余卡片回 backlog 时则清空指向)。
ud sprint close会列出它改了哪些看板,并点名因为你没有写权限而跳过的看板。 ud move task <id> --board <board> --from <列> --to <列>一步把卡片从一列移到另一列,看板的离开与进入动作在服务端一起执行。--dry-run只打印会改什么,不写入。如果看板在你上次读取之后变过,这次移动会被拒绝,而不是落在过期的数据上。- CLI 读看板,读到的就是看板上显示的。
ud get task --board <board> --column <列>、--sprint、ud describe board(带每列计数)和ud sprint list读的是应用里同一份列,包括当前 sprint 的范围,末尾有一行说明这次列表是否完整。 ud apply带上board:和column:创建卡片时,按那一列的规则建:状态、标签和当前 sprint 由服务端按列的规则写上。
改进
- 把卡片拖到另一列是顺滑的。 卡片立刻落在目标列,不再先弹回原列、过一会儿再跳过去。跨列拖放现在只发一次请求。
- 开始 sprint 之后,眼前的看板立刻更新。 过去各列会一直显示 sprint 以外的卡片,直到刷新页面。
- 在某一列里新建卡片,由服务端套用这一列的规则;sprint 的开始和结束日期一次写入。
- 评论回复发送失败时,留在原处并标为「未发送」,带重试和丢弃。 过去它会消失,只剩一条会被滚走的提示。
- 桌面端:Cmd+R / Ctrl+R 刷新当前窗口,和浏览器一样;菜单 View > Reload 也可以。
- 看板的列定义和内置「All Tasks」的列由服务端提供,各个客户端显示同一套列。
- 不带查询的
ud query board对整张看板只发一次请求,不再每列一次。 ud get task --status in_progress(不存在的状态)会报错并列出合法取值。 过去它打印「No tasks found」,和真的查不到长得一模一样。
问题修复
- 桌面端:第二次启动不会再开出第二个实例、和第一个共用同一份数据。 过去第二次启动会删掉正在运行的那个实例的单实例锁再照常启动,于是两个实例共用一份配置和一个 daemon。
- 桌面端 daemon 拉起的 agent 会话,不会再约每四次有一次一上来就停住。 daemon 在粘贴提示之后会再敲一个短词,会话总有一句可以执行的话。
- 自托管 SQLite:项目的任务列表不再报「malformed JSON」,并且能返回应有的任务。
升级注意(自托管)
- 升级前请先备份数据库。 首次启动会跑两个迁移,两个都只做加法:
00092_add_status_to_budgets给budgets加一列status(已有预算全部记为active),00093_add_content_hash_to_resources给resources加一列可空的content_hash和一个索引。没有删除任何东西。 - 首次启动还会改写一部分看板,只一次。 没有 id 的看板列会补上 id,并按列查询重新生成动作,好让移卡按列 id 定位。这一步在启动时跑,不是迁移;幂等,之后再启动什么都不改。上面的备份覆盖它。
- 先升服务端,再升应用和 CLI。 API 现在也在
/api/v1/tasks和/api/v1/boards下应答,而本版的网页、桌面应用和 CLI 调用的就是这些路径。旧路径(/api/v1/todolist、/api/v1/kanban/boards)继续可用,也没有删掉任何端点,所以旧客户端连新服务端没有问题。反过来不行:0.157.0 的桌面应用或 CLI 连旧服务端会失败。 - 关闭 sprint 现在也会改看板。 当前 sprint 是被关的那个的看板,会由关闭动作本身改指向。以前手工改指向的脚本可以去掉这一步。
- 没有新增配置项,也没有移除任何配置项。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.157.0。
v0.156.0 (2026-09-21)
新功能
ud find—— 一条回答「要找 X 该用哪条命令」的命令。 它把你要找的东西(任务、note、评论、技能、agent、看板)对到能找到它的那条命令上,并且逐条点名那条命令不返回什么 —— 于是一次空结果不再在「确实没有」和「你问错命令了」之间摇摆。- 日历上已排期的块,可以直接在块上删除,或者换绑到另一张任务。 点开块的 peek,现在有删除按钮和换绑入口,改计划不再等于「删掉重排一个」。
- 删除文件夹现在会删掉里面的东西。 过去它是把文件夹解散、把内容搬到上一级。现在由服务端删掉整棵子树,而且删之前会弹确认,写明会影响多少条,并提示没有回收站的内容(资源、图表)会被永久删除。点取消则一切不动;任务进回收站,可以恢复。
- 桌面端:每个 tab 有自己的页面历史,带后退和前进按钮。 在一个 tab 里往里走,不再是一条单程路。
- 桌面端导航摊平了一层。 Runtime 这一层解散,CLI、Workspace Prompts、Daemons 升为一级 tab。
- agent 详情页围绕一个 Edit 开关重做。 各分区平时是只读正文,按 Edit 整页一次性翻到编辑态,而不是每个字段各带一个编辑器。
改进
- agent 的 principles 变成一个普通字段。 和 agent 上其他内容一起编辑,
ud apply能写(创建和更新都能),ud describe agent -o apply能往返,每一次改动都记成一条永久保留的agent.updated审计事件。 ud apply会写入多文档文件里的每一份文档,而不只是第一份。 过去一份含多个文档的文件,只有第一份被写进去,其余会被灌进它的正文。ud apply能清空 tags。 空列表现在真的到达服务端,回显也自报清空后的状态。ud describe task末尾会报这张卡有几条评论线程,于是「这张卡没有评论」和「我没把评论给你看」不再长得一样。- 写元数据不再回显一个没人验证过的结果。 写一个不存在的键当场报错,而不是打一行成功;删除是真的删。
--set cf.points=...会被点名拒绝,并指向ud.points。 - 表格输出按显示宽度截断。 过去一列从宽字符中间切开,会让一次 grep 整份输出什么都找不到 —— 而那看起来就像「没命中」。
--column todo认得叫「To Do」的列。 命令自己帮助里的那条例子,照抄不再报错。ud cook的配方和--help的例子都被实跑过一遍,每条都跑在配方自己指名的板上。- 账号切换列表里过期的行会明说过期,并预填登录表单。 过去切到一个 token 已经过期的会话,看起来和一次普通切换没有区别。
- 日历快速创建的搜索等你停手 3 秒才问后端,这期间在本地缓存里全量搜。
- 日历排期块的颜色跟着任务的实时状态走。 改一次状态,块当场重画,配色换成一组新的注意力色。
- 粘进评论框的截图先重编码再上传,一次粘贴的体积只剩过去的一小部分。
- 预算:新增计划时会解决与已有计划的重叠,周期合计按周期各自累加。
- 桌面端任务详情:点描述标题可以整节折叠。
- 联系页改指向 Telegram 群,不再是 Discord。
- 产品名在浏览器标题、登录与引导页、About 里读作
udctl。
问题修复
- 一页上有多张图时,Mermaid 的箭头不再消失。 marker id 按图各自作用域,箭头不会再解析到一张隐藏的图上。
- 删文件夹失败不再谎报成功。 失败时按删前快照把树还原并报错;删除 explorer 条目会报出哪些 id 失败,而不是抛出来。
- 创建 agent 时你填的 principles 会被保留。 过去创建路径上它被静默丢弃。
- agent 相关页面不再读到陈旧数据,并且一次会覆盖别人并发编辑的保存,会在落盘前被拦住。
- frontmatter 脱引号脱的是引号,不是从内容里削字符。
- 自托管:
/health现在真的读一次库,SQLite 连接池加了两道闸。
升级注意(自托管)
- 升级前请先备份数据库。 首次启动会跑两个迁移,而且两个都在删东西。
00090_drop_agent_cli_user_set先清掉机器猜出来的 CLI 选择,再从agent_configs上删掉agent_cli_user_set这一列。00091_drop_agent_principles_revisions连表带行删掉agent_principles_revisions;principles 的值本身存在 agent 上,不受影响,但那份变更日志没有了。回滚任何一个,回来的是表结构,不是数据。 - 两个 API 端点退役了。
PUT /api/v1/agents/:id/principles和GET /api/v1/agents/:id/principles-history不再存在;principles 通过PUT /api/v1/agents/:id写入,CLI 的--principles-history参数一并退役。脚本里打到这两条路径的地方要改。 - 删除文件夹的含义变了。 过去是把内容搬到上一级,现在是把内容删掉。资源和图表没有回收站,对它们来说这是永久的。
- 没有新增配置项,也没有移除任何配置项。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.156.0。
v0.155.0 (2026-09-15)
新功能
- agent 可以带 principles —— 一组会被追加到它收到的每一条 prompt 末尾的红线。 每个 agent 现在有一个
principles字段,上限 200 个字符。你写在那里的内容会追加到发给这个 agent 的每一条 prompt 末尾,所以它是每次投递都被重读一遍,而不是在一段长会话的开头读一次。只留最重要的一两句:编辑器在你写长了的时候会提醒,因为越短的 principles 越容易被反复读到。 - 只有 agent 的 owner 能改,而且每次改都要写明理由。 principles 编辑入口在 Web 端 agent 详情页。保存一次修改必须填一句变更说明,完整的历史 —— 谁改的、什么时候、为什么 —— 在同一个对话框的变更历史里读得到。
- 同一个字段在 CLI 上。
ud describe agent <名字>会显示这个 agent 的 principles;ud describe agent <名字> -o prompt把它渲染进这个 agent 真正收到的那份 prompt 里;ud describe agent <名字> --principles-history打印变更日志。 - 每次投递都会记下 principles 这一环发生了什么。 每条 prompt 投递会记录 principles 是注入了、本来就是空的、还是没取到。取不到不会挡住投递 —— agent 照样收到消息,失败被记下来,而不是被放大成整个 agent 不可用。
改进
ud explain agent会把只读字段标成只读。 那些由服务端掌握、写入时会被拒绝的字段 ——principles就是其中之一 —— 现在在ud explain里渲染成 read-only,于是一个你设不了的字段,不再看起来像一个你忘了设的字段。- 自托管实例的对象存储一旦回退,现在会大声说出来。 当配置的存储类解析不出来时,服务端会回退到启动时
--s3-*参数构建的那个存储。三处回退里有两处只打了一条说明失败、但没说后果的 Warn,第三处什么都没打。现在三处统一打BLOB_FALLBACK_USED,Error 级别,带原因和累计次数。这一条在做存储迁移时要紧:从旧桶供文件和从新桶供文件看起来一模一样,直到旧桶被删掉那一刻。
升级注意(自托管)
- 升级前请先备份数据库。 首次启动会跑两个迁移:
00088_add_principles_to_agent_configs和00089_create_agent_principles_revisions。 - 内置的
alfredagent 带了一份 seed principles,而 seed 只会到达新建出来的 agent。 已经建过内置 agent 的实例,升级后会看到alfred的 principles 是空的 —— 这是预期,不是迁移失败。想要的话在 agent 详情页自己填。其余内置 agent 都不带 seed principles。 - 没有新增配置项,也没有移除任何配置项。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.155.0。
v0.154.0 (2026-09-15)
新功能
- AI 每日免费额度,一个人不再能把实例共享的 AI 供应商额度用干。 每个用户现在在实例共享的 AI 供应商上,每个 UTC 日有一份免费调用额度,默认 10 次。用自己 API key 发出去的调用永远不计入。一次语音捕获算 2 次(底下确实是两次 AI 调用)。用完之后,chat 请求会给出一条明确的额度提示而不是笼统的报错,AI 快速创建对话框上会显示今天还剩几次。
- 因额度被拒的快速捕获现在会告诉你,而不是凭空消失。 快速捕获在真正花钱那次 AI 调用之前就先回「已入队」,所以额度拒绝以前留给你的是一张成功回执加一片安静:Explorer 里没有卡、铃铛不响、也没有 toast。现在每一次被拒的捕获都会发一条 For You 铃铛通知,并把你刚捕获的那段文字原样带回来,所以内容本身不会丢。同一条在 Queue Tasks 里也会显示为 Failed。
- 自托管的管理员会在 license 到期前被提醒。 license 一旦过期,这个后端是拒绝启动,不是降级 —— 所以现在有一个每日巡检,在还剩 60 / 30 / 7 / 1 天时,在 For You 面板里提醒本实例自己的管理员。提醒里写清三件事:还剩多久、服务器会拒绝启动(不是降级)、去哪里换新的。某一档是在实例没开机的那天跨过去的,下一次巡检照样会发;换了新 license 之后这组提醒会重新开始。
- 能看到 AI 花在哪了。
GET /ai/usage返回你自己的已用 / 上限 / 重置时间;GET /ai/admin/usage按用户、UTC 日、能力和供应商来源聚合。
改进
ud --help从 94 行变成 21 行。 完整的分组命令树挪进了新的ud commands,根帮助指向它。有四个命令原本静默掉进 cobra 的 "Additional Commands" 那一档 ——sprint、subscribe、unsubscribe、migrate-layout—— 现在都进了真正的分组,所以从ud --help走到ud sprint close只要三次调用。- 快速捕获的路由加了 20 次/分钟的按 IP 限流,作为每日额度底下的防刷地板。
问题修复
- 粘进 dataflow 图里的图片,在保存之前就能显示了。 已保存图里的图片走的是按图鉴权的接口,它会拒绝任何「已保存内容还没引用到」的图片 —— 而刚粘进来的图片在你保存之前正是没被引用,于是显示成 "Image not accessible"。
升级注意(自托管)
- 升级前请先备份数据库。 首次启动会跑两个迁移:
00086_create_ai_usage和00087_add_license_expiry_notices。 - 新增配置
AI_DAILY_FREE_QUOTA(命令行--ai-daily-free-quota),默认10—— 实例共享 AI 供应商上,每用户每 UTC 日的免费调用次数。0是零额度:所有走共享供应商的 AI 调用一律拒绝;-1才是不限。 这两个值和大多数配置的直觉相反,请明确地设置它。不设的话每人每天 10 次,而更早的版本是完全不限。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.154.0。
v0.153.0 (2026-09-14)
新功能
- Skill 整包:把一个 skill 连同它需要的文件一起装下来,也能整包发回去。
ud describe skill <name> --dir把整个包装进~/.claude/skills/<name>/—— skill 正文,加上挂在它下面的每一个脚本、模板和参考文件。ud apply -f ~/.claude/skills/<name>把这个目录整包发回服务器;目录本身就是身份,所以不用也不能再传一个名字。--dry-run会先列出会变的东西,包括发布时不会去碰的、别人放在同一个 skill 路径下的文件。 - 会话里的视频就在原地播放。 传进会话或评论的视频现在内联渲染成播放器。它以前会掉进「其它文件」那一档变成下载链接 —— 对视频来说那根本不是 viewer:对象存储对所有文件都回
content-disposition: attachment,点下去是保存不是播放。
改进
ud sprint close不再不声不响地把没做完的卡扫走。 以前一条裸的 close 会把每一张未完成的成员卡直接挪进 backlog,不问一句。现在,如果 sprint 里还有未完成的成员、而你没有指定 rollover 目标,这次 close 会被拒绝,并把每一张挡路的卡按 id、标题、状态逐条列出来。用--rollover <sprint>或--rollover backlog说清它们去哪。成员全部完成的 sprint 仍然可以不带 rollover 直接关掉。这道闸在服务端,所以桌面端同样受它管。- 应用内的 Quick Start 按产品现状重写了一遍,页面上每一条命令都真的跑过。
问题修复
- 带时区偏移的日期筛选会返回错误的行。
>= '2026-08-31T00:00:00+08:00'被当成 00:00 UTC 去比较,于是落在这段时差里的行静默消失,没有任何报错。在生产上量过:同一个时刻写成Z返回 594 行,写成+08:00只回 585 行。现在每一处进入 SQL 的 datetime 都尊重偏移。 - 传 iPhone 截图不再失败。 iOS 会在文件名里写一个看不见的窄不换行空格,存储网关因此用 400 拒绝了生成出来的 key,在上传那头表现为 500。现在 key 在生成的那一处就做了归一。已经存进去的文件一个都没动,你看到的文件名仍然是你自己那个。
ud apply遇到未闭合的 frontmatter 现在报错,不再建出一张垃圾卡。 少一行收尾的---会被读成「压根没有 frontmatter」,于是整段掉进正文,一次本意是更新的调用变成了新建,新卡的标题就是字面的---—— 而回显是和成功一模一样的Task created:。ud apply -f <目录> <名字>现在直接拒绝,不再静默丢掉那个名字。
升级注意(自托管)
- 本版没有 schema 变更 —— 升级时不会对你的数据库做任何事。
- 没有新增环境变量。
CLI 要你自己升:发布一个新版本不会让任何人机器上的 ud 变新。一共三条路,只走其中一条。
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个。
然后确认升上去了:ud --version 必须打印 udctl version 0.153.0。
v0.152.0 (2026-09-12)
桌面端
- macOS 打开 UnDercontrol 不再弹「Support Ending for Intel-based Apps」。 每个安装包现在只装它自己那个架构的二进制,不再把所有平台的都塞进去。以 v0.151.0 已发布的包为基准实测:macOS arm64 磁盘映像从 229,652,351 降到 148,858,229 字节(−77.05 MiB,−35.18%),macOS x64 从 237,379,681 降到 159,484,547(−74.29 MiB,−32.81%),Windows 安装包从 184,956,101 降到 128,508,034(−53.83 MiB,−30.52%)。你要用的东西一样没少 —— 包里被删掉的是别的平台的二进制,不是功能。
改进
- 日历可以按图层或按状态着色。 新增一个着色档位开关,默认仍是按图层。状态档里,已完成的卡保留它自己的颜色,不会退回
todo用的那种灰 —— 「做完了」和「还没开始」不再是同一个颜色。 - 产品第一次自己说出「空
status是什么意思」。 空 status 标记的是文档而不是任务 —— 这件事一直如此,而产品从来没说过。现在ud explain、ud apply --help、ud query help里的算子说明、CLI 自己的帮助文案、自然语言查询提示词、应用内文档站(中英两版)、AI chat 的工具 schema,七处都写着。 - 内置 skill
ud-guide从「背产品」改成「读产品」。 每个 agent 开场就会读这份 skill。它原本带着 11 个写好的命令示例;拿当前产品重放一遍,11 个全是错的 —— 它们描述的是产品已经没有的形状。示例全部删掉,换成「怎么把当前的写法从产品里问出来」。全文从 640 行降到 300 行,且没有新增任何自己的机制。
问题修复
ud describe comment传 8 位短 ID 时会返回线程里的回复了。 短 ID 已经解析到了正确的评论,但取回复时又拿短的那份去查,于是线程回来时只有根评论、一条回复都没有。⚠️ 每一次on_mention唤醒发的都是短 ID,所以每一次 agent 被叫醒都在踩这个。ud apply收到 YAML manifest 不再建出一张空白卡。 带apiVersion:/kind:的文档走到 markdown 那条路时,会被当成一张没有标题的任务读进去 —— 静默建出一张空卡并报成功,于是一个后缀名写错就产出一张看起来像「apply 成功了」的垃圾卡。现在它直接报错,并说清问题在哪。- 叫醒一个 agent 不再顺便让它覆盖卡的正文。 唤醒提示词里那段「更新这张卡」的模板,除了标题还带着一行
<brief description>,于是照着收到的指令执行的 agent,会把刚刚派给它的那张卡的正文重写掉。模板现在只设标题,正文原样保留。
升级注意(自托管)
- 本版没有 schema 变更 —— 升级时不会对你的数据库做任何事。
- 没有新增环境变量。
⚠️ CLI 要你自己升 —— 发布一个新版本不会让任何人机器上的 ud 变新。 一共三条路,只走其中一条:
npm i -g @oatnil/ud # npm 装的
brew update && brew upgrade ud # Homebrew 装的
如果你的 ud 是从桌面端装的,上面两条都不是你的路 —— 装新版桌面 App 就行。 App 的「Install ud CLI」把 /usr/local/bin/ud 做成了指进 App 包里的符号链接,所以你跑的那个 ud 就是 App 里带的那个,换掉 App 就把它换掉了。
🔴 这一版对「你 PATH 上排第一的那个 ud 到底是哪个」格外敏感。 上面那条 ud-guide 重写,是你的 agent 从它实际运行的那个 CLI 二进制里读到的 —— 那个二进制不换,agent 就一直在读旧的、错的示例。而 Homebrew 装的 /opt/homebrew/bin/ud 是一个真实文件,不是指进 App 的链接:它只跟着 brew upgrade 走,升级桌面 App 完全碰不到它。如果你的 PATH 里 /opt/homebrew/bin 排在 /usr/local/bin 前面,那么只升 App 会让你的 agent 继续用旧 guide,而且没有任何东西会告诉你 —— 版本号在别处更新了、daemon 在线、命令照常有输出,只有内容是旧的。
然后确认升上去了:ud --version 必须打印 udctl version 0.152.0。
v0.151.0 (2026-09-12)
产品改名为 udctl
- UnDercontrol 现在叫 udctl —— 全小写,句首也小写,和
kubectl同一种写法。本版把改名带到了 CLI:ud --version现在打印udctl version 0.151.0,help 文案、README 与 npm description 都用新名。桌面端与文档站同步在改。 - 命令本身没有变。
ud还是ud,npm 包还是@oatnil/ud,配置目录与 context 格式一律不动,你写过的脚本不需要改。Homebrew 另外把udctl装成同一个二进制的第二个名字,两个名字都能用。
安全
- Telegram 发送失败不再把 bot token 写进日志。 传输调用失败时,它构造的 error 里嵌着完整的 bot token,于是 token 以明文进了服务端日志 —— 也就进了
docker logs,任何能读日志的人都足以接管这个 bot。现在 token 在 error 构造之前就被抹掉。如果你的实例跑过 Telegram bot,请把曾经出现在现有日志里的 token 一律当作已泄露,用 BotFather 重新签发。
改进
ud get comments --task <id>默认不再返回已 resolve 的线程。 过滤以整条线程为单位,所以命中的根评论一定连着它的全部回复一起回来。加--all(或--status all)把已关闭的线程也带上,或用--status open|resolved|annotated|unresolved只要其中一档。⚠️ 列表不会告诉你少返了多少,所以「线程全都关了的卡」和「根本没有评论的卡」看起来一模一样。ud get comments(不带--task)默认页大小由 50 变为 20;--all/--limit/--page现在生效。ud whoami的User:行改为读正在用的那个凭据,不再是配置文件里碰巧写着的那个。用委托 token 时会多打印一行acting for,「正在替别人做事」这件事因此是看得见的,而不是靠推断。- 日历画同样一张网格,下载量大幅下降。 窗口查询改成要一份 lite 行投影,丢掉正文、notes 和 share links:在一个真实账号与窗口上实测,一页从 1,619,762 B 降到 41,959 B —— 小了 38.6 倍。这样取回的行也不会再覆盖缓存里已有的正文。
- 日历上的瞬间事件改成两行渲染,时间不再把标题挤没。
问题修复
- 打开卡片的编辑抽屉、一个字不改、存一次,正文可能被清空。 explorer 树给「没取到正文」的卡在缓存里种了一个空 description —— 它和「正文真的是空」分不开 —— 编辑器照这个空值加载,保存就把它写了回去。实测有卡因此丢掉 1,848 字。写入侧和已经躺在浏览器里的那些行都修了,见「升级注意」。
- 分页不再报一个它自己没有兑现的页数。 请求超过上限时会悄悄退回 50 条,却仍然写
totalPages: 1。 - 短 ID 解析不再卡在评论的最近一页。
- 搜索会 trim 查询词首尾的空白。 标题里明明有那段字,查询词带个多余空格就搜不到。前端、后端、Explorer 三处都修了。
- 单字符粗体不再吞掉整行剩下的内容。
**a**后面同一行里还有**时,过去会一路加粗到最后那个。web 与桌面端都修了。 - 日历「已排」的说法和它画出来的东西对上了。 已排 = 这张卡有排期段;只有截止时间的卡不算已排。那个与此相反的标记是整条移除、而不是改指向段 —— 因为它所在的那张列表根本没有段数据可以回答这个问题。
升级注意(自托管)
- 本版没有 schema 变更 —— 升级时不会对你的数据库做任何事。
- 浏览器里的任务缓存会在升级后首次加载时清空一次。 上面那条「正文被清空」的修复够不着已经存进浏览器的行,所以 persist 缓存版本号升了一格;它会丢掉存着的任务行、保留你的偏好设置。你唯一会察觉到的是升级后第一屏不再是秒开的。
- Telegram bot token —— 见上面的安全条目。凡是进过日志的 token 都请重新签发。
⚠️ CLI 要你自己升 —— 发布一个新版本不会让任何人机器上的 ud 变新。 按你当初的安装方式:
npm i -g @oatnil/ud # 当初用 npm 装的
brew update && brew upgrade ud # 当初用 Homebrew 装的(同时会装上新的 `udctl` 名字)
如果你的 ud 是桌面端装的,上面两条都不是你的路 —— 装新版桌面 app 就是升级。 桌面端的「安装 ud CLI」把 /usr/local/bin/ud 做成指向 app bundle 内部的软链,所以你跑的那个 ud 就是 app 里带的那个,换掉 app 就换掉了它。在这种情况下再去 npm i -g 会装出第二个互不相干的 ud,最后跑到哪一个取决于你的 PATH。
三条路只走一条,⛔ 别混用。 然后确认升上去了:ud --version 必须打印 udctl version 0.151.0。一个几个月前装的 ud 照样能用、也照样会复现本版修掉的那些 bug,而且没有任何东西会告诉你它落后了。
v0.150.0 (2026-09-11)
新功能
- 一张卡可以在日历上占多个时间段。 日历的「按排期」视图现在画的是排期段,不再画卡的开始/截止日期。在空白处拖动新建一段、拖动方块移动它、拖边框改长度 —— 这三个动作写的都是段,所以同一张卡可以出现成好几块。Agenda 视图同样接上了段;全天行改成有内容时才渲染。
- 任务详情页多了「排期」区,放在截止日期下面:这张卡的全部段都在,过去的段折叠成一行,带上条数与总时长。看板上点开卡片预览看到的是同一个区。
- 日历图层带上了段。 每个启用的图层各自取自己的段并打标,所以一个方块能看出它来自哪个图层;图层配色改成每个图层钉死一个槽位,不再跟着它在列表里的位置变。
问题修复
- 日历「按排期」视图里的三个 + 按钮(顶栏、侧栏、移动端)建出来的卡不出现在日历上 —— 它们写错了日期列。现在用 + 建的卡会出现在你建它的地方。
移除
- 日历的 Sprints 图层已移除。
升级说明(自托管)
- 升级前请先备份数据库。本版新增迁移
00085_create_task_slots:新建一张task_slots表和两条索引,开机时自动执行,SQLite 与 PostgreSQL 两个方言都有。不改动任何现有表。 - 已有的开始/截止日期不会被转换成段。 升级后的实例上,「按排期」视图一开始是空的,随着段被建出来才会有内容 —— 这是有意为之,不是迁移失败。
- 没有新增必需的环境变量。
v0.149.0 (2026-09-08)
新功能
SystemConfigList—— 把一台实例的整份配置当作一个文档来读和写。ud get systemconfiglist导出实例的全部设置,ud apply把文档写回去。这是它第一次对外发布,所以没有任何存量需要迁移 —— 下面这些名字就是它出厂时的样子。- 字段:顶层
forServer(必填,它指明这份文档是给哪台机器的);每个条目有setBy(default|env|admin)、settableFrom(boot-only|env-or-admin|admin-only)、readOnly、envVar、valueType、valueMasked。 - 四种拒绝,对脚本来说各自意味着不同的补救动作:
CONFIG_ENVELOPE_INVALID(400 —— 不是 SystemConfigList,或者缺forServer)、CONFIG_SERVER_MISMATCH(400 —— 文档指名的是另一台机器,说明你连错了实例,要改的不是文档)、CONFIG_UNKNOWN_FIELD(400 —— 没人声明过的键或字段,按名字拒绝而不是悄悄丢掉)、CONFIG_READONLY_FIELD(409,不是 400 —— 某个只读字段与本机不同,于是整份文档被拒、什么都不写;同样这份字节在它被导出的那台机器上是 200)。
- 字段:顶层
- 只搜标题。 任务列表的
searchIn=title让匹配只在标题里进行,而不是全部内容。 - 快速记一段文字。
POST /quick-capture/text把一条文字笔记放进 quick-capture 队列,落点与其它捕获方式相同的那三处。 - 数据流图: 分组节点可以折叠、可以连线,只读查看者现在也会画出连线。
改进
- 账号菜单里「当前账号」那一行总是写明它属于哪台服务器,一眼能看出自己在哪个实例上。
brew install ud又能用了 —— Homebrew formula 此前落后太多,里面每一个下载链接都是 404。- 引导流程会记住你对 Alfred 的回答,只有你要了才播种他的例行任务;此前没问就被播种的实例会撤回这些种子,而已经绑过消息应用的人保留原样。
问题修复
- 注册时不再泄露某个邮箱是否已经注册过。
- 分享链接改为跟随账号自己的服务器地址,不再用回环默认值,复制出去的链接对方能打开了。
- 搜索文本里的
%和_不再让搜索出错。 udCLI 的--context会被后台 daemon 正确沿用,不再被环境里的值顶掉。- npm、
.deb以及 CLI 自身的元数据不再指向一个别人打不开的仓库。
移除
- 独立的收入页和支出页已移除,交易列表是唯一的那一个列表。
- 日历的「从日历中移除」链接及其 ⌫/⌦ 快捷键已移除。
升级说明(自托管)
- 升级前请先备份数据库。本版新增迁移
00084,它会把「没问过就被播种」的 Alfred 例行任务撤回;已经绑过消息应用的人保留原样。 - 没有新增必需的环境变量。
v0.148.1 (2026-09-06)
更正 v0.148.0 的发布说明
- v0.148.0 说「退出再登录后,应用可能整个渲染出来却全是空的」已修复。那个修复是真的,但修的是另一个缺陷。 大家实际碰到的那种 —— 服务器地址以
http://开头,登录后 Profile 和每个面板都是空的 —— 根因是服务器把请求重定向到了https://,由本版才修复(见下面第一条)。
问题修复
- 服务器地址用
http://、而服务器回一个跳转到https://时,登录后整个应用是空的。 换 scheme 就是换 origin,跨 origin 的跳转会让浏览器丢掉Authorization头 —— 于是登录成功(token 在请求体里),其它每个请求到服务器都成了匿名请求,应用只能从缓存渲染,每个面板都是空白。现在客户端遇到这种跳转会在最终地址重发一次请求,并把保存的服务器地址改写成https://的 origin,之后不会再发生。桌面端:这是前端修复,安装版要等下一次桌面发版才带上;在那之前,把「设置 → 后端地址」改成https://地址即可。 - 建共享看板报「Failed to create board」,但看板其实建成了。 建共享看板会把你加进它的组,出于安全考虑这会让你现有的登录态失效;同一秒内刷新出来的新登录态也被拒了。现在签发的 token 会越过那个切换点。
- 新建看板的两个默认列显示「没有任务」。 它们的查询只有一个
ORDER BY,看板自己的标签过滤被拼在了它后面,服务器判成无效查询。现在过滤条件落在ORDER BY之前。 - 有看板的组不能再从「组」页面删除(删除按钮隐藏,服务器以
GROUP_BACKS_BOARD拒绝)。删看板会一并删掉它的组;以前单独删组会留下一个谁也列不出来的孤儿看板。读一个你不是成员的组,现在和看板接口一样答 404 而不是 403。 - 看板:被踢出去之前先告诉你。 失去某个看板的访问权时,先提示「此看板已不可用」再回到「全部任务」;重新登录的成员会回到自己的看板,而不是被告知看板没了。登录态过期时,登录页会就地说明,登录后带你回到原来的页面。退出组和加入组一样会刷新登录态。
- 组邀请页:无效链接描述为「已过期或已被撤销」,不再说「已被使用」—— 邀请链接是多次可用的。成员表在 1280px 宽度下遇到很长的邮箱式用户名,不再重叠或溢出。
改进
- Explorer:任务行右键菜单新增「在新标签页打开」 —— 桌面端开应用内标签,网页端开浏览器标签。
- dataflow 预览页和资源详情页用同一套布局:标题位置、画布内边距、底色一致。
移除
- 任务详情里的「状态变更」区块(桌面端和网页端)。
- 看板列表视图、活动热力图和 dashboard 页。
/kanban/<board>/list、/tasks、/dashboard都跳转到看板。
升级说明(自部署)
- 没有新增数据库迁移。
goose_db_version停在 83。 - 没有新增环境变量。
- 两个镜像都变了。 后端带登录态与组的修复,前端带其余改动。两个都要拉。
- 从源码构建全家桶镜像仍然需要把
ud-dataflow-diagram检出在主仓库旁边,按ud-vite-app/ud-dataflow-diagram.lock里记的 commit(未变,2537eba)。
v0.148.0 (2026-09-06)
新功能
- 已保存的账号可以跨服务器了。 每个已保存账号都记着自己属于哪台后端,所以同一个人在
api.oatnil.com和自托管实例上是两条记录,不会再互相覆盖。切换到某一条,应用会先切到那台服务器、再以那个账号登录。登录页、侧栏切换器和「设置 → 已保存的账号」只在可能看错的时候才在条目下面标出服务器 —— 记录跨了不止一台服务器,或者其中一条不在应用当前所在的那台上。网页版和桌面版一致。
改进
- 切换账号会先向服务器确认,再重新加载。 服务器拒绝这份登录状态,就删掉这条记录并告诉你已过期;服务器连不上,记录保留,把服务器自己的报错显示出来。两种情况都会落到已经对准那台服务器的登录页,重新登录不会走错地方。
- 桌面端:内置后端不再出现在已保存账号里。 它是「服务器选择」(设置 → 后端地址),不是可以切换过去的账号 —— 它的端口是启动时挑的,一条过期记录可能把应用指到一个没人监听的端口上。移动端早就是这个规则。
问题修复
- 桌面端:设置页的「退出登录」常驻。 以前桌面端把它藏起来,理由是个人账号会自动登录 —— 但在半死的会话里(整个应用渲染出来、每个面板都是空的)它是最后一个能清掉状态的控件,藏起来就只剩清应用数据这一条路。
- 桌面端:退出再登录后,应用可能整个渲染出来却全是空的,每个请求都没带登录状态。几个桌面窗口共用一份登录,但各自留了一份副本;现在每个请求都读共享的那份,任何窗口登录都会让所有窗口恢复,任何窗口退出也会让所有窗口一起退出。
- 服务器返回意料之外的形状,不再把整个应用带进「出错了」页面。 列表接口 —— daemon、agent、会话、关联账号、API key —— 把非列表的应答当作空列表;浏览器里已经缓存的坏值会在下次加载时修好,不再每次加载都崩、直到你点「清除缓存并登录」。
- 桌面端:一个窗口的登录刷新在另一个窗口切换账号之后才完成,不会再把切换撤销掉。
升级说明(自部署)
- 没有新增数据库迁移。
goose_db_version停在 83。 - 没有新增环境变量。
- 这一版没有改后端。 所有改动都在网页前端和桌面应用;后端镜像只是用新 tag 原样重新发布。直接拉已发布的镜像不需要做任何事。
- 桌面端:旧版本保存的账号会保留,并按「这个版本第一次打开时应用所指向的服务器」归属。升级后如果其中某一条用不了了,把它从列表里移除、重新登录即可。
- 从源码构建全家桶镜像仍然需要把
ud-dataflow-diagram检出在主仓库旁边,按ud-vite-app/ud-dataflow-diagram.lock里记的 commit(未变,2537eba)。
v0.147.0 (2026-09-05)
新功能
- 演示文稿:在应用内新建和编辑
.bento.html幻灯片。 explorer 右键菜单和任务附件里都有「新建演示文稿」,从一份钉住版本的官方空壳开始。⌘S覆盖保存回同一个资源,而不是像以前那样下载一份副本;幻灯片在预览里有自己的「演示文稿」图标。它跑在一个 opaque-origin 的沙箱框里 —— 允许脚本,但没有同源权限,读不到你的会话;万一保存前没能干净地把编辑器注入的那段桥接剥掉,它会拒绝保存而不是写进去。 - dataflow:「AI 协作」变成右侧停靠面板。 可折叠、记住你折叠过、草稿不丢。DSL 新增 icon 和 group 动词 —— 结构可以说,几何永远不可以 —— 配分段的提示词下拉和一个示例。连线支持会保存的走线锚点(拖线段、点圆点加、双击删),外加一个正交自动布线;网格排布进了选中工具条;整份文件导入(JSON,或藏在 PNG 里的图)就在导出旁边,一次
Ctrl+Z就能退回它替换掉的东西。 - 日历可以按「创建时间」或「最后更新时间」铺任务。 Day/Week/Month 之外的第二根轴:一张卡的日期从哪个字段来。
schedule(kickoff → deadline)就是原来的日历;created和updated各自只画一个服务端写下的时刻,是只读的 —— 靠「没有」来保证,而不是靠「拒绝」。这两种视图里没有创建按钮、没有编辑抽屉、拖不动:⛔ 不会渲染一个自己又不认的控件。点一下照样开 peek。 - 在日历 peek 里直接改标签。 标签行本来是只读的,现在它就是那个控件:自由输入加自动补全,每次增删立即写入 —— 按 Escape 或点外面关掉,编辑也不会丢。
- peek 里新增「移出日历」。 它清掉
kickoff和deadline—— 就是这两个字段把任务放上日历的。任务本身一动不动,还在它的看板列、列表和树里。5 秒撤销会原样写回被清掉的值;开着 peek 按Backspace/Delete是同一件事。 Alt+C跳到日历(桌面端),命令面板里也有「Go to Calendar」—— 快捷键就是在那儿被学会的。- 评论支持克制的 markdown。 换行、空行分段、
**粗体**、`代码`,以及扁平的-/1.列表。白名单之外的东西 —— 斜体、链接、标题、表格、裸 HTML —— 一律按原文当纯文本渲染。 在这之前 agent 的回复是糊成一坨的,星号和反引号都是字面量。 - 标签页终于有了一个看得见的打开方式。 标签条从第一个标签就显示,尾部有一个滚不走的
+;桌面菜单里有窗口 → 新建标签页,快捷键印在旁边。详情页的标签显示内容自己的名字 —— 文件名、任务标题 —— 而不是那个笼统的路由词。
改进
- 资源详情的右侧 Inspector 可以折叠到右边缘,像停靠面板一样,画布是真的把宽度收回去了,不是留一块空白;折叠状态刷新后还在。只在宽屏生效,窄屏的手风琴没动。
- 轻量编辑器默认以可视模式打开。 因为可视保存会把整篇文档重新序列化,所以在保存之前就会对「schema 表达不了的 markdown」发出警告,并带一个「不再提示」。源码模式保存、以及本来就无损的文件,直接写过去。
- 日历里同一分钟开始的卡片改为按同一个间距叠放,而不是挤成一条条细丝,每张都留出可读的左侧色带。周视图一列放不下时会画一个带计数的
+N芯片,点开列出那一刻所有的事 —— 以前 18 个并行事项就是 18 条 9 像素的丝。 - 少了几个多余按钮。 explorer 头部去掉「新建任务」和「关闭」,资源详情头部去掉返回按钮 —— 标签页让这三个都变得多余了。
udCLI 的截断提示改到 stderr,并且打在表格前面。ud … | head恰恰会把结尾那条「输出被截断了」丢掉;超过管道缓冲区之后,进程根本活不到打印它。现在 stdout 是干净的机读流,而且-o apply第一次有了截断提示 —— 以前它是默默截断的。- 桌面应用的显示名统一为 udctl(Dock、菜单栏、关于、窗口标题)。
问题修复
- 保存存储类解析不再把备份配置清掉。 后端每次保存都整行替换、省略备份就等于「没有备份」,而界面的请求体里只带了主存储 —— 所以每改一次主存储都会静默清空你的备份,而且「备份」下拉框从来就没保存成功过,确认对话框还一直显示备份没变。
- 被撤销或过期的邀请链接不再泄露群组信息。 以前它在返回「无效」的同时,还带着群组名、描述和实时成员数;现在无效 token 只返回「无效」这一件事。
- 在看板上创建的任务保留原作者。
- 存储类排序更新遇到非法输入返回
400,不再是500。 - 归在 explorer 根目录的任务写成
/,而不是那个表示「未归档」的空字符串。
安全
- 上传的
.html和.svg现在一律下载,不再内联渲染。 任何用户都可以上传一个 HTML 文件、挂到任务上、把任务公开分享,而下载链接会以应用自己的源内联地把它渲染出来 —— 于是文件里的脚本就以「受信任的应用」身份执行了;在全家桶部署里(前后端同源)它能从 localStorage 读到访问者的会话 token。修复落在字节出口那一个点上,因此分享页、所有列表/画廊入口和直链全都覆盖到,并且覆盖所有已经存在的上传 —— 不需要数据迁移。其它 text/ 和 image/ 类型的预览一字未变。 - 分享表拿到了数据层保证:唯一索引加进了 resource_type,写入口补上属主一致性校验和权限白名单。
- 支出的分享写入变成按权限判定的。
升级说明(自部署)
-
这一版有 1 个数据库迁移。
goose_db_version从 82 走到 83。升级前请先备份数据库。 -
迁移
00083是「拒绝」而不是「修复」,这是故意的。 它把shared_resources的唯一索引加宽为(resource_type, resource_id, shared_with_id),加宽之前先断言:没有任何一组(resource_type, resource_id)挂着一个以上的属主。一旦有,迁移会抛异常、部署就停在这里 —— 那些行是需要人去看的发现,不是可以自动清理的脏数据。升级前可以自己先查,结果为0就能干净落地:SELECT COUNT(*) FROM (
SELECT resource_type, resource_id FROM shared_resources
GROUP BY resource_type, resource_id HAVING COUNT(DISTINCT owner_id) > 1
) t; -
没有新增环境变量。
-
桌面应用的用户数据目录改名
UnderControl→udctl,在启动时执行一次。macOS 和 Windows 的文件系统大小写不敏感,所以在那里是空操作;在大小写敏感的文件系统上(Linux)会把旧目录搬过去。如果你当初把数据目录设在旧 userData 里面,那个记下来的路径会被一起改写;放在外部的数据目录(iCloud、Dropbox)不匹配,不会被动。万一升级后应用启动起来是空的,你的数据就在新目录旁边那个UnderControl目录里,手动搬过去即可。 -
从源码构建全家桶镜像仍然需要把
ud-dataflow-diagram检出在主仓库旁边,按ud-vite-app/ud-dataflow-diagram.lock里记的 commit —— 这一版把它推到了2537eba。直接拉已发布的镜像不需要做任何事。
v0.146.0 (2026-08-31)
新功能
- 桌面应用有标签页了。 主窗口顶部有一条标签条 —— 超过一个标签才出现,单个标签不占地方。点击切换,中键关闭,活动标签带一个标记而不只是换个颜色。开多了先压缩(完整 → 紧凑 → 只剩图标),再在条内横向滚动,不会溢出窗口。标签列表和你停在哪个标签会在重启后恢复,地址栏与活动标签始终双向镜像。
- 桌面快捷键。
Cmd/Ctrl+T开新标签,Ctrl+Tab(加Shift反向)循环,Cmd/Ctrl+1..9跳到第 N 个、9 表示最后一个。Cmd/Ctrl+W在标签多于一个时关标签,否则关窗口 —— 没有标签条的那些窗口(workspace 终端、sticker、悬浮预览、Alfred 面板)照旧关窗,行为一字未变。 - 标签右键 →「移到新窗口」。 该标签变成一个真的系统窗口,并从标签条上消失。
- 命令面板新增
/tabs:列出本窗口的全部标签,按标题和路径搜。你当前所在的那个标签照样列出并标current;选它只是收起面板,不会假装跳转。 与/windows并列。 - 日历可以把 agent 会话画出来。 一个只读开关,把每条会话按它真实的起止时间铺到时间轴上。已经结束的会话照样画,⛔ 不是只画还在跑的 —— 还在跑的那条延伸到当前时刻的红线,并且和已结束的在视觉上分得开。点一条会话可以跳到它挂的那张卡。只在 Day / Week 两个视图提供;Week 一列太窄放不下名字,所以那里的色块保留位置、去掉标签 —— 「什么时候忙、什么时候空、几条并行」才是把会话放上日历的理由,读不到时间比读不到名字严重。
改进
- 桌面上
cmd/ctrl+点击和中键点应用内链接,现在开的是一个后台标签,而不是系统窗口 —— 页面在你身后打开,焦点不动。shift+cmd/ctrl+点击仍然开真窗口,那是逃生门。web 端一字未变。 - 应用里那些「在新标签打开」的按钮改为开应用内标签 —— 但当你要开的就是你正站着的这一页时,它改开一个真窗口。标签按路径去重,否则的话它只会聚焦你已经在的那个标签,表现出来就是「按了没反应」。和
cmd+点击不同,这些按钮会切换过去。 - explorer 里删除,现在只对删不回来的东西确认。 只选中任务时直接删,因为任务删了还能恢复;选中里含资源文件或 dataflow 图仍然会问,因为那两种是永久的 —— 图的历史记录也一并没了。
- dataflow 图里折叠起来的 note 不再把连线留在画布上。 把鼠标移到任意一端,连线和 note 的内容会一起淡回来。只读预览也不再在 hover 时画出连接手柄。
ud-pull-push是一个内置 skill,而这一版正是它开始存在的那一版。 内置 skill 靠go:embed编进二进制、没有热更新,所以在这之前ud describe skill ud-pull-push一直返回SKILL_NOT_FOUND。它讲的是 tracking folder 那套流程,以及哪些本地删除是永久的:删一个任务.md是软删除,还能恢复;删一个 note 文件或资源文件⛔ 没有撤销、也没有ud restore可用。- 任务详情页那两个「在新标签打开」按钮补上了可访问名字,读屏不再只念「按钮」。
问题修复
- 中键点应用内链接此前根本不生效,全平台都是。 中键按下触发的是
auxclick,而处理器绑的是click,那个分支一直是死的。现在生效了 —— 同时右键被显式挡住,不会再出现「想开右键菜单却被导航走」。
升级说明(自部署)
- 这一版没有新增数据库迁移,也没有新增环境变量。
goose_db_version停在 v0.145.0 留下的 82 不动。 - 标签页是有意只做桌面端的。 web 端不受这一版标签页工作的任何影响:
Cmd+T/Cmd+W归浏览器所有,页面抢不回来,再做一遍只会得到一个更差版本的浏览器标签页。 - 从源码构建全家桶镜像仍然需要把
ud-dataflow-diagram检出在主仓库旁边,按ud-vite-app/ud-dataflow-diagram.lock里记的 commit —— 这一版把它往前推了。直接拉已发布的镜像不需要做任何事。
v0.145.0 (2026-08-31)
新功能
- 日历,照着 Google Calendar 的用法做的。 周 / 日 / 月三种视图,画的就是你已有的任务——
kickoff是开始、deadline是结束,不需要新存任何东西。在空白处拖一下就新建任务,拖动色块就移动它,拖它的边就改它占多长时间。 点一下弹出 peek 看详情;t回到今天,j/k前后翻,d/w/m切视图,还有一条跟着当前时间走的红线。 - 左边那一栏是图层,而一个图层就是一条保存的查询。 每个图层各自取数、各自有颜色,所以「我的任务」「这个 sprint」和你自己写的任何一条查询都能单独开关。用
+就地新建和编辑图层。这一栏可以折叠,而且它记得你折叠过。 - 快速创建框能找到你已经有的任务。 画好时间段后在框里打字,它会搜你现有的任务——选中一个,它就占住你画的那个格子,而不是再建一条重复的。
- 手机上日历是一个 agenda 列表,带 Agenda/Day 头部和同样的
+快速创建。 - 不用离开日历就能改任务的标题和描述 —— peek 里的 Open task 旁边多了一个按钮,点开右侧抽屉直接改。
- peek 的状态控件改成了分体按钮。 Mark done / Mark todo 还在原来的位置;另外五个状态收在旁边的菜单里。
改进
- 任务详情侧栏会显示这张卡的虚拟路径,不用打开 explorer 就知道任务在哪儿。
- 甘特图现在能显示看板上的全部任务。 它要 200 条,而仓储层只给了 100 条并且不吭声,所以超过 100 条的看板被安静地截断了。现在它会翻页。
- 构建全家桶镜像现在需要第二个仓库。(自建用户,见下)
问题修复
- 有时间的任务不会再被画到离你设的时间好几个小时之外。 在 PostgreSQL 上,
kickoff和deadline存进了一个装不下时区的列里,存的只是墙上时钟的数字:设成 09:00+08:00 的任务读回来变成 09:00Z——比真实时刻晚了八小时;而设成 09:00-05:00 的读回来是同一个 09:00Z。于是日历上每一个有时间的任务都偏了写入方的时区差。现在在所有写入路径共用的那一个入口上统一归一成 UTC 时刻。SQLite 实例从来没受影响。 - Reveal 和移动不会再在某些任务上静默失效。 从 explorer 抄进任务缓存的路径当时是原样照抄而不是翻译,导致两边对「任务在哪儿」的说法对不上。
- 已删除用户的会话不能再换出新凭据。 刷新时,如果这个主体在 users 表里已经没有行了,就不再签发 token。
- 日历的编辑抽屉一定关得掉 —— 现在有三条出路 —— 页面底部也不再多出一条空白。
升级说明(自建部署)
- 没有新增数据库迁移,也没有新增环境变量。
- 这一版之前写入的
kickoff/deadline保持原样不动。 这个修复改的是从现在起怎么存,它不会回头改写历史数据,这是有意的决定。如果你用的是 PostgreSQL,发现某个旧任务在日历上时间不对,把那个任务的日期重新存一次就正了。只影响 PostgreSQL——SQLite 实例从来没有这个偏差。 - 从源码构建全家桶镜像现在需要第二个仓库。 dataflow 编辑器已经拆到独立仓库
ud-dataflow-diagram,通过 Vite 别名以源码方式引用,镜像构建时要求它按ud-dataflow-diagram.lock里记的 commit 检出在主仓库旁边。直接拉已发布的镜像不需要做任何事 —— 这条只影响自己构建镜像的人。
v0.144.0 (2026-08-30)
新功能
- 运行环境页拆成三个标签页:Agent CLI / Prompts / Daemons。 原来五块内容堆在一页上,现在按你要找的东西分开。每个
section的锚点原样保留 —— 改名会让旧链接静默落到别处,所以一个都没动;哪个 section 属于哪个标签页由一份数据说了算,并且有测试盯着「链接指的那个标签页里真的有那个 section」。 - 在数据流图里点任何一个节点,直接连在它身上的连线会亮起来。 用的就是字段行已有的那套高亮,不是第二套 —— 同一个 7 色轮换,颜色、线宽、虚线、阴影一个常量都没有复制。节点选中和字段选中可以同时存在。
- 能把删掉的默认 agent 重新加回来了。 这个动作先前不可能成功:改过名的 agent 仍然带着旧的
builtin_key,新建一份会撞唯一索引,而代码把撞索引读成「别人已经建好了」并返回成功 —— 按钮什么也不做、什么也不说。
改进
- 「查看差异」弹窗里的选项预设,现在读起来是人话,不是 JSON。 原来那一栏直接摊出
{"label":"Opus","args":"--model opus"},旁边却是一份中文写的 prompt 差异。现在是Opus — --model opus,一行一条(原来逗号连起来,不同选项的两半会串在一起),「复制我的版本」复制的也是这个可读形式。解析不了的原样显示 —— 在一个「点下去没有撤销」的动作前面,难看胜过看不见。 - 给 agent 改名时,如果你正在取用某个系统默认的名字,当场就会告诉你。 并且它说的是你刚打进去的那个名字,不是这个 agent 原来的名字(原来两个方向都传原名,类型检查通过,而且理直气壮地说错)。
- 系统给你播种的那几个 agent CLI 行现在是私有的。 它们原来会挂进你的第一个 group 并设成只读分享,结果是每个队友九行,落进其他所有人的「共享给我」里,而且每被别人采纳一次就再复制一份出来。
问题修复
- 改了 CLI 的名字之后,你设的账号默认不会再静默失效。 那个偏好原来存的是名字,改名之后后端按 id 找不到、按名字也找不到,默认就没了。现在存的是那一行本身。
- agent 详情页现在能说出「你给它选的 CLI 已经不存在了」。 这个信号一直存在,也一直被写在文档里,但从来没有被
GET /agents/:id带出来过 —— 而且它是omitempty的,缺失看起来和「这个 agent 没设 CLI」一模一样,所以什么都不会报红。 - 改过名的 agent 不会再保留它名字已经放弃的那些权限。 root-orchestrator 名册和 Alfred 状态卡原来读的是那个不随改名移动的
builtin_key。
这一版里还有 —— agent CLI 名册那一批
这些是 v0.143.0 发出去之后才落到 main 上的,到这一版才第一次到达用户。
- agent CLI 只有一份名册了。 在设置里加的 CLI 原来是写进浏览器
localStorage的,带一个后端从来没见过的 id:只有 Electron 那个一次性选择器能手动跑它,而真正要紧的地方全都看不见它 —— agent 表单的「Runs with」、@mention 派发、daemon 探测。界面说「已添加」,意思其实是「添加到这个浏览器了」。 现在设置写的是服务端目录,并且有一块迁移区把每一条遗留的本地行一键变成真正的目录行 —— 不自动上传,也不静默丢弃。 - 每个 CLI 选择器都能就地加一个 CLI。 选择器都是从一个没保存的草稿里点开的(agent 表单、运行对话框、看板设置),所以「先去加一个再回来」原来的代价是丢掉草稿。现在每个选择器最后都有 「+ 添加 CLI…」,就地打开目录对话框并自动选中它新建的那一行;**「管理 CLI…」**保留给更少见的编辑/删除/采纳。agent 表单在此之前根本没有出口。
- 把默认 CLI 删光之后有路回来了。
POST /agent-clis/defaults/fill-missing会把你缺的那些补回来。它只创建、从不覆盖:你已经有同名行的 slug 会被跳过 —— 不管那行是原样的、改过的,还是你自己从头写的;要把一个已有的行退回默认,路径是差异页,那里会先告诉你会失去什么。你改名改走了的那个 slug 会被补回来,而你改过名的那一行原封不动 —— 那一行是你主动退出的,两者可以并存。 - 你的副本现在能看见它偏离了什么。 模板字段下面一行状态,后面挂一个差异页,可以还原。而且名字终于可以改了 —— 改名是这套设计的退出开关,而它原来根本够不着:agent 名字输入框在编辑时是禁用的,CLI 编辑对话框压根没有 slug 这一栏,而服务端两边都是允许的。差异页遵守两条规则:在不可逆的动作之前告诉你会失去什么(不是之后),以及因为没有撤销,按钮旁边就摆着「复制我的版本」。
- 删一个 CLI 之前能先看见会影响什么 ——
GET /agent-clis/:id/references列出指着它的东西。 - agent 页面不会再报一个谁也解析不出来的 CLI 名字。 回落行为本身没有变 —— 悬空的 CLI 仍然沿着「账号默认 → 内置启动命令」这条梯子降下去 —— 但原来「跑在内置默认上」和「跑在你指定的那个 CLI 上」在界面上长得一模一样。而且队友打开你的 agent 时,看到的是你这次启动会发生什么;按读者自己的作用域去解析会凭空造出一个并不存在的故障。
- 队友派发你的 agent 时,CLI 按你的作用域解析,不是按他的。
- 运行对话框里那个默认 CLI 标签不会再写上一个没人选过的 CLI,并且那把「内置」小锁没了 —— 它宣传的是一条从来不存在的限制。
- 给 agent 改名不会再让它的定时唤醒静默失效(上面的迁移
00080)。原来任务里存的是名字,改名之后它用到的那一刻就解析不出来了,然后每一次触发都失败,而任何界面上都没有一句话说明为什么。 - 指向运行环境配置的链接现在真的指向运行环境页。 六条里有四条指着
/workspaces,而那些配置 2026-08-21 就搬走了;/agents/runtime的各个区块现在有了名字,链接才能指到其中一个。 ud不再问「哪些行是内置的」,改问「哪些行和某个默认同名」 —— 和网页界面用的是同一条规则。
升级说明(自部署)
⚠️ 升级前请先备份数据库。 这一版有四条新的数据库迁移(00079–00082,sqlite 与 postgres 各一份),启动时自动执行,把 goose_db_version 从 78 推到 82。其中三条会改写已有数据:
00079_privatize_seeded_agent_clis—— 把名字在九个已知 slug 内(claude/codex/aider/opencode/gemini/copilot/qwen/kimi/pi)且不属于遗留 system 目录的agent_clis行的group_id与sharing清空。用户看得见的后果:这些行会从别人的「共享给我」里消失。 原值存在备份表agent_cli_privatize_backup_00079里,Down能按原值还原。00080_wake_payload_agent_id—— 把wake_agent_session类定时任务 payload 里的 agent 名字改写成 agent 的 user id,这样改名之后定时任务不会静默失效。原 payload 存在wake_payload_agent_backup_00080里,Down能还原。指向已被改名或删除的 agent 的任务不在改写范围内 —— 没有东西能把它解析出来,猜一个会把「明着失败」变成「唤醒了错的 agent」。00081_drop_agent_cli_builtin—— 删掉遗留的owner_id='system'目录行和agent_clis.builtin列。它不是一句DROP:先把仍然指着 system 行的agent_configs重指到该 owner 自己的同名行,然后才删。重指不到的故意留成悬空,在 agent 页面上显示成「这个 agent 设定要跑的 CLI 已经不存在了」 —— 那是你看得见、能处理的,而清空会把你做过的选择静默改写掉、不留痕迹。00082_drop_agent_builtin_key—— 删掉agent_configs.builtin_key列。判断一行是不是某个系统默认的副本,现在只看名字,改名就是退出的方式。
🔴 回滚不是对称的 —— 哪两条能退、哪两条退不回来:
| 迁移 | 可逆性 |
|---|---|
00079 privatize | ✅ 有备份表 agent_cli_privatize_backup_00079,Down 按原值还原 |
00080 wake payload | ✅ 有备份表 wake_payload_agent_backup_00080,Down 还原 |
00081 重指 | 🔴 就地 UPDATE,Down 不还原指向关系 |
00082 drop builtin_key | 🔴 Down 只还原列的形状不还原值;没改过名的能从名字推回,改过名的永久丢失 |
00081的Down能还原表结构和 system 行的内容,但还不原「哪个agent_config原来指向哪一行」 —— 重指是就地UPDATE,覆盖之后那个事实哪儿都不存在了。00082的Down只把列加回来,是空的。一个错的builtin_key比没有更糟,因为读它的代码把它当权威。
⇒ 所以升级前那份数据库快照不是保险,是唯一的退路。
没有新增环境变量。
⚠️ CLI 要你自己升:npm i -g @oatnil/ud。 没有任何东西会替你升级它。
v0.143.0 (2026-08-29)
新功能
ud config onboarding—— CLI 自己拥有了这份配置清单。 一条命令把每一项没配好的东西列成一行检查项,每行带上修好它的那条next_command,--json可机读。它从不交互提问,所以 coding agent 可以自己跑、按行处理、再跑一遍,直到退出码 0。标了requires_human的那些行 —— 首先是要输密码的ud login—— 会交还给你,而不是替你跑掉。- 不会再有任何东西把你指向一台你没选过的服务器。 在一台还没配置过的机器上,登录命令现在写的是
ud login --api-url <YOUR-SERVER-URL>—— 一个必须有人填的、看得见的空,而不是默默写上我们自己托管的那台后端。自己跑服务器才是正常路径;我们托管的那台是给人试用的测试服务器,现在每一处提到它的地方都会这么说。
问题修复
- 原来那条建议的登录地址是 404。 旧的默认值是
https://ud.oatnil.com,那个域名服务的是网页应用,不是 API,所以ud login打过去会以status 404失败。这个默认值已经删掉了。 - 从工作台启动的 agent 现在会带上自己的参数。 选项下拉里挑的模型参数,只有通过 @mention 启动时才会到达 daemon;走「以 agent 身份运行」这条路时它被静默丢掉了。现在两个入口产出的启动命令逐字节一致。
- 预设参数变体在每个显示面上的顺序统一了 —— API 返回、网页界面、
ud describe全部按 label 排序,下拉框和 CLI 不会再对「谁排第一」各说各话。 - 「没有检测到 agent CLI」那块面板不再说一件不成立的事。 会话并不需要一个被检测到的 CLI:派发根本不看探测结果,一行指向未检测命令的配置照样能跑。面板现在把这件事说清楚,并链到运行时页面上的「你的 agent CLI」。
- daemon 离线的回执会告诉你该去哪。 它带上了指向「机器」页面的链接,用触发者自己的语言书写,并且不再暗示一台从未注册过的机器只要启动一下 app 就会重新连上。
- 删掉遗留的内置 CLI 行,不会再把安装列表或桌面端探测清空 —— 两处现在都按「这行能做什么」来选,而不是按已废弃的
builtin标志。
桌面端
- app 打开的每一个窗口都有页内查找(任务弹窗、编辑器、便签、浮动查看器),不再只有主窗口有。
- 查找栏的三个修复:打字会返回结果,而不是把框留在一排掩码点上;回车走到下一个匹配,而不是永远绕回第 1 个;把窗口缩小不会再把关闭按钮从末端裁掉。
- 会话状态那个词又能聚焦它的窗口了,聚焦不了的时候会说明原因,而不是点了没反应。
升级说明(自部署)
⚠️ 升级前请先备份数据库。 这一版有一条新的数据库迁移(00078_agent_cli_extra_options,sqlite 与 postgres 各一份),启动时自动执行,把 goose_db_version 从 77 推到 78。它对 agent_clis 做三件事:
- 新增
extra_options列 —— 纯新增,默认为空; - 对新唯一性规则下会冲突的行改名,做法是把行 id 的前 8 个字符接在名字后面。这一步不可逆 —— 原来的名字没有任何地方留底;
- 把唯一索引
idx_agent_clis_group_name换成idx_agent_clis_owner_name,agent CLI 的名字从「每个 group 内唯一」变成「每个 owner 内唯一」。
第 2 步只动那些 (owner_id, name) 相同的重复行。我们升级的两台实例上它改名 0 行 —— 但那是关于我们数据的事实,不是对你的数据的承诺,所以备份要排在前面。回滚也不是对称的:goose down 会把旧索引建成非唯一的,不会把改过的名字改回来,而且会把 extra_options 列连同里面存的东西一起删掉。
没有新增环境变量。
2026-08-29 更正:这一节最初发出去时写的是「没有新增环境变量。没有新增数据库迁移。」后半句是错的 ——
00078确实会跑。如果你已经没备份就升了,要看的是上面第 2 点。
⚠️ CLI 要你自己升:npm i -g @oatnil/ud。 没有任何东西会替你升级它,而且 ud config onboarding 从这一版才开始存在 —— 更旧的 CLI 会回一个「未知命令」的错误。
UnDercontrol 的版本更新历史和新功能介绍。
版本号说明
UnDercontrol 采用语义化版本号(格式:主版本号.次版本号.修订号),例如 v0.19.0:
- 主版本号 0:表示开发版本,API 和功能可能会有较大变动
- 次版本号(如 0.19.0):增加新功能、重大改进或包含破坏性变更时递增
- 修订号(如 0.19.0):修复 bug、小优化等向后兼容的改进时递增
v0.142.0 (2026-08-27)
新功能
- 图有了自己的页面。 从资源树或任务卡上打开一张图,落到一个只负责把它画出来的详情页。编辑是刻意的第二次点击,会在新标签页里打开编辑器。
- 画布跟着触控板走。 双指滚动平移画布,捏合缩放。普通滚轮是平移;缩放挪到了捏合、修饰键+滚轮,以及画面上的控件。
改进
- 不写坐标的图会自己排版。 默认从左到右(
direction: TB让文档退回自上而下),每层的间距按那层最高的节点算,没有坐标的节点落在它连着的邻居旁边,而不是落到原点。 - 节点宽度跟着它必须装下的文字走 —— 不换行的一行会把收缩节点撑过最小宽度,没样式的便签按最长那行内容量,折叠的便签或资源按它 32px 的方块量。
- 文档里没写的连线端点,由两端的相对几何求解;你自己写了的那个,永远不会被改写。
- 选中连线时才显示端点,并且画在节点之上,让端点抢到属于自己的像素、真的能抓住。节点和字段上的把手保留原来的悬停反馈。
- 重连一根管子会保留它的 id,所以它的数据和撤销历史都跟着走。
- 管子菜单在你点的位置打开,并被夹在视口里。
- 标签会换行,而不是消失。 连线标签不再被钉死在路径中点,会先换行再截断;图标标题最多折三行,让共用前缀的名字不再长得一模一样;过长的字段值由 CSS 在 200px 处切,而不是由一个 CSS 根本看不见的 10 字符切片来切。拖动标签提交的是指针实际走到的位置,不是上一帧渲染看到的位置。
- 折叠节点的把手和连线,锚在你看得见的那个方块上,而不是它折叠前的尺寸。
- 文档自带的 id 能活过打开、合并、保存 —— 只有真的撞号才会重新分配。
图的格式收敛成一种
完整 graph JSON 现在是 spec.data 唯一可用的格式。 节点带 type 和 data(外加可选的 id、position、style),连线引用节点 id;position 是可选的,全都不写就把排版交给编辑器。
两个退役方言 —— simplified(节点带顶层 name 和 fields)与 architecture(顶层 groups 数组)—— 现在会在 ud apply 时按 shape 当场拒收。 报错会说清它看到的是哪一种、正确格式写在哪、以及如果你手上的副本还在教旧的就去升级 CLI。内置的 generate-dataflow skill 现在只教这一种格式。
问题修复
- 把任务移到「未归档」现在能通过 HTTP 表达了。 「未归档」和「钉在顶层」自 2026-05-27 起被压成了同一个存储值,导致「显式根」根本没有载体,资源树的根目录里塞着所有没人归档的任务。现在它们分别是
""和/,指的是不同的地方。 - 重命名路径前缀在 PostgreSQL 上从来没生效过。 已修 —— 在 PG 上移动文件夹是静默无操作。
- daemon 的事件流不再丢失被网络分块切开的帧。
- agent 会话的 init 看门狗,不再去指责一台它根本没检查过的机器。
- 运行时页面不再声称服务端放不下自定义 CLI。
- 资源检查器读的层级下移了一级,页头也不再大喊大叫。
升级说明(自部署)
🔴 ud CLI 要和服务端同时升,不能之后再补。 这一版的服务端会在 apply 时拒收两个退役方言。比这一版旧的 CLI 里,内置 skill 还在教其中一种 —— 所以跑着旧 CLI 的 agent 会开始被拒,而它手上的教材还在叫它写那个被拒的形状。
⚠️ 如果你的 CLI 是从 npm 装的,没有任何东西会替你升级它。 请自己跑 npm i -g @oatnil/ud。在你升级之前,拒收一直存在 —— 这个残留窗口是真的,不是理论上的。
🔴 但报错不会叫你去升级。 服务端为这一刻专门写了分方言的引导文字(说明看到的是哪个方言、并叫你升级 CLI),但 web 层发出去的是错误码的静态默认文案,不是那段文字 —— 你实际收到的是泛化的那句 Diagram content uses a retired format; the only accepted format is the full graph JSON。它识别出的方言仍然在,在响应的 details.dialect 字段里。如果你的 agent 开始被拒,这一段就是那条报错本该给它的引导。
⚠️ ud explain dataflow.spec.data 里仍然查不到「完整 JSON 是唯一格式」这句。 那段 schema 文字在一个独立仓库里,没有随这一版发出去,所以 schema 这条路对它是沉默的:服务端会执法,schema 不会预先警告你。 agent 的另一条路 —— ud describe skill generate-dataflow —— 是对的,只教一种格式。这两条是不同的来源,这一版只动了其中一条。
没有新增环境变量。没有新增数据库迁移。
已知限制 / 已知变差
这一版是带着下面这些问题发出去的,是有意的。
- AI 生成完整格式这条路从未实测 —— 开发机上没有配 AI provider,所以它是没有量过的。
- 两项排版指标变差了:线穿节点从 2 变成 3,标签互相压住从 10 变成 14。层内排序和标签避让都没做。
- 深度缩小时抓不住连线端点。 抓取半径按 flow 单位算,不随屏幕缩放。
- 真触控板双指平移、以及中键/右键拖动平移,仍然未验。 只有真人在真实硬件上才能验,两条都还开着。
- 你拖好并保存的布局,会被 agent 的下一次
ud apply静默丢弃。 这是有意的决定:不加闸,也不做合并。 上一版仍留在这张图的历史里。
v0.141.0 (2026-08-23)
新功能
- 文件在
ud命令行里成为一等公民。 文件现在是kind: File文档,和其他资源一样有get/describe/apply/delete。上传用ud apply配--content-file <路径>—— 路径只是命令行参数,不进文档,所以同一份 manifest 换台机器照样能用。 - 换掉一个文件的字节,被换掉的那份会留下来。 替换会先把新内容写到新位置,确认落好之后才把文件切过去,再把旧位置记进历史。绝不原地覆盖 —— 所以替换中途出问题,也毁不掉你原来那一版。
- 文件有内容历史。 你换掉过的每一版都列在文件页上。历史记的是每一版旧内容存在哪里,而不是再存一份字节。
改进
- 资源详情页重新整理过。 页头说清这是什么,页面上也写明这个文件占了你多少存储。
- 存起来的图会显示图本身,和编辑器用的是同一套渲染,不再是一个占位图。
- 只读的图不再摆出那些根本存不下去的编辑按钮。
- app 里又可以新建数据流图了 —— 上个版本里这个入口被临时藏起来过,现在放回来了。
问题修复
- 资源详情面板里那两行编出来的值没有了。 「存储」那一行在任何实例上都显示
s3-us-east-1,不管文件实际存在哪 —— 连存在本地磁盘的实例也这么显示;「上传者」则不管是谁传的都写「You」。现在这两行要么显示真值,要么整行不显示。这种错最容易骗人:它长得像一个正经的值,所以没人会想到去怀疑它。 - 查找失败不再报成「没有这个文件」。
ud describe resource在只是没能问成的时候回答Resource not found,害人去找一个其实一直都在的文件。 - 文件历史会把「没能读到」和「本来就没有历史」分开。 以前这两种情况都渲染成同一个空列表。
- 删掉了详情页上一个从来没进过任何构建的统计块。
升级说明(自部署)
- 一条新的数据库迁移(
00077,建resource_content_histories表)。启动时自动执行,SQLite 与 PostgreSQL 都有,只新建一张表,不动任何既有表。本次发版是真的拿一个 v0.140.0 的库原地升上来验的:表会出现,既有数据一行没变。没有新增环境变量。 - 🔴 你换掉过的旧版本要算进存储用量。 旧版本的对象还存着,所以那仍然是你的字节 —— 一个文件换过两次,三个版本都占着。⚠️ 本次没有删除旧版本的办法,所以如果你在意用量,替换请谨慎。
- dataflow schema 里的
dataFile已删除。 图的内容本来就该内联在data里。manifest 里还写着这个字段的,请去掉。
已知限制(本次没做)
- 🔴 详情页的触屏行为没有在真机上验过。 代码是在的 —— 粗指针下「改名」入口常驻,不再藏在长按后面 —— 但模拟器里点击不落地,所以这一支是带着「真机未验」发出去的。 本次其余内容在 macOS 与浏览器上验过。
- 旧的文件版本删不掉 —— 内容历史只增不减,而且计入用量。
v0.140.0 (2026-08-23)
新功能
- 数据流图成为一等公民 —— 在 app 里新建 / 编辑的图,从此存进它自己的地方,不再是资源里的一个文件。图进资源浏览器的树,和任务、资源并列,重命名、移动、删除都按它自己的方式走;也可以挂到任务上,在任务详情的附件区上方单独一列(图有名字,但没有文件大小和文件类型,所以不混进附件列表)。
- 图有版本历史,并且可以回滚。 回滚是把那一版当作一次新的保存写回去 —— 中间的版本不会被抹掉,被替换的那一版进历史。
- 分享一张图时,图里引用的图片跟着可见 —— 且只在这张图里可见。 取消分享后对方立刻看不到;该图片在别处(比如仍挂在你的私有任务上)的可见性一个字节都没有变。
ud命令行可以直接读写图 ——ud apply认kind: Dataflow,新建和更新用同一份文档。身份是「所有者 + 路径 + 名字」,所以同一份文件改一笔再 apply 就更新同一张图,不会多出一张;原样再 apply 一次则什么都不写。另有ud get / describe / delete dataflow、ud describe dataflow <id> --history看版本(并直接说明每一版还能不能回滚),以及ud describe dataflow <id> -o apply导出 —— 导出的文档带图本身,可以直接管道回ud apply,真的能往返。
改进
- 图的保存产物从 PNG 变成图的 JSON 本身。 同一张图从约 22 KB 降到约 1.9 KB。「导出 PNG」按钮不变,那里仍然是真画面抓取。
- 🔴 你已有的图在下次保存后,文件名会从
.dataflow.png变成.dataflow.json,内容不变。 打开、编辑、重开都正常。⚠️ 本地已经ud pull过的目录,文件名不会自动跟着变 —— 本地还叫.dataflow.png不代表改名没生效、也不代表文件坏了,文件是好的,只是名字旧;pull 到干净目录拿到的就是新名字。既有的.dataflow.png永远还能打开,不需要你做任何迁移。 - 图不占存储配额 —— 配额算的是对象存储的账,而图存在数据库里。代价是这块占用在原来两个用量数字里看不见,所以管理员的存储页新增「图表字节」一列(含历史版本),超过 1 GiB 的所有者会被标出来。这一列不并进总字节数。
- 原样再保存一次不会产生任何写入 —— 修改时间不动,也不会多长一条历史。
- 图里的图片读不到时,节点会写明原因(「图片已删除」/「图片不可访问」/「无法预览」/「图片加载失败」并可重试),不再是静默的空白。
- 服务端启动横幅现在报的是实际生效的存储,而不是环境变量要求的那个,并在两者不一致时报一条差异告警。自建实例据此可以一眼看出「我配的」和「真正在用的」是不是同一个。
变更(会影响现有用法)
- 图里不再允许内联图片。 任何
data:URI 一律拒绝(不看大小),图片必须先上传成资源,再在图里以resource://<id>引用。单个版本上限 1 MiB。 - 迁移前建的老图仍然从资源里打开(资源页与预览页会显式标明),新建的图走新的地方。这是一次发版的过渡态,不是长期两套。
问题修复
- 在编辑器里改一笔
.dataflow.json再重开,画布会变成空白 —— 而且没有任何报错。 成因是文件名和文件内容由两处分别决定,可能各说各话;现在由同一处决定,不会再分家。 - 放在文件夹里的图没法用
ud apply更新。 建图时文件夹被存成规范形态,而按键查询比的是你写的原样字符串,查不到刚写的那一行,于是 apply 掉进「新建」并被唯一性拒绝。根目录的图不受影响。 - 原样再
ud apply一次会顶走修改时间。 之前把「字段出现在文档里」当成了「字段变了」,每次都会发一条更新。 - 以「只读」分享出去的图,组成员可以改写内容、可以改名,改动会落库。 现在写入是所有者独占的,读仍然按分享范围 —— 被分享的人拿到的是明确的拒绝,而不是「找不到」。
升级说明(自部署)
本次前端、后端、ud CLI 必须一起升级。 只升后端而前端还是旧的,人在 app 里编辑的和 agent 通过 CLI 写的会落在两个不同的地方,两边都以为自己是对的。
有两条新的数据库迁移(00075 建图与历史两张表,00076 建图与任务的关联表),启动时自动执行,goose_db_version 由 74 前进到 76。两条都只新建表,不动任何既有表,SQLite 与 PostgreSQL 都已验过。没有新增环境变量。
🔴 升级后请重新登录一次。 本次新增了图的四条权限,它们已经补进默认角色,但你手上已经签发的登录令牌和 agent token 里没有 —— 不重新登录或刷新令牌,所有对图的请求都会被拒。
另外附带一个运维命令 migrate-dataflows,用于把资源里的老图搬进新表(只复制,不删除,可以重复执行)。⚠️ 目前它在 PostgreSQL 上遇到「带内嵌图片的图」会失败,所以 PostgreSQL 实例暂时不要执行它 —— 不执行不影响本次发版的任何功能,老图照常打开。
已知限制(本次没做)
- app 里没有分享图的入口 —— 接口在,界面还没有,今天只能通过 API 分享。
- app 里没有历史面板,
ud也没有回滚子命令 —— 历史可以看(--history),回滚目前只能通过 API。 - 在 app 里打开一张图再保存,即使一个字没改也会多出一条历史(命令行侧不会)。
- 桌面端(Electron)与 Windows 没有验过,本次验证在 macOS 与浏览器上完成。
v0.139.0 (2026-08-22)
新功能
- 工作区页面新增「会话历史」 —— 在正在运行的会话列表旁边多了一个「历史」标签页,看得到过去的 agent 会话到底留下了什么。按天分组,再按卡片分组:哪些 agent 跑过、跑了几次,以及每次会话窗口内产生的评论、笔记、附件数量,加上最近一次状态变化和最后一条评论的预览。支持按日期范围(默认最近 3 天)、agent、卡片筛选,还有一个「有产出 / 无产出」开关 —— 最后这个回答的是「哪些会话跑了但什么都没做」。结束得不好的会话会如实显示,不做粉饰:丢失、从未启动、只有回执、退出但没记录原因、以及超出 3 天审计窗口的「状态变化未记录」。两类数字被刻意分开:评论数是归属到 agent 的硬数据,笔记数和附件数带 ⚠,是窗口内的估算,不代表归属。
- 任务可以是一篇文档 —— 把任务的状态清空,现在表示「没有工作流状态 = 文档」,而不再回退成「待办」。文档在资源浏览器里有自己的图标,不会出现在看板列和状态筛选里;卡片属性区新增的「状态」行可以一键在任务和文档之间切换。
ud apply也支持:显式写status: ""就创建或转换成文档,不写这个字段仍然默认「待办」。你已有的卡片不受影响 —— 它们都带着真实状态,只有主动清空状态的卡片才会变成文档。 ud get subscribers <comment-id>—— 可以从 CLI 看到一个评论线程的路由状态。此前没有任何办法观察「这个线程会通知到谁」,这也是下面那个退订缺陷几个月无人察觉的原因之一。
改进
- agent 写的笔记和描述修改,现在归属到 agent 本人,同时记录代其操作的人。在此之前每一条 agent 写的笔记都记在人名下,agent 的产出无法与你自己的区分开。旧数据保持原样,无法追溯恢复。
- 任务的笔记按明确的顺序返回(最早的在前),而不是数据库碰巧给的顺序。编辑一条笔记不会再让它在列表里换位置。
- 退订会说清它实际做了什么 —— 返回结果带上受影响的会话数,所以一次什么都没写入的退订会如实说明,而不是照样报成功。文案不再混用「你」和「对方」;文档里「被 @ 一定会重新订阅」的说法也改正了 —— 它只在特定情况下成立,现在把条件写清楚了。
- 属性区的状态行排成一行(图标 + 文字 + 箭头),和「群组」「负责人」等其他属性行对齐。
问题修复
- 工作区会话历史接口对所有人都被拒绝 —— 路由建好了但没有在权限注册表里登记,于是每一次调用都在鉴权之前就被拒。这就是「历史」入口上那行 "Access denied" 的修复。
- agent 给自己退订某个线程时静默无效,却照样报成功 —— 它退订的是它代理的那个人,而不是 agent 自己,所以没有任何订阅记录被匹配到。
- 附件数量可能显示为 0 —— 任务附件在库里存成两种 entity type(当前的和历史遗留的),而计数只认当前那一种。
- 会话历史对每一个会话都报「无记录(超过 3 天)」 —— 三天的窗口被当成纳秒来算,截止点塌缩到了「此刻」。现在窗口内、卡片确实没动过的会话会正确显示为「无变化」 —— 这正是这一列存在的意义。
- 用户名只是碰巧以 "visitor" 开头的账号,被显示了访客测试账号的警告横幅 —— 现在只有真正由访客入口创建的账号才会被判定为访客。已有账号的判定结果没有任何变化。
- 非法的任务状态现在返回明确的 400 错误,不再是 500。
升级说明(自部署)
无需手工操作。本次没有新增环境变量,也没有新增数据库迁移 —— goose_db_version 仍为 74。
本次是仅后端发版。 桌面端和 ud CLI 没有为 0.139.0 重新构建,下载入口仍然指向 0.138.0,只有服务端镜像更新。网页端已经是最新的,所以升级后端正是让前后端重新对齐的那一步。
v0.138.0 (2026-08-21)
新功能
- 在 App 内自己删除账号 —— 设置里新增删除账号入口,不用再找人代办。删除会一并带走这个账号名下的数据与凭证:登录令牌、API key、文件与资源都不再保留,残留的文件不会变成没人认领的孤儿。你留在别人卡片上的评论会保留,因为那些内容属于它所在的讨论,不属于你的账号。这是不可撤销的操作。
- 知识图谱可以只看已归档到目录的节点 —— 图谱新增一个开关,打开后只显示归到目录里的任务,把散落的节点收起来。开关需要同版本的服务端:自建实例如果只更新了前端、没更新后端,这个开关会是灰的并给出说明,图谱本身照常显示 —— 这是预期行为,不是故障。
- 快速记账不写币种也能记下来 —— 以前一条没有币种的记录会直接失败。现在会按顺序推断:先看图片里的符号,再看账户,再看你自己设的默认币种,然后是最近用过的、系统学到的,最后兜底 USD。顺序有一处变更:「你在设置里选过的默认币种」现在排在「最近用过的」前面 —— 用户明确表达过的偏好,优先于系统自己猜出来的。代价是连着录一批外币时,链不会因为「刚录过」就跟着猜,你设过的默认会一直赢,直到你自己改掉或那条记录本身带了币种符号。推断结果在界面上看得见,也能一键改掉。
改进
- 登录后和「返回应用」都落到资源浏览器,不再是 AI 对话页。
- AI 助手统一为悬浮窗 —— 全屏 AI 对话页已移除,窄屏也能打开悬浮窗。原来的
#/ai书签会自动跳到新位置。 - 派工起会话不再打断你手上的事 —— 会话窗口不再自己抢到最前面。需要时从工作区页面或任务卡上点一下,把它调到前面。同时新增到达提示:有会话在你没注意时启动,会在应用内列出来,点哪条就清哪条。
- 哪个 CLI 跑这个 agent,搬进了「编辑代理」表单 —— 详情面板里原来那个入口已经移除。同时行为有变:以前在详情面板里选一下就立刻生效,现在要按「保存」才生效,和 agent 的其余设置一起提交。
- 「默认 CLI」现在跟着账号走,不再是每台浏览器各存一份 —— 换台电脑、换个浏览器,默认 CLI 都跟着你。它也参与 CLI 的解析顺序:你给某个 agent 单独设过的 CLI 仍然优先,没单独设过的才用账号默认。
- 起不来的会话不会再凭空消失 —— 从未成功启动的会话现在会保留 24 小时,并写明它停在哪一步、为什么(例如「daemon 30 秒内没有响应工作区初始化」)。这一条只是让失败看得见,不是修好了会话启动。
- daemon 的启动过程可以事后查了 —— daemon 启动工作区的五个步骤会写进本地日志文件,含脱敏与轮转,默认开启。排障时能直接看出卡在第几步。同样只是可见性,不是修复。
升级说明(自部署)
无需手工操作。本次没有新增环境变量,也没有新增数据库迁移 —— goose_db_version 仍为 74。
前端与后端建议一起升级:知识图谱的目录开关需要同版本服务端才可用(否则灰显),App 内删除账号也需要后端同版本才会出现。
v0.137.0 (2026-08-18)
新功能
- 一键给任务建同名文件夹并放进去 —— 在资源浏览器里,任务可以一步创建一个以自己标题命名的文件夹,并把自己移进去。同名文件夹已存在时会拒绝,不会合并也不会重复创建;已经在自己同名文件夹里的任务不再动它(再点一次不会套出
标题/标题);标题里没有可用字符时会单独说明拒绝原因。 - 可以从访达 / 资源管理器直接把文件拖进来 —— 资源树现在接受从桌面拖入的文件。拖动时鼠标所在的文件夹会高亮描边,文件就落在那里;鼠标不在任何文件夹上时,退回到当前选中行所在的文件夹。落到根目录时会明确提示一句,因为根目录是唯一没有行可以高亮的目标。拖进来的是文件夹时会告知,而不是当成垃圾文件传上去。
改进
- 一次失败的拖拽会把每个失败的文件都列出来,合并成一条提示 —— 之前一次拖多个文件失败,只会看到最后一个,其余的被吞掉(屏幕上同时只保留一条提示)。现在按原因归并成一条提示,逐个列出文件名;只有一个失败时仍然保留它自己的提示和 trace id。
- 邀请码面板可以按预期关闭 —— 按 Esc 或点面板外面即可。之前只能点它自己的 X 关掉,于是它一直压在填了一半的注册表单上,直到用户找到那个图标。关闭它只影响它自己:已生成的邀请码、表单其余内容和整个页面都原样保留。
问题修复
- 通过公开分享链接上传,对存量较大的账号恢复可用 —— 往别人的公开分享链接里投文件时,只要该链接的所有者已存超过默认的 1 GB,就会返回一个赤裸的内部错误,不管投的文件多小 —— 因为投递是拿陌生人的额度去量,却记在所有者的用量上。现在匿名投递按所有者的真实额度判定,文件能正常落地。真正为这件事设的每链路上限没有改动,仍然生效:单文件 10 MB、每条链路 100 MB,以及按链路的限流。
- 被拒绝的上传现在会说自己是被拒绝的,而不是看起来像崩了 —— 因超出配额被拒的上传,以前是一个笼统的内部错误(500),既藏起了原因,又把一次有意的"不行"记成了故障。现在返回明确的空间不足(413
RESOURCE_QUOTA_EXCEEDED,实例自身磁盘满时为 507)并带上限值 —— 而且是所有上传入口都如此,不再只有恰好做了映射的那一个。
升级说明(自部署)
无需手工操作。本次没有新增环境变量,也没有新增数据库迁移 —— goose_db_version 仍为 74。
v0.136.1 (2026-08-17)
v0.136.0 当天即被 v0.136.1 取代:0.136.0 只发出了命令行工具和后端镜像,桌面端与应用镜像从未发布。内容与本条相同。
新功能
- 上传总开关(自部署) —— 实例可以整体关闭上传。关掉之后,所有由人发起的上传(任务附件、速记、AI 图片/音频输入、匿名分享投递)都会被拒绝,而且八个入口给的是同一个原因码,不再各说各话;系统自身的备份写入不受影响,关掉上传不会连备份一起停掉。
- 速记:一个入口识别所有 —— 一张截图交给同一个入口,自动判成支出、收入或任务,不用先想好它是哪一类。原来的单用途端点原样保留,已经在用的调用方和旧快捷指令不受影响。
改进
- 上传失败会告诉你到底为什么。 上传被拒时,上传窗口里每个文件各自显示真实原因(容量不足、格式不收、实例关闭了上传……),不再一律是「上传失败」四个字。
- 后端也不再把这些带原因码的拒绝压成 500 —— 之前一个说得清的拒绝会以「服务器内部错误」的形状到达前端,既看不出原因,也不该算成故障。
- 快捷指令过期提醒在这次链路切换后依然有效,不会因为换了路径就静默消失。
升级说明(自部署)
- 数据库迁移照常在启动时自动执行。
- 新增一个可选环境变量
UPLOAD_ENABLED(默认true)。设成false即可关闭本实例的全部上传;不设置的实例行为和以前完全一样。 - ⚠️ 这是一道单向闸,值得先读一遍再用: 一旦以
UPLOAD_ENABLED=false启动过,后面把它改回true并不会重新打开 —— 等于默认值的种子值不会写回库里,库里存着的false会挺过重启。想重新打开,请在管理面板里打开(立即生效,不用重启),或删掉那一行配置。
v0.135.0 (2026-08-16)
新功能
- 交易页支出分解视图 —— 新增「花到哪了」分类视图,侧栏按实际→计划节奏分组;支出汇总改为显示全部分类(不再只有前三),占比相加恰为 100%。
- 快捷指令版本提醒(基础设施) —— 当你的 iOS 记账快捷指令落后于最新发布版时,应用内会收到一条升级提醒(每个新版本最多一条),指向安装页。随带版本号的新版快捷指令逐步生效;旧快捷指令完全不受影响。
- 首页重设计 —— 单屏 hero,可切换的线稿实时演示。
改进
- 快速记账 —— 收入关联的图片可以从该收入记录直接打开;图片过于模糊时给出明确提示而不是通用错误;拍完的图立即到达落地页,无需等待模型回复。
- 桌面端 —— 所有「未就绪」状态都会打开服务器面板并给出具体说明,不再停在空白页。
问题修复
- 慢网络下大图收据上传不再失败。 此前拍收据若图片较大(约 2.3MB 以上)且链路慢,会转圈 30 秒后失败。现在上传立即受理、后台传输并自动重试;重试全部失败时任务在队列页标为失败,点 Retry 会用同一份图片重传 —— 应用重启也不丢。
- 队列页的 Retry 按钮修好了 —— 此前请求未到达服务端逻辑就被拒绝。后台任务也不会再出现服务重启后「显示完成但实际没跑」的情况。
- 宿主被移除的工作区会话会在半分钟内标记为失联,不再永远显示「运行中」;宿主只是暂时离线的会话不受影响。
- 共享层级树按每个节点的打开权限判定可见性,并为查询成本加了固定上限。
升级说明(自托管)
无必做步骤。数据库迁移照常在启动时自动执行。新增一个可选环境变量 SHORTCUT_INSTALL_CONFIG_URL(后端从哪里读取最新快捷指令版本),自带可用默认值 —— 只有自托管快捷指令安装配置时才需要设置。
v0.134.0 (2026-08-12)
新功能
- 桌面端有了「快捷键」设置页,全局唤起 Alfred 的那个键可以自己录了 —— 设置里新增一张快捷键表,一行一个命令。全局唤起 Alfred 那一行可以点进去录制:按下你想要的组合,它就填进去(VSCode 那种交互)。应用内的那些快捷键这一版仍是只读的,表里会明确标出来,不会让你以为点了没反应。
- 录完之后要你真按一次,这一次按下是保存的门,不是提示 —— 录完不会立刻生效:应用会请你用新组合真按一次。按到了才保存;没按到就什么都不改。整个试用期间旧的快捷键一直是活的,所以即使你放弃了、或者这个组合根本按不响,你原来那个键仍然照常工作。
- 选中的组合如果和应用内某个命令重合,会给你一条警告,而不是直接拦住你 —— 你仍然可以选它;提示只是让你知道按下去会同时触发两处,由你决定要不要换一个。
改进
- 应用内唤起 Alfred 的键从
Ctrl+A改成了Ctrl+Shift+A,而且现在在文本编辑器里也能按 —— 旧键和「全选」撞车,并且在编辑器里输入时会被吃掉。新键在编辑器获得焦点时同样会唤起 Alfred。引导页里教这个键的中英文两处文案也一并更新了。
问题修复
- 删掉的支出/收入,不能再按 id 取回来 —— 删除是「隐藏」,列表里已经看不到了,但按 id 查询这一路没有做同样的过滤,于是一条已删除的支出/收入(金额、商户、卡号尾号、订单号)在删除之后仍然可以被完整读回。现在按 id 查询和列表一致,已删除的返回 404。
这一版里有一格没被真人验过(请照实读)
- 「录制时那道确认,真的能挡住『注册成功但永远不响』的组合」这一条,没有任何人真按过。 所以我们不写它「已验证」。它的失败方向是安全的那一边:没有按到确认就不保存 —— 最坏的情况是「一个本来能用的键设不上去」,而不是「你的键悄悄失效了」。如果你遇到某个组合怎么都确认不了,那就是这一格,换一个组合即可,你原来的键不受影响。
升级说明(自部署)
- 本版没有新增环境变量。
- 本版没有新的数据库迁移。
- 后端这一版只有一处行为变更:
GET /expense/:id与GET /income/:id对已删除(隐藏)的记录改为返回 404。如果你有脚本依赖「删除后仍能按 id 读回」,它会从这一版开始拿到 404。
v0.132.0 (2026-08-11)
新功能
- pi 和 kimi 现在是可选的内置 agent CLI —— 这两个此前只在部分地方出现过,别处枚举内置 CLI 名单时看不到它们,于是「这台机器上只装了 kimi」会解析不出任何默认 CLI。现在花名册、引导页的 CLI 目录、以及自动挑默认值的优先级顺序里都有它们(排在原有七个之后)。
改进
- 引导页的「这台机器」一步:CLI 那一块现在是一份「这台机器有什么」的清单 —— 它读的是这台机器的探测结果,列出真正装了的那些,其余用一句话带过;每条说明只在轮到它的那项检查时出现一次。
问题修复
- 人发起的第一个会话,现在跑在这台机器真正装了的那个 CLI 上,而不是写死的 claude —— 奖励按钮「开第一个会话」发出的请求不带命令,而解析这个默认命令的那段逻辑完全没有读探测结果,于是在任何机器上都返回
claude --dangerously-skip-permissions—— 一台只装了 codex 的机器,会话起来就是 command not found。现在它复用给 agent 填 CLI 时用的同一个挑选逻辑。从来没收到过探测上报的实例行为不变,仍然是原来的默认值。 - 一行 metadata 存成了非法 JSON,不再让整次 sprint 查询直接失败 —— 只要有一行坏数据,
close-sprint和每晚的敏捷巡检这两条都会中断,而不是跳过那一行。
升级说明(自部署)
- 本版没有新增环境变量。
- 本版有一个新的数据库迁移
00073_add_pi_agent_cli(sqlite 与 postgres 各一份),启动时自动执行,往内置 CLI 目录里加一条pi。 - 行为变更 —— 不带命令启动的会话,默认命令的来源变了。 过去恒为
claude --dangerously-skip-permissions;现在改为按固定优先级 claude → codex → gemini → opencode → aider → copilot → qwen → kimi → pi,取你的 daemon 上报为已安装的第一个。从未收到过任何探测上报的实例不受影响,仍然是老的默认值。 - 注意这个挑选是实例级的,不是按机器分的 —— 它取的是这个实例所有 daemon(含离线的)上报结果的并集。所以只要实例里还有任意一台机器报过 claude,默认就仍然是 claude,哪怕你正在用的这台机器上没装。单机自建实例才是这条修复真正生效的场景。
v0.131.0 (2026-08-10)
新功能
- 一张卡终于能说清「这是给谁的」 ——
assignee这个字段一直都在,但没有任何地方把它当成一段关系来读,也没有任何地方校验它。现在指派是一等资源:GET /assignments是花名册(每个被指派人 + 他手上最近的卡),PUT /assignments/{task}是幂等指派,DELETE取消。人和 agent 在这里是同一种东西 —— 指派自己的ud,和指派一位同事,写法完全一样。被指派仍然不带来任何可见性:你打不开的卡不会出现在你的花名册里,你去读它照样 404。 ud会指派了,也说得出一张卡是给谁的 ——ud patch task <id> --assignee <名字|uuid>、任务 frontmatter 里的assignee:,以及四条指派命令(ud get/describe/apply/delete assignment,--type human|agent)。整个 CLI 里「怎么称呼一个成员」只有一套规矩 —— 用户名、邮箱、agent 名、uuid 都行 —— 名字有歧义时直接拒绝,不猜。ud describe task打显示名;-o apply打 id,因为那份输出是拿来回灌的,id 才不会日后变歧义。ud send-input session <id> <文本>:把一段文本敲进一个正在跑的会话 —— 后端一直收这条,但 CLI 没有对应的动词,只能手拼 HTTP。文本走位置参数、用单个空格连起来,所以不加引号地敲进去,送出去的就是你看到的那串;单独一个-改从 stdin 读,给 shell 引号会弄坏的多行内容用。ud stop session一行没动 —— 会话上的每个动作各是各的动词,不做--type那种通用命令。
改进
- @ 菜单会把「打不开这张卡的人」标灰 —— 过去在私有卡上,菜单把每位同事都以正常样式列出来,于是你挑一个人、写完评论、按下发送,那一刻才第一次知道这个 @ 会被拒。现在这一行是灰的,副标题写着「需要先共享」,用的是写入端自己的那句话,菜单和 403 不会对同一件事有两种说法。人还是列着的:私有卡上一个同事「消失了」,和这个同事根本不存在,是分不出来的。
- 登录之后落在你上次打开的那张卡上 —— 四个入口(密码、GitHub、Google、个人版)现在收敛到同一个落地页:explorer 停靠在你上一张任务旁边,而不是 AI 对话。它们此前悄悄各走各的。
- 定时备份现在报的是「备份到底成没成」,不是「任务派出去了没」 —— 过去上传一交给后台协程,任务就记成功了,而且没有任何地方去读结果。某个实例上因此连着记了 100 次「成功」,同一时期存储桶已经拒收了六天,有 14 天一个对象都没产生。现在每次运行汇报的是上一次备份真正落定的结果。
- 空状态、引导页和几个次级营销页统一到同一套视觉 —— 色块填充、荧光高亮块、装饰性图标方块、彩色状态文字都去掉了;强调改由分隔线、字重和下划线承担。
- 投递给 agent 的 prompt 不再每条都带那句退订提示 —— 过去每一条消息都要教一遍「怎么退出这个 thread」。能力没变,只是改成教一次,而不是重复到每条。
问题修复
- @ 一个读不到这张卡的人,现在是直接拒绝,而不是把内容送到他面前 —— 过去这个 @ 会把卡标题和整条评论/note 正文塞进对方的通知流,而这张卡对方无论怎么读都是 404。六个入口(评论、回复、评论编辑、note、note 编辑、描述)在 SQLite 和 Postgres 上都复现过。现在拒绝时会指名是谁被拒了、该怎么办(先共享给他所在的群)。agent 不受影响 —— 在自己的私有卡上 @ 自己的
ud照常。 - 通知不再送到读不到这张卡的人手上 —— 把任意一个用户的 id 写进
assignee,就等于给他订阅了这张卡,此后每次更新都会把标题和每个字段的前后 diff 送到他的通知列表里 —— 而这张卡他一读就是 404。卡被转移或取消共享之后,created_by也是同一个漏法。现在订阅者按读取本身用的那同一个条件过滤。 assignee写垃圾值现在被拒绝,不再照单存下 —— 这个字段过去递什么存什么,于是GET /todolist/{id}能显示一个GET /assignments里根本没有对应行的被指派人:同一行数据,两个官方读法,两种答案。这是行为变更,见升级说明。- 在 Quick Note 或任务描述里打
@不会再把编辑器整块弄没 —— 它抛clis is not iterable,把编辑器整棵 React 树卸载掉了。评论框从来不受影响,所以这个问题看起来像是时好时坏。 GET /expense每次返回的顺序一致了 —— 列表是通过 map 拼出来的,而 Go 的 map 遍历顺序是随机的,连着调十次会得到同样十二行的十种排列。两个前端都在本地重排了一遍,把问题盖住了;一旦分页,顺序每次变就会导致某行发两遍或者一次都不发。现在按「钱是什么时候出去的」倒序,顺序是全序。- Obsidian vault 里的符号链接会被跳过,并且明确告诉你 —— 过去会跟着链接走,把 vault 外面的内容建成任务,还把跟踪用的 frontmatter 写进跟踪根目录之外的文件。被跳过的链接会计数,
push和status各打一行点名;没有符号链接的 vault 什么都不打。 ud subscribe/unsubscribe --member认用户名和邮箱了,不再只认 agent 名;--member <uuid>也不再去等(或因此失败于)它根本不需要的那几个成员查询。另外,成员列表拉了一半时,不会再把一个有歧义的名字自信地解析到「碰巧加载成功的那一个」上。
升级说明(自部署)
- 本版没有新增环境变量。
- 本版没有新增数据库迁移。
- 行为变更 ——
assignee写坏值,从 200 变成 400。 两条写路径(POST /todolist/:id带{assignee},以及PUT /assignments/{task})现在都要求这个值是一个 UUID,且能解析到一个存活用户。如果你有脚本往assignee里写占位符、写过期 id、或写非 UUID 的东西,它会开始报错。 写的是真实用户 id 的一律不受影响。 - 行为变更 —— 「能指派给谁」的判据基准换了:看这张卡,不看发起指派的人。 关系路径(
PUT /assignments/{task})要求被指派人是这张卡本来就对他可见的那批人之一:卡的所有者、卡所共享到的那个群的成员、或者卡所有者名下的 agent。旧规则问的是「发起指派的人认不认识他」,而这从来没有证明过被指派人打得开这张卡。跨群指派经关系路径会被挡掉;把私有卡指派给自己的 agent 不受影响 —— 这条规则正是围绕这个场景设计的。字段路径(POST /todolist/:id)有意不做这条成员校验,只做上面那条身份校验,以免打断既有客户端。 - CLI 要和后端一起升。 agent 在会话开始时读到的那份指派口径,是打包在
ud二进制里的 ——ud describe skill从二进制自己那份回答,从不问服务端。只升后端不升ud,agent 读到的还是旧口径;只升ud不升后端,agent 会照着一个现网还不存在的端点去写。
v0.130.0 (2026-08-07)
新功能
- 搜索任务终于会翻 note 正文了 —— 过去搜索只匹配标题,可所有帮助文本(
ud grep task --help、两个内置 skill、API 文档)都写着它同时覆盖描述和 note。只写在 note 里的关键词一个都搜不到,而且返回的是「零结果」不是报错,所以根本看不出哪里不对。现在标题、描述、note 正文三处都匹配。你能看见什么没有变 —— 这只放宽了「什么算命中一张卡」,没有放宽「你能看见哪些卡」。
改进
- 线程回复送到忙碌中的 agent,快了约五倍 —— agent 正在处理上一轮时,发到它线程里的广播要等 30 秒才会再次投递。现在是 6 秒。
- Postgres 实例会为放宽后的搜索建三元组索引 —— 20 万条 note 的库上,note 正文搜索从 658 毫秒降到 7.6 毫秒。数据库角色装不了扩展会怎样,见升级说明。
问题修复
- 停一个会话,不会再把另一个也停掉 —— 同一张卡上开着两个会话时,停其中一个可能把另一个标记成已退出,而它的窗口和 agent 其实还在跑。控制面于是认为这张卡空了,又派了个人上来,两个 agent 同时改同一批文件。现在停止操作会指明真正关掉的是哪个会话。
- 被停掉的会话,它的 agent 是真的被停掉了 —— 过去停止只给终端发信号,而 agent 是我们启动的那个 shell 的子进程,于是它经常继续跑着、没有终端、也没有任何东西能够到它。现在信号发给整个进程组。已知缺口:tmux 包起来的会话,它的 agent 挂在 tmux server 底下,仍然够不到。
- 会话现在记录它跑的那个进程,
ud describe session能看到 —— 在此之前会话和进程之间没有任何关联,这正是「找一个跑飞的 agent 只能靠肉眼比对ps的启动时间然后猜」的原因。 - agent 写的评论显示名字,不再显示成一串 UUID —— 任务详情页和线程视图两处都是。
升级说明(自部署)
- 本版没有新增环境变量。
- 迁移
00071、00072会在启动时执行,SQLite 和 Postgres 两个方言都有。 00071在 Postgres 上建三元组索引,需要pg_trgm扩展。 创建这一步是特意加了保护的:如果你的数据库角色没有CREATE EXTENSION权限,迁移只会打一条 warning 然后继续,搜索结果依然正确,只是会扫 note 表,不会让你的实例起不来。SQLite 没有对应物,直接跳过。- 会话与进程的关联只对新会话生效。
agent_pid对所有已存在的行、以及所有由旧版 daemon 启动的会话都是0—— 只有 daemon 知道 pid,而它没法被问「过去那些」,所以没有回填。也就是说上面那两条停止相关的修复,只对你升级之后启动的会话生效,对升级时已经在跑的会话不生效。升级后请重启 daemon。
v0.129.0 (2026-08-05)
新功能
共享出去的任务,对方终于看得见了
- 把任务共享给一个群,已经登录的人是收不到的:他们的会话里还带着登录那一刻的群列表,于是那张卡就是不出现 —— 不报错,也没得重试,只能等下次重新登录。
- 现在群成员关系的变化会作用到已经打开的会话上。这个修复从 8 月 4 日一直压到今天,这一版是它第一次真的到用户手上。
内置 agent 现在归你自己
- 六个内置 agent 过去是服务端里的常量,所有人共用一份。现在每个人第一次进工作区时,会拿到属于自己的一份。
- 既然是你自己的,你就能改 —— 改掉你那份
ud的 prompt,下一次唤起的会话立刻就用新的。不用发版,也不用重启。
agent 可以是群成员
- agent 现在可以被加进群,而且只有它的主人能加。@ 一个 agent,能触达的是你自己的那份,或者你所在群里的那份。
- 群成员列表现在区分人和 agent,每个 agent 那一行会写明是谁在维护它。
@ 菜单按「人」重做了
- 菜单不再自己猜,而是问服务端谁是真正可触达的;每个 agent 那一行都写明是谁的,并按主人分组。
- 现在只有一个寻址空间 —— 人。agent 也是人。按已废弃的
@session写法留下的链接,会显示成纯文字。
别人的 agent 回帖,你看得见背后是谁
- 别人的 agent 写的评论会记录是谁唤起了它,回帖里会写明这是谁的 agent、正以谁的权限运行。
- 每一条投递给 agent 的消息,现在都带上了「说话的人是谁」。
按邮箱或用户名加群成员
- 群主可以在群组页面上,用准确的邮箱或用户名直接把人加进来。
通知面板分成了两段
- 需要你处理的排在前面,其余的排在后面;每条通知按「它是怎么找到你的」分级。
改进
- 侧边栏的选中态改成给图标上色,不再在背后铺一块底色;点击已展开面板的入口可以收起它。
- 你注册时用的语言,现在会被记下来。 没有语言记录的人,取系统默认值,也就是英文。
- 服务端现在会自报自己支持什么能力,客户端不必再靠版本号去猜 —— 后端若不支持按标识符找人,「添加成员」入口会自己藏起来。
问题修复
- 访问不存在的群,现在返回 404,不再是 500。
- @ 菜单的条数上限现在是跨所有候选类型统一算的,不再每类各算一遍,一个类别塞满不会再把其他类别挤没。
- 成员关系指向的用户已经不存在时,不再把它显示成成员。 这类条目过去就是列表里那些空名字的行,现在不再出现。详见下面的升级说明。
- IM 里「这不是你的机器人」的回复,现在会告诉你怎么自己修(
/link relink),不再只是拒绝。
升级说明(自部署)
-
本版没有新增环境变量。
-
群成员关系一变,相关账号已签发的 token 会立即失效一次。 网页端会自动刷新并重放,浏览的人不会察觉;
udCLI 与 agent 会话会收到一次401 AUTH_REQUIRED,命令会失败 —— 重跑一次即可。 这条对「做这个改动的人」和「被加进来的人」同样成立。 -
数据库迁移
00066–00070会在启动时执行。 其中两条不能干净地回退:- 只要有人删过 agent 又建了同名的新 agent,
00070就会拒绝回滚。 它会报错中止而不是丢掉数据,所以不会静默丢行 —— 但必须先由人决定那些软删的行怎么处理,回滚才能继续。 00068会把六个内置 agent 作为真实数据行写进库里。 把代码回滚回去,这些行不会被带走。
- 只要有人删过 agent 又建了同名的新 agent,
-
内置 agent 不再在服务端启动时创建,改成每个人第一次打开自己的工作区时创建。所以一个全新的自部署实例,在第一个用户进来之前,库里一行内置 agent 都没有 —— 这是预期行为,不是迁移失败。
-
升级后,部分群的成员列表会变短。 指向已不存在用户的成员关系不再被列出。在我们自己的实例上,这让 38 个群里共 92 条记录消失,它们本来就全部显示为空名字,没有任何一个有名字的人或 agent 受影响。你的实例数字可能不同 —— 升级前跑
SELECT COUNT(*) FROM user_groups ug LEFT JOIN users u ON u.id = ug.user_id WHERE u.id IS NULL OR u.is_deleted = 1就是那个数。
v0.128.0 (2026-08-03)
新功能
叫 Alfred 现在只要 Ctrl+A
- 快捷输入的唤起键从
Cmd+/换成了Ctrl+A,单手可达。只在文本输入框之外生效,输入框里的全选不受影响。 - Meet Alfred 引导也改教这个键了。
更大、更稳的 Alfred 面板
- 唤起不再闪空白帧:预热好的对话记录立刻显示,后台静默刷新;深色模式下打开也不再白闪。
- 面板尺寸加大 —— 网页对话框 760px,桌面面板 840×560 —— 对话记录撑满窗口。
- 桌面面板可拖动、可调大小,调过的位置和尺寸会记住。
ud pull 在新目录默认用 vault 布局
- 对空目录第一次
ud pull,现在初始化的是 vault 布局 —— 一个.md就是一个任务,笔记在notes/下,附带.udignore—— 和ud init一致。 - 旧的一任务一文件夹布局仍可用
ud pull --layout ud;已有目录保持原布局不变。
改进
Daemon 重连不再死锁
- 网络抖动后,重连的 daemon 可能被一条僵尸流回一句「已连接」,然后两边互相信了对方 —— daemon 永久离线,只能手动强制。
- 现在服务端永远让最新的连接接管,桌面客户端也不再轻信「已连接」:退避重试,第二次被拒就直接强制接入。
Daemon 重启会清掉自己的「鬼会话」
- daemon 注册时顺手把本机确定已死的会话(挂在离线/心跳过期 daemon 下的活跃记录)收敛为 lost,不再有一直显示「运行中」的幽灵会话。
问题修复
- IM 机器人不再一边正常收发、一边卡在「连接中…」。 身份解析和状态记录之间的竞态会把健康机器人的状态永久盖掉,重启和重贴 token 都复现;已修。
- 高级查询里的 Ask AI 挂了会明说「AI provider 不可用」,不再是一句「发生未知错误」。
- 评论引用高亮回来了 —— 在隐藏/延迟渲染的容器里(移动端布局、长页面)不再丢失。
- 中文/日文输入:选字的回车不再触发发送。 Alfred 快捷输入、提及/斜杠菜单、行内重命名和快速创建,全部加了 IME 合成态判断。
升级说明(自部署)
- 本版没有新环境变量,也没有数据库迁移。
- 桌面 app 需要手动升级,daemon 重连修复才完整生效。 修复的一半在桌面端(重连客户端);后端升级后,旧桌面也能受益于服务端的接管逻辑,但完整修复(退避 + 自动强制)需要新桌面版。
v0.127.0 (2026-08-01)
新功能
随时随地叫 Alfred
- 网页版按
Cmd+/,一个快捷输入框直接盖在你手头的页面上:打字、发送,消息就进了你和 Alfred 的对话,不用切走。 - 桌面版有了全局快捷键 —— 默认
Cmd/Ctrl+Shift+Space,app 在后台也能一键唤出常驻的 Alfred 快捷面板。面板是提前建好藏着的,不是按下才现建,所以你按下的那一瞬间输入框就在。Esc、点别处、再按一次快捷键都能收起。 - 快捷键在个人资料页可改。如果默认键被别的 app 占了,注册会沿候选链(
Control+Alt+Space、Cmd/Ctrl+Shift+A)往下试,设置页会告诉你最终生效的是哪个。 - 面板藏着的时候 Alfred 回话,你会收到系统通知,点通知面板就出来。面板正在屏幕上时不发通知 —— 给你正在看的东西发通知只是噪音。
Thread 有门了 —— 参与者可以退出
- thread 头下方新增订阅栏,列出这场对话里的所有人:发过言的成员加上绑定的 agent 会话,已退出的置灰标注。
- 可以直接在栏上把一个 agent 从 thread 里退订(或拉回来)—— 适合话题已经走远、却还在不停吵醒一个早就完事的 agent 的场景。动别人的订阅需要任务的写权限。
- Agent 也学会了自己退场:干完自己那部分的 agent 现在可以主动离开 thread,不再被后续每条回复拖着走。再次提及它就能把它拉回来。
- CLI:
ud unsubscribe comment <id>/ud subscribe comment <id>(加--member替 agent 操作)。
派发时指定 agent 跑在哪个 CLI 上
- 在提及 agent 的同时提及一个 CLI ——
@my-agent @codex 去做 X—— 为这条消息新起的会话就跑在选中的 CLI 上。只管这一个会话:agent 本身的配置不动,已经在跑的会话也不换;请求原文里仍然带着那个@codex,所以 agent 能自己回答「跑着的会话换不了 CLI」。
改进
Daemon 重启不再丢身份
- daemon 关闭时标记为离线而不是删除注册,重启回来还是同一个 daemon —— 不再产生一堆孤儿重复条目让 mention 派错地方。
- 关闭时健康端口和 PID 文件要等全部收尾完成才释放,堵上了快速重启时「端口空了但旧进程还活着」的竞态。
- Agent 会话启动失败时,失败原因会被保留展示,不再被后续状态覆盖 —— 一个静默空转的会话现在会告诉你为什么。
问题修复
- Agent 配置的读取现在限定在属主范围内。 此前一个账号可能读到别人的 agent 配置;现在读取以请求者本人为界。(安全修复)
- 删除了会花错人 API key 的 AI provider 测试路由。 测试一个 provider 可能计费到不属于测试者的 key 上;这些路由已移除。(安全修复)
- CLI 不再因孤儿管道无限等待。 读取版本号、解析 agent 时的等待加了上限,不再挂死。
升级说明(自部署)
- 一条迁移(
00065)在新镜像启动时执行。 给会话-thread 绑定表加muted_at列 —— thread 退订的存储。与此前版本相同的启动迁移机制。
v0.126.0 (2026-07-31)
新功能
公开分享链接可以收件了
- 创建分享链接时可以勾上允许上传。拿到链接的人不用注册、不用登录,就能往链接背后的任务里放一个文件,外加一行可选的留言。
- 「能读」和「能放」是两个独立开关:一个链接可以只收不发。这是更安全的配置,也是大多数人说「让他们把文件发给我」时真正想要的那一个。
- 访客看不到别的访客放了什么。投件在公开的附件列表和公开的下载接口里都被挡掉,只有任务主人能看见。
- 每个链接单独限额 20 个文件、100 MB,叠在你自己的存储配额之上;投件接口按「访客 + 链接」分别限流。
- 实例主人有总开关:「管理 > 系统配置」里的
feature.public_share.upload_enabled,默认关闭,改完不用重启。它和feature.public_share.enabled是分开的 —— 所以你可以继续用只读分享,同时拒绝匿名写入。
管理员可以直接重置用户密码
- 「管理 > 用户」新增重置密码操作,给该账号设一个新密码,立即生效 —— 用于有人被锁在门外、而实例又没配邮件的场景。
改进
首次设置:那声招呼由你自己打
- 「认识 Alfred」这一步过去是替你把招呼发出去的。现在它给你一个真正的评论框,用的是 app 里其他地方一样的
@提及补全,你按下发送,握手才开始。纯文本的@alfred谁也叫不到,所以在消息里带上真正的提及链接之前,发送按钮是禁用的。 - 第一次和机器对话结束时,agent 会主动把聊到的内容写进一条 note 并展示给你 —— 不用你开口要。
问题修复
公开端点加上限流,并且先把代理后面的客户端 IP 弄可信
GET /share/code/:code此前完全没有限流,当前有效的 6 位分享码空间可以被以线速扫描 —— 扫中一个就能读到别人分享的任务、笔记,以及(链接允许时)附件。现在按客户端限流 20 次/分钟。登录(10 次/分钟)和注册(5 次/分钟)也一起限了:宽到重打一次密码不会被拦,紧到撞库不再免费。被限的请求返回429并带Retry-After。- 限流的键是真实客户端 IP。此前服务端会无条件相信调用方自己写的
X-Forwarded-For,那样一来每个请求伪造一个头就能换一份新额度,限流就成了摆设。现在由UD_TRUSTED_PROXIES决定哪些代理有资格设这个头,默认是私有网段和回环地址。如果你的实例挡在公网 IP 的 CDN 或平台边缘后面,请把这个变量设上 —— 见升级说明;用默认值时这些限流在那种拓扑下不生效。
登录页在压根连不上服务器时,不再拿注册策略搪塞你
- 服务器地址少写了
/api/v1后缀时,页面会显示「该实例已关闭注册」并把「服务器设置」折叠起来 —— 对一个它从未连上过的实例,给出一个笃定的结论。现在连不上就说连不上,「服务器设置」会自动展开、把你要改的那个输入框摆到面前,而「已关闭注册」这句话在服务器真的回话之前不会出现。 - 服务器地址输入框可以清空了(以前一清就弹回当前值),占位符给出了包含
/api/v1的正确形状,提示只在地址确实写错时才出现。
升级说明(自部署)
- 匿名投件在你打开它之前是关的。
feature.public_share.upload_enabled默认关闭,所以升级不会让你现有的任何链接变成可写 —— 本次发布之前创建的链接,这项权限都是关的。要用就去「管理 > 系统配置」打开,不需要重启。 - 新增环境变量
UD_TRUSTED_PROXIES—— 如果你的实例前面挡着任何公网入口,这条必读。 不设表示「信任私有网段和回环地址」,当反向代理和实例在同一台机器或同一个 Docker 网络里(nginx、all-in-one 镜像)是对的,裸机也是对的。但挡在前面的是公网 IP 上的 CDN 或平台边缘时就不够了 —— 比如 Cloudflare,或者*.onrender.com(它本身由 Cloudflare 兜着)。那种情况下服务端会把边缘节点当成不可信的对端,于是限流的键取的是边缘节点的地址而不是访客的地址,而这个地址每个请求都在换:限流因此不再生效,日志里也看不到真实客户端 IP。请把你的代理网段显式写上(UD_TRUSTED_PROXIES=173.245.48.0/20,103.21.244.0/22,...),或者用*信任任意代理(gin 的老行为,可被伪造,但在只有单层可信边缘时能把真实客户端 IP 取回来);none表示谁都不信。 - 两条迁移(
00063、00064)在新镜像启动时执行。 分别是给分享链接加上投件权限字段,以及记录投件的表。
v0.125.0 (2026-07-30)
新功能
REGISTRATION_ENABLED —— 决定陌生人能不能在你的实例上建账号
- 新增一个实例级开关(环境变量
REGISTRATION_ENABLED,命令行--registration-enabled)。默认是关的:一个新实例上,除了主人谁也进不来。 - 关闭时,三条自助建号入口一起关掉 —— 邀请码注册接口、通过 GitHub/Google 首次登录建号、以及访客按钮 —— 一律回
403 AUTH_REGISTRATION_DISABLED。登录页会把注册入口和访客按钮藏掉,不会摆着一颗点进去没有结果的按钮。 - 你作为实例主人建的账号不受影响:「管理 > 用户」和以前完全一样。
- 想让别人也用你这个实例,把
REGISTRATION_ENABLED=true设上并重启即可。启动横幅会打一行Signup:,告诉你注册当前是开还是关,以及是哪个环境变量或命令行参数决定的。 - 公开端点
GET /auth/tier-info新增registration_enabled字段,登录页在任何人登录之前就能知道答案。
改进
配置值按严格口径读取,并且启动时把读到的东西说清
- 所有布尔和数值配置接受更宽的写法:
true/false、1/0、yes/no、on/off、enabled/disabled,并会去掉首尾空格。 - 读不懂的值会让启动停下,并报出:是哪个变量、拿到的值是什么、可接受的写法有哪些、以及怎么回到默认值。一次启动报出全部问题,所以一份写错了几处的 compose 文件是改一次,而不是每个错一次重启。
- 设了但为空的变量(compose 里的
- FOO=)会使用默认值,现在会在日志里以 WARNING 明确说出来。 - 启动横幅对调度器和注册这两项,不只报值、还报这个值是从哪来的 ——
enabled (env CRON_ENABLED)、closed (default)。调度器在跑的时候还会报出这个数据库里有多少条已启用的定时任务 —— 这是你判断「一份从备份恢复出来的副本正要以那个实例的身份开始干活」的依据。
「管理 > 系统配置」里的启动类配置改为只读展示真实运行值
- 四个调度器配置 ——
CRON_ENABLED、VISITOR_CLEANUP_ENABLED、VISITOR_CLEANUP_SCHEDULE、VISITOR_RETENTION_DAYS—— 是在进程启动那一刻定下来的。管理页面现在把它们改为只读,展示当前真正生效的值,以及设定它的环境变量或命令行参数。要改就在它们归属的地方改:设环境变量或参数,然后重启。 - 其他启动类配置同理,包括 JWT secret、telemetry 和 license。
桌面版会遵循你自己设的 CRON_ENABLED
- 桌面版的调度器默认仍然是开的。但你如果显式设了
CRON_ENABLED,现在这个值会被采纳 —— 当你把桌面版指向一个不是它自己创建的数据库时,你要的就是这个行为。
升级说明(自部署)
- 如果你的实例依赖开放注册,现在必须显式声明。
REGISTRATION_ENABLED默认是关,所以升级之后,一个原本接受公开注册的实例会开始拒绝注册 —— 包括 GitHub/Google 首次登录建号和访客按钮 —— 直到你设上REGISTRATION_ENABLED=true并重启。注册本身没有别的变化:开关打开后,流程与升级前完全一致。 - 读不懂的配置值现在会让启动失败,而不再回落到默认值。 如果你的环境变量或 compose 文件里有布尔/数值配置写错了(
CRON_ENABLED=flase、MAX_FILE_SIZE=10MB),容器会拒绝启动并点名这个变量。拉取新镜像之前值得先看一眼你的 env;报错信息会列出可接受的写法和怎么回到默认值。 - 一条迁移(
00062)在新镜像启动时自动执行。 它会清掉那四个现已改为只读的调度器配置的存储值。真正生效的值来自你的环境变量和命令行参数,不受这条迁移影响。
v0.124.0 (2026-07-29)
新功能
首次设置从五步收敛成三步
- 选语言 / 让这台机器能干活 / 认识 Alfred。原来单独的「授权钩子」整步去掉,Telegram 并入最后一步。
- 每一步的「下一步」先检查再放行:没做完不翻页,原地说清还缺什么,按钮变成「仍然跳过」,再点一次才走。
- 一步里的事都做完了,它就完全不打扰你。
第二步会替你把这台机器装好
- 装 ud CLI、注册守护进程。两样齐了按钮才亮,你点它才在专属欢迎卡上开一个裸 workspace 会话。
- 网页端同样是三步,第二步换成讲清桌面版能多做什么、以及下载入口。
钩子改为每次开会话时安装与自愈,并且要先得到你的同意
- 同意默认是关的。没打开之前不会往你的 agent CLI 配置里写任何东西,这个开关随时可以在「个人资料」里开关。
- 打开后,每次会话开始都会把该装的装上、该升的升级。装不上也不挡你的会话。
- 桌面版的钩子安装全部改由 ud CLI 执行,并会清掉旧安装器留下的注册项。
ud hooks status --json可以查当前装了什么。
codex 成为第二个支持工作区钩子的 agent CLI
- 继 Claude Code 之后,codex 也能通过工作区钩子实时上报会话状态。
新增 Kimi Code 作为第八个内置 agent CLI
- 该集成依据 Moonshot 公开文档写成,尚未对真实 CLI 实测。请当作待验证项,而非已支持能力。
问题修复
Markdown 编辑器不会再改写你的文件
- 此前在可视模式下保存会重写整篇文档:裸 HTML 块被整段删掉、脚注被压成畸形链接、纯文本丢掉结尾换行。
- 外部
.md现在默认以源码模式打开。切到可视模式前会先做一次往返比对,并明确告诉你哪些语法会被改写。 - 文件一打开就被标记为「未保存」的问题已修复。
- 关闭窗口时若有未保存内容,现在会先问你。
- 在独立编辑器窗口里点
task://链接,不会再把窗口顶到一个并不存在的后端上,也不会丢失未保存内容。
首次设置不会再卡在最后一步
- 此前机器握手超时后,状态会永久停在 pending,导致 Finish 按钮一直灰着,只能走「跳过」。
升级说明(自部署)
- 无需手动操作。本版没有新增环境变量或系统开关;一条种子迁移(把 Kimi Code 加进内置 agent CLI 列表)在新镜像启动时自动执行。
- 钩子同意对所有用户(含老用户)都从「关」开始。如果你此前依赖桌面版在首次设置里装状态钩子,请到「个人资料」里把它打开,或在下次开会话时按提示同意。
v0.123.0 (2026-07-29)
新功能
Alfred 的聊天记录每天开一根新线
- 以前所有对话都往同一根评论线里追加,第一根三天就攒到近千楼,打开慢,也没法快速翻。
- 现在按你所在时区,每到新的一天自动开一根新线;前一天那根就地收起,原位仍可回查。
Alfred 会自己打扫记忆
- 两条例行任务 —— 每小时一次的整理和每晚一次的归档 —— 会在 Alfred 第一次为你开会话时出现在你的定时任务里。
- 它们就是普通的定时任务:可以改、可以停、可以删。删掉的例行任务不会再长回来。
- 如果你本来就自己安排了唤醒 Alfred 的定时任务,则一条都不新增 —— 你的安排保持原样。
ud describe wctx 重新变得能读了
- 笔记改为摘要显示,不再整篇打印;评论线以索引形式列出。
- 历史很长的任务不会再刷满整个终端。
改进
macOS:打开应用不再出现「无法验证开发者」提示
- 现在
.dmg本身也做了签名、公证和装订。此前只有里面的 app 做了,所以新下载的磁盘映像仍会触发 Gatekeeper 警告。装订后会重算自动更新校验值,升级不受影响。
物品页改版 —— 宽屏布局,与 iOS 端同一套水墨语言。
登录页改版,与应用其余部分统一。
问题修复
- 会在本地存东西的 HTML 附件(bento 演示稿、小型独立网页应用)在浏览器里不再报 "The operation is insecure" 打不开 —— 预览现在自带一份内存版存储。
- CLI 守护进程写入的待发提示词时间戳改为状态钩子能读的格式,装了钩子才真的会上报。
- CLI 守护进程会先确认提示词已送达再提交,修复偶发的提示词被静默丢弃。
升级说明(自部署)
- 无需手动操作。 本版没有新增环境变量,也没有新增系统开关。
- 新镜像启动时会自动执行一条加列迁移:在
im_conversations上记录当前聊天线是哪一天开的。存量会话该列为空是设计如此 —— 未知的日期永远不等于今天,所以下一条消息自然就会开出当天的新线。
v0.122.0 (2026-07-28)
重要修复
走完首次引导后刷新页面导致整个应用白屏
- 完成或跳过首次使用引导之后,再刷新页面,所有页面都会打不开 —— 应用外壳本身渲染失败。
- 所有走过引导的用户都会遇到。建议所有用户升级。
新功能
首次引导:与 Alfred 真正握手
- 引导会在你的机器上开一个会话,并等 Alfred 真的回话之后才让你继续;等待、已回复、超时三种状态都看得见,不再是无声卡住。
- 进度按环节记录,重新打开引导会接着上次的位置继续。
- 弹窗尺寸固定,内容在窗口内滚动。
每个代理可单独指定 CLI 与模型参数
- 每个代理可以选择用哪个代理 CLI(Claude Code、Codex、Gemini 等)。
- 可按代理追加额外参数,例如
--model opus。
代理 CLI 可用性一目了然
- 桌面端会探测本机装了哪些代理 CLI 并上报。
- Web 端直接显示可用状态与版本号;没装的给出安装命令。
会话终端输出在会话结束后仍可查看
- 会话末尾的终端输出会保留下来,会话死掉之后依然能回看当时发生了什么。
联系页加入 Telegram 群入口
- 联系页新增 Telegram 群入口;文档站的联系页也照主页风格重写。
Alfred 承担秘书职责
- 待办、日程、提醒纳入 Alfred 的日常职责。
- 派工时要求先收到确认回执,并在评判会话状态前先读终端。
问题修复
- 物品照片一直加载不出来(照片地址恒为空),现在能正常显示了。
- 代理的「恢复默认」现在会一并清掉额外的 CLI 参数。
- 首次引导不再停在「Starting a session on this machine…」不动;握手超时的提示文案也不再和事实相反。
- 首次引导偶发不投递提示词、导致 Alfred 永不回复的问题已修复。
- 现在可以对
lost状态的会话执行 stop,回收残留进程。 - 修复 CLI 守护进程「注册心跳全绿但 SSE 连接 401」的问题。
升级说明(自部署)
- 无需手动操作。本版没有新增环境变量或系统开关;两个数据库变更(均为带默认值的加列与建表)在新镜像启动时自动执行。
v0.121.0 (2026-07-27)
新功能
自带 Telegram bot,人人可用
- 每位用户在「个人资料 → 消息渠道」接入自己的 bot:用 @BotFather 创建、粘贴 token、给 bot 发消息即完成绑定。
- 你的 bot 只认你:其他 Telegram 账号发来的消息一律拒答,绑定码也只有 bot 所有者本人能核销。
- 多用户消息通道随本版开放,不再只限实例所有者。
「我的 Alfred」卡片
- 个人资料新增 Alfred 状态卡片,首次使用引导也加入了 Telegram 绑定步骤。
优先用你自己的守护进程
- 派发会话时优先选择你本人注册的 daemon,其次才是共享的。
- daemon 离线时会直接回执告诉你如何把它拉起来,而不是石沉大海。
桌面端:代理 CLI 缺失检测与安装引导
- 未安装 Claude Code 等代理 CLI 时,终端内直接给出安装引导。
- 新增僵尸会话看门狗,自动终止并上报无输出的代理会话。
桌面端:可配置后端数据目录
- 数据可放到自选目录(例如同步盘),数据库改用单文件日志模式保证同步安全。
CLI:ud stop session 一等动词
- 另有
ud describe session --tail N查看会话尾部输出;会话列表新增 LAST-SEEN 列,daemon 在线判定更准确。
问题修复
- 修复 Intel Mac 桌面端无法启动代理会话的问题(posix_spawnp 报错)。
- 编辑内置代理的系统字段现在会明确报错并说明是哪个字段,而不是静默丢弃。
- 管理后台的系统配置现在可以清空为空值。
升级说明(自部署)
- 实例级
TELEGRAM_BOT_TOKEN已移除,改为每人自带 bot。运维方需设置UD_ENCRYPTION_KEY用于加密存储的 bot token。更正(2026-07-27):已有 token 并不会自动迁移 —— 本条最初写的是会自动迁移。正确做法是:先保存好 token,设置密钥,升级,在「设置 → 即时通讯」手动重新登记,然后再重启一次,让已有会话重新归属。在最后这次重启完成之前,通道看上去是正常的,但发往旧会话的回复会被静默丢弃。完整步骤见从旧版共享 bot 升级。 - 新增多用户消息开关
im.multi_user_enabled(系统配置,默认关闭);打开后实例内所有用户都可绑定使用自己的 bot。
v0.120.0 (2026-07-25)
新功能
认识 Alfred——每个工作区自带的管家代理
- 每个工作区现在都有一位管家 Alfred:他会把活派给合适的代理并跟进进度、记住你的偏好、随手记下你丢给他的笔记。
- 在任意评论中提及
@alfred即可与他对话。他支持定时唤醒(例如每天早上的简报),守护进程重连后也能继续工作。
在 Telegram 里和 Alfred 聊天
- 新增 Telegram 消息渠道:在「个人资料 → 消息渠道」生成一次性验证码,向机器人发送
/link 验证码完成绑定,就能在手机上和 Alfred 对话。 - 代理的回复会同步回 Telegram,在应用里开始的对话可以直接在聊天中继续。
- 自部署可通过
TELEGRAM_BOT_TOKEN环境变量开启,详见配置参考文档。- 自 v0.121.0 起:已由「每人自带 bot」取代。不再有全实例的 bot token——每位用户在「设置 → 即时通讯」连接自己的 bot,运维方改为设置
UD_ENCRYPTION_KEY;升级时已有的 token 需要手动重新登记,见升级步骤。
- 自 v0.121.0 起:已由「每人自带 bot」取代。不再有全实例的 bot token——每位用户在「设置 → 即时通讯」连接自己的 bot,运维方改为设置
全新的首次使用引导
- 4 步向导依次带你完成:选择语言、了解工作区状态、把这台机器注册为守护进程、认识 Alfred 并可选绑定 Telegram。
- 守护进程注册在桌面端一键完成(并会自动识别已安装的 Claude Code、Codex 等代理 CLI),浏览器端则提供分步命令。每一步都可以跳过。
改进
- 个人资料新增「消息渠道」区块,用于管理 IM 绑定(生成验证码、查看绑定列表、解绑),并会提示服务器是否已配置机器人。
- 会话标签页改用 Inbox 图标,与 iOS 端保持一致。
- 下载链接改为指向 oatnil.com/download,/subscribe 页面已下线。
问题修复
- 修复零看板的新账号在看板页触发的请求风暴。
- 管理后台的系统配置现在会显示财务分类(基础货币与汇率)。
v0.119.0 (2026-07-25)
新功能
无需 Docker 的私有部署——npm 裸机安装
npm install -g @oatnil/ud-server @oatnil/ud即可获得完整的 udctl:server 二进制自带 Web UI。- 一条命令启动完整站点:
ud-server -host-domain http://localhost:8080 -data-path ./data,浏览器直接登录,全程无需 Docker。
自部署服务器的清晰启动横幅
- 服务器启动时会打印就绪横幅,包含登录地址和初始账号凭据,首次部署不再需要翻日志。
- 配置错误(如 Pro/Max 档缺少
ADMIN_EMAIL)会在启动时以醒目横幅报错并停止,而不是带病运行。
CLI 管理资产(possession)
- 新增
udpossession 命令:get/describe/apply/delete,以及acquire、dispose、share。
改进
- 所有 Docker 镜像(all-in-one 与前后端分离版)现同时发布 arm64 与 amd64——Apple Silicon 和 ARM 服务器可原生拉取。
问题修复
- 支出/收入时间戳改为按 UTC 瞬时存储,修复跨时区可能差一天的问题。
- 小票识别现在会拒绝非小票图片,并读取票面打印日期而不是默认当天。
- 处理中被中断的 AI 任务现在会标记为失败,不再静默丢失。
- 首页"接入你的 Agent"流程现在复制正确的 GitHub raw 链接。
升级说明(自部署)
- Personal 档:账号密码现在由
PERSONAL_TIER_PASSWORD环境变量控制,应用内改密已禁用——以保证桌面端 Start 自动登录一致。如需改密,修改该环境变量即可。
v0.118.1 (2026-07-23)
改进
代理现在知道是谁在跟它说话
- 当代理被提及、会话消息或广播触发时,触发提示语中现在会写明发送者的名字(显示为
User @名字/Agent @名字)。 - 代理的回复能对准正确的人,而不再是笼统的"某个用户",多代理协作和提及对话中"谁说了什么"更清晰。
v0.118.0 (2026-07-23)
新功能
从支出直接创建物品
- 支出详情页新增"创建物品"操作。
- 用这笔支出的信息预填物品表单,一步把一次消费变成一件可追踪的物品。
- 原支出不会被修改 —— 系统新建一条物品记录并回链到它。
首页新增"让你的 AI 代理接入 udctl"按钮
- 点一下复制一行指令,粘贴给任意 AI 代理即可。
- 代理会自己读取接入说明,装好 CLI 并连上你的工作空间。
ud describe skill <名称> -o content
- 只输出技能正文,不带元信息头。
- 可以直接重定向成
SKILL.md文件,或用管道喂给代理。
改进
代理会话能自行找回身份
- 首次提及的初始化消息偶尔会送不到,会话就一直没有自己的身份设定。
- 现在后续的每次提及和回复都会提示会话去加载自己的代理设置。
问题修复
技能页的复制按钮给的是已废弃命令
- 复制出来的
ud prompt <名称>早已从 CLI 移除,粘贴执行会直接报错。 - 现在所有复制命令和应用内文档都指向
ud describe skill。
网页版一直停在旧版本
- 自 0.117.1 起前端构建因内存不足持续失败,导致 ud.oatnil.com 始终是 0.117.0 的包。
- 已修复,网页版恢复正常更新。
v0.117.1 (2026-07-21)
问题修复
物品日期在非 UTC 时区被记错一天
- 购入与处置日期此前会被存成前一天(UTC 以东)或后一天(UTC 以西)。
- 这会导致持有天数与每日成本算错 —— 东八区看到的每日成本约为真实值的一半,且不易察觉,因为减半后的数字看起来仍然合理。
- 现在你选的日期会被原样记录。
升级说明
- 本次修复前创建的物品记录,仍保留当时存下的日期,系统不会自动重算持有天数。如果某件物品的每日成本看起来不对,重新选择一次它的购入日期即可修正。
v0.117.0 (2026-07-21)
新功能
物品 — 记录你拥有的东西,以及每天为此付出的成本
- 全新的物品模块:记录购入价格与时间,实时查看持有该物品的每日成本。
- 完整生命周期:心愿 -> 使用中 -> 退役 / 售出 / 遗失。成本按读取时间推导,无需任何记账操作,数字始终是最新的。
- 以「售出」方式处置物品时,可直接把所得记入收入。
- 超过预期寿命会显示「目标已达成」,不是超支警告 —— 用得比计划久是好事。
- 物品已接入资源管理器目录树,并加入侧边栏的财务分组。
- 每日成本小到两位小数无法显示时,会改为给出月度金额,而不是显示「0.00/天」。
多币种账户
- 账户总额按币种精确列出,不同币种的余额不再被相加成一个没有意义的数字。
- 可选择把全部资产折算到你指定的某一种展示币种,使用系统设置中配置的汇率。
- 仪表盘、趋势图和账户列表只有在单一数字确实成立时才显示合计,否则改为按币种分项展示。
- 折算无法覆盖全部资产时,会明确指出被排除的币种,而不是悄悄少算。
- 创建账户时币种通过下拉选择,不再手工输入。
改进
- 收入模块补全:独立列表页、路由与汇总。
- 汇总与现金流数据全面支持多币种。
- 有汇率时,币种明细按实际价值排序,而不是按原始金额排序。
- 无法折算时的提示更明确,会指出具体是哪种币种缺少汇率,而非一句笼统提示。
- 精简了即时生效操作上多余的成功提示。
问题修复
- 以群组方式共享的预算,其中的支出现在对群组成员可见。此前只有按用户共享生效,成员能看到预算却看不到里面的任何支出。
- 修复群组共享场景下支出与收入的权限校验缺口。
- 以 0 余额创建账户可正常完成。此前会被判为「格式无效」,而把已有账户改成 0 却能成功。
- 小到无法存储的金额会被拒绝,不再被静默保存为 0。
- 折算总额中的预算内与预算外两部分,现在与总额一致。
- 有价值但不足 0.01 的持仓显示为「< 0.01」,不再显示 0。
- 请求中格式错误的币种代码会被拒绝,而不是被忽略。
升级说明
- 创建账户时的币种现在限制为有效的 ISO-4217 代码。已有账户不受影响,无需迁移。自建部署中使用积分、代币或本地凭证作为账户币种的用户,将无法再用自定义代码创建账户。
- 折算到单一币种依赖系统设置中的汇率,属于 Pro 功能。个人版仍可获得精确的分币种明细。
v0.116.0 (2026-07-20)
新功能
- 表格支持电子表格式粘贴 —— 可以把 Google Sheets、Excel 或 CSV 的多单元格数据直接粘贴到任意单元格:行列从所选单元格开始展开,多行内容也能正确解析。
- 全页对话视图 —— 在专门的页面中浏览所有评论线程:左侧为线程列表,右侧为对话详情。
- 对话弹出独立窗口 —— 通过新的弹出图标,把任意对话线程在独立窗口中打开。
体验优化
- 终端缩放控件 —— 工作区终端的缩放控件改为半透明浮动悬浮层,把整个窗格留给输出内容。
- 只读终端铺满窗格 —— 只读终端现在会按比例铺满窗格,并跟随外部终端的尺寸变化。
- 对话筛选条自动换行 —— 筛选标签会换行显示,不再隐藏在横向滚动中。
- 对话打开更快 —— 展开对话时自动打开第一个线程,并预加载后续线程。
问题修复
- 表格编辑 —— 直接输入编辑单元格不再丢失第一个字符;剪切或删除选区现在是单次撤销操作;CSV 分隔符检测和 Markdown 转义更加健壮。
- AI 聊天布局 —— 过长的消息内容不再横向溢出聊天面板。
- 资源删除 —— 删除已上传的文件时,会从你配置的存储服务中真正删除文件。
v0.115.0 (2026-07-18)
新功能
- 零配置敏捷冲刺(Sprint) —— 看板现已支持 Scrum 风格的冲刺,无需任何设置:在新的 Backlog 页面创建第一个冲刺,看板会自动启用冲刺相关功能。
- Backlog 待办池页面 —— 在专门的待办池中规划工作:按冲刺分区展示,拖拽任务加入冲刺,并支持就地快速创建任务。
- 看板冲刺范围栏 —— 看板顶部新增冲刺范围栏,一键将视图聚焦到当前活跃冲刺。
- 报表:燃尽图与速率图 —— 新的 Reports 标签页展示冲刺燃尽图和团队速率,数据来自每日自动快照。
- 冲刺仪式 —— 开始冲刺时可用日期预设快速设定周期;完成冲刺时的结算对话框会把未完成任务顺延到下一个冲刺,并生成逐项的回顾小结。
- 风险提醒与 WIP 超限警告 —— 列内任务超过 WIP 上限时看板会给出警告,有风险的冲刺任务会自动收到风险提醒评论。
- Jira 风格视图标签 —— 看板各页面统一为 Board / Backlog / Gantt 命名视图标签,共享页头并在所有页面提供看板切换器。
- 任务敏捷字段 —— 任务新增内置敏捷字段(如所属冲刺),可在任务详情中直接编辑,也可在看板查询中使用。
- CLI 冲刺管理 ——
ud sprint close可在终端完成冲刺结算与顺延;ud patch task --set支持修改任务元数据(含 JSON 数组/对象);并内置了 agile 技能与 cook 配方。
体验优化
- 更紧凑的看板布局 —— 标签页内联到页头,冲刺范围并入筛选栏,甘特图页头统一为单行,给任务留出更多空间。
- 创建任务支持灵活日期格式 —— 创建任务时(API 与 CLI)可使用更宽松的日期写法。
- 冲刺标题可点击 —— 冲刺分区标题直接链接到冲刺任务详情,可在那里编辑起止日期。
问题修复
- 定向的 Agent 回复不再广播 —— 指定会话的回复不会再发送到其他绑定的会话。
- Agent 启动失败会回报到线程 —— Agent 会话初始化失败时,错误信息会回复到触发它的评论线程中。
- 自定义字段类型正确显示 —— 字段类型与选项来源现在显示正确的名称。
- 报表与待办池按看板正确过滤 —— Backlog、冲刺列表与进度查询遵循看板范围,切换看板时报表会重置所选冲刺。
v0.114.0 (2026-07-18)
新功能
- CLI 同步支持 Obsidian 风格的 Vault 布局 ——
ud init现在默认创建 Vault 布局:任务以普通 Markdown 文件呈现,笔记会以可见的notes/文件夹落地,整个目录可以直接作为 Obsidian 仓库使用。 - Wikilink 双向转换 —— Vault 文件中的
[[wikilink]]在 push 时会转换为 ud 任务链接,pull 时再转换回来,两边的链接都始终可用。 - 文件名支持空格与特殊字符 —— 同步路径现在允许空格和绝大多数特殊字符,仅拒绝文件系统本身禁止的字符。
- 拉取时下载附件 ——
ud pull --fetch-attachments会把任务附件一并下载到你的 Vault 中。 - 一键迁移现有目录 ——
ud migrate-layout可将现有的 ud 布局目录就地转换为新的 Vault 布局。
问题修复
- 自己的修改不再被误判为冲突 —— 同步不再把你刚推送的更改报告为冲突,时间戳比较也改用完整的纳秒精度。
- 点文件正确同步 —— 点文件资源(如
.gitignore)在 pull 时会原样落地,需要去重时也会使用合理的文件名。 - pull 能合并内容相同的未跟踪文件 —— 当本地存在内容完全相同的未跟踪文件时,pull 现在会直接将其纳入跟踪,而不是报错。
v0.113.0 (2026-07-16)
新功能
- 编辑器与查看器支持 LaTeX 数学公式 —— 随处书写数学公式:使用行内公式,或通过斜杠菜单插入公式块,编辑与查看模式(包括 AI 聊天回复)都会以 KaTeX 精美渲染。
- 个人全局指令 —— 只需设置一次你的全局指令,之后启动的每个 AI Agent 会话都会自动遵循。
改进
- 终端查看器缩放控制 —— 只读终端视图新增 +/- 缩放按钮,小屏和移动端也能轻松阅读长输出。
- 终端输出保持原始排版 —— 只读终端中的长行不再意外折行,视图会根据内容自动调整尺寸。
- 更简洁的站点页头 —— 公共站点的页头导航已简化。
v0.112.1 (2026-07-15)
改进
- AI Agent 会话不再卡在交互式提问 —— Agent 会话现在会自主运行到底,不会因等待用户回复而停住。
问题修复
- 预算与支出按各自币种显示 —— 预算和支出现在以各自的币种展示,而不再统一使用单一全局币种。
- 应用内 Markdown 链接正确跳转 —— 应用内的 Markdown 链接现在会正确地通过应用内路由跳转,不再中断导航。
- AI 聊天设置链接直达 AI 设置 —— AI 聊天中的设置链接现在会直接跳转到 AI 设置区域。
v0.112.0 (2026-07-14)
新功能
- 对话图片全屏灯箱 —— 点击对话中的任意图片即可全屏查看,并支持拖拽平移与缩放,方便查看细节。
改进
- ud 助手现在统筹整个团队 —— 默认的 ud agent 现在作为所有顶层团队 lead 之上的根管理者,跨团队协调工作,而非各自为战。
- 更清晰的 CLI 守护进程反馈 ——
ud守护进程启动现在会根据捕获的输出如实报告成功或失败,而不再静默吞掉错误。
v0.111.0 (2026-07-12)
改进
- 更智能的 Agent 团队委派 —— 团队 lead 现在默认通过 AI 工具自带的 subagent 能力向专家委派工作:运行
ud describe agent <name> -o prompt即可获得可直接注入的身份 prompt(人设、技能、工作约束),把专家作为 subagent 启动,结果直接在线程中汇报。@mention 委派仍然保留,用于其他机器上的专家和长时间后台任务;只能远程触达的成员现在会在团队名册中明确标记。同时引导 lead 优先委派而非事事亲为,专注于协调与 review。
v0.110.0 (2026-07-11)
新功能
- Running 徽章可聚焦窗口 —— 点击工作区的 Running 徽章,如果该工作区窗口已在本机打开,现在会直接将其调至前台,而不是毫无反应。
- 自动检测卡住的工作区启动 —— 工作区会话若迟迟未能启动,现在会在超时后自动标记为失败,并在任务评论线程中通知你,不再无声地卡在"启动中"。
改进
- 更快的终端重连 —— 重新打开工作区终端时,现在通过快照恢复屏幕内容,而不是重放全部历史输出,重连更快更干净。
- 更清晰的终端渲染 —— 终端改用 WebGL 渲染,字体大小自适应更准确,原始输出显示也更正确。
问题修复
- 未配置项目目录时工作区无法启动 —— 未配置工作目录时,现在会自动创建专用沙盒目录,而不是启动失败。
- 多余的 "~" 文件夹 —— 修复桌面应用在安装工作区钩子时,会在项目目录下创建一个字面量
~文件夹的问题。 - 会话预览 —— 会话侧边栏现在预览线程中最新的回复,而不是旧消息。
v0.109.0 (2026-07-08)
改进
- Markdown 编辑器全都支持复制命令 —— 复制为富文本、复制为 Markdown、复制 Markdown 链接现在在每一个 Markdown 编辑器中都可用——任务和笔记描述、支出/收入/账户备注以及看板预览,不再只限于任务详情页。
- 更简洁的看板工具栏 —— 看板头部重新设计为极简统一的工具栏:常用图标操作保持可见,其余功能收纳进溢出菜单;移动端与桌面端共用同一套响应式布局。
- 更智能的内置
@ud智能体 —— 默认的@udAI 智能体现在作为编排者:它了解完整的智能体阵容,先与你澄清需求,再把工作分派给专职智能体,而不是自己全部包办。
v0.108.0 (2026-07-08)
安全
- 修复高级搜索中的一个 SQL 注入漏洞:精心构造的自定义字段名可能被注入到底层查询语句中。
新功能
- 统一搜索栏 —— 高级搜索现在整合为一条查询栏,含三种模式:筛选(可视化标签)、查询(类 SQL 语句)、问 AI(用自然语言描述)。筛选条件即增即用、即时生效;在「筛选」和「查询」之间切换不会丢失已有条件;还有实时有效性提示,告诉你查询是否可用。
- 看板列支持按更多字段筛选 —— 看板列现在不仅能按状态、标签,还能按标题、描述等字段匹配,并新增「同时包含多个标签」选项。列编辑器会实时预览生成的查询语句,并为模糊匹配给出通配符提示。
改进
- 看板:按只读字段(如标题)筛选某一列时,不会再在卡片拖入该列时误改这些字段。
问题修复
- 修复任务详情页终端(tty)的对齐和缩放问题。
v0.107.0 (2026-07-06)
新功能
- 智能体团队 —— 把 AI 智能体编成团队(一个负责人 Lead + 若干专长成员)。每个成员都带一条「何时委派给它」的说明,这份名册会自动注入到 Lead 的会话里,让它知道该把哪类活儿交给谁;团队还能嵌套成委派层级。在全新的 智能体 中心(智能体 · 团队 · 技能 三个标签页)里管理,或用
udCLI(ud apply/ud get agent-team)操作。 - 复制为富文本 —— 右键任务或其描述,即可复制为富文本,方便粘贴到其它应用。
改进
- 评论线程:解决线程时,操作从原来的「解决 + 删除」改为 解决 + 标记完成 + 终止。
- 文件浏览器:附加到任务上的资源,现在会和该任务并列展示。
v0.106.0 (2026-07-06)
新功能
- 粘贴的图片更整洁 —— 粘贴或插入图片时,会自动归入专属的
/system/pasted-image/文件夹,不再散落在文件浏览器根目录 - 更智能的工作区守护进程选择 —— 工作区会话会优先复用你上次使用的守护进程,而不再总是随机选取第一个在线的
问题修复
- AI 对话:失败的工具步骤现在会明确显示为错误状态,不再错误地显示为绿色「完成」;当工具调用达到次数上限时,会显示清晰的提示
- AI 对话:放大模式下的长消息现在居中显示、行宽更舒适,阅读更轻松
- 工作区:会话控制按钮在窄小面板中不再被裁切遮挡
v0.105.0 (2026-07-05)
新功能
- CLI 新增
stop-workspace-session命令,可真正终止正在运行的智能体会话(而不仅是更新状态)
体验优化
- 智能体会话新增默认工作区回退 —— 当未配置工作目录时,会话会运行在专属的「默认」项目中,确保每个会话都有真实、可见的工作目录
- 当 @智能体 提及无法启动会话时(例如没有在线的智能体守护进程),现在会在讨论串中回复明确的错误提示,而不再悄无声息地失败
问题修复
- 修复只读终端在工作区会话尺寸变化后出现乱码的问题 —— 所有查看端会立即重新应用新尺寸
- 修复任务浏览器刷新后未反映状态、路径或标签变化的问题
- 修复后台子智能体仍在运行时 Claude Code 状态却显示「空闲」的问题
v0.104.0 (2026-07-05)
体验优化
- Markdown 编辑器移除弹窗编辑模式 —— 禅意模式(全屏编辑)现在是唯一的编辑方式
- 任务详情页优化编辑态交互、引导流程失败时不再阻塞使用、大纲支持分组展示
- 任务详情页错误状态支持重试、空字段单击即可编辑、弹窗无障碍体验提升
- 编辑器中此前硬编码的文案已完成多语言本地化
问题修复
- 修复部分界面显示原始多语言 key 而非正常文案的问题
- 修复 Markdown 编辑器可能丢失未保存内容的问题
- 修复编辑器链接中不安全协议未被过滤的问题
- 修复工作区新建会话窗口遮挡当前聚焦窗口的问题
v0.103.0 (2026-07-04)
新功能
- 工作区会话窗口现在会在后台打开 —— 点击状态指示器即可聚焦对应窗口
- 点击工作区会话标题即可在弹窗中预览关联任务
体验优化
- 工作区分组切换按钮改为图标样式,并附带悬停提示
- 撰写消息的智能体选择器支持键盘导航,切换收件人时会保留草稿
- 只读终端现在支持滚动和复制文本
问题修复
- 快速笔记提及任务时,不再在标题、描述与评论中重复相同内容
v0.102.0 (2026-07-04)
新功能
- 工作区页面全新移动端响应式布局 —— 小屏幕下从会话列表逐级进入详情视图
- 工作区会话列表支持按智能体或守护进程分组,分组选择会被记住
- 工作区侧边栏的会话列表项悬停时显示停止按钮,可直接停止会话
- 只读终端支持缩放适配窗口,终端尺寸会跟随查看者窗口调整
- 工作区侧边栏的折叠状态会跨会话保留
- CLI:
ud apply --dry-run可在应用看板前预览变更操作,看板列配置支持无损导出与回传
体验优化
- 向远程工作区会话发送输入现在需要 Cmd/Ctrl+Enter,避免误发
- 会话讨论侧边栏与资源管理器侧边栏现在互斥 —— 打开一个会自动关闭另一个
问题修复
- 终端启动前会校验工作区工作目录 —— 路径无效时显示明确错误,而不是黑屏终端
- 生成工作区会话提示词时正确应用运行对话框中的选项
- 移除工作区会话输入框占位符中过时的快捷键提示
v0.101.1 (2026-07-03)
问题修复
- 修复后端在应用 v0.101.0 数据库迁移时无法启动的问题(影响自托管 Docker 镜像与二进制文件,桌面应用与 CLI 不受影响)
v0.101.0 (2026-07-03)
新功能
- 新增
ud init命令 —— 将现有本地文件夹绑定到虚拟路径,再用ud push发布;跟踪文件夹现在会绑定到 pull 时的路径(类似 git clone),不带参数的ud pull会增量同步所有已跟踪内容 - 工作区会话无需先选择任务即可启动 —— 全新的“提示词优先”运行对话框,设置折叠为摘要行
- 工作区会话现在按工作目录分组,并且完全取消了并发工作区数量限制
- 新增 Gemini、GitHub Copilot、Qwen 作为本地工作区会话的内置智能体
- 数据流(Dataflow)已完整支持中英文界面
体验优化
- 资源列表加载大幅提速 —— 下载链接现在会被缓存并随列表返回,不再对每个资源单独请求
- 数据流视觉焕新 —— 扁平节点、正交连线、描边分组,拖拽更流畅,不再触发整个画布重绘
- 会话讨论统一收进侧边栏面板,移除了独立的整页视图
问题修复
- 资源管理器:拖放目标高亮现在清晰可见,拖动经过文件夹时保持稳定
- 数据流:修复重命名/复制/删除时的撤销与数据损坏问题、图标节点锚点跳动、以及任意方向连接点的管道渲染
- 工作区:终端历史不再重复渲染,运行对话框不再裁剪输入框焦点边框
- 修复路径格式不一致时 pull/push 产生重复文件夹的问题
升级说明
- 旧的本地同步(local-sync)功能已从应用、桌面端、CLI 和后端全面移除 —— 请改用新的跟踪文件夹工作流(
ud pull到本地文件夹,编辑后ud push)。旧版 v1tracking.json文件夹不再受支持,请用当前版本 CLI 重新 pull
v0.100.0 (2026-07-02)
新功能
- 新增
ud pull、ud push、ud status命令 —— 以类似 git 的方式在本地文件与服务器之间手动同步任务、笔记和资源:先 pull 到本地文件夹,本地编辑后用ud status查看变更,再 push 回服务器 - 评论会话头部新增“解决并删除任务”按钮 —— 一键结束讨论并删除对应的评论任务
体验优化
- 工作区会话启动失败时,现在会显示来自守护进程的具体错误信息,不再静默失败
v0.99.29 (2026-06-29)
体验优化
- 工作区会话详情现在展示只读的实时终端画面,取代原有的笔记视图
- 任务列表加载更快 —— 笔记与分享链接改为批量加载,去除了大量重复查询
- 命令行浏览任务更快 ——
ud tree与层级视图改用专用的轻量接口
问题修复
- 工作区终端:早期输出会先缓冲直到界面就绪,不会再丢失最开始的几行内容
- 修复了任务树 / 层级视图此前无法访问的问题
升级说明(自托管用户)
- 启动时现在必须设置
HOST_DOMAIN,请在部署配置中填写,否则后端将无法启动
v0.99.28 (2026-06-28)
新功能
- 工作区焕新 —— 活动会话现在采用全高的主从(master–detail)布局(/workspaces),子导航中以“数量胶囊”实时显示会话数量,空状态更友好并提供醒目的“新建会话”入口
- 更顺畅的引导流程 —— 选择语言后,udctl 会自动为你初始化一个欢迎看板,并最大化打开“快速笔记”,让你立即上手
- 系统级存储上限 —— 管理员现在可在「管理 → 存储」中设置所有用户合计的总存储容量上限,与单文件大小、单用户配额并列
- 在没有安装 ud CLI 的情况下启动本地工作区时,桌面应用会主动询问是否为你安装
体验优化
- 优化了侧边栏导航栏,线条风格更轻盈、更统一
- 首页“立即体验”按钮现在会直接跳转到全屏加载页面,反馈更清晰
问题修复
- 管理员设置的“最大文件大小”现在会立即对所有用户生效
- 工作区会话控制(停止、截图、发送输入)现在会准确作用于具体会话,而不是整个任务
- 桌面工作区中的后续“@提及”提示词现在能正确提交
- 任务详情不再短暂显示“Invalid Date”,改为显示占位骨架
- 打开资源管理器不再覆盖已加载的任务内容
- 移除了空会话列表中多余的“运行”按钮
v0.99.27 (2026-06-27)
新功能
- 资源详情页现在可直接播放视频文件,并提供完整的播放控件(播放、进度条、音量、全屏)——视频不再显示“无法预览”
体验优化
- 桌面应用的更新检查简化为一个“检查更新”按钮:它会告诉你当前是否为最新版本,或在有新版本时提供下载按钮。现在会自动选择最佳下载镜像,并修复了与更新相关的启动崩溃问题
- 文件无法预览或下载时的错误提示更清晰——现在会显示具体原因(文件丢失、链接过期、存储不可用),而不再是笼统的“文件未找到”
v0.99.26 (2026-06-26)
问题修复
- 修复了桌面应用有时无法启动、报错 “Backend failed to start within 30s” 的问题,现在后端可稳定启动
体验优化
- 桌面应用现在会在向你的项目添加 Claude Code hooks(用于实时显示工作区状态)之前先征求你的同意,可在引导流程中选择或随时在“个人资料 → CLI”中开关;未经允许不会写入任何 Claude Code 配置
v0.99.25 (2026-06-21)
新功能
- 浏览器侧边栏高亮当前活动任务
- CLI 新增
path作为ud query的内置查询字段 - 技能现在可在浏览器 API 中浏览
问题修复
- 修复
ud sync resources上传大文件(如 MP4)超时失败的问题 - 修复 Agent 回复包含自身提及时导致无限循环的问题
- 修复任务详情页面刷新时短暂显示空白状态的问题
v0.99.24 (2026-06-19)
新功能
- CLI 新增
ud share和ud unshare命令,管理任务、预算、支出、收入、账户的群组共享 - CLI 新增
ud patch resource子命令,用于更新资源属性 - 移动端浮动按钮组新增搜索按钮
- 浏览器头部新增手动刷新按钮
- 删除任务后自动导航到上一个任务
改进
- Agent 之间的评论线程回复路由,支持速率限制
问题修复
- 改善评论回复通知的可读性
- 修复浏览器实时刷新中路径字段变更未正确同步的问题
v0.99.23 (2026-06-18)
新功能
- 会话侧边栏中的任务状态图标现在可点击,快速切换状态
问题修复
- 修复会话详情头部按钮显示多余文字标签的问题
- 修复会话中状态下拉菜单被其他元素遮挡的问题
v0.99.22 (2026-06-18)
新功能
- 统一资源浏览器:任务和资源整合到同一棵树中,支持拖拽移动和文件夹操作
- 浏览器增量同步:使用 IndexedDB 缓存,仅同步变更内容,加载更快
- 未归档区:无路径的条目集中显示在"未归档"区域
- 浏览器右键新建:右键菜单新增"新建图表"、"新建数据流"、"新建表格"
- 代码文件预览:支持 JSON、JS、CSS、XML 等代码/数据文件的内联预览
- 在浏览器中定位:任务和资源均可通过"在浏览器中显示"快速定位
- 任务状态图标:浏览器树中的任务显示状态图标
- 笔记节点样式面板:数据流笔记节点支持颜色预设和字号调整
- 聚焦窗口按钮:工作区会话控制新增聚焦窗口按钮
- 重发初始化按钮:工作区会话支持重发初始化提示词
问题修复
- 修复切换标签页后浏览器不自动同步的问题
- 修复右键文件夹内容时路径不正确的问题
- 修复浏览器右键菜单被面板遮挡的问题
v0.99.21 (2026-06-16)
新功能
- 数据流 Kubernetes 图标:新增 22 个 K8s 资源图标(Pod、Deployment、Service、Ingress、CRD 等),以及 Cluster、Namespace、Node 分组预设
- 数据流序号图标:新增 1–20 的圆形数字图标,用于标注步骤和排序
- AI 对话评论管理:AI 助手现在可以直接创建、编辑和删除任务评论
- AI 浮窗对话:侧边栏收起时可以弹出 AI 对话浮窗
改进
- 数据流笔记节点使用等宽字体,提升可读性
- 优化页面渲染性能 — 乐观更新和 stale-while-revalidate 缓存策略
问题修复
- 修复数据流编辑器中样式面板在拖拽时不跟随节点/连线移动的问题
- 修复技能/提示词选择器被浮动对话面板遮挡的问题
- 修复终端会话输出恢复时的竞态条件
v0.99.20 (2026-06-15)
新功能
- 数据流形状节点:新增 8 种几何形状 — 矩形、圆角矩形、圆形、菱形、平行四边形、六边形、三角形、圆柱体
- 数据流连线样式:自定义连线颜色、宽度、虚线样式和流动动画
- 未保存提醒:离开数据流编辑器时提示未保存的更改
- 资源预览:点击资源弹出预览,无需下载
- 浏览器侧边栏:浏览器改为可切换的侧边栏,随时快速访问
- 工作区线程绑定:通过 @提及触发的工作区会话立即绑定到线程
改进
- 资源节点支持所有文件类型,不再限于图片
问题修复
- 修复数据流编辑器中点击样式面板导致节点取消选中的问题
- 修复移动端键盘弹出时按钮和弹出框被关闭的问题
- 修复桌面端侧边栏对话视图缺少返回按钮的问题
v0.99.19 (2026-06-14)
新功能
- 对话侧边栏新增"新建对话"按钮(+),可直接在浮窗面板中发起新对话
- 新建对话时支持技能和提示词选择器,快速插入技能引用
改进
- 侧边栏折叠时,点击对话图标直接打开浮窗面板,无需跳转页面
- 对话侧边栏从缓存即时加载,后台静默刷新
v0.99.18 (2026-06-14)
新功能
- 移动端对话浮窗切换器:左侧滑出面板,支持筛选、会话状态徽章,快速切换对话
- 对话浮窗模式:点击对话直接在弹出面板中查看和回复,无需离开当前页面
- 对话列表按最后活动时间排序(包括回复时间)
改进
- 工作区切换按钮在弹出窗口打开时保持可见
- 浮动边缘按钮统一为共享组件,自动堆叠,间距一致
v0.99.17 (2026-06-14)
新功能
- 回收站:支持查看已删除任务详情和永久删除
ud tree命令:以树状结构可视化任务层级关系ud get task -l <tag>标签过滤和ud get tags标签聚合视图- CLI 支持访问已软删除的任务
问题修复
- 分页提示现在更加醒目,带有 --page/--all 操作提示
v0.99.16 (2026-06-14)
新功能
- 表格编辑器全面升级:类 Google Sheets 交互体验,支持单元格选择、键盘导航、拖拽选择
- 多工作表支持,工作簿数据模型
- 新增布尔复选框和日期列类型
- 列宽拖拽调整
- 支持 Excel 粘贴、Markdown 复制/导出、剪贴板操作
- 右键上下文菜单和行高调整
- 选区增强:Ctrl+A 全选、列选择、选区边框
问题修复
- 修复进入编辑模式时行高跳动的问题
- 修复单元格轮廓颜色和输入光标可见性问题
- 消除单元格选择中的双边框伪影
v0.99.15 (2026-06-13)
新功能
- 支持通过
ud apply更新资源元数据 - 工作区会话新增为 CLI 资源类型(
ud get workspace-session、ud describe workspace-session) - 基于文件的同步锁,防止并发访问冲突
问题修复
- 修复资源在全屏页面无法预览的问题
- 修复文件浏览器中文件夹移动操作不生效的问题
- 修复评论变更通知未送达的问题
v0.99.14 (2026-06-12)
新功能
- Explorer 侧边栏现在可以加载全部任务,完整展示文件夹树结构
- CLI: 新增
ud patch task --path命令,快速将任务移动到虚拟文件夹中(如ud patch task abc123 --path docs/design)
改进
- CLI 路径参数自动补全前导
/,无需手动输入
v0.99.13 (2026-06-12)
新功能
- 评论和对话中的实体协议链接(如
task://)现在可以点击跳转 - 侧边栏新增置顶任务展示
- CLI: 新增
ud cook命令(覆盖全部 15 种 API 资源的 cookbook 示例)和ud patch命令(支持评论--status参数)
问题修复
- 修复评论锚点高亮不生效的问题(点击评论链接现在能正确滚动并高亮对应评论)
- 修复 CLI
bind task --project发送错误 JSON 字段名的问题
v0.99.12 (2026-06-09)
新功能
- 侧边栏中「对话」移至「AI 助手」旁边,新增「AI 与对话」说明文档
- CLI: 新增
ud get resource和ud describe resource命令,支持日期过滤(--since、--before) - CLI: local-sync 成为内置代理,新增
--create-dir和--create-project参数
问题修复
- CLI: 资源表格现在显示完整 UUID
v0.99.11 (2026-06-09)
新功能
- 所有
ud get命令和ud describe comment/income新增-o apply参数,支持直接输出 apply 兼容格式,便于管道操作和自动化
问题修复
- 修复代理提及下拉菜单因缓存未及时刷新导致列表不更新的问题
v0.99.10 (2026-06-09)
新功能
- 笔记现在可以通过笔记 ID 直接访问 — 读取、更新、删除操作不再需要指定父任务 ID
- 新增
ud describe note命令,可查看笔记详情并以 apply 兼容格式导出
改进
- 简化
ud delete note命令,只需提供笔记 ID 即可(之前需要同时提供任务 ID 和笔记 ID)
v0.99.9 (2026-06-07)
新功能
- 资源预览支持 .dataflow.json 文件格式
- 双击编辑任务标题(移动端单击即可编辑)
- 任务评论侧边栏支持粘贴图片和上传文件
- 新增内置 dataflow-creator 代理
改进
- 移动端对话页面体验优化(更宽的聊天气泡、隐藏标签和外部链接按钮)
- 移动端资源详情页导航按钮移至独立行
- 管理员配置导航标签支持移动端横向滚动
- 对话标题栏仅显示状态图标,更简洁
问题修复
- 修复任务评论中 taskId 引用错误
v0.99.8 (2026-06-05)
新功能
- 对话中支持上传文件附件
- 对话中支持 conversation:// 链接,可复制评论 ID 生成引用链接
- 对话线程标题栏新增任务状态选择器
- 对话回复窗口支持 @提及 团队成员
- 数据流中粘贴 resource:// URI 可直接创建资源节点
问题修复
- 修复对话回复中提及下拉菜单弹出方向
- 修复资源节点缺少默认尺寸导致图片无法渲染
- 修复管理员页面未显示功能开关配置项
v0.99.7 (2026-06-03)
新功能
- 元素面板(Elements Panel):全新的架构图绘制能力
- 图标节点:内置 AWS、Azure、Lucide 等图标库,支持两级分类侧边栏浏览
- 图标样式自定义:SVG 描边颜色、填充色、边框颜色
- 分组节点增强:支持图标、样式预设和嵌套分组
- 架构导入格式(Format A+):支持嵌套分组的架构图导入
- 管理员可控制任务公开分享开关
- Markdown 中通过 resource:// 协议内联渲染 HTML 资源,支持自适应高度、下载按钮
- 工作空间运行对话框新增任务选择器
- 任务详情页新增执行按钮
问题修复
- 修复数据流中分组的层级和拖拽行为
- 修复图标 SVG 描边颜色显示问题
- 修复任务选择器下拉框鼠标滚轮不可用的问题
- 修复 HTML 嵌入高度问题
v0.99.6 (2026-06-02)
新功能
- AI 对话支持文件附件和语音录入
- AI 对话消息在页面切换后自动保留,不再丢失
改进
- HTML 资源预览采用沙箱渲染,更安全流畅
- AI 对话界面精简,释放更多对话空间
问题修复
- 修复资源预览被父容器裁切的问题
- 修复分隔栏按钮遮挡弹窗的问题
- 修复对话输入框图标未垂直居中的问题
v0.99.5 (2026-05-31)
新功能
- 新增
ud get income命令,支持从 CLI 查询收入记录
问题修复
- 修复工作空间中 Agent 间 @提及委派失败的问题
v0.99.4 (2026-05-31)
新功能
- 社区技能注册表:通过
ud market命令浏览、安装和分享技能
改进
- 移动端任务详情:底部操作栏精简,将置顶和签到移入更多菜单
问题修复
- Ctrl+J 打开 AI 聊天时自动聚焦输入框,可直接开始输入
- 修复对话弹窗显示侧边栏等多余 UI 的问题
v0.99.3 (2026-05-30)
新功能
- AI 对话弹出窗口:支持 Ctrl+J 快捷键将 AI 对话弹出为浮动窗口
- 对话线程弹出按钮:对话线程视图新增弹出按钮
- Ctrl+K 快捷键聚焦主窗口
- Markdown 嵌入文档页
改进
- 任务详情右侧边栏滚动时保持吸顶
- 大纲导航精准定位可见元素
问题修复
- 修复待办清单项路径字段更新时未持久化的问题
- 修复 AI 对话页面 Tooltip 显示异常
- 弹出图标更新为更直观的 ExternalLink 样式
v0.99.2 (2026-05-30)
新功能
- 移动端折叠式布局:任务详情和资源管理器页面支持折叠各区块(会话、评论、描述、备注、详情),底部操作栏新增评论按钮
- AI 聊天建议:AI 助手对话新增引导提示词,支持随机话题池
- Agent 评论线程:Agent 对话现使用评论线程,保持任务内容整洁
- 定时任务:新增定时调度 Agent 任务功能
- 数据流集合运算:数据流节点支持 JSON 字段集合运算
改进
- 评论状态模型优化:"已标注"现为终态,适用于无需办结的备注型评论
- 对话页面默认显示未解决的线程
问题修复
- 修复 AI 聊天消息在移动端溢出的问题
- 修复工作区会话停止后因 SSE 竞态条件重新出现的问题
- 移除评论线程中重复的回复按钮
- 修复移动端隐藏区块仍显示分隔线的问题
v0.99.1 (2026-05-28)
新功能
- 对话星标:Gmail 风格的星标功能,快速收藏重要对话
- 对话输入框新增 Prompt 和 Skill 选择器
- 对话解决状态支持乐观更新,操作即时响应
- 对话线程视图新增工作区控制栏
- 资源管理器页面新增移动端侧边栏切换按钮
改进
- 对话筛选栏支持水平滚动
- 对话线程在收到新评论时自动刷新(SSE 实时推送)
问题修复
- 修复评论流中偏好设置选择器导致的无限循环
- 修复资源管理器侧边栏切换按钮与主侧边栏重叠的问题
v0.99.0 (2026-05-27)
新功能
- 资源管理器视图:全新三栏布局,支持虚拟文件夹树、拖拽移动和右键菜单
- 任务路径:任务支持层级路径,实现文件夹式组织管理
- AI Talk 首页:AI Talk 替代仪表盘成为首页,统一 /commands 和 @agent 入口
- 对话功能:评论页升级为对话页面,全新聊天气泡界面
- 对话中粘贴图片:直接粘贴图片作为资源上传
- 对话消息内嵌图片:resource:// 图片在消息中直接渲染
改进
- 任务详情页全宽布局,操作按钮整合为下拉菜单
- 添加评论时自动切换到评论侧边栏
- 描述编辑器自动填满容器高度
- 登录页使用缓存数据即时加载
问题修复
- 修复资源管理器路径处理、命令自动补全和前缀匹配
- 修复 /commands 和 @agent 的聊天提示显示
- 修复评论数量徽标被裁剪的问题
- 修复首次访问时的许可证等级检测
v0.98.1 (2026-05-26)
改进
- 评论状态升级为三态:开放/已解决/已标注,支持更精细的讨论管理
- 评论页面实时更新:新评论通过 SSE 自动推送,无需手动刷新
- 评论页面 URL 保持选中状态:刷新页面不再丢失当前查看的讨论串
- 评论关联的工作区会话状态显示更可靠(基于后端绑定数据)
- 工作区对话框 CWD 显示与后端保持一致
v0.98.0 (2026-05-26)
新功能
- 用户头像:支持设置和展示个人头像
- 仪表盘聚焦视图:快速回到上次访问的任务
- 数据流图支持撤销/重做,工具栏新增操作按钮
- 数据流图支持粘贴纯文本创建笔记节点
- JSON 节点支持拖拽排序字段
改进
- 代理提及时自动包含评论内容,提供更好的上下文
问题修复
- 修复工作区监控面板中会话标识渲染问题
- 移除工作区监控面板的 9 个会话数量限制
- 代理用户不再计入可登录用户数
v0.97.4 (2026-05-26)
改进
- 画布中粘贴图片时立即显示占位符,上传过程中展示加载状态
- 发送代理指令后自动跳转到新创建的任务
- 评论线程信息流中显示关联会话的运行状态
- 无可用守护进程时在发送指令对话框中显示提示
问题修复
- 修复旧版"image"类型画布节点无法正确渲染的问题
- 修复快速点击发送按钮导致重复发送代理指令的问题
- 修复打开发送指令对话框时代理列表未刷新的问题
v0.97.3 (2026-05-25)
改进
- 评论信息流侧边栏新增内联解决按钮,操作更便捷
- 评论页面新增"已解决"筛选标签,方便查看已解决的讨论
- 评论线程底部在解决按钮旁新增回复按钮
问题修复
- 修复错误提示的导入路径问题
v0.97.2 (2026-05-24)
新功能
- 代理详情页新增复制按钮,可快速创建现有代理的副本
- 评论线程现在使用线程级会话路由,AI 回复更加准确且具有上下文感知
v0.97.1 (2026-05-23)
新功能
- 工作区启动对话框现在显示工作目录(CWD)的解析来源(看板、项目、任务或默认值)
问题修复
- 评论 SSE 通知现在正确发送给任务所有者,而非仅通知评论者
- 代理在评论和 UI 中的显示名称现在能正确解析
- 工作区工作目录正确回退到
~/.undercontrol/workspace,不再显示异常路径 - AgentCLI 会话现在能正确传递初始提示词
- 工作区提示词传递更可靠(基于模式检测替代不稳定的延迟机制)
- 创建任务时正确解析描述中的 @提及
- 工作区启动器中看板和项目选择正确解耦
v0.97.0 (2026-05-22)
新功能
- 侧边栏新增「新建工作区」和「发送指令」快捷按钮
- 代理详情页新增「发送指令」按钮
- Agent Creator 现为内置技能,开箱即用
- CLI:
describe命令新增-o apply参数,支持导出可回写的 YAML - CLI: 命令帮助按功能分组展示,更易查找
- CLI: Daemon 和 AgentCLI 现为托管资源,支持 get/describe/delete 操作
问题修复
- 评论页面默认切换到「未解决」标签页
- YAML 解析器现在能正确处理块标量中的
---分隔符
升级说明
ud entity get已更名为ud get entity(旧命令已移除)ud daemon已更名为ud run-as-daemonud apply note子命令已移除- Skill、Prompt、AgentCLI 的 Markdown 格式 apply 已移除,统一使用 YAML
v0.96.2 (2026-05-21)
改进
- 工作区参数现在由服务端解析,提升可靠性
- 修复桌面应用中代理 CLI 命令路径解析问题
v0.96.1 (2026-05-21)
改进
- 桌面应用现在通过硬件 UUID 识别每台设备,实现精确的设备级守护进程管理。
问题修复
- 修复守护进程连接错误地指向首个注册设备而非当前设备的问题。
v0.96.0 (2026-05-20)
新功能
- 代理工作区会话 — 通过 CLI 命令
ud apply workspace或 UI 中任意工作区启动器直接启动 AI 代理工作区会话。 - 内置代理 — 自动预置两个内置代理:
@ud(任务管理 + 技能发现)和@agent-creator(创建新代理)。 - 提示词预览 — 启动工作区前可预览完整的组装提示词,准确查看 AI 代理将收到的内容。
- Spawn Workspace 技能 — 新增内置技能,支持代理生成额外的工作区会话。
改进
- 工作区守护进程选择现在为可选项,启动流程更简洁。
- 代理配置 UI 重新设计为双栏布局,更清晰易用。
- 代理会话复用已有终端窗口,不再创建重复窗口。
问题修复
- 修复工作区项目解析中前缀/名称匹配和 CWD 覆盖的问题。
- 实体 ID 验证现在正确要求 project 和 daemon ID 使用完整 UUID。
v0.95.0 (2026-05-18)
新功能
- Quick Note @提及代理 — 在 Quick Note 中输入 @agent 即可向 AI 代理发送命令。
- 独立的代理管理页面 — 新增「AI Agents」导航入口,集中管理代理配置。
- 代理配置增强 — 技能选择器(标签式 UI)和工作区默认设置(守护进程、标签、看板、项目)。
- 评论删除 — 评论线程视图中新增删除按钮。
- CLI 动词优先命令 — 新增
bind、unbind、link、unlink、grep命令,移除旧的资源优先命令格式。
改进
- 在工作区运行对话框中,将「Agent」重命名为「Agent CLI」以更清晰区分。
问题修复
- 修复代理页面导航的国际化键。
- 修复文档和前端中已弃用的 CLI 命令引用。
v0.94.0 (2026-05-18)
新功能
- AI 代理系统 — 创建自定义 AI 代理,配置提示词、技能和触发条件。代理可以以委托权限运行工作区会话,在「以...身份运行」下拉菜单中选择代理启动任务。
- 代理 @提及 — 在私有任务中可以 @提及自定义代理(不仅限于群组任务)。代理列表包含内置 @ud 和自定义代理。
- 代理管理页面 — 在工作区设置中新增「AI 代理」管理区域,支持创建、编辑、删除自定义代理。
- CLI 代理管理 — 通过
ud get agents、ud describe agent、ud apply agent、ud delete agent管理代理。
改进
- 「默认 Agent CLI」选择器移入「Custom Agent CLIs」区域,页面布局更简洁。
问题修复
- 修复技能/提示词/历史记录弹出面板在移动端的滚动问题。
v0.93.3 (2026-05-17)
改进
- 会话提及增强 — 评论中 @提及工作区会话现在显示用户名和任务标题(如
alice · 修复认证问题),取代之前难以辨认的会话 ID。所有评论输入框均支持会话提及。
问题修复
- 工作区会话 Token 有效期从 1 小时延长至 7 天,避免长时间工作时认证失效。
v0.93.2 (2026-05-17)
问题修复
- 修复桌面端连接远程服务器时,工作区终端认证失败的问题。此前需要手动加
--context参数才能正常使用 CLI 命令。
v0.93.1 (2026-05-17)
问题修复
- CLI
whoami命令现在正确遵循--context参数优先级,不再被环境变量覆盖。 - 桌面端:修复 npm install 后 PTY 无法启动的问题,现在会自动重新编译 node-pty。
v0.93.0 (2026-05-16)
新功能
- @工作区会话提及 — 在评论中直接 @提及工作区会话,将消息发送到正在运行的会话,无需指定特定用户。提及菜单同时显示成员和活跃会话。
- 守护进程注入后端 URL — 工作区 PTY 环境变量现在由守护进程自动设置后端 URL,确保会话内的 CLI 命令连接正确的服务器。
问题修复
- CLI
--context参数优先级高于UD_*环境变量,可在工作区会话内切换到其他服务器。
v0.92.0 (2026-05-16)
新功能
- 知识图谱探索 — 新增
ud graph命令,可视化探索任务之间的连接和知识库关系。 - 自动更新 CDN 源切换 — 桌面客户端现在可以在 R2 和 Bitiful CDN 之间切换更新源(设置 > 关于)。
- 手动检查更新 — Electron 桌面客户端新增手动检查更新功能。
改进
- 工作区终端输出缓存改用内存上限环形缓冲区,达到上限时优先淘汰最旧的会话。
问题修复
- CLI
--context参数现在正确覆盖工作区环境变量,可在工作区会话内切换到其他服务器。 - 自动更新检查增加 15 秒超时,防止更新服务器不可达时无限等待。
- 工作区初始化简化,守护进程使用自身的后端 URL。
v0.91.0 (2026-05-16)
新功能
- 内置 @ud 代理 — 工作区会话现在使用内置 soul prompt,提供更智能的 AI 辅助任务执行体验。
- 多会话列表 — 任务详情侧边栏新增多会话列表 UI,支持查看所有关联的工作区会话。
- 评论解决/取消解决 — 评论话题视图新增解决和取消解决按钮。
- 窗口类型彩色标识 — 工作区窗口选择器中不同窗口类型显示彩色左边框。
- 会话创建者标识 — 所有会话视图中显示创建者图标(机器人/用户)。
ud whoami命令 — CLI 新增身份诊断命令,方便排查认证问题。
改进
- 主窗口标题现在显示为「Main Window: <页面名称>」,更加清晰。
- 代理会话现在正确注入认证令牌和 API 地址。
问题修复
- 代理回复模板不再显示 "wk:" 前缀。
- 评论创建者正确显示代理身份,而非被委托的人类用户。
- 代理提示词正确放置在用户提示位置。
- 修复 Zustand 选择器返回新对象引用导致的无限重渲染。
- 修复代理会话空命令的初始化问题。
v0.90.0 (2026-05-14)
新功能
- 评论动态页面 — 全新跨任务评论动态页面,支持话题式讨论和内联回复。
- 项目页面 — 独立的项目管理页面,支持列表-详情布局,可查看项目关联的任务。
- 任务-项目关联 — 任务详情中新增项目选择器,支持将任务关联到项目。
- 本地目录项目关联 — 通过
ud.projects文件将本地目录链接到项目。 - 侧边栏折叠菜单 — 折叠状态的侧边栏显示可展开的导航项。
- 许可证信息 — 管理后台系统配置页面新增许可证信息展示和到期提醒横幅。
- 标签长度扩展 — 标签最大长度从 20 字符提升至 50 字符。
问题修复
- 切换评论时话题回复正确重置。
- 评论动态显示独立话题,不再按任务分组。
- 回复从评论动态中过滤,仅显示顶层话题。
v0.89.0 (2026-05-13)
新功能
- AI 代理工作区会话 — 在任务中 @ud 提及现在会自动启动工作区会话并运行 Claude Code,实现 AI 辅助任务执行。
- 管理后台用户管理页面现在显示用户类型(人类 / 代理)。
问题修复
- @ud 代理现在始终可在私人任务中被提及(不再需要群组成员资格)。
- 每日笔记继承不再添加多余的「Carried Over」标题。
- 每日笔记继承现在保留原始缩进格式。
v0.88.4 (2026-05-12)
新功能
- @workspace 提及现在支持任务描述和笔记(之前仅支持评论)。
- 快速笔记现在可以保存空内容,自动使用日期时间作为默认标题。
问题修复
- 修复笔记中的锚定评论显示错误的分区和颜色。
- 修复描述/笔记中的 @workspace 回复错误地显示为锚定评论。
v0.88.3 (2026-05-11)
问题修复
- 修复工作区终端窗口在启动时偶尔崩溃的问题。
v0.88.2 (2026-05-11)
改进
- 工作区对话框看板选择器现在显示所有看板,并按分组展示。
问题修复
- 修复看板搜索不支持短 ID 前缀匹配的问题。
- 修复对话框遮罩层打开时侧边栏元素未变暗的问题。
- 修复移动端技能页面滚动异常。
- 修复自托管文件访问中 localfs 预签名 URL 路径缺少 /v1 的问题。
- 修复评论中 @提及 的背景样式问题。
- 修复评论锚点因高亮时序竞争而被错误标记为缺失的问题。
v0.88.1 (2026-05-10)
问题修复
- 修复自托管用户升级时可能出现的 SQLite 数据库迁移错误。
v0.88.0 (2026-05-10)
新功能
- 任务评论 — 为任务添加线程评论,支持回复、标记解决/未解决和实时同步。引用描述或笔记中的文字创建锚定评论,高亮显示引用内容。
- @用户提及 — 在评论中使用
@用户名提及团队成员,被提及用户将收到通知。 - 快捷键提交 — 按 Cmd/Ctrl+Enter 快速提交评论、回复和编辑。
- 通知徽章 — 侧边栏折叠时,用户图标上显示未读通知数量。
- AI 助手工具 — 通过 AI 对话直接更新任务、创建笔记、修改描述和关联任务。
- 欢迎看板 — 新用户注册后自动创建一个包含示例任务的欢迎看板。
- 团队预算与支出 — 预算和支出现在支持团队组所有权,方便团队协作。
改进
- 工作区 Prompt 选择器中外部更改后,技能列表自动刷新。
- 深色模式下高亮颜色更明亮,可读性更好。
- 当评论引用的文字在内容中不再存在时,显示过期锚点指示。
问题修复
- 修复 iOS Safari 导航后文档页面标题被浏览器工具栏遮挡的问题。
- 修复共享看板带范围标签时成员检查逻辑。
v0.87.0 (2026-05-09)
新功能
- 工作区启动器看板选择 — 全局工作区启动器新增看板选择器,支持跨窗口快捷键
- 跨窗口同步 — 工作区窗口间通过 BroadcastChannel 实时同步状态
- AI 助手看板集成 — AI 助手在有看板上下文时自动将任务添加到看板
改进
- AI 对话现在可以通过 ID 正确查找任务
- AI 对话建议提示更新,更好地引导任务工具使用
- 运行对话框打开时自动获取最新技能
问题修复
- 修复运行对话框打开时技能列表未刷新的问题
v0.86.0 (2026-05-08)
新功能
- 仪表盘编辑器操作栏 — 操作栏默认展开,提升编辑体验
- 自定义滚动条 — 仪表盘编辑器使用 OverlayScrollbars,更美观流畅
- 欢迎引导内容 — 新用户完成入门后,仪表盘编辑器自动填充欢迎指南
改进
- 仪表盘编辑器图片上传改为服务器存储,不再使用 base64 内嵌
- 认证系统优化为无状态 OIDC 对齐架构,每次请求零数据库查询
问题修复
- 修复清除按钮确认对话框样式和交互问题
- 修复移动端编辑器视窗高度和滚动问题
- 修复移动端仪表盘切换器可见性问题
- 修复仪表盘视图切换器被内容推动而非固定在底部的问题
v0.85.2 (2026-05-08)
问题修复
- 修复工作区窗口中出现重复 SSE 连接的问题
- 改善令牌刷新稳定性
- 修复用户创建事件保留策略,改为永久保留
v0.85.1 (2026-05-06)
改进
- 仪表盘布局优化,首页重构为 6 宫格导航
- 浮动工具栏保存按钮使用主色高亮,更易识别
- 移动端语音录制 UI 优化
- 记住密码功能改用 base64 编码存储,提升安全性
问题修复
- 修复编辑器嵌套滚动容器导致高度异常的问题
- 修复 Electron 中仪表盘编辑器未填满可用高度的问题
- 修复终端提示词选择后焦点丢失的问题
- 修复语音提示文本关于音频+文字组合支持的错误描述
- 修复旧版明文存储的记住密码无法正常处理的问题
v0.85.0 (2026-05-06)
新功能
- 仪表盘 AI 聊天 — 仪表盘集成 AI 聊天功能,支持 AI 提供商选择器
- 仪表盘视图切换 — 简化仪表盘,支持编辑器与聊天之间的工作区式视图切换,编辑器配备浮动保存按钮
- 一体化 Docker 部署 — 全新 All-in-One Docker 镜像,简化自托管部署
- 删除预算/账户 — 预算和账户页面新增带确认对话框的删除按钮
- 全局错误边界 — 添加 React 错误边界防止页面白屏崩溃
改进
- 错误边界导航至仪表盘而非完全刷新页面
- 错误边界页面新增联系链接,方便用户反馈
问题修复
- 修复单个 AI 提供商时选择器未显示的问题
- 修复 AI 提供商加载需打开浮动聊天窗口的问题
- 修复仪表盘聊天视图中键盘快捷键提示的显示问题
- 修复编辑器/聊天切换时的闪烁问题
- 修复仪表盘视图切换高度异常的问题
- 修复终端提示词选择后焦点丢失的问题
v0.84.0 (2026-05-03)
新功能
- 浮动内容窗口 — 将文档内容固定为桌面应用中的置顶窗口,方便参考
- 工作区提示词同步 — 提示词现在存储在服务端,跨设备自动同步(从本地存储迁移)
- 分享任务时消息中包含任务标题
问题修复
- 修复浮动查看器按钮位置 — 从气泡菜单移至浮动操作栏
- 修复 TiptapViewer 中输入法(IME)状态丢失的问题
v0.83.0 (2026-05-02)
新功能
- AI 快速创建 — 通过语音录制和音频转录快速创建任务,可从侧边栏直接访问
- 内嵌音频播放器 — 资源预览对话框中直接播放音频文件
- AI 服务能力配置 — 为每个 AI 提供商配置聊天/视觉/转录能力,系统根据能力自动选择提供商
- 实时任务同步 — 创建任务时其他标签页/客户端即时收到更新
- 守护进程选择优化 — 优先使用在线守护进程,并记住上次选择
改进
- 侧边栏折叠状态下快捷操作使用更紧凑的双列网格布局
问题修复
- 修复 SSE task_created 事件后看板视图未正确更新的问题
- 修复转录使用错误模型/语言设置的问题
- 修复 AI 提供商表单意外关闭时草稿丢失的问题
- 修复仅支持转录的提供商测试连接使用错误端点的问题
- 修复图片识别创建任务时状态格式错误的问题
v0.82.2 (2026-05-01)
问题修复
- 修复工作区监控终端显示问题 — 终端窗格现在正确适配容器大小,支持横向滚动查看宽内容
v0.82.1 (2026-05-01)
问题修复
- 修复本地守护进程的注册/重连按钮未始终显示的问题
- 修复未选择远程守护进程时命令编码使用错误平台的问题
v0.82.0 (2026-05-01)
新功能
- 监控页面 — 全新多会话 TTY 仪表盘,支持 3×3 网格布局和全屏聚焦模式
- 网格导航 — 使用方向键和回车键在会话窗格间导航,点击选中显示会话控制
- 会话控制 — 可折叠的截图、方向键和回车信号按钮,聚焦模式下自动隐藏以释放终端空间
- 快捷操作 — 监控页面和工作区页面新增创建会话按钮,设置按钮快速跳转
- 本地守护进程 — 执行对话框新增本地守护进程选项
问题修复
- 修复选中文本创建任务时标题和描述的处理逻辑
- 修复控件点击事件冒泡导致窗格意外取消选中的问题
- 修复创建任务按钮的国际化翻译键错误
v0.81.1 (2026-05-01)
改进
- 提升实时同步稳定性 — 守护进程 SSE 连接现在正确处理重复连接并防止重连循环
v0.81.0 (2026-04-30)
新功能
- 项目管理 — 创建、编辑、删除项目,并在看板和工作区中关联项目作为工作目录
- 项目选择器 — 在看板设置、执行对话框和全局工作区启动器(Cmd+E)中选择项目
- 项目 CLI 支持 — 通过
ud project get/describe/apply/delete命令管理项目 - 技能页面入口 — 工作区页面新增技能区域和侧边栏导航链接
- 工作区页面重构 — 采用侧边栏导航布局,类似个人设置页面
- 守护进程自动注册 — 启动时幂等注册,无需手动操作
改进
- 看板选择器始终可见,支持"无"选项,可一键重置
- 执行对话框新增显式 CWD 输入和项目自动预选
- 默认 Agent 下拉显示实际名称(如"Default (Claude Code)")
- 项目下拉仅显示项目名称,不再显示完整路径
- 设备已注册守护进程时隐藏注册按钮,显示简短 ID
- 守护进程列表显示"本机"徽章和重连按钮
- 配置链接统一跳转至 /workspaces 页面
问题修复
- 修复守护进程 SSE 连接到错误机器的问题
- 修复守护进程被外部删除后残留 ID 未清理的问题
- 修复重连按钮未触发 SSE 流重连的问题
v0.80.0 (2026-04-29)
新功能
- 知识图谱增强 — 支持标签节点切换显示,父子任务关系可视化更清晰
- 任务导航历史 — 类似 Obsidian 的前进/后退导航,轻松在任务间跳转
- 侧边栏"更多"分区 — 可折叠的"更多"区域,收纳日历、图谱、时间线等视图
- AI 对话增强 — 支持多关键词 OR 搜索、创建任务和查看看板工具
- 管理员入职配置 — 可配置新用户入职后的默认落地页面
- 新用户默认分组 — 管理员可为新注册用户自动分配默认用户组
- 工作区快捷启动 — 全局 Cmd+E 快捷键从任意页面启动工作区
- 浮动提示词选择器 — 工作区任务面板中的浮动提示词选择按钮
改进
- 侧边栏更整洁:标签和高级搜索移至 Cmd+K 命令面板
- 快速操作替换为 2×2 快捷方式网格
- 管理页面整合:用户/角色/分组/入职配置合并为一个页面
- 图标徽章采用简约风格
- AI 对话空白状态显示可操作的建议按钮
问题修复
- 修复图谱中父子任务连线颜色不可见的问题
- 修复侧边栏"更多"区域在子页面无法折叠的问题
v0.79.0 (2026-04-28)
新功能
- 远程终端流式输出 — 在浏览器中实时查看工作区终端输出,后加入的用户自动接收近期输出历史
- 终端输出缓存 — 终端输出在服务端缓存,刷新页面后自动恢复终端内容
改进
- 上传空文件(0 字节)时显示更清晰的错误提示
问题修复
- 修复技能页面重复发起 API 请求的问题
- 修复终端显示问题(列宽、字体大小、横向滚动、背景色)
v0.78.1 (2026-04-27)
新功能
- 视图模式切换 — 看板页面支持在树形、列表、看板三种视图间切换
改进
- 视图模式切换器采用极简设计,仅图标无边框
问题修复
- 修复保存查询任务行中状态图标与标题未对齐的问题
- 修复树形视图中状态图标未垂直居中的问题
- 修复条件视图模式下的布局渲染问题
v0.78.0 (2026-04-27)
新功能
- 三栏布局 — 桌面端任务列表支持三栏视图,侧边栏、列表、详情同屏展示
- 树面板快捷创建 — 在树面板列标题直接创建任务,内联编辑替代弹窗
- 内联导航 — 任务详情面板支持前进/后退导航,无需跳转页面
性能优化
- 切换任务零延迟 — 缓存优先渲染 + 渐进式加载,任务切换瞬间完成
- 使用 useDeferredValue 和 memo 优化大列表渲染
问题修复
- 修复长时间运行后 token 刷新竞态导致请求失败的问题
- 修复 Windows 上 CLI 上传文件报 "Incorrect function" 的错误
- 修复 owner_id 较短时存储用量接口崩溃的问题
- 修复登录页 tier-info 请求无超时可能长时间阻塞的问题
- 修复 CLI 部分在 Web 端不显示安装说明的问题
- 修复 CLI 中 API base URL 末尾斜杠导致请求错误的问题
- 修复三栏布局中各列无法独立滚动的问题
- 修复 v0.55.0 → v0.77.1 数据迁移工具的兼容性问题
CLI 改进
- 所有命令新增 kubectl 风格的使用示例和 --context 参数说明
v0.77.1 (2026-04-26)
问题修复
- 修复了 SQLite 在遇到格式错误的 JSON 元数据时可能崩溃的问题
- 修复了分享链接未正确使用已配置的前端 URL 的问题
v0.77.0 (2026-04-26)
新功能
- 看板名称编辑 — 在看板设置中直接重命名看板
- 移动端工作区切换器 — 浮动触发器快速切换工作区
- 看板高级筛选 — 自定义字段支持 IS NULL / IS NOT NULL 操作符
- PowerShell 脚本预览 — 命令预览中展示人类可读的脚本内容
- 审计日志 TTL — 支持按事件类型设置保留时长(自部署用户适用)
改进
- 全新落地页设计:编排架构图和三大支柱模块
- 移动端侧边栏触发器透明度优化
- 笔记同步性能提升 — 基于时间戳跳过无变更写入
Bug 修复
- 修复查看模式下勾选框无法正确保存到后端的问题
- 修复移动端工作区切换器与侧边栏触发器重叠的问题
- 修复移动端历史弹窗中"存为提示词"按钮不显示的问题
- 修复工作区下拉菜单中剪贴板文本处理异常
- 修复命令预览内容超出时无法滚动的问题
v0.76.1 (2026-04-25)
Bug 修复
- 修复在看板中拖拽卡片时自定义字段值丢失的问题
- 修复看板列删除确认对话框的翻译问题
改进
- 看板列删除使用美化的确认对话框替代浏览器原生弹窗
v0.76.0 (2026-04-25)
新功能
- 文件夹共享 — 将资源文件夹共享给群组,文件夹内文件自动继承访问权限。资源列表新增群组和权限列
- 会话技能选择器 — 重新设计的会话控制区域,新增技能选择器便于快速访问
- 自适应输入框 — 会话输入区域自动随内容增长,并新增清除按钮
改进
- 图片尺寸现在使用 Obsidian 兼容的管道格式(
),跨 Markdown 编辑保持一致 - 更简洁的会话界面:缩短提示词/历史标签,单行内容隐藏滚动条
v0.75.0 (2026-04-24)
新功能
- 数据流管道关系标记 — 管道现在支持描述标签和端点标记(箭头、一对一、一对多/鸦脚),可构建 ER 风格的关系图
- 终端按钮自动创建任务 — 看板页面的终端按钮现在自动创建任务并启动工作区会话
- 会话提示词历史 — 提示词可保存到工作区提示词库中方便复用
- 工作区设置抽屉 — 工作区配置从个人设置页移至工作区页面的设置抽屉
改进
- 所有客户端(不仅限 Electron)看板页面均显示监控图标
- 看板选择器显示看板名称,CWD 区域单独展示解析后的路径
- 管道标记优化:更精致的尺寸、更好的默认值、改进的鸦脚方向
问题修复
- 修复笔记节点编辑时文本选择触发拖拽的问题
- 修复状态协调将 awaiting_input 状态错误覆盖为 running 的问题
- 修复多看板任务执行对话框中工作目录解析的问题
v0.74.0 (2026-04-24)
新功能
- AI 对话工具调用 — AI 助手现在可以在对话中语义搜索你的任务
- 多看板任务 — 任务可以属于多个看板;打开工作区时支持看板选择下拉菜单
- 工作区操作 — 在工作区页面直接截图、中断和检查会话状态
- 看板预览附件 — 在看板任务预览中查看附件文件,无需打开完整详情
- 仪表盘编辑模式 — 更简洁的仪表盘布局自定义界面
- 看板列表操作 — 展开视图中新增"添加到看板"和"删除"按钮
改进
- Hooks 现在在所有看板上自动安装(移除了单独的开关设置)
- 工作区会话乐观地从等待直接切换到运行状态
- 自定义字段标签显示
cf.前缀以提高辨识度 - 工作区对话框中显示解析后的工作目录,支持复制
问题修复
- 修复复选框切换产生重复历史记录的问题
- 修复未配置项目目录时工作目录解析的回退逻辑
- 修复 AI 搜索工具关键词查询构建问题
- 修复迁移错误消息缺少环境变量说明的问题
v0.73.4 (2026-04-22)
新功能
- 支持将守护进程共享给群组,实现工作区协作
- 工作区会话中显示任务标题而非原始 ID
- 执行对话框支持多技能选择
问题修复
- 修复任务详情页 Hooks 执行顺序导致的崩溃
- 工作区任务面板无内容时显示空状态占位符
- 修复已有分享链接时复制完整分享消息而非仅 URL 的问题
v0.73.3 (2026-04-22)
问题修复
- 修复工作区截图错误显示在附件列表中的问题
- 截图按钮在截取过程中现在显示加载动画
- 优化资源 API 调用,减少冗余请求,提升性能
v0.73.2 (2026-04-22)
改进
- 工作区截图现在显示在专用的水平滚动图库中,带有高亮动画效果
- 工作区入口移至侧边栏的"任务"区域,更便于快速访问
问题修复
- 修复选中图片或代码块时编辑器气泡菜单错误显示的问题
- 修复打开内容查看器时图片被自动选中的问题
- 修复切换页面后侧边栏未保留所选看板的问题
- 修复 Markdown 复选框无法正常切换的问题
- 修复桌面应用中截图重复上传的问题
v0.73.1 (2026-04-21)
问题修复
- 修复 Electron 桌面应用及自定义服务器地址下授权等级检测失败的问题
改进
- 服务器配置页面现在显示当前授权等级名称
v0.73.0 (2026-04-21)
新功能
- 仪表盘小部件自定义 — 隐藏或显示仪表盘小部件,打造个性化工作台
- 任务笔记显示发布者 — 任务笔记中显示发布者名称,便于追溯来源
问题修复
- 修复工作区窗口标题未与当前跟踪的任务名称同步的问题
- 修复工作区心跳、过期会话清理及截图上传问题
- 修复移动端无法停止等待中的工作区会话的问题
- 修复会话轮询导致过多 API 调用的问题
v0.72.1 (2026-04-20)
新功能
- 移动端工作区快捷入口 — 在任务底部操作栏直接访问工作区会话,快速滚动到活跃会话或启动新会话
问题修复
- 修复桌面应用守护进程 SSE 连接重连不可靠的问题
v0.72.0 (2026-04-20)
新功能
- 工作区截图 — 自动截取工作区窗口并作为任务笔记附件上传
- 工作区会话侧边栏 — 在任务详情侧边栏查看工作区会话状态和时长
- 会话中断与状态检查 — 工作区会话新增中断和检查状态按钮
- 会话自动恢复 — 守护进程重连时自动恢复会话状态
- 守护进程重命名 — 支持在管理页面直接内联重命名守护进程
问题修复
- 修复终端控制字符输入问题
- 修复守护进程 SSE 流过早断开的问题
- 修复守护进程连接错误提示不准确的问题
- 修复"注册此设备"按钮在 Web 端误显示的问题
v0.71.0 (2026-04-19)
新功能
- Web 工作区查看器 — 在浏览器中直接查看和管理 AI 代理工作区
- 每日笔记导航 — 每日笔记自动链接到前一天,并支持自动置顶/取消置顶
- 远程守护进程工作区 — 桌面应用通过 SSE 连接远程守护进程管理 AI 工作区
- 工作区状态 CLI 命令 — 新增
ud workspace status命令查看工作区状态 - 工作区输入中继 — 支持向工作区 PTY 会话发送用户输入
- 移动端看板优化 — 看板头部操作折叠为汉堡菜单,优化移动端体验
问题修复
- 修复守护进程连接器认证流程
- 修复工作区状态在 pending/completed/stopped 下的显示问题
v0.70.0 (2026-04-18)
新功能
- 通知系统 — 订阅关注的任务,当任务状态变更或被更新时收到通知
- 每日笔记 — 快速创建每日笔记,支持未完成待办自动带入(Alt+D / Option+D 快捷键)
- 粘贴到笔记 — 在任务面板任意位置粘贴内容,自动追加到笔记
- "创建并关联"按钮 — 在子任务和关联任务对话框中快速创建新任务
- 复制资源 Markdown 链接 — 在所有资源视图中复制资源 ID 为 Markdown 链接
- 大纲优化 — 重命名大纲,将描述作为首项方便快速导航
- 待处理资源管理 — 交互式对话框替代后台清理,自动清理过期资源
问题修复
- 修复标签查询使用了无效运算符的问题
- 修复 macOS Alt 键产生特殊字符而非触发快捷键
- 修复无笔记时仍显示大纲的问题
- 改进粘贴提示的样式和多语言支持
v0.69.2 (2026-04-16)
新功能
- AI 图片转 Markdown — 通过 AI 视觉能力将图片转换为 Markdown 文本
- 统一系统配置页 — 所有配置类别合并为一个可滚动视图,展示运行时实际值、环境变量名和 CLI 参数名
改进
- 看板默认列优化:移除"草稿"列,"最近创建"和"最近更新"列移至末尾
问题修复
- 修复全屏预览时 Mermaid 图表元素缺失
- 修复创建任务对话框尺寸与任务预览弹窗不一致
- 修复创建看板对话框默认列与后端不匹配
v0.69.1 (2026-04-16)
新功能
- 移动端任务图谱与热力图 — 移动端列表页现可查看日历热力图和知识图谱
- 看板默认列 — 新增"最近创建"、"草稿"、"最近更新"默认列,支持全部折叠切换
- 执行对话框 — 看板终端下拉菜单替换为更直观的执行对话框
- 编辑器图片上传 — Markdown 编辑器工具栏新增图片上传按钮
改进
- "任务图谱"更名为"知识图谱",命名更准确
问题修复
- 修复使用外部工具栏时白屏崩溃问题
- 修复移动端图谱全屏显示异常
- 修复 Markdown 编辑器工具栏定位和层级问题
v0.69.0 (2026-04-15)
新功能
- 管理员存储管理 — 管理面板新增专用存储页面,展示各用户存储使用情况,支持单独设置用户存储配额
- 作用域标签 — "默认标签"更名为"作用域标签",创建新标签时自动填充
board:前缀
改进
- 分享链接现使用可配置的前端地址,改善 Electron 桌面端的链接分享体验
问题修复
- 修复应用启动时暗色模式闪烁问题,主题现从缓存即时加载
- 修复静态加载页面未应用暗色模式的问题
- 修复暗色模式主题未在所有 Electron 窗口间同步的问题
- 修复管理系统配置页面未展示存储配额设置的问题
v0.68.1 (2026-04-14)
新功能
- AI 聊天快捷入口 — 侧边栏新增 AI 聊天快捷操作,更快速地访问 AI 助手
- AI 技能语言适配 — AI 内置技能现在会使用用户的首选语言进行回复
改进
- 重新设计创建任务对话框,采用扁平极简设计语言,优化标签输入和内边距对齐
- 对话框现使用视窗宽高的 80%,提供更大的编辑空间
- 移动端技能页面采用主从布局,查看详情时自动隐藏顶栏
- 移动端快速笔记工具栏移至顶部固定,底部增加安全区域内边距
问题修复
- 修复任务创建者显示为看板所有者而非实际提交者的问题
- 修复分享提示框中跨群组无法正确解析用户名的问题
- 修复资源 URL 解析失败时 Markdown 内容被清空的问题
- 修复 Electron 中分享链接使用错误域名的问题
- 修复共享看板创建任务时资源组归属错误的问题
v0.68.0 (2026-04-13)
新功能
- 本地 Docker 部署 — 提供开箱即用的 docker-compose 部署方案,内置
/apinginx 反向代理
问题修复
- 修复 Docker 镜像更换 API 域名需要重新构建的问题(现已支持域名无关构建)
- 修复连接状态指示器在异常服务器响应时失败的问题
升级说明(自托管用户)
- 新增
deployment/docker-local-sqlite/和deployment/docker-local-postgres/目录,一键 docker-compose 部署 - Docker 前端镜像不再需要构建时设置
VITE_API_URL,通过 nginx 在运行时配置 API 地址
v0.67.2 (2026-04-13)
新功能
- 管理员技能管理 — 管理员可在管理面板中浏览、编辑、创建和删除系统技能
- 内置 PM 技能 — 新增
ud-pm系统技能,用于批量 PM 审核和任务实施
改进
- 管理员自定义的系统技能在后端重启后不再丢失
问题修复
- 修复命令预览与实际执行命令不一致的问题
- 修复全新安装时技能初始化失败的问题
v0.67.1 (2026-04-12)
新功能
- 新增
ud explain命令,可直接在 CLI 中查看资源 Schema 文档
改进
- CLI 技能命令现在支持
skill/skills别名,适用于所有 kubectl 风格操作(get、describe、delete)
问题修复
- 修复因 localStorage 存储空间不足导致的 QuotaExceededError 崩溃问题
v0.67.0 (2026-04-12)
新功能
- 技能管理 — 新增技能页面,支持创建、编辑和管理可复用的提示词与指令,配备所见即所得富文本编辑器。系统级内置技能对所有用户可见。
- 仪表盘置顶任务组件 — 将重要任务置顶,直接在仪表盘中查看,支持空状态提示。
- Agent CLI 命令预览 — 执行前预览即将运行的完整命令,支持复制和技能选择。
- Agent CLI 快捷配置入口 — 所有 Agent 工具下拉菜单新增"配置..."选项,快速进入设置。
- 初始化技能支持 — Agent CLI 命令支持使用初始化技能进行工作区设置。
改进
- 技能详情页支持内联编辑和只读模式切换
- Agent CLI 对话框采用左右分栏配置与执行预览布局
- 任务详情页显示技能使用引导
- 右侧边栏加宽以完整显示任务 ID
问题修复
- 移除主容器中的前进/后退导航按钮
- 修复技能编辑器内容滚动和工具栏行为
v0.66.1 (2026-04-11)
问题修复
- 修复内联编辑器工具栏和浮动操作栏样式,恢复 v0.65.3 的正确浮动定位
v0.66.0 (2026-04-11)
新功能
- 注册页面支持内联生成邀请码及部署选项
- 工作区窗口顶栏新增任务状态切换器
- 任务元数据区域显示创建者信息
- 工作区任务面板中的链接支持在新标签页打开
- 应用内文档新增 Kubernetes Helm 部署指南
改进
- 移动端任务预览默认折叠元数据区域
- 看板条件构建器改为堆叠两行布局
- 看板选择列表支持滚动
问题修复
- 改善注册流程中邀请码跳转和登录重定向体验
- 登录后重定向至仪表盘而非看板
- 修复编辑器切换模式时的闪烁问题
- 修复移动端编辑器工具栏和浮动操作栏定位
- 修复引导跳过按钮不可靠的问题
- 支持长按 Ctrl+D/Ctrl+U 连续快速滚动
- 修复看板列条件编辑器导致的布局抖动
- 修复工作区任务面板中的链接路由
v0.65.3 (2026-04-10)
改进
- 部署流程优化
v0.65.2 (2026-04-09)
问题修复
- 内部稳定性改进
v0.65.1 (2026-04-09)
新功能
- 中国大陆下载按钮:桌面端下载弹窗新增国内下载按钮
性能优化
- 消除切换编辑模式时的闪烁
- 延迟渲染屏幕外的笔记编辑器,任务页加载更快
- 修复任务详情接口的重复查询和 N+1 问题,加载更快
- 修复任务详情页 5 秒导航延迟
问题修复
- 修复移动端编辑器操作栏与聊天按钮重叠
- 修复编辑器工具栏横向滚动时冻结在左侧
- 修复编辑器中切换按钮滚动时未固定
- 移除导航任务时 "Loading images..." 导致的布局抖动
v0.65.0 (2026-04-08)
新功能
- 侧边栏大纲高亮:根据视口自动追踪并高亮当前编辑的笔记区域
- 滚到底部按钮:浮动操作栏新增快速滚到底部按钮
- 快捷键编辑内容:按
i键快速进入 Markdown 编辑模式(Vim 风格) - 看板新窗口打开:支持在 Electron 桌面端将看板页面在新窗口中打开
- 图片尺寸控制:TipTap 编辑器中支持 S/M/L 三种图片尺寸切换
- 数据流图交互:点击选中/取消选中数据流图中的节点和连线
- 计时器命令:命令面板中新增
/timer命令 - 短 ID 搜索:命令面板支持通过短 ID 搜索任务
- 移动端工具栏折叠:移动端编辑器工具栏支持折叠/展开,图片按钮常驻
- CLI
ud apply:支持ud apply -f从 YAML 文件创建资源,自动识别笔记 - 用户自定义技能:支持在配置目录中存储用户自定义技能
改进
- 任务详情页性能优化:延迟加载重型组件、延迟渲染 TipTap 编辑器和笔记、使用精细化选择器,页面导航和渲染更快
- 计时器简化:合并为单个
/timer命令,操作反馈改为 toast 提示
问题修复
- 修复标签建议覆盖确认按钮的问题
- 修复
i快捷键编辑非当前聚焦区域的问题 - 修复 Mermaid 全屏 SVG 缩放/滚动时闪烁
- 修复命令面板不支持部分 UUID 搜索的问题
- 修复移动端编辑器工具栏未固定在视口底部
- 修复 Ctrl+D/U Vim 快捷键滚动了错误的容器
v0.64.0 (2026-04-07)
新功能
- Anthropic AI 服务商:后端 AI 服务现支持配置 Anthropic,与 OpenAI 并列,提供简化的服务商类型选择
- 任务切换器:在工作区窗口中快速切换任务
- 工作区顶栏增强:显示状态图标、任务 ID 及复制按钮
- Vim 导航快捷键:Ctrl+D/U 半页滚动,Ctrl+O/I 任务访问历史
- Mermaid 全屏:支持全屏查看 Mermaid 图表
- CLI 改进:上传资源支持
--folder参数;ud get默认返回 20 条结果并支持分页 - 审计日志自动清理:根据保留策略自动清理审计日志
- 落地页全新设计:以"私人 AI 管家"为定位的全新落地页
问题修复
- 修复 CLI 上传时文件夹路径缺少末尾斜杠的问题
- 修复 API 密钥"永不过期"选项的中文翻译
- 修复任务不在缓存中时未从 API 获取的问题
- 修复 Ctrl+O/I 导航到浏览器历史而非任务访问历史
- 修复落地页字体粗细不符合设计规范
v0.63.3 (2026-04-05)
改进
- 实时同步连接每30分钟自动刷新,防止连接过期
问题修复
- 修复实时同步连接意外断开的问题
- 修复实时同步任务更新时可能导致数据异常的问题
v0.63.2 (2026-04-05)
问题修复
- 修复通过 SSE 更新任务描述后未自动刷新的问题
v0.63.1 (2026-04-05)
改进
- 分享消息使用代码入口页面链接,简化分享流程
- "在新标签页打开"替代远程工作区操作,多窗口工作更便捷
- 登录页面全新扁平极简设计,新增装饰性参考线
- 分享消息按钮更醒目,同时包含两种分享链接
- 桌面端工作区窗口支持实时更新
问题修复
- 修复桌面端页内搜索输入首字符后失焦及匹配卡住问题
- 修复团队邀请链接不可重复使用的限制
- 修复分享消息显示"内容"而非"任务"
v0.63.0 (2026-04-05)
新功能
- 桌面端:支持 Ctrl+F / Cmd+F 页面内搜索
- CLI:新增
ud local-sync命令,支持 watch 模式实时同步 - CLI:新增
api-resources命令,改进帮助文本 - CLI:新增
/task别名路由和X-UD-Channel审计标头 - 临时执行对话框新增工作目录输入框
- 分享对话框新增"复制分享信息"按钮
- 新增 Cmd+R 快捷键运行任务
- 恢复 Cmd+W 关闭窗口快捷键
文档
- 重写快速入门页面,涵盖所有入口方式
- 重写领域语言页面,覆盖所有应用领域
- 新增自定义客户端文档页
- 新增 Everything-as-Code 文档页
- 新增任务概念说明到新手引导任务
- 重组文档侧边栏结构
问题修复
- 修复任务详情侧边栏高度和滚动条问题
- 修复移动端侧边栏底部项被截断
- 修复移动端文档侧边栏无法滚动
- 修复移动端行内编辑器工具栏滚动,移除弹出编辑器
- 修复全局滚动条 CSS 影响 xterm 视口
- 修复仪表盘图表 -1 维度警告
- 修复数据流折叠/展开时连接点位置更新
- 修复侧边栏父项点击行为:名称导航,箭头切换折叠
- "临时执行"更名为"执行"
v0.62.1 (2026-04-03)
改进
- CLI:AI 工作会话现在会更频繁、更及时地记录笔记,确保知识和进度不会因会话中断而丢失
问题修复
- 修复 Windows 桌面端应用图标背景透明度
v0.62.0 (2026-04-03)
新功能
- 快速笔记:Gmail 风格弹出窗口,支持 Ctrl+N 快捷键,全屏 Markdown 编辑器,侧边栏入口,移动端滚动时收起为浮动按钮
- 命令面板:SSE 实时缓存失效,同时显示标题/Grep 搜索模式
- 窗口管理:Ctrl+Q 快捷键在窗口间切换,最近使用排序
- 数据流:图片/笔记节点支持拖拽调整大小,新增"复制给 AI"导出功能
- 全局默认 AI 代理设置
- 公开页面为已登录用户显示"返回应用"按钮
- 更新应用图标
问题修复
- 修复命令面板缓存过期、任务删除后残留等问题
- 修复快速笔记编辑器稳定性(tiptap 生命周期、挂载守卫)
- 修复数据流管道删除按钮无效的问题
- 修复 Markdown 链接简化渲染
- 修复移动端浮动按钮定位
- 修复 Windows 端 Codex 启动路径问题
- 修复数据流节点放置位置偏移
v0.61.3 (2026-04-02)
问题修复
- 修复任务详情侧边栏滚动问题,侧边栏现可独立滚动且隐藏滚动条
v0.61.2 (2026-04-02)
改进
- CLI:
ud describe task输出现已明确包含所有笔记内容
问题修复
- AI 提供商配置现在默认为 OpenAI 兼容类型,不再自动填充端点 URL
v0.61.1 (2026-04-02)
改进
- AI 功能:可在使用 AI 的界面中直接配置 AI 提供商,无需跳转设置页面
v0.61.0 (2026-04-02)
新功能
- 数据流:节点原始编辑器模式,直接编辑节点 JSON 数据
- 数据流:跨图表复制粘贴节点
- 数据流:笔记/图片节点支持多连接
- 看板:列下拉菜单支持打开多个终端窗口
- CLI:kubectl 风格笔记命令(get notes、apply note、delete note)
- CLI:看板名称查找、获取列、查询看板命令
问题修复
- 修复命令面板导航在 Electron 中始终定位到主窗口
- 修复 Ctrl+Q 现在显示所有窗口包括编辑器
- 修复看板列搜索提示显示"批量操作"而非"在列中搜索"
- 移除看板列中不可用的搜索按钮
- 统一启动加载界面匹配扁平/极简设计风格
v0.60.0 (2026-04-01)
新功能
- Draw.io 编辑器新增"保存"和"保存并关闭"按钮,关闭时弹出确认对话框防止误操作
- 所有资源编辑器支持 Ctrl+S 快捷键保存并关闭
- 资源编辑器在独立窗口(桌面端)或新标签页(浏览器)中打开
- 即时操作对话框支持 Ctrl/Cmd+Enter 快捷键
- 数据流:图片节点蓝色虚线连接线
- 数据流:字段编辑器支持 按钮转换为对象字段
- 数据流:支持递归添加子字段
问题修复
- 修复资源编辑器窗口因 iframe beforeunload 无法关闭
- 修复桌面端所有窗口复制粘贴快捷键失效
- 修复新建 Draw.io 资源保存格式不正确
- 修复新资源编辑器中保存按钮意外关闭标签页/窗口
- 修复 JS replace() 破坏用户提示中的 $ 符号
- 修复桌面端启动时 Service Worker 数据库错误
v0.59.1 (2026-03-31)
新功能
- 数据流:图片节点 — 新增图片节点类型,支持折叠、Ctrl+V 粘贴图片、Draw.io 导出
- 数据流:节点级连接手柄 — JsonNode 和 ProcessNode 新增节点级连接点,悬停放大
- 数据流:标题链接 — 节点标题支持点击跳转 URL
- 数据流:行内子字段 — 对象/数组字段支持行内展开子字段
问题修复
- 修复分组节点边框显示问题
- 修复分组标题定位与内容重叠
- 修复节点连接手柄在已连接时不可见
- 修复 JsonNode 头部多余的蓝色指示点
- 修复图片节点 Draw.io 导出 data URL 问题
v0.59.0 (2026-03-30)
新功能
- 分享访问码(快递柜)— 通过访问码安全分享内容
- 数据流:分组节点 — 可视化分组相关节点,编辑分组名称和颜色
- 数据流:便签节点 — 添加带附件的便签,拖拽关联到节点/字段,可折叠
- 数据流:字段编辑器 — 行内编辑字段名称、示例值和描述
- 数据流:多选删除 — 批量删除选中的元素
问题修复
- 修复命令面板 Cmd+Enter 无法在新窗口打开任务
- 修复 Draw.io 编辑器未使用用户语言偏好
- 修复数据流分组节点导出位置偏移
- 修复数据流保存/重载后父子关系丢失
v0.58.4 (2026-03-29)
新功能
- Draw.io 编辑器支持导入和导出本地 .drawio 文件
- 数据流图支持导出为 .drawio XML 格式
- 清单项可通过 task:// 协议直接跳转到子任务
改进
- 新用户引导重新组织为 4 个顶级分类,包含操作指南子任务
- 引导对话框默认使用英语
问题修复
- 修复 Electron 应用更新后白屏问题(清除缓存)
- 修复 Draw.io 导出列表项垂直位置偏移
- 修复资源链接不必要地在新窗口打开的问题
- 修复欢迎任务清单未完整显示子任务树
- 修复一级分类任务缺少子任务清单
v0.58.3 (2026-03-28)
改进
- 更新首页宣传文案和营销标语
升级说明(自托管用户)
- 环境变量
ADMIN_USERNAME已更名为ADMIN_EMAIL,请更新您的部署配置
文档
- 新增 Personal → Pro/Max 迁移指南
v0.58.2 (2026-03-27)
本次版本没有新增终端用户可见功能。
本次发布主要包含内部构建和发布流程调整。
v0.58.1 (2026-03-27)
本次版本没有新增终端用户可见功能。
本次发布主要包含内部构建和发布流程调整。
v0.58.0 (2026-03-27)
新功能
- 数据流画布框选 — 拖拽即可批量选中多个节点
- 数据流图表合并导入 — 导入时保留现有内容,追加新节点
- 导入节点自动拓扑排列,布局更清晰
- 支持简化 AI 格式导入数据流图
- 导入失败时显示警告提示
- 优化数据流 AI 提示词,生成质量更高
- 自托管用户支持从 Personal 版迁移到 Pro/Max 版
改进
- 数据流画布支持更大范围的缩小
问题修复
- 修复高级搜索页面加载时未自动执行搜索的问题
- 修复引导对话框提前关闭导致任务列表为空的问题
- 修复工作区窗口获得焦点时终端未自动聚焦的问题
v0.57.0 (2026-03-26)
新功能
- 数据流多字段选择 — 按住 Ctrl 点击可选中多个字段,支持 7 色高亮显示
问题修复
- 修复任务附件与资源库同步不一致的问题
- 修复链接区域中长任务标题溢出的显示问题
改进
- 全局启用细滚动条,界面更加简洁
v0.56.0 (2026-03-25)
新功能
- 看板卡片显示指派人头像,支持按指派人筛选
- 定时任务支持数据库备份,管理员可配置备份负责人
- 定时任务下拉菜单支持删除操作
- 资源页面新增刷新按钮
- 工作区菜单中"临时运行"移至首位
问题修复
- 修复引导对话框阻塞已有用户的问题,支持点击外部或 Escape 关闭
- 修复跨域文件下载问题
- 修复刷新按钮未重置资源缓存的问题
- 修复审计列迁移中的表名和字段宽度问题
- PostgreSQL 模式下隐藏备份相关 UI
v0.55.1 (2026-03-24)
新功能
- 任务指派人 — 在任务属性面板中直接指派团队成员
- 变更审计追踪 — 记录修改来源渠道,提升变更历史可见性
问题修复
- 修复对话框内容过长时的溢出显示问题
- 修复编辑列弹窗在条件过长时的布局溢出问题
v0.55.0 (2026-03-24)
新功能
- 任务甘特图视图 — 在时间线上可视化任务的开始和截止日期
- 拖拽调整甘特图条形大小,直接修改任务日期
- 任务新增"启动日期"字段,支持日历和甘特图规划
- 列表视图图标更新,画廊视图支持选择操作
问题修复
- 修复账户/预算/支出创建时元数据未正确传递的问题
- 修复看板筛选条件在列包含排序时被丢弃的问题
v0.54.2 (2026-03-23)
新功能
- 文件存储视图支持批量选择、删除和移动到文件夹
- 命令面板中的任务按最近更新时间排序
问题修复
- 修复富文本编辑器中 H4、H5 标题样式缺失的问题
- 修复时间线状态段宽度过窄时被裁剪的问题
v0.54.1 (2026-03-23)
新功能
- 资源详情页支持直接编辑 drawio、dataflow 和文本类型资源
问题修复
- 修复命令面板标题和预览内容溢出问题
- 修复 TUI 中从任务/看板元数据解析工作区工作目录的问题
v0.54.0 (2026-03-23)
新功能
- 存储类管理 — 管理后台支持存储类的创建、编辑、删除和测试,支持备份副本自动复制,用户/组/系统三级分配层级及解析总览
- 看板支持全屏模式
- Markdown 编辑器支持 H4、H5 标题级别及气泡菜单清除格式
改进
- CLI 迁移:统一基于元数据的幂等增量迁移,支持所有实体类型
问题修复
- 修复存储类编辑弹窗中密钥被遮蔽值覆盖的问题
v0.53.4 (2026-03-21)
新功能
- 工作区上限对话框新增推荐好友提示,邀请好友可解锁更多工作区
- 下载对话框中集成平台提示信息,方便查看安装说明
- 管理后台新增用户增长趋势折线图
改进
- 代码块支持水平滚动,不再溢出容器
- 对话框在小屏幕上自动滚动,布局更紧凑
- 工作区上限描述更新,提及反馈可解锁额度
问题修复
- 修复增长图表 X 轴日期标签格式异常的问题
- 修复对话框内容在小屏幕上溢出的问题
v0.53.3 (2026-03-20)
改进
- 新增独立的「在新窗口中预览」按钮,方便在新窗口中查看详情页
问题修复
- 修复详情页未能在新窗口中打开的问题
v0.53.2 (2026-03-20)
新功能
- 资源预览支持在新窗口中打开,方便并排查看
- Markdown 编辑器气泡菜单新增翻译按钮
- 下载对话框新增推荐提示,包含个人资料链接和 Discord 社区链接
问题修复
- 修复 Ctrl+Q 键盘快捷键无法正常工作的问题
v0.53.1 (2026-03-20)
问题修复
- 修复桌面应用因 SQLite 数据库迁移错误导致启动崩溃的问题
v0.53.0 (2026-03-19)
新功能
- 个人资料页新增键盘快捷键参考面板
- 新增工作区切换命令面板(Ctrl+Q)
- CLI 看板视图新增全部折叠/展开和刷新快捷键
问题修复
- 修复保存 drawio 文件时丢失原始格式的问题
- 修复 Electron 应用启动时单例锁文件未正确清理的问题
- 修复列条件构建器中的重复 case 问题
- 修复目录大纲在部分视口宽度下显示异常
- 修复旧数据库升级时 workspace_sessions 表缺失导致启动失败的问题
v0.52.0 (2026-03-19)
新功能
- 仪表盘新增可配置的查询小组件,支持自定义查询条件
- 支持调整小组件大小和排列顺序
- 小组件配置通过偏好设置自动同步到服务端
改进
- 查询字符串统一以淡色样式显示,提升可读性
问题修复
- 修复账户表缺少 group_id 列的问题
- 修复仪表盘状态持久化合并策略导致的问题
- 修复查询语法格式不正确的问题
v0.51.4 (2026-03-19)
改进
- 优化推荐奖励卡片描述内容
- 改进邀请码区域,展示推荐奖励信息
v0.51.3 (2026-03-19)
新功能
- 个人资料页新增邀请码展示和推荐奖励卡片,方便邀请人查看和复制奖励信息
v0.51.2 (2026-03-18)
新功能
- 新增推荐奖励系统 — 通过分享邀请码推荐下载桌面应用可获得奖励
- 新增下载引导弹窗,支持加入 Discord 社区和输入邀请码
v0.51.1 (2026-03-18)
改进
- 在实现工具下拉菜单中添加配置入口,方便快速访问 AI 提供商设置
问题修复
- 修复 Safari 浏览器中实体链接无法正常工作的问题
- 修复 CLI 终端看板视图未按默认标签筛选的问题
- 修复看板提示词和钩子设置的翻译缺失
v0.51.0 (2026-03-18)
新功能
- 看板添加面板全新改版 — 显示所有看板(含类型标签和归属信息),私有看板以只读形式展示,添加到共享看板时显示提醒
- 新增看板 AI 提示词设置 — 创建看板时可配置 AI 提示词
- 用户资料页显示邮箱及关联身份提供商信息
改进
- 移除看板确认弹窗增加群组名称和标签列表展示
- 所有看板(不仅限于共享看板)移除时均显示确认弹窗
- 刷新按钮增加旋转动画反馈
问题修复
- 修复个人资料页面崩溃的问题
- 改进中文翻译,表达更自然
v0.50.1 (2026-03-17)
改进
- 内部维护和稳定性优化
v0.50.0 (2026-03-17)
改进
- 增强权限审计 — 批量权限变更现在正确记录操作人并生成审计事件
问题修复
- 修复批量权限更新未追踪操作者和未触发审计事件的问题
v0.49.6 (2026-03-17)
改进
- 简化看板筛选 — 看板现在使用默认标签替代原始查询语法进行筛选
问题修复
- 修复看板设置面板中的多个 UI 问题(滚动条、边框、焦点环)
v0.49.5 (2026-03-17)
新功能
- 看板查询范围 — 看板现在支持使用板级查询筛选任务,激活时显示范围指示徽章
问题修复
- 修复页面导航时休息提醒计时器被重置的问题
v0.49.4 (2026-03-16)
新功能
- 新增 OpenCode 作为内置 AI 代理选项
- 工作区窗口数上限对话框新增感谢信息
问题修复
- 修复应用关闭时工作区关闭事件丢失的问题
- 修复 Safari 浏览器中 Markdown 链接跳转到自定义协议 URL 的问题
v0.49.3 (2026-03-16)
问题修复
- 修复甘特图中多余的滚动条和布局抖动问题
- 修复 CI 流水线中 Linux 二进制文件缺少执行权限的问题
v0.49.2 (2026-03-16)
问题修复
- 修复月度图表点击导航在 recharts v3 下不工作的问题
v0.49.1 (2026-03-16)
新功能
- 账单日图表 — 交易页面新增按日汇总的支出图表
改进
- CLI 安装简化为仅通过 npm 安装
问题修复
- 修复月度图表悬停索引类型错误
v0.49.0 (2026-03-15)
新功能
- 任务状态时间线 — 全新甘特图页面,可视化展示任务状态随时间的变化轨迹,帮助你了解任务在各状态间的流转
- 状态变更动态 — 仪表盘"最近更新"小组件替换为任务状态变更实时动态流
- 知识图谱标签过滤 — 支持在知识图谱视图中按标签筛选节点
- 看板子任务预览 — 看板卡片预览弹窗中直接展示子任务列表
v0.48.1 (2026-03-15)
新功能
- 移动端搜索结果下方显示任务预览
- 移动端命令面板新增标题/Grep 分段切换
- 看板列表视图新增分区级快速添加任务按钮
- 看板列表视图新增内联搜索和标签过滤
改进
- 标签建议按最近使用排序,替代按字母排序
问题修复
- 修复创建任务对话框标题输入框焦点环被裁切的问题
v0.48.0 (2026-03-14)
新功能
- 子任务支持拖拽排序
- 工作区展示所有窗口,不再仅显示当前看板
- 史诗视图新增"跳转到父任务"按钮
- "在外部打开"按钮改为在当前窗口内导航
- CLI:
ud unlink task新增--parent和--subtask参数
改进
- 子任务拖拽排序支持乐观更新,操作即时反馈
问题修复
- 修复仅有子任务时关系图不显示的问题
- 修复子任务标题对齐和样式问题
- 修复拖拽手柄导致布局偏移的问题
v0.47.1 (2026-03-14)
改进
- 优化 Linux 桌面应用构建流程
v0.47.0 (2026-03-14)
新功能
- 支持在 TipTap 编辑器中渲染 Mermaid 图表,支持全屏放大预览(平移缩放)和 SVG 下载
- 任务关系重构:任务详情页新增"父任务"、"子任务"、"关联任务"三个独立区域,子任务带进度条
- CLI 新增
--parent和--subtask参数,任务详情显示子任务列表 - 管理员可通过系统配置设置存储配额上限
- 本地同步支持 frontmatter 中的 parent、subtasks、linked 字段
改进
- "从已有任务添加子任务"对话框,方便快速建立子任务关系
问题修复
- 修复 Mermaid SVG 下载时 XML 解析失败的问题
- 修复亮色模式下全屏预览不可见的问题
- 修复资源详情页预览不一致的问题
- 修复上传配额校验未正确传递用户角色的问题
- 修复子任务进度计数未使用后端数据的问题
v0.46.6 (2026-03-13)
改进
- 首页访问控制功能新增展示图片
v0.46.5 (2026-03-13)
问题修复
- 修复桌面应用启动时 CLI 工具自动更新的问题,现已改为静默更新
- 修复子窗口默认尺寸过小的问题,现在默认显示桌面视图
- 移除了自动弹出 DevTools 的行为
v0.46.4 (2026-03-13)
问题修复
- 修复 Linux 系统托盘图标显示为灰色的问题(转换为 sRGB 色彩空间)
- 优化子窗口打开速度,兜底计时器从 5 秒缩短至 500 毫秒
v0.46.3 (2026-03-13)
问题修复
- 修复 Linux 桌面应用子窗口显示问题,增加兜底显示计时器和错误处理
- 修复 macOS 和 Windows 桌面应用的原生模块构建问题
v0.46.2 (2026-03-13)
改进
- 看板列表页新增移动端看板选择器和视图切换
问题修复
- 修复全新数据库首次启动时迁移失败的问题
- 修复看板更新时工作区工作目录等元数据丢失的问题
- 修复标签换行显示的问题
- 修复移动端侧边栏切换按钮不易点击的问题
- 修复 Linux 桌面应用终端无法渲染的问题
v0.46.1 (2026-03-12)
问题修复
- 修复已过期的登录会话缓存可能绕过登录页,导致显示引导对话框的问题
v0.46.0 (2026-03-12)
改进
- 数据库升级机制改用版本化 SQL 迁移,升级更可靠
- 修复桌面版(SQLite)启动时可能因旧数据库字段导致崩溃的问题
v0.45.2 (2026-03-12)
新功能
- 命令面板搜索结果高亮显示匹配关键词,并支持预览备注内容
- 导航命令整合为 /nav 子菜单,命令面板更简洁
问题修复
- 修复看板侧边栏图标未直接跳转到所选看板的问题
- 修复 /board 命令未正确跳转到所选看板的问题
v0.45.1 (2026-03-12)
改进
- 新增集成测试框架,提升版本发布质量保障
v0.45.0 (2026-03-12)
新功能
- 命令面板新增 Grep 搜索模式,按 Tab 切换标题搜索和全文搜索(标题+描述+备注)
- 工作区任务面板新增"前往看板"按钮
- 资源预览支持多种文本格式、Markdown 预览以及 docx/xlsx 预览
- 任务附件支持文本资源
v0.44.5 (2026-03-11)
新功能
- 命令面板新增 /windows 命令,快速切换工作区窗口
- 数据流节点支持描述字段,可通过编辑按钮和悬浮提示查看
改进
- 对比页面改用亮点图库展示核心优势
问题修复
- 修复看板窗口标题未显示所选看板名称的问题
v0.44.4 (2026-03-11)
问题修复
- 修复只读共享任务仍显示历史记录操作的问题
- 修复工作区终端未继承看板配置工作目录的问题
v0.44.3 (2026-03-11)
新功能
- 工作区新增窗口数量限制,可通过许可证密钥解锁更多窗口
- 工作区任务面板中任务标题下方显示任务 ID
问题修复
- 修复退出登录或清理预设数据后财务数据未刷新的问题
- 修复移动端显示创建看板按钮的问题
v0.44.2 (2026-03-11)
新功能
- 工作区任务面板新增工作区切换下拉菜单
- 独立编辑器新增"保存到 UnDercontrol"按钮
问题修复
- 修复可视化编辑器中 frontmatter 块损坏的问题
- 修复编辑器模式切换时实例未正确隔离的问题
v0.44.1 (2026-03-11)
新功能
- 看板页面新增内联工作区栏
问题修复
- 修复看板拖拽时页面水平滚动的问题
- 修复光标移出滚动容器边缘后自动滚动仍继续的问题
- 修复看板拖拽到屏幕外列及右侧边距的问题
- 修复工具栏滚动消失的问题,现已固定在标题栏下方
- 修复只读共享任务仍显示编辑操作的问题
v0.44.0 (2026-03-10)
新功能
- 桌面应用内置独立 Markdown 编辑器,可直接打开 .md 文件进行编辑
问题修复
- 修复 Electron 自定义协议过滤缺失的问题
v0.43.0 (2026-03-10)
新功能
- TUI 全新 k9s 风格界面:三栏布局、双列顶栏、品牌展示与上下文信息
- TUI 看板视图:垂直列布局,支持展开/折叠,看板钻入浏览
- TUI 工作区支持:从任务详情启动工作区,PTY 管理,操作选择器
- TUI 中使用
$EDITOR编辑任务,支持 frontmatter 格式 - TUI 通过编辑器创建新任务
- TUI
/快捷键过滤所有资源视图 :ctx命令切换上下文,显示 API URL 和用户信息- TUI 任意视图进入命令模式
- TUI 后端在线状态指示器
- CLI 资源短名称和复数别名
- "打开 Claude(任务上下文)" 工作区操作
改进
- 过滤模式下支持上下箭头导航表格
问题修复
- 修复费用表格填充导致日期列截断的问题
- 修复离开工作区选择器后视图未恢复的问题
- 修复工作区分离/重新连接时 goroutine 泄漏的问题
- 修复工作区重新连接时 TUI 布局异常的问题
v0.42.1 (2026-03-09)
改进
- 看板字段和占位符新增国际化支持
问题修复
- 修复 Hook 开关需要正确项目目录上下文的问题
v0.42.0 (2026-03-09)
新功能
- 看板权限系统:支持设置只读看板,任务权限以看板为上限
- 看板分享弹窗新增权限开关
- 共享任务和看板的只读视觉反馈
- 分享任务至看板群组时自动转移所有权
- 富文本编辑器中点击图片可放大预览
- 看板创建按钮移至设置按钮旁,操作更便捷
- 项目级 Hook 注入,支持按看板开启/关闭
改进
- 富文本编辑器中图片显示更简洁(去除圆角)
问题修复
- 修复拖拽覆盖层溢出看板容器边界的问题
- 代码块支持横向滚动,不再自动换行
- 修复代码块中空白符处理的问题
- 修复动态传感器导致的拖拽错误
v0.41.6 (2026-03-09)
改进
- 看板拖拽排序现在跨页面刷新后仍保持顺序
问题修复
- 修复看板列显示查询的问题
- 修复看板任务拖拽排序反馈不一致的问题
- 修复默认查询排序顺序的问题
v0.41.5 (2026-03-09)
问题修复
- 修复 Windows 上 PowerShell 参数转义导致 CLI 命令执行失败的问题
- 修复 Windows 上工作区命令中变量分词错误的问题
v0.41.4 (2026-03-08)
改进
- 内部代码优化和维护性改进
v0.41.3 (2026-03-08)
改进
- 桌面应用工作区代理启动更快——技能提示词在构建时嵌入,无需运行时调用 CLI
v0.41.2 (2026-03-08)
改进
- CLI 默认 API 地址改为官方服务器(ud.oatnil.com)
- 工作区桌面操作使用确认对话框替代提示气泡,操作更明确
问题修复
- 修复看板拖拽排序后卡片顺序未持久化的问题
- 修复工作区代理命令执行的可靠性问题
v0.41.1 (2026-03-08)
问题修复
- 修复标签条件筛选中的无限循环问题,避免页面卡死
v0.41.0 (2026-03-08)
新功能
- 多账户切换:支持保存最多 5 个账户并快速切换,无需退出登录,可在侧边栏、登录页和个人资料页使用
- CLI 任务看板查看:
ud task现在显示任务所属的看板 - 统一引导流程:访客账户创建与示例数据生成分为独立步骤,有清晰的进度提示
- 定时任务:「立即执行」升级为直接按钮,操作更便捷;预设数据清理默认关闭
改进
- 偏好设置持久化到 localStorage,页面加载即时渲染
问题修复
- 修复仪表盘图表渲染警告
- 修复缓存中过期的固定任务未清理的问题
v0.40.0 (2026-03-08)
新功能
- ud vs Obsidian 对比页面:全新的产品对比落地页,包含功能对比表、熟悉功能清单和痛点解决方案
- 首页新增 Obsidian 对比展示区,配图片画廊
- 登录后引导对话框,支持语言选择
- 管理员工作区管理页面,可全局监控守护进程和会话
- CLI
ud apply支持 board 字段,可直接创建看板任务 - Windows 远程工作区代理支持(PowerShell 钩子脚本)
- 工作区监控页面新增刷新按钮
- 新增远程工作区搭建指南(应用内文档)
改进
- /tasks 路径重定向至看板视图
- 固定任务缓存采用 stale-while-revalidate 策略,渲染更快
问题修复
- 修复看板卡片拖拽超出最后一列时浮动在外的问题
v0.39.0 (2026-03-07)
新功能
- 远程工作区:全新的远程工作区系统,支持守护进程注册与发现、SSE 实时事件推送、会话跟踪与代理启动、工作区控制信号(停止/读取新指令)、操作黑名单安全机制,以及前端触发与查看界面
- 任务笔记 SSE 实时通知,支持工作区实时更新
问题修复
- 修复 CLI 在 Claude Code 代理会话中无法执行 ud 命令的问题
- 修复 CLI 传递 task_id 作为提示词给 Claude Code 代理的问题
- 增强 CLI 守护进程稳定性:安全的 ID 截断、SSE 退避重置、一致的错误处理
- 修复 SSE 端点响应拦截器导致的连接问题
v0.38.10 (2026-03-06)
问题修复
- 移除订阅桌面版区域的中国下载选项
v0.38.9 (2026-03-06)
问题修复
- 修复无提示词时仍启动代理执行的问题
- 改进看板类型选择 — 默认为共享看板,描述更清晰
v0.38.8 (2026-03-06)
新功能
- 看板项目设置新增目录路径选择器
问题修复
- 优化任务描述时的上下文提示顺序
v0.38.7 (2026-03-06)
问题修复
- 修复 ud CLI skills 命令兼容性问题
- 修复非 Claude AI 代理的提示词上下文处理
- 修复 Windows 上提示词参数分割问题
v0.38.6 (2026-03-06)
问题修复
- 修复 Codex CLI 提示词处理问题,正确合并系统提示词和用户提示词
- 修复传递提示词给 Codex 时的参数分割问题
v0.38.5 (2026-03-06)
新功能
- 命令行工具:
set-context命令新增登录提示,login命令支持--name/-n参数,简化认证流程
问题修复
- 修复工作区终端未正确解析用户完整 PATH 的问题
- 移除命令面板中已废弃的 /view 命令
v0.38.4 (2026-03-06)
问题修复
- 修复 Windows 桌面应用工作区启动时 PowerShell 命令解析失败的问题
v0.38.3 (2026-03-06)
新功能
- 仪表盘账户和预算小组件新增最近记录展示
- 仪表盘交易小组件显示最近 3 条交易记录
- 命令行工具新增 migrate 命令,支持服务器间数据迁移
问题修复
- 修复仪表盘账户环形图颜色不一致的问题
- 修复仪表盘账户小组件布局与预算、交易小组件不对齐的问题
- 修复命令行工具 saved-query 和 task-view 列表响应格式
v0.38.2 (2026-03-06)
改进
- 内部稳定性和工具链改进
v0.38.1 (2026-03-06)
新功能
系统信息查看
- 管理员可在系统配置页面直接查看数据库类型、版本和大小等元数据
数据流导出为 AI 提示词
- 数据流图表支持一键复制为结构化提示词,方便在 AI 工具中使用
保存查询中删除任务
- 支持在保存查询的结果列表中直接删除任务,无需跳转
改进
- AI 助手现在会描述当前正在处理的任务上下文
- 预设保存查询名称和数据清理任务支持中英文翻译
问题修复
- 修复数据流复制提示词生成的 JSON 格式问题
- 修复命令行工具安装配置问题
v0.38.0 (2026-03-05)
新功能
看板创建体验升级
- 看板头部新增醒目的「创建看板」按钮,轻松创建自定义看板
- 创建看板对话框支持高级设置(描述、可见性),默认展开方便配置
- 在系统看板上使用时,会引导您创建自己的自定义看板
新用户预设数据
- 新注册用户自动获得示例数据,帮助快速了解和体验应用功能
- 支持标签化清理,随时一键删除所有预设数据
桌面应用 CLI 自动配置
- 桌面应用登录后自动配置命令行工具的个人上下文,无需手动设置
改进
- 新用户引导任务从 30 个精简为 10 个,内容更准确实用
- 共享看板描述更清晰地说明协作功能
问题修复
- 修复点击创建看板按钮时的崩溃问题
- 修复欢迎任务中预设数据清理链接显示异常
- 修复 Windows 平台命令行工具路径设置问题
v0.37.9 (2026-03-05)
改进
- 桌面应用启动时自动安装 ud 命令行工具并配置 Claude Code hooks,无需手动设置
问题修复
- 修复 Windows 平台命令行工具安装路径与工作区终端不匹配的问题
- 移除个人资料页中的手动 CLI 安装选项(已改为自动安装)
v0.37.8 (2026-03-05)
问题修复
- 修复 Windows 平台命令行工具兼容性问题
- 修复桌面应用包标识问题
v0.37.7 (2026-03-05)
改进
- 首页功能展示新增资源管理相关展示图片,更直观地了解资源管理功能
v0.37.6 (2026-03-05)
新功能
- 首页新增「下载桌面应用」按钮,方便快速下载桌面客户端
- 命令行工具新增 get/describe 命令,支持查看支出、预算和账户详情
v0.37.5 (2026-03-04)
改进
- 关闭主窗口确认对话框支持中英文双语显示
v0.37.4 (2026-03-04)
新功能
看板终端
- 在看板头部直接打开 AI 代理终端,支持同时运行多个终端
- 为每个操作选择不同的 AI 代理,支持临时工作区操作
实时状态更新
- 工作区状态通过 Server-Sent Events 实时更新,响应更快更可靠
关闭确认
- 当有子窗口(工作区)打开时,关闭主窗口前会弹出确认提示,防止误关闭
问题修复
- 修复看板终端提示包含不必要的任务上下文的问题
- 修复无提示词时代理无法交互式启动的问题
- 修复代理选择下拉菜单被遮挡的问题
v0.37.3 (2026-03-04)
新功能
史诗视图(Epic View)
全新的任务子树可视化页面,以树形结构展示任务层级关系:
- 从任务详情页进入 Epic View,查看完整的子任务树
- 支持展开/折叠所有节点,快速浏览或聚焦特定分支
- 快速添加子任务,直接在树中创建新的子任务
- 任务标题可直接点击,快速跳转到任务详情
子任务进度指示器
- 任务列表和任务详情页显示子任务完成进度
- 关联任务区域显示进度条,一目了然
工作区事件历史
- 监控页面现在追踪工作区状态变化历史
- 工作区打开时自动标记为空闲状态,确保事件追踪准确
改进
- 首页在移动端使用水平标签页布局,浏览更便捷
问题修复
- 修复看板卡片在刷新或创建新卡片后消失的问题
- 修复工作区监控页面未始终显示事件历史的问题
v0.37.2 (2026-03-04)
问题修复
- 修复工作区操作导致页面无限重渲染的问题
v0.37.1 (2026-03-04)
新功能
全新首页功能展示
- 首页功能卡片支持点击交互,展示多图画廊、自动轮播、左右导航和点击放大灯箱
- 新增「立即试用」按钮,访客可从首页直接体验平台
- 更新了任务、财务、工作区、资源和本地同步等功能描述
工作区窗口状态标识
- 工作区窗口标题显示状态表情符号,方便一眼掌握工作状态
问题修复
- 修复看板列加载时无限请求循环的问题
- 修复代理选择器中的无限循环问题
- 修复关联任务排序改为按更新时间排序
- 移除移动端不可用的 PDF 导出按钮
v0.37.0 (2026-03-04)
新功能
工作区设置重构
- 设置页面重新组织为 CLI、工作区和集成三个独立板块,导航更清晰
- 内置工作区操作和代理 CLI 现在以只读方式显示在设置中
- 点击内置操作和代理可查看完整详情
可配置代理 CLI 和按任务设置工作目录
- 支持添加自定义代理 CLI,灵活配置工作区自动化
- 支持为每个任务配置独立的工作目录
- 看板和任务工作区支持 CLI 上下文配置
快速添加自定义操作
- 工作区下拉菜单新增"添加自定义操作"快捷入口
- 自定义操作表单预填实用示例,开箱即用
改进
- 看板设置和看板下拉菜单完整支持多语言
问题修复
- 修复自定义操作提示词包含多余占位符的问题
v0.36.9 (2026-03-03)
新功能
- 工作区操作现在使用模板系统,组织更清晰
- AI 代理进入规划模式时显示绿色"规划中"状态
- 工作区下拉菜单新增"检查实现"操作
问题修复
- 移除看板实现工具选项中无效的"shell"选项
v0.36.8 (2026-03-03)
问题修复
- 调整看板卡片工作区状态圆点大小,与相邻图标保持一致
v0.36.7 (2026-03-03)
问题修复
- 修复看板卡片在没有打开工作区窗口时也显示状态圆点的问题
v0.36.6 (2026-03-03)
新功能
资源标签
- 资源现在支持添加标签,方便分类和检索
看板代理状态
- 看板卡片上直接显示工作区代理状态,一目了然
问题修复
- 统一工作区状态颜色,视觉更一致
v0.36.5 (2026-03-03)
新功能
工作区增强
- 工作区下拉菜单新增"打开终端"选项,快速打开 Shell
- AI 代理现在知道当前任务 ID,能提供更有针对性的帮助
问题修复
- 修复看板创建任务对话框默认聚焦在描述而非标题的问题
- 修复工作区代理在权限和输入对话框期间状态未更新的问题
v0.36.4 (2026-03-03)
改进
- 移除记账和收入对话框中的计算器组件,界面更简洁
- AI 代理空闲状态改用蓝色标识,与工作状态区分更清晰
问题修复
- 修复剩余公共页面无法垂直滚动的问题
v0.36.3 (2026-03-03)
新功能
工作区监控
- 新增工作区监控页面,鸟瞰所有活跃工作区的状态
- 可通过命令面板快速打开工作区监控
- 工作区任务面板提供快捷按钮,一键跳转到主窗口查看和编辑任务
改进
- 工作区面板中任务标题旁显示状态图标,方便快速识别
问题修复
- 修复工作区任务面板中状态图标对齐问题
v0.36.2 (2026-03-02)
改进
- 桌面应用个人资料页新增 CLI 安装提示,方便快速安装命令行工具
问题修复
- 修复工作区数量限制对话框跳转到错误页面的问题
- 修复公共页面(订阅/联系/文档)无法垂直滚动的问题
v0.36.1 (2026-03-02)
改进
- 窗口标题新增 WK/Task 前缀,方便快速识别不同窗口
问题修复
- 修复看板页面出现双重水平滚动条的问题
- 修复不同工作区之间 AI 代理状态互相串扰的问题
v0.36.0 (2026-03-02)
新功能
AI 工作区实时状态检测
- 工作区窗口现在实时显示 AI 代理的运行状态(工作中/空闲/离线)
- 状态通过表情符号前缀直观展示在窗口标题中
- 空闲状态使用醒目的琥珀色指示器,便于快速注意
任务固定
- 任务详情页新增固定/取消固定按钮,将重要任务置顶显示
Electron 任务窗口
- 在桌面应用中为任务打开独立窗口,支持多任务并行处理
- 窗口标题显示任务名称,方便识别
注册语言偏好
- 注册表单新增语言偏好选择,首次使用即可设置界面语言
改进
- 工作区笔记按创建时间倒序排列,最新笔记始终在顶部
v0.35.7 (2026-03-01)
新功能
工作区体验优化
- 工作区窗口标题栏现在显示任务名称,方便识别不同任务对应的工作区
- 看板任务预览弹窗新增「开始实现」按钮,无需打开任务详情即可直接启动实现
改进
- 跳转到 CLI 安装页面前增加确认对话框,避免意外导航
v0.35.6 (2026-03-01)
新功能
ud CLI 资源同步增强
- 新增
--concurrent并发同步标志,大幅提升文件同步速度 - 新增过滤标志,支持按条件选择性同步文件
问题修复
- 修复看板列滚动条显示问题,保持滚动功能的同时隐藏滚动条
v0.35.5 (2026-03-01)
新功能
休息提醒小组件
仪表盘新增休息提醒小组件,帮助您定期休息:
- 倒计时计时器,支持自定义间隔(支持小时、分钟、秒,如 "2m3s")
- 应用内弹窗提醒,支持自定义提醒标题
- 系统通知被屏蔽时自动播放提示音
交易小组件
仪表盘的支出小组件升级为交易小组件,新增环形图直观展示收支分布。
保存查询改进
- 保存的查询支持一键复制
- 创建查询对话框升级为抽屉式布局,新增预设快捷查询
- 新增「AI 生成(无看板)」预设查询
问题修复
- 修复休息提醒相关的多个问题(通知发送、倒计时显示、计时器停止等)
- 修复弹窗标题固定显示"定时提醒"而非自定义消息的问题
- 修复输入有误时仍可开启开关的问题
v0.35.4 (2026-03-01)
新功能
任务自定义元数据
在任务详情页查看所有元数据字段,并直接添加自定义键值字段。
保存查询任务操作
在保存的查询结果行中直接更改任务状态和分享任务到看板。
问题修复
- 修复非 ASCII 标题的任务无法创建 tmux 会话的问题
v0.35.3 (2026-02-28)
新功能
预算共享到群组
支持将预算共享给群组,使用 Unix 风格的权限控制(读取/写入/管理),方便团队协作管理预算。
问题修复
- 修复手机端有子分类但无数据时现金流汇总不显示的问题
v0.35.2 (2026-02-28)
新功能
个人版工作窗口数量限制
个人版用户现在最多可同时打开 2 个实现窗口。达到上限时会弹出提示,引导升级到 Pro 版解锁无限窗口。
个人版凭据显示
个人版用户可在个人资料页查看默认登录凭据,方便在命令行工具或其他客户端中使用。
命令行工具安装检测
使用「开始实现」功能时,应用会自动检测 ud 命令行工具是否已安装,未安装时会引导前往安装页面。
v0.35.1 (2026-02-28)
新功能
从桌面应用安装命令行工具
现在可以直接在桌面应用中安装 ud 命令行工具,无需再通过 Homebrew 手动下载。前往设置 > 集成设置,一键安装即可在终端中使用。
- 一键安装,自动配置系统 PATH
- 显示安装状态和路径
- 自动识别通过 Homebrew 等包管理器安装的 CLI
任务详情刷新按钮
任务详情页新增刷新按钮,可快速重新加载最新数据。
问题修复
- 修复手机端月度收支柱状图显示问题
v0.35.0 (2026-02-28)
新功能
工作区:AI 驱动的任务实现
从看板直接启动任务实现,全新的嵌入式终端工作区让 AI 辅助编程更顺畅:
- 任务详情页新增「开始实现」按钮,一键进入实现流程
- 嵌入式终端工作区自动加载任务上下文,启动 Claude Code
- 看板支持配置项目目录,工作区自动在正确的目录下打开
月度收支柱状图
交易页面新增按月收入/支出柱状图,直观展示每月收支对比,默认折叠显示。
改进
- 看板编辑对话框升级为抽屉式布局,新增项目目录配置
v0.34.7 (2026-02-27)
新功能
命令面板预览
命令面板新增预览面板,支持在左右分栏布局中查看任务描述
改进
- 身份提供商设置页面支持中英文切换
问题修复
- 修复本地同步推送任务后,当前视图不会自动刷新的问题
v0.34.6 (2026-02-27)
问题修复
- 修复自部署场景下跨域 API 地址处理问题
- 修复身份认证配置页面的重定向 URL 显示
v0.34.5 (2026-02-26)
新功能
预算月度视图
全新的月度预算视图,支持按月查看和管理预算,通过月份选择器轻松切换,更好地追踪每月支出情况。
预算概念说明页
新增预算概念文档页面,帮助您理解预算管理中的各项术语和概念。
改进
- AI「手气不错」功能现在会显示来源任务引用,提供更好的上下文信息
问题修复
- 修复预算页面在移动端的布局问题
v0.34.4 (2026-02-26)
新功能
Feel Lucky 仪表盘小组件
仪表盘新增「手气不错」知识探索小组件,随机发现和探索您的知识库内容。
AI 提供商国际化
AI 提供商配置对话框和设置区域现已完整支持中英文双语。
改进
- 新增 AI 提供商配置操作指南
问题修复
- 修复操作指南导航重定向问题
- 修复任务图片识别和视觉任务创建时的文件上传路径
- 修复 AI 提供商启动配置
- 改进 Feel Lucky 功能的 AI 错误处理
v0.34.3 (2026-02-25)
新功能
内容大纲(目录)
任务详情页新增内容大纲功能,自动检测当前可见区域的标题并显示目录导航:
- 支持任务描述和备注中的标题导航
- 普通视图和禅模式均可使用
- 平滑的淡入淡出动画效果
侧边栏切换按钮重新设计
全新的侧边栏切换按钮设计,采用右侧竖线加圆形按钮样式,更简洁优雅。
禅模式增强
- 禅模式下新增右侧边缘返回按钮
- 禅模式下也可使用内容大纲
侧边栏自动折叠
进入任务详情页时左侧边栏自动折叠,为阅读留出更多空间。
改进
- 双击编辑时自动聚焦并定位光标到点击位置
- 编辑内容时自动隐藏内容大纲,避免干扰
- 内容大纲显示区域更宽,阅读更舒适
- 移除任务详情页的 PDF 导出按钮,界面更简洁
问题修复
- 修复打印视图页眉页脚显示问题,保留页码
- 修复侧边栏切换按钮与滚动条重叠的问题
- 修复侧边栏折叠/展开时内容大纲位置未更新的问题
v0.34.2 (2026-02-25)
新功能
看板截止日期显示
看板列表视图和看板卡片现在直接显示任务的截止日期,方便一目了然地追踪时间敏感的任务。
@ 提及菜单
在富文本编辑器中输入 @ 即可调出提及菜单,快速搜索并引用任务、预算等实体。
问题修复
- 修复截止日期跨年时未显示年份的问题
- 修复截止日期未根据语言设置显示对应日期格式的问题
- 优化截止日期在任务标题后的对齐显示
- 修复列表行中截止日期徽章对齐不一致的问题
- 修复 @ 提及菜单的方向键导航问题
- 修复 Chrome 扩展源码链接地址错误
v0.34.1 (2026-02-24)
新功能
- 命令面板新增
/localsync命令,快速触发本地同步
问题修复
- 修复任务以只读方式分享时,任务所有者无法编辑的问题
- 修复本地同步无法解析包含空格的文件名(如中文文件名)
v0.34.0 (2026-02-23)
新功能
扁平文件本地同步
本地同步全面升级为扁平 .md 文件格式,替代原来的嵌套 UUID 文件夹结构,让您可以在文件管理器或 Obsidian 中更方便地浏览和编辑任务。
Wikilink 与 Markdown 链接解析
同步时自动识别和解析任务之间的 [[wikilink]] 和 [文本](./文件.md) 链接,保持任务之间的关联关系。
全量推送到远端
新增「全量推送」按钮,一键将所有本地文件强制推送到应用。
任务导航历史
任务详情页新增浏览器风格的前进/后退导航箭头,方便在任务之间快速切换。
改进
- 推送/拉取按钮现在清晰显示方向(本地 → 应用,应用 → 本地)
- 纯
.md文件无需 frontmatter 即可作为任务导入,使用默认字段值 - 本地同步在设置中升级为独立区域
问题修复
- 修复 macOS 程序坞图标尺寸和比例问题
- 导航箭头始终可见,支持缓存回退
v0.33.2 (2026-02-20)
新功能
账户资产趋势图
账户首页新增多折线资产趋势图,直观展示资产变化:
- 默认显示近 3 个月趋势,支持切换时间范围
- 图表默认折叠,点击展开查看
- 数据点标注真实记录日期
账户历史备注
账户历史记录新增备注字段,方便记录每笔变动的说明。
CSV 导出
支持在客户端直接导出账户数据为 CSV 文件。
资源元数据
资源上传流程支持添加元数据,并新增元数据更新接口。
CLI 文件夹同步
新增 ud sync resource 命令,支持递归同步本地文件夹到云端。
改进
- 访客模式下账户历史预设数据更丰富,趋势图展示效果更好
问题修复
- 修复趋势图 X 轴刻度重复显示相同日期的问题
- 修复生成预设账户历史时丢失原有日期的问题
- 修复访客账户历史时间点未对齐的问题
v0.33.1 (2026-02-20)
新功能
命令面板快捷提示栏增强
- 新增快捷提示栏显示/隐藏开关,让工作区更简洁
- 新增「新标签页打开」和「复制链接」快捷操作,提示项支持点击触发
- 快捷键提示改用文本标签显示,更加清晰易读
npm 安装 ud CLI
ud CLI 现在可通过 npm 安装:npm install -g @oatnil/ud
改进
- Web Clipper 现在同时支持 Markdown 和 SingleFile HTML 两种格式
- 应用内安装文档更新,新增 npm 和 Homebrew 安装方式说明
v0.33.0 (2026-02-19)
新功能
新用户预设保存查询
新注册用户自动获得一组预设的保存查询,帮助您快速上手使用。
CLI 看板命令
命令行工具新增看板相关命令:获取、查看详情和添加看板。
访客收入预设数据
访客账户现在包含预设收入数据,方便体验完整功能。
改进
- 个人版登录状态延长至 7 天,无需频繁重新登录
- 首页架构图各节点新增简要说明,更清晰展示系统组成
问题修复
- 修复移动端交易筛选栏高度和对齐问题
v0.32.0 (2026-02-18)
新功能
收入管理与统一交易页面
全新的收入跟踪功能和统一交易页面,让您在一个地方管理所有收支:
- 新增收入记录功能,支持收入详情页和交易跳转
- 统一交易页面,同时查看支出和收入
- 创建收入时自动填充默认标题
现金流概览
在交易页面新增现金流汇总功能:
- 实时查看收支汇总
- 支持多币种展示
- 添加或删除支出/收入后自动刷新
预算进度追踪
交易侧边栏新增预算进度条,直观了解预算使用情况:
- 各预算独立进度条
- 总支出/预算汇总进度条
隐私模式
交易页面新增隐私模式开关,一键隐藏金额信息。
任务 PDF 导出
支持将任务及其备注导出为 PDF 文件。
改进
- 交易图标和金额颜色简化,视觉更清晰
- 现金流汇总布局更紧凑
问题修复
- 修复创建支出时未使用预算货币的问题
- 修复队列任务列表页面自动刷新的问题
v0.31.1 (2026-02-15)
改进
官网展示优化
- 应用展示区全新改版,采用自动轮播幻灯片展示真实产品截图
- SaaS 订阅区域重新设计,视觉效果更佳
- 架构图支持交互式节点预览,点击节点可查看对应的应用画面
- 架构图新增桌面应用、Apple 快捷指令、存储选项等节点
问题修复
- 修复对话框无障碍访问问题
v0.31.0 (2026-02-15)
新功能
Web Clipper (Chrome 扩展)
全新 Chrome 浏览器扩展,一键将网页保存为 UnDercontrol 任务:
- 点击扩展图标,编辑标题,保存整个页面
- 使用 SingleFile 技术将页面捕获为完整的 HTML 快照
- 快照作为资源附件自动关联到新创建的任务
- 订阅页面新增 Web Clipper 介绍和文档入口
CLI 多账户支持
CLI 工具新增 --context 标志,支持临时切换上下文:
- 无需修改默认配置即可快速访问不同账户/服务器
- 例如:
ud --context work get task临时使用 work 上下文 - 应用内文档更新,包含完整的多账户使用指南
v0.30.1 (2026-02-14)
Bug Fixes
- 修复构建错误,提升应用稳定性
v0.30.0 (2026-02-14)
新功能
文件系统式资源浏览
资源页面全新升级为文件系统风格的浏览体验:
- 创建文件夹,将文件整理到不同目录中
- 面包屑导航,快速切换目录层级
- 点击
..返回上一级目录 - 列表视图和画廊视图都支持文件夹浏览
拖拽管理文件
- 拖拽文件到文件夹即可移动
- 从桌面拖拽文件直接上传到当前目录
文件列表排序
- 点击列标题(名称、大小、创建时间、更新时间)即可排序
- 箭头指示当前排序方向
看板快速添加任务
- 在看板列表视图中快速输入并通过 AI 创建任务
改进
- AI 识别的小票自动归档到
/system/expense-from-vision/目录 - AI 识别的任务图片自动归档到
/system/task-from-vision/目录
v0.29.1 (2026-02-13)
改进
- 保存的查询项新增刷新图标,快速重新执行查询
v0.29.0 (2026-02-13)
新功能
预算预测账本
新增预算预测功能,查看预算余额随时间的变化趋势。
预算明细时间线
全新的时间线视图,展示预算计划和一次性调整:
- 在时间线中直接添加计划和一次性调整
- 侧边栏显示相关支出,全面掌握预算动态
快捷导航链接
- 从支出详情直接跳转到关联账户
- 从支出详情直接跳转到关联预算
- 在预算详情页直接添加支出
改进
- 支出设置了关联账户时,账户链接图标始终可见
- 创建预算时显示货币字段(只读),明确当前选择的货币
问题修复
- 修复对话框中预算货币使用硬编码 CNY 的问题,现在正确使用预算自身的货币
- 修复计划和调整对话框中的日期格式问题
- 修复时间线对齐问题
- 修复编辑器源码模式中多余的顶栏
- 修复主题偏好订阅中的默认值问题
v0.28.5 (2026-02-13)
新功能
AI 翻译
在编辑器中选中文本,通过气泡菜单即可使用 AI 翻译功能。
增强的 AI 气泡菜单
- 编辑模式下新增"Ask AI"按钮,快速获取 AI 辅助
- AI 结果弹窗新增复制按钮,一键复制 AI 生成内容
- 复制后显示勾选反馈,操作更直观
问题修复
- 修复使用 AI 文本优化时可能出现的崩溃问题
- 修复 AI 聊天输入框自动调整大小的问题
v0.28.4 (2026-02-12)
构建失败 - 已被 v0.28.5 取代。
v0.28.3 (2026-02-12)
问题修复
- 修复 AI 聊天选择任务上下文时导致过多网络请求的问题
v0.28.2 (2026-02-12)
改进
- AI 聊天现在会将任务笔记作为上下文发送给 AI,让 AI 能更全面地了解你的任务信息
问题修复
- 修复预算详情页浮动操作按钮显示的问题
- 修复看板任务预览弹窗显示过时数据的问题
v0.28.1 (2026-02-12)
新功能
队列任务页面
新增队列任务管理页面,可以直接在应用中查看和监控后台队列任务的执行状态,支持一键重试失败的任务。
问题修复
- 修复队列页面空状态的显示问题
v0.28.0 (2026-02-11)
新功能
UDQ 内联任务查询块
在 Markdown 文档中嵌入动态任务查询。使用 udq 代码块,通过状态、优先级、标签等条件查询任务,结果实时渲染在文档中。
Discord 社区
联系页面新增 Discord 社区邀请链接,方便加入社区交流。
问题修复
- 修复全屏编辑器(DrawIO 图表、思维导图)被侧边栏遮挡的问题
- 修复个人资料页面 API Key 标签重复显示的问题
- 修复个人资料页面内容宽度未充分利用可用空间的问题
v0.27.2 (2026-02-10)
新功能
CLI 文件上传与附件管理
通过命令行直接上传文件并关联到任务,无需打开网页。
ud upload resource <文件路径>— 上传文件到资源库ud attach resource <资源ID> --entity-type <类型> --entity-id <ID>— 将资源关联到任务等实体- 上传时可直接指定关联目标,一步完成上传和绑定
v0.27.1 (2026-02-10)
新功能
数据流 AI 生成
在数据流图编辑器中新增 AI 生成功能,支持多种 AI 提供商,通过自然语言描述快速生成数据流图。
改进
- 编辑数据流图时侧边栏自动隐藏,提供更大的编辑空间
v0.27.0 (2026-02-10)
新功能
标签管理页面
新增专用标签管理页面,左侧展示所有标签列表,右侧显示所选标签下的任务。支持按使用次数、字母顺序和最近使用排序,支持搜索过滤,支持分页加载更多任务。
- 左右分栏布局,一目了然
- 标签列表显示使用次数、颜色标记
- 点击标签即可查看关联的所有任务
- 支持删除未使用的标签
v0.26.0 (2026-02-09)
新功能
标签智能补全
所有标签输入框现在都会自动显示您已有标签的建议。聚焦输入框即可看到建议列表,无需手动输入,批量添加标签时下拉菜单保持打开状态。
改进
- 标签统一显示为
#标签药丸样式,整个应用视觉一致 - 标签名称现在支持特殊字符
问题修复
- 修复保存任务标签后建议列表未刷新的问题
v0.25.5 (2026-02-09)
新功能
kubectl 风格 CLI 命令
CLI 现在支持 get、describe、apply、delete 等顶层命令来管理任务,操作更直观高效。
改进
- 保存的查询任务行支持在新标签页中打开
- 应用内 CLI 文档更新,新增 kubectl 风格命令参考
- 查询文档新增完整文档站链接
v0.25.4 (2026-02-08)
新功能
侧边栏高级搜索
侧边栏新增高级搜索入口,快速导航到搜索页面。
CLI 备注应用命令
新增 ud task note apply 命令,通过 CLI 直接创建或更新任务备注。
改进
- 管理后台用户、角色、分组页面采用全新的移动端优先卡片布局,在手机上浏览更便捷
问题修复
- 修复链接弹窗中 Ctrl/Cmd+Enter 导致命令面板误选额外项目的问题
v0.25.3 (2026-02-08)
新功能
自然语言搜索
在高级搜索页面中使用自然语言查询您的数据,无需记忆复杂的查询语法。
v0.25.2 (2026-02-08)
改进
- 查询构建器简易模式现在支持所有字段类型(文本、数字、日期、布尔、选择等),每种类型提供对应的输入控件
问题修复
- 修复查询构建器中 CONTAINS_ALL 生成错误语法的问题
v0.25.0 (2026-02-07)
新功能
保存的查询
保存常用的任务搜索查询,方便随时快速复用。展开任务行可直接查看任务描述和备注,无需跳转到详情页。
侧边栏分组折叠
导航栏现在按功能分组,支持折叠和展开,让导航更整洁有序。
改进
- 更新应用图标
问题修复
- 修复看板视图中 Ctrl+Enter 导致重复创建任务的问题
- 修复保存的查询中自定义字段验证和自动填充的问题
v0.24.0 (2026-02-06)
新功能
看板任务创建自动匹配列条件
在特定列中创建任务时,任务会自动继承该列的筛选条件值。例如在「高优先级」列中新建任务,会自动设置为高优先级。
自定义字段命名空间系统
自定义字段名称现在支持中文等 Unicode 字符,让您可以用更自然的方式命名字段。
改进
- 看板列操作支持中英文多语言切换
- 系统看板增加编辑保护提示,防止误修改
- 看板列条件支持用户类型枚举字段
问题修复
- 修复任务详情面板中自定义字段前缀处理错误
- 修复共享看板在「添加到看板」弹窗中未显示的问题
- 修复用户候选项预取和缓存机制
v0.23.0 (2026-02-05)
新功能
看板高级过滤和查询
看板现在支持更强大的任务筛选功能,帮助你更精确地找到需要的任务。
- 字符串字段支持模糊匹配(LIKE、ILIKE)和空值检测(IS NULL、IS NOT NULL)
- 数字字段支持完整的比较运算符(等于、大于、小于等)
- 枚举字段支持 IN 运算符,可一次选择多个值进行匹配
- 新增 8 个可查询字段:状态、预定日期、截止日期、开始时间、暂停时间、完成时间、标签 ID、优先级
自定义字段改进
- 自定义字段的键名现在自动生成,无需手动输入
- 看板卡片现在显示任务状态
- 自定义字段下拉框现在显示用户名而不是用户 ID,更加清晰易读
命令面板增强
命令面板现在可以自动识别和查询实体 UUID,快速定位任务、预算等资源。
用户体验优化
- 斜杠菜单重新排序:任务列表放在最前面,文本格式化放在最后,符合使用频率
- 看板界面新增中文翻译支持
问题修复
- 修复看板用户字段下拉选项无法加载的问题
- 修复自定义字段在任务标签变更时未刷新的问题
- 修复看板查询字符串解析比较运算符的错误
- 修复看板 IN 运算符查询格式问题
- 修复字段名称的国际化翻译路径错误
- 修复切换语言时字段名称未更新的问题
改进
- 用户下拉框打开时自动刷新用户列表,确保数据最新
- 完善看板界面的中文翻译
v0.22.2 (2026-02-03)
新功能
回收站
删除的任务现在可以恢复了。
- 在新的「回收站」页面查看已删除的任务
- 一键恢复误删除的任务
- 看板侧边栏显示回收站小部件
改进
- 快捷键现在可通过命令面板访问
问题修复
- 修复看板列不必要显示加载动画的问题
- 修复待办列表删除任务时的短暂闪烁
- 改进删除任务时的状态处理
v0.22.1 (2026-02-03)
新功能
仪表盘快捷搜索
在仪表盘添加了命令面板快捷入口,点击即可快速搜索任务、支出和命令,无需记忆键盘快捷键。
看板标签筛选增强
- 支持"不包含"操作符,可以筛选不含特定标签的任务
- 条件配置界面更清晰显示"包含/不包含"选项
命令行工具改进
- 完成任务前需要确认,避免误操作
问题修复
- 修复看板标签查询的一致性问题
- 优化看板列配置表单的布局显示
- 修复空看板无法添加列的问题
v0.22.0 (2026-02-02)
新功能
看板卡片转移动作
当卡片在看板列之间移动时,现在可以自动触发预设动作:
- 支持配置列的退出动作(exitAction)
- 智能中断逻辑,避免重复触发
- 多个动作自动合并,提升执行效率
ud-cli 任务关联命令
新增 link 和 unlink 命令,可以关联和取消关联任务
改进
- 个人版用户现在可以看到专属功能入口
Bug 修复
- 修复了看板列动作在某些情况下无法正确保存的问题
- 修复了创建看板时默认列动作生成的问题
v0.21.11 (2026-02-02)
改进
看板列排序
创建看板列时可以设置排序顺序,更灵活地组织任务视图。
修复
- 修复 Markdown 编辑器斜杠菜单的键盘导航和 Enter 键问题
v0.21.10 (2026-02-01)
新功能
CLI Apply 命令
新增 kubectl 风格的 apply 命令,使用 YAML 文件管理任务:
ud task apply -f task.yaml
看板自定义字段排序
看板现在支持按自定义字段排序,根据字段类型智能显示排序方向标签。
修复
- 修复自定义字段排序时空值的处理方式
- 修复 CLI 状态值格式问题
- 修复私有看板所有者权限问题
- 改进看板权限相关的错误提示
v0.21.9 (2026-01-31)
改进
看板类型选择
创建看板时,现在可以选择看板类型(私有或共享),让您更灵活地组织任务。
私有看板简化
私有看板不再创建多余的分组,个人任务管理更加简洁清爽。
v0.21.8 (2026-01-31)
新功能
CLI 任务备注
通过命令行为任务添加备注、进度更新和评论,实现人机无缝协作。
# 添加进度备注
ud task note add abc123 "✓ 认证模块完成"
# 查看任务的所有备注
ud task note list abc123
# 删除备注
ud task note delete abc123 note-id
AI 助手可以记录工作进度,人类可以随时追踪和提供上下文信息。
v0.21.7 (2026-01-31)
新功能
自定义字段排序
任务列表现在支持按自定义字段排序,让您可以根据项目特定的字段来组织任务。
CLI 改进
- 短ID匹配:现在可以使用任务ID的前缀来快速选择任务,无需输入完整ID
- 批量更新命令:新增
task apply命令,支持从文件批量更新任务
# 使用短ID操作任务
ud task get abc # 匹配以 "abc" 开头的任务
# 从文件批量更新任务
ud task apply tasks.yaml
v0.21.6 (2026-01-31)
新功能
自然语言任务查询
在命令行中使用自然语言查询您的任务:
ud nlquery "显示本周到期的任务"
ud nlquery "我有哪些高优先级任务?"
v0.21.5 (2026-01-31)
新功能
CLI 多账户支持
现在可以使用 kubectl 风格的命令管理多个账户和 API 端点:
- 多上下文管理:轻松切换个人账户和工作账户
- 多服务器支持:配置开发、测试、生产等多个服务器
- 环境变量覆盖:支持 CI/CD 场景下的临时覆盖
常用命令:
ud config get-contexts- 列出所有配置的上下文ud config use-context work- 切换到工作账户ud login --context staging- 登录到指定上下文
文档
- 新增 CLI 多账户认证完整指南
v0.21.1 (2026-01-30)
改进
CLI 安装体验
- 版本验证:CLI 现在支持
ud --version命令,方便验证安装是否成功 - 一键安装:订阅页 CLI 下载区新增可复制的一键安装命令
v0.21.0 (2026-01-30)
新功能
命令行工具 (CLI)
全新的终端命令行工具,让您从终端管理任务:
-
TUI 交互模式:运行
ud进入可视化终端界面- Vim 风格快捷键(j/k 上下移动,gg/G 跳转,/ 搜索等)
- 任务列表和详情页浏览
- 直接创建、编辑、删除任务
-
文件选择器:按
f打开类似 fzf 的模糊搜索- 从当前目录选择文件创建任务
- 文件第一行作为标题,其余作为描述
- 自动跳过二进制文件
-
单次命令:适合脚本和自动化
ud task list- 列出任务ud task create "标题"- 创建任务ud task done <id>- 完成任务
-
AI 助手集成:让 Claude Code、Cursor 等 AI 工具访问您的任务
CLI 下载
- 订阅页新增 CLI 下载区:支持 macOS、Linux、Windows 多平台
- 完整使用文档:新增 CLI 文档页面,包含安装、配置和使用说明
v0.20.3 (2026-01-29)
改进
看板列表视图增强
- 列设置编辑:在列表视图中点击列标题旁的设置按钮,可以编辑列的筛选条件和排序方式
- 创建看板引导:点击「所有任务」系统看板的设置时,会弹出引导对话框,鼓励您创建自定义看板以获得更灵活的配置
v0.20.2 (2026-01-29)
新功能
看板列表视图
全新的看板列表视图模式,提供更灵活的任务浏览方式:
- 列表视图模式:在看板页面切换到列表视图,以表格形式查看任务
- 全部任务看板:新增系统级「全部任务」看板,方便查看所有私人任务
- 看板切换器:在列表页面头部快速切换不同看板
任务详情页改进
- 桌面端侧边栏固定:任务详情的侧边栏现在会固定在视窗中,滚动时保持可见
改进
- 导航优化:任务菜单现在直接跳转到看板列表视图
- 分段控件重设计:侧边栏头部改用分段控件,操作更直观
- 列排序支持:看板列现在支持配置 ORDER BY 排序规则
- 搜索预览:在列编辑对话框中添加了搜索预览链接
修复
- 任务详情侧边栏:修复了侧边栏固定位置的问题
- 看板翻译:修复了国际化翻译缺失的问题
- 费用日期格式:修复了日期更新时的格式问题
- 自定义字段查询:修复了看板中自定义字段的查询处理
v0.20.1 (2026-01-29)
新功能
看板智能拖拽
拖拽任务到新列时,系统会智能更新任务属性以匹配目标列的条件:
- 自动属性更新:任务移动时自动设置目标列需要的字段值
- 智能清理:自动清除只属于原列条件的属性
- 标签处理:标签会被智能添加或移除,而非覆盖
看板多列显示
- 任务可同时出现在多列:如果一个任务同时满足多个列的条件,它会在所有匹配的列中显示
- 独立卡片操作:每个列中的任务卡片可以独立拖拽
看板自定义字段筛选
- 支持自定义字段:列匹配条件现在支持使用自定义字段进行筛选
- 灵活的条件组合:可以组合状态、标签和自定义字段创建精确的任务视图
看板文档
- 新增看板使用文档:在看板信息弹窗中添加了文档链接,点击即可查看详细使用说明
改进
- 列设置对话框:点击列标题打开对话框,更方便地查看和编辑列的名称及匹配条件
v0.20.0 (2026-01-28)
新功能
看板编辑模式
全新的看板布局编辑功能,让您更灵活地管理任务视图:
-
布局编辑模式:点击"编辑布局"按钮进入编辑模式
- 内联编辑列名称,双击即可修改
- 直接编辑看板条件和列筛选条件
- 使用状态下拉菜单快速选择匹配条件
- 拖拽列进行重新排序
-
条件编辑器:在看板标题旁显示当前筛选条件
- 直接编辑原始查询字符串
- 点击跳转到搜索页面查看匹配结果
思维导图增强
- 状态颜色显示:任务节点现在可以根据状态显示不同颜色,一眼识别任务进度
任务视图排序
- 分组排序配置:为每个分组设置独立的排序规则
- 视图默认排序:创建视图时可预设排序配置
命令面板优化
- 快捷键提示:显示创建任务和选择任务的键盘快捷键
- 更清晰的快捷键显示:改进了快捷键的视觉呈现
改进
- 看板性能:列重排序使用乐观更新,操作更流畅
- 视图编辑:现在可以编辑根级筛选条件(带警告提示)
修复
- 思维导图稳定性:修复了工具提示显示问题
- 看板状态选择:修复了状态值匹配问题
v0.19.1 (2026-01-27)
文档改进
- AI 聊天功能说明:更清晰地说明了不同 AI 提供商的通信模式,帮助您更好地理解 AI 功能的工作方式
- 版本号说明:在发布记录中添加了版本号的解释,让您了解版本号的含义
- 迁移指南:为 v0.18.0 版本添加了数据迁移说明,帮助自部署用户平滑升级
- AI 辅助提示:在查询语法文档中添加了 AI 辅助使用技巧
- 快速访问更新日志:「什么是新的」按钮现在直接链接到完整的发布记录页面
v0.19.0 (2026-01-27)
新功能
思维导图
现在您可以用思维导图的方式可视化和整理任务了!
-
任务层级思维导图:在任务详情页面点击"思维导图"按钮,以思维导图的形式查看任务及其子任务
- 自动根据任务关系生成思维导图
- 点击节点直接跳转到对应任务
- 清晰展示任务的层级结构
-
思维导图编辑器:在任务中添加思维导图作为附件
- 在任务详情页的附件区域,点击"添加思维导图"
- 自由创建节点和连接关系
- 拖拽调整节点位置
- 双击编辑节点内容
- 导出为图片保存
v0.18.0 (2025-01-24)
新功能
资源管理增强
-
一对多资源关联:现在一个文件可以同时关联多个任务、预算或账户
- 例如:一份设计图可以同时关联到多个相关任务
- 在资源详情页查看所有关联的内容
-
快捷上传:在资源页面顶部新增上传按钮,上传文件更方便
改进
- 账户、预算、费用页面:加载速度更快,操作更流畅
- 附件管理:修复了附件删除和显示的一些问题
- 界面优化:简化了部分按钮样式,界面更简洁
升级说明(自部署用户)
如果您从旧版本升级到 v0.18.0,需要运行以下数据迁移脚本来迁移现有的资源关联关系:
-- 迁移脚本:将资源关联关系迁移到新的链接表
-- 此脚本将 resources 表中的 entity_type/entity_id 数据迁移到新的 resource_entity_links 表
-- 在 GORM AutoMigrate 创建新表后运行
-- 可安全重复运行(使用 INSERT OR IGNORE)
INSERT OR IGNORE INTO resource_entity_links (
id,
resource_id,
entity_type,
entity_id,
created_at,
created_by,
updated_at,
updated_by
)
SELECT
lower(hex(randomblob(4)) || '-' || hex(randomblob(2)) || '-4' ||
substr(hex(randomblob(2)),2) || '-' ||
substr('89ab',abs(random()) % 4 + 1, 1) ||
substr(hex(randomblob(2)),2) || '-' || hex(randomblob(6))) as id,
r.id as resource_id,
r.entity_type,
r.entity_id,
COALESCE(r.created_at, datetime('now')) as created_at,
r.owner_id as created_by,
COALESCE(r.updated_at, datetime('now')) as updated_at,
r.owner_id as updated_by
FROM resources r
WHERE r.entity_type IS NOT NULL
AND r.entity_type != ''
AND r.entity_id IS NOT NULL
AND r.entity_id != ''
AND NOT EXISTS (
SELECT 1 FROM resource_entity_links rel
WHERE rel.resource_id = r.id
AND rel.entity_type = r.entity_type
AND rel.entity_id = r.entity_id
);
运行方法:
- 使用 SQLite 客户端连接到数据库文件
- 执行上述 SQL 脚本
- 重启应用
历史版本
更早的版本历史请参考项目的 Git 提交记录。