SwiftUI MenuBarExtra companion for smctl.
Depends on SMCtlClient and SMCtlProtocol from smctl. Policy stays in smctld. The extra shows charge percent, the configured limit, and fan RPM (or the SMC no-fans message). It sends maintain (80, 70-80, stop), charging on/off, and fan profiles (auto, quiet, full, plus return-to-auto) through DaemonClient. Manual RPM entry is not in this menu. Thermal guard stays active on the daemon.
Vendor/SMCtlClient and Vendor/SMCtlProtocol are symlinks onto smctl's SMCtlClient and SMCtlProtocol sources. Do not depend on the whole smctl package.
./scripts/pin-smctl.shThe script links Vendor/ to .deps/smctl, cloning leaperone/smctl when that checkout is missing. Override with SMCTL_PATH=/path/to/smctl. CI checks out smctl into .deps/smctl and sets SMCTL_PATH.
./scripts/pin-smctl.sh
swift build --product SMCtlMenuBar
./scripts/bundle-app.sh
open .build/SMCtlMenuBar.appInfo.plist sets LSUIElement so the app stays out of the Dock. ./scripts/bundle-app.sh release builds the release .app.
./scripts/pin-smctl.sh
swift testNeeds a full Xcode toolchain (xcode-select pointing at Xcode), not Command Line Tools alone.
GitHub Actions on main and pull requests pins smctl, then runs swift build, swift test, a release build, and uploads SMCtlMenuBar.app. Push a v* tag to cut a GitHub Release with an unsigned .app zip.