Skip to content

fix(macos): 工作树状态刷新、历史撑满与独立提交面板 - #1579

Merged
xiaoyumuxi merged 3 commits into
previewfrom
codex/fix-worktree-history-and-status
Oct 29, 2026
Merged

xiaoyumuxi merged 3 commits into
previewfrom
codex/fix-worktree-history-and-status

Conversation

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

改动说明

工作树历史与状态刷新

  • 移除提交历史底部常驻的“加载更多”按钮和固定高度页脚,原生列表撑满剩余空间;保留接近视口底部自动分页。
  • 加载指示与失败后的显式重试覆盖在列表底部,不再挤占列表高度;失败暂停自动请求,不循环重试。
  • 主工作区状态刷新同步已选工作树详情;工作树列表刷新时补读已选 checkout 的文件状态,修复路径与 HEAD 未变化时文件状态不更新的问题。
  • 刷新保留已加载历史、分页 cursor 和旧错误场景下的已有行;状态未变化时不重复发布快照,避免重建呈现。

“更改”页布局与交互

  • 收紧顶部路径与分支间距,标题区高度从 60pt 减至 50pt,移除文件区外层 12pt 留白。
  • 复用共享可拖动分隔控件:宽详情列左侧为文件、右侧为提交面板;不足 620pt 时上下排列,并给窄布局保留可见文件行。
  • 左侧复用 ChangeList 管理,支持选择、新建、重命名、删除、分组展开/折叠、分组勾选及右键多文件移动;“全部暂存”只作用于当前列表。
  • 原生文件列表保留选择、多选、复选框、键盘导航、打开文件/Diff、暂存/取消暂存和丢弃确认;分组展开与勾选互不混淆。
  • 右侧复用现有提交说明、AI、Amend、提交及提交后推送的审阅/重试流程,而非新增一套 Git 提交实现。
  • 各工作树草稿在当前工作区会话内独立保留,切换工作树和详情标签不会串草稿;尺寸变化留在分栏局部,不把逐帧状态发布到 Git 模型。

提交范围与生命周期保护

  • 每个工作树复用一个绑定唯一 checkout 根目录的提交模型,不发现或提交同级、嵌套仓库;真实范围、HEAD 和索引仍由共享 Core 校验。
  • 主提交面板与工作树提交互斥,阻止冲突的暂存与列表编辑;缺失、可清理或裸工作树不能从该入口提交。
  • 同一主根的 ChangeList 值与存储故障状态双向同步,linked 根使用独立存储键。
  • 认证、取消、操作日志及模块保活继续由父 Git 模型持有;工作区重置使缓存模型失效,旧编辑器任务不能重新打开旧 checkout。
  • 同步更新所属 Agent Notes 与 git-worktrees 功能矩阵。Windows 当前只有工作树管理弹窗,本 PR 不增加 Windows 对等详情入口,不宣称跨平台运行验收完成。

验证

  • 提交前通过 Swift 6.3.3 定时测试入口运行 Git 模块、工作树原生界面、Git 状态集成、提交工作流、ChangeList 与共享分栏/列表相关测试:274 项测试、22 个 suite 全部通过,测试执行 15.850 秒;每项耗时写入 HTML / JUnit / JSON 报告。
  • 扩展到整个 Git 状态集成 suite 后有 9 项现有集成用例超过 1 秒软警告线,最慢 2.144 秒,均低于 15 秒硬预算,无超时或失败。本次新增真实提交用例 856ms,原生布局用例 231ms,分组交互用例 109ms。
  • 真实 Git → Rust Core 集成验证:提交 linked 工作树后,其改动已提交且干净,主仓库 HEAD 与已暂存文件保持不变。
  • 原生深浅主题覆盖 320/600/700/850pt 布局、分组交互、选择及草稿保留、同轴缩放时原生列表身份不变;历史空闲/加载/失败状态覆盖 120/300/600pt 高度。
  • 服务边界、共享契约、Git graph 与真实 fixture、运行时 bundle 只读、Agent Notes、测试稳定性静态检查全部通过。
  • i18n 校验、生成结果检查和 35 项 i18n 测试全部通过;功能矩阵生成、212 项能力校验及实质能力变更门禁通过;git diff --check 通过。
  • 使用仓库预览脚本完成独立开发 .app 的构建、资源打包、签名与启动,未修改已安装程序包。
./.agents/skills/write-stable-tests/scripts/test-stability-macos.sh \
  --suite-timeout-seconds 900 \
  --report .artifacts/test-stability/worktree-pr.json \
  -- --filter 'GitModuleTests|GitWorktreeAppearanceTests|GitStatusObservationTests|CommitWorkflow|GitChangeSectionsCacheTests|GitLocalChangelistsTests|LitheSplitPane|LitheTreeListTests|LitheTreeRowStyleTests'
./.agents/skills/write-stable-tests/scripts/verify-test-stability.sh
./scripts/architecture/verify-service-boundaries.sh
./scripts/architecture/verify-shared-contracts.sh
./scripts/git-graph/verify-git-graph.sh
./scripts/macos/verify/verify-runtime-bundle-immutability.sh
node scripts/i18n/verify-app-language-localization.mjs
node scripts/i18n/generate-i18n.mjs --check
node --test --test-timeout=60000 scripts/i18n/test-i18n.mjs
./scripts/agent-notes/verify-agent-notes.sh
node scripts/platform-feature-matrix/generate-platform-feature-matrix.mjs
./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh
./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD
git diff --check

验证边界 / Draft 原因

  • 尚未完成打包应用完整工作台中的手动分栏拖动、ChangeList 管理、提交确认及真实远端推送验收;组件和真实本地 Git 测试不替代这些验收。
  • 未执行 Windows 构建或运行测试,本次没有 Windows 实现变更;功能矩阵验证状态保留 pending。
  • 本地使用 Swift 6.3.3,并通过进程级 SDK 设置选择已安装的 macOS 26.5 SDK,未修改仓库工具链配置。
  • 按仓库规则先创建 Draft PR,避免提前占用 macOS / Windows runner;完成剩余人工验收后再标记 Ready。

@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 29, 2026
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review October 29, 2026 10:21
@lithe-code-review

lithe-code-review Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⛔ 有阻塞
范围: preview ← codex/fix-worktree-history-and-status · head: b333bd4

Findings

  1. [P1] 自动刷新需保留嵌套仓库过滤,避免误提交 gitlink
    macos/Sources/LitheGitModule/Application/GitFeatureModel.swift:2727

    • 实际影响:新增自动刷新调用 refreshWorktreeChanges,后者在第 2913 行调用未携带 repositoryRoots 的 service.snapshot,会把主工作区已排除的独立嵌套仓库重新显示为未跟踪目录。新提交模型随后接收这些行,“全部暂存”会执行 git add -A nested/,将独立仓库变成父仓库的 mode-160000 条目;默认 ChangeList 的提交范围校验允许这个条目,单根提交计划也不会生成嵌套仓库关系确认。
    • 触发条件:当前 checkout 内存在未忽略、已有提交的独立嵌套仓库。
    • 复现步骤:打开包含该嵌套仓库的主工作区,选择 Worktrees 中的当前 checkout;刷新工作树列表,在“更改”页执行全部暂存及提交。嵌套目录会以 gitlink 进入父仓库提交,且没有对应的 .gitmodules 配置。
    • 来源:本次加剧。原来的手动状态刷新缺少过滤信息,本次将它扩展到列表自动刷新,并新增直接消费这些状态的提交入口。第 569 行的新模型快照也只传 [root],丢失其他已发现根目录的排除信息。
  2. [P2] 工作树提交互斥需覆盖 Diff 的直接暂存入口
    macos/Sources/LitheGitModule/Application/GitFeatureModel.swift:1746

    • 实际影响:新互斥状态接入了复选框和批量暂存入口,但 stageChange、unstageChange 仍仅检查父模型自身的 isCommitting。工作树提交设置的是 scoped 模型的状态,因此打开的 Diff 仍能通过菜单修改同一索引,导致正在准备的提交因索引变化失败。
    • 触发条件:在 Worktrees 提交当前 checkout,同时保留该 checkout 的文件 Diff。
    • 复现步骤:用受控服务在提交计划已读取后、返回前暂停;通过 RepositoryDiffView.swift:164 的 Unstage 动作取消暂存,再释放准备请求。父模型会实际执行取消暂存,后续提交校验发现索引不匹配。原主提交路径会由 unstageChange 的 isCommitting 检查拒绝该动作。
    • 来源:本次引入。提交状态拆到 scoped 模型后,原有直接暂存入口未接入新增互斥状态。

Scope Check

  • 未找到可验证的关联 Issue;按 PR 描述与实际变更核对。
  • 已覆盖历史分页呈现、状态同步、分栏与 ChangeList、独立草稿、提交编排及重置路径。
  • 嵌套仓库隔离和跨模型暂存互斥尚未完整实现。
  • 复用了现有提交流程、Rust Core 校验及共享控件,未新增 Git 语义实现。
  • 两项 Finding 均属于本次变更引入或加剧的直接影响。

Suggestions

  1. 将状态扫描所需的仓库排除集合与提交绑定集合分开:提交仍绑定唯一根,状态扫描保留嵌套仓库过滤。补充真实嵌套仓库用例,断言刷新、全部暂存及提交均不会创建意外 gitlink。
  2. 让直接文件暂存、取消暂存及相关 Diff 动作统一使用跨模型互斥检查;补充受控提交准备期间的并发回归测试。
  3. 补充受影响界面的前后截图,展示深浅主题及窄宽布局;当前上下文未提供截图,视觉效果尚未验证。

Summary

主要实现沿用现有架构,新增测试覆盖了状态刷新、单根提交和布局边界。合并前应修复嵌套仓库过滤问题;暂存互斥遗漏属于非阻塞修改建议。

Verification

  • 静态检查了 89c3ea9...b333bd4 的完整 19 文件变更,并追踪状态扫描、仓库过滤、暂存、Core 提交范围校验、Diff 调用和模型生命周期。
  • 作者报告 274 项测试及相关架构、i18n、bundle 只读等检查通过;本次未独立复核运行结果。
  • 已提供的 Check Run 中平台 gate 为 success,但 Swift/Rust 测试为 skipped,仍有 queued/cancelled 项,不能视为完整平台测试通过。
  • 本次未运行代码、测试、构建或应用,未访问网络。
  • 完整工作台拖动、提交确认及真实远端推送尚待人工验收;Windows 验证状态保留 pending。

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator Author

已在 511f135 修复本轮两个 finding,更新同一个 PR(未 force push)。

P1:独立嵌套仓库过滤

  • 将状态扫描排除集合与提交绑定集合分开。首次检查、手动状态刷新、列表自动刷新以及 scoped 提交模型刷新,都在所选 checkout 内发现仓库,再交给既有 Core 过滤;工作区之外的 linked checkout 同样适用。
  • scoped 的目录展开也保留排除集合;availableRepositoryRoots 和提交计划仍只绑定所选工作树,不把嵌套仓库加入提交。
  • 新增真实 Git + Rust Core 参数回归,分别覆盖当前 checkout 和外部 linked checkout:检查各类刷新、Worktrees 工具栏全部暂存/取消暂存、scoped 复选框批量暂存和真实提交均不产生意外 mode-160000 条目/.gitmodules,嵌套仓库 HEAD/索引保持不变。

P2:Diff 直接入口互斥

  • stageChange、unstageChange、stageDiffHunk、unstageDiffHunk 均在模型入口检查跨模型 isWorktreeCommitBlocked,不只依赖父模型自己的 isCommitting。
  • 用有界 gate 在计划已读取、prepare 尚未返回时暂停 scoped 提交;确认父 Diff 的文件和区块暂存/取消暂存没有 service 写调用,释放后提交成功且写入口恢复。

验证

先运行新增测试复现两项缺陷,再应用修复验证通过。最终 276 项测试 / 22 个 suite 全部通过;新增并发测试 3ms,真实 Git 两个参数场景合计 3700ms(软耗时警告,无硬预算失败)。

./.agents/skills/write-stable-tests/scripts/test-stability-macos.sh \
  --suite-timeout-seconds 900 \
  --report .artifacts/test-stability/worktree-review.json \
  -- --filter 'GitModuleTests|GitWorktreeAppearanceTests|GitStatusObservationTests|CommitWorkflow|GitChangeSectionsCacheTests|GitLocalChangelistsTests|LitheSplitPane|LitheTreeListTests|LitheTreeRowStyleTests'

本地 test-stability、service boundary、shared contracts、runtime bundle immutability、i18n 校验/生成检查、Agent Notes、能力矩阵生成/校验/change gate、Git graph 和 diff whitespace 检查均通过。同步更新 Note 和 Worktree 能力矩阵,运行时验证状态保持 pending。

限制:本次无新增视觉样式,尚未补齐打包产品前后深浅/窄宽截图;组件测试不代替完整工作台拖动、确认弹窗与真实远端推送验收;Windows 未运行。

另外,更新前 macOS CI gate 红灯来自复用的 Swift job:AgentEditRestorerTests.creationRollbackRestoresALinkReplacedDuringTheTrashOperation 期待 CocoaError,实际抛出 DocumentFileAccessError.symbolicLink。这不属于本轮 Git finding,未夹带修改;新提交 CI 结果另行以 checks 为准。

@xiaoyumuxi
xiaoyumuxi merged commit 0a51c85 into preview Oct 29, 2026
16 of 17 checks passed
1lck added a commit that referenced this pull request Oct 29, 2026
* perf(windows): deliver LSP diagnostics as one batch per Core drain

Each publishDiagnostics event used its own frontend `emit` (a full IPC
round trip broadcast to every window) and its own diagnostics store
update, which copied both maps per file. Importing a large Java project
published hundreds of files at once and the editor stalled behind them.

The adapter now keeps the newest set per URI within one `lsp.waitEvents`
drain and emits a single `lsp://diagnostics` batch, flushing before a
lifecycle change so ordering is kept. The LSP client resolves workspace
state once per batch and applies every file with one store update.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(windows): render large Markdown previews without repeated work

Code-block highlighting replaced each block with `String.replace` over
the whole document, rescanning and copying it once per block: a
document with a thousand fences took about 1.9 s, and code containing
`$&` or `$1` was corrupted by replacement-pattern expansion. The blocks
are now substituted in one pass with a replacer function (about 7 ms).

The preview also swapped in the unhighlighted HTML on every edit and
then the highlighted HTML, rebuilding and laying out the whole preview
twice. It now keeps the current preview until the edited document is
highlighted; only an empty preview shows plain HTML first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(windows): run blocking host commands off the WebView2 UI thread

Tauri runs a synchronous command inline on the thread that dispatches
IPC, which on Windows is the WebView2 UI thread. Commands that read or
write files, walk or delete directories, start processes or register
native watches froze painting and input and queued every other invoke
while they ran: Java language-server launch resolution (fingerprint,
JDT LS and java probes, cache cleanup), toolchain discovery, run
configuration resolution and writes, file reads and writes, clipboard
paste, terminal and Agent creation, plugin rescans and launches, and
document watch registration.

These commands are now async and run their body through a shared
`run_blocking` helper on Tauri's blocking pool. The develop-lithe skill
records the rule together with the batching rule for frequent events.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(windows): move PATH searches and plugin settings I/O off the UI thread

Profiling the Windows build showed `get_tool_path` called thirty times
while a project opens, each searching every PATH directory on the
WebView2 UI thread, and cheap commands such as `plugin:event|listen`
waiting up to 1.4 s behind such work.

`get_tool_path`, the declarative plugin settings, run/test plan and web
file commands, disk-install cancellation and the Agent panel settings
commit now run through `run_blocking` as well.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Merge pull request #1497 from frankxii/windows-optimise-1025

fix(windows): 对齐 Commit 面板与 macOS,并支持隐藏变更列表和父仓库引用选项

* perf(mybatis): index only mapper-named Java files and rebuild on mapper edits

The MyBatis index tree-sitter-parsed every Java file in the workspace, and
both hosts rebuilt it on every Java edit. On ruoyi-vue-pro this ran 11 times
(108 s total, 22 s max) while typing, starving completion requests.

- Core reads mapper XML first and parses only Java files whose stem matches a
  namespace segment (a.b.Outer.Inner names Outer.java).
- Windows and macOS rebuild only when an XML mapper or a Java file already
  paired with a statement changes; newly opened buffers still reload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(markdown): skip layout for off-screen preview blocks

Opening an 86k-line preview spent 26 s in native layout. Top-level text and
code blocks now use content-visibility: auto with an intrinsic size hint;
tables are excluded because paint containment would clip their overflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(markdown): drive preview highlighting with a controlled highlighter

The preview test waited on a real setTimeout, which the test-stability gate
rejects. useHighlightedMarkdown now takes the highlighter as an optional
argument (defaulting to highlightMarkdownCodeBlocks), and the test completes
each highlight itself. It also asserts that the previous highlighted preview
stays visible while an edit is being highlighted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(macos): 工作树状态刷新、历史撑满与独立提交面板 (#1579)

* fix(macos): 改进工作树历史与状态刷新并复用独立提交面板

* fix(macos): preserve worktree status exclusions and diff commit locking

* fix: preserve settings transactions and queued agent lifecycle

* fix(windows): guard background saves, clipboard and terminal ownership

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: 若水 <frankw.wang@qq.com>
Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>
1lck added a commit that referenced this pull request Oct 29, 2026
* fix(ci): align AutoBuild macOS release timeout budgets (#1572)

* fix(macos): 修复硬链接文件打开并提供三种保存选择 (#1419) (#1575)

* fix(macos): support explicit hard-link save choices

Allow regular hard-linked documents to open and require a fresh per-save choice to detach the current path, update shared contents, or cancel. Pause autosave, retain conflict and object-identity guards, and reconcile open aliases after shared writes.

Classify document access failures with actionable localized messages, preserve drafts on cancellation and write failures, and add native/workflow/router regressions with updated decision notes and platform evidence.

Fixes #1419

* fix(macos): continue explicit hard-link saves after autosave checks

* fix(ci): decouple AutoBuild publication from plugin mirrors (#1576)

* Merge pull request #1497 from frankxii/windows-optimise-1025

fix(windows): 对齐 Commit 面板与 macOS,并支持隐藏变更列表和父仓库引用选项

* fix(macos): 工作树状态刷新、历史撑满与独立提交面板 (#1579)

* fix(macos): 改进工作树历史与状态刷新并复用独立提交面板

* fix(macos): preserve worktree status exclusions and diff commit locking

* fix(macos): #1550 缓存 LSP 设置页语言摘要并减少主线程布局 (#1551)

* fix(macos): #1550 缓存 LSP 设置页语言摘要并减少主线程布局

* docs: update LSP cancellation validation script paths

---------

Co-authored-by: Lichenkang <2188718831@qq.com>

* fix(git-host): launch Git through forward-slash paths and report empt… (#1574)

* fix(git-host): launch Git through forward-slash paths and report empty version probes

On some Windows hosts (disk-encryption or endpoint-security filters), a Git
started through a backslash path prints nothing to a captured pipe, while the
same executable started through a forward-slash path behaves normally. The
version probe therefore returned an empty string, which validate_version
reported as "Git 2.31 or newer is required" even for Git 2.48.1, leaving every
repository unreadable regardless of the selected executable.

- Normalize the resolved executable path to forward slashes on Windows, keeping
  UNC and verbatim paths untouched.
- Treat a successful but empty version probe as a probe failure with its own
  message instead of a too-old Git, and do not cache it.
- Cover the path normalization with a unit test.

Refs #1566

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* test(git-host): cover Windows executable resolution with forward slashes

Add a Windows-only test that executable() returns the selected path with
forward slashes, so the launch-path normalization cannot be dropped silently.
The test fails when the normalization is removed.

Refs #1566

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>

* perf(windows): 消除 Windows 端 UI 卡顿与补全卡死的根因 (#1577)

* perf(windows): deliver LSP diagnostics as one batch per Core drain

Each publishDiagnostics event used its own frontend `emit` (a full IPC
round trip broadcast to every window) and its own diagnostics store
update, which copied both maps per file. Importing a large Java project
published hundreds of files at once and the editor stalled behind them.

The adapter now keeps the newest set per URI within one `lsp.waitEvents`
drain and emits a single `lsp://diagnostics` batch, flushing before a
lifecycle change so ordering is kept. The LSP client resolves workspace
state once per batch and applies every file with one store update.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(windows): render large Markdown previews without repeated work

Code-block highlighting replaced each block with `String.replace` over
the whole document, rescanning and copying it once per block: a
document with a thousand fences took about 1.9 s, and code containing
`$&` or `$1` was corrupted by replacement-pattern expansion. The blocks
are now substituted in one pass with a replacer function (about 7 ms).

The preview also swapped in the unhighlighted HTML on every edit and
then the highlighted HTML, rebuilding and laying out the whole preview
twice. It now keeps the current preview until the edited document is
highlighted; only an empty preview shows plain HTML first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(windows): run blocking host commands off the WebView2 UI thread

Tauri runs a synchronous command inline on the thread that dispatches
IPC, which on Windows is the WebView2 UI thread. Commands that read or
write files, walk or delete directories, start processes or register
native watches froze painting and input and queued every other invoke
while they ran: Java language-server launch resolution (fingerprint,
JDT LS and java probes, cache cleanup), toolchain discovery, run
configuration resolution and writes, file reads and writes, clipboard
paste, terminal and Agent creation, plugin rescans and launches, and
document watch registration.

These commands are now async and run their body through a shared
`run_blocking` helper on Tauri's blocking pool. The develop-lithe skill
records the rule together with the batching rule for frequent events.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(windows): move PATH searches and plugin settings I/O off the UI thread

Profiling the Windows build showed `get_tool_path` called thirty times
while a project opens, each searching every PATH directory on the
WebView2 UI thread, and cheap commands such as `plugin:event|listen`
waiting up to 1.4 s behind such work.

`get_tool_path`, the declarative plugin settings, run/test plan and web
file commands, disk-install cancellation and the Agent panel settings
commit now run through `run_blocking` as well.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Merge pull request #1497 from frankxii/windows-optimise-1025

fix(windows): 对齐 Commit 面板与 macOS,并支持隐藏变更列表和父仓库引用选项

* perf(mybatis): index only mapper-named Java files and rebuild on mapper edits

The MyBatis index tree-sitter-parsed every Java file in the workspace, and
both hosts rebuilt it on every Java edit. On ruoyi-vue-pro this ran 11 times
(108 s total, 22 s max) while typing, starving completion requests.

- Core reads mapper XML first and parses only Java files whose stem matches a
  namespace segment (a.b.Outer.Inner names Outer.java).
- Windows and macOS rebuild only when an XML mapper or a Java file already
  paired with a statement changes; newly opened buffers still reload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(markdown): skip layout for off-screen preview blocks

Opening an 86k-line preview spent 26 s in native layout. Top-level text and
code blocks now use content-visibility: auto with an intrinsic size hint;
tables are excluded because paint containment would clip their overflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(markdown): drive preview highlighting with a controlled highlighter

The preview test waited on a real setTimeout, which the test-stability gate
rejects. useHighlightedMarkdown now takes the highlighter as an optional
argument (defaulting to highlightMarkdownCodeBlocks), and the test completes
each highlight itself. It also asserts that the previous highlighted preview
stays visible while an edit is being highlighted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(macos): 工作树状态刷新、历史撑满与独立提交面板 (#1579)

* fix(macos): 改进工作树历史与状态刷新并复用独立提交面板

* fix(macos): preserve worktree status exclusions and diff commit locking

* fix: preserve settings transactions and queued agent lifecycle

* fix(windows): guard background saves, clipboard and terminal ownership

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: 若水 <frankw.wang@qq.com>
Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>

* docs: 添加 APINEBULA、TIMI CC 和 Zeus 赞助商 (#1583)

* docs: add APINEBULA as the third sponsor banner

* docs: add TIMI CC and Zeus to sponsor tables

* docs: move Zeus below CCSub and shorten sponsor copy

* test(macos): expect the typed symlink error in agent edit rollback (#1582)

#1575 made document reads open with O_NOFOLLOW and report a symlink as
DocumentFileAccessError.symbolicLink instead of a CocoaError. The rollback
test that swaps the created file for a symlink during the trash operation
still expected CocoaError, so Swift tests failed on preview. The test now
expects the typed error; its checks that the link and its target are left
untouched and the recovered copy is removed are unchanged.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* docs: refresh README product screenshots (#1585)

* docs: lead README gallery with IDE workflows (#1587)

* docs: remove IDEA comparison annotations from README screenshots (#1588)

* docs: 调整 README 徽章并修正发行版链接 (#1589)

* docs: center trending badge in README

* docs: point release links to current repository

---------

Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>
Co-authored-by: 若水 <frankw.wang@qq.com>
Co-authored-by: lincoco <77844710+lin-coco@users.noreply.github.com>
Co-authored-by: AACS111 <103710223+AACS111@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: medium ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant