DevLog:2026年1月25日

1、截至目前,四款应用问题如下,加粗内容暂未修复:

1.DoitWith

-不包含任何Todo的分组下会显示“该分组暂无待办”,但底下还有半截分隔线,需要和正常的Todo条目下的分隔线格式一致

-设置-关于,DoitWith下面的小字和开屏上的小字是否一致?以设置-关于中的小字为准

-在Todo页面,没有“下一步”的Todo,在标题下显示“仅此一步”

-在已完成Todo页面,有下一步的Todo,在标题下显示“包含下一步”,没有“下一步”的Todo,在标题下显示“仅此一步”

-考虑到后续可能要和Mac版数据打通/同步(通过CloudKit,两个App绑定同一个iCloud Container),趁早将应用的数据持久化方式由Core Data改成SwiftData,和DoitWith for Mac的数据持久化方式保持一致,仅外观设置使用UserDefaults保存

-当天到期的Todo,早上九点推送通知

-添加小组件,小组件上显示当天到期的Todo,信息包括所在分组、标题、下一步

2.DoitWith for Mac

-调整新建分组、添加和编辑Todo窗口的视觉效果,部分图标和文字太小

-设置-关于页面下方增加“近期更新”区域,由Cursor总结近期更新了哪些功能

3.ChatWith

-清除后台后,再打开应用秒闪退,无法使用

-在与支持深度思考的模型对话时,可以看到思考内容区域,但看不到具体的思考内容

-发送消息后立刻显示在对话界面内,现在好像是在AI有响应后才会显示

-虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

-参考链接引用10条,参考链接区域默认折叠,可展开

4.ChatWith for Mac

-关于页面的“初始版本发布”放到最上边

-优化上传附件和图片后的显示效果,比如取消附件和图标的红叉需要改小一些

2、近期的重点在于对齐移动版和Mac版的现有功能,修复明显问题,首先是DoitWith移动版,将数据持久化方式由Core Data改成SwiftData,步骤包括创建SwiftData模型文件,更新PersistenceController.swift、更新TodoData.swift、更新所有视图文件,删除旧的Core Data文件,修改过程中发现虽然Composer 1模型的修改速度非常快,但修改后出现多个语法错误,未能自动检测出来

3、接下来测试功能,让Cursor修复问题,首先是待办页的空状态提示,“暂无任务”改成“暂无待办”,“添加任务开始使用”改成“添加待办或分组以开始使用”,另外待办页无待办时,这些文字上方会显示一条分割线,需要去掉,出现分割线的原因是,以前在无待办时,List里仍有一个底部占位Section(Spacer高度200),该Section上方会出现分割线,修改之后,仅在有待办或分组时显示底部占位Section

4、然后测试添加、完成、修改、删除、搜索Todo和分组,测试发现问题如下:

1.不包含任何Todo的分组下会显示“该分组暂无待办”,但底下还有半截分隔线,需要和正常的Todo条目下的分隔线格式一致

2.在Todo页面,没有“下一步”的Todo,在标题下显示“仅此一步”

3.在已完成Todo页面,有下一步的Todo,在标题下显示“包含下一步”,没有“下一步”的Todo,在标题下显示“仅此一步”

5、之前遇到过的同一分组内的Todo无法通过拖动调整顺序的问题,这次测试未能复现,可能在修改数据持久化方式之后也给解决了?

6、继续优化ChatWith移动版,主要针对之前测试遇到的问题,包括:

1.在与支持深度思考的模型对话时,现在可以看到思考内容区域,但看不到具体的思考内容,只能看到“思考中…”的提示

2.用户发送消息后,需要立刻显示在对话界面内,现在好像是在AI有响应后才会显示

3.虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

4.参考链接引用由5条加到10条,并且参考链接区域默认折叠,可展开

7、首轮修改之后,上述问题只有4已经被修复,换用内置的Kimi K2试一下,卡在分析问题的过程中,等了一段时间也没有对代码进行实际的修改,然后切换到Composer 1,修改速度很快,并且解决了“看不到具体的思考内容”、“回答内容未结合Tavily搜索结果”的问题,再次测试,要求进行如下修改:

1.思考内容区域要整合到AI消息区域中,即 最上面是思考区域(如果支持深度思考的话),然后是回答内容、参考链接,并且这三块要对齐

2.用户问题发送之后,对话界面应该立刻跳到新问题的位置,现在好像还需要手动往上划一下才能看到?

8、再次测试,上述问题好像也已经修复,但应用非常卡顿,可能是添加了太多调试信息导致的,后面再去掉,先继续用Composer 1尝试修复“清除后台后,再打开应用秒闪退”的问题,这次修改涉及生命周期管理、错误回复、超时保护、友好错误提示等,再次测试,应用直接无法正常启动了,要求Cursor清理所有的调试信息,并检查语法错误,首次启动速度是快了一点儿,但依然没有解决清除后台后无法启动的问题

9、决定换个思路,在ChatWith for Mac的基础上,适配一个iOS版,先让Curosr评估了下,首先,核心业务逻辑100%兼容,且有部分Flutter依赖已支持iOS,需要适配的部分包括部分原生平台代码、UI布局、几个macOS平台的特定功能(比如拖拽、粘贴、word文档和PDF文档解析),Cursor给出了完全兼容(使用条件编译和抽象层)和最小化适配两个方案,决定采纳方案1,希望这样可以减少后续对单独某个功能在Mac和iOS端的重复修改

10、由于存在代码隔离机制,macos和ios是独立的目录和Xcode项目,另有lib统一管理两个平台共用的代码,在后续测试时需要打开.xcworkspace文件,而非.xcodeproj文件,并且在修改共享的代码时要注意平台兼容性

11、分析的很简单,但实际操作时反复出错,比如因为权限问题不能创建项目文件,因为网络问题不能运行pod install等等,按照Cursor提供的文档手动创建项目后,又提示创建的项目不正确,反复修改了一段时间,仍未能修复

12、使用Cursor中的Codex插件检查该版本iOS应用的构建失败问题,几次修改后可以正常构建,但同样出现了ChatWith移动版存在的“清除后台后再打开应用秒闪退”的问题,结合Device Logs,Codex认为可能是一些依赖导致的崩溃,于是先暂时将其在iOS上禁用,避免启动时注册崩溃,多次修改后依然未能解决,而且基于ChatWith for Mac修改的iOS版应用在界面上还是Mac版的样子,完全没有适配移动设备,可能将使用Flutter开发的桌面版应用改为移动版并没有Cursor说的那么简单

13、用Codex,结合Device Logs检查一下“清除后台后再打开应用秒闪退”和首次打开时启动速度很慢的问题,也进行了多次反馈和调整,甚至还暂时去掉了可能导致崩溃的SwiftFlutterSecureStoragePlugin,即flutter_secure_storage依赖,但还是不管用

14、换个思路,从应用的首次启动速度入手,Codex加上了首屏耗时分析,包括First frame: startup=26145ms build=7611ms raster=11ms total=8631ms,针对这一问题进行多次修改,包括把启动阶段的初始化拆到首帧后执行、把设置读取和服务配置的初始化延后到首帧之后、把原生启动页改成橙色背景+标题和副标题以跳过白屏、去掉启动阶段的首帧调试输出等,首屏耗时变成了flutter: First frame: startup=18011ms build=4065ms raster=5ms total=4074ms

15、然后按照Codex的建议,删除App,运行flutter clean、flutter pub get,再重新构建,解决构建错误等等,首次启动可以正常启动,但启动速度比之前更慢了,而且清除后台后无法启动的问题依然存在,后面还得继续修改

DevLog:2026年1月21日

1、截至目前,三款应用问题如下,加粗内容暂未修复:

1.DoitWith

-设置-已完成 Todo,数据统计不正确

-首次启动应用时无需示例数据

-已完成Todo页面同样以分组形式显示

-已过期的Todo需要在显示上有所差异

2.ChatWith(目标是对齐ChatWith for Mac)

-清除后台后,再打开应用秒闪退,无法使用

-在与支持深度思考的模型对话时,看不到思考内容,我需要增加一个展示思考内容的区域,默认折叠,可以点击展开,并且显示样式要和回答内容有所区别(两轮修改后已有思考内容区域,但看不到具体的思考内容)

-参考链接放到AI回答内容气泡下方,不要合并到AI回答内容的气泡内

-发送消息后立刻显示在对话界面内,现在好像是在AI有响应后才会显示

-不要给所有填写了Tavily Key的模型开启联网搜索功能,由用户自行开启/关闭联网搜索功能

-发送按钮上方设置联网搜索开关,并调整布局,拉高消息框,右侧有竖向排列的联网搜索开关和发送按钮

-设置界面删掉多余的说明文字“管理您的AI模型配置,包括API Key、Base URL、模型名称等”

-针对API Key和Tavily Key添加加密机制,提升安全性

-目前已有默认模型机制,但还不能在对话中切换模型,需要添加切换模型机制,点击对话界面右上角的模型备注信息,弹出切换界面,切换界面列出当前的所有模型,点击可切换,并与新模型对话

-对话界面右上角显示的模型信息太长了,改为只显示备注,不显示模型名称

-对话列表中显示的标题是用户的第一个问题,需要改为用户的最后一个问题

-虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

3.ChatWith for Mac

-关于页面的“初始版本发布”放到最上边

2、首先让Cursor修正ChatWith移动版的启动即闪退问题,包括在main.dart中添加错误处理,防止初始化失败导致崩溃、添加全局错误处理,捕获未处理的异常、检查并修复数据库初始化可能的错误等步骤,再次测试暂时没有出现闪退问题,后面再继续测试,发现一个新问题,在对话页右上角点加号创建新对话时,会先闪过一个红屏,但也能正常创建新对话

3、Cursor表示问题可能出现在chat_page.dart中,当找不到对话时,之前会抛出Exeption,导致红屏,修改之后会返回一个默认的Conversation对象,显示“新会话”标题,在重新构建之前,发现再次出现了闪退问题,并且是“首次安装、启动后应用可以正常运行,一旦清了后台再打开,就会闪退”,Cursor认为这可能是应用从后台恢复时数据库连接已失效,但静态变量仍保留引用,使用失效连接会抛出异常,Provider初始化时未捕获异常,导致崩溃,于是对数据库层、Provider层进行了修改,并对main.dart添加了全局错误处理,主要是在获取数据库时检查连接有效性,失效则重新初始化

4、再次测试,依然会遇到清除后台后重新打开时闪退的问题,并且在真机测试过程中,控制台的日志也找不到ChatGPT和Cursor都在说的Exeption、Error、Fatal相关的错误,Cursor添加了更详细的调试信息,先看下在模拟器中测试时能否复现这一问题,以及返回怎样的错误信息,但在测试过程中并未看到“应用从后台恢复”及以后的调试信息,并且之后添加了更详细调试信息之后,也没能看到Cursor提及的可能有用的调试信息,在清除后台后重新打开时,没有返回任何调试信息

5、修改过程中反复遇到了因为没有添加缺失的导入,导致构建失败——反馈问题——添加导入的问题, 跟Cursor明确了下,以后在添加或修改代码时,主动检查并添加所有必需的导入,避免等构建失败后再修复

6、多次反馈、反复修改后依然存在清除后台后无法启动的问题,接下来先测试其他功能,暂时搁置对这一问题的修正

7、逐步调整ChatWith的其他功能,首批修改内容如下:

1.在与支持深度思考的模型对话时,看不到思考内容,我需要增加一个展示思考内容的区域,默认折叠,可以点击展开,并且显示样式要和回答内容有所区别

2.参考链接放到AI回答内容气泡下方,不要合并到AI回答内容的气泡内

3.发送消息后立刻显示在对话界面内,现在好像是在AI有响应后才会显示

4.对话界面右上角显示的模型信息太长了,改为只显示备注,不显示模型名称

5.设置界面删掉多余的说明文字“管理您的AI模型配置,包括API Key、Base URL、模型名称等”

8、在切换到Composer 1模型后(Cursor内置的GPT、Gemini、Claude等模型都因为区域受限无法使用,即使我开了梯子),响应速度明显快了很多,进行了调整思考内容展示区域、参考链接移到气泡下方、发送消息后立刻显示、模型信息只显示备注、删除设置界面多余的说明文字等修改,真机测试,上面的需求1未实现,2参考链接气泡和回答内容气泡未对齐,要继续改,3未实现,4、5已实现,另外在对话窗口顶部,对话的标题应该居左显示,再次反馈并修改

9、继续真机测试,思考内容区域只显示“思考中”,不显示具体的思考内容,发送消息后仍然要等一下才会显示在对话界面,参考链接气泡对齐方式已调整,标题已居左,继续修改,这两个问题依然没能解决,暂时搁置

10、继续进行其他修改,本轮需求包括:

1.针对API Key和Tavily Key添加加密机制,提升安全性

2.目前已有默认模型机制,但还不能在对话中切换模型,需要添加切换模型机制,点击对话界面右上角的模型备注信息,弹出切换界面,切换界面列出当前的所有模型,点击可切换,并与新模型对话

11、修改过程中,Cursor引入了encrypt和flutter_secure_storage用于AES加密存储,创建了model_selector_dialog.dart用于选择模型,并将model_display.dart修改为可点击,接下来真机测试(又要运行pod install以同步iOS依赖),模型切换和选择功能已经实现,但Tavily联网搜索功能好像失效了,重新填写Tavily Key(猜测可能是因为加密机制的问题?),依然无法在对话中获取参考链接和最新信息

12、Cursor添加了调试信息,测试发现Tavily Key解密成功,但出现网络错误,错误信息为null,继续添加更详细的调试信息,再次测试,结合调试信息中的错误HandshakeExeption: Connection terminated during handshake,Cursor认为是SSL/TLS握手失败,于是在Info.plist中添加了App Transport Security配置,在ApiClient中配置了SSL证书验证,再次测试,虽然可以联网搜索并获取链接,但搜索到的信息并未整合到回答内容里,反馈之后,Cursor改进了搜索结果的格式,添加了系统信息(明确指导AI要基于搜索结果回答问题),并且改进了消息构建逻辑,测试发现此问题仍然存在,后续再修改

DevLog:2026年1月15日

1、昨天的遗留问题包括:通过command+N在AI对话和备忘录界面新建对话、新建备忘录,和通过拖拽上传图片/文档,再次测试已支持通过拖拽上传图片/文档,但控制台里依然返回了“图片文件不存在”的调试信息,Cursor优化了错误处理,将“图片文件不存在”的提示改为仅在调试模式下打印,并添加说明,再次构建,功能依然正常,调试信息依然是“图片文件不存在”,先不管了,后面会统一去掉所有的调试信息

2、然后是在AI对话界面用command+N新建对话,在笔记界面用command+N新建笔记这两个功能,目前还不是很稳定,比如在AI对话界面,光标停留在AI对话列表页、详情页、输入框等位置时,有时可以用快捷键新建对话,有时不能,而在笔记界面,只有点开一条笔记的编辑模式后,才能通过command+N新建笔记,我的需求是,只要打开了AI对话界面,不管是未选中任何对话,还是打开了一条对话,或者光标停留在输入框,都可以通过command+N新建对话,只要打开了笔记界面,不管是未选中任何笔记,还是打开了一条笔记,或者切换到了编辑模式,都可以通过command+N新建笔记

3、Cursor为Shortcuts添加了autofocus:true和canRequestFocus:true,据称能确保快捷键始终可用,再次构建测试,依然未能实现需求,决定回退一点,在AI对话界面,只有打开对话并且在输入框聚焦时,才能通过command+N新建对话,并且在设置-快捷键的“新建对话”后面增加“(在输入框聚焦时)”说明文字;在笔记界面,只有打开笔记且在编辑模式时,才能通过command+N新建笔记,并且在设置-快捷键的“新建笔记”后面增加“(在编辑模式时)”说明文字

4、再次构建测试,在修正两个文件中括号不匹配的问题之后,可以正常构建,快捷键功能也可正常使用

5、前两天在询问千问时,它有提到可以通过macOS的textutil实现对word文档的解析,Cursor也认为该方案可行,textutil支持.doc和.docx格式,可将word文档转换为纯文本,支持UTF-8编码输出,并且是macOS系统自带的功能,无需额外依赖,可以使用MethodChannel实现(当前的PDF解析实现方式),优点在于性能、稳定性好、实现简单,但仅限于macOS,无法跨平台,无法提取文档中的图片,无法处理某些复杂的word对象,这些在我看来都可以接受

6、要求Cursor直接使用textutil来实现AI对话过程中对word文档的解析,实现方式与现有的PDF解析一致,同时添加文件大小限制,单个word文档不能超过10MB,Cursor创建了新的文件WordTextExtractor.swift并更新了项目文件,新增功能包括文件大小限制、错误处理、与PDF解析一致的实现方式

7、构建测试,发现已经支持上传并解读word文档,通过附件按钮上传、拖拽上传均可,但目前还不支持将图片、文档粘贴到对话框并解读,询问Cursor能否增加对粘贴图片、文档并解读的支持,效果要和通过附件按钮上传、拖拽到对话窗口的效果一致,在修改过程中,Cursor扩展了Swift端剪贴板处理,更新了Dart端粘贴处理,据称实现的效果包括支持粘贴图片、支持粘贴文档、与拖拽和附件上传效果一致,并且自动去重

8、继续构建测试,已经支持粘贴图片和文档,需要更新一下AI对话界面输入框的提示文字,改为“输入消息…(支持拖拽或粘贴文本/图片/文档)”,这种比较小且非常明确的需求,可以先在代码中搜索找到对应的位置,选中所在行并Add to Chat,修改起来会更快

9、在通过命令行进行构建测试的过程中,多次出现对依赖版本的检查,其中12个包有更新版本可用,1个包已被官方弃用,询问ChatGPT后得知这不是错误,不影响编译或运行,且并不是所有的包都建议升级,升级后也可能会导致新的编译问题,其中的flutter_lints、lints、package_info_plus、pointycastle版本号变化较大,后面可以考虑升级,flutter_markdown官方已经不维护了,建议改用flutter_markdown_plus,等后面更熟悉Flutter了再尝试更新

10、刷新一下README.MD和设置-关于ChatWith界面的“近期更新”内容,版本号不变,接下来打包(flutter build macos –release -v)、测试几天,然后下一个版本重点优化笔记板块的功能和界面

11、记录一下在终端中用指令打包的方法,首先cd+空格,打开项目文件夹,直接拖到终端窗口里,就会自动补全路径,然后回车,然后再输入flutter build macos –release -v,接下来等着它完成就行,正常的话会有BUILD SUCCEED、Building macOS application…(completed in 44.6s),并用绿色对号和加粗的文字提示路径Built build/macOS/Build/Products/Release/chatwith.app,去项目文件夹下这个路径里找就行了,然后把这个.app文件拖到访达的“应用程序”文件夹里,就可以正常使用了

12、再补充一些基础知识,flutter build macos –release -v只能用于打包使用Flutter开发的macOS应用,使用Xcode原生、Electron/Tauri、.NET/Qt/C++开发的应用有各自的打包指令,但如果要正常分发甚至想上架的话,还都需要经过代码签名、公证等步骤,macOS应用如果不公开分发,有.app文件就够了,只是会面临Gatekeeper的拦截

13、了解一下如果把当前这个使用Flutter开发的macOS应用部署到iOS设备上,可能会涉及哪些调整,根据ChatGPT的回复,这会涉及项目结构与构建目标、UI/交互、生命周期与状态管理差异、文件系统与文档上传能力改造、权限与能力声明、依赖/插件、原生集成与性能、发布与合规等方面,在将目前项目的pubspec.yaml复制给ChatGPT后,它指出目前的大多数依赖本身是支持iOS的,如果要将macOS版本迁移到iOS,可能主要会卡在数据库实现、文件选择/文件访问、iOS权限与plist配置以及少量插件的iOS兼容性细节上

14、从现在的情况来看我好像没有必要再单独去修改使用flutter重构的ChatWith移动版了,因为功能上的需求都是一样的,重复开发也只是徒增工作量,后面可以等ChatWith for Mac功能稳定了,直接让Cursor搞一个功能一致的iOS版

15、在测试的这段时间,也筹划一下其他的应用,目前已有的几个半成品项目中,只有DoitWith的功能与其他几个不同,目前是一款使用Swift开发的待办应用,已经具备了常用的添加/修改/删除待办、完成待办、待办分组、重复提醒、数量统计等功能,但不知道下一步该往哪个方向走,将目前已有的功能清单、核心的代码文件和主界面截图发给ChatGPT后,ChatGPT指出目前我已经把一个标准的To-Do App该有的东西几乎都做完了,现在不是“功能不够”,而是“任务本身是死的”,只是起到了“记录我要做什么”的作用,但市面上几乎所有成熟的To-Do App的竞争点已经是“系统如何帮我更容易把事情做完”,所以我才会遇到“我不知道加什么功能,但又不想和别人一样”的典型问题

16、而且ChatGPT还指出了目前应用的几个问题,比如每条待办都是孤立的,没有前后关系/状态演进/行动提示,目前的分组是静态分组,所有的事都会被同等对待,完成一个任务也没有反馈感,ChatGPT不建议再横向加功能(比如子任务、优先级、项目/文件夹、日历视图),而是给出了三个进化路线:让待办变成过程,而不是清单(增加“下一步”功能);让DoitWith变成节奏型待办(每天只能标记3个重点任务,超过就要替换);为macOS/iOS原生体验而生(利用Spotlight、菜单栏快速完成、Live Activity/Widget驱动行动、支持快捷指令等macOS/iOS原生能力)

17、这三个建议中的“最小可执行版本”是给任务加一个字段:nextAction或statusNote,UI上显示在标题下,用户完成的是“这一步”,不是整个任务,这样就会让列表变“活”

18、还得再思考思考具体往哪个方向演进,或许也可以结合我的日常工作来调整,做成一款通用性没有苹果的“提醒事项App”那么强的待办App,比如设置项目、稿件、视觉等标签?增加由哪个员工来写,和哪个客户对接等字段?

DevLog:2025年12月24日

1、询问ChatGPT使用Flutter开发的iOS应用,如何打包成用于Mac的版本,ChatGPT指出思路不是把iOS的ipa直接变成Mac版,而是用同一套Flutter代码开启macOS平台支持,然后构建出macOS App(.app),然后再分发,ChatGPT推荐开发一个Flutter macOS桌面端,适配窗口/鼠标/键盘,且同时支持Intel/Apple Silicon两大平台,如果是让iPad App跑在Mac上,仅支持Apple Silicon,且可能会遇到插件/权限的问题

2、若使用ChatGPT推荐的方案,需要开启macOS平台支持,检查插件是否支持macOS,并且需要处理UI/交互的适配,如尽享使用响应式布局,适配鼠标滚轮、右键、hover、快捷键等操作,以及文件选择、拖拽、菜单栏等等

3、以上两点留到后面再修改ChatWith移动端时再看,可以一并询问Cursor能否支持macOS,以及需要做哪些调整

4、今天继续测试修改后的ChatWith for Mac(Swift原生版),上周增加了设置默认模型功能,去掉了自动创建新对话功能,改为提示用户开启新对话,并且新对话直接使用默认模型,还未测试,ChatGPT认为所有网络请求必须在后台线程执行,所有UI更新操作必须在主线程执行,但我没有给它代码,先让Cursor检查下目前是否使用了这种方式

5、Cursor对将AIService.swift进行了两处修改,包括:isLoading和errorMessage的更新现在使用Task { @MainActor in }确保在主线程,stopStreaming()中的isLoading = false现在也在主线程更新,这样整个应用就统一成了网络请求在后台线程执行,UI更新在主线程执行

DevLog:2026年12月5日

1、昨天引入RichTextKit,替换了目前的备忘录模块,但依然未能正常进行构建测试,在Xcode中构建时发现存在两处错误,再次反馈给Cursor并修改后构建成功

2、测试发现目前的确已经可以实现富文本编辑器的部分功能,比如设置加粗、下划线、删除线、文字颜色、字体、对齐方式,但工具栏中的斜体、字号大小,还有一个不知道是啥按钮,点亮和取消都没有看到什么变化,而且需要先选中文字,再从菜单里选“Format——More”才能在窗口底部弹出格式工具栏,感觉不够直观,需要缩减菜单层级

3、反馈后Cursor把工具栏改成了常驻在标题和编辑器之间,但在Xcode中多次构建都存在错误,猜测可能是Composer 1模型的问题?于是把Cursor中的模型切换回了Auto再试,但在修改过程中又把格式工具栏给我改回了自定义的NSAttributedString,测试发现其中的按钮基本都没有用,于是要求Cursor用RichTextKit内置工具栏RichTextFormat.Toolbar替换自定义实现

4、这下RichTextFormat.Toolbar常驻在备忘录详情页的标题和编辑器之间了,但格式工具栏高度有些夸张了,我希望能把第一行(包含加粗、斜体、下划线、删除线、字号)常驻,其他按钮先折叠起来,在第一行按钮后方增加一个向下的箭头,点击可以展开完整的工具栏

5、Cursor在使用RichTextContent的API、RichTextStyle枚举、RichTextAction,并保持与RichTextKit的兼容性的同时,实现了我的需求,工具栏默认折叠,只显示第一行常用按钮,点击箭头可以展开更多选项,效果还可以

6、接下来添加一个支持深度思考的模型,测试思考内容的流式输出和展示是否正常

7、插播另一个话题,在使用Cherry Studio询问“有哪些比较好用的跨端开发框架”时,发现使用Cherry Studio调用百度千帆平台的DeepSeek API时,响应速度和回答速度都非常慢,回答一个问题可能需要四五分钟的时间,但直接调用DeepSeek官方的API就没有问题,看了下我在百度千帆上的费用还有47块多,消耗的速度好慢

8、说到跨端开发框架,DeepSeek推荐用Flutter,支持iOS、Android、Web、桌面(Windows/macOS/Linux),高性能、重热载、组件库丰富、生态强大,缺点在于需要学习Dart语言(有Cursor,这个不算缺点)、包体积较大、Web端体验较差(无所谓,我也没打算上Web端),看起来的确是最符合我需求的跨端开发框架

9、之前移动端的ChatWith一直无法全屏显示,多次修改也无果,决定就用它开刀了,看能否在Cursor里使用Flutter框架,把它改成跨端应用,先搞好iOS端,再搞Mac端

10、询问Cursor如果我想把ChatWith改成用Flutter框架的话,可行性如何,Cursor认为目前应用的功能在Flutter中均可实现,核心功能在Flutter中均有对应的方案,我比较关注本地存储和Markdown渲染,本次存储上,Cursor建议对话数据用sqflite数据库,配置用shared_preferences,Markdown渲染用flutter_markdown或markdown_widget,且Flutter的Markdown包更成熟,但是,需要完全重写,无法复用Swift代码

11、Cursor还推荐了如下技术栈:

核心框架:Flutter SDK(最新稳定版)

状态管理:Provider或Riverpod(推荐 Riverpod)

网络请求:dio(支持流式响应)

本地存储:shared_preferences (配置)、sqflite (对话数据)

Markdown渲染:flutter_markdown

UI组件:cupertino_icons (iOS风格图标) 、flutter_slidable (滑动操作)

并且推荐完全迁移,优点在于跨平台、长期维护成本低,缺点在于需要重写所有代码

12、继续询问,如果按照Cursor的建议完全迁移,并使用Cursor推荐的技术栈的话,让它分析了一下详细的迁移计划和项目结构建议,它直接写了三个文档:FLUTTER_MIGRATION_PLAN.md(迁移计划)、FLUTTER_CODE_EXAMPLES.md(代码示例)、FLUTTER_QUICK_START.md(快速开始),可能Cursor认为我自己会参考这三个文档来开发吧,先这样,接下来让Cursor来进行迁移

DevLog:2025年11月6日

1、让Cursor将当前版本(v0.2)打包,Cursor这次还同步创建了发布说明文档,其中包括版本信息、安装说明、更新内容、系统要求、支持的AI平台、反馈与支持、注意事项等内容,看起来还是挺规范的

2、已经用上了v0.2版本,以后对话时多多使用,修正问题并进一步优化,同时我还询问了Cursor下一个版本的建议,以细节补充和优化为主,Cursor给出了高、中、低三个不同优先级的建议,但我个人还是觉得有些并不着急

3、高优先级建议包括停止生成按钮(发送消息后按钮变成停止生成按钮,可以随时点击停止)、会话重命名/自动命名(其实现在可以重命名,也会自动获取用户的最后一个问题作为会话的名字)、消息复制按钮(已有)、快捷键支持(比如给创建新对话、切换模型、搜索等功能指定快捷键,这个可以有)、错误处理优化(更友好的错误提示、API限流处理、离线模式、崩溃日志等,我暂时不需要)

4、中优先级建议包括重新生成功能、代码块复制(这个可以有)、消息时间显示(我忽略了这一点,现在还真没有)、空状态设计(无对话、无收藏时的引导界面,这个好像也已经有了)、数据导出功能(收藏内容导出成.md还是比较实用的)

5、低优先级建议包括主题色自定义(花里胡哨,不需要)、使用统计(显示使用次数、Token消耗等,后面可以加上)、标签分类(暂不需要)、字体调节(暂不需要)、帮助文档(暂不需要)

6、总结一下,v0.3要增加的功能包括:停止生成按钮、快捷键支持、代码块复制、消息时间显示、数据导出功能、使用统计,也都是一些细节上的补全

7、目前在进行中的开发项目,移动端有ChatWith、NoteWith和DoitWith,Mac端有ChatWith for Mac和NoteWith for Mac,NoteWith for Mac是由移动端NoteWith修改而来,功能上相当于在ChatWith基础上增加了备忘录和待办事项功能,整合的功能比较多,后续可能会考虑删掉待办事项功能,留给DoitWith,且AI对话功能需要重复开发,暂时先搁置,接下来继续开发移动端NoteWith

8、将近三个月没有修改过NoteWith了,甚至都忘了它的功能都有啥,先让Cursor梳理一下目前的项目,都有哪些功能,有哪些优化建议,在梳理过程中,先整理了应用功能与优化建议文档,然后检查发现了重复文件,Cursor建议先清理重复文件(我还发现目前应用文件夹里有多个Trae创建的项目文件备份和.sh文件,也都不需要了,一并清理掉)、清理调试打印和未使用的代码,后面可以考虑更换数据持久化方案为Core Data,然后优化性能、扩展功能等等

9、Cursor直接删掉了15个无用文件(应用能否正常运行还有待验证),然后我删掉了多余的空文件夹,和之前不知道啥时候、由哪个AI工具编写的重构指南文件,以及一个项目初始化脚本setup.sh

10、时隔三个月再次启动了iOS模拟器,iOS 26已经发布,模拟器也换成了iPhone 17 Pro、iOS 26.0,并且部分界面也自动变成了iOS 26的效果,比如底部的AI对话、备忘录、我的三个按钮及其切换效果,决定趁现在应用功能还很简单,结合近期修改ChatWith for Mac的经历,先开启一个新对话,把NoteWith的AI对话和备忘录的数据永久化方式改为Core Data,AI模型、设置等仍然采用UserDefaults

11、Cursor的建议是使用Core Data存储Note、AIChatSession、AIMessage、SearchLink、deletedNotes,仍然使用UserDefaults来保存AIConfig和应用设置,因为Core Data适合结构化数据,支持关系、查询和迁移,UserDefaults适合小量配置,访问频繁但更新不频繁

12、接下来创建Core Data模型文件和相关组件,创建了备忘录、AI对话、AI消息、搜索链接四个实体及对应的扩展类,重构了DataManager,并更新了项目文件,和以往修改数据永久化方式一样,这次Cursor也增加了迁移机制,首次运行时会自动将现有的UserDefaults数据迁移到Core Data,但因为当前应用还没有发布,不需要迁移机制,让Cursor去掉了迁移机制,并且修复了构建错误,具体使用体验怎么样,哪些功能受到了影响,明天再测试,然后引入三方库MarkdownUI和RichTextKit,完善AI问答和备忘录的渲染效果和编辑体验

Mac常用App推荐:Obsidian及实用插件

换用vivo X100 Ultra之后,因为不能使用苹果的备忘录,我用了Obsidian大概一年时间。这次结合个人的使用情况分享一下Obsidian的主要功能,一些比较实用的Obsidian第三方插件,以及对我而言它的优势和不足,仅供参考。

一、笔记基础功能

使用Obsidian记笔记更像是在管理文件,很多地方都与管理文件的思路类似。比如可以打开文件所在路径,直接添在访达中添加或修改文件夹,在不同的文件夹之间移动笔记等等。

单篇笔记可以左右分屏、上下分屏,方便对比笔记中的不同内容,可以同时打开多篇笔记,也可以把某篇笔记以单独的窗口打开,自由度很高。

笔记内容的编辑功能很完善,需要注意的是,Obsidian是一款典型的Markdown笔记工具,如果要设置样式,需要添加特定的符号标记,虽然也可以用Editing Toolbar插件实现一些具备富文本效果的编辑操作,便于调整版式,但它本身仍然是一款Markdown工具,点击带有格式的文字位置,仍然会看到符号标记。

除了基本的笔记功能之外,还支持关系图谱功能,可以用“双链”构建知识网络,也可以用“白板”梳理素材和思路,下文详细说。

在多端同步方面,Obsidian官方提供了包含多端同步在内的服务,按月付款每月5美元,能获得跨设备同步、端到端加密、版本历史、通过共享仓库协作等服务。当然也可以通过个人OneDrive账号或iCloud来实现免费的多端同步,实测同步效果还可以,下文详细说。

如果需要复杂排版,或者个人比较偏好可视化操作,喜欢所见即所得,推荐用富文本工具,比如苹果设备自带的备忘录就是典型的富文本笔记工具。如果追求写作效率、喜欢简洁的界面、需要进行长期的知识管理,推荐用Obsidian这种Markdown工具。

二、关系图谱管理

Obsidian和其它笔记工具的主要差异,在于它的重点是构建个人知识网络,而非传统的收集信息。从一条条孤立的笔记到用关系图谱管理知识网络,虽然可能需要一些时间的积累,但长期用起来就会发现这个功能有多方便。

通过Obsidian的关系图谱功能,可以建立笔记间的关联,还能用双向链接关联到某条笔记中的某个段落。比如可以将关于同一个主题的多条笔记进行关联,方便后续查看和管理。设置关联后,在关系图谱中会在多条笔记之间画线表示存在关联。有两种方法可以建立关联:双向链接、标签。

双向链接:在笔记内容里添加双方括号,就能添加双向链接,点击链接可以直接跳转到对应笔记,在设置关联时也会根据输入的内容自动匹配可能要关联的笔记。默认会显示被关联笔记的完整标题,也可以在完整标题后面加一条竖线再自己随便编个别名,这样就会只显示笔记的别名,看起来更顺眼一些,点击同样也能跳转。

通过双向链接建立关联后,可以在笔记界面右下角查看反向链接,即有哪些笔记链接到了当前这条笔记,或者在设置-反向链接中开启“在标签页中显示反向链接”,就可以在笔记底部更方便地管理关联笔记。如果被关联的笔记有更新,Obsidian会提示是否更新。

或者,也可以用标签来标记笔记,在笔记中任意位置输入井号和文字就能添加标签,点击某个笔记中的标签,就能快速查看使用同一标签的所有笔记。

在关系图谱中的设置中,可以给不同的标签、文件路径、文件名等设置不同的颜色组,让关系图谱更符合自己的使用习惯,也更容易找到一些重要的内容,还可以设置是否显示孤立文件,大家可以多试试。

个人认为没有必要建立过多链接,可能会让关系图谱变得杂乱,而且就我个人的工作需求来看,也不需要建立太多关联,因为很多笔记之间根本没有什么关系。

三、白板

Obsidian的白板功能提供了无限大的画布,可以在这里自由组织和连接笔记、图片、文字、网页等等。我觉得这三个场景比较适合使用白板:需要一些视觉化的手段来管理多篇笔记;需要写作,但素材分散在好几篇笔记中;需要记录一些脑暴想法,方便后续整理。

在白板里,不仅可以根据需要添加纯文本的卡片,并且随时将其转换为笔记文件,也可以粘贴一些截图到白板中。并且白板中的这些元素之间可以添加连线,也可以自由调整卡片大小,或者选中后创建分组,自由度相当高,推荐大家体验下。

四、网页浏览器

Obsidian内嵌了web viewer(需要先在设置-核心插件里启用网页浏览器),既能从笔记里点击链接打开浏览器,也可以在新标签页中直接打开浏览器。

有了这个功能,一些比较简单的资料搜索需求可以直接在Obsidian内搞定,可以直接将网页保存到内容库(Save to vault),也可以选中文字并右键保存到笔记中,简化了资料收集操作。这个内嵌的浏览器同样可以设置默认首页、搜索引擎、保存网页的文件夹、广告屏蔽规则,界面非常简洁,但整合的功能都相当实用。

五、实用插件推荐

接下来结合网上看到的推荐文章和我的实际体验,给大家推荐几个实用的插件。

1、Editing Toolbar

正如名字一样,编辑工具栏,调整格式非常方便,尤其对于不是很习惯Markdown语法的朋友们来说更是必备插件,选中文字再点击格式按钮就能设置格式了。

2、Importer

可以将其它笔记工具的内容导入到Obsidian,支持导入Notion、Evernote、Apple Notes(苹果的备忘录)、Microsoft OneNote、Google Keep、Bear、Roam以及HTML文件,是从其它笔记工具搬迁到Obsidian的必备插件。安装之后点击主界面左侧的Importer图标就能快速导入。

3、Remotely Save

不想订阅Obsidian官方的同步功能,并且没有使用苹果设备的话,可以用它给Obsidian增加跨端同步功能,需配合OneDrive个人版使用,同步速度也还可以,如果出现同步失败的情况,可以在Remotely Save插件的设置中对OneDrive进行鉴权,可恢复正常。

但是,偶尔会需要重新鉴权,大概一周左右会需要重新鉴权一次?而且还存在同步不及时的情况,比如我在电脑上使用时,如果中途打开了一次手机端Obsidian,再切到电脑端,进度可能会回退,新创建的文件可能会消失,比较影响使用。

说到这里,顺便说一下在苹果设备间通过iCloud同步的方法:

首先在iOS设备上创建iCloud仓库,打开Obsidian,点击 “新建仓库”,在仓库名称中输入相应名称,启用 “存储在iCloud中” 选项,然后点击 “创建”。

然后在Mac上打开Obsidian,在 “打开本地仓库” 右侧选择 “打开”,导航到 “iCloud→Obsidian”,选择在iOS设备上创建的仓库文件夹即可。这种同步方式明显比通过OneDrive要简单且稳定的多。

4、Copilot

可以为Obsidian增加AI对话能力,或者基于个人的笔记进行问答等等,下文详细说。

需要注意的是,安装插件前需要先在设置-第三方插件中关闭安全模式并且架梯子,才能访问社区插件市场。

六、Copilot插件使用方法

在Obsidian中使用Copilot插件接入AI,可以实现Chat、Vault QA、右键菜单修改内容三种功能,Chat可以询问AI任何问题,Vault QA可以询问有关现有笔记的问题。这样让自己的笔记真正成为一个知识库,也可以更方便地用AI辅助创作。

先说怎样添加模型(Chat Model和Embedding Model,前者负责对话,后者负责建立所有笔记的索引)。

关于Chat Model,可以直接在Copilot插件的设置界面中填写几家大模型的API Key,并选择、使用模型,支持OpenRouter、Gemini、OpenAI、Anthropic、Cohere、XAI、Groq、Mistral和DeepSeek。

或者添加自定义的模型,点Model标签页的Add Model——填写Model Name——选择Provider(OpenAI Format,或者选择Ollama来调用本地模型)——填写Base URL和API Key——Verify一下,提示成功就可以Add Model。添加Embedding Model的方法类似,然后将Default Chat Model和Embedding Model切换成刚刚添加的模型。

在添加自定义模型时,有一个“Enable CORS”的选项,一直没弄明白到底要不要开,询问ChatGPT,它说Enable CORS用于允许Copilot向非同源的大模型API发起请求,主要解决本地、自建或内网模型接口被浏览器跨域机制拦截的问题,勾选Enable CORS之后,会放宽网络访问限制,Copilot也提示“Only check this option when prompted that CORS is needed”,也就是只有在系统提示需要CORS时才开启,大家可以在使用过程中试一试。

添加Embedding Model之后,会快速对所有笔记内容进行索引,并且打开任何一篇笔记都会在右侧边栏推荐相关笔记,点击就能直接查看相关笔记,推荐的还是比较准确的。如果变更Embedding Model,需要重建整个库的索引,但也很快,我这有1000+条笔记大概半分钟索引完毕。

奇怪的是,在添加自定义的Embedding Model时,即使是用的同一个嵌入式模型(比如BAAI/bge-m3),如果选择Provider为SiliconFlow,再填写API Key,就会提示Key错误,如果选择Provider为OpenAI Format,并填写硅基流动的Base URL和API Key,就能正常添加并且开始indexing。

另外,值得一提的是,在Copilot中使用DeepSeek-R1或者其它支持深度思考的模型时,也可以看到思考过程。

然后说说用法。

在Obsidian主界面点击左侧工具栏的“对话窗口”标志即可在右侧窗口启动Copliot插件,之后可以使用Chat或Vault QA两种模式。

Chat模式可以进行三种问答:直接问AI任何问题;输入“双方括号”(表示引用某条笔记)再输入命令,可针对引用的笔记进行回答;输入大括号{activeNote}并提出问题,可针对当前活跃的笔记进行问答。

vault QA模式可以结合你选中的笔记或者某个文件夹中所有笔记的内容进行问答,比如结合这些笔记做一些总结等等,这两种模式下AI回答的内容都可以复制、插入到笔记中,或者重新生成回答。并且在这两种模式下与AI对话的内容都会默认保存到copilot>copilot-conversations文件夹下,便于回顾。

在使用Obsidian的过程中,也可以在笔记里选中一段内容,点击右键菜单Copilot,进行语法修正、翻译、总结、简化、扩写等等操作,输出结果可以直接插入到笔记中。

七、优势和不足

优势:

1、界面超级简洁,没有任何的装饰,使用过程中响应速度很快。

2、如果不设置同步机制,所有的笔记都是纯本地存储,更加安全。

3、有大量的插件可以自行安装,扩展应用的功能,可以在社区插件市场里下载安装。

4、支持macOS、Windows、Linux、Android、iOS这些主流平台,并且在不同平台上的功能、文件结构、使用方法都基本一致。

不足:

1、Obsidian是原生Markdown笔记,不知道大家是不是都习惯用Markdown语法,就我个人而言,日常笔记内容以文字为主,但Obsidian不方便保存一些带有符号的文字,比如想用井号体现微博话题,想用星号备注一些内容,就会被识别成Markdown语法,变成tag和斜体字,再比如把加粗的文字粘贴到word文档或者其它地方,就会出现一组双星号(MarkDown语法标记),还需要手动删除。

2、安装的插件如果比较多,或者保存的笔记比较多的话,冷启动会比较慢。

3、如果使用的是多台苹果设备,在多设备间通过iCloud同步会很方便,而且速度很快,但如果是其它设备,比如安卓手机和苹果电脑、Windows电脑,要么订阅Obsidian的同步服务,要么依赖Remotely Save插件和OneDrive,略显繁琐,且有时会同步失败。

不定期更新App推荐及使用心得,欢迎关注。

最初发布于2025年12月26日

DevLog:2025年9月17日

1、昨天已经基本实现了模型添加、AI对话的基础功能,今天继续完善,首先是添加多个模型并在对话时切换模型,首先在添加两个模型之后,发现设置-可用模型的模型列表里,两个模型之间有两条分割线,而且创建新模型时,无法保存我填写的新API密钥和基础URL,而是沿用了我添加的第一个模型的API密钥和基础URL

2、首先更新了AIModel结构体,添加了apiKey和baseURL字段,移除了isDefault字段,修复了ModelEditView的保存逻辑,更新了模型测试逻辑和对话配置逻辑,使用模型自己的API配置进行对话,而不是使用全局的API配置(早就应该这样了),然后移除了modelRow函数中的Divider():,去掉了多余的分割线,再次测试,两个问题成功解决

3、但AI对话窗口里又出现了回答在上、问题在下的情况,另外切换模型的弹窗显示也有问题,先修复切换模型的弹窗的显示效果,同时修复一下AI对话列表的选中状态,目前根本看不出来选中了哪个对话,修改后仍然不能在对话列表中标示出当前选中的对话,还需要再修改

4、先用硅基流动的DeepSeek R1 API测试了一个需要联网获取最新信息的问题,发现目前思考过程没有展示、AI回答内容没有经Markdown渲染、看不到Tavily提供的资料链接,决定让Cursor同时修复这些问题,并明确要求使用MarkdownUI来进行Markdown渲染,其实之前已经有了一部分支持这些功能的代码,但功能不完整,Cursor列出了Todo,一步步修改,稍后一并给Cursor反馈问题

5、Cursor一次修改了思考过程展示/折叠和展开、Markdown渲染、Tavily资料链接显示等功能,其中在Markdown渲染上,先创建了一个新的文件MarkdownView,但没有添加到项目里,提示构建失败,于是又重新启用现有的MarkdownRenderer,并且引入了MarkdownUI,同时还保留了自定义AttributedString实现作为备选方案,原因貌似是MarkdownUI只支持14.0以上的macOS,我觉得没有必要保留备选方案,之前修改NoteWith时已经验证了MarkdownUI的渲染效果,于是要求Cursor去掉了自定义实现相关代码,使用MarkdownUI作为唯一的渲染方案,MarkdownRenderer代码更加简洁了

6、接下来测试一下思考过程、Markdown渲染、Tavily链接的显示效果,先把AI对话内容的显示顺序搞定,然后处理了一下点击AI对话右上角无法切换模型的问题(原因是ChatView的模型选择回调中代码被注释掉了,没有实际实现模型切换功能,而且每个对话都显示第一个可用模型,而不是用户选择的模型,模型切换没有保存到对话中,我需要为每个对话独立保存选择的模型),Cursor自称目前已经实现如下目标:新对话默认使用第一个可用模型、点击右上角的模型名称选择其它模型、选择的模型立即保存到该对话中、每个对话都有自己独立的模型选择、重启应用后每个对话仍然使用之前选择的模型

7、模型可以正常切换了,但试了几个问题,发现无法触发应用通过Tavily获取最新信息,Cursor分析发现虽然Tavily密钥已经存储在模型中,但实际的消息发送逻辑中没有使用Tavily服务,需要实现Tavily集成,创建了一个新的Tavily服务类TavilyService,并修改了OpenAIService,表示当提问时应用会自动通过Tavily获取最新信息

8、测试发现即使是不支持深度思考的模型,回答内容里也会出现思考过程区域,而且回答内容没有经过Markdown渲染,也看不到Tavily的资料链接,在用MarkdownUI来实现Markdown渲染效果的过程中,Cursor多次创建和删除Package文件(因为一直没有真正引入MarkdownUI),多次用命令行修改MarkdownRenderer,多次尝试不使用MarkdownUI,而是换用SwiftUI的原生功能来实现基本的Markdown渲染,不知道为啥今天反复出现这种“退步”的操作,我多次打断,反复强调要用MarkdownUI来渲染

9、已经有部分文字可以呈现渲染后的效果,但表格还是无法正常显示,参考NoteWith,可能要对表格和代码块的显示进行单独的优化,猜测上面重复同样的操作可能是因为这个对话的上下文太长了导致的,后面在Cursor里开一个新对话再修改这些内容

10、又遇到了刚刚进行的问答没有被保存到对话里的问题,在修改ChatWith,将用户消息和AI消息更新后都调用onUpdate将其保存到Core Data后,问题解决

11、在修改MarkdownRenderer以支持对表格和代码块的渲染优化时,Cursor反复检查MarkdownUI的版本、添加MarkdownUI默认的表格和代码块渲染样式、添加自定义的表格和代码块渲染样式,然后删除这些内容,多次操作后相当于没有做任何的修改

12、决定试试让Cursor创建单独的文件来处理表格和代码块的渲染,并且使用MarkdownUI,Cursor创建了TableRenderer和CodeBlockRenderer,并将新文件添加到项目,但多次尝试后,即使已经将这两个新文件集成到AssistantMessageView之后,仍然未能实现对表格的正常渲染

13、由于目前的ChatWith是由iOS应用修改而来,且在修改过程中对代码和架构进行了大量的调整,怀疑目前有部分文件功能是重复的,让Cursor列举结构和分工后发现ChatWrapper是多余的、ChatView过于庞大、且组件职责不清晰,比如ChatMessageListSection和ChatMessageListView功能重复、ChatInputSection和ChatInputView功能重复,Cursor建议简化架构、删除冗余文件、重新组织文件结构,决定让Cursor实施这些优化

14、修改完成后架构更清晰(每个文件职责单一,易于维护,减少了不必要的中间层),代码更简洁(ChatView从436行减少到约280行,移除了重复的组件子定义),维护性更好(组件独立,便于单独测试和修改,文件结构更符合SwiftUI最佳实践),当然每次Cursor在修改完后都会这么说,还是要实际测试一下修改成果

15、继续测试具体的功能,首先发现在与支持深度思考的DeepSeek R1模型对话时,思考内容和回答内容混在了一起,未能像之前规划的那样分成两块,并且思考内容要可以折叠,可以展开,Cursor在分析后修改了OpenAIService中的seperateThinkAndAnswer函数,以正确解析思考内容,但仍然没有解决问题

16、我现在觉得可能将iOS版的ChatWith修改成Mac版,再逐个测试、恢复功能,可能是做了大量的重复工作,既然之前NoteWith for Mac已经基本可用了,那其实可以对它进行简化,实现我对ChatWith for Mac的一系列需求,于是复制了一份NoteWith for Mac的源文件,并要求Cursor将应用的名字改成ChatWith,这一过程包括将应用名称由NoteWith改为ChatWith、更新XCode项目文件中的名称引用、更新Swift文件中的名称引用、更新Info.plist文件、重命名相关文件夹和文件等

17、Cursor很快完成了修改,并且按照我的反馈替换掉了一些漏网之鱼,接下来就是去掉待办事项模块、测试功能了,后面可能还要把备忘录替换为收藏,去掉待办事项模块及相关功能包括了分析待办事项模块的组件和依赖、移除待办事项相关的数据模型、移除待办事项相关的视图、移除待办事项相关的视图模型、从DataManager中移除待办事项相关代码、从导航中移除待办事项相关项目、从项目文件中移除待办事项相关文件等步骤,并且根据我的反馈删掉了两处遗留的待办事项相关功能

18、构建成功后,整理了文件结构,特别是Views文件夹下既有AIChat和Notes两个文件夹来存放AI对话和备忘录相关的视图文件,又有大量视图文件散落在Views文件夹下,ViewModels文件夹也有类似问题,移动文件并更新project.pbxproj中的路径后,问题解决,结构清晰了一些

DevLog:2025年9月12日

1、继续修改备忘录模块,目前已经应用了MarkdownUI,但仍然没有实现我希望的所见即所得的效果,仍然需要点击编辑按钮才能修改内容,修改之后变成了点击备忘录内容区域就能进入编辑模式,在编辑模式下使用TextEditor进行纯文本编辑,在预览模式下显示MarkdownUI渲染的效果,并且支持文本选择
2、接下来尝试用MarkdownUI优化AI回答内容的渲染效果,先用MarkdownUI优化除代码块和表格之外的内容的渲染效果,因为代码块和表格已经有单独的文件在渲染,Cursor通过在UnifiedMarkdownView中添加import MarkdownUI,并将.text组件的渲染从简单的Text替换为Markdown(text),实现了这一需求
3、然后用MarkdownUI渲染了AI回答中的表格,让普通文本和表格渲染效果一致,再将MarkdownUI用到代码块的渲染中,我发现在这个过程中Cursor修改的文件是UnifiedMarkdownView,并不是专门用于渲染代码块的CodeBlockView和MarkdownWithCodeBlocksView,以及专门用于渲染表格的TableView和MarkdownWithTablesView,询问后Cursor表示这些文件目前没有被使用,于是删除并修改了项目文件,移除对这些文件的引用,之后测试了一个新的问题,删除这四个文件的确对AI回答的渲染没有任何影响,现在AI问答中所有的Markdown内容都通过MarkdownUI进行统一渲染
4、真真切切感受到了使用成熟的三方库给应用开发带来的效率提升,之前为了实现对代码块和表格的渲染不知道修改了多少次代码才让这两个模块的显示效果基本可用
5、但现在还有CodeBlockParser、TableParser、MarkdownTableCell 三个文件,不知道是否还在使用,询问Cursor后得到的答复是只有TableParser还在使用,它定义了TableRow结构体,是UnifiedMarkdownView中表格解析的核心数据结构,所以仍然保留了这个文件,另外两个文件已经不再使用,直接删除并修改了项目文件,实测对目前的AI回答内容渲染效果无影响
6、发现在AI对话列表里,有部分对话只显示了标题,没有显示摘要,这和我之前的规划不符,再次明确标题默认是我在这个对话中提出的最后一个问题,下面小字默认是最后一个回答内容的前50字
7、由于近期对应用的修改较为频繁,猜测可能还有部分文件也没有被使用,但依然存在于文件目录中,于是直接让Cursor检查目前还有哪个文件未被使用,并明确“先检查下,不要直接删除”防止像上面第3步那样直接删除多个文件,虽然没有什么实际影响
8、检查发现MarkdownTextView、MarkdownRenderer都已被MarkdownUI取代,还有多余的DataManger,以及前边经过分析认为有用的TableParser,都可以删除,决定让Cursor逐个删除并测试构建,确认没有依赖关系,在将这些文件删除,并且将原本在TableParser中定义的TableRow结构体移到了UnifiedMarkdownView中之后,构建成功,并且AI问答和备忘录的渲染依然正常,今天一共删除了大概9个文件,这下项目更干净了,且功能没受影响
9、AI问答的内容,与消息气泡的边缘的距离有些太近了,需要适当增加一点边距,询问Cursor了解当前的边距设定之后,将用户消息和AI消息的下边距统一由4增加到8,现在看来稍微好些了
10、发现不知道从啥时候开始,在AI对话、备忘录和待办事项三个界面,第二栏和第三栏之间无法通过拖动分割线调整比例了,我记得之前已经将这三个界面的第二栏和第三栏统一用HSplitView,并且设置了最大宽度、最小宽度和理想宽度,检查后发现AIChatSessionView、NotesListView和TodoListView都设置了固定的宽度300,会阻止用户通过拖动分割线调整比例,并且待办事项列表页也设置了最小宽度,也会影响待办事项列表(分组)的宽度
11、在修改过程中,我提出希望Cursor能够保存用户通过拖动调节的宽度值,Cursor创建了新的InterfaceSettings数据模型和ResizableHSplitView组件,前者用于持久化保存宽度设置,后者用于监听用户拖动分割线时的宽度变化,多次修改后默认宽度依然是400,虽然可以通过拖动分割线调整宽度,但调整后的宽度不会被保存,切换到其它界面再切回来,宽度依然是400,后续再修改
12、突然想看看最近Trae多次更新之后水平有没有什么提升,于是复制了一份ChatWith,改名为ChatWith for Mac,让Trae把这个iOS应用改成Mac应用,经历了修改项目文件、Info.plist、ContentView、ConversationListView、ChatWith、MessageViews等等文件,以移除iOS特有、在macOS上不适用的代码,接下来就是漫长的构建失败-查找原因-修改-继续构建失败-清理缓存-继续构建失败的过程,在这一过程中遇到了6次“模型思考次数已达上限”的提示,即使经历了如此漫长的修改,仍然构建失败,没想到Trae的Auto模式还是这么难用,第七次提示模型思考次数已达上限之后终于还是没耐心了
13、由Cursor接手继续修改,指令“这是一个由iOS应用改成的macOS应用,但在修改过程中反复出现构建错误,看一下原因”,Cursor在构建一次之后直接定位了问题所在,于是创建了任务列表来修复错误,只用了几分钟就构建成功,为什么Trae连快速定位问题都做不到呢?
14、而且Trae在修改过程中,还在项目文件夹里创建了很多个扩展名为.o的文件,Cursor表示这是编译过程中的中间产物,包含机器码,但通常应该在DerivedData目录下,而不是在源代码目录,于是让Cursor直接删掉了这些文件
15、然后让Cursor评估是否还需要原本iOS应用的启动画面文件SplashView,macOS应用通常直接显示主界面,不需要启动画面,删除此文件后Cursor同步从项目文件中移除了SplashView的引用
16、测试发现应用可以打开,但在Dock栏没有图标,且打开的应用没有直接出现在所有窗口最前,让Cursor修改之后解决了应用未显示在所有窗口最前的问题,但应用的图标不是macOS应用默认的图标,接下来让Cursor排查目前未被使用的文件,包括了由Trae创建的测试文件TestFile.swift,以及Package.swift(Swift Package Manager文件,但项目使用的Xcode项目,又是一个Trae的迷之操作),果断删掉了这两个文件,然后在Xcode中重新打开项目所在文件夹,图标问题解决了
17、接下来可以测试和完善功能了,首先就是设置界面和AI对话界面弹窗太小的问题,完全看不到其中的内容(可能macOS上不太适合这种弹窗sheet的交互方式吧),Cursor同步修改了对话列表界面的弹窗、AI对话界面的模型选择器、设置界面的模型编辑弹窗、收藏界面的弹窗,但修改效果不佳
18、发现Cursor在最近更新后,修改过程中会标出哪个操作使用了用户的习惯或规则
19、接下来,优先把应用的数据存储方式由UserDefaults改成User Defaults和Core Data混用

DevLog:2025年8月28日

1、本周着实有点忙,这两天一行未改,先继续修正AI对话内容显示不全的问题,现在只显示一行或者几行,需要滑动才能看到全文,Cursor认为这是一些文本显示组件没有正确设置高度约束导致的
2、还没测试,有点纠结为什么每次新打开一个Cursor对话,就会在修改后尝试直接启动应用,每次都需要我跟它强调下不要直接打开应用,构建下看看有没有编译错误就行,然后在Cursor设置的Rules&Memories中发现了它可以根据过往对话内容学习我的偏好,并且列出了我的这项要求“The user prefers that the assistant not open the application automatically”,果断同意
3、查看已保存的记忆时,发现其中还有一条“用户要求每次构建时,默认使用iPhone 16模拟器,除非用户单独指定其它机型”,稍微修改了下,增加了“在构建iOS应用时”
4、继续测试,发现仍未解决,Cursor继续修改了文本容器的配置、文本视图的垂直调整大小设置等等, 但未解决问题,Cursor再次提出要用Swift的Text组件来替换NSTextView,在确认不会影响备忘录(只修改MarkdownWithCodeBlocksView,不修改备忘录使用的渲染组件)之后,我同意了替换
5、现在AI问答的内容可以完整显示了,但无法选择回答的内容了,且有部分Markdown语法的渲染效果不太好,比如链接不能点击直接打开、同时应用加粗和标题语法的内容仍然会看到语法标记等等,于是让Cursor检查一下还有没有其它的语法渲染效果可以优化一下
6、Swift的Text无法实现文本选择,还是回到了NSTextView,然后AI问答内容又不正常显示了,所有的AI问答内容都只能看到一行,继续修改,多次修改后终于可以同时实现问答内容全部显示、文本选择和Markdown渲染了,发现在和Cursor对话时,问题描述要尽量详细,并且每次修改后有什么变化都要一起告诉它,便于它判断上一步的修改方法是否正确,让下一步的修改更有针对性
7、虽然达成了上述目标,但用户消息和AI消息的一直有白色的底色,多次修改也去不了,于是换个思路,将用户消息和AI消息的浅绿、浅蓝底色统一为NSTextView的默认底色,再调整了间距等细节
8、今天到此为止了,明天继续优化Markdown渲染效果,看能否去掉隐藏的Markdown语法占据的位置,现在回答内容里的空格有点多,然后把默认行间距调整为1.2倍,现在排版有些太紧巴了
9、另外吐槽一下,最近遇到Connection Failed提示的次数有点多