feat: Add commit SHA tracking to version.json for precise version identification

**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 <noreply@anthropic.com>
This commit is contained in:
catlog22
2025-10-04 23:54:00 +08:00
parent 9a49a86221
commit 4ec1a17ef4
3 changed files with 50 additions and 9 deletions

View File

@@ -63,7 +63,9 @@ param(
[string]$SourceVersion = "", [string]$SourceVersion = "",
[string]$SourceBranch = "" [string]$SourceBranch = "",
[string]$SourceCommit = ""
) )
# Set encoding for proper Unicode support # Set encoding for proper Unicode support
@@ -651,10 +653,12 @@ function Create-VersionJson {
# Determine version from source parameter (passed from install-remote.ps1) # Determine version from source parameter (passed from install-remote.ps1)
$versionNumber = if ($SourceVersion) { $SourceVersion } else { $DefaultVersion } $versionNumber = if ($SourceVersion) { $SourceVersion } else { $DefaultVersion }
$sourceBranch = if ($SourceBranch) { $SourceBranch } else { "unknown" } $sourceBranch = if ($SourceBranch) { $SourceBranch } else { "unknown" }
$commitSha = if ($SourceCommit) { $SourceCommit } else { "unknown" }
# Create version.json content # Create version.json content
$versionInfo = @{ $versionInfo = @{
version = $versionNumber version = $versionNumber
commit_sha = $commitSha
installation_mode = $InstallationMode installation_mode = $InstallationMode
installation_path = $TargetClaudeDir installation_path = $TargetClaudeDir
installation_date_utc = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") installation_date_utc = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
@@ -666,7 +670,7 @@ function Create-VersionJson {
try { try {
$versionInfo | ConvertTo-Json | Out-File -FilePath $versionJsonPath -Encoding utf8 -Force $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 return $true
} catch { } catch {
Write-ColorOutput "WARNING: Failed to create version.json: $($_.Exception.Message)" $ColorWarning Write-ColorOutput "WARNING: Failed to create version.json: $($_.Exception.Message)" $ColorWarning

View File

@@ -260,7 +260,8 @@ function Invoke-LocalInstaller {
param( param(
[string]$RepoDir, [string]$RepoDir,
[string]$VersionInfo = "", [string]$VersionInfo = "",
[string]$BranchInfo = "" [string]$BranchInfo = "",
[string]$CommitSha = ""
) )
$installerPath = Join-Path $RepoDir "Install-Claude.ps1" $installerPath = Join-Path $RepoDir "Install-Claude.ps1"
@@ -285,9 +286,10 @@ function Invoke-LocalInstaller {
if ($NonInteractive) { $params["NonInteractive"] = $NonInteractive } if ($NonInteractive) { $params["NonInteractive"] = $NonInteractive }
if ($BackupAll) { $params["BackupAll"] = $BackupAll } if ($BackupAll) { $params["BackupAll"] = $BackupAll }
# Pass version and branch information # Pass version, branch, and commit information
if ($VersionInfo) { $params["SourceVersion"] = $VersionInfo } if ($VersionInfo) { $params["SourceVersion"] = $VersionInfo }
if ($BranchInfo) { $params["SourceBranch"] = $BranchInfo } if ($BranchInfo) { $params["SourceBranch"] = $BranchInfo }
if ($CommitSha) { $params["SourceCommit"] = $CommitSha }
try { try {
# Change to repo directory and run installer # Change to repo directory and run installer
@@ -564,6 +566,8 @@ function Main {
# Determine version and branch information to pass # Determine version and branch information to pass
$versionToPass = "" $versionToPass = ""
$commitSha = ""
if ($Tag) { if ($Tag) {
# Specific tag version # Specific tag version
$versionToPass = $Tag -replace '^v', '' # Remove 'v' prefix $versionToPass = $Tag -replace '^v', '' # Remove 'v' prefix
@@ -580,12 +584,30 @@ function Main {
$versionToPass = "latest" $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" } $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 # 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) { if (-not $success) {
throw "Installation script failed" throw "Installation script failed"
} }

View File

@@ -211,6 +211,7 @@ function invoke_local_installer() {
local repo_dir="$1" local repo_dir="$1"
local version_info="$2" local version_info="$2"
local branch_info="$3" local branch_info="$3"
local commit_sha="$4"
local installer_path="${repo_dir}/Install-Claude.sh" local installer_path="${repo_dir}/Install-Claude.sh"
# Make installer executable # Make installer executable
@@ -251,7 +252,7 @@ function invoke_local_installer() {
params+=("-BackupAll") params+=("-BackupAll")
fi fi
# Pass version and branch information # Pass version, branch, and commit information
if [ -n "$version_info" ]; then if [ -n "$version_info" ]; then
params+=("-SourceVersion" "$version_info") params+=("-SourceVersion" "$version_info")
fi fi
@@ -260,6 +261,10 @@ function invoke_local_installer() {
params+=("-SourceBranch" "$branch_info") params+=("-SourceBranch" "$branch_info")
fi fi
if [ -n "$commit_sha" ]; then
params+=("-SourceCommit" "$commit_sha")
fi
# Execute installer # Execute installer
if (cd "$repo_dir" && "$installer_path" "${params[@]}"); then if (cd "$repo_dir" && "$installer_path" "${params[@]}"); then
return 0 return 0
@@ -646,6 +651,7 @@ function main() {
# Determine version and branch information to pass # Determine version and branch information to pass
local version_to_pass="" local version_to_pass=""
local branch_to_pass="" local branch_to_pass=""
local commit_sha=""
if [ -n "$TAG_VERSION" ]; then if [ -n "$TAG_VERSION" ]; then
# Specific tag version - remove 'v' prefix # Specific tag version - remove 'v' prefix
@@ -674,10 +680,19 @@ function main() {
branch_to_pass="main" branch_to_pass="main"
fi 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 # 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 success=true
echo "" echo ""
write_color "✓ Remote installation completed successfully!" "$COLOR_SUCCESS" write_color "✓ Remote installation completed successfully!" "$COLOR_SUCCESS"