#!/usr/bin/env bash # cleanup.sh # # Clean up worktree for completed issue set -euo pipefail here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=./lib.sh source "$here/lib.sh" if [ -z "${1:-}" ]; then echo "Usage: pnpm deep-work cleanup " >&2 echo "" echo "Active worktrees:" list_deep_work_worktrees | while IFS='=' read -r key value; do if [ "$key" = "issue" ]; then issue_num="$value" elif [ "$key" = "path" ]; then echo " #$issue_num: $value" fi done exit 1 fi case "$1" in ''|*[!0-9]*) echo "[deep-work] issue-number must be numeric, got: $1" >&2 exit 1 ;; esac issue="$1" echo "[deep-work] ๐Ÿงน Cleaning up worktree for issue #$issue" # Check if worktree exists if ! worktree_exists "$issue"; then echo "[deep-work] โŒ no worktree found for issue #$issue" exit 1 fi worktree_dir=$(worktree_dir_for_issue "$issue") echo "[deep-work] worktree location: $worktree_dir" # Get branch info branch="" if [ -d "$worktree_dir" ]; then branch=$(cd "$worktree_dir" && git branch --show-current 2>/dev/null || echo "unknown") echo "[deep-work] branch: $branch" fi # Check for uncommitted changes if [ -d "$worktree_dir/.git" ]; then if ! (cd "$worktree_dir" && git diff --quiet && git diff --cached --quiet && [ -z "$(git ls-files --others --exclude-standard)" ]); then echo "" echo "โš ๏ธ WARNING: Worktree has uncommitted changes!" echo "" echo "Files with changes:" (cd "$worktree_dir" && git status --short) echo "" echo "These changes will be LOST if you proceed with cleanup." echo "" echo "Options:" echo "1) Cancel cleanup and commit changes first" echo "2) Continue anyway and lose changes" echo "" read -p "What would you like to do? [1/2]: " -r choice case "$choice" in 1) echo "Cleanup cancelled. Please commit your changes first:" echo " cd $worktree_dir" echo " git add ." echo " git commit -m 'message'" echo " pnpm deep-work cleanup $issue" exit 0 ;; 2) echo "Proceeding with cleanup, changes will be lost..." ;; *) echo "Invalid choice. Cancelling cleanup." exit 1 ;; esac fi fi # Check PR status repo=$(resolve_deep_work_repo) pr_status="" pr_url="" if [ -n "$branch" ] && [ "$branch" != "unknown" ]; then if pr_json=$(gh pr view "$branch" -R "$repo" --json url,state,isDraft,mergeable 2>/dev/null); then pr_url=$(echo "$pr_json" | jq -r '.url') pr_state=$(echo "$pr_json" | jq -r '.state') pr_draft=$(echo "$pr_json" | jq -r '.isDraft') if [ "$pr_state" = "MERGED" ]; then pr_status="merged" elif [ "$pr_draft" = "true" ]; then pr_status="draft" elif [ "$pr_state" = "OPEN" ]; then pr_status="open" else pr_status="$pr_state" fi echo "" echo "๐Ÿ“‹ PR Status: $pr_status" echo "๐Ÿ”— PR URL: $pr_url" else echo "" echo "๐Ÿ“‹ No PR found for branch $branch" fi fi # Confirm cleanup echo "" echo "This will:" echo " โœ— Remove worktree directory: $worktree_dir" echo " โœ— Delete local branch: $branch" echo " โœ“ Keep remote branch and PR intact (if they exist)" echo "" if [ "$pr_status" = "draft" ] || [ "$pr_status" = "open" ]; then echo "โš ๏ธ Note: PR is still $pr_status. You may want to merge it first." echo "" fi read -p "Continue with cleanup? [y/N]: " -r if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "Cleanup cancelled." exit 0 fi # Perform cleanup cleanup_worktree "$issue" "true" echo "" echo "[deep-work] โœ… Cleanup complete!" if [ -n "$pr_url" ]; then echo "" echo "๐Ÿ“‹ PR remains available: $pr_url" if [ "$pr_status" = "merged" ]; then echo "" echo "๐ŸŽ‰ Issue #$issue has been successfully completed and merged!" fi fi echo "" echo "๐Ÿš€ Ready to start your next deep-work session:" echo " pnpm deep-work pick" echo " pnpm deep-work start "