perf: batch tmux lookups, parallelize git enrichment, streaming file copy - #9
Merged
Conversation
…copy - Replace per-workspace tmux.IsRunning() subprocess calls with a single ListFr8Sessions() bulk lookup + map check in list, MCP, and TUI commands - Parallelize per-workspace git enrichment (DirtyStatus, LastCommit, IsMerged, AheadBehind, TrackingBranch) in TUI loadWorkspacesCmd - Parallelize runAllGlobalCmd tmux starts with bounded concurrency (5) - Add size check short-circuit to filesEqual before reading content - Replace os.ReadFile/os.WriteFile with streaming io.Copy in filesync - Pre-allocate slice in MCP handleRepoList
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Performance optimizations reducing subprocess calls and enabling parallel I/O across TUI, CLI, and MCP commands.
Why
With 10 workspaces, the TUI dashboard was spawning 60+ serial git subprocesses plus 10 serial
tmux has-sessioncalls. CLI list commands had the same per-workspace tmux overhead. File sync was reading entire files into memory unnecessarily.How
tmux.IsRunning()(N subprocesses) with a singleListFr8Sessions()call + map check incmd/list.go,cmd/mcp_tools.go, andinternal/tui/model.goloadWorkspacesCmdrunAllGlobalCmdcollects start jobs then fans out with semaphore-bounded (5) concurrenttmux.StartcallsfilesEqualnow comparesos.Statsizes before reading content — short-circuits on size mismatchos.ReadFile/os.WriteFilewithos.Open+io.Copyto avoid loading entire files into memoryhandleRepoListpre-allocates with known capacityTest plan
go build ./...go vet ./...go test -race -count=1 ./...bin/cipasses all checks (build, vet, test, lint, tidy)filesEqualsize check,copyFilestreaming, mode preservation, overwrite, and missing source