# Changelog ## 0.2.0 - Feature: **git state on rows and the bottom bar (R40a)** — files that are untracked, modified (unstaged), or staged get a coloured dot right after the name (with a naming tooltip), and a **bottom bar** pinned under the tree shows the branch, ahead/behind, the HEAD commit's short hash, subject, and relative age (full hash, author, and time on hover). **Clicking the bar expands the commit list upward** — the last 20 commits, oldest at the top and the newest at the bottom with a HEAD marker. **Multi-repository workspaces**: when the workspace itself is not a repository but its first/second-level subdirectories are, the bar gains a repository selector, and the picked repository drives the branch/commit info and the per-file dots (the request's `gitRepo` field re-anchors every level). Outside a repository, or without a git executable, nothing renders. The state rides the existing listing route: one bounded `git status --porcelain=v1 -z --branch` (+ `rev-parse`, `git log -1`, and `git log -n 20`) per repository, cached 30 s with in-flight deduplication, a 3 s timeout and a 1 MB output cap; a workspace that is a subdirectory of its repository maps status paths through `--show-prefix`. - Fix: **a selected repository that turns out to be invalid no longer makes the git bar vanish silently.** Discovery validates each candidate with a bounded `git rev-parse`; an unusable repository (for example a `.git` directory missing its HEAD, as seen on a real workspace) is listed in the selector as a disabled option and the bar explains 「不是有效的 Git 仓库」 instead of disappearing. - Docs: the README leads with the six headline capabilities and the INSTALL troubleshooting table / update sections document the artifact `rev` cache layer (why a restart can look like a no-op and the hard-refresh → reinstall ladder). - Investigation recorded (ROADMAP §2.4): the in-box `dsh-workspace-changes` plugin is a per-turn snapshot diff and cannot serve the current work-tree state; its `GitRunner` shape was adopted as the reference. Per-file last-commit tooltips are split out as R40b (deferred). ## 0.1.1 - Fix: **the tree's expansion now survives the preview round trip, like the native tree.** Opening a file preview unmounts the enhanced body, and coming back to the Files tab used to remount it collapsed. Expansion is now remembered per tab in the same module-level memory the scroll offset uses (written through on every change, restored on mount), so preview round trips — and the runtime native-fallback toggle — leave the tree as it was. Still not remembered: the level data itself (a returning level is refetched) and anything across a page reload; the full slot-store migration remains ROADMAP R30. - Docs: the INSTALL troubleshooting table and both READMEs' update sections document the artifact `rev` cache layer — why a restart can look like a no-op (an old-rev request is rejected rather than served fresh bytes) and the hard-refresh → reinstall ladder. - Tests: 66 — the test shim now gives every component instance its own hook state, addressed by the instance's tree position (the shim's stand-in for fibers). That is what makes the expand → unmount → remount flow testable at all: the previous flat hook list could not survive tree-shape changes, which real trees make constantly. ## 0.1.0 - Feature: **runtime toggle between the enhanced tree and the native one (R10)** — the Files tab's actions menu offers 「回退原生文件树」/「启用增强版文件树」: dropping the enhanced definition's registration makes the builtin body resume immediately (extension semantics), and the same entry brings the enhancement back. No uninstall needed. - Feature: **quick filter / locate (R15)** — a header box searches the whole workspace recursively through a new authenticated `POST /api/dsh-at-sider/search` route (skips `node_modules`/`.git`, depth cap 12, 200 results). While the query is non-empty the result list replaces the tree; every result carries an `@` chip, clicking a file opens it and clicking a directory jumps back to the tree expanded at that folder. - Feature: **reveal in file tree (R16)** — file-preview tabs get a 「在文件树中定位」 menu entry that opens the tree with the ancestors expanded and the row scrolled into view and briefly highlighted. - Feature: **@文件 on file previews (R16)** — file-preview tabs also get an 「@文件」 menu entry that inserts the previewed file's `@` reference into the composer in one step — the same chip the tree's `@` button produces. - Feature: **keyboard navigation and tree semantics (R17)** — roving tabindex, ArrowUp/Down to move, ArrowRight/Left to expand/collapse (and out to the parent), Home/End, and `@` on the focused row to insert a reference; `role="tree"`/`treeitem`/`group` with `aria-level` and a polite live region. - Polish: **the reveal highlight now lands on the row itself** and mirrors the keyboard focus ring (2px outline in the label colour). Previously the flash targeted the row's `