--- description: Intelligent workspace sync - check, review, and commit changes across all repos date: 2025-02-12 --- # Workspace Sync Workflow > Intelligently manages uncommitted changes across all 3 workspace repos with interactive approval. > Preserves developer knowledge and prevents data loss through careful review and conflict resolution. ## Overview This workflow helps maintain a clean workspace by: 1. Scanning all repos for uncommitted changes 2. Displaying changes in an organized, reviewable format 3. Suggesting logical commit groups based on change types 4. Interactive approval before each commit 5. Safe conflict resolution with rebase 6. Pushing in dependency order (common_plat → voice_agent → mindlyst) ## Prerequisites - Git CLI installed - All repos cloned and accessible - Proper Git credentials configured ## Workflow Steps ### Step 1: Scan Workspace for Changes ```bash # Create workspace sync script cat > ~/workspace-sync.sh << 'EOF' #!/bin/bash # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Workspace paths WORKSPACE="$HOME/code/mygh" REPOS=( "learning_ai_common_plat:Common Platform:First" "learning_voice_ai_agent:LysnrAI:Second" "learning_multimodal_memory_agents:MindLyst:Third" ) echo -e "${BLUE}🔍 Scanning workspace for uncommitted changes...${NC}" echo # Track repos with changes REPOS_WITH_CHANGES=() for repo_info in "${REPOS[@]}"; do IFS=':' read -r repo_name display_name order <<< "$repo_info" repo_path="$WORKSPACE/$repo_name" if [ -d "$repo_path" ]; then cd "$repo_path" # Check for uncommitted changes if ! git diff --quiet || ! git diff --cached --quiet || [ -n "$(git ls-files --others --exclude-standard)" ]; then REPOS_WITH_CHANGES+=("$repo_name:$display_name:$order") echo -e "${CYAN}📁 $display_name${NC} (${YELLOW}$repo_name${NC})" # Staged changes if [ -n "$(git diff --cached --name-only)" ]; then echo -e " ${GREEN}Staged changes:${NC}" git diff --cached --stat fi # Unstaged changes if [ -n "$(git diff --name-only)" ]; then echo -e " ${YELLOW}Unstaged changes:${NC}" git diff --stat fi # Untracked files if [ -n "$(git ls-files --others --exclude-standard)" ]; then echo -e " ${RED}Untracked files:${NC}" git ls-files --others --exclude-standard | head -10 count=$(git ls-files --others --exclude-standard | wc -l) [ $count -gt 10 ] && echo " ... and $((count - 10)) more" fi # Branch status branch_status=$(git status --porcelain -b | head -1) if [[ $branch_status == *"ahead"* ]]; then echo -e " ${YELLOW}⚠️ Branch is ahead of origin${NC}" fi if [[ $branch_status == *"behind"* ]]; then echo -e " ${YELLOW}⚠️ Branch is behind origin${NC}" fi echo fi fi done if [ ${#REPOS_WITH_CHANGES[@]} -eq 0 ]; then echo -e "${GREEN}✅ All repos are clean!${NC}" exit 0 fi echo -e "${BLUE}📊 Summary: Found changes in ${#REPOS_WITH_CHANGES[@]} repo(s)${NC}" echo EOF chmod +x ~/workspace-sync.sh ``` ### Step 2: Interactive Review and Commit ```bash # Add interactive commit functionality cat >> ~/workspace-sync.sh << 'EOF' # Function to suggest commit message based on changes suggest_commit_message() { local repo_path="$1" cd "$repo_path" # Analyze changes has_ci_changes=$(git diff --cached --name-only | grep -E "\.github|ci|workflow" || echo "") has_docs_changes=$(git diff --cached --name-only | grep -E "README|\.md$" || echo "") has_code_changes=$(git diff --cached --name-only | grep -E "\.(ts|js|py|kt|swift)$" || echo "") has_test_changes=$(git diff --cached --name-only | grep -E "test|spec" || echo "") has_config_changes=$(git diff --cached --name-only | grep -E "package\.json|requirements|gradle|\.env" || echo "") # Suggest message if [ -n "$has_ci_changes" ]; then echo "ci: update CI/CD configuration" elif [ -n "$has_docs_changes" ] && [ -z "$has_code_changes" ]; then echo "docs: update documentation" elif [ -n "$has_test_changes" ] && [ -z "$has_code_changes" ]; then echo "test: update test suite" elif [ -n "$has_config_changes" ]; then echo "chore: update dependencies and configuration" else echo "feat: implement new features and improvements" fi } # Function to safely commit with review safe_commit() { local repo_name="$1" local display_name="$2" local repo_path="$WORKSPACE/$repo_name" cd "$repo_path" echo -e "${BLUE}📋 Reviewing changes for $display_name${NC}" echo # Show detailed diff echo -e "${CYAN}Press Enter to see diff summary, 's' to skip, 'q' to quit${NC}" read -r response if [[ "$response" == "q" ]]; then echo -e "${RED}Quitting workflow${NC}" exit 0 elif [[ "$response" != "s" ]]; then git diff --cached --stat 2>/dev/null || true git diff --stat 2>/dev/null || true echo fi # Ask what to do with changes echo -e "${YELLOW}Choose action:${NC}" echo " 1) Stage all changes and commit" echo " 2) Review and stage specific files" echo " 3) Skip this repo" echo " q) Quit workflow" read -r action case $action in 1) # Stage all changes git add -A ;; 2) # Interactive staging echo -e "${CYAN}Files to stage:${NC}" git status --porcelain echo -e "${YELLOW}Enter files to stage (space-separated, or 'all'):${NC}" read -r files_to_stage if [[ "$files_to_stage" == "all" ]]; then git add -A else git add $files_to_stage fi ;; 3) echo -e "${YELLOW}Skipping $display_name${NC}" return ;; q) echo -e "${RED}Quitting workflow${NC}" exit 0 ;; esac # Check if there's anything to commit if git diff --cached --quiet; then echo -e "${YELLOW}No changes staged, skipping${NC}" return fi # Suggest commit message suggested_msg=$(suggest_commit_message "$repo_path") echo -e "${CYAN}Suggested commit message: $suggested_msg${NC}" echo -e "${YELLOW}Enter commit message (or press Enter to accept suggestion):${NC}" read -r commit_msg if [[ -z "$commit_msg" ]]; then commit_msg="$suggested_msg" fi # Confirm commit echo -e "${YELLOW}Commit with message: '$commit_msg'? (y/N)${NC}" read -r confirm if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then git commit -m "$commit_msg" echo -e "${GREEN}✅ Committed changes in $display_name${NC}" else echo -e "${YELLOW}Commit cancelled${NC}" fi } EOF ``` ### Step 3: Safe Push with Conflict Resolution ```bash # Add push and conflict resolution cat >> ~/workspace-sync.sh << 'EOF' # Function to safely push with conflict resolution safe_push() { local repo_name="$1" local display_name="$2" local repo_path="$WORKSPACE/$repo_name" cd "$repo_path" # Check if we're ahead of origin if git log --oneline origin/main..main 2>/dev/null | grep -q .; then echo -e "${BLUE}📤 Pushing $display_name...${NC}" # Try to push if git push 2>/dev/null; then echo -e "${GREEN}✅ Pushed $display_name successfully${NC}" else echo -e "${YELLOW}⚠️ Push failed, attempting to pull and rebase...${NC}" # Fetch latest changes git fetch # Check if we have diverged if git log --oneline main..origin/main | grep -q .; then echo -e "${YELLOW}Local and remote have diverged. Options:${NC}" echo " 1) Pull --rebase (rebase your changes on top of remote)" echo " 2) Pull --no-rebase (merge remote changes)" echo " 3) Skip pushing and handle manually" read -r choice case $choice in 1) git pull --rebase if git push; then echo -e "${GREEN}✅ Pushed after rebase${NC}" else echo -e "${RED}❌ Still failed to push after rebase${NC}" echo -e "${CYAN}Please resolve conflicts manually in $repo_path${NC}" fi ;; 2) git pull --no-rebase if git push; then echo -e "${GREEN}✅ Pushed after merge${NC}" else echo -e "${RED}❌ Still failed to push after merge${NC}" fi ;; 3) echo -e "${YELLOW}Skipping push. Please handle manually.${NC}" ;; esac else # Just need to push git push echo -e "${GREEN}✅ Pushed $display_name${NC}" fi fi fi } # Main execution main() { # Sort repos by dependency order sorted_repos=($(printf '%s\n' "${REPOS_WITH_CHANGES[@]}" | sort -k3 -t':')) echo -e "${BLUE}🚀 Starting interactive sync process...${NC}" echo for repo_info in "${sorted_repos[@]}"; do IFS=':' read -r repo_name display_name order <<< "$repo_info" safe_commit "$repo_name" "$display_name" echo done # Ask about pushing echo -e "${YELLOW}Push all committed changes to origin? (y/N)${NC}" read -r push_confirm if [[ "$push_confirm" == "y" || "$push_confirm" == "Y" ]]; then echo -e "${BLUE}📤 Pushing in dependency order...${NC}" echo for repo_info in "${sorted_repos[@]}"; do IFS=':' read -r repo_name display_name order <<< "$repo_info" safe_push "$repo_name" "$display_name" echo done else echo -e "${YELLOW}Skipping push. Changes are committed locally.${NC}" fi echo -e "${GREEN}✨ Workspace sync complete!${NC}" } # Run main function main EOF echo "Created workspace-sync.sh at ~/workspace-sync.sh" ``` ### Step 4: Create VS Code Task for Easy Access ```bash # Create .vscode/tasks.json in each repo cat > /Users/sd9235/code/mygh/learning_ai_common_plat/.vscode/tasks.json << 'EOF' { "version": "2.0.0", "tasks": [ { "label": "Workspace Sync", "type": "shell", "command": "~/workspace-sync.sh", "group": "build", "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "new" }, "problemMatcher": [] } ] } EOF # Copy to other repos cp /Users/sd9235/code/mygh/learning_ai_common_plat/.vscode/tasks.json \ /Users/sd9235/code/mygh/learning_voice_ai_agent/.vscode/tasks.json cp /Users/sd9235/code/mygh/learning_ai_common_plat/.vscode/tasks.json \ /Users/sd9235/code/mygh/learning_multimodal_memory_agents/.vscode/tasks.json ``` ## Usage ### Option 1: Run from Terminal ```bash ~/workspace-sync.sh ``` ### Option 2: Run from VS Code 1. Open any workspace repo 2. Press `Cmd+Shift+P` (macOS) or `Ctrl+Shift+P` (Windows/Linux) 3. Type "Tasks: Run Task" 4. Select "Workspace Sync" ### Option 3: Create Git Alias ```bash git config --global alias.ws '!~/workspace-sync.sh' # Then run: git ws ``` ## Features ### 🔍 Smart Detection - Identifies staged, unstaged, and untracked files - Detects branch divergence (ahead/behind) - Shows change statistics ### 📝 Intelligent Suggestions - Suggests commit messages based on changed file types - Follows conventional commit format - Recognizes CI, docs, test, and feature changes ### 🛡️ Safety First - Interactive review before each commit - Confirmation before destructive operations - Preserves developer knowledge and consent ### 🔄 Conflict Resolution - Automatic fetch before push - Interactive choice between rebase/merge - Clear guidance for manual resolution ### 📊 Dependency Ordering - Automatically pushes in correct order - Common Platform → LysnrAI → MindLyst - Prevents dependency issues ## Example Session ``` 🔍 Scanning workspace for uncommitted changes... 📁 Common Platform (learning_ai_common_plat) Staged changes: src/index.ts | 2 +- README.md | 5 +++++ Untracked files: new-feature.ts 📁 LysnrAI (learning_voice_ai_agent) Unstaged changes: src/app.py | 10 ++++++++++ requirements.txt | 2 +- 📊 Summary: Found changes in 2 repo(s) 🚀 Starting interactive sync process... 📋 Reviewing changes for Common Platform Press Enter to see diff summary, 's' to skip, 'q' to quit Choose action: 1) Stage all changes and commit 2) Review and stage specific files 3) Skip this repo q) Quit workflow 1 Suggested commit message: feat: implement new features and improvements Enter commit message (or press Enter to accept suggestion): feat: add new feature and update docs Commit with message: 'feat: add new feature and update docs'? (y/N) y ✅ Committed changes in Common Platform ... ``` ## Best Practices 1. **Run before switching contexts**: Always run workspace sync before moving to another task 2. **Review carefully**: The interactive review prevents accidental commits 3. **Handle conflicts manually**: If rebase/merge fails, resolve conflicts to understand what changed 4. **Commit frequently**: Small, focused commits are easier to review and sync 5. **Use descriptive messages**: Good commit messages help track changes across repos ## Troubleshooting ### Permission Issues ```bash chmod +x ~/workspace-sync.sh ``` ### Git Credentials ```bash git config --global credential.helper store ``` ### SSH Key Issues ```bash ssh-add ~/.ssh/id_rsa ``` ## Customization You can customize the script by: - Adding more repos to the `REPOS` array - Modifying commit message suggestions - Adding custom conflict resolution strategies - Integrating with your team's workflow --- **Remember**: This workflow preserves your knowledge and control over what gets committed. Never skip the review steps!