# 变更日志 本项目的重要变更都记录在此。 格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/), 版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 [English](./CHANGELOG.md) · 中文 ## [Unreleased] ## [0.8.5] - 2026-10-10 ### 修复 —— 兼容 DSH 0.2.0-rc.2(浏览器半面此前是坏的) - **客户端 session/workspaces API 回归**:浏览器半面曾被改写成一套**并不存在**的接口 (把 `sessions.list` 当方法、`sessions.create(id, opts)` 当同步返回 live session、 `sessions.get()`、`session.append()` / `session.snapshotEvents()`、 `workspaces.create(path)`)。在 DSH `0.2.0-rc.2` 上表现为:新建会话落到错误目录且无法命名, 会话数与标题恒为空。现改回真实契约:`sessions.list.getSnapshot()`、 `await sessions.create({ workspaceId, cwd })`、 `sessions.binding(id).session.rename(title)`、`workspaces.create({ path })`。 - `src/client/types.ts` 的结构镜像类型已按上述契约校正,并由 `smoke:dsh-compat` 与新增的 客户端契约测试守住。 - **`fileIndexBudget = 0` 曾同时表示两种相反含义**(渲染时=不限制,裁剪时=无可裁剪), 会让全局预算闸对该区块彻底失效。现在与其它三个区块一致:`0` = 不常驻。 - **拒绝空目录路径**:空 `path` 曾被写进 `dsh-write-protect` 的 `writablePaths`,而该插件 构造函数对空项直接抛错,会连带让沙箱 policy 半区加载失败——而 REST 仍回 `200`。 - **存储损坏不再清空用户数据**:读盘失败时旧的实现退化为空存储,紧接着的 `session/created` 会把空数据覆盖写入真实文件。现在会把原文件隔离为 `.corrupt-<时间戳>`, 并在重启前拒绝写入。 - **消除未处理的 promise rejection**:`session/created` 路径上一旦落盘失败,按 Node 默认 策略会直接终止宿主进程。 - **沙盒白名单覆盖全部活动会话**,而非只跟随当前工作空间:切工作空间不再静默吊销另一个 会话的写权限(那个会话的 prompt 里目录仍标着可写)。 - **和解 `dsh-write-protect` 设置页覆盖字段**:设置页保存过「额外可写根」后,生效来源变成 `writablePatterns` 并整体遮蔽 patch 的 `writablePaths`。现在两处同步维护, 诊断里的「已同步」等于「实际生效」。 - **路径规范化**(尾分隔符、重复分隔符、Windows 大小写)应用于白名单与目录列表: `/a/b` 与 `/a/b/` 视为同一目录,不再产生重复项,也不再长期误报「未同步」。 - 同分组目录之间夹了无分组目录时,后续目录不再丢掉分组标题。 - `sanitizeFolderName` 拒绝 `.` / `..` / Windows 设备名:此前主目录可能逃逸到所选 base 的父目录。 - 未知工作空间 id 现在返回 `404`,不再静默 no-op 却回 `ok: true`;沙盒写入结果以 `sandboxSynced` 如实回传。 - **按需上下文的落盘与清理改成按会话串行。** 清理走 `rm -rf` 会话目录,而落盘要在同一 目录里写临时文件再 rename;两者并发时 macOS 会在 `open`/`rename` 上抛 `EINVAL`,而写 失败被吞成「文件没写」,存活的那一代索引文件会静默缺失(压力循环实测 61/200 失败, 串行化后 0/200)。`smoke:on-demand-lifecycle` 已把该并发形态固化为回归。 - 宿主侧索引/扫描加固:缓存 LRU 上限、并发去重、加载中 promise 共享、git 输出大小感知、 Java/Kotlin 依赖查找去掉平方级扫描、非 `ENOENT` 的文件系统错误改为记录日志而不是静默 变成「空项目」。 - 浏览器侧健壮性:请求序号与取消守卫、乐观写入失败回滚、fetch 超时、遮罩按正确的按下 目标关闭、弹窗焦点/Esc 修复、备注与命令防抖提交、分组枚举不再把本地化文案当数据存。 ### 变更 —— 兼容 DSH 0.2.0-rc.2 - peer 依赖改为范围(`>=0.2.0-rc.1 <0.3.0`)而非精确锁定,开发依赖跟进到 `0.2.0-rc.2`。 - `dsh.client.inject` 按 DSH 预期填**包名**(模块图/预取元数据);浏览器入口仍在导出的 `inject` 里声明 cordis 服务列表。 - `smoke:dsh-compat` 校验 peer 范围与包名注入表;新增 `smoke:sandbox-sync` 守住 write-protect 的和解规则。 ### 变更 —— 兼容 DSH 0.1.7 - 插件 manifest 升级到 DSH `0.1.7-rc.2`:移除旧版 `dsh.host` 字段,并将实际使用的 DSH seam 包精确锁定到新版兼容门禁要求的运行时版本。 - 开发工作区关闭 peer 自动安装,避免打包时重复安装宿主已经提供的 DSH seam 服务。 - 新增 `smoke:dsh-compat`,检查新版 manifest、精确 seam 版本、客户端必需服务、bundle patch 与 Node 最低版本。 ### 新增 —— 符号级代码骨架 - 符号索引在复用现有源码读取的同时,为命中的函数、类、接口、类型、枚举和组件保存压缩后的声明签名,不增加第二次扫描。 - 任务胶囊在命中符号旁直接展示签名,让 AI 先获得参数与类型边界,再判断是否需要实现细节。 - 会话级符号文件升级为按需代码骨架;prompt 要求先看签名,信息足够时不读完整文件,需要细节时只读取命中位置附近。 ### 新增 —— 精准测试映射 - 源码扫描优先通过测试文件的直接导入建立实现文件到测试的映射,再保守使用文件名规则,例如 `service.ts` ↔ `service.test.ts`、`LoginService.java` ↔ `LoginServiceTest.java`、`module.py` ↔ `test_module.py`。 - 任务胶囊只保留覆盖改动文件、命中符号、接口文件或一跳依赖邻域的测试,无关测试不会常驻上下文。 - 完整映射保存在会话级 `test-map.md`,prompt 要求先运行目标测试,证据不足时才扩大到更大的测试套件。 ### 新增 —— 最小依赖邻域 - 复用现有源码扫描,确定性解析 TS/JS/Vue、Java/Kotlin 和 Python 相对模块的本地导入,不新增第二次全仓遍历。 - 任务胶囊只保留改动文件、命中符号和命中接口文件的一跳直接依赖与直接调用方,并把邻域文件加入建议读取顺序。 - 完整依赖图保存在会话级 `dependency-index.md`,AI 按一跳逐步扩大影响范围,不再整模块加载或盲搜。 ### 新增 —— 通用符号索引 - 复用现有端点扫描,同一遍源码读取顺带抽取函数、类、接口、类型、枚举和常见组件声明,不新增第二次全仓遍历。 - 完整符号位置写入每个会话独立的 `symbol-index.md`,常驻 prompt 只保留一条按需查询指令。 - 任务胶囊仅把任务描述命中的符号提升到建议读取顺序,避免盲目全仓搜索,同时不把整张符号表塞进每轮上下文。 ### 新增 —— 任务上下文胶囊 - 任务会话不再把完整文件树常驻注入模型,改为生成高信号胶囊:项目角色、技术栈、入口与构建清单、关键配置、测试位置、当前改动、可用命令和命中的接口落点。 - 胶囊根据 Git 改动、接口证据和入口文件生成建议读取顺序;完整文件索引写入当前会话的按需文件,仅在胶囊不足时查询。 - 快速会话继续沿用原有目录加载行为;专项测试覆盖大型项目,并要求胶囊模式至少减少 45% 的常驻 token。 ### 修复 —— 会话级按需上下文隔离 - 开发规范、项目命令和功能索引不再共用全局文本文件,改为写入按会话哈希隔离的目录,多个工作空间和会话不会互相覆盖上下文。 - 每个会话同时生成清单文件,记录工作空间和实际目录范围;会话正常关闭时立即清理,异常退出遗留目录会在 24 小时后回收。 - 上下文统计预览使用与真实会话相同的隔离路径形状,不再展示可能指向其他工作空间的全局路径。 ## [0.8.3] - 2026-09-30 ### 新增 —— Monorepo 支持 - 自动识别 pnpm/npm/yarn/bun workspaces、Turbo、Nx、Lerna、Maven modules 和 Gradle multi-project,并在新建向导中显示工作区类型与内部包数量。 - Monorepo 以根目录作为唯一工作区目录,内部 package/module 不再重复加入目录列表、沙盒白名单和 Git 规则;包边界随工作空间配置持久化。 - 会话 prompt 注入包名、技术栈和绝对路径映射,并明确区分根命令与包级命令,避免把嵌套 package 误当独立仓库。 ### 新增 —— TaskMode 稳定工作流 - 将功能开发、API 联调、Bug 修复、代码审查、跨仓重构和自定义任务收敛为统一注册表;目录范围、默认上下文预设、必读数据块、端点影响、验证、权限和最终输出均由模式配置驱动。 - 任务模式只写入会话快照,不覆盖工作空间配置;旧会话的 `type` 字段继续兼容并自动迁移为 `taskMode`。 - Review 模式全范围只读;API 模式强制启用接口索引和影响复核;Bugfix、Refactor 与 Feature 分别注入复现回归、迁移风险和交付闭环规则。 ## [0.8.2] - 2026-09-30 ### 新增 —— 统一诊断中心 - 新增 13 项统一检查,覆盖项目目录、沙盒依赖与可写根、DSH 服务、关联会话及配置版本、文件/功能索引缓存、token 估算偏差、项目命令、大型目录、配置文件与版本信息。 - 每项明确显示正常、警告、错误或未知,并支持重新检查;索引缓存、沙盒同步和关联会话提供安全的一键修复。 - 诊断报告可一键复制,复制前自动隐藏本机用户名、常见 API Key、Token 与认证信息。 ### 新增 —— 上下文预设与全局预算闸 - 新增「省钱 / 平衡 / 深度分析 / 自定义」四种上下文策略;新工作空间默认平衡,旧工作空间自动显示为自定义且保持原有加载模式与预算行为。 - 全局预算闸统一约束插件注入总量,优先保留任务描述、目录清单、显式 `@` 引用和开发规范,再依次截断文件索引、功能索引及 AI 摘要。 - 上下文预算弹窗按区块展示预算与实际用量,并明确列出本次自动降级;手动调整底层参数会切换为自定义模式。 ## [0.8.1] - 2026-09-30 ### 变更 —— 大块上下文默认按需加载 - 开发规范和各项目常用命令默认写入 ~/.dsh 的按需文件,会话 prompt 只保留一行查询提示;规范预算设为正数即可恢复常驻注入。 - 功能/接口索引默认预算改为 0:索引文件仍可 grep/read,但不再把索引正文常驻到每一轮模型上下文。 - 上下文统计只计算真正常驻的 prompt 文本,按需文件正文不再计入规范/命令/功能索引 token 桶。 ### 改进 —— 自动分组与智能默认值 - 新建工作空间扫描会按技术栈自动建议「后端 / 前端 / 参考 / 其他」分组;向现有工作空间添加单个项目时也会应用同一套识别逻辑。 - Node 项目不再固定假设 `pnpm`:根据 `packageManager`、锁文件和真实 `scripts` 生成启动/测试/构建命令;Java 会识别 Maven/Gradle 及 wrapper,Go/Python 使用可靠的通用命令。 - 1–4 个代码项目默认使用目录树加载,更多项目回退摘要控制上下文;确认页明确展示智能默认值,创建后仍可修改。 ## [0.8.0] - 2026-09-30 ### 新增 —— 创建任务前的范围风险检查 - 确认页新增任务范围预检:所选目录缺失或不可访问时阻断创建;存在脏 Git 仓库、只读代码项目、无代码项目、未选择验证或验证命令缺口时给出明确但非阻断的提醒。 - 风险只按本次任务实际选择的目录和验证要求计算,不会拿工作空间里未选中的项目制造噪声;代码审查任务不会把只读目录视为风险。 - 健康范围显示“启动检查通过”,阻断状态会禁用创建按钮,避免先建会话再发现项目无法读取。 ### 改进 —— 确认页展示项目级执行计划 - 「开始任务」确认页按项目列出主目录/可写/只读角色、Git 分支与未提交状态,以及每项验证实际使用的命令。 - 未配置命令时明确标记为由模型识别,变更影响复核标记为人工复核,创建会话前即可发现执行计划缺口。 ### 改进 —— 任务验证要求可编辑并显示命令覆盖 - 「开始任务」第二步新增启动、测试、构建和变更影响复核四类验证开关,类型默认值不再是不可修改的隐藏配置。 - 启动/测试/构建会按当前选中的代码项目显示“已配置命令数 / 项目数”;完全没有对应命令时给出非阻断提醒,模型仍可从项目脚本识别实际命令。 - 确认页和注入 prompt 使用可读中文验证名称,不再暴露 `review-impact` 等内部枚举值。 ### 改进 —— 任务范围推荐按可信度安全收敛 - 「开始任务」只在命中精确/标准化且前后端配对完整的接口时自动缩小项目范围;推断、单边或旧缓存结果只作为线索,默认保留全部启用项目,避免错误排除依赖仓库。 - 向导会说明本次是「高可信收敛 / 低可信保全量 / 默认全量」,并在每个推荐项目下展示对应的 `@功能名`;确认页保留推荐依据,用户仍可手动调整。 - 功能名裸文本匹配增加词边界,避免 `user` 错误命中 `superuser` 一类字符串。 ### 新增 —— 功能/接口索引置信度与可解释来源 - 每条端点新增「精确 / 标准化 / 推断 / 单边」置信度;面板用紧凑徽标展示,悬停可查看前后端来源、匹配依据、索引时间和动态路由提示。 - 扫描器记录 `/api`/版本前缀、路径参数、Spring 类级+方法级路由、客户端字面量与命名端点引用等证据;旧版磁盘缓存保持兼容,并在缺少证据时保守降级为推断。 - 常驻 prompt 只标记「推断」和「单边」结果,避免把完整证据塞入上下文;文档移除“不会误报”的绝对表述。 ### 新增 —— 按任务创建跨仓会话 - 顶部主操作升级为「开始任务」三步向导:先填写业务目标与任务类型,再确认系统推荐的目录范围、文件加载模式和功能索引策略,最后创建带任务上下文的新会话;原来的无任务快速创建保留为「快速会话」。 - 支持功能开发、API 联调、Bug 修复、代码审查、跨仓重构和自定义任务。描述中命中端点或 `@功能名` 时,只推荐对应前后端落点与主目录;没有可靠命中时回退到全部启用目录,避免误缩范围。 - 任务配置按会话 ID 保存在宿主内存中,不写回工作空间;宿主构建该会话快照时才应用目录、加载模式和功能索引覆盖。代码审查模式会在 prompt 中把本次目录标为只读并明确禁止修改文件。 - 新增 `session-task` loopback 路由;任务可以早于 `session/created` 事件到达,宿主会在会话完成绑定后应用,避免客户端与宿主生命周期竞态。 ### 新增 —— 工作空间就绪报告 - 当前工作空间顶部新增「已就绪 / 需关注 / 不可用」状态入口;点击后统一检查主目录与项目目录是否有效、前后端项目识别、读写权限、Git 仓库与未提交改动、功能接口配对、项目命令、上下文预算和关联会话。 - 主目录缺失或没有任何目录会进入阻断状态;预算接近/超限、接口索引为空、命令缺失和脏仓库会给出非阻断建议。报告可一键重新检查,并可直接进入上下文预算弹窗。 - 就绪度计算收敛为平台无关的纯函数,不新增宿主路由,也不修改用户项目文件。 ### 新增 —— 每个项目都能看到自己的会话列表,并可一键刷新 - 在面板里点项目会展开「加载了这个项目的会话」(即本 DSH 进程绑定过的会话),每行一个**刷新会话**按钮:用工作空间的当前配置重建该会话的上下文快照,下一轮请求就带上新的目录列表、文件索引、功能索引与开发规范。本进程没加载过的会话不列出 —— 它们无法刷新。 - 顺带补齐:模式、加载模式、快照还原这三条路径现在也会刷新在跑会话(此前漏掉);快照构建失败会记一条 warn,不再让会话悄悄停在空索引上。 ## [0.7.0] - 2026-09-29 ### 新增 — 新建向导第二步支持多次添加项目 - 第二步「添加项目」再选文件夹时不再覆盖上一次的扫描结果:新识别到的项目按路径去重后追加并自动勾选,因此可以从分散在不同位置的文件夹拼出一个工作空间;取消勾选的项目依然不会加入;每次扫描会回显本次新增了几个,列表非空后按钮变成「继续添加文件夹」。 ### 修复 —— 功能/接口索引匹配不上服务端落点 - 目录遍历深度上限是 8 层,而标准的多模块 Java/Go 布局 (`//src/main/java/com///controller/…`)在第 9 层,整棵 `controller` 目录被剪掉,于是每条条目都只有前端调用点、没有服务端落点。深度改为 16,读取预算由 800 文件 / 8 MB 提高到 5000 文件 / 24 MB。 - 路由/控制器文件优先读取:超出预算的仓库也不会把预算花在遍历顺序靠前的无关文件上。 - 忽略 `venv`、`site-packages` 与 Maven 的 `target`,不再从 Python 第三方包里抽出假端点。 - 排序分三档:配对的 → 只有前端调用的 → 只有服务端注册的,截断时既不会丢配对、也不会丢前端调用点。 - client 侧改为按语言判定:后端文件原来被 `.get(` 到处命中(`map.get(...)`、`list.get(0)`), 353 条「配对」里有 315 条其实是控制器自己的内部调用被当成了前端落点。现在后端文件必须有真正的 HTTP 客户端线索(`RestTemplate`、`WebClient`、`HttpClient`、`FeignClient`、`requests.get`、`http.Get` 等)。 ### 变更 —— 功能/接口索引改为可**按需加载** - 功能索引预算填 `0` 原来的含义是「不限制」,手改配置会把整个索引注入(多模块工作空间约 2.9 万 token);现在 `0` 表示「完全不注入该区块」,预算输入框允许填 0,面板列表两种模式下都照常可用。 - 索引会额外落一份可 grep 的纯文本(每行一条:`@功能名 → 端点 | 服务端 文件:行 | 前端 文件:行`)。 不常驻上下文时 prompt 里只给一行线索指向它,模型只在需要定位端点时才去查:本工作空间 prompt 由 942 降到 579 token。 ### 变更 —— 已打开的会话也能立即用上新增的项目 - 新增/删除项目目录,或修改模式、加载模式、预算、功能索引设置、开发规范后,会重新为绑定该工作 空间的活动会话生成上下文快照:下一轮请求就带着新的目录列表、文件索引、功能索引与规范,不需要 新建会话(面板里那句「项目只对新建会话生效」的提示也一并改掉)。 - 顺带修掉「按需模式存不下来」的三处拦截:工作空间 patch 路由拒绝预算 `0`、存储层把它 clamp 成 `1`、读取时又把存过的 `0` 丢掉。 ## [0.6.0] - 2026-09-27 ### 新增 — 真实 token 用量(provider 上报) - **上下文弹窗新增「真实消耗」块** — 从 `session/event` 的 `assistant/message` 结算样本读取模型上报的真实用量,显示未命中输入、缓存读、缓存写、输出、**缓存命中率**,以及相对上下文窗口的占用条。 - **插件占比** — 注入区块的估算 token 除以最近一次请求的 prompt 总量,直接看出你的上下文注入占了这次请求的百分之几。 - **估算与真实并排** — 原有的分区块数字仍是估算值;新块是实测值。两者差距大就说明估算模型需要修正。 ### 新增 — 逐项目命令手册 - **目录级 `commands`**(`run` / `test` / `build`)— 在目录卡片内联编辑,随目录列表一起持久化(不新增文件),并作为独立 prompt 分节(`# 各项目常用命令`)带绝对路径注入,预算 400 token。 - **按项目类型预填** — 新建向导与目录扫描会在有把握时填好 `mvn spring-boot:run`、`go run .`、`pnpm dev` 等;需要额外参数的命令一律留空,不会注入一条跑不通的命令。 ### 新增 — 确定性端点关联 - **端点目录归属** — 每个索引端点现在记录其服务端与客户端落点分别位于哪个目录。 - **`/api` 前缀容错** — `/api/user/detail` 与 `/user/detail` 现在会联结,穿越代理的前端与不带前缀的后端不会再被索引成两条。 - **Spring 类级前缀拼接** — `@RequestMapping("/user")` 配合 `@GetMapping("/list")` 会索引为 `/user/list`,而不是光秃秃的 `/list`。 - **「本次变更涉及的端点」卡** — 从 git 工作区变更出发,通过同一遍扫描产出的「文件 → 端点」反向索引,确定性地列出这些文件声明或调用的端点及对端文件。不用 AI,不做猜测。 ### 变更 — 上下文计费 - 分区块计费改为精确:固定开销改为 `整块渲染量 − 文件索引 − 功能索引 − 规范 − 命令`,面板各项相加即实际注入量,不再重复计入区块标题。 - 上下文统计新增 `codeIndexTokens` 与 `commandsTokens` 两个字段,各自一张卡。 ### 修复 — 左栏新增卡片会被静默裁掉 - **左栏改为可滚动**。左栏非首卡的 content 高度是固定的(flex: none),而栏本身是 overflow: hidden, 一旦固定卡总量超过栏高,**最后一张卡**就会被裁掉——没有滚动条也不报错,窗口偏矮时功能纯粹看不见。 现在左栏是 overflow-y: auto,并给工作空间卡留了 150px 的最小高度。 - **端点列表并入功能索引卡**,不再单独占一张卡,左栏不会因为每加一个功能就多长一张卡。 ### 新增 — 高级配置改为显式保存 - **高级配置弹窗新增「保存」按钮**。工作空间模式与文件加载模式先在本地草稿里改,不点保存不落库;点「取消」两者一起丢弃;没有实际改动时保存按钮是禁用的。草稿会随工作空间变化重新对齐,所以弹窗打开时工作空间还在加载,也不会把默认值写回去。 ### 变更 — 功能索引卡固定顶部区块与底部说明行 - 「本次变更涉及的端点」区块和底部说明行都移到了卡片滚动容器之外:只有它们之间的接口列表滚动,两者始终可见,卡片高度仍然是 320px 上限。顶部区块在变更端点特别多时最多占 110px,超出部分在它内部滚动,避免把底部说明行挤出卡片。 ## [0.5.0] - 2026-09-27 ### 新增 — 预制开发规范 - **内置规范库(7 条)** — 通用/团队、Java & Spring、Vue 3、React、Python、Go,以及接口契约。每条都是原创要点摘要(不逐字引用任何受版权保护的规范文档)。 - **按技术栈自动匹配** — 默认开启 `autoMatch` 时,每个目录识别到的 `projectType` 会自动套用匹配的规范(java → Java/Spring、vue → Vue 3、go → Go…);每一条都可以单独取消勾选。 - **工作空间级绑定** — `global`(整个工作空间)与 `perDirectory`(逐目录)两套选择,另有每工作空间的 token 预算与启用开关。 - **可编辑、可恢复** — 内置正文可全局修改,也可只改当前工作空间;「恢复默认」会同时清掉两级覆盖。自建规范支持新建(全局或仅本工作空间)、编辑、删除,并可复制出去分享。 - **作为独立 prompt 分节注入** — `# 开发规范(按作用域生效,务必遵守)` 位于目录清单与文件索引之间,按作用域分组(如 `Java / Spring(适用:example-backend)`),拥有独立 token 预算(默认 800)与截断提示。 - **面板入口** — 左栏新增「开发规范」卡,点开是两栏弹窗(规范库 + 编辑器),并显示单条与合计 token 估算。 ### 新增 — 可选的 AI 起草 - 规范弹窗里的 **「用 AI 生成」**:按所选规范名与技术栈,用宿主默认模型起草 12–18 条要点,直接填入编辑器供你审阅。**不会自动生成**,不点就不花任何 token。 - **共享 LLM 助手**(`host/llmText.ts`)现在同时支撑功能摘要与规范起草。 - LLM 流式调用的失败(它以终态 `finish` 分片返回,而不是抛异常)现在会被识别,并在 UI toast 里给出可读原因。 ### 变更 — 面板布局 - **高级配置**、**注入 prompt 预览**、**上下文预算** 三块都从"内联展开"改为「点击弹窗」(Esc / 点遮罩关闭);左栏成为一叠紧凑的入口卡。 - **上下文预算移出右栏**,改由左栏「更多」入口打开;原本用于在「项目目录 : 上下文预算」之间分配高度的可拖拽分隔条已移除,目录卡现在独占整列高度。 - 预算进一步压缩:卡片头单行、总览一行、每张统计卡「标题 + 数值」同一行、环形图缩到 44;逐目录用量改为**横向可滚动条形列表**;统计项里新增「规范」。 ### 新增 — 中文文档 - `README.zh.md`(完整中文 README,与英文版互相链接)与本次的 `CHANGELOG.zh.md`;npm 包体也开始包含 `README.zh.md`。 ### 修复 - 功能索引 `summary` 模式漏标截断;注释 / 正则源码行可能被误当端点;§B@@功能名` 规则在没有索引时也会注入。 - 新增 `ContextStats.standardsTokens`,让监控总额与实际注入一致。 ## [0.4.0] - 2026-09-26 ### 新增 — 功能/接口索引与上下文优化 - **功能/接口索引(新)** — 宿主确定性抽取 HTTP 端点,并联结服务端注册处与前端调用处的「文件:行号」;覆盖 TS/JS/TSX/JSX/Vue 与 Java/Kotlin/Go/Python/Ruby/C#;端点归一化(花括号参数 / 美元花括号模板 / 冒号参数视为同一端点),并过滤 value/path/url 等通用属性名避免误联。 - **索引可配置化** — 工作空间级 codeIndexEnabled / codeIndexBudget / codeIndexSummary;面板新增「功能/接口索引」卡片(开关、预算、摘要模式、筛选、点击复制 @功能名)。 - **@功能名 展开协议** — prompt 的 @指令新增一条:@功能名 指功能索引里的名字,展开即读取该项列出的服务端/前端文件;该规则仅在实际存在索引时注入。 - **AI 功能摘要(可选)** — codeIndexSummary=llm 时按功能签名生成一句话摘要;后台异步生成(不阻塞会话创建与首轮)、并发去重、失败静默降级。 - **落盘持久化** — 功能索引与 AI 摘要分别落盘到 ~/.dsh/dsh-workspace-combiner-code-index.json 与 ~/.dsh/dsh-workspace-combiner-feature-summaries.json(原子写 0600、TTL),跨重启复用,避免重复扫描与重复花 token。 ### 变更 — 上下文与 token 优化 - 摘要计数改为**递归真实总数**(此前只数顶层,体量失真)。 - 文件索引预算改为**按目录配额 + 余量回填**,避免大目录挤掉后续代码项目。 - **低信号优先截断** — 测试 / 夹具 / 快照 / 锁文件 / 生成物排最后。 - tokenBudget **真正生效**(此前仅展示)。 - 同会话 **渲染结果缓存**,不再每个模型步重拼。 - 默认忽略目录新增 .pnpm-store / .next / .nuxt / .turbo / .venv / __pycache__ / .gradle。 ### 变更 — 性能 - 建会话按目录**并行扫描**;文件树同级目录**有界并发**下钻。 - 新增轻量 **/stat** 路由,目录失效检测不再构建整棵文件树。 - **loadModeMaxDepth()** 统一深度映射;**/file-index** 接收 loadMode,预览与注入深度一致并复用缓存。 - FileIndexCache 增加 30s TTL 兜底。 ### 变更 — 面板 UI - 上下文预算卡压缩:卡片头单行、总览一行、统计卡「标题 + 数值」同一行、环形图缩小到 44。 - 逐目录用量由**竖向柱状图**改为**横向可滚动条形图**。 - 功能索引卡固定高度内滚动;预算卡滚动改用显式类名(修正原 :last-child 失效)。 ### 修复 - 功能索引 summary 模式漏标截断、注释 / 正则源码被误当端点、@功能名 规则在无索引时悬空。 ### 文档 - 新增中文 README(README.zh.md),并与英文版互相链接。 ## [0.3.0] - 2026-09-26 ### 变更 — 客户端 UI 重构(暗色 IDE 风格) 围绕"操作频率"重建了侧栏面板的信息架构,并赋予玻璃拟态的暗色 IDE 视觉语言。没有移除任何功能。 - **顶栏(新的高频区)。** 品牌行(渐变图标、标题、副标题、`⌘N` 徽标)、高亮的当前工作空间卡(渐变描边、发光状态点、模式 / 项目数 / 加载模式摘要),以及主操作 **新建会话** 按钮从面板底部上移。 - **工作空间列表。** 紧凑行:状态点、名称、当前胶囊、相对"最近使用"时间,另加搜索过滤(纯客户端)与紧凑的新建按钮。 - **项目目录。** 可折叠区(默认展开):拖拽手柄、主项目星标、渐变类型方块(D/B/F)、名称、等宽路径、彩色分组胶囊、访问模式胶囊与常显移除按钮。HTML5 拖拽重排现在会在目标位置显示渐变落位线。 - **高级配置**(默认折叠,折叠时显示摘要):工作空间模式与文件加载模式由 `