You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
chore: update harness docs for feat-021/022 (issues #66, #67)
Record feat-021/feat-022 in feature_list.json, archive the prior session's
merged work (feat-018/019/020, PR #71) plus the earlier perf/push-error
follow-ups into archive/2026-07.md, and rewrite progress.md/session-handoff.md
to reflect this session's stopping point.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: archive/2026-07.md
+12Lines changed: 12 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -18,3 +18,15 @@ over — don't let a single archive file grow without bound either.
18
18
- Issue #78: remote-repo root path picker now suggests from the remote tree, delete-remote-only-file silent failures fixed (3 root causes: unencoded path 404s, EISDIR on folder/remote-record collisions, wrong vaultFolder-prefixed path passed to deleteFile), SyncStatusView test coverage added (commits 896d77b, 563a28e merge, fa42fea, f1420f0)
19
19
- feat(ui): persistent connection status badge in the global status bar, plus a theme-contrast follow-up fix (commits 83499c9, 12cce64)
20
20
- feat-013: perf(push): parallelize blob creation within a batch commit — BaseGitService.mapWithConcurrency + BLOB_CREATE_CONCURRENCY=8 for GitHub/Gitea's pushBatch (GitLab unaffected, already single-request) (commit c7ae0f6)
21
+
- perf(push): eliminate redundant GitHub requests (commit 0445b17) and avoid stale rename lookup requests (commit f8a0a26), landed on codex/perf-github-push-260723 — patch-level, shipped as 1.3.1
22
+
- feat-064 (#64): "what's new" entry text moved out of hard-coded strings into `ChangelogEntry.text = { en, 'zh-tw'?, 'zh-cn'? }`; changelog reorganized into per-version folders under `src/changelog/`
23
+
- Push failures reporting a stale-`expectedHeadOid` GraphQL error weren't retried (wording mismatch) and the REST HEAD read was serving a cached oid; `commitOnBranch` now reads HEAD over GraphQL with `Cache-Control: no-cache` — PR #72
24
+
- Console flooded with `Git Service 404` before every push: `refreshFileStatus`'s `getFile` fallback and `detectRename`'s per-file orphan probe both answered from the pre-fetched tree instead
25
+
- Gitignore discovery no longer probes tree-absent candidate paths; `SyncStatusView` shares one tree fetch instead of two per refresh; batch pull decides unchanged/conflict from tree shas instead of downloading every file
26
+
- feat-018 (#70): path search filter in the sync panel — `onOpen()` now builds persistent `headerEl`/`bodyEl` so `renderView()` rebuilding the body doesn't destroy the search input's focus
27
+
- feat-019 (#68): row path is a link to wherever the file lives (vault for local, provider web page for `remote-only`, plain text when neither resolves) — new `src/utils/remote-url.ts`
28
+
- feat-020 (#69): desktop shows diffs in a dedicated `DiffView` pane (container-query side-by-side/unified), mobile keeps the inline panel
29
+
- feat-018/019/020 consolidated onto branch `claude/git-mv-convenience-26f64c` → PR #71, merged to main
30
+
- feat-021 (#66): renames now commit as a real move (add new path + remove old path, one commit) instead of leaving a copy on the remote forever — new `SyncManager.trackRename` (live vault-rename tracking, collapses chained renames, cancels rename-backs) and `GitServiceInterface.commitBatch` (GitHub additions+deletions, GitLab native `action: 'move'`, Gitea tree with a null-sha removal), with two safety checks against silent overwrite/delete; new `moved` FileStatus + filter tab + Revert action (commit aeb1ad0)
31
+
- feat-022 (#67): a fully-moved folder collapses into a single sync-panel row instead of one per file — grouped by matching path segments from the end to find the folder that moved, only when nothing was left behind under the old prefix; pushing the group is one commit via the existing batch flow (commit 1ba1293)
32
+
- feat-021/feat-022 on branch `claude/rename-as-move-66-67`
Copy file name to clipboardExpand all lines: feature_list.json
+16Lines changed: 16 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -161,6 +161,22 @@
161
161
"dependencies": [],
162
162
"status": "done",
163
163
"evidence": "npx eslint . -> 0 errors; npm run build -> clean; npx vitest run -> 395/395 passed. Not yet committed."
164
+
},
165
+
{
166
+
"id": "feat-021",
167
+
"name": "feat(sync): commit renames as a real move with a dedicated moved status (issue #66)",
168
+
"description": "Renaming a file previously pushed a copy to the new path and left the old file on the remote forever. main.ts now tracks vault 'rename' events live via new SyncManager.trackRename, moving syncMetadata to the new path and recording renamedFrom (a chain of renames collapses to one pending move; renaming back to the still-synced path cancels it). handleRename performs a real move - new path added, old path removed, one commit - via new optional GitServiceInterface.commitBatch (GitHub: createCommitOnBranch additions+deletions; GitLab: Commits API action:'move'; Gitea: tree with a fresh blob + null-sha removal), falling back to sequential push-then-delete otherwise. Two safety checks: a target that already exists on the remote is never silently overwritten, and an old path whose remote content moved on since the last sync is never silently deleted. Moves fold into the push-all batch flow (toMove alongside toPush) for one commit per run. UI: new FileStatus 'moved' + movedFrom, classified from syncMetadata alone (no network call), rendered as one row (struck-through old path, Push + Revert actions, excluded from bulk Pull/Delete), with a conditional 'moved' filter tab.",
"name": "feat(ui): collapse folder moves into a single row (issue #67)",
176
+
"description": "Depends on feat-021. Moving a folder previously produced one 'moved' row per file. SyncStatusView now groups 'moved' rows by an (oldPrefix, newPrefix) pair found by matching path segments from the end (the topmost divergence point is the folder that moved), collapsing to one row only when every tracked file under the old prefix actually moved (isPartialMove) and the group has more than one member. New renderMoveGroupItem (FileListItem.ts) shows the new/old prefix, a Push button that routes every member through the existing pushAllFiles batch flow (one commit for the whole group), an expand toggle listing members as read-only sub-rows, and a Revert action. The 'moved' tab count is rows, not files.",
"_evidenceStyle": "Keep evidence to one line: commit hash + short pointer (e.g. 'Commit abc1234 - added X, tests pass'). Debugging narrative and design discussion belong in the commit message, not this file."
0 commit comments