# CodeNest **Repository Path**: qfmx/CodeNest ## Basic Information - **Project Name**: CodeNest - **Description**: 基于wails+go的轻量级IDE编辑器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: chore/initial-project - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-22 - **Last Updated**: 2026-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CodeNest > 轻量级桌面开发集成环境(IDE),面向 Java 开发场景,追求低内存占用、快速启动、简洁界面与可扩展的 AI 编程能力。 ## 1. 项目简介 CodeNest 是一款基于 Wails 构建的轻量级桌面 IDE。 项目采用 Go 作为桌面后端,Vue 3 作为前端界面,已集成 Monaco Editor 作为代码编辑器;Java LSP 首版代码已接入,可在「设置 → Java」配置本地 JDK 与 JDT LS,提供补全、悬停、诊断和工作区内定义跳转。真实 JDT LS 项目及原生交互尚待验收,见 [Java LSP 接入](docs/lsp.md)。 项目不以完整复刻 IntelliJ IDEA 为目标,而是采用模块化架构,逐步构建一个启动快、资源占用低、核心功能实用的开发工具。本次 UI 改造以 IntelliJ IDEA New UI 的布局与交互层级为参考,不复刻其品牌、标识或完整产品界面,并保留现有编辑能力与快捷键;2026-10-23 已检查原生欢迎页、设置与深浅主题的部分交互,完整工作区验收仍待完成,见第 10.3 节。 ### 1.1 核心目标 - 轻量化:使用系统 WebView2 渲染界面,避免额外打包完整 Chromium。 - 快速启动:减少不必要的后台任务,按需加载功能模块。 - 专注 Java:优先支持 Java 项目开发、代码补全、跳转定义和诊断。 - 模块化:编辑器、项目管理、Git、终端、LSP、AI 能力相互解耦。 - 本地优先:项目源码默认保留在用户本地,不上传至远程服务。 - 可扩展:为后续接入 AI 编程、代码解释、代码生成和项目分析预留接口。 ### 1.2 当前项目状态 以下清单中,`[x]` 表示已有实现,不等同于本轮测试或发布验收通过;`[ ]` 表示尚未完成,已有代码但未验收的项目会单独注明。第一阶段的当前实现与逐项原生验收以[阶段一记录](docs/phase-one.md)为准;下方带日期的历史测试数及产物不自动覆盖最新源码。 - [x] 创建 Wails 桌面项目与基础窗口。 - [x] 实现 IDEA New UI 参考风格工作台代码(紧凑主菜单、双侧工具窗口条、项目面板、欢迎区、状态栏与浅色 / 深色主题);2026-10-23 独立生产构建通过原生欢迎页、设置 / 关于 / 编辑器分类、深浅主题切换及 1280×800 / 900×650 欢迎页截图检查,正常退出码为 0。完整工作区视觉 / 交互验收仍未完成,最新结果见第 10.3 节,历史记录见[阶段一说明](docs/phase-one.md)。 - [x] 集成 Monaco Editor、基础语法高亮、查找与替换。 - [x] 打开本地文件夹,展示可展开 / 折叠的真实文件树。 - [x] 实现多标签编辑、修改状态标记与未保存修改确认(关闭标签、切换工作区及退出应用)。 - [x] 实现工作区内 UTF-8 文本读写与最大 5 MiB 限制,以及临时文件替换、磁盘版本冲突检查等安全保存措施。 - [x] 支持 `Ctrl+O` 打开文件夹、`Ctrl+S` 保存、`Ctrl+W` 关闭标签,保留 Monaco 编辑快捷键。 - [x] 实现基于目录结构的 Java 包目录推断与紧凑展示,不等同于 Maven / Gradle 项目识别或 Java 语义分析。 - [x] 实现调用本地 Git 的真实工作台:状态、暂存区、差异、提交、历史及分支等操作。 - [ ] Merge 与多来源冲突处理闭环验收(已有 Merge、Pick/Revert、Stash、删除 / 修改及有界已有 Rebase 接管实现;M5 正在统一验证,不含 Rebase 发起和任意 todo 编辑,详见 [Merge 开发记录](docs/git-merge-development.md#164-m5-多来源开发与统一验证)及 [Git 待验收事项](docs/git-pending.md#6-待验证与验收))。 - [ ] 新建文件 / 文件夹、重命名、移入备份完整原生验收:2026-10-23 工作区后端包回归通过(部分链接用例因权限跳过),原生目录选择仍受阻,详见第 10.3 节及[文件管理说明](docs/file-management.md)。 - [x] 另存为及统一编辑器缩放、字号、缩进设置;实现边界和自动验证见[阶段二补齐记录](docs/phase-two.md),原生交互待验收。 - [ ] 工作区全局搜索与按文件名快速打开的完整原生验收(实现状态见[搜索说明](docs/search.md))。 - [x] 最近项目列表及工作区会话恢复首版:恢复上次工作区、最多 30 个普通文件标签、光标与侧栏状态;不恢复未保存源码或终端进程,原生重启验收待完成,见[阶段三记录](docs/phase-three.md)。 - [x] JDK、Maven、Gradle 用户级安装目录配置:新建终端和快捷命令使用配置的工具链,不改变系统环境或语言服务 JDK;见[开发环境配置](docs/toolchains.md)。Maven / Gradle 项目识别单独见[阶段三记录](docs/phase-three.md)。 - [x] Windows ConPTY 交互终端、底部多标签及项目级命名 PowerShell 快捷命令;原生界面交互仍需验收,详见[终端说明](docs/terminal.md)。 - [x] Java LSP 首版代码:本地运行时配置、进程管理、文档同步、补全、悬停、诊断、工作区内定义跳转与手动重启;真实项目和原生交互仍需验收,见 [LSP 记录](docs/lsp.md)。 - [ ] Java LSP 完整项目验收、AI 编程能力及扩展机制。 搜索已有实现;AI 和扩展面板仍只是入口。Git 与终端已有跨阶段实现;自动测试、构建与原生 UI 验收分别记录,不能将构建成功等同于桌面交互验收。 ## 2. 技术栈 | 模块 | 技术选型 | 主要职责与状态 | |---|---|---| | 桌面框架 | Wails 2.16.0 | 已接入,创建桌面应用、连接前后端 | | 后端语言 | Go 1.25.0 | 已使用,文件系统、Git 子进程与系统能力 | | 前端框架 | Vue 3 | 已使用,IDE 界面与交互 | | 开发语言 | TypeScript | 已使用,前端类型约束 | | 前端构建工具 | Vite 7 | 已使用,前端开发与构建 | | 代码编辑器 | Monaco Editor 0.57 | 已接入,代码编辑、语法高亮、查找替换 | | 语言协议 | LSP | 首版已接入 stdio JSON-RPC、文档同步及 Monaco 适配 | | Java 语言服务 | Eclipse JDT Language Server | 用户配置本地 JDK/JDT LS;真实项目联调待验收 | | Java 构建工具 | Maven / Gradle | 已实现根目录项目识别和工具安装目录配置;结构化构建与依赖管理仍属后续范围 | | 版本控制 | 本地 Git CLI | 已接入真实 Git 工作台 | | 终端 | Windows ConPTY + xterm | 交互式 PowerShell、多标签及命名快捷脚本,详见终端说明 | | 本地配置 | SQLite(纯 Go 驱动) | 统一保存快捷命令、界面 / 编辑器偏好、工具链与 LSP 配置、最近项目和工作区会话,支持版本迁移;数据位置见第 8.5 节,搜索历史尚未实现 | | AI 能力 | 可插拔服务接口 | 规划,对接远程或本地大模型 | | 扩展机制 | 待设计 | 规划,当前仅有界面入口 | 说明: 1. 首期不需要一次性集成所有技术组件。 2. Java LSP、终端和 AI 模块均在基础编辑器稳定后逐步接入。 3. Monaco Editor 本身不等同于完整 IDE,需要通过 LSP 和后端服务补齐代码智能能力。 4. SQLite 已用于 IDE 元数据,不存储项目源代码、Monaco 缓冲区或 Git 内容快照。驱动固定为 `modernc.org/sqlite v1.59.0`(兼容 Go 1.25),SQLite 驱动本身无需 CGO;整个桌面应用的其他平台构建仍受 Wails 原生依赖限制。升级驱动时需核对 Go 下限、配套依赖和安全公告,不直接使用 `@latest`。当前更高版本要求 Go 1.26;上游仅承诺最新版本的安全支持,因此固定兼容版本需持续复查,单次漏洞扫描通过不代表长期受支持。 5. JDT LS 及其运行时环境按实际版本要求配置 Java 运行环境。 ## 3. 总体架构 采用前后端分离、功能模块化的架构。下图保留总体目标,包含尚未实现的模块,并非现有目录或完成清单。当前已落地工作区 / 文件服务、Monaco 编辑器、搜索、Git、终端、SQLite 配置存储、最近项目 / 会话恢复及 Java LSP 首版代码;LSP 的完整项目验收、各模块原生交互、AI 和搜索历史仍需后续推进。配置底座就绪不代表所有业务已完成。 ```text CodeNest ├── Frontend │ ├── Application Shell │ ├── Menu / Toolbar │ ├── Explorer │ ├── Editor │ ├── Tabs │ ├── Search │ ├── Terminal UI │ ├── Git UI │ └── AI Assistant UI │ ├── Wails Bridge │ └── 前后端方法调用与事件通信 │ ├── Go Backend │ ├── Workspace Service │ ├── File Service │ ├── Project Service │ ├── Process Service │ ├── Terminal Service │ ├── Git Service │ ├── LSP Service │ ├── Settings Service │ └── AI Service │ ├── External Processes │ ├── Java Runtime │ ├── JDT Language Server │ ├── Maven / Gradle │ ├── Git │ └── Shell │ └── Local Storage ├── IDE Settings ├── Workspace State └── Recent Projects ``` ### 3.1 职责划分 **Vue 3 前端** 负责界面布局、编辑器交互、标签状态、文件树展示、快捷键和用户操作。 **Go 后端** 当前负责文件读写、目录扫描、文件管理、Git / 终端 / Java LSP 子进程生命周期,以及 SQLite 连接、配置校验和迁移;LSP 通过独立 stdio 管道通信。 **Monaco Editor** 负责文本编辑、语法高亮、编辑器模型、选区、撤销重做等编辑能力。 **LSP 服务** 首版负责补全、悬停、工作区内定义跳转和诊断;引用查询、文档符号、依赖源码虚拟文档等仍属后续范围。Java 语义分析交给独立 JDT LS 进程,前端适配正式文档模型与 Monaco 交互。配置和验收边界见 [LSP 说明](docs/lsp.md)。 ## 4. 开发阶段规划 以下保留阶段目标与验收标准;清单按现有代码更新,不代表整阶段已验收或已发布。Git 工作台已有跨阶段实现,不据此推定终端、LSP 或前序阶段的所有任务已完成。 ### 阶段一:桌面应用基础 目标:建立稳定、可运行、可调试的桌面应用骨架。 2026-10-21 历史收尾状态:前端 305/305、最终完整 Wails 构建与 EXE 元数据通过;最终隔离产物两次启动 / 正常退出均确认退出码 0。已修复关于、错误页退出、模态焦点及关闭去重;原生目录 / 保存 / 脏退出等未完成。该轮 Go 全量有一项终端历史测试失败,定向重跑通过但原因未定。2026-10-23 已重新验证,最新结果见第 10.3 节,不沿用历史测试数。**第一阶段尚未全项验收,不视为发布完成**;历史证据与最小人工步骤见[阶段一记录](docs/phase-one.md#2026-10-21-收尾验证提交前历史记录)。 开发任务: - [x] 确认 Wails 2 项目可以正常运行和构建(2026-10-16 便携数据配置下已验证菜单交互、关闭与重启;不代表完整桌面验收)。 - [ ] 统一项目名称、窗口标题、应用图标和版本信息(2026-10-21 已补设置关于元数据、启动失败页退出入口,自动回归通过;任务栏图标及完整原生一致性仍以[当前验收记录](docs/phase-one.md#2026-10-21-收尾验证提交前历史记录)为准,未验收不勾选)。 - [x] 建立 Vue 3 + TypeScript 的基础组件结构。 - [x] 实现主窗口布局。 - [x] 实现顶部菜单栏。 - [x] 实现左侧侧边栏。 - [x] 实现中央工作区(欢迎页、Monaco 编辑器与 Git 工作台)。 - [x] 实现底部状态栏。 - [x] 实现浅色、深色主题切换。 - [x] 实现窗口关闭时的未保存确认与基础错误提示(原生交互仍需本轮检查)。 - [ ] 完成本次 IDEA New UI 参考风格改造的视觉与交互验收,不复刻品牌并保留快捷键。 验收标准: - 应用可以正常启动、关闭和重新启动。 - 界面布局清晰,窗口尺寸变化时不发生明显错位。 - 前后端调用正常。 - 不引入暂时不需要的后台服务。 ### 阶段二:文件管理与 Monaco 编辑器 目标:实现可用于日常编辑代码的基础工作台。 开发任务: - [x] 集成 Monaco Editor。 - [x] 实现打开本地文件夹作为工作区。 - [x] 实现真实文件树展示。 - [x] 支持文件夹展开与折叠。 - [x] 支持打开文件和创建编辑器模型。 - [x] 支持多标签页。 - [x] 支持文件修改状态标记。 - [x] 支持工作区内现有文档安全保存、磁盘版本冲突检查和失败时保留缓冲区。 - [x] 支持另存为(文件菜单 / `Ctrl+Shift+S`,工作区内切换目标文档,工作区外导出副本;覆盖确认与冲突检查,原生交互待验收)。 - [x] 支持关闭标签、切换工作区和退出应用时的未保存修改确认。 - [x] 支持基本语法高亮。 - [x] 使用 Monaco 的行号与基础缩进能力。 - [x] 提供统一的编辑器缩放、字号与缩进配置入口(设置 → 编辑器,持久化并即时应用到各 Monaco 视图和已打开模型;原生交互待验收)。 - [x] 支持当前文档的基础查找与替换(非工作区全局搜索)。 - [x] 支持 `Ctrl+O` / `Ctrl+S` / `Ctrl+W` 及 Monaco 编辑快捷键。 - [x] 限制 UTF-8 文本最大 5 MiB,并反馈非文本、越界、只读及读取异常。 保存会保留 UTF-8 BOM 与统一的原始换行风格;混合换行文件编辑后保存会统一为 LF,并给出提示。最大 5 MiB 是当前保护限制,不代表已支持任意大文件。 验收标准: - 能够打开一个本地 Java 项目。 - 能够同时编辑多个文件。 - 保存后的内容与磁盘文件一致。 - 文件树、标签页和编辑器内容保持同步。 - 关闭未保存文件时有明确提示。 ### 阶段三:项目管理与开发体验 目标:让 CodeNest 具备基础项目开发能力。 开发任务: - [x] 实现最近打开项目列表(最多 20 项,实际激活后更新)。 - [x] 记住上次打开的工作区(从本地记录授权恢复,失效路径保留提示;原生重启待验收)。 - [x] 记住普通编辑器标签、光标与侧栏状态(每项目最多 30 个标签;现有尺寸偏好继续复用;不恢复未保存源码、Git 临时视图或终端进程,见[阶段三记录](docs/phase-three.md))。 - [ ] 工作区全局内容搜索完整原生验收(首版已接入,见[搜索说明](docs/search.md))。 - [ ] 按文件名快速打开完整原生验收(首版已接入)。 - [ ] 验收新建文件 / 文件夹、重命名与移入备份的完整原生流程:2026-10-23 后端包回归通过,部分链接场景跳过,不据此勾选桌面验收。 - [x] 基于目录结构推断 Java 包目录并紧凑展示。 - [x] 识别 Maven 项目(工作区根 `pom.xml`,损坏 XML 保留入口并提示;不解析依赖或执行构建)。 - [x] 识别 Gradle 项目(根 `settings.gradle(.kts)` / `build.gradle(.kts)`,支持与 Maven 共存;识别规则与待验收见[阶段三记录](docs/phase-three.md))。 - [x] 通过真实文件树展示项目目录与普通配置文件。 - [ ] 基于项目识别突出展示 Maven / Gradle 关键配置与构建信息。 - [x] 支持配置 JDK、Maven 和 Gradle 安装根目录(用户级 SQLite 持久化、目录浏览与文件校验,新终端生效,与 JDT LS 运行 JDK 独立;见[开发环境配置](docs/toolchains.md),完整原生交互待验收)。 - [ ] 实现结构化构建任务入口(已有真实终端与快捷命令,但不等同于 Maven / Gradle 构建任务管理)。 - [x] 持久化主题偏好。 - [ ] 保存完整的用户级 IDE 配置。 文件管理的“删除”是移动到 `.codenest-trash/<随机ID>/<原名称>`,不是永久删除,也不是系统回收站。当前没有自动清空或应用内恢复按钮,需通过系统文件管理器手动移回,再刷新文件树。新建、重命名及移动备份禁止覆盖同名条目,限制名称与操作路径,并排除工作区根目录、Git 元数据、备份目录和链接别名;重命名 / 移入备份的原子禁止覆盖实现当前支持 Windows 与 Linux,不支持的平台或文件系统会返回错误并保留原条目。备份目录自动配置 Git 忽略规则,仍占用磁盘空间。具体行为与待验收项见[文件管理说明](docs/file-management.md)。 验收标准: - 重启应用后能够恢复最近项目和主要编辑状态。 - 文件操作具有明确的错误反馈。 - Maven、Gradle 项目识别不会影响普通文件夹打开。 - 用户能够配置本地 Java 开发环境。 ### 阶段四:Java 语言服务 目标:从文本编辑器升级为具备 Java 代码智能能力的 IDE。 开发任务: - [x] 建立独立 LSP 会话接口,首版支持 Java。 - [x] 使用 Go 启动和管理 JDT LS 进程。 - [x] 实现 JSON-RPC 消息通信。 - [x] 实现 LSP 初始化与能力协商。 - [x] 实现 `didOpen`、`didChange`、`didSave`、`didClose` 文档同步。 - [x] 实现代码补全适配。 - [x] 实现悬停信息适配。 - [x] 实现工作区内定义跳转适配。 - [ ] 实现查找引用。 - [x] 接收语言服务器诊断,并隔离过期会话和版本。 - [x] 实现错误和警告标记。 - [ ] 实现文档符号与大纲。 - [x] 实现 LSP 手动重启和内存文档恢复。 - [ ] 处理 Java 项目导入和索引过程。 - [x] 支持配置语言服务使用的 JDK 和 JDT LS 路径。 - [ ] 真实 Java/Maven/Gradle 项目联调及完整桌面交互验收;上述勾选表示代码已存在。 验收标准: - 打开 Java 项目后,语言服务能够完成初始化。 - Java 代码可以获得语义补全。 - 支持跳转到定义和查找引用。 - 诊断信息能够映射到编辑器对应行列。 - 关闭工作区后可以释放语言服务进程。 - LSP 异常不会导致整个 IDE 崩溃。 说明:JDT LS 的启动、初始化、索引和依赖解析可能消耗较多资源。应优先保证按需启动、进程可回收和状态可观测,而不是强行让语言服务常驻。 ### 阶段五:终端与 Git 目标:在不依赖外部 IDE 的情况下完成基本开发工作流。 终端任务(已有跨阶段实现,勾选不等于原生 UI 全项验收): - [x] 实现集成终端面板。 - [x] 支持当前工作区作为默认工作目录。 - [x] 支持 Windows PowerShell 5.1;尚不支持任意 Shell 切换或远程连接。 - [x] 支持 ConPTY 交互式输入和输出。 - [x] 支持终端创建、关闭和多会话。 - [x] 支持终端进程退出、后代清理和异常处理。 - [ ] 完成真实桌面多标签、输入 / 调整尺寸、快捷命令确认与关闭交互验收;2026-10-23 后端真实 ConPTY 回归通过,不代替 UI 验收。 Git 任务(已跨阶段实现真实 Git 工作台,非模拟数据): - [x] 调用本地 Git CLI,命令失败或 Git 不可用时反馈错误。 - [ ] 提供独立的 Git 安装检测与安装引导。 - [x] 展示工作区文件变更。 - [x] 展示已暂存和未暂存文件。 - [x] 查看文件差异。 - [x] 支持暂存和取消暂存。 - [x] 支持选择文件并提交。 - [x] 支持查看提交历史。 - [x] 支持分支查看与切换。 - [x] 支持常见 Git 操作的错误提示。 代码还提供标签、stash、fetch / pull / push 及部分历史操作入口,具体场景仍需实测。真实 Git 功能需要本机 Git CLI,并要求打开仓库根目录,不会自动扩大工作区权限。Git 子进程调用不等于交互式终端,以上状态不表示本阶段整体验收完成。 本轮新增 Git 对比与源码行级导航,使用方式与边界如下: | 入口 | 左侧 | 右侧 | |---|---|---| | 全部本地变更 | 固定的 HEAD 提交(无首提交时为空版本) | 工作树读取副本 | | 已暂存 | 固定的 HEAD 提交(无首提交时为空版本) | 索引读取副本 | | 未暂存 | 索引读取副本 | 工作树读取副本 | | 历史文件 | 第一父提交(根提交时为空版本) | 所选提交 | | 历史文件“与工作树同路径对比” | 所选提交的该文件 | 工作树同路径文件 | - 模式对比列表与提交勾选列表独立;切换对比模式不改变提交的文件选择。 - 新增、删除和真实空文件分别处理;历史重命名保留旧/新路径,合并提交明确按第一父提交对比。不存在、二进制、非 UTF-8、超过 5 MiB、未合并索引及不支持对象分别提示,真实读取失败不会假装成空文件。 - 双栏中的可靠文本双击、各侧“查看此版本源码”或该侧 `Ctrl/Cmd+Enter` 打开所见内容的只读源码并定位光标。交换左右保留来源身份;统一视图不猜测删除行的来源,请使用明确侧的按钮。 - 只读版本标签独立于可保存文件,支持返回/前进与 `Alt+Left / Alt+Right`,恢复原差异快照和视图。“打开当前文件”不会把历史/索引行号套到当前文件;工作树副本只有与当前缓冲区内容一致时才沿用行号,不覆盖未保存内容。 - 保存、Git 操作和重新进入 Git 会刷新状态列表;已展示的快照不静默替换,而是标记可能过期,点击“重新读取”更新。HEAD 基准已固定,切换分支后从当前模式列表重新打开可建立新基准。 - 快照缓存限制为 12 份、文本合计 32 MiB;源码模型按需创建并释放。被淘汰的旧导航记录明确失效,不能用新内容冒充旧版本。 上述 Git 只读版本导航不提供 Java 定义 / 引用跳转;普通 Java 文档已有 LSP 工作区内定义跳转适配,引用查询仍未实现。三方合并与多来源冲突处理已有实现,闭环验收见 [Git 待验收事项](docs/git-pending.md#6-待验证与验收)。文件级本地对比按同路径进行,不追踪之后的重命名;其他 Git 能力与限制以该文档为准。Git 控制台长度、刷新性能及低高度交互仍需进一步优化与原生回归,不代表完整 Git 客户端已验收。 验收标准: - 可以在 IDE 中执行 Maven、Gradle 和 Git 命令。 - 终端关闭后不会残留无主进程。 - Git 状态与实际仓库一致。 - 执行破坏性操作前提供必要的确认。 ### 阶段六:AI 编程助手 目标:为 CodeNest 提供可配置的 AI 编程能力。 开发任务: - [ ] 定义统一 AI 服务接口。 - [ ] 支持配置模型提供方和连接参数。 - [ ] 支持流式输出。 - [ ] 支持解释选中代码。 - [ ] 支持生成代码。 - [ ] 支持代码重构建议。 - [ ] 支持生成单元测试。 - [ ] 支持解释编译错误。 - [ ] 支持将 AI 生成的修改以差异形式展示。 - [ ] 支持用户确认后应用修改。 - [ ] 对上下文文件和代码范围进行约束。 - [ ] 支持请求取消、超时和错误恢复。 - [ ] 对敏感配置和访问凭证进行保护。 验收标准: - AI 能够读取用户明确授权的代码上下文。 - 修改代码前能够展示变更内容。 - 未经用户确认,不自动覆盖已有文件。 - AI 服务不可用时,普通编辑功能仍可正常使用。 ### 阶段七:性能优化与正式发布 目标:形成稳定、可分发的 Windows 桌面应用。 开发任务: - [ ] 优化冷启动时间。 - [ ] 优化空闲状态内存占用。 - [ ] 优化大目录文件树加载。 - [ ] 优化大文件编辑体验。 - [ ] 避免不必要的文件重复扫描。 - [ ] 避免重复启动语言服务。 - [ ] 及时清理退出的子进程。 - [ ] 实现日志分级与日志文件管理。 - [ ] 处理应用异常和恢复。 - [ ] 验证 Windows WebView2 环境。 - [ ] 完成 Windows 安装包或便携版构建。 - [ ] 完成版本号、图标和发布说明。 - [ ] 测试全新环境下的安装与启动。 验收标准: - 应用可以在目标 Windows 环境中正常安装和运行。 - 文件读写、编辑器、终端和语言服务功能稳定。 - 应用退出后不存在异常残留进程。 - 能够定位启动失败、LSP 故障和构建错误。 - 发布包中不包含无用的开发依赖。 ## 5. 项目目录:现有结构与后续规划 以下列出与当前工作台相关的实际文件;文件管理实现已存在,但仍待验收。未列出依赖目录、生成的构建产物等内容。 ```text CodeNest/ ├── app.go # Wails 桥接、工作区 / Git 调用与退出确认 ├── main.go # 桌面应用入口 ├── go.mod # Go 1.25.0 / Wails 2.16.0 ├── wails.json ├── README.md ├── backend/ │ ├── workspace/ │ │ ├── service.go # 工作区、目录读取、UTF-8 安全保存 │ │ ├── java.go # Java 包目录推断与紧凑展示 │ │ ├── operations.go # 新建、重命名、移入备份(待验收) │ │ ├── operations_test.go # 文件管理后端测试(2026-10-23 包回归通过,部分链接用例跳过) │ │ ├── rename_*.go # 分平台原子禁止覆盖重命名 │ │ └── permissions_*.go # 保存权限处理 │ ├── apppaths/ # EXE 同级便携路径与文件落点校验 │ ├── storage/ # SQLite 打开、连接设置和 schema 迁移 │ ├── preferences/ # 类型化界面偏好及 localStorage 导入 │ ├── quickcommands/ # 项目快捷命令与旧 JSON 导入 │ ├── terminal/ # ConPTY / PowerShell 生命周期 │ ├── search/ # 工作区搜索、替换与恢复 │ ├── searchtools/ # ripgrep 定位与校验 │ ├── toolchain/ # JDK / Maven / Gradle 安装目录与环境 │ ├── workspacesession/ # 普通标签、光标与侧栏恢复 │ ├── lsp/ # Java LSP 进程、协议与会话 │ └── git/ │ └── service.go # 真实 Git CLI 服务 ├── frontend/ │ ├── package.json # build 含类型检查,test 运行前端回归 │ ├── vite.config.ts │ ├── wailsjs/ # Wails 生成绑定与运行时 │ └── src/ │ ├── App.vue # 工作台编排、快捷键与确认流程 │ ├── main.ts │ ├── style.css │ ├── assets/ │ ├── components/ # 菜单、文件树、标签、状态栏等 │ │ ├── FileOperationDialog.vue │ │ ├── UnsavedDialog.vue │ │ └── git/GitWorkbench.vue │ ├── editor/ # Monaco、文档模型与差异编辑器 │ ├── git/ # Git 状态与工作台样式 │ ├── preferences/ # 先初始化再挂载,偏好缓存与串行保存 │ ├── terminal/ # 终端桥接、会话状态与快捷命令 │ ├── workspace/files.ts # 新文件接口的应用层 Wails 桥调用 │ └── types/ ├── build/ # Wails 图标及平台打包配置 └── docs/ └── file-management.md # 文件管理行为、限制与验证说明 ``` 后续按实际需要新增或拆分,不代表以下模块已经存在: - 后端:`project/`、`process/`、`ai/` 等按需要扩展;`lsp/` 已存在,项目识别当前位于 `workspace/`。配置复用 `storage/` 与薄领域服务,不再平行建立 JSON 存储。仅在职责确有需要时从 `workspace/` 拆出 `filesystem/`。 - 前端:按复杂度引入 `layouts/`、`views/`、`services/`、`stores/`、`router/`、`styles/` 等目录;现有编辑器、Git 和工作区模块优先复用。 - 文档:按实现进度补充架构、开发和发布说明;已有文件管理、搜索、终端、工具链、LSP、Git、阶段验收与 Windows 发布说明,入口见上文各功能链接。 - 扩展机制:尚未实现,先明确接口边界,再决定目录与加载方式。 目录调整原则: - 优先遵循 Wails 初始化生成的项目结构。 - 不要为了匹配目录示例而大规模移动现有文件。 - 后端按照业务职责拆分,避免所有功能集中在一个 Go 文件。 - 前端组件按功能组织,避免单个 Vue 文件过于庞大。 - 前后端通过明确的服务接口通信。 - 新增抽象必须解决实际问题,不提前构建复杂框架。 ## 6. 关键设计原则 ### 6.1 轻量化优先 - 按需加载功能。 - 按需启动语言服务。 - 仅在打开终端时启动 Shell。 - 仅在需要时扫描和索引项目。 - 避免同时运行多个重复的后台服务。 - 避免无意义的轮询和重复刷新。 - 优先复用系统能力与成熟组件。 ### 6.2 业务逻辑与 UI 解耦 文件读写、项目扫描、进程管理和 LSP 通信放在 Go 后端。 Vue 前端只负责界面、交互、状态呈现和编辑器集成。 后端服务应尽量避免直接依赖具体 Vue 组件,前端也不应直接承担系统级进程管理。 ### 6.3 先实现闭环,再扩展功能 开发顺序应遵循: 1. 可以启动。 2. 可以打开项目。 3. 可以打开和保存文件。 4. 可以多标签编辑。 5. 可以搜索和管理文件。 6. 可以进行 Java 代码智能分析。 7. 可以在 IDE 内完成构建和 Git 操作。 8. 最后集成 AI 编程助手。 原则上每个阶段先形成可运行、可验证的功能闭环,再推进后续阶段;允许独立能力跨阶段落地。Git、终端和 Java LSP 已有实现,仍按各模块记录分别完成真实场景和原生交互验收。 ### 6.4 安全与可靠性 - 对文件操作进行路径校验。 - 不允许未授权的任意文件访问。 - 执行外部命令时避免不安全的命令拼接。 - 对外部进程设置生命周期管理。 - 对 AI 修改文件的行为保留用户确认机制。 - 对配置文件和模型凭证采取适当的保护措施。 - 日志不得记录不必要的敏感内容。 ## 7. 质量与性能指标 以下是项目初期的目标值,不代表当前已经达到的性能结果。后续应在统一的 Windows 环境中实测并记录。 | 指标 | 初期目标 | |---|---| | 冷启动时间 | 目标不超过 3 秒 | | 空闲状态内存 | 目标不超过 150 MB | | 基础编辑功能 | 不依赖 Java LSP 即可使用 | | 文件保存 | 保存完成后磁盘内容正确 | | 多标签编辑 | 标签与文档内容保持一致 | | 子进程管理 | 退出后及时回收相关进程 | | LSP 故障 | 不影响普通文本编辑 | | AI 服务故障 | 不影响核心 IDE 功能 | 性能测试需要注明机器配置、WebView2 版本、打开的项目规模和是否启用了 LSP。语言服务索引期间的内存占用应与 IDE 空闲状态分别统计。 ## 8. 开发与运行 ### 8.1 环境要求 - Windows 10/11(当前主要桌面目标) - Go 1.25.0(当前 `go.mod` 声明版本) - Node.js 20.19+ 或 22.12+(满足 Vite 7 要求;Node 18 不满足要求) - npm - Wails CLI v2;当前项目依赖 Wails 2.16.0 - Microsoft Edge WebView2 Runtime - Git CLI(基础编辑不需要;真实 Git 工作台需要安装并可从 PATH 调用) - Java 运行环境(启用 JDT LS 时配置符合其要求的 JDK;基础编辑无需 Java / LSP) ### 8.2 启动开发环境 在项目根目录执行: ```powershell cd E:\CodeNest wails dev ``` ### 8.3 安装前端依赖 首次安装依赖或修改依赖清单后执行: ```powershell cd E:\CodeNest\frontend npm install ``` ### 8.4 构建桌面应用 普通 `wails build` 生成开发用便携 EXE,**不是完整发行包**。Windows amd64 发布请在仓库根目录执行: ```powershell # 首次准备前端依赖 npm --prefix frontend ci # 同时生成便携 ZIP 和每用户安装版 Setup;需要 makensis 在 PATH 中 powershell -NoProfile -File .\scripts\build-release.ps1 # 只构建便携 ZIP,不需要 NSIS powershell -NoProfile -File .\scripts\build-release.ps1 -Mode portable ``` 发布脚本从 `wails.json` 读取版本,按受版本控制的官方校验值准备 ripgrep 15.2.0,执行真实搜索回归,再将主程序、rg 与许可证按白名单打包。两种模式分别编译,不依赖本机 rg、Chocolatey 路径或快捷方式起始目录;不会整体打包或清空已有 `build/bin`,也不包含其中的用户数据库和 WebView2 缓存。具体产物、离线输入和验收步骤见 [Windows 发布说明](docs/packaging.md)。 Wails 开发 / 构建流程会重新生成绑定,旧版桌面二进制需重新构建才能提供新增接口。 前端生产构建通过 `frontend/scripts/build.mjs` 启动 Vite,为构建子进程单独设置 `TEMP` / `TMP` / `TMPDIR`,使用 `frontend/node_modules/.cache/codenest-build-<随机后缀>/` 临时目录。构建结束(包括失败)后清理本次目录,清理失败时显示路径和警告。此方案避开已复现的 Windows 系统临时目录 esbuild 大文件传输 `remove ... Access is denied` 问题,不修改父进程或系统环境变量、系统权限、安全软件配置,也不删除系统临时文件。目录已由 `node_modules/` 忽略规则排除。Monaco 的 TypeScript worker 会触发超过 1 MiB 的临时文件传输,报错不表示 worker 源文件缺失;是否存在安全软件占用或系统目录权限问题尚未确定。 ### 8.5 Windows 数据目录 发行模式在构建时确定,不根据 EXE 名称、工作目录或现有 `data` 目录猜测: | 模式 | 程序位置 | 数据位置 | |---|---|---| | 便携版(普通开发构建默认) | 非 C 盘本地可写目录 | 真实 EXE 同级 `data` | | 安装版 | 默认 `%LOCALAPPDATA%\Programs\CodeNest`,每用户安装 | 系统当前用户 LocalAppData 下的 `CodeNest`,通常为 `%LOCALAPPDATA%\CodeNest`,允许 C 盘 | 安装版的数据库、WebView2 profile、临时文件、终端历史及搜索恢复资料均使用安装版数据根,不在安装目录创建 `data`。两版数据互相独立,不自动迁移、合并或删除;升级和卸载默认保留安装版用户数据。备份任一版本前先关闭应用,再复制其完整数据根,不仅复制数据库。 便携版请将完整发行包解压到**非 C 盘本地盘符下的可写目录**(不支持 UNC / 网络共享部署,避免无法确认背后磁盘位置),不要只搬 EXE 而漏掉 `tools`。应用启动时根据实际 EXE 路径创建同级数据目录,不依赖快捷方式的“起始位置”或当前工作目录: ```text 部署目录/ ├── CodeNest.exe ├── tools/rg/15.2.0/windows-amd64/ # rg.exe、许可证与来源记录 └── data/ ├── codenest.db # SQLite:偏好、快捷命令、工具链 / LSP、最近项目与会话 ├── quick-commands.json # 仅旧版本可能存在;成功导入后原样保留,不再写入 ├── webview2/ # WebView2 profile 和缓存,保留旧 localStorage 迁移源 └── tmp/ # 本进程及未来子进程的临时目录 ``` - WebView2 使用 Wails 正式 `WebviewUserDataPath` 配置;无需设置 `APPDATA` 或 `WEBVIEW2_USER_DATA_FOLDER`。 - 仅将本进程 `TEMP`、`TMP`、`TMPDIR` 指向 `data/tmp`,不修改系统全局环境,也不重定向 `APPDATA`、`LOCALAPPDATA`、`HOME`、`USERPROFILE` 或 Git 配置定位。 - C 盘部署、数据目录被文件占位、目录链接 / junction 重定向或无法读写时,启动明确报错并以非零状态退出;不会静默回退到 C 盘用户目录。 - 同目录 EXE 改名仍共用 `data`;不同版本不要同时使用同一份 profile。移动部署时携带完整 `data`,SQLite 配置随目录搬迁;旧 AppData profile 不自动迁移或删除。全新 `data` 没有数据库及旧偏好时使用默认设置。 - 数据库使用单连接、短事务和有限锁等待,默认 rollback journal,不启用 WAL;写事务可能产生 `codenest.db-journal`。不要在应用运行中仅复制主 DB 作为备份;**先关闭应用,再备份或搬迁完整 `data` 目录**。禁止把数据库或旁路文件替换为目录、符号链接或 junction;路径检查不替代系统权限,也不保证抵御其他进程同时替换文件。 - 工作区原子保存临时文件和 `.codenest-trash` 仍在工作区内,不挪入应用数据目录;用户仍可自行选择 C 盘工作区。 - 此保证限于应用控制的 profile、缓存及临时目录,并非整个进程树零 C 盘访问。Windows / WebView2 运行时、注册表及外部 Git 配置、凭据、钩子仍可能使用 C 盘;构建工具缓存也不属于发布运行时数据目录。 - 上述非 C 盘限制仅适用于便携版;安装版允许 C 盘并使用独立用户数据根,不会在用户目录不可用时回退到 EXE 同级。其他平台的发行及 WebView 数据位置未完成适配验收。 开发运行同样遵循实际 EXE 同级目录规则;`go run` 如将临时 EXE 放到 C 盘会被拒绝,应使用非 C 盘构建产物。Wails 的 `bindings` 构建标签仅用于生成桥接代码,不启动 WebView,因此该构建辅助进程不初始化运行时数据;正常开发 / 发布 EXE 不跳过校验。数据目录校验不递归审计 WebView2 内部文件,也不替代系统权限保护,不支持路径组件末尾为空格或句点等特殊部署名称。 #### SQLite 配置迁移与后续扩展 - 启动正式桌面程序时打开 `data/codenest.db`,按 schema 版本事务升级;打开、升级或旧配置导入失败会明确报错,不清空数据、不自动回退 JSON/用户目录。比程序更新的 schema 会被拒绝,回退旧版本前应先备份。 - 首次启动一次性导入 `quick-commands.json`:严格校验旧格式,保留项目键、命令 ID、顺序、正文空白/换行、工作目录及立即运行偏好。项目目录暂时不存在不影响导入。导入数据与完成标记同事务提交,原文件不删除、不修改;后续不再读取,避免旧命令覆盖新修改或让删除的命令复活。 - 7 项界面偏好(主题、资源栏宽度、Git 三项尺寸、两项分组)由前端在挂载工作台前读取旧 localStorage,再经后端事务仅补充数据库中缺失的合法值,数据库已有值优先。旧键保留;localStorage 不可访问不误记迁移完成。桌面后续写 SQLite,网页预览仍用 localStorage,不会访问桌面数据库。 - 偏好初始化失败提供可见错误与重试,不把默认值写回覆盖;保存失败保留当前显示并提示未持久化,退出前等待保存,可重试或明确放弃。SQLite **不自动加密**,快捷命令及偏好均是普通数据,不应保存密码或令牌;导入、读取和保存均不执行脚本。 - 存储层统一管理连接及 schema 版本,当前 schema v3 已包含偏好、快捷命令、迁移标记、最近项目与工作区会话;Java LSP 和开发工具链配置复用 `settings`。持久项目身份不使用运行时 `Workspace.ID`,具体恢复边界见[阶段三记录](docs/phase-three.md)。 - 搜索历史与结构化运行配置仍属后续业务。会话恢复只重新读取磁盘上的普通文件,不保存未保存源码,也不复活 PowerShell / ConPTY;未来若需恢复内容或执行任务,须另行设计确认流程。 ### 8.6 测试与检查入口 以下为检查方式,实际执行结果见第 10.3 节。 项目根目录的后端测试: ```powershell cd E:\CodeNest go test -mod=readonly -count=1 ./backend/storage ./backend/preferences ./backend/quickcommands ./backend/apppaths go test -mod=readonly -count=1 ./... go test -mod=readonly -count=1 -tags bindings . ``` 已有 `backend/workspace/operations_test.go`,覆盖新建、名称与路径限制、重命名、备份、链接别名及原子禁止覆盖等场景。新增 `backend/git/service_test.go`,通过临时仓库验证 Git 内容分类、三种本地对比、历史与路径边界;测试不改写真实项目历史、不连接远程。 前端类型检查与生产构建: ```powershell cd E:\CodeNest\frontend npm run build ``` 针对 esbuild 大输入临时文件传输的回归检查(通过真实构建包装脚本转换超过 1 MiB 的输入,检查成功 / 失败退出码、父进程环境不变和临时目录清理): ```powershell node --test scripts/build-temp.test.mjs ``` 前端业务与构建包装回归检查(Node.js 22.18+,2026-10-23 验证环境为 24.14.0): ```powershell cd E:\CodeNest\frontend npm test ``` 测试使用 Node 原生测试运行器和 TypeScript 类型剥离,不引入额外测试框架;覆盖版本来源、快照身份/缓存、导航及构建临时目录等行为。`npm run build` 实际执行 `vue-tsc --noEmit && node scripts/build.mjs`,包含类型检查及 Vite 生产构建,不是单元测试。桌面原生文件访问、Git、Monaco 实际渲染与关闭确认需要在 Wails 环境中手动验收;组件边界测试和浏览器预览不能替代。 ## 9. 版本规划 以下为版本目标,不代表已发布版本或严格的实现顺序;跨阶段已落地能力单独注明,整版完成状态以实际验收为准。 ### V0.1.0 — 基础桌面框架 基础窗口、Monaco、真实文件树、读写和多标签等已有实现,仍需完成本轮回归与整体验收。 - 主窗口与基础布局 - Vue 3 + TypeScript - Monaco Editor - 文件树 - 打开、编辑、保存文件 - 多标签页 - 基础主题 ### V0.2.0 — 基础开发体验 全局搜索、快速打开、最近项目 / 会话恢复、根目录 Maven / Gradle 识别及开发环境配置已有首版实现,完整原生验收仍待完成。文件管理已有代码与自动测试,未完成原生闭环;Java 包目录推断和项目入口识别均不等同于完整构建模型或依赖解析。 - 新建文件 / 文件夹、重命名、移入备份 - 另存为(已有实现,原生交互待验收,见[阶段二补齐记录](docs/phase-two.md)) - 文件搜索 - 快速打开 - 最近项目 - 工作区状态恢复 - Maven / Gradle 项目识别 - 基础项目配置 ### V0.3.0 — Java 智能开发 JDT LS 会话、补全、工作区内定义跳转和诊断已有首版代码;查找引用、项目索引体验与真实项目验收仍待完成,详见 [LSP 记录](docs/lsp.md)。 - JDT LS - 代码补全 - 跳转定义 - 查找引用 - 诊断与错误提示 - Java 项目索引 ### V0.4.0 — 工程工具 Git 状态、差异、暂存、提交、历史与分支以及 Windows 集成终端已跨阶段实现;结构化构建任务管理仍未实现,不能将实现或自动测试通过等同于本版本整体验收。 - 集成终端(已有实现,完整原生交互待验收) - Git 状态与差异(已有实现) - 暂存、提交与分支操作(已有实现) - 构建任务管理(规划) ### V0.5.0 — AI 编程助手 以下均属规划,当前 AI 面板只是入口占位;扩展机制也尚未实现,后续按需求安排。 - AI 对话 - 代码解释 - 代码生成 - 错误分析 - 差异预览与确认应用 ### V1.0.0 — 稳定版本 - 核心功能稳定 - 性能优化 - 配置管理完善 - 日志与异常恢复 - Windows 发布包 - 完整的安装与升级说明 版本内容可以根据实际开发进度调整,不要求严格按时间发布。 ## 10. 当前开发任务 当前重点是验证已有功能、修正过期状态并补齐原生验收,最新结果见第 10.3 节。延续 IDEA New UI 参考风格,保持 CodeNest 自有品牌;Git 源码行级导航不等于 Java LSP 定义跳转,终端、搜索、会话恢复和 LSP 按各自证据记录,不因其他模块通过而视为已验收。 ### 10.1 已有实现基线 - [x] Wails 桌面窗口、Vue 3 + TypeScript + Vite 基础工程与主界面骨架。 - [x] 顶部菜单、资源管理器、状态栏及浅色 / 深色主题与主题偏好持久化。 - [x] Monaco Editor、真实文件树、本地文件打开 / 编辑 / 安全保存。 - [x] 多标签、修改状态标记、未保存确认、基础查找替换。 - [x] `Ctrl+O` / `Ctrl+S` / `Ctrl+W` 与 Monaco 编辑快捷键。 - [x] Java 包目录推断与真实 Git 工作台。 - [x] 新建、重命名、移入备份的前后端代码及 `operations_test.go` 已存在(仅表示代码存在,不表示验收通过)。 ### 10.2 本轮改造与待验收 - [x] 完成 IDEA New UI 参考风格的前端改造代码:紧凑主工具栏、菜单分组、双侧工具窗口入口、项目树图标与活动文件高亮、编辑器路径面包屑、蓝色标签下划线、简洁欢迎区和中性状态栏。 - [x] 为 Monaco 编辑器与 Git 差异视图定义统一深浅主题,同步菜单、通知、对话框及 Git 工具窗口样式,保留现有快捷键和业务确认流程。 - [x] 按实际代码同步 README 功能状态、阶段清单、环境要求与验证入口。 - [x] 增加全部本地 / 已暂存 / 未暂存三种对比,修复历史新增、删除、重命名与第一父提交对比。 - [x] 增加差异侧源码行列定位、独立只读版本标签、返回 / 前进及快照过期提示;这些为代码实现状态,不代表原生交互验收。 - [x] 2026-10-23 检查原生欢迎页深浅主题与 1280×800 / 900×650 布局、设置 / 关于 / 编辑器分类展示,保留 CodeNest 品牌;仅覆盖第 10.3 节列出的场景。 - [ ] 完成已打开工作区、Git / 终端面板、编辑器和模态窗口的布局、主题与焦点交互验收。 - [ ] 回归现有文件树、Monaco、多标签、查找替换、安全保存及 `Ctrl+O` / `Ctrl+S` / `Ctrl+W`,不得因 UI 改造退化。 - [ ] 验收新建后打开与保存、同名不覆盖、目录重命名后的标签、取消未保存确认、失败时保留标签与缓冲区。 - [ ] 验收移入备份后的手动恢复、Git 忽略规则及链接目录不显示管理入口;注意重命名后相关标签会重建撤销和滚动状态。 - [x] 执行后端 / 前端回归、类型检查、生产构建及 Wails 桌面构建;2026-10-23 存在测试失败,勾选仅表示已执行,实际结果见第 10.3 节。 - [x] 2026-10-23 独立便携产物原生启动、设置交互与正常关闭,两个展示会话均验证退出码为 0。 - [ ] 完成同一数据目录重启、工作区恢复、未保存退出与其余桌面交互检查。 - [ ] 回归真实 Git 状态、差异、暂存、提交、历史与分支操作,并在适当测试仓库检查危险操作确认。 - [ ] 完成 V0.1.0 整体验收,再据实际结果安排后续开发。 ### 10.2.1 Git 未实现功能清单 详细状态、当前边界、交互与安全收尾及待验收项见 [Git 未实现功能与待收尾事项](docs/git-pending.md)。 - [ ] 分支间比较(Compare with 当前分支)。 - [ ] 整个分支与工作树比较(Show Diff with Working Tree)。 - [ ] 本地分支重命名与分支删除。 - [ ] 发起 Rebase 与从指定提交开始的交互式 Rebase、任意 todo 编辑;已有受限线性 pick-only `rebase-merge` 接管不等于这些能力。 - [ ] 任意历史提交消息修改(Edit Commit Message)。 - [ ] Fixup、Squash Into 与 Drop Commit。 - [ ] Push All up to Here。 已有实现但仍待验收(不列为未实现): - [ ] Pick/Revert、Merge、Stash 等冲突在应用内编辑、保存、标记解决及后续 Continue 的完整闭环;保存、标记解决与 Continue 是独立动作,边界见 [Git 待验收事项](docs/git-pending.md#6-待验证与验收)。 ### 10.3 验证状态(2026-10-23) 本节记录本轮实际执行结果,替代旧的“25 项前端 / 12 项 Git 测试”当前状态描述;第 10.4–10.6 节和各阶段文档中的带日期结果仍是历史记录。**本轮不是全项通过,也不是发布验收完成。** 环境:Windows 11、Go **1.27.0 windows/amd64**(`CGO_ENABLED=0`;`go.mod` 仍声明 1.25.0,不代表此次用 1.25 测试)、Node **24.14.0**、npm **11.9.0**、Wails **2.16.0**、Git **2.56.0.windows.2**、ripgrep **15.2.0**。验证基于提交 `30fecd0` 加工作树中已有 Git Push / Diff 未提交改动;期间前端代码与测试继续有并行修改(两轮回归的测试文件也不同),不能把结果当成同一冻结源码的重复验证,也不能套用到结束时所有最新改动。 #### 自动回归与构建 | 检查项 | 本轮实际结果 | |---|---| | `go test -mod=readonly -count=1 ./...` | **失败,退出 1**:主包及 11 个非 Git 后端包通过;`backend/git` 达到默认 10 分钟包级超时(600.187 秒),未完成全包回归 | | `go test -mod=readonly -count=1 -tags bindings .` | 通过,10.513 秒,含绑定辅助进程不初始化运行时数据的测试 | | 首次 `npm --prefix frontend test` | **失败**:677 项,676 通过、1 失败、0 跳过 | | 第二次 `npm --prefix frontend test` | **失败**:696 项,695 通过、1 失败、0 跳过;与首次不是同一版测试文件 | | 独立 `vue-tsc --noEmit` | 初次及收尾复查均通过,无类型诊断 | | `npm --prefix frontend run build` | 通过,含类型检查和 Vite 生产构建;保留现有大分块警告 | | `wails build -o CodeNest-readme-20261023-0025.exe` | 完整构建通过,51.341 秒,含绑定生成、前端及 Windows 生产编译;未覆盖正在使用的 `CodeNest.exe` | | `scripts/check-exe-metadata.ps1` | 通过:ProductName=CodeNest、ProductVersion/FileVersion=0.0.0、Comments=开发构建,未发布 | | `scripts/test-phase-one-native.tests.ps1` | 20 组驱动边界回归通过;不是应用功能验收 | **后端覆盖与未完成项:** - 通过的包覆盖工作区读写 / 文件管理 / 另存为 / 项目识别、SQLite / 偏好 / 快捷命令 / 最近项目及会话、工具链配置、真实 rg 搜索与替换、真实 Windows ConPTY / PowerShell 生命周期,以及 LSP 协议和受控进程测试。LSP 测试不是使用真实 JDT LS 的项目语义验收。 - Git 超时报 `panic: test timed out after 10m0s`;当时 `TestUnknownMissingSideCannotDeleteOrMaterialize` 运行约 4 秒,栈处于测试仓库准备的 Git 子进程等待,不能将包总时限误判为该用例断言失败或单用例死锁。部分真实 Merge / Pick / Revert / Rebase stage 回归已通过,但后续用例未完成;本轮未延长时限再跑,不宣称 Git 全包通过。 - 全仓有 **48 个显式 SKIP 事件(含子测试)**:46 个因 Windows 缺少创建符号链接权限,另 2 个为 Unix 目录权限及不支持原子重命名的反向平台分支不适用。搜索的一个链接保护分支用日志加提前返回处理权限不足,即使所属测试显示 PASS,也不代表该分支已执行。跳过场景不能视为通过;本轮未运行 race detector。 **前端失败明细:** - 首次 Git Push outgoing selection 测试期待旧 `open` 事件,实际为 `[]`;随后磁盘测试已改为内嵌预览且不发出 `open`。保留失败日志,不据此断言当前实现仍应发出该事件。 - 第二次 `comparison replacement resets file selection and missing endpoints or detail loading discard pending previews` 失败:更换 comparison 时,预期只读取 `first.ts` 的新左右端点,实际先额外读取了旧选中的 `second.ts` 新左右端点,再读取 `first.ts`。这是测试边界内的多余旧文件读取,不足以证明错误内容已显示或真实推送范围错误;未在本轮修改业务代码或测试。稳定源码后仍需修复 / 复验,不记录为前端全量通过。 前端测试混合了真实业务逻辑、模拟 Wails / Monaco 等边界的组件行为和静态源码 / CSS / 资源断言;不等同于 WebView2、真实 Git 工作台或 JDT LS 的端到端验收。构建继续使用已有子进程临时目录隔离方案,未修改系统权限或安全软件配置。 #### 原生桌面验证 使用上述独立便携生产 EXE,由 `scripts/test-phase-one-native.ps1` 为每次会话复制到全新的 `.validation` 子目录;只复制 EXE,不复制已有用户数据或搜索工具。仅操作本次创建的实例,没有操作原先运行的 `build/bin/CodeNest.exe`。 | 场景 | 结果与验收边界 | |---|---| | 启动、欢迎页、设置、关于、编辑器分类 | **通过所列展示 / 操作**;实际打开并检查截图,关于显示 `0.0.0 · 开发构建,未发布`,运行环境为桌面应用 | | 深浅主题及窗口尺寸 | **通过所列展示 / 操作**;实际切换为浅色,检查深 / 浅色 1280×800、900×650 欢迎页及编辑器设置截图,未见空白、外部窗口遮挡或明显横向越界;窄欢迎页出现纵向滚动条。不代表已打开项目后的布局已验收 | | 编辑器设置默认值 | 截图确认字号 14、缩放级别 0、缩进宽度 4、使用空格开启;本轮没有修改数值,不证明编辑效果或重启持久化 | | 正常关闭 | 深色展示、浅色展示两个会话均正常关闭,保留进程句柄验证 **退出码 0**;不是同一 profile 的重启恢复验收 | | 打开工作区 | 项目菜单和原生“打开工作区文件夹”对话框已打开;选择隔离目录时 **受阻**:`Folder address edit did not receive focus.`。停止输入,没有写入目录路径,没有绕过前台 / 焦点保护 | | 受阻会话清理 | 对本次原生对话框及应用发送正常关闭,确认退出;持有句柄的会话最终记录应用退出码 0。其预排的 Close 在清理后执行返回 `Owned application exited.`,因此该 Session 结果是 failed,不能将其记录为工作区验收通过 | 本轮全部测试桌面实例已退出,未强制终止用户实例。任务栏图标、实际文档编辑、`Ctrl+O/S/W`、另存为、文件管理、搜索、终端 UI、Git UI、工作区恢复、工具链目录设置及真实 JDT LS 项目联调仍未完成完整原生验收;相关清单保持未勾选。此次驱动未携带 rg,因此也不用于验证搜索工具随包分发。安装包、同目录重启恢复及性能指标未在本轮验收。 #### 本地证据与下一步 以下均为被 Git 忽略的本地证据路径,不是仓库自带文件或发布下载: - 后端日志:`.validation/readme-backend-20261023-F8gvPd/`(`go-all.first.*`、`go-bindings.first.*`)。 - 前端两轮日志与输入哈希:`.validation/readme-frontend-20261023-0nrtQx/`(`frontend-test.log`、`frontend-retest.log`、`vue-tsc*.log`);后续并行修改不能追溯为已验证。 - 构建、元数据和原生步骤:`.validation/readme-verification-20261023-0025/`;20 组驱动回归:`.validation/driver-tests-0c53e0070ef243b9af725c65cebd7c81/`。 - 原生 Session JSON 与实际截图:`.validation/readme-native-20261023-0025/`、`.validation/readme-theme-20261023-0030/`;目录选择阻塞及清理:`.validation/readme-workspace-20261023-0030/`。 - 本轮原生产物 `build/bin/CodeNest-readme-20261023-0025.exe` 的 SHA-256:`0AAB1643482F3194229042510A16717F38A19CBA3BA643B791B365FD405A13CF`。后续源码变化不自动继承此产物的原生验证结果。 下一步优先在稳定工作树上处理 Git Push 回归失败,并为较长的 Git 集成回归单独安排足够时限,确认未完成用例;再在能保持精确前台 / 焦点的桌面中完成文件夹选择,依次验证文件管理与另存为、搜索、会话恢复、终端 / Git 和真实 Java 项目。历史 PowerShell 启动错误或历史成功都不替代本轮结果,未执行或跳过的场景不得宣称通过。 ### 10.4 阶段一基础收尾(2026-10-15) 本节单独记录桌面壳层收尾,不替代上面的 Git 功能与文件管理验收。 - 产品配置以 `wails.json` 为准:CodeNest `0.0.0`,明确标注“开发构建,未发布”;关于提示仅注入产品名、版本和开发说明,前端包及锁文件同步。 - 应用图标已更新为深色底、浅蓝色巢形与代码符号设计,顶部品牌标识和浏览器预览图标同步更新。设计素材位于 `frontend/src/assets/icons/`,打包资源为 `build/appicon.svg`、`build/appicon.png` 和七尺寸(16/24/32/48/64/128/256)`build/windows/icon.ico`。已有 ICO 优先于 PNG,因此更新品牌时必须同步两个产物。 - Git 全宽模式下顶部、视图菜单和底部侧栏入口禁用,展开状态反映实际布局;返回原工具面板保留侧栏偏好。 - 图标可通过 `scripts/generate-icons.mjs` 离线重新生成,需要本地 Playwright 和 Chromium/Edge。非默认安装可通过 `PLAYWRIGHT_MODULE` 指定包位置、`ICON_BROWSER_PATH` 指定浏览器路径,无需应用运行时依赖。 | 检查项 | 阶段一收尾结果 | |---|---| | `npm --prefix frontend test` | 26 项通过,包括产品元数据与 PNG / ICO 结构检查 3 项 | | 前端类型检查与生产构建 | 通过;保留现有隔离临时目录构建包装 | | `go test -count=1 ./...` | 通过;本会话 Git 包 148.593 秒,工作区包 7.862 秒,未使用测试缓存 | | `wails build` | 完整构建通过,3 分 57 秒;资源修复后执行 `wails build -o CodeNest-phase-one.exe` 再次通过(2 分 49 秒),未覆盖其他实例正在使用的旧 EXE | | 浏览器壳层交互 | 已通过侧栏两种偏好 → Git → 返回、关于版本、主题刷新恢复;无页面运行异常 | | 深浅主题与窗口尺寸 | 已检查 1280×800 / 800×540 四组浏览器截图,未发现横向溢出或状态栏越界;欢迎页内容可纵向滚动 | | Windows EXE 产品属性 | 修复资源模板缺少字符串 `FileVersion` 导致 .NET 查询回退清空的问题;`CodeNest-phase-one.exe` 实测 ProductName=CodeNest、ProductVersion/FileVersion=0.0.0、Comments=开发构建,未发布,断言通过 | | 原生窗口及未保存退出 | 原生默认 / 隔离配置启动尝试均遇到 WebView2 控制器创建错误 `0x800700AA`;未获得可验收窗口,关闭 / 重启 / 未保存确认仍待检查。随后观察到其他实例已有窗口,未操作该实例,故不将失败泛化为所有启动均失败 | 本轮最终验证产物为 **`build/bin/CodeNest-phase-one.exe`**,旧 `CodeNest.exe` 未被替换。可运行 `powershell -NoProfile -File scripts/check-exe-metadata.ps1 -Executable build/bin/CodeNest-phase-one.exe` 复查属性;今后正常 `wails build` 会使用修复后的资源模板。浏览器验收不能替代原生目录选择、前后端调用和退出握手;原生待验收项继续保持未勾选,不宣称阶段一整体验收完成。完整验收清单和图标生成说明见 [`docs/phase-one.md`](docs/phase-one.md)。 **2026-10-16 品牌回归补充:** 品牌定向测试 5 项、前端全量测试 28 项通过;独立产物 `build/bin/CodeNest-branding-20261016.exe` 完整构建及 EXE 属性断言通过。该新产物默认数据目录启动报 controller 创建错误 `0x8000FFFF` 并退出(退出码 1)。后续确认加载器会清空 `WEBVIEW2_USER_DATA_FOLDER`,此前环境变量隔离未实际生效。仅对本次进程将 `APPDATA` 指向项目验证目录后,原始 EXE 连续两次通过欢迎页、菜单交互与正常退出,故障已缩小至用户数据目录位置 / 访问环境,具体根因仍待跟踪。标题和窗口 N 图标已见截图,任务栏图标及关于未验收,品牌统一项保持未勾选。详细证据见[原生启动排查](docs/phase-one.md#2026-10-16-原生启动排查)。 ### 10.5 便携数据目录改造(2026-10-16) 已实现 EXE 同级 `data/webview2` 与 `data/tmp`,不依赖 C 盘 AppData profile、不静默回退;部署约定及保证边界见第 8.5 节。没有修改系统权限、全局环境、Git 配置定位或旧 profile。 **该轮历史产物:`build/bin/CodeNest-portable-data-20261016-final.exe`**(Windows amd64,26,653,696 字节,0.0.0 开发构建,未发布)。该轮未覆盖旧 EXE;构建产物不受版本控制,2026-10-23 检查时此历史文件已不在本地,不作为当前可运行下载入口。 | 验证项 | 本轮结果 | |---|---| | 前端回归 / 类型检查 / 生产构建 | 28 项测试及构建通过;保留 Monaco 大分块警告 | | 最终 Go 全量回归 | `go test -count=1 ./...` 通过:路径 0.972 秒、Git 69.998 秒、工作区 1.400 秒;路径含 9 项顶层测试及子用例 | | Wails 绑定辅助进程 | `go test -count=1 -tags bindings .` 通过;静态区分构建工具,不削弱发布运行时校验 | | 桌面构建 | 完整构建 2 分 5.362 秒通过;最后路径加固后复用前端执行 `wails build -s -o CodeNest-portable-data-20261016-final.exe` 通过(11.337 秒) | | EXE 产品属性 | 产品名、文件 / 产品版本与开发说明断言通过 | | 正常环境原生交互 | 欢迎页、主菜单展开、正常关闭 / 重启通过;切换浅色后重启恢复,不再覆盖 APPDATA | | 数据落点 / 部署 | WebView2 命令行实际指向 EXE 同级 `data/webview2/EBWebView`;不同 cwd、不同 EXE 文件名及独立非 C 盘目录部署均启动通过 | SHA-256:`243B8330136DA092B7909AF977B0656E58351CABBE6E0A669688F9B06E1762CC`。 README 与 [阶段一详细记录](docs/phase-one.md#2026-10-16-exe-同级便携数据目录) 已同步。原生不可写 / 错误框演练、任务栏图标 / 关于、Git 面板高度和文件保存 / 未保存退出未在本轮验收;不据此宣称阶段一整体验收完成。 ### 10.6 SQLite 配置底座(2026-10-19) 以下保留 2026-10-19 的历史记录,不代表最新源码状态;最近项目与会话恢复后续已实现,当前存储范围见第 8.5 节,2026-10-23 验证见第 10.3 节。 当时已将桌面快捷命令及 7 项界面偏好收敛到 EXE 同级 `data/codenest.db`,保留旧源并进行事务化、幂等迁移。最近项目、运行配置、搜索历史、会话恢复在该轮仍为后续业务,未因接入数据库而完成。 - 后端存储 / 偏好 / 快捷命令在 **Go 1.25.0、CGO_ENABLED=0** 下测试通过;覆盖 schema 回滚、未来版本拒绝、连接重建参数、并发写入 / 限额、旧数据导入回滚 / 重试 / 删除不复活。 - Windows 超过 300 字符的中文空格路径已通过真实 SQLite 创建、写入、关闭、重开读取验证;便携路径校验与文件 / junction 拒绝测试通过。 - App 偏好重启、迁移失败释放资源、旧工作区隔离,以及 bindings 全链路不初始化服务 / 不创建文件测试通过。`go vet`(三个存储相关包)、`go mod verify` 与 `govulncheck@v1.1.4`(三个存储相关包,无已知漏洞报告)通过。 - 全量 Go 回归已执行:主包、路径、Git、三个存储相关包、搜索及工作区通过;当次终端包存在 7 项 ConPTY 输出超时,故**不能记录为全量通过**。终端并行修复与验收独立跟踪,不以存储定向测试替代。 - 前端回归、生产构建、Wails 打包及原生重启 / 搬迁验收尚在本次收尾验证,结果完成后补充;单测通过不等于原生窗口验收通过。 --- **项目原则:先把基础编辑器做稳定,再逐步增加 IDE 能力。性能、可维护性和实际开发体验优先于功能数量。**