Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1078951c43 | ||
|
|
ed6a5e1b51 | ||
|
|
8701fb1326 | ||
|
|
247b5fc202 | ||
|
|
255de797f8 | ||
|
|
0046c53283 | ||
|
|
8d222d63f0 | ||
|
|
5720370649 | ||
|
|
0843730ae1 | ||
|
|
9c030fcdd5 | ||
|
|
dd68ff39d6 |
@@ -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: |
|
||||||
|
|||||||
@@ -977,6 +977,36 @@ struct UpdateSuccessBanner: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Markdown notes renderer
|
||||||
|
|
||||||
|
struct ReleaseNotesText: View {
|
||||||
|
let text: String
|
||||||
|
var font: Font = .system(size: 12)
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
let processed = text
|
||||||
|
.split(separator: "\n", omittingEmptySubsequences: false)
|
||||||
|
.map { line -> String in
|
||||||
|
let s = String(line)
|
||||||
|
if s.hasPrefix("### ") { return "**\(s.dropFirst(4))**" }
|
||||||
|
if s.hasPrefix("## ") { return "**\(s.dropFirst(3))**" }
|
||||||
|
if s.hasPrefix("# ") { return "**\(s.dropFirst(2))**" }
|
||||||
|
if s.hasPrefix("- ") { return "• \(s.dropFirst(2))" }
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
.joined(separator: "\n")
|
||||||
|
|
||||||
|
if let attr = try? AttributedString(markdown: processed,
|
||||||
|
options: .init(interpretedSyntax: .inlineOnlyPreservingWhitespace)) {
|
||||||
|
Text(attr).font(font).foregroundColor(.secondary)
|
||||||
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
|
} else {
|
||||||
|
Text(text).font(font).foregroundColor(.secondary)
|
||||||
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Update Banner
|
// MARK: - Update Banner
|
||||||
|
|
||||||
struct UpdateBanner: View {
|
struct UpdateBanner: View {
|
||||||
@@ -992,10 +1022,7 @@ struct UpdateBanner: View {
|
|||||||
Text("Update available — v\(updater.latestVersion)")
|
Text("Update available — v\(updater.latestVersion)")
|
||||||
.font(.system(size: 12, weight: .semibold))
|
.font(.system(size: 12, weight: .semibold))
|
||||||
if !updater.releaseNotes.isEmpty {
|
if !updater.releaseNotes.isEmpty {
|
||||||
Text(updater.releaseNotes)
|
ReleaseNotesText(text: updater.releaseNotes, font: .system(size: 11))
|
||||||
.font(.system(size: 11))
|
|
||||||
.foregroundColor(.secondary)
|
|
||||||
.fixedSize(horizontal: false, vertical: true)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Spacer()
|
Spacer()
|
||||||
@@ -1061,9 +1088,7 @@ struct UpdateSheet: View {
|
|||||||
.foregroundColor(.blue)
|
.foregroundColor(.blue)
|
||||||
}
|
}
|
||||||
if !updater.releaseNotes.isEmpty {
|
if !updater.releaseNotes.isEmpty {
|
||||||
Text(updater.releaseNotes)
|
ReleaseNotesText(text: updater.releaseNotes)
|
||||||
.font(.system(size: 12))
|
|
||||||
.foregroundColor(.secondary)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|||||||
@@ -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.4</string>
|
<string>1.0.9</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>23</string>
|
<string>28</string>
|
||||||
<key>LSMinimumSystemVersion</key>
|
<key>LSMinimumSystemVersion</key>
|
||||||
<string>13.0</string>
|
<string>13.0</string>
|
||||||
<key>LSUIElement</key>
|
<key>LSUIElement</key>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class UpdateNotificationWindowController: NSWindowController {
|
|||||||
|
|
||||||
// Called when a new update is detected while running
|
// Called when a new update is detected while running
|
||||||
static func showUpdate(version: String, notes: String, near statusItem: NSStatusItem?) {
|
static func showUpdate(version: String, notes: String, near statusItem: NSStatusItem?) {
|
||||||
showWindow(version: version, subtitle: notes.isEmpty ? "Tap to update now." : notes, near: statusItem, isUpdate: true)
|
showWindow(version: version, subtitle: "Tap to view release notes & update now!", near: statusItem, isUpdate: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
static func showLimitWarning(windowName: String, percent: Int, near statusItem: NSStatusItem?) {
|
static func showLimitWarning(windowName: String, percent: Int, near statusItem: NSStatusItem?) {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
[](https://www.apple.com/macos/)
|
[](https://www.apple.com/macos/)
|
||||||
[](https://swift.org)
|
[](https://swift.org)
|
||||||
[](https://github.com/superdooper86/claudechecker/releases)
|
[](https://github.com/superdooper86/claudechecker/releases)
|
||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+3
-8
@@ -1,9 +1,4 @@
|
|||||||
## What's new in v1.0.4
|
## What's new in v1.0.9
|
||||||
|
|
||||||
### Clickable notifications
|
### Fixed update notification popup
|
||||||
Notifications are now interactive — tap to act, not just read:
|
The notification popup now correctly shows **"Tap to view release notes & update now!"** instead of the raw markdown release notes text.
|
||||||
|
|
||||||
- **Limit warnings & resets** (80%, 95%, reset) — tapping the notification opens the main ClaudeChecker window so you can see your current usage at a glance
|
|
||||||
- **Update available** — tapping the notification opens the main window with the update sheet already showing, so you can install in one click
|
|
||||||
|
|
||||||
Previously notifications were display-only and required manually clicking the menubar icon to take action. This removes that friction.
|
|
||||||
|
|||||||
+3
-3
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"version": "1.0.3",
|
"version": "1.0.8",
|
||||||
"url": "https://github.com/superdooper86/claudechecker/releases/download/v1.0.3/ClaudeChecker.zip",
|
"url": "https://github.com/superdooper86/claudechecker/releases/download/v1.0.8/ClaudeChecker.zip",
|
||||||
"notes": "Release 1.0.3"
|
"notes": "## What's new in v1.0.8\n\n### Release notes now render correctly\nFixed markdown rendering in the update banner and update sheet — headers, **bold text**, and bullet points now display properly instead of showing raw `##` and `**` characters."
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user