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
Copy file name to clipboardExpand all lines: feature_list.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -8,7 +8,7 @@
8
8
"description": "Preserve sync behavior while extracting SyncStatusView presentation state/controller boundaries and SyncManager scanner/planner/executor/workspace boundaries with regression and integration coverage.",
9
9
"dependencies": [],
10
10
"status": "in-progress",
11
-
"evidence": "In progress on refactor/sync-domain-pipeline: View 11.5 KB and Manager facade 13.7 KB; UI/domain workspace, planner/scanner/coordinators/executors/FileDiff boundaries covered by 598 passing tests; automated gates green, desktop/mobile manual smoke pending."
11
+
"evidence": "In progress on refactor/sync-domain-pipeline: push, pull, single pull, and move decisions now route through SyncPlanner; View 11.5 KB and Manager facade 13.7 KB; 610 tests and automated gates green, desktop/mobile manual smoke pending."
Copy file name to clipboardExpand all lines: progress.md
+4-2Lines changed: 4 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,8 +4,8 @@ Completed work is archived in [archive/](./archive/), one file per calendar mont
4
4
5
5
## Current State
6
6
7
-
**Last Updated:** 2026-08-19
8
-
**Active Feature:** feat-026 / issue #105 — sync architecture refactor on `refactor/sync-domain-pipeline`. Automated implementation is complete: the actual View is 11.5 KB, the Manager facade is 13.7 KB, UI commands cross `SyncWorkspace`, and scanner/planner/coordinator/executor/diff boundaries have focused and integration coverage. Only real Obsidian desktop/mobile manual verification remains before declaring the feature complete.
7
+
**Last Updated:** 2026-08-20
8
+
**Active Feature:** feat-026 / issue #105 — sync architecture refactor on `refactor/sync-domain-pipeline`. `SyncPlanner`is now the decision source for normal push, batch pull/preview, single pull, and moves. Edited tracked renames with a free destination plan one move instead of being auto-skipped; remote-only changes pull without false conflicts; real two-sided divergence and occupied move destinations remain conflicts. Automated implementation is green; real Obsidian desktop/mobile manual verification remains before declaring the feature complete.
9
9
**Parallel Work:** PR #87 (4x Dependabot security alerts via npm overrides) and Issue #57 (live-credential smoke test).
10
10
11
11
## Outstanding Items
@@ -17,6 +17,8 @@ Completed work is archived in [archive/](./archive/), one file per calendar mont
17
17
18
18
## Latest Evidence
19
19
20
+
- [x] Issue #105 unified sync decisions and move regression (2026-08-20): added operation-aware `SyncPlanner.planFor(push|pull)`, `MoveFacts`, and the `move` domain action. Normal push, batch pull and preview, single pull, and tracked moves now consume planner decisions instead of reimplementing SHA conflict checks. Removed `PushCoordinator.queueMove`'s stale-metadata gate, so an edited tracked rename with a free destination appears under Moves and commits once; occupied destinations remain conflicts. Fixed the complementary pull false positive: a remote-only change now pulls, while real two-sided divergence still resolves as conflict. Content-fetched text/binary paths normalize equal bytes to the provider blob SHA before planning, preserving binary and GitLab legacy-baseline behavior. Added planner operation matrix, coordinator move regression, batch pull, and single pull coverage. Verification: `npx eslint .` — 0 errors; `npm run build` — clean including Obsidian 1.11 compatibility; `npx vitest run` — 54 files / 610 tests; `git diff --check` — clean. Manual Obsidian verification remains.
21
+
20
22
- [x] Issue #105 architecture implementation (2026-08-19): extracted `SyncStatusRenderer` and `SyncStatusComposition`; `SyncStatusView.ts` is 11.5 KB / 251 lines. Extracted `PullCoordinator` and `PushCoordinator`; `SyncManager.ts` is 13.7 KB / 298 lines and retains its public compatibility API. `SyncManagerWorkspace` now owns refresh/tree-snapshot reuse, push/pull, diff, local/remote deletion, move, metadata mutations, provider URLs and UI-safe workspace info; sync-status UI code no longer reaches provider/tree/settings/vault mutation helpers, and `src/logic/**` has no UI imports. Legacy refresh characterization cases now target the extracted service instead of private View delegates; legacy modal tests explicitly inject the Obsidian interaction adapter. Added real refresh integration plus focused push-coordinator/workspace regression tests. Independent verification: `npx eslint .` — 0 errors; `npm run build` — clean including Obsidian 1.11 compatibility; `npx vitest run` — 54 files / 598 tests; `npm run test:e2e -- --provider gitea` — 2 files / 14 tests with container cleanup; `git diff --check` — clean. Desktop/mobile Obsidian smoke remains manual.
21
23
22
24
-[x] Issue #105 architecture slice 3 (2026-08-19): added tested `SyncDiffService` and `SyncStatusNavigator`, so lazy blob loading/cache/content-kind projection is a domain `FileDiff` boundary. Extracted single-file, batch push/pull, local/remote delete, move revert, remote-tree reuse, progress/confirmation, and optimistic-status orchestration into `SyncStatusOperations`; all View row/group events now enter through `SyncStatusController`. The actual View is about 40 KB (down from 58 KB this slice and 80 KB initially). Independent verification: `npx eslint .` — 0 errors; `npm run build` — clean including Obsidian 1.11 compatibility; `npx vitest run` — 52 files / 594 tests; `npm run test:e2e -- --provider gitea` — 2 files / 14 tests with container cleanup; `git diff --check` — clean. Feature remains in progress because renderer composition and the ~50 KB manager facade are still oversized.
The requested architecture refactor and automated regression safety net are implemented. Do not start the VS Code-like source-control redesign on this branch. The only Definition-of-Done item that cannot be executed in this environment is real Obsidian desktop/mobile manual verification.
9
+
Fixed the reported false conflict for a tracked rename whose content was also edited, then audited
10
+
and removed the remaining sync-decision bypasses. Move classification previously returned before
11
+
reaching `SyncPlanner` and used a duplicate `oldEntry.sha === lastSyncedSha` safety check;
12
+
`PushCoordinator`, `PullCoordinator`, and single pull also retained separate SHA predicates after
13
+
the planner extraction.
10
14
11
-
## Implemented Architecture
15
+
Added operation-aware `SyncPlanner.planFor(push|pull)`, `MoveFacts`, and the `move` domain action.
16
+
Normal push, batch pull/preview, single pull, and tracked move now consume planner decisions. A
17
+
free destination produces one move containing current local content; an occupied destination
18
+
remains a conflict. A remote-only change now pulls rather than being mistaken for two-sided
19
+
divergence. Content-fetched text/binary paths normalize equal bytes to the provider blob SHA, so
20
+
binary behavior and GitLab legacy baselines remain compatible.
12
21
13
-
-`src/ui/SyncStatusView.ts` and `src/logic/sync-manager.ts` are thin compatibility entrypoints.
14
-
- Actual `src/ui/sync-status/SyncStatusView.ts` is 11.5 KB / 251 lines and composes state, renderer, controller, navigator, operations and workspace.
15
-
-`SyncStatusViewState` owns presentation state; `SyncStatusSelectors` are pure and table-tested; `SyncStatusRenderer` owns list/tree/group/header rendering.
16
-
- Every row/group/action command enters `SyncStatusController`; `SyncStatusOperations` performs UI notifications/confirmation and calls `SyncWorkspace` for mutations.
17
-
-`SyncManagerWorkspace` owns refresh, remote-tree snapshot validation/reuse, push/pull, `FileDiff`, local/remote deletion, move, metadata mutations, provider URLs and UI-safe workspace info. Sync-status UI code no longer imports provider/tree/settings or vault mutation helpers.
18
-
-`SyncStatusRefreshService` owns discovery, hidden files, path mapping, status classification, out-of-band move reconciliation and live modify/rename transitions.
19
-
- Actual `src/logic/sync/SyncManager.ts` is 13.7 KB / 298 lines, preserves the historical public API, and delegates batch use cases to `PushCoordinator` and `PullCoordinator`.
20
-
- Historical `src/logic/sync-manager.ts` is now a pure domain re-export. `src/logic/**` has no UI imports; production and modal characterization tests inject `ObsidianSyncInteraction` at the composition boundary.
21
-
- Domain components include `SyncScanner`, pure `SyncPlanner`, `SyncMetadataStore`, `PushExecutor`, `PullExecutor`, `RemoteDeleteExecutor`, `ConflictResolver`, `SyncExecutor`, `SyncDiffService`, and the injected `SyncInteractionPort`.
22
-
-`DiffView` consumes only `FileDiff`.
23
-
- New tests cover state/selectors/controller, planner matrix, scanner/metadata, every executor, diff, push coordinator, workspace snapshot behavior, and real Scanner/Manager/Workspace integration paths.
22
+
The clean-code skill drove the TDD sequence: the coordinator regression failed first with the
23
+
file under `skippedConflicts`, then passed after the planner integration. No commit or push was
24
+
performed. The pre-existing untracked `.codex-gitlab.env` remains untouched.
24
25
25
26
## Verification Evidence
26
27
27
28
```text
28
-
npx eslint . -> PASS, 0 errors
29
-
npm run build -> PASS, incl. Obsidian 1.11 compatibility
2. Remote-only → Pull → local file created → synced.
43
-
3. Modified → Diff → Push/Pull.
44
-
4. Conflict → resolve → refresh.
45
-
46
-
Mobile:
47
-
48
-
1. Open sync view → refresh → select one file → Diff → Push.
49
-
2. Remote-only → select file → Pull.
50
-
51
-
After manual confirmation, mark feat-026 complete and archive its active progress entry. Then branch `feat/vscode-source-control-ui` from the updated `main`.
52
-
53
-
## Workspace Safety
54
-
55
-
-`.codex-gitlab.env` is untracked and must remain untouched/uncommitted.
56
-
- Prior detached tracked changes remain preserved in `stash@{0}` with message `pre-refactor preserved tracked changes from detached 1.5.6 checkout`.
57
-
- No commit or push has been made for this refactor workspace.
40
+
Manually verify in Obsidian that moving and editing a tracked file shows it under Moves and that
41
+
Apply creates the new path with edited content while removing the old path. Also verify an
42
+
existing remote destination still appears as a skipped conflict. After the remaining desktop and
43
+
mobile smoke paths pass, feat-026 can be marked complete.
0 commit comments