DevLog:2025年10月15日

1、上次修改搜索功能之后,增加了点击搜索结果立刻跳转到应用的对应内容的功能,实测可以跳转到对话的对应位置,但不能跳转到收藏的对应位置,在搜索结果页面,对话和收藏条目下的更新时间显示也有问题,对话内容创建于几天几小时前,收藏内容更新于几天几小时前,统一成创建于年月日,小时分钟,与对话列表和收藏列表条目的时间显示形式一致,让Cursor检查并修正一下

2、修改过程中发现,前者是因为CoreData对象不能直接跨不同的实例传递,需要通过ID来传递和查找Note对象,后者是将相对的时间格式改成绝对的时间格式,修改后测试,时间显示正常了,但点击对话和收藏的搜索结果都无法直接跳转到对应位置

3、通过反复的添加调试信息、反馈调试信息定位并解决了问题,并且适当缩短了等待时间,目前点击搜索结果中的对话内容可以直接跳转到对话所在位置,点击收藏内容可以直接打开对应的收藏条目,已经基本实现了优化搜索页面的需求

4、上次修改应用时,我想到可能需要按照macOS 26的最新设计规范来调整一下ChatWith for Mac的界面,于是询问Cursor“你熟悉最新的macOS Tahoe应用设计规范吗?如果要对当前的应用的UI做一些针对macOS Tahoe的优化,你有什么建议?在进行这些修改后,还能否兼容macOS Tahoe之前的系统?”Cursor的回答很诚实:我需要先确认一下您提到的 macOS 版本。根据我的知识(截止到2024年4月),Apple 的最新版本是 macOS Sonoma (14.x) 和 macOS Sequoia (15.x)。我没有关于”macOS Tahoe”的具体信息。

5、不过Cursor也给了一些既适用于macOS 14.0 Sonoma,也能保持向后兼容的UI优化建议,包括材质和视觉层次、增大圆角和边距、使用Typography排版、增加hover效果等交互反馈、使用多色SF Symbols等等,这些都是锦上添花的东西,不急,还是继续优化功能更要紧

6、下一步计划增加上传图片和文档的功能,在对话界面的联网搜索和发送按钮之间增加附件按钮,点击可以上传本地的图片或文件(主要是文档格式),上传之后不直接发送给 AI,可以在输入框补充一些文字需求,一并提交

DevLog:2025年10月11日

1、节前发现的遗留问题如下,今天开始逐步修改:

1.当前搜索页面缺少返回按钮,实际上搜索功能目前还不全,搜完能看到关键词所在的对话/收藏,但点击不会跳转到对应条目,还得再完善下

2.联网搜索的触发词有点少,比如“今年”就无法触发搜索,需要进一步扩充,或者增加一个联网搜索按钮,点亮后开启联网搜索,或者改一下逻辑,在添加模型时只要填了Tavily Key,就开启联网搜索,并且在选择模型界面显示是否填写了Tavily Key,如果填写了就显示“联网搜索已开启”

3.问题太长时,对话界面上方的标题可能会断行,需要限制一下字数

2、首先修改上面的问题2,决定先用第三种方案,来解决部分AI模型因为训练数据比较老导致回答内容易出现错误的问题,要求Cursor修改一下联网搜索功能的逻辑,不再通过关键词判定是否开启联网搜索,而是在添加模型时只要填了Tavily Key,就会一直开启联网搜索,并且在选择AI模型界面显示“联网搜索已开启”,未填写Tavily Key的AI模型,则显示“联网搜索未开启”

3、但在这次修改后只要点击发送问题应用就会卡死,结合DEBUG信息,Cursor认为这是因为每次发送消息都会进行联网搜索会阻塞主线程,导致应用卡主,并且会消耗大量API配额、增加不必要的延迟,于是又给我改回了之前的方案1

4、可能方案2会比较合适?尝试让Cursor在发送按钮旁边增加一个“联网搜索已开启/已关闭” 的按钮,需要用户手动开启/关闭,默认是关闭状态,不用关键词来判定是否开启联网搜索,但在发送问题后仍然会让应用卡住,Cursor分析表示虽然代码本身是异步的,但可能存在网络请求没有超时控制(Tavily搜索请求可能长时间等待)、缺少用户反馈(用户不知道搜索正在进行)等问题,于是给TavilySearchService添加了超时控制、给AIService添加了搜索状态反馈,改进了AIViewModel和AIChatView的UI状态显示,但依然没有解决问题,甚至现在即使不打开联网搜索开关,点击发送按钮时应用也会卡死,而且也没有看到Cursor给AIService添加的调试信息

5、近期Cursor频繁更新,先更新一下再重新开启对话来修正这个问题,另外在将电脑系统更新到最新的macOS  Tahoe 26之后,由于整个系统的界面都有变化,ChatWith的一些UI也发生了变化,比如对话界面有些消息的边框看不到了,输入框的边框也看不到了,后面也需要调整下

DevLog:2025年9月26日

1、询问Cursor如何将当前的应用打包,没想到Cursor竟然直接用Archive命令给我完成了打包,并且创建了ExportOptions.plist配置文件,并使用macOS Developer证书签名,生成了通用的双架构二进制文件,并输出为.app应用程序包,放到了ChatWith_Distribution文件夹下,另有一个名为ChatWith_v1.0_macOS的分发包,应用大小3.5MB(毕竟应用的功能还很简单)

2、找到了第一个用户,直接发了分发包,解压放到Mac的“应用程序”文件夹,但打开时会提示:Apple无法验证ChatWith是否包含可能危害Mac安全或泄露隐私的恶意软件,需要在设置中允许一下,可能是没有签名吧,这个以后再说

3、发现了如下bug:

1.对话界面切换模型按钮无法直达添加模型界面,新用户首次打开应用可能会有点困惑

2.联网搜索的触发词有点少,比如“今年”就无法触发搜索,需要进一步扩充,或者增加一个联网搜索按钮,点亮后开启联网搜索,或者改一下逻辑,在添加模型时只要填了Tavily Key,就开启联网搜索,并且在选择模型界面显示是否填写了Tavily Key,如果填写了就显示联网搜索已开启

3.问题太长时,对话界面上方的标题可能会断行,需要限制一下字数

DevLog:2025年9月19日

1、决定让Cursor适当美化当前应用,包括调整间距和圆角、使用系统颜色、添加悬停效果、优化图标使用等,Cursor标识已经按照现代macOS设计趋势对ChatWith应用进行了全面的界面优化,主要改进包括:间距和圆角优化、系统颜色使用、悬停效果和动画、图标优化、卡片式设计、侧边栏现代化、设置页面优化、搜索界面优化等,使应用具备了更直观的交互、更舒适的阅读、更现代的外观和更好的可用性(Cursor每次对自己的作品都非常自信)

2、测试发现好像也没有太大的变化,侧边栏图标和间距更大了,AI对话和收藏两个列表的条目增加了卡片效果,选中时的动效和颜色有调整,但选中时的边框太粗了,让Cursor调整了下,选中条目时文字会稍微变大导致稍微有点糊,这种负优化还是要去掉,并且选中置顶的内容时,不要增加蓝色边框,也让Cursor一并调整了

3、然后修改了对话详情页面上方的标题,和AI对话列表的标题保持一致,即我询问AI的最后一个问题,猜测对话详情页对应的文件是AIChatView,选中文件并Add File to Cursor Chat,并直接提出需求,这样就减少了定位问题的复杂度,以后要逐渐深入了解应用的文件结构,修改起来也会比较快

4、设置列表SettingsListView还是略显局促,下周再修改

DevLog:2025年9月18日

1、先测试一下目前这个ChatWith for Mac的功能是否完整,然后考虑在保持简洁的基础上,对UI进行一些美化

2、第一个问题就是在收藏AI对话消息后,收藏的内容没有同步到备忘录中,解决之后发现备忘录没有默认标题,跟Cursor明确备忘录标题默认用“备忘录+收藏时间”,AI对话列表的标题下方添加最近一次AI回答内容的前20个字作为描述

3、目前AI对话列表中的条目仍无法获取最近一次回答内容的前20字作为描述,并且AI对话和备忘录两个界面的中间栏宽度默认好像是400,有点宽了,其实300就够了,但我希望的是默认300,最大400,先让Cursor去掉了AI对话列表中的描述文字,只留标题和更新时间,这样代码和界面就更简洁了

4、多次修改宽度限定和调节/保存机制未果,决定先简化需求,固定宽度为300,不允许调整,然后将“备忘录”改为“收藏”,不再需要编辑和预览的切换,始终显示预览状态就行,再在标题右侧添加一个“复制”按钮,点击可以复制收藏内容到剪贴板。Cursor修改了导航菜单,修改了NotesListView中的标题和文本,添加了复制到剪贴板的功能,移除NoteEditView的编辑功能、自动保存功能、编辑视图等等,至此已经将NoteWith基本修改成了ChatWith

5、然后再次更加了AI对话列表中标题下方显示描述文字的功能,这样对话和收藏两个列表页的样式就保持一致了,然后扫了一遍目前应用中存在的“AI对话”和“备忘录”,统一改成“对话”和“收藏”,涉及的文件包括负责搜索功能的SearchWindowView、负责回收站功能的RecycleBinView、设置页面SettingsDetailView、AI对话视图AIChatView、备忘录视图模型NotesViewModel

6、让Cursor去掉了我现在暂时还不需要的导入数据和导出数据功能,以后如果需要,并且想好了要怎么用这两个功能时,再添加

7、突发奇想,想看看目前这个应用的界面有没有什么可以优化的地方,直接问Cursor:结合近年来macOS端应用的趋势,你觉得现在这个应用的界面有没有可以优化的地方?Cursor给列举了非常多趋势和建议,高优先级优化包括侧边栏现代化、列表项卡片化、颜色系统优化,中优先级优化包括间距和布局、交互反馈、搜索体验,以及几项我看起来没啥用的低优先级优化,决定明天先让Cursor进行调整间距和圆角、使用系统颜色、添加悬停效果、优化图标使用等优化

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月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年8月8日

1、NoteWith默认模型的切换还是存在问题,正确的逻辑应该是:我将模型B设置为默认模型时,模型A自动取消默认模型状态,反之亦然,但现在我将模型B设置为默认模型时,模型A仍然还是默认模型;并且我将模型B设置为默认模型时,新建AI对话后自动使用模型B,多次修改后无果,决定先简化一下模型的选择和切换逻辑
2、简化内容包括:去掉“默认模型”和“当前模型”相关设置,在模型设置中不需要这两个功能,也不需要设置这两种状态,在创建新对话时,直接用AI模型列表里的第一个就行
3、测试发现Cursor直接把AI对话界面右上角的模型切换功能也给去掉了,还得加回来,在加回这个功能的过程中,我询问Cursor“你看下是否需要单独的视图文件来管理这个功能”,Cursor的确创建了一个单独的ModelSelectorView文件,但在将这个文件添加到项目文件的过程中,Cursor又突然说项目文件被损坏了,并且决定不创建单独文件,改为在AIChatView中直接内联定义ModelSelectorView,并且又恢复了昨天备份的一版项目文件,再次更新引用,感觉有点绕圈了,为什么之前可以直接修改项目文件,现在不行了呢?而且它这样恢复备份之后,我还得关掉Xcode,重新打开项目所在文件夹,好在测试后实现了我的需求
4、模型管理相关功能已经基本OK了,接下来就是思考内容的流式输出,在ChatWith上花了很多时间想完善这个功能,但一直没能达成,先跟Cursor明确下需求,针对支持深度思考的大模型,目前的应用是否会对思考内容进行流式输出?我需要看到支持深度思考的模型的思考过程,先流式输出思考内容,再流式输出回答内容,且思考内容和回答内容在样式上要有所区别,思考内容要支持折叠和展开
5、Cursor表示目前已经有部分功能支持了 ,但需要完善流式输出逻辑,更好地处理思考内容和回答内容的分离,并且优化UI交互(思考内容的折叠和展开),修改完成后测试,发现即使用的是DeepSeek-R1(深度求索官方的API)也不会出现思考过程,另外还有两个影响使用的问题1.在同一个对话里多次对话后,AI的输出就会变得特别卡,我再提出新问题时也会变卡 2.目前的markdown渲染也不是很完善,比如回答内容里有python代码时就无法正常渲染,可以看下截图,是不是还要再完善下MarkdownRenderer
6、Cursor认为可能是历史消息过多导致内存占用过大、每次发送消息时都加载全部历史记录、流式输出时的状态更新过于频繁,优化了AIViewModel、AIService中的历史消息处理,之后完善MarkdownRenderer,以支持代码块、语法高亮和图表,修改完成后连续回答多个问题之后应用还是会卡顿,对代码块的渲染效果也不是很好,另外还发现,在切换一个对话的模型之后,其它对话的模型也都会随之切换,我需要在每个对话中保存对模型的选择,比如在对话1中选择模型A,对话2中可以选择模型B,对话3中选择模型C,应该互不影响
7、Cursor认为卡顿是因为每次流式更新时都在主线程更新UI,并且频繁的状态更新导致界面卡顿,继续优化了AIViewModel中的流式更新逻辑,关于模型的选择,需要在每个对话中独立保存模型选择,修改之后前者略有改善,后者已经搞定
8、继续优化一下模型选择器的触控区域:点击AI对话界面右上角选择模型时,选择模型时,需要加大触控选取的范围,我需要点击整行时都可以选择对应的模型,现在只有点击文字区域时才会选择对应的模型,Cursor修改成了整个模型行都是可点击区域,并且认为这更符合iOS用户习惯
9、昨晚GPT-5刚发布,今天早上打开Cursor就提示已支持,并且可以免费使用,但我没有试用
10、突发奇想,问Cursor能否通过Tavily实现联网搜索,竟然可以,快速创建了一个Tavily搜索服务TavilySearchService,并且在AIConfig中添加Tavily API密钥配置,修改AIService集成Tavily搜索功能,Cursor表示需要在对话过程中输入搜索、查找、最新、新闻、今天、现在、实时、当前、最新消息、最近、近期等关键词才能触发联网搜索,并且会将搜索结果作为上下文提供给AI,但目前会自动获取前3个最相关结果
11、以后再测试集成Tavily搜索的效果如何,再看看要不要增加搜索结果数量,要不要调整填写Tavily API的位置等等
12、发现这两天Cursor明显变慢了,经常在修改过程中等待很长时间

DevLog:2025年8月7日

1、暂时决定不再纠结ChatWith不能全屏的问题,目前ChatWith和NoteWith的功能有些类似,可以先将这两天ChatWith新增的一些功能复刻到NoteWith上,比如多模型管理和切换,考虑到后续功能扩展和维护的需求,拆分一些视图
2、询问Cursor拆分建议后,竟然没有二次询问就直接开拆了,Views、Service、ViewModels、Models都进行了拆分,并且创建了项目重构的总结文档,但没有像往常一样直接开始构建测试,当然也没有添加新的文件引用、删除旧的文件引用,在修正文件引用错误后竟然构建成功了,但还没有测试原有功能能否正常使用
3、下达指令:我现在需要给应用增加“多模型管理及切换”的功能,给模型的设置增加一个“备注”字段,在“我的”界面可以显示当前已经添加的多个模型的备注名和模型名,然后在每个AI对话界面的右上角设置一个切换按钮,可以随时切换不同的模型,这也是给ChatWith添加多模型管理功能的经验
4、Cursor的最新版本有些地方和之前不一样了,比如之前在创建新文件后,可以直接修改项目文件已引用新文件,但现在要么先备份已有的项目文件,再从头创建新的项目文件,要么先写一个脚本,再执行脚本来更新项目文件,这种操作方式很奇怪,于是手动停止之后让它直接更新了项目文件,而且我还发现这次更新之后,虽然修改代码速度还是很快,但它需要很长时间才能继续进行下一步
5、之后基于Cursor的修改结果,优化一些细节:1.去掉AI对话界面右上角的设置按钮,我不需要从这里进入“我的”页 2.AI模型设置界面缺少备注字段(实际上“模型名称”就是“备注”,但下面又有另一个模型名称字段),我不需要设置“最大Token数” 3.从AI模型管理界面进入“添加模型”时,”模型名称”改成“备注”,把模型配置和基本信息合并,并且也不需要设置最大Token数 4.“编辑模型”界面同样需要把”模型名称”改成“备注”,把模型配置和基本信息合并,删除最大Token数的设定
6、然后发现修改后的应用在“AI模型管理”中可以完成所有模型相关操作,不需要单独的“AI模型设置”入口,让Cursor删除了这个入口,“我的”界面变得更加简洁了
7、接下来对应用功能进行测试并修改细节,包括添加模型、测试流式输出(含思考内容的流式输出)效果、修改发送按钮(发送后变成停止按钮,点击可以中断AI的回答)
8、多次修正细节之后,添加模型、发送/停止按钮切换功能都已支持,目标达成,且AI回答内容可流式输出,移除了我认为多余的“当前”标签和maxTokens设置
9、但还是存在默认模型无法切换、默认模型状态不能同步到每个位置的问题,明天继续修改,另外还需要对思考内容进行流式输出,并且与AI回答内容在样式上要有所区别

DevLog:2025年8月6日

1、目前在对话界面提交问题后应用还是会卡死,也没有“AI正在思考中”的状态提示,先让Cursor继续拆分ChatView,检查有无功能重复,如果与现有的单独文件有重复就保留单独文件,并且拆分ChatView中的部分功能为单独文件
2、Cursor拆分出了MessagefViews、ChatInputViews、ModelSelectorView、MessageDetailView四个文件,总计约200行,移除了所有重复的组件定义,提取的组件可以在其它地方复用,更易维护,ChatView现在是一个结构良好的主视图文件,进一步的拆分可能会增加不必要的复杂性
3、接下来继续测试功能,好像在和支持深度思考的模型对话时应用会卡死,且不输出回答内容,和不支持深度思考的模型对话时就能正常输出,但我现在不需要展示思考过程,直接给我展示AI的回答内容就行;另外,AI对话界面不能随着流式输出向下滚动;收藏时没有收藏成功的提示;收藏后的内容没有出现在收藏列表里,让Cursor检查下这几个问题
4、在让Cursor解决上述问题的同时,进一步优化MarkdownRenderer,以实现对表格的正确渲染,昨天测试了一个问题发现AI的回答中有表格,没能正确渲染,还是显示了大量的Markdown语法
5、发现在收藏列表页,点击收藏条目时不会打开,无法查看详情,而是会直接复制收藏的条目,看来可能在拆分文件后有部分功能失效了,继续修复
6、Cursor单个对话的Context Usage,难道是每天有限额,第二天自动重置?
7、再优化一些细节:去掉收藏列表长按菜单中的“查看详情”,直接点击就可以查看详情了, 不需要额外的按钮;现在AI回答内容和收藏内容都不能选取文字并复制,需要添加这个功能;还有对话列表向上滑动时底部会出现大片空白,我需要像收藏列表那样向上滑动时到最后一条就停止,不要出现大片空白;收藏夹列表右上角也添加设置图标,点击可打开设置界面
7、多次修改对话列表页底部的大片空白问题,在让Cursor添加调试信息后,发现可能存在重复计数的情况,将DEBUG信息截图发给Cursor并修复后解决了问题,并且还找回了之前不知道什么原因被删除的历史对话,没想到竟有意外收获
8、之后去掉了Cursor为了便于调试给对话列表和收藏列表添加的底色,并且在设置里添加了数据统计功能,可以查看对话数量和收藏数量,然后再优化三个细节:AI对话界面右上角显示的模型名称字体有点小,可以和左上角的“返回”字号保持一致;另外每次打开新对话时都使用默认模型,不用在设置中对模型进行选择了
9、接下来解决查看收藏相关的问题,比如:每次打开应用后,第一次打开一条我想要看的收藏时,弹窗是空白的,再打开另一条就可以正常看到内容;收藏列表貌似不是按收藏时间倒序;新收藏的内容不会立刻出现在收藏列表里;在对话中点击已收藏的内容并“取消收藏”时,不会取消收藏,多次修改后收藏和取消收藏功能均已正常
10、还有一个问题:目前的ChatWith用StoryBoard作为启动页面,NoteWith和DoitWith则是用SplashView作为启动页,这两种形式有啥区别?Cursor表示使用前者的场景有:简单的品牌展示、快速启动需求、不需要复杂动画、团队习惯Interface Builder;使用后者的场景有:需要启动动画、需要初始化逻辑(网络检查、数据加载等)、需要用户交互、需要动态内容、偏好代码管理,于是果断选择切换成SplashView,并且要求了ChatWith用40号加粗白色、副标题用title3、颜色用.white.opacity(0.8),和NoteWith、DoitWith保持一致
11、测试发现虽然可以正常启动,但我不清楚目前用的是SplashView.swift还是LaunchScreen.storyboard,Cursor检查时发现之前的LaunchScreen.storyboard还是没有删干净,除了文件本身外,还涉及了Info.plist、project.pbxproj中这个文件的引用,虽然这些地方都被Cursor修改了,但应用出现了不全屏显示的问题,清理Build Folder、重置模拟器之后,应用依然不能全屏显示,可能还是受到了早期代码的影响?
12、这次Cursor甚至创建了一个单独的全屏管理器FullScreenManager.swift,在多个生命周期点设置全屏,并在ChatWithApp、ContentView、SplashView、Info.plist中采用了多层全屏配置
UIScreen.main.bounds显示的是(0.0, 0.0, 320.0, 480.0),貌似是iPhone4的尺寸,后来还采用了硬编码的iPhone 16尺寸,依然没有解决问题,但我觉得应该没有这么复杂
13、之后把DoitWith的SplashView文件发给Cursor,对比了下有没有影响是否全屏的东西,也让Cursor重点检查下创建比较早的文件,看看有没有影响是否全屏的东西,毕竟这款应用刚由Trae创建时也存在不能全屏的问题,但还是没有解决问题
14、先让Cursor清理了多余的强制全屏的文件和代码,包括刚刚创建的FullScreenManager,之后在Cursor中开启新对话,决定让claude-4-sonnet来检查下为何应用不能全屏,并且要求只解决不能全屏显示的问题,不要修改其它功能,但这个模型在国内无法正常使用,即使架了梯子也不行
15、继续用Auto模式在新对话中检查不能全屏的问题,按照建议修改了下也没能全屏,然后在Trae中切换到Claude-4-Sonnet模型,继续检查不能全屏的问题,虽然没有直接解决问题,但它帮我发现了目前项目文件夹里有两个SplashView.swift,于是询问Cursor哪个是多余的,Cursor建议删除根目录中的SplashView.swift,保留Views文件夹中的同名文件,并修改项目配置,确保正确引用,但即使删除了根目录中的文件,并修改了引用,应用依然不能全屏