<# .SYNOPSIS Restore local-only WIP (stashes + untracked diffs) that was rescued into the recovery bundle's at-risk-work\ folder. Run AFTER the repos + submodules are cloned. .DESCRIPTION guru-rmm : each stashN-*.patch is applied to the working tree and then re-stashed, faithfully recreating the original `git stash` entries. Patches are processed highest-N-first so stash0 ends up on top (stash@{0}), matching the original LIFO order. The working tree is left CLEAN (changes live in the stash, exactly as before). guru-connect : tmp-spec018.diff was an UNTRACKED working file, so it is copied back into the repo as-is (not applied). Apply it yourself if/when you want it. Non-destructive and re-runnable. If a patch won't apply cleanly (submodule moved on), it is reported and the .patch file is left in place for manual `git apply --3way`. .PARAMETER BundlePath Recovery bundle root (auto-detect F:\ then E:\). .PARAMETER ClaudeToolsRoot Default D:\claudetools. #> [CmdletBinding()] param([string]$BundlePath,[string]$ClaudeToolsRoot='D:\claudetools') $ErrorActionPreference='Stop' if (-not $BundlePath) { foreach ($d in 'F:','E:','D:') { if (Test-Path "$d\claudetools-recovery\at-risk-work") { $BundlePath="$d\claudetools-recovery"; break } } } $aw = "$BundlePath\at-risk-work" if (-not $BundlePath -or -not (Test-Path $aw)) { Write-Host "[INFO] no at-risk-work folder found in bundle - nothing to restore"; return } Write-Host "[INFO] restoring at-risk WIP from $aw" -ForegroundColor Cyan function Have-Git($repo){ Test-Path "$repo\.git" } # ---- guru-rmm stashes ---- $rmm = "$ClaudeToolsRoot\projects\msp-tools\guru-rmm" if ((Test-Path "$aw\guru-rmm") -and (Have-Git $rmm)) { if (git -C $rmm status --porcelain) { Write-Host "[WARN] guru-rmm working tree is dirty; skipping auto-restore to avoid mixing changes. Apply patches in $aw\guru-rmm manually." -ForegroundColor Yellow } else { # highest N first so stash0 lands at stash@{0} $patches = Get-ChildItem "$aw\guru-rmm" -Filter '*.patch' | Sort-Object Name -Descending foreach ($p in $patches) { $check = git -C $rmm apply --check --3way $p.FullName 2>&1 if ($LASTEXITCODE -ne 0) { Write-Host "[WARN] won't apply cleanly, left for manual restore: $($p.Name) ($check)" -ForegroundColor Yellow; continue } git -C $rmm apply --3way $p.FullName 2>$null git -C $rmm stash push -u -m "restored WIP: $($p.BaseName)" 2>$null | Out-Null Write-Host "[OK] re-stashed guru-rmm: $($p.BaseName)" -ForegroundColor Green } Write-Host "[INFO] guru-rmm stashes now:" -ForegroundColor Cyan git -C $rmm stash list } } # ---- guru-connect untracked diff ---- $gc = "$ClaudeToolsRoot\projects\msp-tools\guru-connect" $diff = "$aw\guru-connect\tmp-spec018.diff" if ((Test-Path $diff) -and (Test-Path $gc)) { Copy-Item $diff "$gc\tmp-spec018.diff" -Force Write-Host "[OK] guru-connect\tmp-spec018.diff restored (untracked working file - 'git apply --3way tmp-spec018.diff' to apply it)" -ForegroundColor Green } Write-Host "[DONE] at-risk WIP restore" -ForegroundColor Cyan