Compare commits
33
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e13d3d8ee8 | ||
|
|
a729a37efc | ||
|
|
c7e4c81b9a | ||
|
|
2313c4378a | ||
|
|
c51086c119 | ||
|
|
5840b34b3b | ||
|
|
5a141095e1 | ||
|
|
4b42a631be | ||
|
|
c6d2ed8261 | ||
|
|
747e26e5eb | ||
|
|
b9fd5a27ec | ||
|
|
60336cffa7 | ||
|
|
953c46077c | ||
|
|
3796139178 | ||
|
|
554eb80c0c | ||
|
|
a22bf3a309 | ||
|
|
eaab3eb539 | ||
|
|
323aa174da | ||
|
|
3803cf37f6 | ||
|
|
1977b51b74 | ||
|
|
64a3f15ac5 | ||
|
|
8fbd1c42c3 | ||
|
|
0bf19c3dc8 | ||
|
|
d56a714bb9 | ||
|
|
88f409971a | ||
|
|
9bac2540e8 | ||
|
|
792c5a26e9 | ||
|
|
421727bfb5 | ||
|
|
21b2905bcf | ||
|
|
38d6f2a582 | ||
|
|
7ea5554506 | ||
|
|
87c5992889 | ||
|
|
034e196214 |
@@ -58,7 +58,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
shields_version=$(echo "${{ steps.version.outputs.version }}" | sed 's/-/--/g')
|
shields_version=$(echo "${{ steps.version.outputs.version }}" | sed 's/-/--/g')
|
||||||
tag="${{ github.ref_name }}"
|
tag="${{ github.ref_name }}"
|
||||||
export BADGE="[](https://github.com/${{ github.repository }}/releases/tag/${tag}) <!-- BETA_BADGE -->"
|
export BADGE="[](https://github.com/${{ github.repository }}/releases/tag/${tag}) <!-- BETA_BADGE -->"
|
||||||
python3 -c "
|
python3 -c "
|
||||||
import os
|
import os
|
||||||
badge = os.environ['BADGE']
|
badge = os.environ['BADGE']
|
||||||
@@ -75,5 +75,7 @@ jobs:
|
|||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
git add version-beta.json README.md
|
git add version-beta.json README.md
|
||||||
git commit -m "Beta release ${{ github.ref_name }}"
|
git commit -m "Beta release ${{ github.ref_name }}"
|
||||||
git pull --rebase origin main
|
for i in 1 2 3 4 5; do
|
||||||
git push origin HEAD:main
|
git pull --rebase origin main && git push origin HEAD:main && break
|
||||||
|
echo "Push attempt $i failed, retrying..."; sleep 3
|
||||||
|
done
|
||||||
|
|||||||
@@ -73,15 +73,9 @@ jobs:
|
|||||||
import os, re
|
import os, re
|
||||||
v = os.environ['NEW_VERSION']
|
v = os.environ['NEW_VERSION']
|
||||||
content = open('README.md').read()
|
content = open('README.md').read()
|
||||||
content = re.sub(r'version-[0-9][^-]*-orange', 'version-' + v + '-orange', content)
|
content = re.sub(r'macOS_Stable-[^-]+-orange', 'macOS_Stable-' + v + '-orange', content)
|
||||||
lines = content.splitlines(keepends=True)
|
lines = content.splitlines(keepends=True)
|
||||||
out = []
|
out = ['<!-- BETA_BADGE -->' + chr(10) if '<!-- BETA_BADGE -->' in line else line for line in lines]
|
||||||
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)
|
open('README.md', 'w').writelines(out)
|
||||||
"
|
"
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,15 @@ struct DiagnosticsView: View {
|
|||||||
|
|
||||||
Divider()
|
Divider()
|
||||||
|
|
||||||
|
Text("Org IDs are redacted when copied.")
|
||||||
|
.font(.system(size: 10))
|
||||||
|
.foregroundColor(.secondary)
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
|
.padding(.horizontal, 14)
|
||||||
|
.padding(.vertical, 6)
|
||||||
|
|
||||||
|
Divider()
|
||||||
|
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack(alignment: .leading, spacing: 14) {
|
VStack(alignment: .leading, spacing: 14) {
|
||||||
|
|
||||||
@@ -65,17 +74,6 @@ struct DiagnosticsView: View {
|
|||||||
|
|
||||||
Divider()
|
Divider()
|
||||||
|
|
||||||
// Cookie summary
|
|
||||||
DiagSection(title: "Cookie Store") {
|
|
||||||
DiagRow("Total cookies", "\(vm.diagCookieCount)")
|
|
||||||
DiagRow("claude.ai cookies", "\(vm.diagClaudeCookieCount)")
|
|
||||||
DiagRow("All domains", vm.diagCookieDomains.isEmpty
|
|
||||||
? "(none — never fetched)"
|
|
||||||
: vm.diagCookieDomains.joined(separator: ", "))
|
|
||||||
}
|
|
||||||
|
|
||||||
Divider()
|
|
||||||
|
|
||||||
// Live cookie list
|
// Live cookie list
|
||||||
DiagSection(title: "Live Cookie Names (WKWebsiteDataStore.default)") {
|
DiagSection(title: "Live Cookie Names (WKWebsiteDataStore.default)") {
|
||||||
if loadingCookies {
|
if loadingCookies {
|
||||||
@@ -143,19 +141,25 @@ struct DiagnosticsView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private var fullDiagText: String {
|
private var fullDiagText: String {
|
||||||
|
let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "?"
|
||||||
|
let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "?"
|
||||||
|
let orgId = UserDefaults.standard.string(forKey: "claude_org_id") ?? "(none)"
|
||||||
|
let lastOrg = vm.diagLastActiveOrg.isEmpty ? "(not read)" : vm.diagLastActiveOrg
|
||||||
|
let lastErr = vm.diagLastError.isEmpty ? "(none)" : vm.diagLastError
|
||||||
var lines: [String] = []
|
var lines: [String] = []
|
||||||
lines.append("=== ClaudeChecker Diagnostics ===")
|
lines.append("=== ClaudeChecker Diagnostics ===")
|
||||||
lines.append("Version: \(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "?") (\(Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "?"))")
|
lines.append("Version: \(version) (\(build))")
|
||||||
lines.append("Signed in: \(vm.isSignedIn ? "Yes" : "No")")
|
lines.append("Signed in: \(vm.isSignedIn ? "Yes" : "No")")
|
||||||
lines.append("Email: \(vm.userEmail.isEmpty ? "(none)" : vm.userEmail)")
|
lines.append("Org ID: \(orgId)")
|
||||||
|
lines.append("lastActiveOrg: \(lastOrg)")
|
||||||
lines.append("Error: \(vm.errorMessage ?? "(none)")")
|
lines.append("Error: \(vm.errorMessage ?? "(none)")")
|
||||||
lines.append("")
|
lines.append("")
|
||||||
lines.append("Last path: \(vm.diagLastPath)")
|
lines.append("Last path: \(vm.diagLastPath)")
|
||||||
lines.append("Last status: \(vm.diagLastStatus)")
|
lines.append("Last status: \(vm.diagLastStatus)")
|
||||||
lines.append("Last error: \(vm.diagLastError)")
|
lines.append("Last error: \(lastErr)")
|
||||||
lines.append("Total cookies: \(vm.diagCookieCount)")
|
if let t = vm.diagLastFetch {
|
||||||
lines.append("Claude cookies: \(vm.diagClaudeCookieCount)")
|
lines.append("Time: \(t.formatted(date: .omitted, time: .standard))")
|
||||||
lines.append("Domains: \(vm.diagCookieDomains.joined(separator: ", "))")
|
}
|
||||||
lines.append("")
|
lines.append("")
|
||||||
lines.append("")
|
lines.append("")
|
||||||
lines.append("Live cookies:")
|
lines.append("Live cookies:")
|
||||||
|
|||||||
@@ -15,9 +15,9 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.3.3-beta.1</string>
|
<string>1.3.3-beta.5</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>77</string>
|
<string>81</string>
|
||||||
<key>LSMinimumSystemVersion</key>
|
<key>LSMinimumSystemVersion</key>
|
||||||
<string>13.0</string>
|
<string>13.0</string>
|
||||||
<key>LSUIElement</key>
|
<key>LSUIElement</key>
|
||||||
|
|||||||
@@ -7,10 +7,13 @@
|
|||||||
**A native macOS menubar app for monitoring your Claude AI usage limits in real time.**
|
**A native macOS menubar app for monitoring your Claude AI usage limits in real time.**
|
||||||
|
|
||||||
[](https://www.apple.com/macos/)
|
[](https://www.apple.com/macos/)
|
||||||
|
[](https://www.microsoft.com/windows/)
|
||||||
[](https://swift.org)
|
[](https://swift.org)
|
||||||
[](https://github.com/superdooper86/claudechecker/releases)
|
|
||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
<!-- BETA_BADGE -->
|
<br/>
|
||||||
|
[](https://github.com/superdooper86/claudechecker/releases)
|
||||||
|
[](https://github.com/superdooper86/claudechecker/releases/tag/v1.3.3-beta.3) <!-- BETA_BADGE -->
|
||||||
|
[](https://github.com/superdooper86/claudechecker/releases/tag/win-v0.0.1-beta.55) <!-- WIN_BETA_BADGE -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
+1
-5
@@ -1,5 +1 @@
|
|||||||
{
|
{"version": "1.3.3-beta.3", "url": "https://github.com/superdooper86/claudechecker/releases/download/v1.3.3-beta.3/ClaudeChecker.zip", "notes": "## What's new in v1.3.2\n\n### Reliability\n- Data now loads automatically on every app launch without requiring manual re-authentication. The background WebView is anchored in a hidden window so macOS no longer throttles its JavaScript execution."}
|
||||||
"version": "1.2.1-beta.25",
|
|
||||||
"url": "https://github.com/superdooper86/claudechecker/releases/download/v1.2.1-beta.25/ClaudeChecker.zip",
|
|
||||||
"notes": "## What's new in v1.2.1-beta.18\n\n### Bug fixes\n- Replaced callAsyncJavaScript fetch approach with WebKit navigation: instead of running `fetch()` in the page's JS context (which was returning 401 because it bypasses the SPA's auth interceptors), each API call now navigates the WebView to the API URL directly. WebKit sends full browser headers and cookies automatically at the HTTP layer, the same way a real browser navigation works. This is more reliable regardless of what server-side auth mechanism claude.ai uses.\n- API calls are now sequential to share a single WebView for all navigations\n- Added redirect detection: if WebKit follows a 302 to /login, the response is treated as an auth failure rather than returning HTML to the JSON parser\n\n## What's new in v1.2.1-beta.17\n\n### Bug fixes\n- Fixed \"Not signed in\" after login by adopting the login WebView directly for API calls\n- Added diagnostic error messages for JS errors and unexpected responses\n\n## What's new in v1.2.1\n\n### Bug fixes\n- Fixed WebKit suspending the background WKWebView: anchored in a transparent 1×1 NSWindow\n- Fixed login window auto-closing before sign-in completes\n- Added /api/organizations as a final fallback for org ID resolution\n- Fixed Settings incorrectly showing \"Signed in\" after a failed refresh"
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"version": "0.0.1-beta.51",
|
"version": "0.0.1-beta.55",
|
||||||
"url": "https://github.com/superdooper86/claudechecker/releases/download/win-v0.0.1-beta.51/ClaudeChecker-Windows.zip",
|
"url": "https://github.com/superdooper86/claudechecker/releases/download/win-v0.0.1-beta.55/ClaudeChecker-Windows.zip",
|
||||||
"notes": "## What's new in beta.49\r\n\r\n### Architecture\r\n- 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\r\n- HttpClient path kept only as a brief startup fallback before the browser is ready\r\n- Settings file simplified: only stores session signal, burn history, and user preferences — no more cached API responses\r\n\r\n### Bug fixes\r\n- Plan label (e.g. \"Pro\") now updates on every refresh, not just at login\r\n- Extra Usage Credits values now correct (were 100× too large)\r\n- Limit and balance now update live on every refresh\r\n- Refresh interval dropdown now shows \"1 min\", \"2 min\" etc. correctly\r\n- ComboBox no longer flashes bright blue when clicked\r\n- Buttons now show a visible pressed state\r\n- Footer \"Updated X ago\" counter now ticks every second; shows \"X min, Y sec ago\" past 60 s\r\n- Removed stray sparkline bars from the 5 h and 7 d limit cards\r\n- App window now shown on launch\r\n\r\n### UI improvements\r\n- Gauge percentage larger, \"used\" label removed\r\n- Each limit card now shows an \"after reset\" or \"today HH:MM\" badge\r\n- Session Diary card redesigned to match macOS layout (stats row + sparkline, no Claude header)\r\n- Reset date moved inline with time remaining"
|
"notes": "## What's new in beta.49\r\n\r\n### Architecture\r\n- 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\r\n- HttpClient path kept only as a brief startup fallback before the browser is ready\r\n- Settings file simplified: only stores session signal, burn history, and user preferences — no more cached API responses\r\n\r\n### Bug fixes\r\n- Plan label (e.g. \"Pro\") now updates on every refresh, not just at login\r\n- Extra Usage Credits values now correct (were 100× too large)\r\n- Limit and balance now update live on every refresh\r\n- Refresh interval dropdown now shows \"1 min\", \"2 min\" etc. correctly\r\n- ComboBox no longer flashes bright blue when clicked\r\n- Buttons now show a visible pressed state\r\n- Footer \"Updated X ago\" counter now ticks every second; shows \"X min, Y sec ago\" past 60 s\r\n- Removed stray sparkline bars from the 5 h and 7 d limit cards\r\n- App window now shown on launch\r\n\r\n### UI improvements\r\n- Gauge percentage larger, \"used\" label removed\r\n- Each limit card now shows an \"after reset\" or \"today HH:MM\" badge\r\n- Session Diary card redesigned to match macOS layout (stats row + sparkline, no Claude header)\r\n- Reset date moved inline with time remaining"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user