Skip to content

fix: stabilize workspace tabs and worktree status updates#21

Merged
liam-russell merged 12 commits intomainfrom
Fixes
May 8, 2026
Merged

fix: stabilize workspace tabs and worktree status updates#21
liam-russell merged 12 commits intomainfrom
Fixes

Conversation

@liam-russell
Copy link
Copy Markdown
Contributor

Summary

This PR fixes three workspace regressions around worktree deletion, no-worktree Changes behavior, and tab rendering.

  • prevent transient changed-file badge flashes while deleting a worktree by ignoring delete-target watcher refreshes and clearing removed cached counts immediately
  • keep History available without managed worktrees while disabling Changes in that state
  • ensure terminal view does not render under the commit graph by making graph rendering strictly History-tab scoped
  • align E2E expectation for workspace-scope tabs before managed worktree creation

Validation

  • targeted Playwright spec:

sprout-git@0.1.0 test:e2e /Users/liam/Projects/sproutgit/worktrees/fixes
playwright test -c e2e/playwright.config.ts -- e2e/specs/daily-workflow.spec.ts --grep 'shows terminal tab at workspace scope before any managed worktree exists'

sprout-git@0.1.0 test:e2e:build /Users/liam/Projects/sproutgit/worktrees/fixes
pnpm tauri build --config src-tauri/tauri.e2e.conf.json --no-bundle --features e2e-testing

sprout-git@0.1.0 tauri /Users/liam/Projects/sproutgit/worktrees/fixes
tauri build --config src-tauri/tauri.e2e.conf.json --no-bundle --features e2e-testing

sprout-git@0.1.0 build /Users/liam/Projects/sproutgit/worktrees/fixes
svelte-kit sync && vite build

vite v8.0.10 building ssr environment for production...
�[2K
transforming...✓ 3806 modules transformed.
rendering chunks...
vite v8.0.10 building client environment for production...
�[2K
transforming...✓ 3850 modules transformed.
rendering chunks...
computing gzip size...
.svelte-kit/output/client/_app/version.json 0.02 kB │ gzip: 0.04 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-vietnamese-400-normal.Cg2kxhWu.woff2 4.09 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-vietnamese-700-normal.DMty7AZE.woff2 4.20 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-vietnamese-700-normal.CV6qDkkj.woff2 4.26 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-vietnamese-500-normal.DiU8zqi-.woff2 4.28 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-vietnamese-400-normal.B7xT_GF5.woff2 4.29 kB
.svelte-kit/output/client/app/immutable/assets/space-grotesk-vietnamese-500-normal.BmEvtly.woff2 4.32 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-symbols2-500-normal.DwsgbIjQ.woff 5.36 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-greek-ext-400-normal.DR7mBgIM.woff2 5.36 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-symbols2-400-normal._QEZCEwe.woff 5.37 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-greek-ext-500-normal.BO3iq16n.woff2 5.45 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-vietnamese-700-normal.Duxec5Rn.woff 5.58 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-vietnamese-400-normal.B8TCSmUq.woff 5.59 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-vietnamese-500-normal.BTqKIpxg.woff 5.71 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-vietnamese-400-normal.BIWiOVfw.woff 5.72 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-vietnamese-700-normal.BCh_uG_5.woff 5.77 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-vietnamese-500-normal.CvE5C8T-.woff 5.78 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-cyrillic-400-normal.UC0NFL4U.woff2 6.67 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-cyrillic-500-normal.CX35h3Mg.woff2 6.68 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-greek-ext-400-normal.DSPUheWg.woff 7.22 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-greek-ext-500-normal.CMiNLXER.woff 7.28 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-greek-500-normal.CVO0IRNt.woff2 7.81 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-greek-400-normal.B2Gh_Y8s.woff2 7.83 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-latin-ext-500-normal.Crd9e_oI.woff2 7.84 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-latin-ext-400-normal.KSMg0QLl.woff2 7.86 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-cyrillic-400-normal.dc1q3VD7.woff 8.45 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-cyrillic-500-normal.Bu7VCL72.woff 8.47 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-greek-400-normal.DobhaxvF.woff 9.99 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-greek-500-normal.DEXIWiey.woff 9.99 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-ext-400-normal.D127hM_v.woff2 10.59 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-latin-ext-400-normal.DG73JjOf.woff 10.61 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-latin-ext-500-normal.CaANqXjI.woff 10.65 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-ext-500-normal.9VZagAe1.woff2 10.86 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-ext-700-normal.BajbvANd.woff2 11.00 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-400-normal.Dhut76fR.woff2 11.81 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-cyrillic-ext-400-normal.txZ9Fk_1.woff2 11.96 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-ext-700-normal.BQnZhY3m.woff2 11.99 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-cyrillic-ext-500-normal.CYRspHgm.woff2 12.00 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-700-normal.CfpNZvy6.woff2 12.24 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-ext-400-normal.CfP_5XZW.woff2 12.25 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-ext-500-normal.DUe3BAxM.woff2 12.27 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-500-normal.Bf-nb4oT.woff2 12.31 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-700-normal.RjhwGPKo.woff2 12.84 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-500-normal.lFbtlQH6.woff2 13.31 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-400-normal.CJ-V5oYT.woff2 13.38 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-cyrillic-ext-400-normal.Buh61xzB.woff 15.10 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-cyrillic-ext-500-normal.CwtLmSFD.woff 15.10 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-ext-400-normal.2ppkqaOR.woff 15.31 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-ext-700-normal.8-d-IyIQ.woff 15.61 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-ext-500-normal.CqEEAICU.woff 15.62 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-400-normal.BDKaGhyp.woff 15.72 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-500-normal.DYtqi0QS.woff 16.12 kB
.svelte-kit/output/client/_app/immutable/assets/plus-jakarta-sans-latin-700-normal.DqEcQeE5.woff 16.13 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-700-normal.CwsQ-cCU.woff 16.41 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-ext-700-normal.HVCqSBdx.woff 16.46 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-ext-400-normal.DRPE3kg4.woff 16.78 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-ext-500-normal.3dgZTiw9.woff 16.78 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-500-normal.CNSSEhBt.woff 16.98 kB
.svelte-kit/output/client/_app/immutable/assets/space-grotesk-latin-400-normal.BnQMeOim.woff 17.00 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-latin-400-normal.DGosTW8U.woff2 23.31 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-latin-500-normal.B6gioGu8.woff2 23.31 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-latin-500-normal.aMLC2AMm.woff 29.83 kB
.svelte-kit/output/client/_app/immutable/assets/fira-code-latin-400-normal.C-QZfXAs.woff 29.83 kB
.svelte-kit/output/client/.vite/manifest.json 36.74 kB │ gzip: 2.89 kB
.svelte-kit/output/client/_app/immutable/assets/UpdateBadge.CYVmOCOS.css 0.06 kB │ gzip: 0.08 kB
.svelte-kit/output/client/_app/immutable/assets/4.BrP-ENHg.css 3.93 kB │ gzip: 1.01 kB
.svelte-kit/output/client/_app/immutable/assets/0.CBdeGM4j.css 89.23 kB │ gzip: 25.74 kB
.svelte-kit/output/client/_app/immutable/chunks/D1hYfEew.js 0.06 kB │ gzip: 0.08 kB
.svelte-kit/output/client/_app/immutable/entry/start.DQRX5yM3.js 0.08 kB │ gzip: 0.09 kB
.svelte-kit/output/client/_app/immutable/chunks/BKU1Z8oa.js 0.10 kB │ gzip: 0.12 kB
.svelte-kit/output/client/_app/immutable/chunks/DZqv_dC7.js 0.23 kB │ gzip: 0.20 kB
.svelte-kit/output/client/_app/immutable/chunks/CFhxshun.js 0.27 kB │ gzip: 0.19 kB
.svelte-kit/output/client/_app/immutable/chunks/Gi20Rd3C.js 0.48 kB │ gzip: 0.34 kB
.svelte-kit/output/client/_app/immutable/nodes/1.Bnhx2U0m.js 0.54 kB │ gzip: 0.36 kB
.svelte-kit/output/client/_app/immutable/chunks/CdmGSNqM.js 0.57 kB │ gzip: 0.35 kB
.svelte-kit/output/client/_app/immutable/chunks/ARvTIDYN.js 0.69 kB │ gzip: 0.42 kB
.svelte-kit/output/client/_app/immutable/chunks/CnFzBFvx.js 1.01 kB │ gzip: 0.49 kB
.svelte-kit/output/client/_app/immutable/chunks/CXAW0ldX.js 1.21 kB │ gzip: 0.50 kB
.svelte-kit/output/client/_app/immutable/chunks/DVi4YMIG.js 1.30 kB │ gzip: 0.61 kB
.svelte-kit/output/client/_app/immutable/chunks/IiNz5THe.js 1.87 kB │ gzip: 0.79 kB
.svelte-kit/output/client/_app/immutable/chunks/Be5pNONu.js 2.38 kB │ gzip: 1.16 kB
.svelte-kit/output/client/_app/immutable/entry/app.Bc6lEgZD.js 3.36 kB │ gzip: 1.47 kB
.svelte-kit/output/client/_app/immutable/chunks/BAniY7mZ.js 4.99 kB │ gzip: 2.04 kB
.svelte-kit/output/client/_app/immutable/nodes/0.CI53D-y0.js 5.23 kB │ gzip: 2.35 kB
.svelte-kit/output/client/_app/immutable/chunks/BHgRwiBj.js 5.50 kB │ gzip: 2.60 kB
.svelte-kit/output/client/_app/immutable/chunks/DgXlYFrw.js 6.68 kB │ gzip: 2.82 kB
.svelte-kit/output/client/_app/immutable/chunks/BaA4BHMv.js 13.17 kB │ gzip: 3.20 kB
.svelte-kit/output/client/_app/immutable/chunks/B3htG9fg.js 26.24 kB │ gzip: 10.21 kB
.svelte-kit/output/client/_app/immutable/nodes/3.Psb5xMDf.js 27.48 kB │ gzip: 7.77 kB
.svelte-kit/output/client/_app/immutable/nodes/2.D8-UKiMR.js 32.61 kB │ gzip: 8.69 kB
.svelte-kit/output/client/_app/immutable/chunks/T7YVBIGk.js 59.10 kB │ gzip: 22.66 kB
.svelte-kit/output/client/_app/immutable/nodes/4.BvOUc-IU.js 220.10 kB │ gzip: 65.67 kB
.svelte-kit/output/client/_app/immutable/chunks/DX3O5aBN.js 340.34 kB │ gzip: 86.29 kB

✓ built in 1.92s
computing gzip size...
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-vietnamese-400-normal.Cg2kxhWu.woff2 4.09 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-vietnamese-700-normal.DMty7AZE.woff2 4.20 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-vietnamese-700-normal.CV6qDkkj.woff2 4.26 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-vietnamese-500-normal.DiU8zqi-.woff2 4.28 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-vietnamese-400-normal.B7xT_GF5.woff2 4.29 kB
.svelte-kit/output/server/app/immutable/assets/space-grotesk-vietnamese-500-normal.BmEvtly.woff2 4.32 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-symbols2-500-normal.DwsgbIjQ.woff 5.36 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-greek-ext-400-normal.DR7mBgIM.woff2 5.36 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-symbols2-400-normal._QEZCEwe.woff 5.37 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-greek-ext-500-normal.BO3iq16n.woff2 5.45 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-vietnamese-700-normal.Duxec5Rn.woff 5.58 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-vietnamese-400-normal.B8TCSmUq.woff 5.59 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-vietnamese-500-normal.BTqKIpxg.woff 5.71 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-vietnamese-400-normal.BIWiOVfw.woff 5.72 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-vietnamese-700-normal.BCh_uG_5.woff 5.77 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-vietnamese-500-normal.CvE5C8T-.woff 5.78 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-cyrillic-400-normal.UC0NFL4U.woff2 6.67 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-cyrillic-500-normal.CX35h3Mg.woff2 6.68 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-greek-ext-400-normal.DSPUheWg.woff 7.22 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-greek-ext-500-normal.CMiNLXER.woff 7.28 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-greek-500-normal.CVO0IRNt.woff2 7.81 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-greek-400-normal.B2Gh_Y8s.woff2 7.83 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-latin-ext-500-normal.Crd9e_oI.woff2 7.84 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-latin-ext-400-normal.KSMg0QLl.woff2 7.86 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-cyrillic-400-normal.dc1q3VD7.woff 8.45 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-cyrillic-500-normal.Bu7VCL72.woff 8.47 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-greek-400-normal.DobhaxvF.woff 9.99 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-greek-500-normal.DEXIWiey.woff 9.99 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-ext-400-normal.D127hM_v.woff2 10.59 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-latin-ext-400-normal.DG73JjOf.woff 10.61 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-latin-ext-500-normal.CaANqXjI.woff 10.65 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-ext-500-normal.9VZagAe1.woff2 10.86 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-ext-700-normal.BajbvANd.woff2 11.00 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-400-normal.Dhut76fR.woff2 11.81 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-cyrillic-ext-400-normal.txZ9Fk_1.woff2 11.96 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-ext-700-normal.BQnZhY3m.woff2 11.99 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-cyrillic-ext-500-normal.CYRspHgm.woff2 12.00 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-700-normal.CfpNZvy6.woff2 12.24 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-ext-400-normal.CfP_5XZW.woff2 12.25 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-ext-500-normal.DUe3BAxM.woff2 12.27 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-500-normal.Bf-nb4oT.woff2 12.31 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-700-normal.RjhwGPKo.woff2 12.84 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-500-normal.lFbtlQH6.woff2 13.31 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-400-normal.CJ-V5oYT.woff2 13.38 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-cyrillic-ext-400-normal.Buh61xzB.woff 15.10 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-cyrillic-ext-500-normal.CwtLmSFD.woff 15.10 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-ext-400-normal.2ppkqaOR.woff 15.31 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-ext-700-normal.8-d-IyIQ.woff 15.61 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-ext-500-normal.CqEEAICU.woff 15.62 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-400-normal.BDKaGhyp.woff 15.72 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-500-normal.DYtqi0QS.woff 16.12 kB
.svelte-kit/output/server/_app/immutable/assets/plus-jakarta-sans-latin-700-normal.DqEcQeE5.woff 16.13 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-700-normal.CwsQ-cCU.woff 16.41 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-ext-700-normal.HVCqSBdx.woff 16.46 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-ext-400-normal.DRPE3kg4.woff 16.78 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-ext-500-normal.3dgZTiw9.woff 16.78 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-500-normal.CNSSEhBt.woff 16.98 kB
.svelte-kit/output/server/_app/immutable/assets/space-grotesk-latin-400-normal.BnQMeOim.woff 17.00 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-latin-400-normal.DGosTW8U.woff2 23.31 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-latin-500-normal.B6gioGu8.woff2 23.31 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-latin-500-normal.aMLC2AMm.woff 29.83 kB
.svelte-kit/output/server/_app/immutable/assets/fira-code-latin-400-normal.C-QZfXAs.woff 29.83 kB
.svelte-kit/output/server/.vite/manifest.json 33.42 kB │ gzip: 2.37 kB
.svelte-kit/output/server/_app/immutable/assets/UpdateBadge.CYVmOCOS.css 0.06 kB │ gzip: 0.08 kB
.svelte-kit/output/server/_app/immutable/assets/_page.BmfB5bmM.css 3.52 kB │ gzip: 0.96 kB
.svelte-kit/output/server/_app/immutable/assets/_layout.Dta3sihx.css 88.82 kB │ gzip: 25.66 kB
.svelte-kit/output/server/entries/pages/_layout.ts.js 0.07 kB │ gzip: 0.09 kB
.svelte-kit/output/server/entries/pages/_error.svelte.js 0.40 kB │ gzip: 0.27 kB
.svelte-kit/output/server/internal.js 0.41 kB │ gzip: 0.20 kB
.svelte-kit/output/server/chunks/git-branch.js 1.74 kB │ gzip: 1.02 kB
.svelte-kit/output/server/chunks/Autocomplete.js 4.41 kB │ gzip: 2.10 kB
.svelte-kit/output/server/entries/pages/_layout.svelte.js 4.77 kB │ gzip: 1.95 kB
.svelte-kit/output/server/chunks/sproutgit.js 5.24 kB │ gzip: 1.88 kB
.svelte-kit/output/server/chunks/exports.js 12.23 kB │ gzip: 3.62 kB
.svelte-kit/output/server/chunks/UpdateBadge.js 15.97 kB │ gzip: 4.02 kB
.svelte-kit/output/server/entries/pages/_page.svelte.js 22.93 kB │ gzip: 5.66 kB
.svelte-kit/output/server/chunks/internal.js 23.84 kB │ gzip: 7.39 kB
.svelte-kit/output/server/chunks/shared.js 24.31 kB │ gzip: 6.52 kB
.svelte-kit/output/server/entries/pages/settings/_page.svelte.js 26.80 kB │ gzip: 6.25 kB
.svelte-kit/output/server/chunks/utils.js 30.36 kB │ gzip: 8.67 kB
.svelte-kit/output/server/remote-entry.js 46.83 kB │ gzip: 9.58 kB
.svelte-kit/output/server/chunks/navigation.js 49.77 kB │ gzip: 14.59 kB
.svelte-kit/output/server/index.js 138.62 kB │ gzip: 35.32 kB
.svelte-kit/output/server/entries/pages/workspace/_page.svelte.js 147.43 kB │ gzip: 31.98 kB
.svelte-kit/output/server/chunks/environment.js 150.00 kB │ gzip: 38.90 kB

✓ built in 4.29s

Run npm run preview to preview your production build locally.

Using @sveltejs/adapter-static
Wrote site to "build"
✔ done

Running 7 tests using 1 worker

✓ 1 e2e/specs/daily-workflow.spec.ts:213:3 › Daily developer workflow › sets up two feature worktrees from a fresh repo (2.3s)
✓ 2 e2e/specs/daily-workflow.spec.ts:272:3 › Daily developer workflow › creates a worktree from release branch without inheriting upstream (1.1s)
✓ 3 e2e/specs/daily-workflow.spec.ts:311:3 › Daily developer workflow › commits changes on each worktree without affecting the other (2.3s)
✓ 4 e2e/specs/daily-workflow.spec.ts:444:3 › Daily developer workflow › deletes a merged bugfix worktree and leaves the ongoing feature intact (7.1s)
✓ 5 e2e/specs/daily-workflow.spec.ts:535:3 › Daily developer workflow › runs an after-create hook and records the run in sqlite (1.1s)
✓ 6 e2e/specs/daily-workflow.spec.ts:607:3 › Daily developer workflow › shows terminal tab at workspace scope before any managed worktree exists (990ms)
✓ 7 e2e/specs/daily-workflow.spec.ts:645:3 › Daily developer workflow › runs multiple terminal hooks after create and opens named terminal sessions (1.3s)

7 passed (1.6m)

To open last HTML report run:
�[36m�[39m
�[36m pnpm exec playwright show-report test-results/playwright-report�[39m
�[36m�[39m

  • editor diagnostics: no errors in touched files

Release Notes

This release fixes workspace tab behavior so terminal and history views stay consistent, and removes misleading temporary change counts when deleting worktrees.

  • Deleting a worktree no longer briefly flashes stale changed-file counts for removed entries
  • The History view remains available when no managed worktrees exist, while the Changes view is correctly disabled
  • Terminal no longer appears beneath the commit graph due to incorrect tab fallback rendering

Copilot AI review requested due to automatic review settings May 8, 2026 01:16
@liam-russell liam-russell added the bug Something isn't working label May 8, 2026
@liam-russell liam-russell self-assigned this May 8, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR addresses several workspace UX regressions by tightening tab gating/rendering rules, stabilizing worktree-status badge updates during deletion, and keeping History/graph data fresh when Git refs change outside the app’s direct operations (e.g. from terminal actions).

Changes:

  • Add a git-refs-changed watcher event and wire the workspace page to refresh graph/refs when refs change externally.
  • Disable the Changes tab when no managed worktree is selected, while keeping History and Terminal available at workspace scope.
  • Reduce transient/stale Changes badge/status flashes during worktree deletion by ignoring delete-target watcher refreshes and clearing cached counts immediately.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
tests/worktree-create-sort.test.ts Adds unit coverage around ref ranking / preferred source ref selection used for worktree creation.
src/routes/workspace/+page.svelte Tab gating/rendering fixes; deletion-time status stabilization; refresh workspace data on git refs change; default remote branch preference for create-source selection.
src/lib/sproutgit.ts Extends RefsResult with defaultRemoteBranch and adds onGitRefsChanged event listener wrapper.
src/lib/components/TerminalContainer.svelte Tweaks auto-spawn behavior to avoid creating a blank default terminal session when a hook launch request exists at mount time.
src-tauri/src/watcher.rs Detects .git ref/HEAD-related changes and emits a new git-refs-changed event; adds unit tests for path matching.
src-tauri/src/git/operations.rs Adds discovery of default remote branch via git symbolic-ref and returns it in RefsResult.
src-tauri/src/git/helpers.rs Registers new GitAction::SymbolicRef (test-only ALL list + label mapping).
e2e/specs/daily-workflow.spec.ts Updates workspace-scope tab expectations and relaxes terminal panel count assertion.

Comment thread src/lib/components/TerminalContainer.svelte Outdated
Comment thread e2e/specs/daily-workflow.spec.ts Outdated
Comment thread src/routes/workspace/+page.svelte
Comment thread src-tauri/src/git/operations.rs Outdated
Comment thread tests/worktree-create-sort.test.ts Outdated
…igate Windows handle-release latency

On Windows CI, background threads (wait-threads for non-interactive hook terminals,
stream readers) can hold file handles for 50-500ms after process termination. This causes
EBUSY failures when the fixture's post-test cleanup tries to delete test directories.

Changes:
- E2E fixture cleanup: Add 500ms grace period after process shutdown to allow all
  background threads to naturally exit and release file handles
- Terminal manager: Track non-interactive terminals (spawned via std::process::Command)
  in a separate set, and ensure wait-threads remove them from tracking when done
- This approach relies on OS-level handle release + explicit thread synchronization
  rather than trying to forcibly kill child processes owned by wait-thread closures

This complements the architectural fix from commit a7786dd (reset-before-launch) and
should eliminate the remaining EBUSY failures on Windows CI.
…indows

Increase handle-release latency tolerance:
- Fixture cleanup grace period: 500ms → 2000ms
  - Allows background threads (wait-threads, stream readers) more time to
    cleanly exit and release file handles after process termination
- resetTestDirs pre-cleanup delay: +200ms on Windows only
  - Additional buffer before cleanup attempts rmSync, catching any residual
    OS file-system cache lock contention

This complements the architectural fix (reset-before-launch) and non-interactive
terminal tracking. Combined, these changes provide multi-layered handle-release
tolerance: 2s post-shutdown grace period + 200ms pre-cleanup delay + existing
45-retry exponential backoff with quarantine fallback.

The previously failing 'auto-closes terminal session...' test now passes locally.
…ktree handles

Root cause: processManager.stop() calls TerminateProcess() on the Tauri parent
process only. On Windows, child processes spawned by Tauri (PowerShell hook
terminals) are NOT in the same Job Object and are NOT killed automatically —
they become orphaned with their CWD still pointing into worktree directories.
This caused deterministic EBUSY on rmSync in the next test's resetTestDirs()
even after multiple seconds of grace period.

Fix: before stop(), extract the process PID and run `taskkill /F /T /PID` to
kill the full process tree (parent + all descendants). taskkill /F /T is
synchronous, so by the time it returns, all child PowerShell processes have
been terminated and their CWD handles released.

Also reverts the 2s→500ms grace period (the extra 1.5s was compensating for
orphaned children that are now killed explicitly) and removes the 200ms
Atomics.wait() in resetTestDirs() that was added for the same reason.
@liam-russell liam-russell merged commit 4219bc5 into main May 8, 2026
17 checks passed
@liam-russell liam-russell deleted the Fixes branch May 8, 2026 04:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants