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]$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

View File

@@ -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"
}

View File

@@ -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"