- Reverted auto-refresh on tray click (fetch only happens on schedule
or manual Refresh button)
- Timestamp now uses TimelineView(.periodic) to auto-update every 30s:
'Just now' → '1m ago' → '5m ago' → etc. without any user action
Co-Authored-By: Claude <noreply@anthropic.com>
- Opening the popover now triggers a fetch (via PollerService.fetchNow
which deduplicates if already in progress)
- 'Just now' now covers 0-60s, then switches to 'Xm ago'.
Avoids the frozen-timer look since the text only updates on re-render.
Co-Authored-By: Claude <noreply@anthropic.com>
Header now always shows: ↻ 2m ago (or 'Never' before first fetch).
Refresh spinner replaces the text while loading. More discoverable
than the bare relative timestamp that was there before.
Co-Authored-By: Claude <noreply@anthropic.com>
- Bug model: added optional 'customer' property
- FieldMappings: added 'customerField' (default: 客户名称)
- BugMapper: reads customer value from configured column
- BugRow: displays customer in blue when present
- Settings: Customer field text field in Field Mappings section
Co-Authored-By: Claude <noreply@anthropic.com>
- Popover footer now has a Quit button (power icon) to terminate the app
- Polling interval picker now includes 1h, 2h, 4h, and 1 day options
Co-Authored-By: Claude <noreply@anthropic.com>
1. Menu bar badge and floating widget now show total active bugs count
(was showing unseen-only count). Unseen dot still works independently
in the bug list rows.
2. Floating widget now shows priority breakdown:
🐜 12 🔴3 🟡4 🔵2 ⚪3
Each priority gets a colored dot + count. Only non-zero priorities shown.
3. Fixed Feishu record URL format: now uses query-parameter deep link
/base/{appToken}?table={tableId}&record={recordId} instead of path
segments, which opens the specific record row directly in Feishu.
Co-Authored-By: Claude <noreply@anthropic.com>
SwiftUI macOS menu bar app for tracking Feishu Bitable bugs:
- Menu bar icon with active bug count badge
- Popover with bug list sorted by priority, click to open in Feishu
- Floating always-on-top widget (NSPanel, optional)
- OAuth 2.0 flow with Feishu Open API (user_access_token + refresh)
- PollerService with configurable interval (default 5 min)
- Diff engine detecting new bugs, status/priority/assignee changes
- Native macOS notifications (UserNotifications framework)
- Keychain-backed token storage
- Settings window with field mapping, polling interval, widget toggle
- Support for custom Bitable column name mappings
- Zero third-party dependencies
17 source files across Models/Services/Views/ViewModels/Utils layers.
Xcode project generated via scripts/generate_xcode_project.py.
Co-Authored-By: Claude <noreply@anthropic.com>