Install macli

brew install ljh-sh/cli/macli

Or tap once, then use the short name:

brew tap ljh-sh/cli
brew install macli

Homebrew 6 added a trust step for third-party taps. If you see a trust prompt, run:

brew trust ljh-sh/cli
brew install ljh-sh/cli/macli

The Homebrew formula automatically strips the com.apple.quarantine attribute for you.

Direct binary

curl -L https://github.com/ljh-sh/macli/releases/latest/download/macli-darwin-universal.tar.xz | tar xJ -
sudo mv bin/macli /usr/local/bin/

The universal tarball is a fat Mach-O (arm64 + x86_64) — works on Apple Silicon and Intel Macs.

Because macli ships with an ad-hoc signature, macOS Gatekeeper may block the direct download. Strip the quarantine attribute:

xattr -dr com.apple.quarantine /usr/local/bin/macli

eget

Via x-cmd eget:

x eget use ljh-sh/macli              # install latest to ~/.local/bin
x eget use --tag v0.4.2 ljh-sh/macli # install a specific release

npm

npm install -g @ljh-sh/macli

The npm package is published from GitHub Actions. Run `npm audit signatures` after install to verify package integrity.

The npm package downloads the universal macOS binary from the GitHub release during install.

Build from source

Requires Swift 5.10+ / macOS 12+.

git clone https://github.com/ljh-sh/macli
cd macli
swift build -c release

First-run permissions

The first time you run a calendar or reminders command, macOS TCC will prompt for access. Subsequent calls are instant.

macli cal ls

If you miss the prompt, go to System Settings → Privacy & Security → Calendars (or Reminders) and enable the terminal you’re running macli from.

Verify the binary

After downloading a release tarball, verify its cosign signature:

cosign verify-blob \
  --bundle macli-darwin-universal.tar.xz.sigstore.json \
  --certificate-identity-regexp '^https://github.com/ljh-sh/macli/' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  macli-darwin-universal.tar.xz