From 4ec1a17ef4f5da436989b6214e584285def9d939 Mon Sep 17 00:00:00 2001 From: catlog22 Date: Sat, 4 Oct 2025 23:54:00 +0800 Subject: [PATCH] feat: Add commit SHA tracking to version.json for precise version identification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Version Tracking Enhancement**: - Add commit_sha field to version.json for distinguishing development versions - Auto-detect commit SHA from downloaded repository using git rev-parse - Fallback to GitHub API if git is unavailable - Update both PowerShell and Bash installers **version.json Structure**: ```json { "version": "3.4.1", "commit_sha": "9a49a86", "installation_mode": "Global", "installation_path": "...", "installation_date_utc": "...", "source_branch": "main", "installer_version": "2.2.0" } ``` **Benefits**: - /version command can precisely identify installed version - Distinguish between stable releases and development builds - Track exact commit for debugging and support 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- Install-Claude.ps1 | 8 ++++++-- install-remote.ps1 | 30 ++++++++++++++++++++++++++---- install-remote.sh | 21 ++++++++++++++++++--- 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/Install-Claude.ps1 b/Install-Claude.ps1 index 4cfeb0df..4a5e8954 100644 --- a/Install-Claude.ps1 +++ b/Install-Claude.ps1 @@ -63,7 +63,9 @@ param( [string]$SourceVersion = "", - [string]$SourceBranch = "" + [string]$SourceBranch = "", + + [string]$SourceCommit = "" ) # Set encoding for proper Unicode support @@ -651,10 +653,12 @@ function Create-VersionJson { # Determine version from source parameter (passed from install-remote.ps1) $versionNumber = if ($SourceVersion) { $SourceVersion } else { $DefaultVersion } $sourceBranch = if ($SourceBranch) { $SourceBranch } else { "unknown" } + $commitSha = if ($SourceCommit) { $SourceCommit } else { "unknown" } # Create version.json content $versionInfo = @{ version = $versionNumber + commit_sha = $commitSha installation_mode = $InstallationMode installation_path = $TargetClaudeDir installation_date_utc = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") @@ -666,7 +670,7 @@ function Create-VersionJson { try { $versionInfo | ConvertTo-Json | Out-File -FilePath $versionJsonPath -Encoding utf8 -Force - Write-ColorOutput "Created version.json: $versionNumber ($InstallationMode)" $ColorSuccess + Write-ColorOutput "Created version.json: $versionNumber ($commitSha) - $InstallationMode" $ColorSuccess return $true } catch { Write-ColorOutput "WARNING: Failed to create version.json: $($_.Exception.Message)" $ColorWarning diff --git a/install-remote.ps1 b/install-remote.ps1 index 1bb6f9c5..2c8652cc 100644 --- a/install-remote.ps1 +++ b/install-remote.ps1 @@ -260,7 +260,8 @@ function Invoke-LocalInstaller { param( [string]$RepoDir, [string]$VersionInfo = "", - [string]$BranchInfo = "" + [string]$BranchInfo = "", + [string]$CommitSha = "" ) $installerPath = Join-Path $RepoDir "Install-Claude.ps1" @@ -285,9 +286,10 @@ function Invoke-LocalInstaller { if ($NonInteractive) { $params["NonInteractive"] = $NonInteractive } if ($BackupAll) { $params["BackupAll"] = $BackupAll } - # Pass version and branch information + # Pass version, branch, and commit information if ($VersionInfo) { $params["SourceVersion"] = $VersionInfo } if ($BranchInfo) { $params["SourceBranch"] = $BranchInfo } + if ($CommitSha) { $params["SourceCommit"] = $CommitSha } try { # Change to repo directory and run installer @@ -564,6 +566,8 @@ function Main { # Determine version and branch information to pass $versionToPass = "" + $commitSha = "" + if ($Tag) { # Specific tag version $versionToPass = $Tag -replace '^v', '' # Remove 'v' prefix @@ -580,12 +584,30 @@ function Main { $versionToPass = "latest" } + # Get commit SHA from the downloaded repository + try { + Push-Location $repoDir + $commitSha = (git rev-parse --short HEAD 2>$null) + if (-not $commitSha) { + # Fallback: try to get from GitHub API + $commitUrl = "https://api.github.com/repos/catlog22/Claude-Code-Workflow/commits/$Branch" + $commitResponse = Invoke-RestMethod -Uri $commitUrl -UseBasicParsing -TimeoutSec 5 -ErrorAction SilentlyContinue + if ($commitResponse.sha) { + $commitSha = $commitResponse.sha.Substring(0, 7) + } + } + Pop-Location + } catch { + Pop-Location + $commitSha = "unknown" + } + $branchToPass = if ($Version -eq "branch") { $Branch } elseif ($Version -eq "latest") { "main" } elseif ($Tag) { $Tag } else { "main" } - Write-ColorOutput "Version info: $versionToPass (branch: $branchToPass)" $ColorInfo + Write-ColorOutput "Version info: $versionToPass (branch: $branchToPass, commit: $commitSha)" $ColorInfo # Run local installer with version information - $success = Invoke-LocalInstaller -RepoDir $repoDir -VersionInfo $versionToPass -BranchInfo $branchToPass + $success = Invoke-LocalInstaller -RepoDir $repoDir -VersionInfo $versionToPass -BranchInfo $branchToPass -CommitSha $commitSha if (-not $success) { throw "Installation script failed" } diff --git a/install-remote.sh b/install-remote.sh index 30d1b62e..7895b7ab 100644 --- a/install-remote.sh +++ b/install-remote.sh @@ -211,6 +211,7 @@ function invoke_local_installer() { local repo_dir="$1" local version_info="$2" local branch_info="$3" + local commit_sha="$4" local installer_path="${repo_dir}/Install-Claude.sh" # Make installer executable @@ -251,7 +252,7 @@ function invoke_local_installer() { params+=("-BackupAll") fi - # Pass version and branch information + # Pass version, branch, and commit information if [ -n "$version_info" ]; then params+=("-SourceVersion" "$version_info") fi @@ -260,6 +261,10 @@ function invoke_local_installer() { params+=("-SourceBranch" "$branch_info") fi + if [ -n "$commit_sha" ]; then + params+=("-SourceCommit" "$commit_sha") + fi + # Execute installer if (cd "$repo_dir" && "$installer_path" "${params[@]}"); then return 0 @@ -646,6 +651,7 @@ function main() { # Determine version and branch information to pass local version_to_pass="" local branch_to_pass="" + local commit_sha="" if [ -n "$TAG_VERSION" ]; then # Specific tag version - remove 'v' prefix @@ -674,10 +680,19 @@ function main() { branch_to_pass="main" fi - write_color "Version info: $version_to_pass (branch: $branch_to_pass)" "$COLOR_INFO" + # Get commit SHA from the downloaded repository + if command -v git &> /dev/null && [ -d "$repo_dir/.git" ]; then + commit_sha=$(cd "$repo_dir" && git rev-parse --short HEAD 2>/dev/null || echo "unknown") + else + # Fallback: try to get from GitHub API + commit_sha=$(curl -fsSL "https://api.github.com/repos/catlog22/Claude-Code-Workflow/commits/$branch_to_pass" 2>/dev/null | grep -o '"sha": *"[^"]*"' | head -1 | cut -d'"' -f4 | cut -c1-7) + [ -z "$commit_sha" ] && commit_sha="unknown" + fi + + write_color "Version info: $version_to_pass (branch: $branch_to_pass, commit: $commit_sha)" "$COLOR_INFO" # Run local installer with version information - if invoke_local_installer "$repo_dir" "$version_to_pass" "$branch_to_pass"; then + if invoke_local_installer "$repo_dir" "$version_to_pass" "$branch_to_pass" "$commit_sha"; then success=true echo "" write_color "✓ Remote installation completed successfully!" "$COLOR_SUCCESS"