Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
d12eb52
ci: add Azure auth test workflow
AndyMik90 Jan 12, 2026
74ed432
fix(worktree): handle "already up to date" case correctly (ACS-226) (…
StillKnotKnown Jan 12, 2026
1701160
fix(terminal): add collision detection for terminal drag and drop reo…
AndyMik90 Jan 12, 2026
e742732
fix(ACS-181): enable auto-switch on 401 auth errors & OAuth-only prof…
MikeeBuilds Jan 13, 2026
8d21978
feat(frontend): add Claude Code version rollback feature (#983)
AndyMik90 Jan 13, 2026
750ea8d
fix(security): inherit security profiles in worktrees and validate sh…
AndyMik90 Jan 13, 2026
2a2dc3b
feat(frontend): add searchable branch combobox to worktree creation d…
AndyMik90 Jan 13, 2026
68fe086
fix(frontend): sync worktree config to renderer on terminal restorati…
AndyMik90 Jan 13, 2026
4736b6b
fix(merge): include files with content changes even when semantic ana…
AndyMik90 Jan 13, 2026
14982e6
fix(terminal): detect Claude exit and reset label when user closes Cl…
AndyMik90 Jan 13, 2026
6f059bb
fix(app-update): persist downloaded update state for Install button v…
AndyMik90 Jan 13, 2026
aa9fbe9
fix(backend): add Sentry integration and fix broken pipe errors (#991)
AndyMik90 Jan 13, 2026
e07a0db
fix: improve Claude CLI detection and add installation selector (#1004)
AndyMik90 Jan 13, 2026
553d1e8
ci(release): move VirusTotal scan to separate post-release workflow (…
AndyMik90 Jan 13, 2026
5d07d5f
fix(ui): display actual base branch name instead of hardcoded main (#…
AndyMik90 Jan 13, 2026
1babcc8
fix(github-prs): prevent preloading of PRs currently under review (#1…
AndyMik90 Jan 13, 2026
432e985
chore: bump version to 2.7.4
AndyMik90 Jan 13, 2026
e7b38d4
hotfix/sentry-backend-build
AndyMik90 Jan 13, 2026
0307a4a
fix(github): resolve circular import issues in context_gatherer and s…
AndyMik90 Jan 13, 2026
aed28c5
feat(sentry): embed Sentry DSN at build time for packaged apps (#1025)
AndyMik90 Jan 13, 2026
2d1d3ef
Fix Duplicate Kanban Task Creation on Rapid Button Clicks (#1021)
AndyMik90 Jan 13, 2026
d48e5f6
feat(terminal): add YOLO mode to invoke Claude with --dangerously-ski…
AndyMik90 Jan 13, 2026
4dbb7ee
Make worktree isolation prominent in UI (#1020)
AndyMik90 Jan 13, 2026
54e9f22
fix(terminal): improve worktree name input UX (#1012)
AndyMik90 Jan 13, 2026
df1b8a3
fix(terminal): enhance terminal recreation logic with retry mechanism…
AndyMik90 Jan 13, 2026
17118b0
feat(terminal): add task worktrees section and remove terminal limit …
AndyMik90 Jan 13, 2026
88277f8
Add file/screenshot upload to QA feedback interface (#1018)
AndyMik90 Jan 13, 2026
c8374bc
fix(auth): await profile manager initialization before auth check (#1…
StillKnotKnown Jan 13, 2026
1ae3359
fix(frontend): validate Windows claude.cmd reliably in GUI (#1023)
g1331 Jan 13, 2026
72797ac
2.7.4 release
AndyMik90 Jan 13, 2026
1b5aecd
changelog 2.7.4
AndyMik90 Jan 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 2 additions & 140 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -522,144 +522,6 @@ jobs:
sha256sum ./* > checksums.sha256
cat checksums.sha256

- name: Scan with VirusTotal
id: virustotal
continue-on-error: true
if: ${{ github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && inputs.dry_run != true) }}
env:
VT_API_KEY: ${{ secrets.VIRUSTOTAL_API_KEY }}
run: |
if [ -z "$VT_API_KEY" ]; then
echo "::warning::VIRUSTOTAL_API_KEY not configured, skipping scan"
echo "vt_results=" >> $GITHUB_OUTPUT
exit 0
fi

echo "## VirusTotal Scan Results" > vt_results.md
echo "" >> vt_results.md

for file in release-assets/*.{exe,dmg,AppImage,deb,flatpak}; do
[ -f "$file" ] || continue
filename=$(basename "$file")
filesize=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file")
echo "Scanning $filename (${filesize} bytes)..."

# For files > 32MB, get a special upload URL first
if [ "$filesize" -gt 33554432 ]; then
echo " Large file detected, requesting upload URL..."
upload_url_response=$(curl -s --request GET \
--url "https://www.virustotal.com/api/v3/files/upload_url" \
--header "x-apikey: $VT_API_KEY")

upload_url=$(echo "$upload_url_response" | jq -r '.data // empty')
if [ -z "$upload_url" ]; then
echo "::warning::Failed to get upload URL for large file $filename"
echo "Response: $upload_url_response"
echo "- $filename - ⚠️ Upload failed (large file)" >> vt_results.md
continue
fi
api_url="$upload_url"
else
api_url="https://www.virustotal.com/api/v3/files"
fi

# Upload file to VirusTotal
response=$(curl -s --request POST \
--url "$api_url" \
--header "x-apikey: $VT_API_KEY" \
--form "file=@$file")

# Check if response is valid JSON before parsing
if ! echo "$response" | jq -e . >/dev/null 2>&1; then
echo "::warning::VirusTotal returned invalid JSON for $filename"
echo "Response (first 500 chars): ${response:0:500}"
echo "- $filename - ⚠️ Scan failed (invalid response)" >> vt_results.md
continue
fi

# Check for API error response
error_code=$(echo "$response" | jq -r '.error.code // empty')
if [ -n "$error_code" ]; then
error_msg=$(echo "$response" | jq -r '.error.message // "Unknown error"')
echo "::warning::VirusTotal API error for $filename: $error_code - $error_msg"
echo "- $filename - ⚠️ Scan failed ($error_code)" >> vt_results.md
continue
fi

# Extract analysis ID
analysis_id=$(echo "$response" | jq -r '.data.id // empty')

if [ -z "$analysis_id" ]; then
echo "::warning::Failed to upload $filename to VirusTotal"
echo "Response: $response"
echo "- $filename - ⚠️ Upload failed" >> vt_results.md
continue
fi

echo "Uploaded $filename, analysis ID: $analysis_id"

# Wait for analysis to complete (max 5 minutes per file)
analysis=""
for i in {1..30}; do
sleep 10
analysis=$(curl -s --request GET \
--url "https://www.virustotal.com/api/v3/analyses/$analysis_id" \
--header "x-apikey: $VT_API_KEY")

# Validate JSON response
if ! echo "$analysis" | jq -e . >/dev/null 2>&1; then
echo " Warning: Invalid JSON response on attempt $i, retrying..."
continue
fi

status=$(echo "$analysis" | jq -r '.data.attributes.status // "unknown"')
echo " Status: $status (attempt $i/30)"

if [ "$status" = "completed" ]; then
break
fi
done

# Final validation that we have valid analysis data
if ! echo "$analysis" | jq -e '.data.attributes.stats' >/dev/null 2>&1; then
echo "::warning::Could not get complete analysis for $filename, using local hash"
file_hash=$(sha256sum "$file" | cut -d' ' -f1)
echo "- [$filename](https://www.virustotal.com/gui/file/$file_hash) - ⚠️ Analysis incomplete" >> vt_results.md
continue
fi

# Get file hash for permanent URL
file_hash=$(echo "$analysis" | jq -r '.meta.file_info.sha256 // empty')

if [ -z "$file_hash" ]; then
# Fallback: calculate hash locally
file_hash=$(sha256sum "$file" | cut -d' ' -f1)
fi

# Get detection stats
malicious=$(echo "$analysis" | jq -r '.data.attributes.stats.malicious // 0')
suspicious=$(echo "$analysis" | jq -r '.data.attributes.stats.suspicious // 0')
undetected=$(echo "$analysis" | jq -r '.data.attributes.stats.undetected // 0')

vt_url="https://www.virustotal.com/gui/file/$file_hash"

if [ "$malicious" -gt 0 ] || [ "$suspicious" -gt 0 ]; then
echo "::warning::$filename has $malicious malicious and $suspicious suspicious detections (likely false positives)"
echo "- [$filename]($vt_url) - ⚠️ **$malicious malicious, $suspicious suspicious** detections (review recommended)" >> vt_results.md
else
echo "$filename is clean ($undetected engines, 0 detections)"
echo "- [$filename]($vt_url) - ✅ Clean ($undetected engines, 0 detections)" >> vt_results.md
fi
done

echo "" >> vt_results.md

# Save results for release notes
cat vt_results.md
echo "vt_results<<EOF" >> $GITHUB_OUTPUT
cat vt_results.md >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT

- name: Dry run summary
if: ${{ github.event_name == 'workflow_dispatch' && inputs.dry_run == true }}
run: |
Expand Down Expand Up @@ -741,9 +603,9 @@ jobs:

---

${{ steps.virustotal.outputs.vt_results }}

**Full Changelog**: https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md

_VirusTotal scan results will be added automatically after release._
files: release-assets/*
draft: false
prerelease: ${{ contains(github.ref, 'beta') || contains(github.ref, 'alpha') }}
Expand Down
21 changes: 21 additions & 0 deletions .github/workflows/test-azure-auth.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Test Azure Auth

on:
workflow_dispatch:

jobs:
test-auth:
runs-on: windows-latest
permissions:
id-token: write
contents: read
steps:
- name: Azure Login (OIDC)
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

- name: Success
run: echo "Azure authentication successful!"
Loading
Loading