DevLog:2025年9月23日

1、突然发现Cursor的DashBoard统计竟然正常了,又能看到近期修改、建议、接受的代码量了

2、先让Cursor结合当前应用的功能更新了一下README文档,主要的变化除了将备忘录改成收藏之外,还有数据持久化方案由UserDefaults变成了Core Data,Markdown渲染由自定义解析器改为MarkdownUI等等

3、接下来优化上周遗留的设置列表显示局促的问题,直接将SettingsListView添加到对话,并要求Cursor优化一下这个设置列表文件,目前显示有点局促,看它能否理解,Cursor调整了间距、布局,增加了卡片式设计和选中指示器,但总觉的跟另外两个界面的风格不是很搭,设置列表左右两侧和上方有明显的空白

4、统一调整了设置列表SettingsListView、收藏列表NotesListView、对话列表AIChatSessionListView三个文件的选中状态,不再使用圆角,因为圆角会导致出现一些小的空白,反而不够美观,然后调整了设置列表的点击区域和底色,点击区域扩大到整行而非文字部分,至于底色,多次修改并让Cursor对比文件后,发现是因为设置列表使用的是List容器,而收藏列表使用的是ScrollView+LazyVStack容器,List容器有自己的默认背景色和样式,于是也将设置列表改成了收藏列表一致的容器,问题解决

5、然后调整了数据统计、回收站的细节,还是之前调整备忘录和AI对话顺序后的后遗症

6、下一步清理当前应用中的调试信息,AI对话部分调试信息很多,可能也会影响应用的性能,Cursor一次清理了8个文件中的67行调试信息,并且处理了一个警告信息,明天再测试当前应用的功能,规划下一步修改,并尽快打包当前应用,实机安装、测试

DevLog:2025年9月15日

1、目前ChatWith for Mac使用的数据存储方式是UserDefaults,虽然目前应用的功能还很少,UserDefaults足矣,但这种存储方式不适合大量数据存储,数据量大时读写较慢,只能存储基本类型和可编码对象,且不支持复杂查询,决定趁现在应用功能还少(并且参考NoteWith的教训,将数据存储方式切换到Core Data之后基本上所有功能都要重新测试、大量修改),先把对话数据切换到Core Data,设置类的数据仍然用UserDefaults
2、Cursor拆解步骤包括:设置Core Data模型和持久化容器、创建Core Data实体模型、更新ConversationManager使用Core Data、迁移现有的UserDefaults数据到Core Data,修改过程中Cursor创建了新的文件,但没有直接修改项目文件,反而又把新文件删除了,打断操作后纠正了这种无故回退的操作,而且反复创建版本化的模型文件
3、为了优先保证成功构建,Cursor先创建CoreDataManager,并通过CoreDataManager管理对话数据,但底层先使用了UserDefaults,在我的要求下切换到了Core Data,创建了ChatWith.xcdatamodeld模型文件,定义了ConversationEntity和MessageEntity实体,设置了正确的属性和关系映射(之前用Trae时创建模型文件、定义实体和设置属性、关系映射都需要手动操作),同时还实现数据迁移机制,自动检测并迁移现有的UserDefaults数据到Core Data
4、但目前这个应用还不需要数据迁移机制,于是修改了CoreDataManager和ConversationManager,移除了数据迁移相关代码,至此,对话数据使用Core Data进行持久化存储,设置数据继续使用UserDefaults
5、测试发现有多个文件出现了onChange相关的警告,这是因为在macOS 14.0中,onChange(of:perform)语法被弃用了,需要使用新的语法,修改后警告消除
6、还有一处警告信息:ChatWith isn’t code signed but requires entitlements. It is not possible to add entitlements to a binary without signing it.这是因为应用中又entitlements权限文件,但没有进行代码签名,macOS要求又权限文件的应用必须进行代码签名,Cursor认为目前应用不需要特殊权限,于是将其删除,后续如果需要将应用发布到App Store或者需要特殊权限时可以重新创建entitlements文件并配置签名代码、添加必要的权限声明
7、接下来修改应用的布局,先修改对话和收藏界面,左侧是列表,右侧是详情,Cursor使用了NavigationSplitView来替代以前的TabView,并且创建了左侧边栏SidebarView、右侧详情DetailView
8、之后扫了一遍所有的文件,删除了未被使用的FavoritesView和ConversationListView
9、接下来测试具体的功能,从添加模型、发起对话开始,首先在设置中添加模型时,目前的设置界面显示非常局促,不能完整显示具体的设置内容,要求Cursor将其改成分栏布局,即使用NavigationSplitView,并且调整了界面的文字和图标大小等等,但多次调整后依然有部分元素被遮挡,看来还得重新规划一下应用界面的布局,可能NoteWith目前在使用的三栏布局的确是比较好的方案

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月29日

1、首先让Cursor把深度思考内容的底色换成浅灰色,目前的颜色在AI对话界面中略显突兀,因为提问和回答内容都改成了白色
2、需要继续优化AI回答内容的Markdown渲染效果,渲染后的内容能否不以空格替代语法占的位置?比如加粗的文字前后都有两个空格,Cursor表示在Markdown样式应用的过程中,代码使用了NSColor.clear来隐藏语法标记,但这只是让语法标记变透明,并未真正移除它们占用的空间,需要用字符串替换来真正移除语法标记
3、但测试发现使用字符串替换的效果不好,回答内容被截断,且原本使用了同一个Markdown语法的内容,部分文字有渲染效果,部分没有,尝试用属性应用而不是字符串替换,一顿操作之后,又回到了之前的效果,渲染后的内容还是以空格替代了语法标记占的位置,又是一个悬而未决的问题
4、如果改用SwiftUI的Text来渲染AI对话内容,会失去文本选择功能、失去右键菜单、文本搜索等高级文本交互功能,Markdown渲染也会有限制,还是继续保持目前的NSTextView吧
5、发现在AI对话列表中点击右键修改标题时会弹出弹窗,可以在弹窗里输入新标题,但弹窗上方一直有一个空的icon,之前也修改过多次,但删不掉,于是要求改成点击右键修改标题,直接在对话标题位置修改、回车确认,修改过程中发现AIChatSessionListView和AIChatView在功能上有一些重叠,Cursor分析后发现AIChatSessionListView没有被使用,AIChatView中包含了了会话列表和聊天功能,于是决定把会话列表相关功能从AIChatView中迁移到AIChatSessionListView里,这样更便于后续对聊天功能和列表功能进行分别管理,然后修正了导航栏消失、部分界面变成四栏布局等问题
6、接下来需要统一一下AI对话列表和AI对话之间、备忘录列表和备忘录详情之间的分割线样式、底色样式,选中样式,以及拖动调整比例的功能,在实现这一需求的过程中,将ContentView中有关AI对话列表功能完全移动到了AIChatSessionListView中,这下ContentView就只专注于导航和界面切换了,减少了跨组件的状态传递,符合单一职责原则
7、然后统一了两个列表的默认宽度(最小200、理想300、默认300、最大400)和样式(首次打开和切换时不选中任何一条内容、每个条目都不需要用圆角,翻译一下,正确的说法应该是移除自动选中和圆角设计)
8、发现在Views/Notes/Components文件夹下有两个文件,SearchBarView和EmptyStateView,但不知道这两个文件现在还有没有用,这是之前使用UserDefaults来存储数据时,Cursor拆分的组件,现在NotesListView里已经有了重复的组件,SearchBarView用于在备忘录中搜索内容,EmptyStateView是空状态显示组件,Cursor建议删掉这两个文件,我觉得目前这俩文件好像也没啥用了,甚至这两个文件都没有被项目文件引用,删完之后项目结构更加整洁了
9、AI对话和备忘录列表修改告一段落之后,我又开始看待办事项分组列表,询问Cursor后发现这个列表不是单独的文件,是TodoListView文件的中的一个组件,并且备忘录界面使用了HSplitView,可调节宽度,待办事项界面使用了HStack,固定布局,虽然备忘录分组管理的功能完整,但界面布局和AI对话、备忘录列表不一致,还是决定以后要改成一致的

DevLog:2025年8月18日

1、截至目前已经用Cursor编辑了63939行代码,今天继续让Cursor恢复各个模块的功能,并优化应用界面和交互,整体原则就是优先用已有的代码
2、首先是AI对话相关功能,从添加模型开始,添加模型功能目前不能正常使用,填写所有信息并点击添加后,没有保存到模型列表里,且添加模型界面需要增加一个备注字段,优先用已有的代码来实现此功能
3、在可以保存模型之后,发现只能删除,不能编辑模型,且API Key、Tavily Key都是以明文显示,也不安全,点击AI对话右上角的模型切换按钮,也看不到目前已有的模型,继续让Cursor修正
4、一直以来都是使用Cursor的Auto模式,但今天第一次见到它出现了思考过程,今天这是在调用什么支持深度思考的模型了吗?
5、继续调整模型添加和选择相关功能,比如把备注字段放在添加和编辑模型界面的最上面,对话界面右上角也显示备注字段,显示选择状态等等
6、AI模型的添加、编辑、切换基本搞定,接下来测试对话过程,首先遇到的问题是:已经填写了AI模型的信息,但提问后反馈“错误,未找到指定的AI模型”,在修改过程中发现目前存在aiModels和aiConfigs两种模型数据混用的情况,于是让Cursor检查有无其它功能仍在混用,Cursor检查后建议完全迁移到aiConfigs,因为它功能更完整,且不需要Core Data的复杂性,已经实现了完整的GRUD操作
7、有点疑惑UserDefaults和Core Data两种数据存储方式竟然可以混用?询问Cursor目前哪些地方用了UserDefaults,哪些地方用了Core Data,Cursor在梳理后表示现在的确是“分层混用”的状态,Core Data管理业务数据(笔记、会话、消息),UserDefaults管理轻量设置(外观、Tavily Key)以及AI模型配置aiConfigs,技术上是合理的,决定暂时保持目前的混用状态
8、继续测试AI对话相关功能,发现无论我问哪个模型,都会收到“这是一个模拟的AI问答。您的问题是:你好”的回答;对话内容没能保存到对话列表里;即使模型不支持深度思考,也会显示思考过程,看一下是怎么回事,并且尽量使用已有的文件和代码来解决问题
9、再次测试时发现无论使用哪个模型都会收到模拟的回答,而不是真实的AI的回答,并且AI问答列表显示的内容也有问题,继续让Cursor修正,Cursor表示是为了先确保实现其它功能,避免因误调用产生费用,而且即使真实调用失败时界面也能正常流转,但我不需要这种所谓的兜底方案,于是直接让Cursor真实调用AI模型,不需要模拟回答
10、然后又遇到了“网络连接错误”的提示,怀疑可能是Base URL的问题,询问Cursor之后,决定让应用自动补全/chat/completions,并且在AI模型添加/编辑界面增加说明文字,防止用户填错,Cursor添加了智能URL自动补全机制,如果用户只输入了基础地址(如 api.openai.com),会自动添加 https:// 和 /v1/chat/completions,如果用户已经包含了部分路径,会智能补全,从而避免重复添加路径导致的双重拼接问题,测试发现只需要填写最简单的网址就可以,比如https://api.deepseek.com、https://openrouter.ai/api
11、然后我发现无论模型是否支持深度思考,在回答时都会显示思考过程区域,如果模型不支持深度思考,就看不到完整的回答内容,让Cursor增加了自动判断模型是否支持深度思考的机制,修改过程中Cursor在AI模型设置中增加了深度思考开关,将决定权交给用户,我觉得还是自动判断更方便,于是改成了自动判断是否支持深度思考的方式
12、现在可以正常判断出deepseek r1支持深度思考了,思考过程可以展开/折叠,但即使展开也看不到思考过程的详细内容,在回答过程中,界面无法随着回答内容自动向下滚动,且看不到完整的回答内容,Cursor在修改过程中改进思考过程内容、改进自动滚动逻辑、改进内容更新机制,在测试过程中发现之前的MarkdownRenderer和CodeBlock相关功能还都有效,太棒了!
13、我之前有要求Cursor在AI对话页的每条消息下面添加三个按钮,收藏、复制、删除,不知道现在还有没有相关代码,没有的话就重新添加三个按钮和对应的功能,针对这一需求,修改后竟然给思考过程和回答内容增加了不同的背景色,但思考过程应该在回答内容上方,继续调整
14、调整完这些之后,AI对话界面的问题和回答都统一居左了,让Cursor调整了下,问题在左边,思考和回答在右边,然后点击收藏消息时,不要滚动到底部,保持在当前的浏览位置就行
15、接下来测试Tavily相关功能是否正常,询问deepseek r1一个需要搜索最新信息的问题,同步测试下深度思考是否正常,能否看到搜索链接,能否点击打开对应页面,能否收藏等功能,发现1.深度思考可以按句流式输出,但看不到完整的思考内容,只能看到最后两行 2.目前项目文件里已有Tavily相关文件和代码,回答内容的下方需要展示Tavily参考的链接,并且可以点击打开链接,看看现有的文件是否支持该功能 3.回答内容中包含网址时,其中的“.”会显示为“。” 4.点击收藏按钮,虽然提示收藏成功,但没有出现在备忘录列表里,四个问题全部反馈给Cursor修改
16、今日遗留问题:1.AI回答内容里的“.”都显示成了“。”,网址和代码都受此影响;2.思考内容虽然支持流式输出,但始终只能看到两行,看不到全部思考内容;3.提出问题后,只有主动滑动一下才能看到底部的“AI正在思考中”的提示
17、Cursor已经开始建议我“Start a new chat for better results”,难道是这个对话里内容太多了?明天重新开启一个对话之后再修正这三个遗留问题,然后测试其它功能

DevLog:2025年8月17日

1、今天重点优化备忘录相关功能,首先我发现备忘录列表里显示的备忘录内容不会随修改更新,比如备忘录里明明有文字,列表里却显示“空内容”,另外需要把备忘录标题下面的“文本编辑器”和右侧的字数统计去掉,因为界面右下角已经有字数统计了
2、修正这一问题后,发现又看不到支持深度思考的模型的思考过程了,并且在AI回答时,界面也不会自动向下滚动,可能是昨天将MessageView从AIChatView中拆分出来之后又有部分功能丢失了?先把这部分功能加回来,然后优化一下输出时的卡顿问题
3、继续优化备忘录,测试时发现了“列表顺序会随着点击发生变化,而不是只有修改内容时才会变化”和“光标自动跳转到结尾”的问题,在修改过程中,我发现虽然目前用的TextEditor是纯文本编辑器,但当前仍然有用到NSAttributedString来进行富文本处理,其实现在不需要处理富文本了,于是让Cursor去掉了富文本相关的代码
4、发现部分备忘录内容可以正常显示,部分不能,Cursor排查后发现Note模型有两个内容字段,一是markdownContent的纯文本内容,二是attrbutedContent的富文本内容,Cursor修改后改为二者均可正常显示,且优先使用前者,如果前者为空则使用后者
5、在修正备忘录问题的过程中,让Cursor去掉了知识库相关功能,暂时没有想好知识库该怎么用,而且知识库目前的存储也是以备忘录的形式存储的,和备忘录有些重合,先优化备忘录模块,后面再考虑更加其它功能吧
6、然后又修正了AI对话删除之后同时存在于列表和回收站的问题,修正了AI对话右上角无法切换模型的问题,奇怪的是之前我明明记得有一个AIModelSelectorView文件,啥时候消失了?
7、在让Cursor美化AIModelSelectorView时,美化有些过度了,并且再次出现了macOS不支持的SystemGray颜色,仍然时从iOS迁移至macOS的后遗症
8、结合当前应用的功能,让Cursor更新README,同时更新了应用的版本号为0.1,涉及info.plist和project.pbxproj两个文件
9、还在纠结数据的存储方式,因为UserDefaults主要用于存储一些配置相关的数据,在存储大小、性能、数据完整性、扩展性上均有限制,Cursor建议在数据量增长后迁移到Core Data或SQLite,比如数据大小超过5MB时,但因为对话内容中有大量的Markdown渲染,还有备忘录功能,数据可能很快就超过5MB了
10、决定先把目前的0.1备份一下,然后把数据存储机制改成Core Data,并且不需要迁移已有数据
11、Cursor表示要完成这一迁移,需要如下步骤 1.首先创建Core Data模型文件 2.创建Core Data管理器 3.更新数据模型以使用Core Data 4.更新DataManager以使用Core Data 5.更新相关的ViewModels,接下来当然又是修改项目文件、修复编译错误的漫长过程,待完成后再挨个测试功能
12、在修复编译错误的过程中,Cursor为了能更快解决编译错误竟然删除了五个视图文件,我拒绝,让它重新创建这五个文件,然后修正错误,因为担心后面还会再删除其它文件导致应用功能大量缺失
13、累计修复了:类型定义问题、可选值处理、方法签名修复、ScrollViewReader问题、Core Data关系处理、视图组件修复,以及几处警告,终于可以成功构建了
14、接下来测试功能,一打开App天都塌了,缺失了大量功能,接下来逐个修复,
1.备忘录界面没有创建备忘录的按钮 2.去掉预置模型中的所有模型,让用户自己添加,并且在添加模型界面增加Tavily密钥字段 3.AI模型管理界面无法关闭或返回 4.整体布局也很奇怪
15、Cursor还是将应用改成了三栏式布局,之后恢复设置功能,其中包含统一管理模型、数据统计、切换深色浅色模式、管理回收站等功能,并且提出优先让Cursor使用已有的文件和代码
16、然后调整了关于、模型管理功能(既然已经没有预置模型,那就不再需要每次打开应用时都删除了)、调整搜索功能(在导航栏里添加搜索按钮,点击弹出搜索弹窗,去掉备忘录界面的搜索按钮),仍然要求优先用已有的代码,目前已经恢复了应用的布局,今后再恢复各个功能