Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
2949a76
fix(Branches): 修复 Delete Remote Branch 对陈旧远程分支误报失败且吞掉真实原因;
ThreeFish-AI Oct 17, 2026
15f3533
fix(Branches): Review 收敛——错误文本提取 SSOT 化与删除通知诚实化;
ThreeFish-AI Oct 17, 2026
49bf43f
Merge pull request #147 from ThreeFish-AI/ThreeFish-AI/remote-branch-…
ThreeFish-AI Oct 17, 2026
db3c39c
chore(Release): 发布 v0.0.20 —— Delete Remote Branch 陈旧远程分支修复 · 删除失败可诊断;
ThreeFish-AI Oct 17, 2026
55fe70b
Merge pull request #148 from ThreeFish-AI/ThreeFish-AI/release-v0.0.2…
ThreeFish-AI Oct 17, 2026
3f8a393
feat(Log): Filter by Author 支持作者候选前缀建议与多选过滤;
ThreeFish-AI Oct 23, 2026
9a36e2e
Merge pull request #149 from ThreeFish-AI/ThreeFish-AI/graph-author-s…
ThreeFish-AI Oct 23, 2026
34d62c2
chore(Release): 发布 v0.0.21 —— Filter by Author 候选建议 · 多选过滤 · 元字符作者修复;
ThreeFish-AI Oct 23, 2026
9cb2b13
Merge pull request #150 from ThreeFish-AI/ThreeFish-AI/release-v0.0.2…
ThreeFish-AI Oct 23, 2026
81b4f29
fix(Log): Filter by Author 选择按仓库持久化,重启与切库后恢复;
ThreeFish-AI Oct 23, 2026
d6ff75e
docs(Issue): 记录 authors 过滤持久化修复经验与 CHANGELOG 条目;
ThreeFish-AI Oct 23, 2026
73b6027
fix(Log): pickAuthors 切库守卫防误写持久化,补 wiring 测试并同步文档;
ThreeFish-AI Oct 23, 2026
b2d6b1f
fix(Log): logFilterPath 对话框期间切库守卫,防跨仓库垃圾 path 过滤;
ThreeFish-AI Oct 23, 2026
b308e10
feat(Log): 其余 6 个过滤维度按仓库持久化,切库守卫全覆盖收口;
ThreeFish-AI Oct 23, 2026
f8ecad1
feat(Branches): 分支就地更新——不 checkout 右键 Update / 标题栏选区感知 / 多选批量 (#151)
ThreeFish-AI Oct 23, 2026
f5ad406
fix(Log): Review 收敛修复——越仓 path 段级校验、logFilter 聚合守卫、pickAuthors ghost …
ThreeFish-AI Oct 23, 2026
e6f2c9f
chore(Merge): 合入 feature/1.x.x(#151 分支就地更新),解决 CHANGELOG [Unreleased]…
ThreeFish-AI Oct 23, 2026
56a31d1
feat(Log): 过滤激活态可见指示——标题栏过滤图标常态/填充双命令互斥,filterActive context key 三处同步;
ThreeFish-AI Oct 23, 2026
55957b8
chore(deps-dev): bump the dev-minor-patch group with 4 updates
dependabot[bot] Oct 24, 2026
3fcf00a
Merge pull request #152 from ThreeFish-AI/ThreeFish-AI/graph-anthor-f…
ThreeFish-AI Oct 24, 2026
96aad0e
Merge pull request #153 from ThreeFish-AI/dependabot/npm_and_yarn/fea…
ThreeFish-AI Oct 24, 2026
a520ad7
chore(Release): 发布 v0.0.22 —— Graph 过滤持久化与激活指示 · Branches 就地更新 · 开发依赖升级;
ThreeFish-AI Oct 24, 2026
43ca96c
Merge pull request #154 from ThreeFish-AI/ThreeFish-AI/release-v0.0.2…
ThreeFish-AI Oct 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,41 @@

## [Unreleased]

## [0.0.22] - 2026-10-24 — Graph 过滤持久化与激活指示 · Branches 就地更新 · 开发依赖升级

### Added

- **Branches 视图分支就地更新(不 checkout)**:右键单个分支 **Update Branch**、多选批量更新、标题栏 Pull 按钮升级为选区感知(无选区保持原 Pull 语义,Commit 视图 Pull 不受影响)。底层原语 `git fetch <remote> refs/heads/<upstream>:refs/heads/<branch>`——git 原生 fast-forward-only,diverged / ahead-only 分支被安全拒绝(附真实 stderr 原因),**永不改写本地提交**(src 侧全限定防 `+` 前缀上游名被解析为 force);当前分支自动改走 `repo.pull()`(含冲突处理通道);无上游分支透明跳过;无 remote 配置提示 `No remote repository configured` 提前返回(不误报 no upstream)。五桶对账汇总(updated / already up to date / pulled / skipped / failed,选中数 = 各桶之和),up-to-date 经前后 `objectname` 短 sha 前缀比对判定(fetch 静默 no-op 无输出;缩写长度随对象数伸缩,全等比对会误报)。upstream 解析不信任树节点数据(API 路径 `refToRaw` 不填 upstream/head),统一以一次 `for-each-ref` 取新鲜快照;`origin/x` 拆分复用 `resolveRemoteBranch` 最长前缀匹配(remote 名可含 `/`)。engine 纯逻辑 `planBranchUpdates` / `formatBranchUpdateResult` / `classifyFetchOutcome` 落于 `engine/ref/branch-update.ts`,全量单测覆盖。

### Fixed

- **Graph 视图过滤条件不再随重启 / 切库丢失(全部 7 个维度按仓库持久化)**:authors、File Path、Grep、Merge Mode、Date Filter、Message Regex 此前仅存于内存,重启 VS Code 或切换仓库后即被清空。现在沿用 scope/dmode 的按仓库 workspaceState 范式持久化——authors 独立 key(`hyperGit.log.authors:<repoRoot>`),其余 6 维组合 key(`hyperGit.log.filter:<repoRoot>`,单 key 原子读写防半恢复态,dateFrom/dateTo 经 ISO 串往返),重启与切库往返后自动恢复为上次设置;过滤生效期间标题栏过滤图标点亮为填充态(Graph Filter Active,`$(filter-filled)`,经 `hyperGit.log.filterActive` context key 与常态图标互斥呈现)——恢复的过滤不再是无声约束;重开「Filter by Author…」即预勾选已选 exact 作者并继续增删(pattern 项不参与预勾选、重开后不可见,确认新选择会将其移除);空选确认与 Clear Filter 的「清除」同样持久化,重启不复活;脏持久化数据经 engine 纯函数逐字段校验免疫。**附带行为变更**:① SCM 变更列表右键「Show History」由整替过滤器改为与其余过滤命令一致的增量式——文件历史现与活跃过滤相交,而非静默清空后者(M3 期遗留不一致);② 任何过滤对话框(Filter Graph 聚合入口 / Author / Path / Grep / Merge Mode / Date / Message Regex)或 Commit 文件右键菜单打开期间发生切库后确认,不再把旧仓库语境的选择误写新仓库(rootAtStart 切库守卫全覆盖);③ issue #107 的「切库清空 host 级过滤」限制消除——每个仓库记忆自己的完整过滤条件;④ Filter by Path 选中当前仓库外的文件(多根工作区选他仓文件 / 单仓导航到仓外)时以告警拒绝,不再落入 `../…` 垃圾 path 过滤——该垃圾 path 会随持久化成为跨重启的图加载 fatal 错误态。

### Changed

- 开发依赖升级(#153):eslint 10.12 → 10.13、typescript-eslint 8.71 → 8.72、vitest 5.0.4 → 5.0.5、ovsx 1.2 → 1.3——全部 devDependencies,对扩展运行时零影响。

## [0.0.21] - 2026-10-23 — Filter by Author 候选建议 · 多选过滤 · 元字符作者修复

### Added

- **「Filter by Author…」升级为作者候选建议 + 多选过滤**:候选经 `git shortlog -sne` 按当前 Graph 视图 scope 取数(按提交数降序、姓名/邮箱均可模糊匹配),输入前缀(如 `Thr`)即在下拉中建议对应提交者,勾选即选、无需完整手输;依次勾选多个提交者翻译为多条 `--author`(git 取 OR)直接过滤 Graph 视图,空选确认 = 清除该维度、Esc = 取消不变。输入不等于任何作者姓名时动态插入「Use pattern」逃生口(原样正则透传),完整保留旧 InputBox 的任意 pattern 能力。engine 侧 `LogFilter.author` 单值改为 `authors: AuthorTerm[]`(exact 身份 / pattern 正则 tagged union,单一字段单一事实源);`scopeRefs` 提取为 scope → 引用范围参数的单一事实源(Graph 取数与作者候选共享);adapter 侧为仓库首个 `createQuickPick` 动态用法(busy 取数、勾选自维护回写、settle 幂等守卫、切库竞态守卫、空仓库降级)。新增 `engine/log/author-suggest.ts`(shortlog 取数参数 + 容错解析,current scope 显式 `HEAD` 防 stdin 挂起)。

### Fixed

- **作者名含正则元字符时过滤 0 命中**:`git log --author` 缺省 POSIX BRE(非 ERE),旧实现把手输作者名原样作为正则传递——`dependabot[bot]` 中的 `[bot]` 被解释为字符类,匹配 0 条(本仓库实测:不转义 0 命中)。现在从候选列表选中的作者身份按 BRE 语义转义(仅 `\ . [ * ^ $`;`+ ? | ( ) {` 在 BRE 中是普通字符,加反斜杠反成操作符)并锚定全行 `^Name <email>$`(同名异邮箱不混淆)。


## [0.0.20] - 2026-10-17 — Delete Remote Branch 陈旧远程分支修复 · 删除失败可诊断

### Fixed

- **Branches 视图「Delete Remote Branch」对陈旧远程分支误报失败且无原因**:PR 合并后远端自动删除的分支,本地 remote-tracking ref 在下次 `fetch --prune` 前一直保留,视图仍列出;右键删除时 `git push --delete` 被服务端拒绝(`remote ref does not exist`),且 `catch {}` 吞掉真实报错,只回显笼统的「N failed」。现在「服务端已无此 ref」被识别为目标态已达成——按成功收尾并清理本地陈旧 tracking ref(通知如实标注 *already gone on remote*);真失败(保护分支拒绝 / 认证 / 网络)则经 stderr 优先提取,在通知中逐分支附上真实原因,并联动 Show Output 查看完整输出。engine 纯逻辑 `isRemoteRefMissingError` / `formatRemoteDeleteResult` 落于 `engine/ref/remote-ref.ts`,全量单测覆盖。

### Changed

- **错误文本提取单一事实源(`gitErrorText`)**:新增 `engine/git-state/git-error.ts` 统一「非空白 stderr 优先 → message → String 兜底」提取语义,`remote-commands` / `history-commands` 两处内联拷贝改为引用;Push 对话框 / Update Project / Merge 对话框的失败通知随之升级为 stderr 优先(真实原因直达,不再只显通用串)。

## [0.0.19] - 2026-10-17 — Branches 视图 PR 状态徽标 · 取数安全加固 · 开发依赖升级

### Fixed
Expand Down
16 changes: 16 additions & 0 deletions docs/.agents/issue.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,3 +164,19 @@
- **处理方式**:webview state v3 在 `byRepo` 分区新增 `draft`(message + 三勾选);输入/勾选变更即时 `saveState()` 落盘(消除 debounce 尾丢);回灌仅限「重建首帧/切换仓库」两时机且先于 `reconcileChecked`(避免 state 推送往返覆盖当前编辑);提交成功清空草稿。未采用 `retainContextWhenHidden`(钉死整个 webview 内存,且不跨窗口 reload)。
- **后续防范**:webview 内用户编辑态一律显式入 `setState`(含 debounce 之外的即时落盘点);回灌逻辑必须有时机守卫(一次性/切换触发),并注意「先回灌 DOM、后执行任何从 DOM 取数回写 state」的顺序。
- **同类问题影响**:所有自绘 WebviewView 承载编辑器的扩展;凡输入经防抖上报宿主的模式都存在尾丢窗口。

## #19 Branches 视图 Delete Remote Branch 对陈旧远程分支删除失败且无原因提示

- **表因**:右键删除 `origin/rsi/fixture-terminology` 等远程分支直接报 `Deleted 0 remote branches, 1 failed: …`,无任何失败原因,此类分支「经常」删不掉。
- **根因**:复合缺陷——① PR 合并后 GitHub 自动删除远端分支,本地 `refs/remotes/origin/...` 在下一次 `fetch --prune` 前一直陈旧,Branches 视图(数据源 `repo.state.refs`)仍列出它;② 对陈旧 ref 执行 `git push origin --delete <branch>` 被服务端拒绝(git 2.54 实测 stderr:`error: unable to delete 'x': remote ref does not exist`);③ `remote-commands.ts` 删除循环的 `catch {}` 把 execGit 已透传挂载的 stderr 整个吞掉,最终只回显笼统的「N failed」,不可诊断。即「目标态已达成却按失败收尾」+「真失败也无原因」两个 Bug 叠加。
- **处理方式**:删除循环改三桶(成功 / 服务端已无此 ref / 真失败)——「服务端已无此 ref」经 engine 纯逻辑 `isRemoteRefMissingError`(stderr 优先,匹配 `remote ref does not exist` / `delete of non-existent ref` 变体)识别,按达成收尾并把本地陈旧 tracking ref 纳入既有 `branch -D -r` 清理;真失败经 stderr 优先的 `gitErrorText`(`engine/git-state/git-error.ts` 单一事实源)提取原因,由 `formatRemoteDeleteResult` 汇总为通知(失败走 `showGitError`,联动 Show Output 看完整 stderr)。确认弹窗/受保护主干硬阻断/上游软警示逻辑不动。
- **后续防范**:① 批量操作的 `catch` 必须保留可行动的失败原因(execGit 拒绝值已挂 `.stderr`,消费即可),`grep -rn 'catch {' src/adapter/` 应逐个确认非吞错;② remote-tracking ref 与服务端存在时滞,任何「对远程分支的操作」都要考虑「本地有、服务端无」的陈旧态——删除/比较/PR 匹配等场景遇到 `does not exist` 类报错应先判陈旧再判失败;③ 视图列表的「幽灵分支」根治靠 `fetch --prune`(Prune Remotes 命令已有),删除路径的容错只是补救。
- **同类问题影响**:所有列出 remote-tracking ref 并提供远程删除的 Git GUI;凡把服务端拒绝一概当失败、不区分「目标态已达成」的实现,以及任何丢弃 stderr 的批量 CLI 包装。

## #20 Graph 视图 Filter by Author 过滤选择随重启丢失(未持久化)

- **表因**:Graph 视图「Filter Graph… → Filter by Author…」多选作者后,重启 VS Code(或切换仓库再切回)过滤被清空,需从头重选。
- **根因**:过滤状态仅存于 `LogWebviewProvider` 内存字段 `private filter: LogFilter = {}`,`setFilter/clearFilter` 只改内存不落盘;切库 handler 还会显式 `this.filter = {}`。同文件的 scope/dmode 早有按仓库 workspaceState 持久化范式(`loadRepoScopedPrefs`),filter 维度从未接入。另有一处硬冲突:`hyperGit.showHistory` 用 `setFilter({ path })` 整替 filter 对象(M3 期遗留,早于其余 5 个过滤命令统一的 `{ ...f, <维度> }` 增量范式),若接入持久化会静默清空已保存的 authors。
- **处理方式**:① `engine/log/log-filter.ts` 新增纯函数 `parsePersistedAuthors`(JSON 串 → `AuthorTerm[]`,元素级剔除脏项,永不抛异常);② `LogWebviewProvider` 新增 `authorsKey(root)`(`hyperGit.log.authors:<root>`,同 scope/dmode 命名范式)与唯一写入点 `persistAuthors`(`setFilter/clearFilter` 汇聚,`update(key, undefined)` 即删 key,空选清除同样持久化);恢复并入 `loadRepoScopedPrefs`(构造期 + 切库共用),切库语义由「全清」改为「清非持久维度 + 恢复新仓库持久值」;③ `showHistory` 改增量式 `setFilter({ ...getFilter(), path })`,与其余过滤命令同构;④ Review 收敛补充:`pickAuthors` settle 增切库守卫(rootAtStart 同范式——环境驱动切库不夺焦点、QuickPick 不隐藏,取数窗口外确认会把旧仓库勾选经 persistAuthors 误写新仓库持久化 key),候选集外的持久化 exact 作者以 ghost 项预勾选呈现(selectedItems 只能来自 items,scope 已切换 / shortlog 失败降级时缺项者确认即被静默丢出持久化 key),`multi-root-repo-selection.md` 已知限制同步新切库语义,wiring 级测试(`history-commands-filter-wiring.test.ts`)钉住 showHistory 增量式与 settle 守卫;同构守卫同步应用于 `logFilterPath`(对话框 await 期间切库会按新仓库 root 求出跨仓库垃圾相对路径——预存竞态,收敛门范围外观察,经用户裁定收口;越仓选择同产 `../…` 垃圾 path 且经持久化升级为跨重启粘性污染——增 rel 路径段级越仓校验(`'..'` / `'../'` 前缀;较 showBlame 的 `startsWith('..')` 不误杀仓内 `..` 前缀文件)+ 告警拦截,wiring 测试补越仓与不误杀用例);⑤ 其余 6 个过滤维度(path/grep/mergeMode/dateFrom/dateTo/messageRegex)经用户决策按同范式扩展持久化:组合 key `hyperGit.log.filter:<repoRoot>`(单 key 原子读写防半恢复态),dateFrom/dateTo ISO 串往返,engine 层 `serializePersistableFilter/parsePersistedFilter` 逐字段校验(归一化:空串、mergeMode 'all' 不落盘),issue #107 的「切库清空 host 级过滤」限制随之消除(multi-root 文档已知限制同步移除,按仓库状态表与导语同步补录过滤 key);增量 Review 复核后同范式守卫补齐 grep/mergeMode/date/regex 四命令、commit 文件菜单(`handleFileMenu`——菜单 await 期间切库时 change 属旧仓库语境,任何动作不派发)与聚合入口 `logFilter`(其 Clear Filter 项直接执行,await 期间切库会删切换后仓库的持久化 key),全部过滤对话框与 Commit 文件菜单的 await 窗口至此收口(Graph 提交行右键菜单 `handleCommitMenu` 为预存未守卫路径,不在本条收口范围);wiring 测试同步补齐 date/regex(正常 + 切库守卫 + 清除分支)与 mergeMode 正常路径用例;⑥ 经用户决策采纳 Review 改进建议:过滤激活态可见指示——engine 纯函数 `hasActiveFilter`(与持久化归一化同口径:空串 / mergeMode 'all' / 空 authors 不算生效)驱动 `hyperGit.log.filterActive` context key(setFilter/clearFilter/loadRepoScopedPrefs 三处同步),标题栏过滤图标常态(`$(filter)`)/填充(`$(filter-filled)`)双命令互斥呈现(detailTree/detailFlat 同范式,`logFilterOn` 与 `logFilter` 共用聚合 handler)。
- **后续防范**:① 视图 UI 状态凡期望跨会话存活,一律挂到既有的按仓库 memento 范式(key 带 repoRoot、读时校验、写时 undefined 删 key),勿新造存储;② 新增过滤维度命令必须沿用 `{ ...getFilter(), <维度> }` 增量式,整替 filter 会静默摧毁其他维度(可 grep `setFilter({` 检查是否带 spread);③ 持久化读写要过脏数据校验纯函数(engine 层),adapter 只做编排;④ 跨 await 的确认回调(QuickPick settle 等)写仓库语境数据前复核 repoRoot 未变——持久化把瞬态竞态升级为跨重启的粘性污染。
- **同类问题影响**:其余 6 个过滤维度已随后续决策按同范式扩展持久化(见处理方式⑤);所有「内存态 + 仓库语境」的视图组件在接入持久化前都存在同样的重启丢失。
3 changes: 2 additions & 1 deletion docs/.agents/knowledge-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,12 @@
- [Claude Code 配置](../docs/features/claude-code-config.md) — Agentic Git 预置:`hyperGit.claudeCode.executablePath` 设置 + `~/.claude/settings.json` 快捷入口(原生设置 + 命令;纯路径逻辑沉淀 `engine/agent/`)。
- [Agentic Git 偏好配置](../docs/features/agentic-git-preferences.md) — Agentic Git 预置:`hyperGit.agent.*` 四项(baseBranch + commit/createPr/review Preferences;多行文本域 + 内置默认模板,Commit 模板中文规约已英译)。
- [多根工作区仓库切换](../docs/features/multi-root-repo-selection.md) — Graph 标题栏切换仓库图标按钮 + `hyperGit.selectRepository` 切换全局活跃仓库:七视图级联跟随、changelist/收藏/Shelf/最近消息按仓库隔离、三重顺序不变量与安全迁移。
- [分支就地更新](../features/branches-update-in-place.md) — Branches 视图不 checkout 更新本地分支:`git fetch <remote> refs/heads/<upstream>:refs/heads/<branch>` 原生 fast-forward-only,右键/多选/标题栏选区感知三入口,五桶对账汇总,引擎排程 + 适配层执行。
- [实施状态总览](../docs/milestones/implementation-status.md) — M0-M5 交付记录 + API 限制 + M5 AI 设计 + 验证/发布(**实施看板**)。
- [工程实施方案](../docs/architecture/engineering-plan.md) — 路径 B 架构 + M0-M5 里程碑(**开发蓝图**)。
- [Git 功能矩阵](../docs/requirements/idea-feature-matrix.md) — 56 功能点 / 8 组(**验收基线**,参考 IDEA 等成熟实现)。
- [调研报告](../docs/research/README.md) — SCM 集成 / 工程蓝图 / 发布 CI / AI 接缝四路循证报告。
- [发布说明](../releases/README.md) — 各正式版 Release Notes(GitHub Release 正文单一事实源;最新 [v0.0.19](../releases/v0.0.19.md))。
- [发布说明](../releases/README.md) — 各正式版 Release Notes(GitHub Release 正文单一事实源;最新 [v0.0.22](../releases/v0.0.22.md))。

## 图资产(docs/assets/)
- [Mermaid 源图索引](../assets/mermaid/README.md) — 全项目 Mermaid 源图统一管理 + **溯源矩阵**(mermaid ↔ archify ↔ 嵌入文档的唯一权威映射)。
Expand Down
3 changes: 2 additions & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@
- [Log 提交详情面板](./features/log-commit-detail-panel.md) — 点击提交行于图右侧打开常驻详情面板(上半 Changed Files、下半提交信息);面板可见性 ⟺ 选中态,替代原悬停浮层。
- [Claude Code 配置](./features/claude-code-config.md) — Agentic Git 预置:Claude Code 可执行路径设置 + `~/.claude/settings.json` 快捷入口(原生设置 + 命令;M5 前置铺垫)。
- [Agentic Git 偏好配置](./features/agentic-git-preferences.md) — Agentic Git 预置:Base Branch + Commit / Create PR / Review 三项 agent 指令偏好(多行文本域 + 内置默认模板;M5 前置铺垫)。
- [分支就地更新](./features/branches-update-in-place.md) — Branches 视图不 checkout 更新本地分支(fetch refspec 原生 fast-forward-only):右键 / 多选批量 / 标题栏选区感知三入口。

## 发布说明
- [Release Notes 目录](./releases/README.md) — 各正式版发布说明(GitHub Release 正文单一事实源);最新:[v0.0.19 Branches 视图 PR 状态徽标 · 取数安全加固 · 开发依赖升级](./releases/v0.0.19.md)。
- [Release Notes 目录](./releases/README.md) — 各正式版发布说明(GitHub Release 正文单一事实源);最新:[v0.0.22 Graph 过滤持久化与激活指示 · Branches 就地更新 · 开发依赖升级](./releases/v0.0.22.md)。

## 调研报告(循证依据)
- [02 · VS Code SCM API 与 vscode.git 集成路径](./research/02-vscode-scm-integration.md) — 路径 B 决策依据、SCM 稳定/proposed API 边界、changelist 模型映射。
Expand Down
Loading
Loading