Refresh processes, performance-cpu, performance-memory and power-storage shots to
show the new columns, System Health score, battery panel and time-range trends.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
macOS suppresses an app's own notifications while it is the frontmost app unless
the UNUserNotificationCenter delegate opts in. Set the delegate in AppDelegate and
return [.banner, .sound, .list] from willPresent so High-CPU/health alerts pop as
banners even with the window focused. (Also confirmed notifications require a real
code signature, not the ad-hoc CODE_SIGNING_ALLOWED=NO test build.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Full XCTest suite green (55 tests)
- Visual verification of all tabs (screenshots): Processes (Energy/Disk columns +
live data), Performance (range picker + P/E core charts), Power & Storage
(Health score 55/Fair + battery 97%/114 cycles + preserved System/GPU)
- Ground-truth cross-checks: memory 12.31GB vs 12.53GB reported (16KB pages),
battery vs ioreg/pmset, per-process CPU vs ps, disk vs df — all consistent
- README updated to document new capabilities; testing docs referenced
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- HealthModel (pure): 0-100 score + plain-language diagnosis + rating
- SystemAlert/AlertKind/AlertThresholds + pure AlertEvaluator (sustained-breach)
- AlertCenter (@MainActor): per-cycle health + alert evaluation, de-dup by kind,
inbox (capped), native UserNotifications on transition into a condition
- Covers: sustained high CPU, critical memory pressure, disk full, thermal,
runaway process, low battery
- Wire evaluate() into SystemMonitor; request notif auth on launch
- HealthCardView (score ring + diagnosis) + AlertsInboxView in Power & Storage;
health score + alert badge in menu bar
- Renamed model Alert->SystemAlert to avoid SwiftUI.Alert shadowing
- 10 new tests incl. AlertCenter de-dup integration (52 total green)
- Visual smoke: Energy + Disk I/O columns render with live data under load
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ProcessItem: disk read/write rate + cumulative bytes, energy-impact score,
executable path; equality now tracks energy/disk so the table refreshes
- ProcessMonitor: disk I/O + idle-wakeup rates from rusage_info_v4; full path
capture; on-demand KERN_PROCARGS2 args + PROC_PIDLISTFDS open-file count
- EnergyModel heuristic + pure ProcArgs parser (both unit-tested)
- ProcessView: sortable Energy + Disk I/O columns (icon folded into Name to stay
within SwiftUI's 10-column limit); Get Info (double-click / ⌘I) opens inspector
- ProcessInspectorSheet: live stats, path, args, open files, Reveal/Copy Path
- 10 new tests (32 total green); smoke: stable under CPU+disk load
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- MetricsStore: thread-safe on-disk ring buffer (Application Support), throttled
background saves, flush on quit/background, 24h/20k cap
- MetricsMath: pure trim + downsample (unit-tested)
- HistoryRange (Live/5m/30m/1h/24h) + HistoryRangePicker + MetricTrendChart
- Wire recording into SystemMonitor; range picker in CPU/Memory/Network tabs
- Fix durability: flush history on applicationWillTerminate + scenePhase.background
- 8 new tests (30 total green); runtime smoke: no crash, 7 samples persisted
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- DEVELOPMENT_TEAM beállítva a céges fiókra (InstaSoft, P3663392R2).
- A project.yml-ből kivéve a target `entitlements:` blokk, amely
`properties` nélkül üres entitlements fájlt generált és felülírta a
kézzel karbantartott TopManager.entitlements-et (app-sandbox=false).
A CODE_SIGN_ENTITLEMENTS beállítás marad. Release build ellenőrizve.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Security improvements:
- Force Kill (SIGKILL) now always requires confirmation - removed "Don't ask
again" option for this destructive operation
- Added protection for critical system processes (kernel_task, launchd,
WindowServer, loginwindow) - UI prevents force-killing these
- Terminate (SIGTERM) retains the "Don't ask again" option as it's a gentler
operation that allows processes to save data
UX improvements:
- Clear error message when attempting to force-kill protected processes
- ConfirmationSheet now supports optional "Don't ask again" toggle via
nullable skipPreferenceKey parameter
This prevents accidental system crashes from force-killing critical processes
while maintaining power-user convenience for regular termination.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Defensive coding improvements to mitigate "kernel as messenger" attack vector
where a local malicious process could craft extreme process names/paths:
- fetchProcessName: Create string from explicit length instead of relying
on null terminator. Protects against edge cases where path buffer might
not be null-terminated at exactly maxPathSize.
- BSD name extraction: Copy to safe buffer with guaranteed null termination
before converting to String. Protects against pbi_name being exactly
MAXCOMLEN bytes without null terminator.
- fetchBasicProcessInfo: Same safe pattern for p_comm field extraction.
- Strip control characters and whitespace from process names to prevent
display/injection issues from maliciously crafted names.
Security: Addresses potential buffer over-read in unsafe Swift pointer
operations when parsing attacker-influenced kernel data structures.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Security improvements:
- Validate process still exists before sending signals
- Verify process start time matches to detect PID reuse
- Add ProcessControlError enum with descriptive error messages
- Show error alerts when operations fail (permission denied, process not found, PID reused)
- Pass expectedStartTime to all process control operations
This prevents accidentally terminating the wrong process when a PID
gets reused between user selection and confirmation.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add cpuUsageTotal property to ProcessItem (100% = all cores)
- Keep cpuUsage as per-core percentage (100% = 1 core)
- Display both columns: CPU/Core and CPU/Total
- CPU/Total values now sum to match the total system CPU
This clarifies the difference between per-core and system-wide CPU
measurements that was causing confusion.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Major performance improvements to reduce CPU usage from 25-30% to ~0.5%:
- Move all data fetching to dedicated background queue
- Prime CPU and process monitors at startup with 1-second delay for accurate delta calculation
- Implement smart refresh cycles: processes fetched every other cycle after initial warmup
- Add lightweight refresh that skips expensive calls for idle processes (CPU < 0.1%)
- Increase refresh interval from 2s to 3s
- Add caching for processes with no icons to avoid repeated lookups
- Use sysctl fallback to get correct user ownership for system processes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
A native SwiftUI app for monitoring macOS system resources:
- Processes tab with sorting, filtering, and process control
- Apps tab for running applications
- Performance tab with CPU, memory, and network charts
- Power & Storage tab with system info, GPU, storage, and network
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>