一句话

README 里有过这么一句:Soon to support Android, iOS, WearOS, and WatchOS。翻 README 的历史才知道,它是 2023 年 5 月 10 号进去的,和 #Monorepo ready state! 在同一条提交里。之后一直挂着,挂了两年多。我挑了几个时间点看目录,里面只有桌面端的代码,没见过手机或手表的工程。

它没的那天是 2025 年 8 月 8 号晚上 8 点。其实被改的不止这一句,README 整个换了写法:标题从 TalexTouch 变成 Tuff,介绍换成一个本地优先、AI 原生的桌面指令中心。平台那一节原来说 Windows、macOS、Linux 都能用,现在只剩两行,目前只有 macOS,Windows 和 Linux 快了。旁边还多出一份中文 README。

这些全在一条提交里,提交的标题写的却是搜索引擎核心。十来分钟后,文档站又有一条,标题写的是换品牌。承诺为什么偏偏在这时候删,提交正文提了换品牌和重写 README,没单独说这一句。

三行

这个项目在 TouchQ、TouchIM、TalexTouch 之后,又换了一次名字。真正改名的那条在第二天晚上 8 点多,只改一个文件,加三行,删三行。应用的显示名从 TalexTouch 变成 Tuff,数据文件夹从 talex-touch 变成 tuff,URL scheme 从 talextouch 变成 tuff。提交说明里单独留了一段 BREAKING CHANGE,大意是这会影响已经装了的版本。

三样里最重的,我感觉是中间那个。显示名和 URL scheme 改了,顶多是字和链接对不上。(URL scheme 在这一段结束时的代码里,既注册成系统的默认协议,也用来认启动参数里的链接,连托盘图标的提示文字用的都是它。)数据文件夹不一样。我对着改名那天的代码看,应用的配置、装好的插件、日志,都放在这个文件夹下面,路径只靠这一个常量拼出来。到这一段结束,主进程的代码里也没有哪一行去找旧的数据文件夹。

照这个读法,改名之后的新版本一启动,是去一个空的 tuff 里找东西,旧文件夹还在原地,没人去搬它。这是对着代码推的,实际升级起来什么样,记录里没有。

同一天

其实改名那天并不安静。下午 3 点多,搜索引擎被重做了一遍:旧的 ISearchSource 换成 ISearchProvider,provider 不再自己管缓存和刷新,只负责对一个查询交出结果。search 的返回值也换了,带着总耗时、每个 provider 各自的统计和原始查询。夜里 10 点多,剪贴板被重写成能记历史的,渲染进程里插件的状态搬进了 Pinia。

这一天提交说明里写着 BREAKING CHANGE 的,我数到七条。改名是其中最小的一条,加三行删三行。另外几条,少的也动了七百多行,多的一千七百行。可那些改的是代码里的结构,改名改的是用户电脑上的路径,三行的 diff 看不出这个差别。

当时 release 页面上还没有新版,装着旧版的人要碰上这条 BREAKING,大概得等下一次发版。

往数据库里搬

这一个多月里有几处改动都跟状态放在哪有关。provider 刚变成无状态,第二天晚上仓库里就多了一层数据库,三个钟头后 provider 又被改成能持久化、能异步加载的。

8 月 27 号,应用搜索多出一张 keyword_mappings 表,每个应用存好几种关键词:名字带不带空格的两种写法,首字母缩写(Visual Studio Code 对 vsc),全拼,拼音首字母。9 月 19 号一天里,七个主进程模块改成 class,随后又统一改成单例。再过两天,文件搜索的过滤从内存搬进了数据库。原来是把所有文件读出来再筛,现在用 LIKE 在库里查文件名和关键词,只取命中的。

剩下的名字

名字也没有一次改干净。8 月 26 号晚上,一位外面来的贡献者提了个 PR,13 个文件,加 94 行删 90 行,提交里说的是把所有跟 Talex Touch 有关的名字改成 Tuff。里面有应用第一次打开时的欢迎语,原来写的是 Welcome to TalexTouch,还有设置页顶上的应用名,剩下的是些描述和注释。这是改名之后第 17 天。

我停在过滤搬进数据库的那条提交,把主进程的代码又翻了一遍。崩溃上报里填的公司名和产品名,还有插件页面的 user agent,都还是 TalexTouch。macOS 上要访问应用文件夹时弹的那个对话框,写的也是 TalexTouch needs access to your Applications folder。