# Git Sync Refactor Phase 4 Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Stop exposing credential-bearing Git URLs, make large project lists searchable, and give repository synchronization one structured async state owner. **Architecture:** Convert raw remote URLs to safe display values before they enter table rows. Add a filtered view over immutable project presentation rows. Wrap the existing blocking synchronization API behind a use case that translates callbacks into immutable progress and result records consumed by `AsyncOperationController`. **Tech Stack:** Java 17, JavaFX, JUnit 5, Maven. ## Global Constraints - Preserve Git command behavior and damaged-repository confirmation flow. - Never display username, password, or token-bearing URL text in the project table. - Do not add raw `new Thread` to `GitSyncWindow`. - Do not execute synchronization during UI verification. - Test first for every new production behavior. --- ### Task 1: Remote URL safe display **Files:** - Create: `src/main/java/com/example/workutils/biz/git/presentation/RemoteUrlDisplay.java` - Test: `src/test/java/com/example/workutils/biz/git/presentation/RemoteUrlDisplayTest.java` - Modify: `src/main/java/com/example/workutils/biz/git/GitSyncWindow.java` **Interfaces:** - Produces `RemoteUrlDisplay.safe(String rawUrl)`. - HTTPS credentials and SSH usernames are removed; host and repository path remain. - [ ] Test HTTPS credentials, SSH SCP syntax, plain host/path, and blank values. - [ ] Observe focused test failure. - [ ] Implement safe display. - [ ] Store only safe text in `ProjectRow`. - [ ] Confirm focused test passes. ### Task 2: Project search and status filter **Files:** - Create: `src/main/java/com/example/workutils/biz/git/presentation/ProjectFilter.java` - Test: `src/test/java/com/example/workutils/biz/git/presentation/ProjectFilterTest.java` - Modify: `src/main/java/com/example/workutils/biz/git/GitSyncWindow.java` **Interfaces:** - Produces pure `matches(name, path, status, query, requiredStatus)`. - [ ] Test case-insensitive name/path matching and status filtering. - [ ] Observe focused test failure. - [ ] Add search field, status combo, filtered list, and visible count. - [ ] Confirm focused test passes. ### Task 3: Structured synchronization use case **Files:** - Create: `src/main/java/com/example/workutils/biz/git/application/GitSyncRequest.java` - Create: `src/main/java/com/example/workutils/biz/git/application/GitSyncProgress.java` - Create: `src/main/java/com/example/workutils/biz/git/application/RunGitSyncUseCase.java` - Test: `src/test/java/com/example/workutils/biz/git/application/RunGitSyncUseCaseTest.java` **Interfaces:** - Consumes `Gateway.sync(branch, Listener)`. - Produces immutable `Result(total, success, damaged, failed, elapsedSeconds, damagedRepos)`. - Reports progress through `OperationContext`. - [ ] Test request validation, progress translation, result construction, and missing completion failure. - [ ] Observe focused test failure. - [ ] Implement request, progress, gateway, listener, and result. - [ ] Confirm focused test passes. ### Task 4: Migrate main sync action **Files:** - Modify: `src/main/java/com/example/workutils/biz/git/GitSyncWindow.java` **Interfaces:** - Consumes `AsyncOperationController`. - Uses `LoadingButtonBinder` and `OperationStatusPane`. - [ ] Replace manual button/progress state and window-level worker thread. - [ ] Keep cancellation wired to both operation state and `plugin.cancelSync()`. - [ ] Render structured completion summary and damaged rows. - [ ] Confirm `GitSyncWindow` has no `new Thread` in synchronization flow. ### Task 5: Verification - [ ] Run all tests and JDK 17 compilation. - [ ] Run `git diff --check`. - [ ] Inspect project list search/filter, masked remote values, and idle sync state. - [ ] Do not start synchronization or damaged-repository actions.