Package 1.1.1: app as a payload with system ownership, CLI via postinstall

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
kfattic
2026-09-16 13:59:05 -05:00
parent 42c1381ebf
commit cf0241beac
4 changed files with 80 additions and 49 deletions

View File

@@ -53,10 +53,12 @@ swift build # debug build of everything
- Package: tools-version 6.0, Swift 5 language mode, macOS 14 minimum.
- `build.sh` reads `CODESIGN_APP_IDENTITY`, `CODESIGN_PKG_IDENTITY`, `NOTARY_PROFILE` (and optional
`CODESIGN_TEAM_ID`) from the environment or an untracked `build.env`. Never hard-code identities.
- The PKG is payload-free (`pkgbuild --nopayload --scripts`): `pkg/postinstall` installs the CLI to
`/usr/local/bin` and the notarized, stapled app to `/Applications`. A payload's "." entry is recorded as
root:wheel for its install location, which would reset an existing `/usr/local/bin` (Homebrew) or
`/Applications` (root:admin 775). The app is notarized and stapled before packaging; the PKG after.
- PKG layout: the app is a payload (`pkgbuild --root` with a staging `Applications/` that is really
root:admin 775 and `--ownership preserve`, `BundleIsRelocatable` false), so it gets a receipt and the
package records the system's own ownership. `--ownership recommended` would record Applications as
root:wheel — don't use it. The CLI is not a payload: the binary ships in Scripts and `pkg/postinstall`
copies it, because a `/usr/local/bin` payload entry would reset a Homebrew-owned folder. The build
verifies both BOM ownership entries. The app is notarized and stapled before packaging; the PKG after.
- The app icon master is `Icon/AppIcon-1024.png`; `build.sh` generates `AppIcon.icns` from it. Don't redraw it.
- Live tests are opt-in and write to queues: `CUPSKIT_LIVE_QUEUE=<queue>`, `CUPSKIT_LIVE_JOBS=<a>,<b>`,
`CUPSKIT_LIVE_QUICK=<ricoh>,<generic>`. Use throwaway queues (e.g. `lpd://127.0.0.1/…`, paused) and