mirror of
https://github.com/NanmiCoder/cc-haha
synced 2026-07-27 15:13:37 +08:00
解决了以下问题: 1. 文件树不展示隐藏文件:新增"显示隐藏文件"按钮,默认仅隐藏 .git 目 录,开启 toggle 后显示全部文件。通过 query 参数 showHidden 从 前端 store 贯穿到后端 readTree,过滤逻辑改为可切换而非硬编码。 2. 文件树不自动同步文件变化:在 WebSocket 连接建立后对 workDir 启 动 fs.watch 递归监听,200ms 防抖后通过新增的 file_changed ServerMessage 推送到前端。前端 handleFileChanged 收到后自动刷新 变化文件的父目录树和已打开的预览标签,保持展开状态不变。 3. 手动刷新文件树后展开节点内容丢失:修复 handleRefresh 逻辑,去掉 invalidateExpandedTreeCache 的破坏性清除,改为先清缓存再并行加 载所有展开路径,避免展开节点数据被删除后未重新加载。 4. Mermaid 流程图节点文本不显示:DOMPurify 的 svg profile 默认 过滤 foreignObject 元素(Mermaid 用其渲染节点文本),添加 ADD_TAGS: ["foreignObject"] 允许通过。 5. 新增 KaTeX 公式渲染:支持行内公式 $...$ 和块级公式 $$...$$, 在 marked 解析前预处理避免特殊字符被转义。 6. 新增 PlantUML 图表渲染:服务端 POST /api/settings/plantuml/render 通过本地 plantuml.jar 渲染 SVG,前端设置页面支持配置 jar 路径。 未配置时回退为语法高亮代码块。 7. 文件预览 Tab 新增刷新按钮:只刷新当前文件内容,不影响文件树。 8. 浏览器模式开发支持:vite.config.ts 添加 proxy 将 /health、/api、 /ws 代理到后端 127.0.0.1:3456。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
4.3 KiB
4.3 KiB
功能改动说明
分支:feature/workspace-enhancements
一、文件树增强
1.1 隐藏文件控制
入口:文件树工具栏 👁 按钮
行为:
- 默认关闭(
showHiddenFiles: false),不显示.开头的文件/目录 - 开启后仅过滤
.git,其余隐藏文件可见 - 状态通过
workspacePanelStore.showHiddenFiles管理 - 传递给后端
readTree的showHidden参数
涉及文件:
| 文件 | 改动 |
|---|---|
src/server/services/workspaceService.ts |
readTree 添加 showHidden 参数,默认 false 过滤 . 前缀,true 仅过滤 .git |
src/server/api/sessions.ts |
从 query string 读取 showHidden 参数传给 readTree |
desktop/src/api/sessions.ts |
getWorkspaceTree 添加 showHidden 参数,拼接到请求 query |
desktop/src/stores/workspacePanelStore.ts |
添加 showHiddenFiles 状态 + toggleShowHiddenFiles 方法,loadTree 传递参数 |
desktop/src/components/workspace/WorkspacePanel.tsx |
工具栏区域添加 👁 按钮 |
1.2 软连接支持
行为:
- 文件树中软连接条目显示
🔗(link) 图标 - 通过
Dirent.isSymbolicLink()检测,无需额外 stat 调用
涉及文件:
| 文件 | 改动 |
|---|---|
src/server/services/workspaceService.ts |
WorkspaceTreeEntry 添加 isSymlink: boolean,readTree 中调用 entry.isSymbolicLink() |
desktop/src/api/sessions.ts |
前端 WorkspaceTreeEntry 类型同步添加 isSymlink |
desktop/src/components/workspace/WorkspacePanel.tsx |
文件节点和目录节点添加 link 图标(isSymlink 为 true 时) |
1.3 文件监听
行为:
- WebSocket 连接建立后,对会话 workDir 启动
fs.watch({ recursive: true }) - 文件变化 200ms 防抖后通过
sendToSession推送{ type: 'file_changed', sessionId, path } - 前端收到后自动刷新展开的树节点和预览标签
- 不监听
node_modules
涉及文件:
| 文件 | 改动 |
|---|---|
src/server/ws/events.ts |
ServerMessage 添加 file_changed 消息类型 |
src/server/services/workspaceService.ts |
新增 startWatcher(sessionId, workDir) / stopWatcher(sessionId) 方法 |
src/server/ws/handler.ts |
open() 中启动 watcher,close() 中停止 watcher |
desktop/src/stores/workspacePanelStore.ts |
注册 file_changed handler,刷新树和预览标签 |
二、PlantUML 渲染
2.1 前端渲染组件
行为:
- Markdown 中
@@@plantuml/@startuml ... @enduml代码块自动渲染为 SVG 图表 - 渲染结果经过
DOMPurify.sanitize()安全清洗 - 渲染失败时显示错误信息
涉及文件:
| 文件 | 改动 |
|---|---|
desktop/src/components/chat/PlantUMLRenderer.tsx |
渲染组件:调用后端 API 获取 SVG,DOMPurify 清洗,error 状态 |
desktop/src/components/markdown/MarkdownRenderer.tsx |
添加 shouldRenderAsPlantUML 判定,分发到 PlantUMLRenderer |
desktop/src/components/chat/PlantUMLRenderer.test.tsx |
5 个测试:SVG 渲染、头部、预览弹窗、空 SVG 回退、错误状态 |
2.2 后端 Pipe 渲染
行为:
- 从
execFile + 临时文件改为spawn -pipe模式 - stdin 写入 PlantUML 源码,stdout 读取 SVG
-Djava.awt.headless=true避免 macOS Dock 图标- 去掉临时文件 I/O
涉及文件:
| 文件 | 改动 |
|---|---|
src/server/api/settings.ts |
handlePlantumlRender 改用 spawn('java', ['-Djava.awt.headless=true', '-jar', jarPath, '-tsvg', '-pipe']) |
三、KaTeX 公式渲染
行为:
- Markdown 中
$...$行内公式和$$...$$块级公式自动渲染 - 通过
marked标记扩展在渲染 Pipeline 中处理
涉及文件:
| 文件 | 改动 |
|---|---|
desktop/src/components/markdown/MarkdownRenderer.tsx |
添加 KaTeX 渲染逻辑,katex.renderToString 处理行内/块级公式 |
四、开发工具
4.1 start-dev.sh
位置:docs/script/start-dev.sh
行为:
- 启动后端
bun run src/server/index.ts(port 3456) - 启动前端
cd desktop && bun run dev(Vite port 1420) - 浏览器打开
http://localhost:1420
4.2 Vite Proxy
位置:desktop/vite.config.ts
行为:
/api/*,/health→http://127.0.0.1:3456/ws→ws://127.0.0.1:3456