Compare commits
16
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c1c489af4 | ||
|
|
f7e2d92c4d | ||
|
|
6d9a0d7516 | ||
|
|
4cccab1d17 | ||
|
|
19379169b9 | ||
|
|
8a104ad8d0 | ||
|
|
59c911dff4 | ||
|
|
127fc82b2a | ||
|
|
9bde5b74a0 | ||
|
|
bdede36b5f | ||
|
|
d2cb75a8dc | ||
|
|
01188b3009 | ||
|
|
54b89b8e55 | ||
|
|
24dbf013e7 | ||
|
|
5a799899ef | ||
|
|
f318713ba5 |
@@ -1,79 +0,0 @@
|
|||||||
name: Release Beta
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v*-beta*'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-beta:
|
|
||||||
runs-on: macos-latest
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get version from tag
|
|
||||||
id: version
|
|
||||||
run: echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: |
|
|
||||||
xcodebuild \
|
|
||||||
-project ClaudeChecker.xcodeproj \
|
|
||||||
-scheme ClaudeChecker \
|
|
||||||
-configuration Release \
|
|
||||||
-derivedDataPath build \
|
|
||||||
clean build
|
|
||||||
|
|
||||||
- name: Zip app
|
|
||||||
run: |
|
|
||||||
ditto -c -k --keepParent \
|
|
||||||
build/Build/Products/Release/ClaudeChecker.app \
|
|
||||||
ClaudeChecker.zip
|
|
||||||
|
|
||||||
- name: Create GitHub pre-release
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
gh release create "$GITHUB_REF_NAME" ClaudeChecker.zip \
|
|
||||||
--title "$GITHUB_REF_NAME" \
|
|
||||||
--prerelease \
|
|
||||||
--notes "$(cat RELEASE_NOTES.md 2>/dev/null || echo 'Beta release ${{ steps.version.outputs.version }}')"
|
|
||||||
|
|
||||||
- name: Update version-beta.json
|
|
||||||
run: |
|
|
||||||
notes=$(cat RELEASE_NOTES.md 2>/dev/null || echo "Beta release ${{ steps.version.outputs.version }}")
|
|
||||||
jq -n \
|
|
||||||
--arg version "${{ steps.version.outputs.version }}" \
|
|
||||||
--arg url "https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/ClaudeChecker.zip" \
|
|
||||||
--arg notes "$notes" \
|
|
||||||
'{version: $version, url: $url, notes: $notes}' > version-beta.json
|
|
||||||
|
|
||||||
- name: Update beta badge in README
|
|
||||||
run: |
|
|
||||||
shields_version=$(echo "${{ steps.version.outputs.version }}" | sed 's/-/--/g')
|
|
||||||
tag="${{ github.ref_name }}"
|
|
||||||
export BADGE="[](https://github.com/${{ github.repository }}/releases/tag/${tag}) <!-- BETA_BADGE -->"
|
|
||||||
python3 -c "
|
|
||||||
import os
|
|
||||||
badge = os.environ['BADGE']
|
|
||||||
lines = open('README.md').readlines()
|
|
||||||
out = []
|
|
||||||
for line in lines:
|
|
||||||
out.append(badge + chr(10) if '<!-- BETA_BADGE -->' in line else line)
|
|
||||||
open('README.md', 'w').writelines(out)
|
|
||||||
"
|
|
||||||
|
|
||||||
- name: Commit version-beta.json and README
|
|
||||||
run: |
|
|
||||||
git config user.name "github-actions[bot]"
|
|
||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
||||||
git add version-beta.json README.md
|
|
||||||
git commit -m "Beta release ${{ github.ref_name }}"
|
|
||||||
git pull --rebase origin main
|
|
||||||
git push origin HEAD:main
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
name: Release Windows Beta
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'win-v*-beta*'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-windows-beta:
|
|
||||||
runs-on: windows-latest
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup .NET
|
|
||||||
uses: actions/setup-dotnet@v4
|
|
||||||
with:
|
|
||||||
dotnet-version: '8.0.x'
|
|
||||||
|
|
||||||
- name: Get version from tag
|
|
||||||
id: version
|
|
||||||
shell: bash
|
|
||||||
run: echo "version=${GITHUB_REF_NAME#win-v}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Publish
|
|
||||||
run: |
|
|
||||||
dotnet publish windows/ClaudeCheckerWindows.csproj `
|
|
||||||
-c Release -r win-x64 `
|
|
||||||
--self-contained true `
|
|
||||||
-p:PublishSingleFile=true `
|
|
||||||
-p:Version=${{ steps.version.outputs.version }} `
|
|
||||||
-o publish
|
|
||||||
|
|
||||||
- name: Build installer
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
Copy-Item -Recurse windows/Assets publish/Assets
|
|
||||||
& "C:\Program Files (x86)\Inno Setup 6\iscc.exe" /DAppVersion="${{ steps.version.outputs.version }}" windows\installer.iss
|
|
||||||
|
|
||||||
- name: Create GitHub pre-release
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
notes=$(cat windows/RELEASE_NOTES.md 2>/dev/null || echo "Windows beta ${{ steps.version.outputs.version }}")
|
|
||||||
gh release create "$GITHUB_REF_NAME" ClaudeChecker-Installer.exe \
|
|
||||||
--title "$GITHUB_REF_NAME" \
|
|
||||||
--prerelease \
|
|
||||||
--notes "$notes"
|
|
||||||
|
|
||||||
- name: Update version-windows-beta.json on main
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
notes=$(cat windows/RELEASE_NOTES.md 2>/dev/null || echo "Windows beta ${{ steps.version.outputs.version }}")
|
|
||||||
content=$(jq -n \
|
|
||||||
--arg version "${{ steps.version.outputs.version }}" \
|
|
||||||
--arg url "https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/ClaudeChecker-Installer.exe" \
|
|
||||||
--arg notes "$notes" \
|
|
||||||
'{version: $version, url: $url, notes: $notes}' | base64 -w0)
|
|
||||||
sha=$(gh api "repos/${{ github.repository }}/contents/version-windows-beta.json?ref=main" --jq .sha 2>/dev/null || echo "")
|
|
||||||
if [ -n "$sha" ]; then
|
|
||||||
gh api --method PUT "repos/${{ github.repository }}/contents/version-windows-beta.json" \
|
|
||||||
--field "message=Windows beta release ${{ github.ref_name }}" \
|
|
||||||
--field "content=$content" \
|
|
||||||
--field "branch=main" \
|
|
||||||
--field "sha=$sha"
|
|
||||||
else
|
|
||||||
gh api --method PUT "repos/${{ github.repository }}/contents/version-windows-beta.json" \
|
|
||||||
--field "message=Windows beta release ${{ github.ref_name }}" \
|
|
||||||
--field "content=$content" \
|
|
||||||
--field "branch=main"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Update Windows beta badge in README on main
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
version="${{ steps.version.outputs.version }}"
|
|
||||||
tag="${{ github.ref_name }}"
|
|
||||||
shields_version=$(echo "$version" | sed 's/-/--/g')
|
|
||||||
export WIN_BADGE="[](https://github.com/${{ github.repository }}/releases/tag/${tag}) <!-- WIN_BETA_BADGE -->"
|
|
||||||
sha=$(gh api "repos/${{ github.repository }}/contents/README.md?ref=main" --jq .sha)
|
|
||||||
content=$(gh api "repos/${{ github.repository }}/contents/README.md?ref=main" --jq .content | python3 -c "
|
|
||||||
import sys, base64, os
|
|
||||||
raw = sys.stdin.read().strip()
|
|
||||||
text = base64.b64decode(raw).decode()
|
|
||||||
badge = os.environ['WIN_BADGE']
|
|
||||||
lines = text.splitlines(keepends=True)
|
|
||||||
out = [badge + chr(10) if '<!-- WIN_BETA_BADGE -->' in line else line for line in lines]
|
|
||||||
print(base64.b64encode(''.join(out).encode()).decode(), end='')
|
|
||||||
")
|
|
||||||
gh api --method PUT "repos/${{ github.repository }}/contents/README.md" \
|
|
||||||
--field "message=Windows beta badge $tag" \
|
|
||||||
--field "content=$content" \
|
|
||||||
--field "branch=main" \
|
|
||||||
--field "sha=$sha"
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
name: Release Windows
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'win-v[0-9]*'
|
|
||||||
- '!win-v*-*'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-windows:
|
|
||||||
runs-on: windows-latest
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup .NET
|
|
||||||
uses: actions/setup-dotnet@v4
|
|
||||||
with:
|
|
||||||
dotnet-version: '8.0.x'
|
|
||||||
|
|
||||||
- name: Get version from tag
|
|
||||||
id: version
|
|
||||||
shell: bash
|
|
||||||
run: echo "version=${GITHUB_REF_NAME#win-v}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Publish
|
|
||||||
run: |
|
|
||||||
dotnet publish windows/ClaudeCheckerWindows.csproj `
|
|
||||||
-c Release -r win-x64 `
|
|
||||||
--self-contained true `
|
|
||||||
-p:PublishSingleFile=true `
|
|
||||||
-p:Version=${{ steps.version.outputs.version }} `
|
|
||||||
-o publish
|
|
||||||
|
|
||||||
- name: Build installer
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
Copy-Item -Recurse windows/Assets publish/Assets
|
|
||||||
& "C:\Program Files (x86)\Inno Setup 6\iscc.exe" /DAppVersion="${{ steps.version.outputs.version }}" windows\installer.iss
|
|
||||||
|
|
||||||
- name: Create GitHub release
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
notes=$(cat windows/RELEASE_NOTES.md 2>/dev/null || echo "Windows release ${{ steps.version.outputs.version }}")
|
|
||||||
gh release create "$GITHUB_REF_NAME" ClaudeChecker-Installer.exe \
|
|
||||||
--title "$GITHUB_REF_NAME" \
|
|
||||||
--notes "$notes"
|
|
||||||
|
|
||||||
- name: Update version-windows.json on main
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
notes=$(cat windows/RELEASE_NOTES.md 2>/dev/null || echo "Windows release ${{ steps.version.outputs.version }}")
|
|
||||||
content=$(jq -n \
|
|
||||||
--arg version "${{ steps.version.outputs.version }}" \
|
|
||||||
--arg url "https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/ClaudeChecker-Installer.exe" \
|
|
||||||
--arg notes "$notes" \
|
|
||||||
'{version: $version, url: $url, notes: $notes}' | base64 -w0)
|
|
||||||
sha=$(gh api "repos/${{ github.repository }}/contents/version-windows.json?ref=main" --jq .sha 2>/dev/null || echo "")
|
|
||||||
if [ -n "$sha" ]; then
|
|
||||||
gh api --method PUT "repos/${{ github.repository }}/contents/version-windows.json" \
|
|
||||||
--field "message=Windows release ${{ github.ref_name }}" \
|
|
||||||
--field "content=$content" \
|
|
||||||
--field "branch=main" \
|
|
||||||
--field "sha=$sha"
|
|
||||||
else
|
|
||||||
gh api --method PUT "repos/${{ github.repository }}/contents/version-windows.json" \
|
|
||||||
--field "message=Windows release ${{ github.ref_name }}" \
|
|
||||||
--field "content=$content" \
|
|
||||||
--field "branch=main"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Update Windows stable badge in README on main
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
version="${{ steps.version.outputs.version }}"
|
|
||||||
tag="${{ github.ref_name }}"
|
|
||||||
shields_version=$(echo "$version" | sed 's/-/--/g')
|
|
||||||
export WIN_STABLE_BADGE="[](https://github.com/${{ github.repository }}/releases/tag/${tag}) <!-- WIN_STABLE_BADGE -->"
|
|
||||||
sha=$(gh api "repos/${{ github.repository }}/contents/README.md?ref=main" --jq .sha)
|
|
||||||
content=$(gh api "repos/${{ github.repository }}/contents/README.md?ref=main" --jq .content | python3 -c "
|
|
||||||
import sys, base64, os
|
|
||||||
raw = sys.stdin.read().strip()
|
|
||||||
text = base64.b64decode(raw).decode()
|
|
||||||
stable_badge = os.environ['WIN_STABLE_BADGE']
|
|
||||||
lines = text.splitlines(keepends=True)
|
|
||||||
out = []
|
|
||||||
for line in lines:
|
|
||||||
if '<!-- WIN_STABLE_BADGE -->' in line:
|
|
||||||
out.append(stable_badge + chr(10))
|
|
||||||
rest = line.replace(' <!-- WIN_STABLE_BADGE -->', '').replace('<!-- WIN_STABLE_BADGE -->', '')
|
|
||||||
if rest.strip() and '<!-- WIN_BETA_BADGE -->' in rest:
|
|
||||||
out.append('<!-- WIN_BETA_BADGE -->' + chr(10))
|
|
||||||
elif rest.strip():
|
|
||||||
out.append(rest)
|
|
||||||
elif '<!-- WIN_BETA_BADGE -->' in line:
|
|
||||||
out.append('<!-- WIN_BETA_BADGE -->' + chr(10))
|
|
||||||
else:
|
|
||||||
out.append(line)
|
|
||||||
print(base64.b64encode(''.join(out).encode()).decode(), end='')
|
|
||||||
")
|
|
||||||
gh api --method PUT "repos/${{ github.repository }}/contents/README.md" \
|
|
||||||
--field "message=Windows stable badge $tag" \
|
|
||||||
--field "content=$content" \
|
|
||||||
--field "branch=main" \
|
|
||||||
--field "sha=$sha"
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
name: Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
if: ${{ !contains(github.ref_name, '-') }}
|
|
||||||
runs-on: macos-latest
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get version from tag
|
|
||||||
id: version
|
|
||||||
run: echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: |
|
|
||||||
xcodebuild \
|
|
||||||
-project ClaudeChecker.xcodeproj \
|
|
||||||
-scheme ClaudeChecker \
|
|
||||||
-configuration Release \
|
|
||||||
-derivedDataPath build \
|
|
||||||
clean build
|
|
||||||
|
|
||||||
- name: Zip app
|
|
||||||
run: |
|
|
||||||
ditto -c -k --keepParent \
|
|
||||||
build/Build/Products/Release/ClaudeChecker.app \
|
|
||||||
ClaudeChecker.zip
|
|
||||||
|
|
||||||
- name: Compute SHA256
|
|
||||||
id: sha
|
|
||||||
run: echo "sha256=$(shasum -a 256 ClaudeChecker.zip | awk '{print $1}')" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Create GitHub release
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
gh release create "$GITHUB_REF_NAME" ClaudeChecker.zip \
|
|
||||||
--title "$GITHUB_REF_NAME" \
|
|
||||||
--notes "$(cat RELEASE_NOTES.md 2>/dev/null || echo 'Release ${{ steps.version.outputs.version }}')"
|
|
||||||
|
|
||||||
- name: Update version.json
|
|
||||||
run: |
|
|
||||||
notes=$(cat RELEASE_NOTES.md 2>/dev/null || echo "Release ${{ steps.version.outputs.version }}")
|
|
||||||
jq -n \
|
|
||||||
--arg version "${{ steps.version.outputs.version }}" \
|
|
||||||
--arg url "https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/ClaudeChecker.zip" \
|
|
||||||
--arg notes "$notes" \
|
|
||||||
'{version: $version, url: $url, notes: $notes}' > version.json
|
|
||||||
|
|
||||||
- name: Update Homebrew cask
|
|
||||||
run: |
|
|
||||||
sed -i '' \
|
|
||||||
-e 's/version "[^"]*"/version "${{ steps.version.outputs.version }}"/' \
|
|
||||||
-e 's/sha256 "[^"]*"/sha256 "${{ steps.sha.outputs.sha256 }}"/' \
|
|
||||||
../homebrew-tap/Casks/claudechecker.rb 2>/dev/null || true
|
|
||||||
|
|
||||||
- name: Update README badge
|
|
||||||
env:
|
|
||||||
NEW_VERSION: ${{ steps.version.outputs.version }}
|
|
||||||
run: |
|
|
||||||
python3 -c "
|
|
||||||
import os, re
|
|
||||||
v = os.environ['NEW_VERSION']
|
|
||||||
content = open('README.md').read()
|
|
||||||
content = re.sub(r'version-[0-9][^-]*-orange', 'version-' + v + '-orange', content)
|
|
||||||
lines = content.splitlines(keepends=True)
|
|
||||||
out = []
|
|
||||||
for line in lines:
|
|
||||||
if '<!-- BETA_BADGE -->' in line:
|
|
||||||
continue
|
|
||||||
out.append(line)
|
|
||||||
if 'license-MIT-blue' in line:
|
|
||||||
out.append('<!-- BETA_BADGE -->' + chr(10))
|
|
||||||
open('README.md', 'w').writelines(out)
|
|
||||||
"
|
|
||||||
|
|
||||||
- name: Commit version.json and README
|
|
||||||
run: |
|
|
||||||
git config user.name "github-actions[bot]"
|
|
||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
||||||
git add version.json README.md
|
|
||||||
git commit -m "Release ${{ github.ref_name }}"
|
|
||||||
git pull --rebase origin main
|
|
||||||
git push origin HEAD:main
|
|
||||||
|
|
||||||
- name: Update Homebrew tap
|
|
||||||
env:
|
|
||||||
TAP_TOKEN: ${{ secrets.TAP_TOKEN }}
|
|
||||||
run: |
|
|
||||||
git clone https://x-access-token:${{ secrets.TAP_TOKEN }}@github.com/${{ github.repository_owner }}/homebrew-tap /tmp/homebrew-tap
|
|
||||||
sed -i '' \
|
|
||||||
-e 's/version "[^"]*"/version "${{ steps.version.outputs.version }}"/' \
|
|
||||||
-e 's/sha256 "[^"]*"/sha256 "${{ steps.sha.outputs.sha256 }}"/' \
|
|
||||||
/tmp/homebrew-tap/Casks/claudechecker.rb
|
|
||||||
cd /tmp/homebrew-tap
|
|
||||||
git config user.name "github-actions[bot]"
|
|
||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
||||||
git add Casks/claudechecker.rb
|
|
||||||
git commit -m "Update claudechecker to ${{ github.ref_name }}"
|
|
||||||
git push
|
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
VerticalAlignment="Center" Text="Waiting for sign-in…"/>
|
VerticalAlignment="Center" Text="Waiting for sign-in…"/>
|
||||||
<Button Grid.Column="1" Content="Done — I'm signed in"
|
<Button Grid.Column="1" Content="Done — I'm signed in"
|
||||||
Style="{StaticResource PrimaryButton}" Click="Done_Click"
|
Style="{StaticResource PrimaryButton}" Click="Done_Click"
|
||||||
x:Name="DoneButton" IsEnabled="False"/>
|
x:Name="DoneButton"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -33,13 +33,11 @@ public partial class LoginWindow : Window
|
|||||||
|
|
||||||
var cookies = await Browser.CoreWebView2.CookieManager.GetCookiesAsync("https://claude.ai");
|
var cookies = await Browser.CoreWebView2.CookieManager.GetCookiesAsync("https://claude.ai");
|
||||||
var signedIn = System.Linq.Enumerable.Any(cookies, c =>
|
var signedIn = System.Linq.Enumerable.Any(cookies, c =>
|
||||||
c.Name.Equals("sessionKey", System.StringComparison.OrdinalIgnoreCase) ||
|
c.Domain.Contains("claude.ai") || c.Domain.Contains("anthropic.com"));
|
||||||
c.Name.StartsWith("sk-ant", System.StringComparison.OrdinalIgnoreCase));
|
|
||||||
|
|
||||||
await Dispatcher.InvokeAsync(() =>
|
await Dispatcher.InvokeAsync(() =>
|
||||||
{
|
{
|
||||||
DoneButton.IsEnabled = !uri.Contains("/login") && !uri.Contains("/signin");
|
StatusText.Text = signedIn && !uri.Contains("/login") && !uri.Contains("/signin")
|
||||||
StatusText.Text = signedIn
|
|
||||||
? "Signed in — click Done to continue."
|
? "Signed in — click Done to continue."
|
||||||
: "Complete sign-in, then click Done.";
|
: "Complete sign-in, then click Done.";
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -495,13 +495,21 @@ public partial class PopupWindow : Window
|
|||||||
|
|
||||||
private void CopyDiag_Click(object s, RoutedEventArgs e)
|
private void CopyDiag_Click(object s, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var diagText = BuildDiagText();
|
try
|
||||||
for (int i = 0; i < 5; i++)
|
|
||||||
{
|
{
|
||||||
try { Clipboard.SetText(diagText); break; }
|
// SetDataObject(data, false) skips Flush() — avoids CLIPBRD_E_CANT_OPEN crash
|
||||||
catch (Exception) { System.Threading.Thread.Sleep(100); }
|
var diagText = BuildDiagText();
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
try { Clipboard.SetDataObject(diagText, false); break; }
|
||||||
|
catch (Exception) { System.Threading.Thread.Sleep(100); }
|
||||||
|
}
|
||||||
|
CopyDiagButton.Content = "Copied! (IDs redacted)";
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
CopyDiagButton.Content = "Copy failed";
|
||||||
}
|
}
|
||||||
CopyDiagButton.Content = "Copied! (IDs redacted)";
|
|
||||||
var t = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1.5) };
|
var t = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1.5) };
|
||||||
t.Tick += (_, _) => { CopyDiagButton.Content = "Copy All"; t.Stop(); };
|
t.Tick += (_, _) => { CopyDiagButton.Content = "Copy All"; t.Stop(); };
|
||||||
t.Start();
|
t.Start();
|
||||||
@@ -700,7 +708,9 @@ public partial class PopupWindow : Window
|
|||||||
|
|
||||||
_ = Task.Run(async () =>
|
_ = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await Task.Delay(3000);
|
// Re-navigate background browser with fresh session, then refresh immediately
|
||||||
|
await Application.Current.Dispatcher.InvokeAsync(
|
||||||
|
() => App.BackgroundBrowser.ReloadAsync()).Task.Unwrap();
|
||||||
await VM.RefreshAsync();
|
await VM.RefreshAsync();
|
||||||
await Application.Current.Dispatcher.InvokeAsync(InitSettings);
|
await Application.Current.Dispatcher.InvokeAsync(InitSettings);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,23 +1,5 @@
|
|||||||
## What's new in beta.49
|
## What's new in beta.63
|
||||||
|
|
||||||
### Architecture
|
|
||||||
- All data (usage, plan, overage, prepaid credits) now fetched via the persistent background WebView2 — the same always-live session as the macOS app, so Cloudflare cookies never expire between refreshes
|
|
||||||
- HttpClient path kept only as a brief startup fallback before the browser is ready
|
|
||||||
- Settings file simplified: only stores session signal, burn history, and user preferences — no more cached API responses
|
|
||||||
|
|
||||||
### Bug fixes
|
### Bug fixes
|
||||||
- Plan label (e.g. "Pro") now updates on every refresh, not just at login
|
- After signing in, usage data now loads immediately instead of waiting 3 seconds
|
||||||
- Extra Usage Credits values now correct (were 100× too large)
|
- Background browser re-navigates to claude.ai right after login so the live session is ready for the first refresh
|
||||||
- Limit and balance now update live on every refresh
|
|
||||||
- Refresh interval dropdown now shows "1 min", "2 min" etc. correctly
|
|
||||||
- ComboBox no longer flashes bright blue when clicked
|
|
||||||
- Buttons now show a visible pressed state
|
|
||||||
- Footer "Updated X ago" counter now ticks every second; shows "X min, Y sec ago" past 60 s
|
|
||||||
- Removed stray sparkline bars from the 5 h and 7 d limit cards
|
|
||||||
- App window now shown on launch
|
|
||||||
|
|
||||||
### UI improvements
|
|
||||||
- Gauge percentage larger, "used" label removed
|
|
||||||
- Each limit card now shows an "after reset" or "today HH:MM" badge
|
|
||||||
- Session Diary card redesigned to match macOS layout (stats row + sparkline, no Claude header)
|
|
||||||
- Reset date moved inline with time remaining
|
|
||||||
|
|||||||
@@ -129,6 +129,20 @@ public sealed class WebViewFetchWindow : Window
|
|||||||
return await tcs.Task;
|
return await tcs.Task;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Re-navigate to claude.ai with the current session (call after sign-in).
|
||||||
|
public async Task ReloadAsync()
|
||||||
|
{
|
||||||
|
if (_wv.CoreWebView2 == null) { await InitAsync(); return; }
|
||||||
|
_readyForScript = false;
|
||||||
|
var navDone = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
|
EventHandler<CoreWebView2NavigationCompletedEventArgs>? h = null;
|
||||||
|
h = (_, e) => { _wv.CoreWebView2.NavigationCompleted -= h; navDone.TrySetResult(e.IsSuccess); };
|
||||||
|
_wv.CoreWebView2.NavigationCompleted += h;
|
||||||
|
_wv.CoreWebView2.Navigate("https://claude.ai");
|
||||||
|
await Task.WhenAny(navDone.Task, Task.Delay(15000));
|
||||||
|
_readyForScript = navDone.Task.IsCompletedSuccessfully && navDone.Task.Result;
|
||||||
|
}
|
||||||
|
|
||||||
// ── Shared init ───────────────────────────────────────────────────────────
|
// ── Shared init ───────────────────────────────────────────────────────────
|
||||||
|
|
||||||
private int _initGuard;
|
private int _initGuard;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ DefaultDirName={localappdata}\ClaudeChecker
|
|||||||
DefaultGroupName=ClaudeChecker
|
DefaultGroupName=ClaudeChecker
|
||||||
DisableProgramGroupPage=yes
|
DisableProgramGroupPage=yes
|
||||||
PrivilegesRequired=lowest
|
PrivilegesRequired=lowest
|
||||||
OutputDir=..
|
OutputDir=.
|
||||||
OutputBaseFilename=ClaudeChecker-Installer
|
OutputBaseFilename=ClaudeChecker-Installer
|
||||||
Compression=lzma
|
Compression=lzma
|
||||||
SolidCompression=yes
|
SolidCompression=yes
|
||||||
@@ -28,12 +28,11 @@ Name: "english"; MessagesFile: "compiler:Default.isl"
|
|||||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||||
|
|
||||||
[Files]
|
[Files]
|
||||||
Source: "publish\ClaudeChecker.exe"; DestDir: "{app}"; Flags: ignoreversion
|
Source: "publish\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
|
||||||
Source: "publish\Assets\*"; DestDir: "{app}\Assets"; Flags: ignoreversion recursesubdirs
|
|
||||||
|
|
||||||
[Icons]
|
[Icons]
|
||||||
Name: "{group}\ClaudeChecker"; Filename: "{app}\ClaudeChecker.exe"
|
Name: "{group}\ClaudeChecker"; Filename: "{app}\ClaudeChecker.exe"
|
||||||
Name: "{commondesktop}\ClaudeChecker"; Filename: "{app}\ClaudeChecker.exe"; Tasks: desktopicon
|
Name: "{userdesktop}\ClaudeChecker"; Filename: "{app}\ClaudeChecker.exe"; Tasks: desktopicon
|
||||||
|
|
||||||
[Run]
|
[Run]
|
||||||
; Silent install (auto-update): launch automatically
|
; Silent install (auto-update): launch automatically
|
||||||
|
|||||||
Reference in New Issue
Block a user