Skip to content

Commit e4cd175

Browse files
committed
docs: document prerelease policy and Gatekeeper workaround
Explain the canary/beta/stable release flow, clarify that semantic-release owns version bumps, and add install notes for non-notarized builds until Apple signing secrets are configured. Made-with: Cursor
1 parent 3be2ef1 commit e4cd175

3 files changed

Lines changed: 44 additions & 3 deletions

File tree

.cursorrules

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ Types: feat, fix, refactor, chore, docs, style, test, ci. Use `feat!:` or `fix!:
1818

1919
**Split commits**: One logical change per commit. Group related edits (e.g. all release pipeline files in one feat, all doc updates in one docs).
2020

21+
## Release Policy
22+
- **Default channel**: canary or beta (prerelease-first). Push to `canary` or `beta` for automatic prereleases.
23+
- **Stable**: Only when user explicitly says "release stable" or "promote to stable". Never trigger stable releases by default.
24+
- **Version bumping**: Never manually edit version in pyproject.toml, justfile, bundle.sh, or __init__.py. semantic-release owns versioning.
25+
2126
## Must Follow
2227
- CLI binary is `setmac-cli` not `setmac` (case-insensitive APFS collision with GUI binary `Setmac`)
2328
- Use `just` (justfile) not `make` as command runner

CLAUDE.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ chore: maintenance
9191

9292
Types: `feat`, `fix`, `refactor`, `chore`, `docs`, `style`, `test`, `ci`. Use `feat!:` or `fix!:` for breaking changes.
9393

94+
## Release Pipeline
95+
- **Canary**: Push to `canary` → auto-publishes `vX.Y.Z-canary.N`
96+
- **Beta**: Push to `beta` → auto-publishes `vX.Y.Z-beta.N`
97+
- **Stable**: Manual only — run "Release Stable" workflow from Actions, default ref `main`. Never auto-release stable.
98+
- **Versioning**: semantic-release is source of truth. Do not manually bump versions.
99+
- **Branch setup**: Create `canary` and `beta` from `main` if missing: `git checkout -b canary main && git push -u origin canary` (same for beta).
100+
94101
## Development Rules
95102

96103
- No Xcode IDE — use CLI (`swift build`, `swift run`) and VS Code

README.md

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,39 @@ just # List all recipes
7575

7676
## Releases
7777

78-
Releases are automated with [python-semantic-release](https://python-semantic-release.readthedocs.io/). Use Conventional Commits (`feat:`, `fix:`, etc.) on `main`; pushes trigger version bumps and GitHub Releases.
78+
Releases are automated with [python-semantic-release](https://python-semantic-release.readthedocs.io/).
7979

80-
- **Stable**: Push `feat`/`fix` commits to `main` — CI builds DMG + standalone CLI and publishes.
81-
- **Beta**: Run the Release workflow manually, check "Create beta prerelease" — publishes `vX.Y.Z-beta.N` with DMG and CLI.
80+
- **Canary**: Push to `canary` to publish `vX.Y.Z-canary.N`
81+
- **Beta**: Push to `beta` to publish `vX.Y.Z-beta.N`
82+
- **Stable**: Run the `Release Stable` workflow manually from `main`
83+
- **Version bumps**: Use Conventional Commits (`feat:`, `fix:`, etc.). semantic-release owns the version number.
84+
85+
### Signing and notarization
86+
87+
Release builds now do the following:
88+
89+
- ad-hoc sign the standalone `setmac-cli`
90+
- ad-hoc sign `Setmac.app` and the DMG by default
91+
- automatically switch to Developer ID signing when these GitHub secrets are configured:
92+
- `APPLE_SIGNING_IDENTITY`
93+
- `APPLE_CERTIFICATE_P12_BASE64`
94+
- `APPLE_CERTIFICATE_PASSWORD`
95+
- `APPLE_ID`
96+
- `APPLE_APP_SPECIFIC_PASSWORD`
97+
- `APPLE_TEAM_ID`
98+
- automatically notarize and staple the DMG when the Apple secrets are present
99+
100+
Ad-hoc signing makes the bundle structurally valid, but it does **not** satisfy Gatekeeper on a downloaded build. Until the Apple signing secrets are configured, users should expect to use the workaround below.
101+
102+
### Gatekeeper workaround
103+
104+
If you open a non-notarized build and macOS reports the app as damaged or blocked, move it to `/Applications` and run:
105+
106+
```bash
107+
xattr -cr /Applications/Setmac.app
108+
```
109+
110+
You can also Control-click the app and choose `Open`. This is only a temporary workaround for older unsigned releases; the proper fix is signed and notarized builds.
82111

83112
## Tools included
84113

0 commit comments

Comments
 (0)