Compare commits

...
10 Commits
Author SHA1 Message Date
superdooper86 8d222d63f0 Release v1.0.6 — improve update notification subtitle
Change notification prompt to "Tap to view release notes & update now!"
2026-05-07 17:38:34 +02:00
github-actions[bot] 5720370649 Release v1.0.5 2026-05-07 15:31:00 +00:00
superdooper86 0843730ae1 Release v1.0.5 — fix markdown rendering in release notes
Use Text(.init()) to parse markdown in update sheet and banner.
Notification popup now shows a fixed subtitle instead of raw notes.
2026-05-07 17:29:29 +02:00
superdooper86 9c030fcdd5 Fix version.json containing invalid JSON (literal newlines in notes)
Use jq to build version.json so multiline release notes are properly
escaped as \n sequences. Also fix current version.json for v1.0.4.
2026-05-07 17:22:57 +02:00
github-actions[bot] dd68ff39d6 Release v1.0.4 2026-05-07 15:16:04 +00:00
superdooper86 b76bdf3bc1 Release v1.0.4 — clickable notifications
Notifications are now interactive: limit warnings and resets open the
main window on tap; update notifications open the update sheet directly.

Bump version to 1.0.4 (build 23).
2026-05-07 17:14:29 +02:00
github-actions[bot] c31950fd76 Release v1.0.3 2026-05-07 15:09:05 +00:00
superdooper86 4e6ae21825 Bump version to 1.0.3 2026-05-07 17:08:12 +02:00
superdooper86 c0bf2e4873 Clickable notifications — limit opens popover, update opens update sheet 2026-05-07 17:07:17 +02:00
github-actions[bot] 081d4804ab Release v1.0.2 2026-05-07 15:02:07 +00:00
8 changed files with 71 additions and 40 deletions
+6 -7
View File
@@ -50,13 +50,12 @@ jobs:
- name: Update version.json - name: Update version.json
run: | run: |
cat > version.json << JSON notes=$(cat RELEASE_NOTES.md 2>/dev/null || echo "Release ${{ steps.version.outputs.version }}")
{ jq -n \
"version": "${{ steps.version.outputs.version }}", --arg version "${{ steps.version.outputs.version }}" \
"url": "https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/ClaudeChecker.zip", --arg url "https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/ClaudeChecker.zip" \
"notes": "$(cat RELEASE_NOTES.md 2>/dev/null || echo 'Release ${{ steps.version.outputs.version }}')" --arg notes "$notes" \
} '{version: $version, url: $url, notes: $notes}' > version.json
JSON
- name: Update Homebrew cask - name: Update Homebrew cask
run: | run: |
+4
View File
@@ -94,6 +94,10 @@ struct ContentView: View {
} }
.frame(width: 480) .frame(width: 480)
.animation(.easeInOut(duration: 0.2), value: showSettings) .animation(.easeInOut(duration: 0.2), value: showSettings)
.onReceive(NotificationCenter.default.publisher(for: .openUpdateSheet)) { _ in
showSettings = false
showUpdateSheet = true
}
.sheet(isPresented: $showLogin) { .sheet(isPresented: $showLogin) {
LoginSheetView(isPresented: $showLogin) { LoginSheetView(isPresented: $showLogin) {
Task { await vm.refresh() } Task { await vm.refresh() }
+2 -2
View File
@@ -15,9 +15,9 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.0.2</string> <string>1.0.6</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>21</string> <string>25</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>13.0</string> <string>13.0</string>
<key>LSUIElement</key> <key>LSUIElement</key>
+50 -27
View File
@@ -39,7 +39,12 @@ class UpdateNotificationWindowController: NSWindowController {
sharedLimit?.close() sharedLimit?.close()
let content = UpdateNotificationView( let content = UpdateNotificationView(
version: "", subtitle: subtitle, isUpdate: false, version: "", subtitle: subtitle, isUpdate: false,
titleText: title, badgeIcon: badgeIcon, badgeColor: badgeColor titleText: title, badgeIcon: badgeIcon, badgeColor: badgeColor,
onTap: {
sharedLimit?.close()
sharedLimit = nil
NotificationCenter.default.post(name: .showPopover, object: nil)
}
) { ) {
sharedLimit?.close() sharedLimit?.close()
sharedLimit = nil sharedLimit = nil
@@ -53,7 +58,16 @@ class UpdateNotificationWindowController: NSWindowController {
private static func showWindow(version: String, subtitle: String, near statusItem: NSStatusItem?, isUpdate: Bool) { private static func showWindow(version: String, subtitle: String, near statusItem: NSStatusItem?, isUpdate: Bool) {
shared?.close() shared?.close()
let content = UpdateNotificationView(version: version, subtitle: subtitle, isUpdate: isUpdate) { let content = UpdateNotificationView(version: version, subtitle: subtitle, isUpdate: isUpdate,
onTap: {
shared?.close()
shared = nil
NotificationCenter.default.post(name: .showPopover, object: nil)
if isUpdate {
NotificationCenter.default.post(name: .openUpdateSheet, object: nil)
}
}
) {
shared?.close() shared?.close()
shared = nil shared = nil
} }
@@ -129,6 +143,7 @@ struct UpdateNotificationView: View {
var titleText: String? = nil var titleText: String? = nil
var badgeIcon: String? = nil var badgeIcon: String? = nil
var badgeColor: Color? = nil var badgeColor: Color? = nil
var onTap: (() -> Void)? = nil
let onDismiss: () -> Void let onDismiss: () -> Void
private var effectiveTitle: String { private var effectiveTitle: String {
@@ -142,30 +157,40 @@ struct UpdateNotificationView: View {
} }
var body: some View { var body: some View {
HStack(spacing: 12) { ZStack(alignment: .topTrailing) {
ZStack(alignment: .bottomTrailing) { Button(action: { onTap?() }) {
Image(nsImage: NSImage(named: "AppIcon") ?? NSImage()) HStack(spacing: 12) {
.resizable() ZStack(alignment: .bottomTrailing) {
.frame(width: 44, height: 44) Image(nsImage: NSImage(named: "AppIcon") ?? NSImage())
.cornerRadius(10) .resizable()
.frame(width: 44, height: 44)
.cornerRadius(10)
Image(systemName: effectiveBadgeIcon) Image(systemName: effectiveBadgeIcon)
.font(.system(size: 16, weight: .semibold)) .font(.system(size: 16, weight: .semibold))
.foregroundColor(effectiveBadgeColor) .foregroundColor(effectiveBadgeColor)
.background(Color(nsColor: .windowBackgroundColor).clipShape(Circle())) .background(Color(nsColor: .windowBackgroundColor).clipShape(Circle()))
.offset(x: 4, y: 4) .offset(x: 4, y: 4)
}
VStack(alignment: .leading, spacing: 3) {
Text(effectiveTitle)
.font(.system(size: 13, weight: .semibold))
.foregroundColor(.primary)
Text(subtitle)
.font(.system(size: 11))
.foregroundColor(.secondary)
.fixedSize(horizontal: false, vertical: true)
}
Spacer(minLength: 24)
}
.padding(.horizontal, 14)
.padding(.vertical, 14)
.frame(width: 340, alignment: .leading)
.contentShape(Rectangle())
} }
.buttonStyle(.plain)
VStack(alignment: .leading, spacing: 3) {
Text(effectiveTitle)
.font(.system(size: 13, weight: .semibold))
Text(subtitle)
.font(.system(size: 11))
.foregroundColor(.secondary)
.fixedSize(horizontal: false, vertical: true)
}
Spacer(minLength: 8)
Button(action: onDismiss) { Button(action: onDismiss) {
Image(systemName: "xmark") Image(systemName: "xmark")
@@ -173,10 +198,8 @@ struct UpdateNotificationView: View {
.foregroundColor(.secondary) .foregroundColor(.secondary)
} }
.buttonStyle(.plain) .buttonStyle(.plain)
.padding(14)
} }
.padding(.horizontal, 14)
.padding(.vertical, 14)
.frame(width: 340, alignment: .leading)
.background( .background(
RoundedRectangle(cornerRadius: 13) RoundedRectangle(cornerRadius: 13)
.fill(Color(nsColor: .windowBackgroundColor)) .fill(Color(nsColor: .windowBackgroundColor))
+1
View File
@@ -310,4 +310,5 @@ extension Notification.Name {
static let updateDetected = Notification.Name("updateDetected") static let updateDetected = Notification.Name("updateDetected")
static let limitWarning = Notification.Name("limitWarning") static let limitWarning = Notification.Name("limitWarning")
static let limitReset = Notification.Name("limitReset") static let limitReset = Notification.Name("limitReset")
static let openUpdateSheet = Notification.Name("openUpdateSheet")
} }
+1 -1
View File
@@ -8,7 +8,7 @@
[![macOS](https://img.shields.io/badge/macOS-13.0+-000000?style=flat&logo=apple&logoColor=white)](https://www.apple.com/macos/) [![macOS](https://img.shields.io/badge/macOS-13.0+-000000?style=flat&logo=apple&logoColor=white)](https://www.apple.com/macos/)
[![Swift](https://img.shields.io/badge/Swift-5.9-F05138?style=flat&logo=swift&logoColor=white)](https://swift.org) [![Swift](https://img.shields.io/badge/Swift-5.9-F05138?style=flat&logo=swift&logoColor=white)](https://swift.org)
[![Version](https://img.shields.io/badge/version-1.0.1-orange?style=flat)](https://github.com/superdooper86/claudechecker/releases) [![Version](https://img.shields.io/badge/version-1.0.5-orange?style=flat)](https://github.com/superdooper86/claudechecker/releases)
[![License](https://img.shields.io/badge/license-MIT-blue?style=flat)](LICENSE) [![License](https://img.shields.io/badge/license-MIT-blue?style=flat)](LICENSE)
</div> </div>
+4
View File
@@ -0,0 +1,4 @@
## What's new in v1.0.6
### Improved update notification
The update notification now reads **"Tap to view release notes & update now!"** — making it clear you can read what's changed before installing.
+3 -3
View File
@@ -1,5 +1,5 @@
{ {
"version": "1.0.1", "version": "1.0.5",
"url": "https://github.com/superdooper86/claudechecker/releases/download/v1.0.1/ClaudeChecker.zip", "url": "https://github.com/superdooper86/claudechecker/releases/download/v1.0.5/ClaudeChecker.zip",
"notes": "Update banner can now be dismissed. Fixes update state not clearing correctly." "notes": "## What's new in v1.0.5\n\n### Release notes now render correctly\nThe update sheet and in-app banner now render markdown formatting in release notes — headers, bold text, and bullet points all display correctly instead of showing raw `##` and `**` characters.\n\nThe update notification popup no longer shows the full release notes text; it shows a concise \"Tap to update now.\" prompt instead, keeping it compact."
} }