📦️ Create a release: macos
0a98071 parent: d13101a added
.tickets/issues/0056-preparer-le-compte-apple-developer-certificat-de.yaml +66 -0 | new file mode 100644 | ||
| @@ -0,0 +1,66 @@ | ||
| 1 | +# Managed by IssueSpec. Hand edits are welcome; keep the schema valid. | |
| 2 | +id: 56 | |
| 3 | +title: "Préparer le compte Apple Developer : certificat Developer ID et profil de notarisation" | |
| 4 | +state: open | |
| 5 | +author: | |
| 6 | + name: k33g | |
| 7 | + email: ph.charriere@gmail.com | |
| 8 | +createdAt: 2026-10-31T11:03:40.000Z | |
| 9 | +updatedAt: 2026-10-31T11:03:40.000Z | |
| 10 | +labels: | |
| 11 | + - kind::chore | |
| 12 | + - area::infra | |
| 13 | +milestone: "v1.0.0-macos · Signature et notarisation" | |
| 14 | +epic: Qualité & Release | |
| 15 | +body: | | |
| 16 | + Une seule fois, sur le Mac qui construit les releases (partie A du [guide](docs/fr/how-to/signer-et-notariser-sous-macos.md)) : | |
| 17 | + certificat **Developer ID Application** dans le trousseau, sauvegarde `.p12`, | |
| 18 | + mot de passe d'application Apple, profil `notarytool` enregistré, variables | |
| 19 | + `SIDEKICKS_SIGN_IDENTITY` et `SIDEKICKS_NOTARY_PROFILE`. | |
| 20 | + | |
| 21 | + ## Critères d'acceptation | |
| 22 | + - `security find-identity -v -p codesigning` liste « Developer ID Application: … (TEAMID) ». | |
| 23 | + - `xcrun notarytool history --keychain-profile sidekicks-notary` répond sans erreur. | |
| 24 | + - Le certificat et sa clé privée sont sauvegardés (`.p12` + mot de passe dans un gestionnaire de mots de passe). | |
| 25 | +tasks: | |
| 26 | + - id: 1 | |
| 27 | + title: "Relever le Team ID" | |
| 28 | + state: open | |
| 29 | + priority: high | |
| 30 | + author: | |
| 31 | + name: k33g | |
| 32 | + email: ph.charriere@gmail.com | |
| 33 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 34 | + - id: 2 | |
| 35 | + title: "Créer le certificat Developer ID Application" | |
| 36 | + state: open | |
| 37 | + priority: high | |
| 38 | + author: | |
| 39 | + name: k33g | |
| 40 | + email: ph.charriere@gmail.com | |
| 41 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 42 | + - id: 3 | |
| 43 | + title: "Sauvegarder le certificat et sa clé (.p12)" | |
| 44 | + state: open | |
| 45 | + priority: high | |
| 46 | + author: | |
| 47 | + name: k33g | |
| 48 | + email: ph.charriere@gmail.com | |
| 49 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 50 | + - id: 4 | |
| 51 | + title: "Créer le mot de passe d'application et le profil notarytool" | |
| 52 | + state: open | |
| 53 | + priority: high | |
| 54 | + author: | |
| 55 | + name: k33g | |
| 56 | + email: ph.charriere@gmail.com | |
| 57 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 58 | + - id: 5 | |
| 59 | + title: "Définir SIDEKICKS_SIGN_IDENTITY et SIDEKICKS_NOTARY_PROFILE" | |
| 60 | + state: open | |
| 61 | + priority: medium | |
| 62 | + author: | |
| 63 | + name: k33g | |
| 64 | + email: ph.charriere@gmail.com | |
| 65 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 66 | +comments: [] | |
| new file mode 100644 | |||
| @@ -0,0 +1,66 @@ | |||
| 1 | +# Managed by IssueSpec. Hand edits are welcome; keep the schema valid. | ||
| 2 | +id: 56 | ||
| 3 | +title: "Préparer le compte Apple Developer : certificat Developer ID et profil de notarisation" | ||
| 4 | +state: open | ||
| 5 | +author: | ||
| 6 | + name: k33g | ||
| 7 | + email: ph.charriere@gmail.com | ||
| 8 | +createdAt: 2026-10-31T11:03:40.000Z | ||
| 9 | +updatedAt: 2026-10-31T11:03:40.000Z | ||
| 10 | +labels: | ||
| 11 | + - kind::chore | ||
| 12 | + - area::infra | ||
| 13 | +milestone: "v1.0.0-macos · Signature et notarisation" | ||
| 14 | +epic: Qualité & Release | ||
| 15 | +body: | | ||
| 16 | + Une seule fois, sur le Mac qui construit les releases (partie A du [guide](docs/fr/how-to/signer-et-notariser-sous-macos.md)) : | ||
| 17 | + certificat **Developer ID Application** dans le trousseau, sauvegarde `.p12`, | ||
| 18 | + mot de passe d'application Apple, profil `notarytool` enregistré, variables | ||
| 19 | + `SIDEKICKS_SIGN_IDENTITY` et `SIDEKICKS_NOTARY_PROFILE`. | ||
| 20 | + | ||
| 21 | + ## Critères d'acceptation | ||
| 22 | + - `security find-identity -v -p codesigning` liste « Developer ID Application: … (TEAMID) ». | ||
| 23 | + - `xcrun notarytool history --keychain-profile sidekicks-notary` répond sans erreur. | ||
| 24 | + - Le certificat et sa clé privée sont sauvegardés (`.p12` + mot de passe dans un gestionnaire de mots de passe). | ||
| 25 | +tasks: | ||
| 26 | + - id: 1 | ||
| 27 | + title: "Relever le Team ID" | ||
| 28 | + state: open | ||
| 29 | + priority: high | ||
| 30 | + author: | ||
| 31 | + name: k33g | ||
| 32 | + email: ph.charriere@gmail.com | ||
| 33 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 34 | + - id: 2 | ||
| 35 | + title: "Créer le certificat Developer ID Application" | ||
| 36 | + state: open | ||
| 37 | + priority: high | ||
| 38 | + author: | ||
| 39 | + name: k33g | ||
| 40 | + email: ph.charriere@gmail.com | ||
| 41 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 42 | + - id: 3 | ||
| 43 | + title: "Sauvegarder le certificat et sa clé (.p12)" | ||
| 44 | + state: open | ||
| 45 | + priority: high | ||
| 46 | + author: | ||
| 47 | + name: k33g | ||
| 48 | + email: ph.charriere@gmail.com | ||
| 49 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 50 | + - id: 4 | ||
| 51 | + title: "Créer le mot de passe d'application et le profil notarytool" | ||
| 52 | + state: open | ||
| 53 | + priority: high | ||
| 54 | + author: | ||
| 55 | + name: k33g | ||
| 56 | + email: ph.charriere@gmail.com | ||
| 57 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 58 | + - id: 5 | ||
| 59 | + title: "Définir SIDEKICKS_SIGN_IDENTITY et SIDEKICKS_NOTARY_PROFILE" | ||
| 60 | + state: open | ||
| 61 | + priority: medium | ||
| 62 | + author: | ||
| 63 | + name: k33g | ||
| 64 | + email: ph.charriere@gmail.com | ||
| 65 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 66 | +comments: [] | ||
added
.tickets/issues/0057-signer-notariser-et-publier-les-paquets-macos-de.yaml +77 -0 | new file mode 100644 | ||
| @@ -0,0 +1,77 @@ | ||
| 1 | +# Managed by IssueSpec. Hand edits are welcome; keep the schema valid. | |
| 2 | +id: 57 | |
| 3 | +title: "Signer, notariser et publier les paquets macOS de la 1.0.0 (v1.0.0-macos)" | |
| 4 | +state: open | |
| 5 | +author: | |
| 6 | + name: k33g | |
| 7 | + email: ph.charriere@gmail.com | |
| 8 | +createdAt: 2026-10-31T11:03:40.000Z | |
| 9 | +updatedAt: 2026-10-31T11:03:40.000Z | |
| 10 | +labels: | |
| 11 | + - kind::chore | |
| 12 | + - area::infra | |
| 13 | + - citizen-ux | |
| 14 | +milestone: "v1.0.0-macos · Signature et notarisation" | |
| 15 | +epic: Qualité & Release | |
| 16 | +related: | |
| 17 | + - 56 | |
| 18 | +body: | | |
| 19 | + Partie B du [guide](docs/fr/how-to/signer-et-notariser-sous-macos.md), à la main : signer `sidekicks.app` (runtime renforcé, | |
| 20 | + horodatage), la notariser et agrafer le ticket, refaire le `.dmg` à partir de | |
| 21 | + l'app signée, le signer, le notariser, l'agrafer, refaire le `.zip`, recalculer | |
| 22 | + `SHA256SUMS`, puis publier la release **v1.0.0-macos**. | |
| 23 | + | |
| 24 | + ## Critères d'acceptation | |
| 25 | + - `spctl -a -vvv -t exec` sur l'app et `spctl -a -vvv -t open --context context:primary-signature` sur le `.dmg` disent « accepted · source=Notarized Developer ID ». | |
| 26 | + - Sur un autre Mac, le `.dmg` téléchargé s'ouvre et l'app se lance sans « Ouvrir quand même ». | |
| 27 | + - L'app fonctionne avec le runtime renforcé : agents locaux, conteneurs, sbx, terminal, fichiers, glisser-déposer, sélecteurs de fichiers. | |
| 28 | +tasks: | |
| 29 | + - id: 1 | |
| 30 | + title: "Signer et notariser sidekicks.app" | |
| 31 | + state: open | |
| 32 | + priority: high | |
| 33 | + author: | |
| 34 | + name: k33g | |
| 35 | + email: ph.charriere@gmail.com | |
| 36 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 37 | + - id: 2 | |
| 38 | + title: "Refaire, signer et notariser le .dmg" | |
| 39 | + state: open | |
| 40 | + priority: high | |
| 41 | + author: | |
| 42 | + name: k33g | |
| 43 | + email: ph.charriere@gmail.com | |
| 44 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 45 | + - id: 3 | |
| 46 | + title: "Refaire le .zip et SHA256SUMS" | |
| 47 | + state: open | |
| 48 | + priority: high | |
| 49 | + author: | |
| 50 | + name: k33g | |
| 51 | + email: ph.charriere@gmail.com | |
| 52 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 53 | + - id: 4 | |
| 54 | + title: "Vérifier sur un autre Mac et tester l'app (runtime renforcé)" | |
| 55 | + state: open | |
| 56 | + priority: high | |
| 57 | + author: | |
| 58 | + name: k33g | |
| 59 | + email: ph.charriere@gmail.com | |
| 60 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 61 | + - id: 5 | |
| 62 | + title: "Publier la release v1.0.0-macos" | |
| 63 | + state: open | |
| 64 | + priority: high | |
| 65 | + author: | |
| 66 | + name: k33g | |
| 67 | + email: ph.charriere@gmail.com | |
| 68 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 69 | + - id: 6 | |
| 70 | + title: "Option : faire accepter les tags v<version>-<suffixe> au workflow Release" | |
| 71 | + state: open | |
| 72 | + priority: low | |
| 73 | + author: | |
| 74 | + name: k33g | |
| 75 | + email: ph.charriere@gmail.com | |
| 76 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 77 | +comments: [] | |
| new file mode 100644 | |||
| @@ -0,0 +1,77 @@ | |||
| 1 | +# Managed by IssueSpec. Hand edits are welcome; keep the schema valid. | ||
| 2 | +id: 57 | ||
| 3 | +title: "Signer, notariser et publier les paquets macOS de la 1.0.0 (v1.0.0-macos)" | ||
| 4 | +state: open | ||
| 5 | +author: | ||
| 6 | + name: k33g | ||
| 7 | + email: ph.charriere@gmail.com | ||
| 8 | +createdAt: 2026-10-31T11:03:40.000Z | ||
| 9 | +updatedAt: 2026-10-31T11:03:40.000Z | ||
| 10 | +labels: | ||
| 11 | + - kind::chore | ||
| 12 | + - area::infra | ||
| 13 | + - citizen-ux | ||
| 14 | +milestone: "v1.0.0-macos · Signature et notarisation" | ||
| 15 | +epic: Qualité & Release | ||
| 16 | +related: | ||
| 17 | + - 56 | ||
| 18 | +body: | | ||
| 19 | + Partie B du [guide](docs/fr/how-to/signer-et-notariser-sous-macos.md), à la main : signer `sidekicks.app` (runtime renforcé, | ||
| 20 | + horodatage), la notariser et agrafer le ticket, refaire le `.dmg` à partir de | ||
| 21 | + l'app signée, le signer, le notariser, l'agrafer, refaire le `.zip`, recalculer | ||
| 22 | + `SHA256SUMS`, puis publier la release **v1.0.0-macos**. | ||
| 23 | + | ||
| 24 | + ## Critères d'acceptation | ||
| 25 | + - `spctl -a -vvv -t exec` sur l'app et `spctl -a -vvv -t open --context context:primary-signature` sur le `.dmg` disent « accepted · source=Notarized Developer ID ». | ||
| 26 | + - Sur un autre Mac, le `.dmg` téléchargé s'ouvre et l'app se lance sans « Ouvrir quand même ». | ||
| 27 | + - L'app fonctionne avec le runtime renforcé : agents locaux, conteneurs, sbx, terminal, fichiers, glisser-déposer, sélecteurs de fichiers. | ||
| 28 | +tasks: | ||
| 29 | + - id: 1 | ||
| 30 | + title: "Signer et notariser sidekicks.app" | ||
| 31 | + state: open | ||
| 32 | + priority: high | ||
| 33 | + author: | ||
| 34 | + name: k33g | ||
| 35 | + email: ph.charriere@gmail.com | ||
| 36 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 37 | + - id: 2 | ||
| 38 | + title: "Refaire, signer et notariser le .dmg" | ||
| 39 | + state: open | ||
| 40 | + priority: high | ||
| 41 | + author: | ||
| 42 | + name: k33g | ||
| 43 | + email: ph.charriere@gmail.com | ||
| 44 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 45 | + - id: 3 | ||
| 46 | + title: "Refaire le .zip et SHA256SUMS" | ||
| 47 | + state: open | ||
| 48 | + priority: high | ||
| 49 | + author: | ||
| 50 | + name: k33g | ||
| 51 | + email: ph.charriere@gmail.com | ||
| 52 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 53 | + - id: 4 | ||
| 54 | + title: "Vérifier sur un autre Mac et tester l'app (runtime renforcé)" | ||
| 55 | + state: open | ||
| 56 | + priority: high | ||
| 57 | + author: | ||
| 58 | + name: k33g | ||
| 59 | + email: ph.charriere@gmail.com | ||
| 60 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 61 | + - id: 5 | ||
| 62 | + title: "Publier la release v1.0.0-macos" | ||
| 63 | + state: open | ||
| 64 | + priority: high | ||
| 65 | + author: | ||
| 66 | + name: k33g | ||
| 67 | + email: ph.charriere@gmail.com | ||
| 68 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 69 | + - id: 6 | ||
| 70 | + title: "Option : faire accepter les tags v<version>-<suffixe> au workflow Release" | ||
| 71 | + state: open | ||
| 72 | + priority: low | ||
| 73 | + author: | ||
| 74 | + name: k33g | ||
| 75 | + email: ph.charriere@gmail.com | ||
| 76 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 77 | +comments: [] | ||
added
.tickets/issues/0058-automatiser-la-signature-et-la-notarisation-dans.yaml +60 -0 | new file mode 100644 | ||
| @@ -0,0 +1,60 @@ | ||
| 1 | +# Managed by IssueSpec. Hand edits are welcome; keep the schema valid. | |
| 2 | +id: 58 | |
| 3 | +title: "Automatiser la signature et la notarisation dans make release-build" | |
| 4 | +state: open | |
| 5 | +author: | |
| 6 | + name: k33g | |
| 7 | + email: ph.charriere@gmail.com | |
| 8 | +createdAt: 2026-10-31T11:03:40.000Z | |
| 9 | +updatedAt: 2026-10-31T11:03:40.000Z | |
| 10 | +labels: | |
| 11 | + - kind::feature | |
| 12 | + - area::infra | |
| 13 | +milestone: "v1.0.0-macos · Signature et notarisation" | |
| 14 | +epic: Qualité & Release | |
| 15 | +related: | |
| 16 | + - 57 | |
| 17 | +body: | | |
| 18 | + Pour les releases suivantes : que `scripts/package.sh macos` fasse lui-même ce | |
| 19 | + que la partie B du [guide](docs/fr/how-to/signer-et-notariser-sous-macos.md) fait à la main, quand `SIDEKICKS_SIGN_IDENTITY` et | |
| 20 | + `SIDEKICKS_NOTARY_PROFILE` sont définies (signature ad hoc sinon, avec un avertissement). | |
| 21 | + | |
| 22 | + ## Critères d'acceptation | |
| 23 | + - `make release-build` produit un `.dmg` et un `.zip` signés, notarisés et agrafés. | |
| 24 | + - `build-release.sh` vérifie les prérequis avant de construire (identité présente dans le trousseau, profil notarytool valide). | |
| 25 | + - Les tests de `scripts/package_test.sh` couvrent les deux chemins (signé, ad hoc). | |
| 26 | + - `RELEASING.md` / `RELEASING.fr.md` et le guide de publication sont mis à jour. | |
| 27 | +tasks: | |
| 28 | + - id: 1 | |
| 29 | + title: "Signature et notarisation dans package_macos" | |
| 30 | + state: open | |
| 31 | + priority: high | |
| 32 | + author: | |
| 33 | + name: k33g | |
| 34 | + email: ph.charriere@gmail.com | |
| 35 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 36 | + - id: 2 | |
| 37 | + title: "Vérification des prérequis dans build-release.sh" | |
| 38 | + state: open | |
| 39 | + priority: medium | |
| 40 | + author: | |
| 41 | + name: k33g | |
| 42 | + email: ph.charriere@gmail.com | |
| 43 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 44 | + - id: 3 | |
| 45 | + title: "Tests du script" | |
| 46 | + state: open | |
| 47 | + priority: medium | |
| 48 | + author: | |
| 49 | + name: k33g | |
| 50 | + email: ph.charriere@gmail.com | |
| 51 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 52 | + - id: 4 | |
| 53 | + title: "Mettre à jour RELEASING et les guides" | |
| 54 | + state: open | |
| 55 | + priority: medium | |
| 56 | + author: | |
| 57 | + name: k33g | |
| 58 | + email: ph.charriere@gmail.com | |
| 59 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 60 | +comments: [] | |
| new file mode 100644 | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | +# Managed by IssueSpec. Hand edits are welcome; keep the schema valid. | ||
| 2 | +id: 58 | ||
| 3 | +title: "Automatiser la signature et la notarisation dans make release-build" | ||
| 4 | +state: open | ||
| 5 | +author: | ||
| 6 | + name: k33g | ||
| 7 | + email: ph.charriere@gmail.com | ||
| 8 | +createdAt: 2026-10-31T11:03:40.000Z | ||
| 9 | +updatedAt: 2026-10-31T11:03:40.000Z | ||
| 10 | +labels: | ||
| 11 | + - kind::feature | ||
| 12 | + - area::infra | ||
| 13 | +milestone: "v1.0.0-macos · Signature et notarisation" | ||
| 14 | +epic: Qualité & Release | ||
| 15 | +related: | ||
| 16 | + - 57 | ||
| 17 | +body: | | ||
| 18 | + Pour les releases suivantes : que `scripts/package.sh macos` fasse lui-même ce | ||
| 19 | + que la partie B du [guide](docs/fr/how-to/signer-et-notariser-sous-macos.md) fait à la main, quand `SIDEKICKS_SIGN_IDENTITY` et | ||
| 20 | + `SIDEKICKS_NOTARY_PROFILE` sont définies (signature ad hoc sinon, avec un avertissement). | ||
| 21 | + | ||
| 22 | + ## Critères d'acceptation | ||
| 23 | + - `make release-build` produit un `.dmg` et un `.zip` signés, notarisés et agrafés. | ||
| 24 | + - `build-release.sh` vérifie les prérequis avant de construire (identité présente dans le trousseau, profil notarytool valide). | ||
| 25 | + - Les tests de `scripts/package_test.sh` couvrent les deux chemins (signé, ad hoc). | ||
| 26 | + - `RELEASING.md` / `RELEASING.fr.md` et le guide de publication sont mis à jour. | ||
| 27 | +tasks: | ||
| 28 | + - id: 1 | ||
| 29 | + title: "Signature et notarisation dans package_macos" | ||
| 30 | + state: open | ||
| 31 | + priority: high | ||
| 32 | + author: | ||
| 33 | + name: k33g | ||
| 34 | + email: ph.charriere@gmail.com | ||
| 35 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 36 | + - id: 2 | ||
| 37 | + title: "Vérification des prérequis dans build-release.sh" | ||
| 38 | + state: open | ||
| 39 | + priority: medium | ||
| 40 | + author: | ||
| 41 | + name: k33g | ||
| 42 | + email: ph.charriere@gmail.com | ||
| 43 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 44 | + - id: 3 | ||
| 45 | + title: "Tests du script" | ||
| 46 | + state: open | ||
| 47 | + priority: medium | ||
| 48 | + author: | ||
| 49 | + name: k33g | ||
| 50 | + email: ph.charriere@gmail.com | ||
| 51 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 52 | + - id: 4 | ||
| 53 | + title: "Mettre à jour RELEASING et les guides" | ||
| 54 | + state: open | ||
| 55 | + priority: medium | ||
| 56 | + author: | ||
| 57 | + name: k33g | ||
| 58 | + email: ph.charriere@gmail.com | ||
| 59 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 60 | +comments: [] | ||
added
.tickets/issues/0059-guide-d-installation-macos-plus-d-ouvrir-quand-m.yaml +30 -0 | new file mode 100644 | ||
| @@ -0,0 +1,30 @@ | ||
| 1 | +# Managed by IssueSpec. Hand edits are welcome; keep the schema valid. | |
| 2 | +id: 59 | |
| 3 | +title: "Guide d'installation macOS : plus d'« Ouvrir quand même » pour une release signée" | |
| 4 | +state: open | |
| 5 | +author: | |
| 6 | + name: k33g | |
| 7 | + email: ph.charriere@gmail.com | |
| 8 | +createdAt: 2026-10-31T11:03:40.000Z | |
| 9 | +updatedAt: 2026-10-31T11:03:40.000Z | |
| 10 | +labels: | |
| 11 | + - documentation | |
| 12 | + - citizen-ux | |
| 13 | +milestone: "v1.0.0-macos · Signature et notarisation" | |
| 14 | +epic: Qualité & Release | |
| 15 | +related: | |
| 16 | + - 57 | |
| 17 | +body: | | |
| 18 | + Une fois les paquets signés et notarisés, retirer de `docs/en/how-to/install-sidekicks.md` | |
| 19 | + et `docs/fr/how-to/installer-sidekicks.md` l'étape **Ouvrir quand même**, et | |
| 20 | + garder une variante pour les anciennes versions non signées (0.1.0, 1.0.0). | |
| 21 | +tasks: | |
| 22 | + - id: 1 | |
| 23 | + title: "Mettre à jour les guides d'installation EN + FR" | |
| 24 | + state: open | |
| 25 | + priority: medium | |
| 26 | + author: | |
| 27 | + name: k33g | |
| 28 | + email: ph.charriere@gmail.com | |
| 29 | + createdAt: 2026-10-31T11:03:40.000Z | |
| 30 | +comments: [] | |
| new file mode 100644 | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | +# Managed by IssueSpec. Hand edits are welcome; keep the schema valid. | ||
| 2 | +id: 59 | ||
| 3 | +title: "Guide d'installation macOS : plus d'« Ouvrir quand même » pour une release signée" | ||
| 4 | +state: open | ||
| 5 | +author: | ||
| 6 | + name: k33g | ||
| 7 | + email: ph.charriere@gmail.com | ||
| 8 | +createdAt: 2026-10-31T11:03:40.000Z | ||
| 9 | +updatedAt: 2026-10-31T11:03:40.000Z | ||
| 10 | +labels: | ||
| 11 | + - documentation | ||
| 12 | + - citizen-ux | ||
| 13 | +milestone: "v1.0.0-macos · Signature et notarisation" | ||
| 14 | +epic: Qualité & Release | ||
| 15 | +related: | ||
| 16 | + - 57 | ||
| 17 | +body: | | ||
| 18 | + Une fois les paquets signés et notarisés, retirer de `docs/en/how-to/install-sidekicks.md` | ||
| 19 | + et `docs/fr/how-to/installer-sidekicks.md` l'étape **Ouvrir quand même**, et | ||
| 20 | + garder une variante pour les anciennes versions non signées (0.1.0, 1.0.0). | ||
| 21 | +tasks: | ||
| 22 | + - id: 1 | ||
| 23 | + title: "Mettre à jour les guides d'installation EN + FR" | ||
| 24 | + state: open | ||
| 25 | + priority: medium | ||
| 26 | + author: | ||
| 27 | + name: k33g | ||
| 28 | + email: ph.charriere@gmail.com | ||
| 29 | + createdAt: 2026-10-31T11:03:40.000Z | ||
| 30 | +comments: [] | ||
modified
.tickets/milestones.yaml +3 -0 | @@ -30,3 +30,6 @@ milestones: | ||
| 30 | 30 | - title: "v1.0.0 · Release" |
| 31 | 31 | state: closed |
| 32 | 32 | description: "Version, vérifications, packaging (macOS, Windows), tag v1.0.0 et publication de la release, avec ce qu'apportent M5 et les milestones précédentes." |
| 33 | + - title: "v1.0.0-macos · Signature et notarisation" | |
| 34 | + state: open | |
| 35 | + description: "Avec le compte Apple Developer payant : certificat Developer ID, notarisation, paquets macOS de la 1.0.0 signés et notarisés (plus d'« Ouvrir quand même »), puis automatisation pour les releases suivantes." | |
| @@ -30,3 +30,6 @@ milestones: | |||
| 30 | - title: "v1.0.0 · Release" | 30 | - title: "v1.0.0 · Release" |
| 31 | state: closed | 31 | state: closed |
| 32 | description: "Version, vérifications, packaging (macOS, Windows), tag v1.0.0 et publication de la release, avec ce qu'apportent M5 et les milestones précédentes." | 32 | description: "Version, vérifications, packaging (macOS, Windows), tag v1.0.0 et publication de la release, avec ce qu'apportent M5 et les milestones précédentes." |
| 33 | + - title: "v1.0.0-macos · Signature et notarisation" | ||
| 34 | + state: open | ||
| 35 | + description: "Avec le compte Apple Developer payant : certificat Developer ID, notarisation, paquets macOS de la 1.0.0 signés et notarisés (plus d'« Ouvrir quand même »), puis automatisation pour les releases suivantes." | ||
modified
RELEASING.fr.md +2 -0 | @@ -37,6 +37,8 @@ Il construit, dans `dist/` : | ||
| 37 | 37 | |
| 38 | 38 | Pas de paquets Linux dans les releases pour le moment : `LINUX_ARCHES=amd64 make release-build` les construit aussi, dans Docker. `SKIP="windows"` (ou `macos`) laisse un système de côté ; `WINDOWS_ARCHES=amd64` ne construit qu'une architecture Windows. La liste des fichiers d'une release est `scripts/package.sh release-names`. |
| 39 | 39 | |
| 40 | +**Signature macOS** : avec le certificat Developer ID, signez et notarisez les paquets macOS maintenant, avant de tagger : [Signer et notariser Sidekicks pour macOS](docs/fr/how-to/signer-et-notariser-sous-macos.md), partie B. | |
| 41 | + | |
| 40 | 42 | ## 2. Tagger |
| 41 | 43 | |
| 42 | 44 | ```bash |
| @@ -37,6 +37,8 @@ Il construit, dans `dist/` : | |||
| 37 | 37 | ||
| 38 | Pas de paquets Linux dans les releases pour le moment : `LINUX_ARCHES=amd64 make release-build` les construit aussi, dans Docker. `SKIP="windows"` (ou `macos`) laisse un système de côté ; `WINDOWS_ARCHES=amd64` ne construit qu'une architecture Windows. La liste des fichiers d'une release est `scripts/package.sh release-names`. | 38 | Pas de paquets Linux dans les releases pour le moment : `LINUX_ARCHES=amd64 make release-build` les construit aussi, dans Docker. `SKIP="windows"` (ou `macos`) laisse un système de côté ; `WINDOWS_ARCHES=amd64` ne construit qu'une architecture Windows. La liste des fichiers d'une release est `scripts/package.sh release-names`. |
| 39 | 39 | ||
| 40 | +**Signature macOS** : avec le certificat Developer ID, signez et notarisez les paquets macOS maintenant, avant de tagger : [Signer et notariser Sidekicks pour macOS](docs/fr/how-to/signer-et-notariser-sous-macos.md), partie B. | ||
| 41 | + | ||
| 40 | ## 2. Tagger | 42 | ## 2. Tagger |
| 41 | 43 | ||
| 42 | ```bash | 44 | ```bash |
modified
RELEASING.md +2 -0 | @@ -37,6 +37,8 @@ It builds, into `dist/`: | ||
| 37 | 37 | |
| 38 | 38 | No Linux packages in the releases for now: `LINUX_ARCHES=amd64 make release-build` builds them too, in Docker. `SKIP="windows"` (or `macos`) leaves a system out; `WINDOWS_ARCHES=amd64` builds one Windows architecture only. The list of the files of a release is `scripts/package.sh release-names`. |
| 39 | 39 | |
| 40 | +**macOS signing**: with the Developer ID certificate, sign and notarize the macOS packages now, before tagging: [How to sign and notarize Sidekicks for macOS](docs/en/how-to/sign-and-notarize-on-macos.md), part B. | |
| 41 | + | |
| 40 | 42 | ## 2. Tag |
| 41 | 43 | |
| 42 | 44 | ```bash |
| @@ -37,6 +37,8 @@ It builds, into `dist/`: | |||
| 37 | 37 | ||
| 38 | No Linux packages in the releases for now: `LINUX_ARCHES=amd64 make release-build` builds them too, in Docker. `SKIP="windows"` (or `macos`) leaves a system out; `WINDOWS_ARCHES=amd64` builds one Windows architecture only. The list of the files of a release is `scripts/package.sh release-names`. | 38 | No Linux packages in the releases for now: `LINUX_ARCHES=amd64 make release-build` builds them too, in Docker. `SKIP="windows"` (or `macos`) leaves a system out; `WINDOWS_ARCHES=amd64` builds one Windows architecture only. The list of the files of a release is `scripts/package.sh release-names`. |
| 39 | 39 | ||
| 40 | +**macOS signing**: with the Developer ID certificate, sign and notarize the macOS packages now, before tagging: [How to sign and notarize Sidekicks for macOS](docs/en/how-to/sign-and-notarize-on-macos.md), part B. | ||
| 41 | + | ||
| 40 | ## 2. Tag | 42 | ## 2. Tag |
| 41 | 43 | ||
| 42 | ```bash | 44 | ```bash |
modified
build/config.yml +1 -1 | @@ -11,7 +11,7 @@ info: | ||
| 11 | 11 | description: "Converse with AI agents in channels" # The application description |
| 12 | 12 | copyright: "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0" # Copyright text |
| 13 | 13 | comments: "Sidekicks" # Comments |
| 14 | - version: "1.0.0" # The application version | |
| 14 | + version: "1.0.0-macos" # The application version | |
| 15 | 15 | # cfBundleIconName: "appicon" # The macOS icon name in Assets.car icon bundles (optional) |
| 16 | 16 | # # Should match the name of your .icon file without the extension |
| 17 | 17 | # # If not set and Assets.car exists, defaults to "appicon" |
| @@ -11,7 +11,7 @@ info: | |||
| 11 | description: "Converse with AI agents in channels" # The application description | 11 | description: "Converse with AI agents in channels" # The application description |
| 12 | copyright: "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0" # Copyright text | 12 | copyright: "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0" # Copyright text |
| 13 | comments: "Sidekicks" # Comments | 13 | comments: "Sidekicks" # Comments |
| 14 | - version: "1.0.0" # The application version | 14 | + version: "1.0.0-macos" # The application version |
| 15 | # cfBundleIconName: "appicon" # The macOS icon name in Assets.car icon bundles (optional) | 15 | # cfBundleIconName: "appicon" # The macOS icon name in Assets.car icon bundles (optional) |
| 16 | # # Should match the name of your .icon file without the extension | 16 | # # Should match the name of your .icon file without the extension |
| 17 | # # If not set and Assets.car exists, defaults to "appicon" | 17 | # # If not set and Assets.car exists, defaults to "appicon" |
modified
build/darwin/Info.dev.plist +2 -2 | @@ -17,9 +17,9 @@ | ||
| 17 | 17 | <key>CFBundlePackageType</key> |
| 18 | 18 | <string>APPL</string> |
| 19 | 19 | <key>CFBundleShortVersionString</key> |
| 20 | - <string>1.0.0</string> | |
| 20 | + <string>1.0.0-macos</string> | |
| 21 | 21 | <key>CFBundleVersion</key> |
| 22 | - <string>1.0.0</string> | |
| 22 | + <string>1.0.0-macos</string> | |
| 23 | 23 | <key>LSMinimumSystemVersion</key> |
| 24 | 24 | <string>13.0.0</string> |
| 25 | 25 | <key>NSAppTransportSecurity</key> |
| @@ -17,9 +17,9 @@ | |||
| 17 | <key>CFBundlePackageType</key> | 17 | <key>CFBundlePackageType</key> |
| 18 | <string>APPL</string> | 18 | <string>APPL</string> |
| 19 | <key>CFBundleShortVersionString</key> | 19 | <key>CFBundleShortVersionString</key> |
| 20 | - <string>1.0.0</string> | 20 | + <string>1.0.0-macos</string> |
| 21 | <key>CFBundleVersion</key> | 21 | <key>CFBundleVersion</key> |
| 22 | - <string>1.0.0</string> | 22 | + <string>1.0.0-macos</string> |
| 23 | <key>LSMinimumSystemVersion</key> | 23 | <key>LSMinimumSystemVersion</key> |
| 24 | <string>13.0.0</string> | 24 | <string>13.0.0</string> |
| 25 | <key>NSAppTransportSecurity</key> | 25 | <key>NSAppTransportSecurity</key> |
modified
build/darwin/Info.plist +2 -2 | @@ -17,9 +17,9 @@ | ||
| 17 | 17 | <key>CFBundlePackageType</key> |
| 18 | 18 | <string>APPL</string> |
| 19 | 19 | <key>CFBundleShortVersionString</key> |
| 20 | - <string>1.0.0</string> | |
| 20 | + <string>1.0.0-macos</string> | |
| 21 | 21 | <key>CFBundleVersion</key> |
| 22 | - <string>1.0.0</string> | |
| 22 | + <string>1.0.0-macos</string> | |
| 23 | 23 | <key>LSMinimumSystemVersion</key> |
| 24 | 24 | <string>13.0.0</string> |
| 25 | 25 | <key>NSHighResolutionCapable</key> |
| @@ -17,9 +17,9 @@ | |||
| 17 | <key>CFBundlePackageType</key> | 17 | <key>CFBundlePackageType</key> |
| 18 | <string>APPL</string> | 18 | <string>APPL</string> |
| 19 | <key>CFBundleShortVersionString</key> | 19 | <key>CFBundleShortVersionString</key> |
| 20 | - <string>1.0.0</string> | 20 | + <string>1.0.0-macos</string> |
| 21 | <key>CFBundleVersion</key> | 21 | <key>CFBundleVersion</key> |
| 22 | - <string>1.0.0</string> | 22 | + <string>1.0.0-macos</string> |
| 23 | <key>LSMinimumSystemVersion</key> | 23 | <key>LSMinimumSystemVersion</key> |
| 24 | <string>13.0.0</string> | 24 | <string>13.0.0</string> |
| 25 | <key>NSHighResolutionCapable</key> | 25 | <key>NSHighResolutionCapable</key> |
modified
build/linux/nfpm/nfpm.yaml +1 -1 | @@ -6,7 +6,7 @@ | ||
| 6 | 6 | name: "sidekicks" |
| 7 | 7 | arch: ${GOARCH} |
| 8 | 8 | platform: "linux" |
| 9 | -version: "1.0.0" | |
| 9 | +version: "1.0.0-macos" | |
| 10 | 10 | section: "default" |
| 11 | 11 | priority: "extra" |
| 12 | 12 | maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}> |
| @@ -6,7 +6,7 @@ | |||
| 6 | name: "sidekicks" | 6 | name: "sidekicks" |
| 7 | arch: ${GOARCH} | 7 | arch: ${GOARCH} |
| 8 | platform: "linux" | 8 | platform: "linux" |
| 9 | -version: "1.0.0" | 9 | +version: "1.0.0-macos" |
| 10 | section: "default" | 10 | section: "default" |
| 11 | priority: "extra" | 11 | priority: "extra" |
| 12 | maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}> | 12 | maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}> |
modified
build/windows/info.json +2 -2 | @@ -1,10 +1,10 @@ | ||
| 1 | 1 | { |
| 2 | 2 | "fixed": { |
| 3 | - "file_version": "1.0.0" | |
| 3 | + "file_version": "1.0.0-macos" | |
| 4 | 4 | }, |
| 5 | 5 | "info": { |
| 6 | 6 | "0409": { |
| 7 | - "ProductVersion": "1.0.0", | |
| 7 | + "ProductVersion": "1.0.0-macos", | |
| 8 | 8 | "CompanyName": "Philippe Charrière", |
| 9 | 9 | "FileDescription": "Converse with AI agents in channels", |
| 10 | 10 | "LegalCopyright": "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0", |
| @@ -1,10 +1,10 @@ | |||
| 1 | { | 1 | { |
| 2 | "fixed": { | 2 | "fixed": { |
| 3 | - "file_version": "1.0.0" | 3 | + "file_version": "1.0.0-macos" |
| 4 | }, | 4 | }, |
| 5 | "info": { | 5 | "info": { |
| 6 | "0409": { | 6 | "0409": { |
| 7 | - "ProductVersion": "1.0.0", | 7 | + "ProductVersion": "1.0.0-macos", |
| 8 | "CompanyName": "Philippe Charrière", | 8 | "CompanyName": "Philippe Charrière", |
| 9 | "FileDescription": "Converse with AI agents in channels", | 9 | "FileDescription": "Converse with AI agents in channels", |
| 10 | "LegalCopyright": "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0", | 10 | "LegalCopyright": "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0", |
modified
build/windows/nsis/wails_tools.nsh +1 -1 | @@ -14,7 +14,7 @@ | ||
| 14 | 14 | !define INFO_PRODUCTNAME "Sidekicks" |
| 15 | 15 | !endif |
| 16 | 16 | !ifndef INFO_PRODUCTVERSION |
| 17 | - !define INFO_PRODUCTVERSION "1.0.0" | |
| 17 | + !define INFO_PRODUCTVERSION "1.0.0-macos" | |
| 18 | 18 | !endif |
| 19 | 19 | !ifndef INFO_COPYRIGHT |
| 20 | 20 | !define INFO_COPYRIGHT "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0" |
| @@ -14,7 +14,7 @@ | |||
| 14 | !define INFO_PRODUCTNAME "Sidekicks" | 14 | !define INFO_PRODUCTNAME "Sidekicks" |
| 15 | !endif | 15 | !endif |
| 16 | !ifndef INFO_PRODUCTVERSION | 16 | !ifndef INFO_PRODUCTVERSION |
| 17 | - !define INFO_PRODUCTVERSION "1.0.0" | 17 | + !define INFO_PRODUCTVERSION "1.0.0-macos" |
| 18 | !endif | 18 | !endif |
| 19 | !ifndef INFO_COPYRIGHT | 19 | !ifndef INFO_COPYRIGHT |
| 20 | !define INFO_COPYRIGHT "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0" | 20 | !define INFO_COPYRIGHT "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0" |
modified
build/windows/wails.exe.manifest +1 -1 | @@ -1,6 +1,6 @@ | ||
| 1 | 1 | <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| 2 | 2 | <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> |
| 3 | - <assemblyIdentity type="win32" name="com.k33g.sidekicks" version="1.0.0" processorArchitecture="*"/> | |
| 3 | + <assemblyIdentity type="win32" name="com.k33g.sidekicks" version="1.0.0-macos" processorArchitecture="*"/> | |
| 4 | 4 | <dependency> |
| 5 | 5 | <dependentAssembly> |
| 6 | 6 | <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> |
| @@ -1,6 +1,6 @@ | |||
| 1 | <?xml version="1.0" encoding="UTF-8" standalone="yes"?> | 1 | <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| 2 | <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> | 2 | <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> |
| 3 | - <assemblyIdentity type="win32" name="com.k33g.sidekicks" version="1.0.0" processorArchitecture="*"/> | 3 | + <assemblyIdentity type="win32" name="com.k33g.sidekicks" version="1.0.0-macos" processorArchitecture="*"/> |
| 4 | <dependency> | 4 | <dependency> |
| 5 | <dependentAssembly> | 5 | <dependentAssembly> |
| 6 | <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> | 6 | <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> |
modified
docs/en/README.md +1 -1 | @@ -7,7 +7,7 @@ This documentation follows [Diátaxis](https://diataxis.fr): pick the section th | ||
| 7 | 7 | | You want to… | Section | Pages | |
| 8 | 8 | | --- | --- | --- | |
| 9 | 9 | | **learn** by doing | Tutorials | [Your first agent, without writing any configuration](tutorials/your-first-agent.md) · [A channel with two agents](tutorials/first-channel.md) · [Your first conversation with an agent](tutorials/first-conversation.md) · [Your first launch of Sidekicks](tutorials/first-launch.md) · [Your first ACP exchange with a test agent](tutorials/first-acp-exchange.md) | |
| 10 | -| **do** a specific task | How-to guides | [Install Sidekicks](how-to/install-sidekicks.md) · [Add an agent](how-to/add-an-agent.md) · [Work with an agent's files and terminal](how-to/work-with-an-agents-files.md) · [Run an agent in a Docker container](how-to/run-an-agent-in-docker.md) · [Run an agent in an sbx sandbox](how-to/run-an-agent-in-a-sandbox.md) · [Join files to a message](how-to/join-files-to-a-message.md) · [Manage channels and their agents](how-to/manage-channels.md) · [Edit or switch the configuration](how-to/edit-or-switch-the-configuration.md) · [Reset Sidekicks](how-to/reset-sidekicks.md) · [Develop the application](how-to/develop-the-application.md) · [Run the tests](how-to/run-the-tests.md) · [Check a change before merging it](how-to/check-before-merging.md) · [Run a test agent](how-to/run-a-test-agent.md) · [Run the end-to-end scenarios (v0.1)](how-to/run-the-end-to-end-scenarios.md) · [Publish a release](how-to/publish-a-release.md) · [Test issue #52 on macOS](how-to/test-issue-52-on-macos.md) · [Test issues #49 and #50 on macOS](how-to/test-issues-49-and-50-on-macos.md) · [Test issue #47 on macOS](how-to/test-issue-47-on-macos.md) · [Test milestone M4 on macOS](how-to/test-milestone-m4-on-macos.md) · [Test milestone M3 on macOS](how-to/test-milestone-m3-on-macos.md) · [Test milestone M2 on macOS](how-to/test-milestone-m2-on-macos.md) · [Test milestone M1 on macOS](how-to/test-milestone-m1-on-macos.md) · [Test milestone Initialize on macOS](how-to/test-milestone-initialize-on-macos.md) | | |
| 10 | +| **do** a specific task | How-to guides | [Install Sidekicks](how-to/install-sidekicks.md) · [Add an agent](how-to/add-an-agent.md) · [Work with an agent's files and terminal](how-to/work-with-an-agents-files.md) · [Run an agent in a Docker container](how-to/run-an-agent-in-docker.md) · [Run an agent in an sbx sandbox](how-to/run-an-agent-in-a-sandbox.md) · [Join files to a message](how-to/join-files-to-a-message.md) · [Manage channels and their agents](how-to/manage-channels.md) · [Edit or switch the configuration](how-to/edit-or-switch-the-configuration.md) · [Reset Sidekicks](how-to/reset-sidekicks.md) · [Develop the application](how-to/develop-the-application.md) · [Run the tests](how-to/run-the-tests.md) · [Check a change before merging it](how-to/check-before-merging.md) · [Run a test agent](how-to/run-a-test-agent.md) · [Run the end-to-end scenarios (v0.1)](how-to/run-the-end-to-end-scenarios.md) · [Publish a release](how-to/publish-a-release.md) · [Sign and notarize for macOS](how-to/sign-and-notarize-on-macos.md) · [Test issue #52 on macOS](how-to/test-issue-52-on-macos.md) · [Test issues #49 and #50 on macOS](how-to/test-issues-49-and-50-on-macos.md) · [Test issue #47 on macOS](how-to/test-issue-47-on-macos.md) · [Test milestone M4 on macOS](how-to/test-milestone-m4-on-macos.md) · [Test milestone M3 on macOS](how-to/test-milestone-m3-on-macos.md) · [Test milestone M2 on macOS](how-to/test-milestone-m2-on-macos.md) · [Test milestone M1 on macOS](how-to/test-milestone-m1-on-macos.md) · [Test milestone Initialize on macOS](how-to/test-milestone-initialize-on-macos.md) | | |
| 11 | 11 | | **look up** an exact detail | Reference | [The configuration file](reference/configuration.md) · [Keyboard shortcuts](reference/keyboard-shortcuts.md) · [Agents, channels and events](reference/agents-and-events.md) · [Commands](reference/commands.md) · [scripts/agents.sh](reference/agents-script.md) | |
| 12 | 12 | | **understand** why | Explanation | [Workspaces and terminals](explanation/workspaces-and-terminals.md) · [Channels and what each agent knows](explanation/channels-and-context.md) · [Permissions and trust](explanation/permissions.md) · [Why ACP](explanation/why-acp.md) · [The interface stack](explanation/ui-stack.md) · [Architecture](explanation/architecture.md) · [Memory and local models](explanation/memory-and-local-models.md) | |
| 13 | 13 | |
| @@ -7,7 +7,7 @@ This documentation follows [Diátaxis](https://diataxis.fr): pick the section th | |||
| 7 | | You want to… | Section | Pages | | 7 | | You want to… | Section | Pages | |
| 8 | | --- | --- | --- | | 8 | | --- | --- | --- | |
| 9 | | **learn** by doing | Tutorials | [Your first agent, without writing any configuration](tutorials/your-first-agent.md) · [A channel with two agents](tutorials/first-channel.md) · [Your first conversation with an agent](tutorials/first-conversation.md) · [Your first launch of Sidekicks](tutorials/first-launch.md) · [Your first ACP exchange with a test agent](tutorials/first-acp-exchange.md) | | 9 | | **learn** by doing | Tutorials | [Your first agent, without writing any configuration](tutorials/your-first-agent.md) · [A channel with two agents](tutorials/first-channel.md) · [Your first conversation with an agent](tutorials/first-conversation.md) · [Your first launch of Sidekicks](tutorials/first-launch.md) · [Your first ACP exchange with a test agent](tutorials/first-acp-exchange.md) | |
| 10 | -| **do** a specific task | How-to guides | [Install Sidekicks](how-to/install-sidekicks.md) · [Add an agent](how-to/add-an-agent.md) · [Work with an agent's files and terminal](how-to/work-with-an-agents-files.md) · [Run an agent in a Docker container](how-to/run-an-agent-in-docker.md) · [Run an agent in an sbx sandbox](how-to/run-an-agent-in-a-sandbox.md) · [Join files to a message](how-to/join-files-to-a-message.md) · [Manage channels and their agents](how-to/manage-channels.md) · [Edit or switch the configuration](how-to/edit-or-switch-the-configuration.md) · [Reset Sidekicks](how-to/reset-sidekicks.md) · [Develop the application](how-to/develop-the-application.md) · [Run the tests](how-to/run-the-tests.md) · [Check a change before merging it](how-to/check-before-merging.md) · [Run a test agent](how-to/run-a-test-agent.md) · [Run the end-to-end scenarios (v0.1)](how-to/run-the-end-to-end-scenarios.md) · [Publish a release](how-to/publish-a-release.md) · [Test issue #52 on macOS](how-to/test-issue-52-on-macos.md) · [Test issues #49 and #50 on macOS](how-to/test-issues-49-and-50-on-macos.md) · [Test issue #47 on macOS](how-to/test-issue-47-on-macos.md) · [Test milestone M4 on macOS](how-to/test-milestone-m4-on-macos.md) · [Test milestone M3 on macOS](how-to/test-milestone-m3-on-macos.md) · [Test milestone M2 on macOS](how-to/test-milestone-m2-on-macos.md) · [Test milestone M1 on macOS](how-to/test-milestone-m1-on-macos.md) · [Test milestone Initialize on macOS](how-to/test-milestone-initialize-on-macos.md) | | 10 | +| **do** a specific task | How-to guides | [Install Sidekicks](how-to/install-sidekicks.md) · [Add an agent](how-to/add-an-agent.md) · [Work with an agent's files and terminal](how-to/work-with-an-agents-files.md) · [Run an agent in a Docker container](how-to/run-an-agent-in-docker.md) · [Run an agent in an sbx sandbox](how-to/run-an-agent-in-a-sandbox.md) · [Join files to a message](how-to/join-files-to-a-message.md) · [Manage channels and their agents](how-to/manage-channels.md) · [Edit or switch the configuration](how-to/edit-or-switch-the-configuration.md) · [Reset Sidekicks](how-to/reset-sidekicks.md) · [Develop the application](how-to/develop-the-application.md) · [Run the tests](how-to/run-the-tests.md) · [Check a change before merging it](how-to/check-before-merging.md) · [Run a test agent](how-to/run-a-test-agent.md) · [Run the end-to-end scenarios (v0.1)](how-to/run-the-end-to-end-scenarios.md) · [Publish a release](how-to/publish-a-release.md) · [Sign and notarize for macOS](how-to/sign-and-notarize-on-macos.md) · [Test issue #52 on macOS](how-to/test-issue-52-on-macos.md) · [Test issues #49 and #50 on macOS](how-to/test-issues-49-and-50-on-macos.md) · [Test issue #47 on macOS](how-to/test-issue-47-on-macos.md) · [Test milestone M4 on macOS](how-to/test-milestone-m4-on-macos.md) · [Test milestone M3 on macOS](how-to/test-milestone-m3-on-macos.md) · [Test milestone M2 on macOS](how-to/test-milestone-m2-on-macos.md) · [Test milestone M1 on macOS](how-to/test-milestone-m1-on-macos.md) · [Test milestone Initialize on macOS](how-to/test-milestone-initialize-on-macos.md) | |
| 11 | | **look up** an exact detail | Reference | [The configuration file](reference/configuration.md) · [Keyboard shortcuts](reference/keyboard-shortcuts.md) · [Agents, channels and events](reference/agents-and-events.md) · [Commands](reference/commands.md) · [scripts/agents.sh](reference/agents-script.md) | | 11 | | **look up** an exact detail | Reference | [The configuration file](reference/configuration.md) · [Keyboard shortcuts](reference/keyboard-shortcuts.md) · [Agents, channels and events](reference/agents-and-events.md) · [Commands](reference/commands.md) · [scripts/agents.sh](reference/agents-script.md) | |
| 12 | | **understand** why | Explanation | [Workspaces and terminals](explanation/workspaces-and-terminals.md) · [Channels and what each agent knows](explanation/channels-and-context.md) · [Permissions and trust](explanation/permissions.md) · [Why ACP](explanation/why-acp.md) · [The interface stack](explanation/ui-stack.md) · [Architecture](explanation/architecture.md) · [Memory and local models](explanation/memory-and-local-models.md) | | 12 | | **understand** why | Explanation | [Workspaces and terminals](explanation/workspaces-and-terminals.md) · [Channels and what each agent knows](explanation/channels-and-context.md) · [Permissions and trust](explanation/permissions.md) · [Why ACP](explanation/why-acp.md) · [The interface stack](explanation/ui-stack.md) · [Architecture](explanation/architecture.md) · [Memory and local models](explanation/memory-and-local-models.md) | |
| 13 | 13 | ||
modified
docs/en/how-to/publish-a-release.md +1 -0 | @@ -20,5 +20,6 @@ This guide shows how to publish a Sidekicks release from a Mac: build every pack | ||
| 20 | 20 | |
| 21 | 21 | ## See also |
| 22 | 22 | |
| 23 | +- [How to sign and notarize Sidekicks for macOS](sign-and-notarize-on-macos.md) | |
| 23 | 24 | - [How to install Sidekicks](install-sidekicks.md) |
| 24 | 25 | - [Reference: commands](../reference/commands.md) — `make release-*`, `scripts/build-release.sh`, `scripts/tag-release.sh`, the Release workflow |
| @@ -20,5 +20,6 @@ This guide shows how to publish a Sidekicks release from a Mac: build every pack | |||
| 20 | 20 | ||
| 21 | ## See also | 21 | ## See also |
| 22 | 22 | ||
| 23 | +- [How to sign and notarize Sidekicks for macOS](sign-and-notarize-on-macos.md) | ||
| 23 | - [How to install Sidekicks](install-sidekicks.md) | 24 | - [How to install Sidekicks](install-sidekicks.md) |
| 24 | - [Reference: commands](../reference/commands.md) — `make release-*`, `scripts/build-release.sh`, `scripts/tag-release.sh`, the Release workflow | 25 | - [Reference: commands](../reference/commands.md) — `make release-*`, `scripts/build-release.sh`, `scripts/tag-release.sh`, the Release workflow |
added
docs/en/how-to/sign-and-notarize-on-macos.md +176 -0 | new file mode 100644 | ||
| @@ -0,0 +1,176 @@ | ||
| 1 | +# How to sign and notarize Sidekicks for macOS | |
| 2 | + | |
| 3 | +This guide shows how to sign Sidekicks with a **Developer ID** certificate and have Apple **notarize** it, so that it opens on any Mac without **Open Anyway**. It assumes a paid Apple Developer Program membership of which you are the **Account Holder** (only that role can create a Developer ID certificate), an Apple Silicon Mac with the project's development tools ([Develop the application](develop-the-application.md)), and a release built as [RELEASING.md](../../../RELEASING.md) describes. | |
| 4 | + | |
| 5 | +- **Part A** is done **once** (allow 30 minutes). | |
| 6 | +- **Part B** is done **for every release**, after `make release-build`, until signing is automated (issue #58). Allow 10 to 20 minutes, mostly waiting for Apple. | |
| 7 | + | |
| 8 | +Keep a Terminal window open at the root of the repository. | |
| 9 | + | |
| 10 | +## What signing and notarizing do | |
| 11 | + | |
| 12 | +| Step | Tool | What it brings | | |
| 13 | +| --- | --- | --- | | |
| 14 | +| Sign | `codesign` with your Developer ID certificate | macOS knows who made the app and that it was not changed | | |
| 15 | +| Hardened runtime | `codesign --options runtime` | required by Apple to notarize | | |
| 16 | +| Notarize | `xcrun notarytool` | Apple scans the app and issues a "ticket" | | |
| 17 | +| Staple | `xcrun stapler` | the ticket is attached to the app and the `.dmg`: Gatekeeper accepts them even offline | | |
| 18 | + | |
| 19 | +The app **and** the `.dmg` are signed, notarized and stapled. The `.zip` holds the stapled app. | |
| 20 | + | |
| 21 | +## Part A — once | |
| 22 | + | |
| 23 | +### A1. Note your Team ID | |
| 24 | + | |
| 25 | +1. Open [developer.apple.com/account](https://developer.apple.com/account), **Membership details**. | |
| 26 | +2. Note the **Team ID** (10 characters, e.g. `AB12CD34EF`). | |
| 27 | + | |
| 28 | +### A2. Create the Developer ID Application certificate | |
| 29 | + | |
| 30 | +With Xcode (the simplest): | |
| 31 | + | |
| 32 | +1. Open **Xcode → Settings… → Accounts**. If it is not there, click **+**, choose **Apple ID** and sign in with the email address and password of your Apple Developer account (the Apple ID, not the Team ID). | |
| 33 | +2. Your team shows under the account, with its Team ID: select it, click **Manage Certificates…**. | |
| 34 | +3. Click **+** at the bottom left, then **Developer ID Application**. | |
| 35 | + | |
| 36 | +Without Xcode: | |
| 37 | + | |
| 38 | +1. Open **Keychain Access → Certificate Assistant → Request a Certificate From a Certificate Authority…**, give your address, tick **Saved to disk**. You get a `.certSigningRequest` file. | |
| 39 | +2. On [developer.apple.com/account/resources/certificates](https://developer.apple.com/account/resources/certificates/add), choose **Developer ID Application**, profile **G2 Sub-CA**, upload the request, then download the certificate. | |
| 40 | +3. Double-click the `.cer` file: it goes to the **login** keychain. | |
| 41 | + | |
| 42 | +### A3. Check that the certificate can be used | |
| 43 | + | |
| 44 | +```bash | |
| 45 | +security find-identity -v -p codesigning | |
| 46 | +``` | |
| 47 | + | |
| 48 | +A line `"Developer ID Application: First Last (AB12CD34EF)"` must show. That is your **signing identity**: copy it exactly, without the quotes. | |
| 49 | + | |
| 50 | +If it is missing, or shows `CSSMERR_TP_NOT_TRUSTED`, install the **Developer ID - G2** intermediate certificate from [apple.com/certificateauthority](https://www.apple.com/certificateauthority/), then run the command again. | |
| 51 | + | |
| 52 | +### A4. Back up the certificate and its key | |
| 53 | + | |
| 54 | +The private key only exists on this Mac: without a backup, a failure means revoking the certificate and making a new one. | |
| 55 | + | |
| 56 | +1. In **Keychain Access**, **login** keychain, **My Certificates**, unfold **Developer ID Application: …** (the key shows under it). | |
| 57 | +2. Select the certificate, **File → Export Items…**, format **.p12**, choose a password. | |
| 58 | +3. Keep the `.p12` and its password in your password manager. Never put it in the repository. | |
| 59 | + | |
| 60 | +### A5. Create an app-specific password for notarization | |
| 61 | + | |
| 62 | +1. Open [account.apple.com](https://account.apple.com), **Sign-In and Security → App-Specific Passwords**. | |
| 63 | +2. Create one called `sidekicks-notary` and copy it (it is not shown again). | |
| 64 | + | |
| 65 | +### A6. Store the notarization profile in the keychain | |
| 66 | + | |
| 67 | +```bash | |
| 68 | +xcrun notarytool store-credentials sidekicks-notary \ | |
| 69 | + --apple-id "you@example.com" \ | |
| 70 | + --team-id "AB12CD34EF" | |
| 71 | +``` | |
| 72 | + | |
| 73 | +Paste the app-specific password when asked. Check: | |
| 74 | + | |
| 75 | +```bash | |
| 76 | +xcrun notarytool history --keychain-profile sidekicks-notary | |
| 77 | +``` | |
| 78 | + | |
| 79 | +A list (empty the first time) shows, with no authentication error. | |
| 80 | + | |
| 81 | +### A7. Set the two variables | |
| 82 | + | |
| 83 | +Add to your `~/.zshrc`, then open a new Terminal: | |
| 84 | + | |
| 85 | +```bash | |
| 86 | +export SIDEKICKS_SIGN_IDENTITY="Developer ID Application: First Last (AB12CD34EF)" | |
| 87 | +export SIDEKICKS_NOTARY_PROFILE="sidekicks-notary" | |
| 88 | +``` | |
| 89 | + | |
| 90 | +Part B uses them; the automation (issue #58) will too. | |
| 91 | + | |
| 92 | +### A8. Keep the app's identifier | |
| 93 | + | |
| 94 | +`CFBundleIdentifier` is `com.k33g.sidekicks` in `build/darwin/Info.plist` (and `Info.dev.plist`). Do not change it any more: macOS ties the permissions given to the app to it. | |
| 95 | + | |
| 96 | +## Part B — for every release | |
| 97 | + | |
| 98 | +These commands take the packages `make release-build` just put in `dist/` and the app left in `bin/sidekicks.app`. | |
| 99 | + | |
| 100 | +### B1. Build the release | |
| 101 | + | |
| 102 | +As usual ([RELEASING.md](../../../RELEASING.md), steps Before and 1): | |
| 103 | + | |
| 104 | +```bash | |
| 105 | +make release-build | |
| 106 | +``` | |
| 107 | + | |
| 108 | +### B2. Sign the app | |
| 109 | + | |
| 110 | +```bash | |
| 111 | +xattr -cr bin/sidekicks.app | |
| 112 | +codesign --force --options runtime --timestamp \ | |
| 113 | + --sign "$SIDEKICKS_SIGN_IDENTITY" bin/sidekicks.app | |
| 114 | +codesign --verify --strict --verbose=2 bin/sidekicks.app | |
| 115 | +codesign -dv --verbose=4 bin/sidekicks.app 2>&1 | grep -E "Authority=Developer ID Application|flags=.*runtime|Timestamp=" | |
| 116 | +``` | |
| 117 | + | |
| 118 | +The last command must show the **Developer ID Application** authority, the **runtime** flag and a **Timestamp** line. | |
| 119 | + | |
| 120 | +### B3. Notarize the app and staple the ticket | |
| 121 | + | |
| 122 | +```bash | |
| 123 | +ditto -c -k --keepParent bin/sidekicks.app /tmp/sidekicks-app.zip | |
| 124 | +xcrun notarytool submit /tmp/sidekicks-app.zip --keychain-profile "$SIDEKICKS_NOTARY_PROFILE" --wait | |
| 125 | +xcrun stapler staple bin/sidekicks.app | |
| 126 | +spctl -a -vvv -t exec bin/sidekicks.app | |
| 127 | +``` | |
| 128 | + | |
| 129 | +`notarytool` waits for Apple's answer (a few minutes) and must end with `status: Accepted`. `spctl` must say `accepted` and `source=Notarized Developer ID`. | |
| 130 | + | |
| 131 | +### B4. Make the `.dmg` again from the stapled app, sign it, notarize it | |
| 132 | + | |
| 133 | +```bash | |
| 134 | +wails3 task darwin:create:dmg | |
| 135 | +codesign --force --timestamp --sign "$SIDEKICKS_SIGN_IDENTITY" bin/sidekicks.dmg | |
| 136 | +xcrun notarytool submit bin/sidekicks.dmg --keychain-profile "$SIDEKICKS_NOTARY_PROFILE" --wait | |
| 137 | +xcrun stapler staple bin/sidekicks.dmg | |
| 138 | +spctl -a -vvv -t open --context context:primary-signature bin/sidekicks.dmg | |
| 139 | +``` | |
| 140 | + | |
| 141 | +`spctl` must say `accepted` and `source=Notarized Developer ID`. | |
| 142 | + | |
| 143 | +### B5. Replace the macOS packages of `dist/` and compute the checksums again | |
| 144 | + | |
| 145 | +```bash | |
| 146 | +names=($(scripts/package.sh names macos arm64)) # the .dmg, then the .zip | |
| 147 | +mv bin/sidekicks.dmg "dist/${names[0]}" | |
| 148 | +rm -f "dist/${names[1]}" && ditto -c -k --keepParent bin/sidekicks.app "dist/${names[1]}" | |
| 149 | +(cd dist && rm -f SHA256SUMS && shasum -a 256 -- * > ../SHA256SUMS.tmp) && mv SHA256SUMS.tmp dist/SHA256SUMS | |
| 150 | +cat dist/SHA256SUMS | |
| 151 | +``` | |
| 152 | + | |
| 153 | +### B6. Try it on another Mac | |
| 154 | + | |
| 155 | +1. Copy the `.dmg` to another Mac (or another user account), through the web or AirDrop: it must carry the quarantine attribute of a real download. | |
| 156 | +2. Open it, drag **sidekicks** to **Applications**, launch it: it opens directly, without **Open Anyway**. | |
| 157 | +3. Go through what the hardened runtime could hinder: a local agent, an agent in a container or in sbx, the Terminal tab, opening a file, drag and drop, Settings → Open…. | |
| 158 | + | |
| 159 | +### B7. Tag and publish | |
| 160 | + | |
| 161 | +Follow the rest of [RELEASING.md](../../../RELEASING.md) (steps 2 to 4): the files to attach are those of `dist/`. | |
| 162 | + | |
| 163 | +## Variants | |
| 164 | + | |
| 165 | +- **A separate macOS release, on a version already published** (e.g. `v1.0.0-macos`, issue #57): do part B from the version's commit (`git checkout v1.0.0`), then create the tag by hand: `git tag -a v1.0.0-macos -m "Sidekicks 1.0.0, macOS signed and notarized" && git push origin v1.0.0-macos`. The **Release** workflow starts and stops at its check (the tag is not `v` + the version of `build/config.yml`): this is expected. Create the release on Rickub from that tag and attach the `.dmg`, the `.zip` and `SHA256SUMS`. You can also simply replace the macOS files of the `v1.0.0` release. | |
| 166 | +- **Notarization is refused** (`status: Invalid`): `xcrun notarytool log <id> --keychain-profile "$SIDEKICKS_NOTARY_PROFILE"` gives the reason. The usual ones: a signature without `--options runtime` or without `--timestamp`, or an unsigned file in the app. | |
| 167 | +- **`codesign` refuses ("resource fork, Finder information, or similar detritus")**: the repository is in a synced folder, which adds metadata. `xattr -cr bin/sidekicks.app` and try again; if it comes back, copy the app to `/tmp` and sign it there. | |
| 168 | +- **The signed app does not start, or a feature no longer works**: the hardened runtime blocks something. Read **Console.app** at launch; if one entitlement is missing, add an entitlements file (`--entitlements build/darwin/entitlements.plist` in B2) with that entitlement only, and note it in issue #57. | |
| 169 | +- **Check an installed app**: `spctl -a -vvv /Applications/sidekicks.app` and `xcrun stapler validate /Applications/sidekicks.app`. | |
| 170 | +- **Another Mac to build on**: import the `.p12` (double-click), then do A6 and A7 again. | |
| 171 | + | |
| 172 | +## See also | |
| 173 | + | |
| 174 | +- [How to publish a release](publish-a-release.md) · [RELEASING.md](../../../RELEASING.md) | |
| 175 | +- [How to install Sidekicks](install-sidekicks.md) | |
| 176 | +- Apple: [Notarizing macOS software before distribution](https://developer.apple.com/documentation/security/notarizing-macos-software-before-distribution) | |
| new file mode 100644 | |||
| @@ -0,0 +1,176 @@ | |||
| 1 | +# How to sign and notarize Sidekicks for macOS | ||
| 2 | + | ||
| 3 | +This guide shows how to sign Sidekicks with a **Developer ID** certificate and have Apple **notarize** it, so that it opens on any Mac without **Open Anyway**. It assumes a paid Apple Developer Program membership of which you are the **Account Holder** (only that role can create a Developer ID certificate), an Apple Silicon Mac with the project's development tools ([Develop the application](develop-the-application.md)), and a release built as [RELEASING.md](../../../RELEASING.md) describes. | ||
| 4 | + | ||
| 5 | +- **Part A** is done **once** (allow 30 minutes). | ||
| 6 | +- **Part B** is done **for every release**, after `make release-build`, until signing is automated (issue #58). Allow 10 to 20 minutes, mostly waiting for Apple. | ||
| 7 | + | ||
| 8 | +Keep a Terminal window open at the root of the repository. | ||
| 9 | + | ||
| 10 | +## What signing and notarizing do | ||
| 11 | + | ||
| 12 | +| Step | Tool | What it brings | | ||
| 13 | +| --- | --- | --- | | ||
| 14 | +| Sign | `codesign` with your Developer ID certificate | macOS knows who made the app and that it was not changed | | ||
| 15 | +| Hardened runtime | `codesign --options runtime` | required by Apple to notarize | | ||
| 16 | +| Notarize | `xcrun notarytool` | Apple scans the app and issues a "ticket" | | ||
| 17 | +| Staple | `xcrun stapler` | the ticket is attached to the app and the `.dmg`: Gatekeeper accepts them even offline | | ||
| 18 | + | ||
| 19 | +The app **and** the `.dmg` are signed, notarized and stapled. The `.zip` holds the stapled app. | ||
| 20 | + | ||
| 21 | +## Part A — once | ||
| 22 | + | ||
| 23 | +### A1. Note your Team ID | ||
| 24 | + | ||
| 25 | +1. Open [developer.apple.com/account](https://developer.apple.com/account), **Membership details**. | ||
| 26 | +2. Note the **Team ID** (10 characters, e.g. `AB12CD34EF`). | ||
| 27 | + | ||
| 28 | +### A2. Create the Developer ID Application certificate | ||
| 29 | + | ||
| 30 | +With Xcode (the simplest): | ||
| 31 | + | ||
| 32 | +1. Open **Xcode → Settings… → Accounts**. If it is not there, click **+**, choose **Apple ID** and sign in with the email address and password of your Apple Developer account (the Apple ID, not the Team ID). | ||
| 33 | +2. Your team shows under the account, with its Team ID: select it, click **Manage Certificates…**. | ||
| 34 | +3. Click **+** at the bottom left, then **Developer ID Application**. | ||
| 35 | + | ||
| 36 | +Without Xcode: | ||
| 37 | + | ||
| 38 | +1. Open **Keychain Access → Certificate Assistant → Request a Certificate From a Certificate Authority…**, give your address, tick **Saved to disk**. You get a `.certSigningRequest` file. | ||
| 39 | +2. On [developer.apple.com/account/resources/certificates](https://developer.apple.com/account/resources/certificates/add), choose **Developer ID Application**, profile **G2 Sub-CA**, upload the request, then download the certificate. | ||
| 40 | +3. Double-click the `.cer` file: it goes to the **login** keychain. | ||
| 41 | + | ||
| 42 | +### A3. Check that the certificate can be used | ||
| 43 | + | ||
| 44 | +```bash | ||
| 45 | +security find-identity -v -p codesigning | ||
| 46 | +``` | ||
| 47 | + | ||
| 48 | +A line `"Developer ID Application: First Last (AB12CD34EF)"` must show. That is your **signing identity**: copy it exactly, without the quotes. | ||
| 49 | + | ||
| 50 | +If it is missing, or shows `CSSMERR_TP_NOT_TRUSTED`, install the **Developer ID - G2** intermediate certificate from [apple.com/certificateauthority](https://www.apple.com/certificateauthority/), then run the command again. | ||
| 51 | + | ||
| 52 | +### A4. Back up the certificate and its key | ||
| 53 | + | ||
| 54 | +The private key only exists on this Mac: without a backup, a failure means revoking the certificate and making a new one. | ||
| 55 | + | ||
| 56 | +1. In **Keychain Access**, **login** keychain, **My Certificates**, unfold **Developer ID Application: …** (the key shows under it). | ||
| 57 | +2. Select the certificate, **File → Export Items…**, format **.p12**, choose a password. | ||
| 58 | +3. Keep the `.p12` and its password in your password manager. Never put it in the repository. | ||
| 59 | + | ||
| 60 | +### A5. Create an app-specific password for notarization | ||
| 61 | + | ||
| 62 | +1. Open [account.apple.com](https://account.apple.com), **Sign-In and Security → App-Specific Passwords**. | ||
| 63 | +2. Create one called `sidekicks-notary` and copy it (it is not shown again). | ||
| 64 | + | ||
| 65 | +### A6. Store the notarization profile in the keychain | ||
| 66 | + | ||
| 67 | +```bash | ||
| 68 | +xcrun notarytool store-credentials sidekicks-notary \ | ||
| 69 | + --apple-id "you@example.com" \ | ||
| 70 | + --team-id "AB12CD34EF" | ||
| 71 | +``` | ||
| 72 | + | ||
| 73 | +Paste the app-specific password when asked. Check: | ||
| 74 | + | ||
| 75 | +```bash | ||
| 76 | +xcrun notarytool history --keychain-profile sidekicks-notary | ||
| 77 | +``` | ||
| 78 | + | ||
| 79 | +A list (empty the first time) shows, with no authentication error. | ||
| 80 | + | ||
| 81 | +### A7. Set the two variables | ||
| 82 | + | ||
| 83 | +Add to your `~/.zshrc`, then open a new Terminal: | ||
| 84 | + | ||
| 85 | +```bash | ||
| 86 | +export SIDEKICKS_SIGN_IDENTITY="Developer ID Application: First Last (AB12CD34EF)" | ||
| 87 | +export SIDEKICKS_NOTARY_PROFILE="sidekicks-notary" | ||
| 88 | +``` | ||
| 89 | + | ||
| 90 | +Part B uses them; the automation (issue #58) will too. | ||
| 91 | + | ||
| 92 | +### A8. Keep the app's identifier | ||
| 93 | + | ||
| 94 | +`CFBundleIdentifier` is `com.k33g.sidekicks` in `build/darwin/Info.plist` (and `Info.dev.plist`). Do not change it any more: macOS ties the permissions given to the app to it. | ||
| 95 | + | ||
| 96 | +## Part B — for every release | ||
| 97 | + | ||
| 98 | +These commands take the packages `make release-build` just put in `dist/` and the app left in `bin/sidekicks.app`. | ||
| 99 | + | ||
| 100 | +### B1. Build the release | ||
| 101 | + | ||
| 102 | +As usual ([RELEASING.md](../../../RELEASING.md), steps Before and 1): | ||
| 103 | + | ||
| 104 | +```bash | ||
| 105 | +make release-build | ||
| 106 | +``` | ||
| 107 | + | ||
| 108 | +### B2. Sign the app | ||
| 109 | + | ||
| 110 | +```bash | ||
| 111 | +xattr -cr bin/sidekicks.app | ||
| 112 | +codesign --force --options runtime --timestamp \ | ||
| 113 | + --sign "$SIDEKICKS_SIGN_IDENTITY" bin/sidekicks.app | ||
| 114 | +codesign --verify --strict --verbose=2 bin/sidekicks.app | ||
| 115 | +codesign -dv --verbose=4 bin/sidekicks.app 2>&1 | grep -E "Authority=Developer ID Application|flags=.*runtime|Timestamp=" | ||
| 116 | +``` | ||
| 117 | + | ||
| 118 | +The last command must show the **Developer ID Application** authority, the **runtime** flag and a **Timestamp** line. | ||
| 119 | + | ||
| 120 | +### B3. Notarize the app and staple the ticket | ||
| 121 | + | ||
| 122 | +```bash | ||
| 123 | +ditto -c -k --keepParent bin/sidekicks.app /tmp/sidekicks-app.zip | ||
| 124 | +xcrun notarytool submit /tmp/sidekicks-app.zip --keychain-profile "$SIDEKICKS_NOTARY_PROFILE" --wait | ||
| 125 | +xcrun stapler staple bin/sidekicks.app | ||
| 126 | +spctl -a -vvv -t exec bin/sidekicks.app | ||
| 127 | +``` | ||
| 128 | + | ||
| 129 | +`notarytool` waits for Apple's answer (a few minutes) and must end with `status: Accepted`. `spctl` must say `accepted` and `source=Notarized Developer ID`. | ||
| 130 | + | ||
| 131 | +### B4. Make the `.dmg` again from the stapled app, sign it, notarize it | ||
| 132 | + | ||
| 133 | +```bash | ||
| 134 | +wails3 task darwin:create:dmg | ||
| 135 | +codesign --force --timestamp --sign "$SIDEKICKS_SIGN_IDENTITY" bin/sidekicks.dmg | ||
| 136 | +xcrun notarytool submit bin/sidekicks.dmg --keychain-profile "$SIDEKICKS_NOTARY_PROFILE" --wait | ||
| 137 | +xcrun stapler staple bin/sidekicks.dmg | ||
| 138 | +spctl -a -vvv -t open --context context:primary-signature bin/sidekicks.dmg | ||
| 139 | +``` | ||
| 140 | + | ||
| 141 | +`spctl` must say `accepted` and `source=Notarized Developer ID`. | ||
| 142 | + | ||
| 143 | +### B5. Replace the macOS packages of `dist/` and compute the checksums again | ||
| 144 | + | ||
| 145 | +```bash | ||
| 146 | +names=($(scripts/package.sh names macos arm64)) # the .dmg, then the .zip | ||
| 147 | +mv bin/sidekicks.dmg "dist/${names[0]}" | ||
| 148 | +rm -f "dist/${names[1]}" && ditto -c -k --keepParent bin/sidekicks.app "dist/${names[1]}" | ||
| 149 | +(cd dist && rm -f SHA256SUMS && shasum -a 256 -- * > ../SHA256SUMS.tmp) && mv SHA256SUMS.tmp dist/SHA256SUMS | ||
| 150 | +cat dist/SHA256SUMS | ||
| 151 | +``` | ||
| 152 | + | ||
| 153 | +### B6. Try it on another Mac | ||
| 154 | + | ||
| 155 | +1. Copy the `.dmg` to another Mac (or another user account), through the web or AirDrop: it must carry the quarantine attribute of a real download. | ||
| 156 | +2. Open it, drag **sidekicks** to **Applications**, launch it: it opens directly, without **Open Anyway**. | ||
| 157 | +3. Go through what the hardened runtime could hinder: a local agent, an agent in a container or in sbx, the Terminal tab, opening a file, drag and drop, Settings → Open…. | ||
| 158 | + | ||
| 159 | +### B7. Tag and publish | ||
| 160 | + | ||
| 161 | +Follow the rest of [RELEASING.md](../../../RELEASING.md) (steps 2 to 4): the files to attach are those of `dist/`. | ||
| 162 | + | ||
| 163 | +## Variants | ||
| 164 | + | ||
| 165 | +- **A separate macOS release, on a version already published** (e.g. `v1.0.0-macos`, issue #57): do part B from the version's commit (`git checkout v1.0.0`), then create the tag by hand: `git tag -a v1.0.0-macos -m "Sidekicks 1.0.0, macOS signed and notarized" && git push origin v1.0.0-macos`. The **Release** workflow starts and stops at its check (the tag is not `v` + the version of `build/config.yml`): this is expected. Create the release on Rickub from that tag and attach the `.dmg`, the `.zip` and `SHA256SUMS`. You can also simply replace the macOS files of the `v1.0.0` release. | ||
| 166 | +- **Notarization is refused** (`status: Invalid`): `xcrun notarytool log <id> --keychain-profile "$SIDEKICKS_NOTARY_PROFILE"` gives the reason. The usual ones: a signature without `--options runtime` or without `--timestamp`, or an unsigned file in the app. | ||
| 167 | +- **`codesign` refuses ("resource fork, Finder information, or similar detritus")**: the repository is in a synced folder, which adds metadata. `xattr -cr bin/sidekicks.app` and try again; if it comes back, copy the app to `/tmp` and sign it there. | ||
| 168 | +- **The signed app does not start, or a feature no longer works**: the hardened runtime blocks something. Read **Console.app** at launch; if one entitlement is missing, add an entitlements file (`--entitlements build/darwin/entitlements.plist` in B2) with that entitlement only, and note it in issue #57. | ||
| 169 | +- **Check an installed app**: `spctl -a -vvv /Applications/sidekicks.app` and `xcrun stapler validate /Applications/sidekicks.app`. | ||
| 170 | +- **Another Mac to build on**: import the `.p12` (double-click), then do A6 and A7 again. | ||
| 171 | + | ||
| 172 | +## See also | ||
| 173 | + | ||
| 174 | +- [How to publish a release](publish-a-release.md) · [RELEASING.md](../../../RELEASING.md) | ||
| 175 | +- [How to install Sidekicks](install-sidekicks.md) | ||
| 176 | +- Apple: [Notarizing macOS software before distribution](https://developer.apple.com/documentation/security/notarizing-macos-software-before-distribution) | ||
modified
docs/fr/README.md +1 -1 | @@ -7,7 +7,7 @@ Cette documentation suit la méthode [Diátaxis](https://diataxis.fr) : choisiss | ||
| 7 | 7 | | Vous voulez… | Section | Pages | |
| 8 | 8 | | --- | --- | --- | |
| 9 | 9 | | **apprendre** en pratiquant | Tutoriels | [Votre premier agent, sans écrire de configuration](tutorials/premier-agent.md) · [Un channel avec deux agents](tutorials/premier-channel.md) · [Votre première conversation avec un agent](tutorials/premiere-conversation.md) · [Votre premier lancement de Sidekicks](tutorials/premier-lancement.md) · [Votre premier échange ACP avec un agent de test](tutorials/premier-echange-acp.md) | |
| 10 | -| **réaliser** une tâche précise | Guides pratiques | [Installer Sidekicks](how-to/installer-sidekicks.md) · [Ajouter un agent](how-to/ajouter-un-agent.md) · [Travailler avec les fichiers et le terminal d'un agent](how-to/fichiers-et-terminal-d-un-agent.md) · [Lancer un agent dans un conteneur Docker](how-to/lancer-un-agent-dans-docker.md) · [Lancer un agent dans une sandbox sbx](how-to/lancer-un-agent-dans-une-sandbox.md) · [Joindre des fichiers à un message](how-to/joindre-des-fichiers-a-un-message.md) · [Gérer les channels et leurs agents](how-to/gerer-les-channels.md) · [Modifier ou changer la configuration](how-to/modifier-ou-changer-la-configuration.md) · [Repartir de zéro](how-to/repartir-de-zero.md) · [Développer l'application](how-to/developper-l-application.md) · [Lancer les tests](how-to/lancer-les-tests.md) · [Vérifier une modification avant de la fusionner](how-to/verifier-avant-de-fusionner.md) · [Lancer un agent de test](how-to/lancer-un-agent-de-test.md) · [Dérouler les scénarios de bout en bout (v0.1)](how-to/derouler-les-scenarios-de-bout-en-bout.md) · [Publier une release](how-to/publier-une-release.md) · [Tester l'issue #52 sous macOS](how-to/tester-l-issue-52-sous-macos.md) · [Tester les issues #49 et #50 sous macOS](how-to/tester-les-issues-49-et-50-sous-macos.md) · [Tester l'issue #47 sous macOS](how-to/tester-l-issue-47-sous-macos.md) · [Tester la milestone M4 sous macOS](how-to/tester-la-milestone-m4-sous-macos.md) · [Tester la milestone M3 sous macOS](how-to/tester-la-milestone-m3-sous-macos.md) · [Tester la milestone M2 sous macOS](how-to/tester-la-milestone-m2-sous-macos.md) · [Tester la milestone M1 sous macOS](how-to/tester-la-milestone-m1-sous-macos.md) · [Tester la milestone Initialize sous macOS](how-to/tester-la-milestone-initialize-sous-macos.md) | | |
| 10 | +| **réaliser** une tâche précise | Guides pratiques | [Installer Sidekicks](how-to/installer-sidekicks.md) · [Ajouter un agent](how-to/ajouter-un-agent.md) · [Travailler avec les fichiers et le terminal d'un agent](how-to/fichiers-et-terminal-d-un-agent.md) · [Lancer un agent dans un conteneur Docker](how-to/lancer-un-agent-dans-docker.md) · [Lancer un agent dans une sandbox sbx](how-to/lancer-un-agent-dans-une-sandbox.md) · [Joindre des fichiers à un message](how-to/joindre-des-fichiers-a-un-message.md) · [Gérer les channels et leurs agents](how-to/gerer-les-channels.md) · [Modifier ou changer la configuration](how-to/modifier-ou-changer-la-configuration.md) · [Repartir de zéro](how-to/repartir-de-zero.md) · [Développer l'application](how-to/developper-l-application.md) · [Lancer les tests](how-to/lancer-les-tests.md) · [Vérifier une modification avant de la fusionner](how-to/verifier-avant-de-fusionner.md) · [Lancer un agent de test](how-to/lancer-un-agent-de-test.md) · [Dérouler les scénarios de bout en bout (v0.1)](how-to/derouler-les-scenarios-de-bout-en-bout.md) · [Publier une release](how-to/publier-une-release.md) · [Signer et notariser pour macOS](how-to/signer-et-notariser-sous-macos.md) · [Tester l'issue #52 sous macOS](how-to/tester-l-issue-52-sous-macos.md) · [Tester les issues #49 et #50 sous macOS](how-to/tester-les-issues-49-et-50-sous-macos.md) · [Tester l'issue #47 sous macOS](how-to/tester-l-issue-47-sous-macos.md) · [Tester la milestone M4 sous macOS](how-to/tester-la-milestone-m4-sous-macos.md) · [Tester la milestone M3 sous macOS](how-to/tester-la-milestone-m3-sous-macos.md) · [Tester la milestone M2 sous macOS](how-to/tester-la-milestone-m2-sous-macos.md) · [Tester la milestone M1 sous macOS](how-to/tester-la-milestone-m1-sous-macos.md) · [Tester la milestone Initialize sous macOS](how-to/tester-la-milestone-initialize-sous-macos.md) | | |
| 11 | 11 | | **consulter** un détail exact | Référence | [Le fichier de configuration](reference/configuration.md) · [Raccourcis clavier](reference/raccourcis-clavier.md) · [Agents, channels et événements](reference/agents-et-evenements.md) · [Commandes](reference/commandes.md) · [scripts/agents.sh](reference/script-agents.md) | |
| 12 | 12 | | **comprendre** le pourquoi | Explications | [Workspaces et terminaux](explanation/workspaces-et-terminaux.md) · [Les channels et ce que sait chaque agent](explanation/channels-et-contexte.md) · [Permissions et confiance](explanation/permissions-et-confiance.md) · [Pourquoi ACP](explanation/pourquoi-acp.md) · [La stack de l'interface](explanation/stack-interface.md) · [Architecture](explanation/architecture.md) · [Mémoire et modèles locaux](explanation/memoire-et-modeles-locaux.md) | |
| 13 | 13 | |
| @@ -7,7 +7,7 @@ Cette documentation suit la méthode [Diátaxis](https://diataxis.fr) : choisiss | |||
| 7 | | Vous voulez… | Section | Pages | | 7 | | Vous voulez… | Section | Pages | |
| 8 | | --- | --- | --- | | 8 | | --- | --- | --- | |
| 9 | | **apprendre** en pratiquant | Tutoriels | [Votre premier agent, sans écrire de configuration](tutorials/premier-agent.md) · [Un channel avec deux agents](tutorials/premier-channel.md) · [Votre première conversation avec un agent](tutorials/premiere-conversation.md) · [Votre premier lancement de Sidekicks](tutorials/premier-lancement.md) · [Votre premier échange ACP avec un agent de test](tutorials/premier-echange-acp.md) | | 9 | | **apprendre** en pratiquant | Tutoriels | [Votre premier agent, sans écrire de configuration](tutorials/premier-agent.md) · [Un channel avec deux agents](tutorials/premier-channel.md) · [Votre première conversation avec un agent](tutorials/premiere-conversation.md) · [Votre premier lancement de Sidekicks](tutorials/premier-lancement.md) · [Votre premier échange ACP avec un agent de test](tutorials/premier-echange-acp.md) | |
| 10 | -| **réaliser** une tâche précise | Guides pratiques | [Installer Sidekicks](how-to/installer-sidekicks.md) · [Ajouter un agent](how-to/ajouter-un-agent.md) · [Travailler avec les fichiers et le terminal d'un agent](how-to/fichiers-et-terminal-d-un-agent.md) · [Lancer un agent dans un conteneur Docker](how-to/lancer-un-agent-dans-docker.md) · [Lancer un agent dans une sandbox sbx](how-to/lancer-un-agent-dans-une-sandbox.md) · [Joindre des fichiers à un message](how-to/joindre-des-fichiers-a-un-message.md) · [Gérer les channels et leurs agents](how-to/gerer-les-channels.md) · [Modifier ou changer la configuration](how-to/modifier-ou-changer-la-configuration.md) · [Repartir de zéro](how-to/repartir-de-zero.md) · [Développer l'application](how-to/developper-l-application.md) · [Lancer les tests](how-to/lancer-les-tests.md) · [Vérifier une modification avant de la fusionner](how-to/verifier-avant-de-fusionner.md) · [Lancer un agent de test](how-to/lancer-un-agent-de-test.md) · [Dérouler les scénarios de bout en bout (v0.1)](how-to/derouler-les-scenarios-de-bout-en-bout.md) · [Publier une release](how-to/publier-une-release.md) · [Tester l'issue #52 sous macOS](how-to/tester-l-issue-52-sous-macos.md) · [Tester les issues #49 et #50 sous macOS](how-to/tester-les-issues-49-et-50-sous-macos.md) · [Tester l'issue #47 sous macOS](how-to/tester-l-issue-47-sous-macos.md) · [Tester la milestone M4 sous macOS](how-to/tester-la-milestone-m4-sous-macos.md) · [Tester la milestone M3 sous macOS](how-to/tester-la-milestone-m3-sous-macos.md) · [Tester la milestone M2 sous macOS](how-to/tester-la-milestone-m2-sous-macos.md) · [Tester la milestone M1 sous macOS](how-to/tester-la-milestone-m1-sous-macos.md) · [Tester la milestone Initialize sous macOS](how-to/tester-la-milestone-initialize-sous-macos.md) | | 10 | +| **réaliser** une tâche précise | Guides pratiques | [Installer Sidekicks](how-to/installer-sidekicks.md) · [Ajouter un agent](how-to/ajouter-un-agent.md) · [Travailler avec les fichiers et le terminal d'un agent](how-to/fichiers-et-terminal-d-un-agent.md) · [Lancer un agent dans un conteneur Docker](how-to/lancer-un-agent-dans-docker.md) · [Lancer un agent dans une sandbox sbx](how-to/lancer-un-agent-dans-une-sandbox.md) · [Joindre des fichiers à un message](how-to/joindre-des-fichiers-a-un-message.md) · [Gérer les channels et leurs agents](how-to/gerer-les-channels.md) · [Modifier ou changer la configuration](how-to/modifier-ou-changer-la-configuration.md) · [Repartir de zéro](how-to/repartir-de-zero.md) · [Développer l'application](how-to/developper-l-application.md) · [Lancer les tests](how-to/lancer-les-tests.md) · [Vérifier une modification avant de la fusionner](how-to/verifier-avant-de-fusionner.md) · [Lancer un agent de test](how-to/lancer-un-agent-de-test.md) · [Dérouler les scénarios de bout en bout (v0.1)](how-to/derouler-les-scenarios-de-bout-en-bout.md) · [Publier une release](how-to/publier-une-release.md) · [Signer et notariser pour macOS](how-to/signer-et-notariser-sous-macos.md) · [Tester l'issue #52 sous macOS](how-to/tester-l-issue-52-sous-macos.md) · [Tester les issues #49 et #50 sous macOS](how-to/tester-les-issues-49-et-50-sous-macos.md) · [Tester l'issue #47 sous macOS](how-to/tester-l-issue-47-sous-macos.md) · [Tester la milestone M4 sous macOS](how-to/tester-la-milestone-m4-sous-macos.md) · [Tester la milestone M3 sous macOS](how-to/tester-la-milestone-m3-sous-macos.md) · [Tester la milestone M2 sous macOS](how-to/tester-la-milestone-m2-sous-macos.md) · [Tester la milestone M1 sous macOS](how-to/tester-la-milestone-m1-sous-macos.md) · [Tester la milestone Initialize sous macOS](how-to/tester-la-milestone-initialize-sous-macos.md) | |
| 11 | | **consulter** un détail exact | Référence | [Le fichier de configuration](reference/configuration.md) · [Raccourcis clavier](reference/raccourcis-clavier.md) · [Agents, channels et événements](reference/agents-et-evenements.md) · [Commandes](reference/commandes.md) · [scripts/agents.sh](reference/script-agents.md) | | 11 | | **consulter** un détail exact | Référence | [Le fichier de configuration](reference/configuration.md) · [Raccourcis clavier](reference/raccourcis-clavier.md) · [Agents, channels et événements](reference/agents-et-evenements.md) · [Commandes](reference/commandes.md) · [scripts/agents.sh](reference/script-agents.md) | |
| 12 | | **comprendre** le pourquoi | Explications | [Workspaces et terminaux](explanation/workspaces-et-terminaux.md) · [Les channels et ce que sait chaque agent](explanation/channels-et-contexte.md) · [Permissions et confiance](explanation/permissions-et-confiance.md) · [Pourquoi ACP](explanation/pourquoi-acp.md) · [La stack de l'interface](explanation/stack-interface.md) · [Architecture](explanation/architecture.md) · [Mémoire et modèles locaux](explanation/memoire-et-modeles-locaux.md) | | 12 | | **comprendre** le pourquoi | Explications | [Workspaces et terminaux](explanation/workspaces-et-terminaux.md) · [Les channels et ce que sait chaque agent](explanation/channels-et-contexte.md) · [Permissions et confiance](explanation/permissions-et-confiance.md) · [Pourquoi ACP](explanation/pourquoi-acp.md) · [La stack de l'interface](explanation/stack-interface.md) · [Architecture](explanation/architecture.md) · [Mémoire et modèles locaux](explanation/memoire-et-modeles-locaux.md) | |
| 13 | 13 | ||
modified
docs/fr/how-to/publier-une-release.md +1 -0 | @@ -20,5 +20,6 @@ Ce guide montre comment publier une release de Sidekicks depuis un Mac : constru | ||
| 20 | 20 | |
| 21 | 21 | ## Voir aussi |
| 22 | 22 | |
| 23 | +- [Signer et notariser Sidekicks pour macOS](signer-et-notariser-sous-macos.md) | |
| 23 | 24 | - [Installer Sidekicks](installer-sidekicks.md) |
| 24 | 25 | - [Référence : commandes](../reference/commandes.md) — `make release-*`, `scripts/build-release.sh`, `scripts/tag-release.sh`, le workflow Release |
| @@ -20,5 +20,6 @@ Ce guide montre comment publier une release de Sidekicks depuis un Mac : constru | |||
| 20 | 20 | ||
| 21 | ## Voir aussi | 21 | ## Voir aussi |
| 22 | 22 | ||
| 23 | +- [Signer et notariser Sidekicks pour macOS](signer-et-notariser-sous-macos.md) | ||
| 23 | - [Installer Sidekicks](installer-sidekicks.md) | 24 | - [Installer Sidekicks](installer-sidekicks.md) |
| 24 | - [Référence : commandes](../reference/commandes.md) — `make release-*`, `scripts/build-release.sh`, `scripts/tag-release.sh`, le workflow Release | 25 | - [Référence : commandes](../reference/commandes.md) — `make release-*`, `scripts/build-release.sh`, `scripts/tag-release.sh`, le workflow Release |
added
docs/fr/how-to/signer-et-notariser-sous-macos.md +176 -0 | new file mode 100644 | ||
| @@ -0,0 +1,176 @@ | ||
| 1 | +# Signer et notariser Sidekicks pour macOS | |
| 2 | + | |
| 3 | +Ce guide montre comment signer Sidekicks avec un certificat **Developer ID** et le faire **notariser** par Apple, pour qu'il s'ouvre sur n'importe quel Mac sans passer par **Ouvrir quand même**. Il suppose une adhésion payante à l'Apple Developer Program dont vous êtes le **titulaire du compte** (Account Holder : seul ce rôle peut créer un certificat Developer ID), un Mac Apple Silicon avec les outils de développement du projet ([Développer l'application](developper-l-application.md)), et une release déjà construite comme le décrit [RELEASING.fr.md](../../../RELEASING.fr.md). | |
| 4 | + | |
| 5 | +- La **partie A** se fait **une seule fois** (compter 30 minutes). | |
| 6 | +- La **partie B** se fait **à chaque release**, après `make release-build`, tant que la signature n'est pas automatisée (issue #58). Comptez 10 à 20 minutes, surtout de l'attente chez Apple. | |
| 7 | + | |
| 8 | +Gardez une fenêtre du Terminal ouverte à la racine du dépôt. | |
| 9 | + | |
| 10 | +## Ce que font signature et notarisation | |
| 11 | + | |
| 12 | +| Étape | Outil | Ce qu'elle apporte | | |
| 13 | +| --- | --- | --- | | |
| 14 | +| Signer | `codesign` avec votre certificat Developer ID | macOS sait qui a fait l'app et qu'elle n'a pas été modifiée | | |
| 15 | +| Runtime renforcé | `codesign --options runtime` | exigé par Apple pour notariser | | |
| 16 | +| Notariser | `xcrun notarytool` | Apple analyse l'app et délivre un « ticket » | | |
| 17 | +| Agrafer | `xcrun stapler` | le ticket est collé à l'app et au `.dmg` : Gatekeeper l'accepte même hors ligne | | |
| 18 | + | |
| 19 | +L'app **et** le `.dmg` sont signés, notarisés et agrafés. Le `.zip` contient l'app agrafée. | |
| 20 | + | |
| 21 | +## Partie A — une seule fois | |
| 22 | + | |
| 23 | +### A1. Relever votre Team ID | |
| 24 | + | |
| 25 | +1. Ouvrez [developer.apple.com/account](https://developer.apple.com/account), section **Membership details**. | |
| 26 | +2. Notez le **Team ID** (10 caractères, par exemple `AB12CD34EF`). | |
| 27 | + | |
| 28 | +### A2. Créer le certificat Developer ID Application | |
| 29 | + | |
| 30 | +Avec Xcode (le plus simple) : | |
| 31 | + | |
| 32 | +1. Ouvrez **Xcode → Settings… → Accounts**. S'il n'y est pas, cliquez sur **+**, choisissez **Apple ID** et connectez-vous avec l'adresse e-mail et le mot de passe de votre compte Apple Developer (l'Apple ID, pas le Team ID). | |
| 33 | +2. Votre équipe apparaît sous le compte, avec son Team ID : sélectionnez-la, cliquez sur **Manage Certificates…**. | |
| 34 | +3. Cliquez sur **+** en bas à gauche, puis **Developer ID Application**. | |
| 35 | + | |
| 36 | +Sans Xcode : | |
| 37 | + | |
| 38 | +1. Ouvrez **Trousseaux d'accès → Assistant de certification → Demander un certificat à une autorité de certification…**, indiquez votre adresse, cochez **Enregistré sur le disque**. Vous obtenez un fichier `.certSigningRequest`. | |
| 39 | +2. Sur [developer.apple.com/account/resources/certificates](https://developer.apple.com/account/resources/certificates/add), choisissez **Developer ID Application**, profil **G2 Sub-CA**, envoyez le fichier de demande, puis téléchargez le certificat. | |
| 40 | +3. Double-cliquez sur le fichier `.cer` : il rejoint le trousseau **session**. | |
| 41 | + | |
| 42 | +### A3. Vérifier que le certificat est utilisable | |
| 43 | + | |
| 44 | +```bash | |
| 45 | +security find-identity -v -p codesigning | |
| 46 | +``` | |
| 47 | + | |
| 48 | +Une ligne `"Developer ID Application: Prénom Nom (AB12CD34EF)"` doit apparaître. C'est votre **identité de signature** : copiez-la exactement, guillemets exclus. | |
| 49 | + | |
| 50 | +Si elle manque, ou s'affiche avec `CSSMERR_TP_NOT_TRUSTED`, installez le certificat intermédiaire **Developer ID - G2** depuis [apple.com/certificateauthority](https://www.apple.com/certificateauthority/), puis relancez la commande. | |
| 51 | + | |
| 52 | +### A4. Sauvegarder le certificat et sa clé | |
| 53 | + | |
| 54 | +La clé privée n'existe que sur ce Mac : sans sauvegarde, une panne oblige à révoquer le certificat et à en refaire un. | |
| 55 | + | |
| 56 | +1. Dans **Trousseaux d'accès**, trousseau **session**, catégorie **Mes certificats**, dépliez **Developer ID Application: …** (la clé apparaît dessous). | |
| 57 | +2. Sélectionnez le certificat, **Fichier → Exporter les éléments…**, format **.p12**, choisissez un mot de passe. | |
| 58 | +3. Rangez le `.p12` et son mot de passe dans votre gestionnaire de mots de passe. Ne le mettez jamais dans le dépôt. | |
| 59 | + | |
| 60 | +### A5. Créer un mot de passe d'application pour la notarisation | |
| 61 | + | |
| 62 | +1. Ouvrez [account.apple.com](https://account.apple.com), **Connexion et sécurité → Mots de passe pour les apps**. | |
| 63 | +2. Créez-en un nommé `sidekicks-notary` et copiez-le (il ne sera plus affiché). | |
| 64 | + | |
| 65 | +### A6. Enregistrer le profil de notarisation dans le trousseau | |
| 66 | + | |
| 67 | +```bash | |
| 68 | +xcrun notarytool store-credentials sidekicks-notary \ | |
| 69 | + --apple-id "vous@example.com" \ | |
| 70 | + --team-id "AB12CD34EF" | |
| 71 | +``` | |
| 72 | + | |
| 73 | +Collez le mot de passe d'application quand il est demandé. Vérifiez : | |
| 74 | + | |
| 75 | +```bash | |
| 76 | +xcrun notarytool history --keychain-profile sidekicks-notary | |
| 77 | +``` | |
| 78 | + | |
| 79 | +Une liste (vide la première fois) s'affiche, sans erreur d'authentification. | |
| 80 | + | |
| 81 | +### A7. Définir les deux variables | |
| 82 | + | |
| 83 | +Ajoutez à votre `~/.zshrc`, puis ouvrez un nouveau Terminal : | |
| 84 | + | |
| 85 | +```bash | |
| 86 | +export SIDEKICKS_SIGN_IDENTITY="Developer ID Application: Prénom Nom (AB12CD34EF)" | |
| 87 | +export SIDEKICKS_NOTARY_PROFILE="sidekicks-notary" | |
| 88 | +``` | |
| 89 | + | |
| 90 | +La partie B les utilise ; l'automatisation (issue #58) les utilisera aussi. | |
| 91 | + | |
| 92 | +### A8. Garder l'identifiant de l'app | |
| 93 | + | |
| 94 | +`CFBundleIdentifier` vaut `com.k33g.sidekicks` dans `build/darwin/Info.plist` (et `Info.dev.plist`). Ne le changez plus : macOS y rattache les autorisations accordées à l'app. | |
| 95 | + | |
| 96 | +## Partie B — à chaque release | |
| 97 | + | |
| 98 | +Ces commandes reprennent les paquets que `make release-build` vient de mettre dans `dist/` et l'app restée dans `bin/sidekicks.app`. | |
| 99 | + | |
| 100 | +### B1. Construire la release | |
| 101 | + | |
| 102 | +Comme d'habitude ([RELEASING.fr.md](../../../RELEASING.fr.md), étapes Avant et 1) : | |
| 103 | + | |
| 104 | +```bash | |
| 105 | +make release-build | |
| 106 | +``` | |
| 107 | + | |
| 108 | +### B2. Signer l'app | |
| 109 | + | |
| 110 | +```bash | |
| 111 | +xattr -cr bin/sidekicks.app | |
| 112 | +codesign --force --options runtime --timestamp \ | |
| 113 | + --sign "$SIDEKICKS_SIGN_IDENTITY" bin/sidekicks.app | |
| 114 | +codesign --verify --strict --verbose=2 bin/sidekicks.app | |
| 115 | +codesign -dv --verbose=4 bin/sidekicks.app 2>&1 | grep -E "Authority=Developer ID Application|flags=.*runtime|Timestamp=" | |
| 116 | +``` | |
| 117 | + | |
| 118 | +La dernière commande doit afficher l'autorité **Developer ID Application**, le drapeau **runtime** et une ligne **Timestamp**. | |
| 119 | + | |
| 120 | +### B3. Notariser l'app et agrafer le ticket | |
| 121 | + | |
| 122 | +```bash | |
| 123 | +ditto -c -k --keepParent bin/sidekicks.app /tmp/sidekicks-app.zip | |
| 124 | +xcrun notarytool submit /tmp/sidekicks-app.zip --keychain-profile "$SIDEKICKS_NOTARY_PROFILE" --wait | |
| 125 | +xcrun stapler staple bin/sidekicks.app | |
| 126 | +spctl -a -vvv -t exec bin/sidekicks.app | |
| 127 | +``` | |
| 128 | + | |
| 129 | +`notarytool` attend la réponse d'Apple (quelques minutes) et doit finir par `status: Accepted`. `spctl` doit dire `accepted` et `source=Notarized Developer ID`. | |
| 130 | + | |
| 131 | +### B4. Refaire le `.dmg` à partir de l'app agrafée, le signer, le notariser | |
| 132 | + | |
| 133 | +```bash | |
| 134 | +wails3 task darwin:create:dmg | |
| 135 | +codesign --force --timestamp --sign "$SIDEKICKS_SIGN_IDENTITY" bin/sidekicks.dmg | |
| 136 | +xcrun notarytool submit bin/sidekicks.dmg --keychain-profile "$SIDEKICKS_NOTARY_PROFILE" --wait | |
| 137 | +xcrun stapler staple bin/sidekicks.dmg | |
| 138 | +spctl -a -vvv -t open --context context:primary-signature bin/sidekicks.dmg | |
| 139 | +``` | |
| 140 | + | |
| 141 | +`spctl` doit dire `accepted` et `source=Notarized Developer ID`. | |
| 142 | + | |
| 143 | +### B5. Remplacer les paquets macOS de `dist/` et recalculer les sommes | |
| 144 | + | |
| 145 | +```bash | |
| 146 | +names=($(scripts/package.sh names macos arm64)) # le .dmg, puis le .zip | |
| 147 | +mv bin/sidekicks.dmg "dist/${names[0]}" | |
| 148 | +rm -f "dist/${names[1]}" && ditto -c -k --keepParent bin/sidekicks.app "dist/${names[1]}" | |
| 149 | +(cd dist && rm -f SHA256SUMS && shasum -a 256 -- * > ../SHA256SUMS.tmp) && mv SHA256SUMS.tmp dist/SHA256SUMS | |
| 150 | +cat dist/SHA256SUMS | |
| 151 | +``` | |
| 152 | + | |
| 153 | +### B6. Essayer sur un autre Mac | |
| 154 | + | |
| 155 | +1. Copiez le `.dmg` sur un autre Mac (ou un autre compte utilisateur), par le web ou AirDrop : il doit porter l'attribut de quarantaine d'un vrai téléchargement. | |
| 156 | +2. Ouvrez-le, glissez **sidekicks** dans **Applications**, lancez-le : il s'ouvre directement, sans **Ouvrir quand même**. | |
| 157 | +3. Faites le tour de ce que le runtime renforcé pourrait gêner : un agent local, un agent en conteneur ou en sbx, l'onglet Terminal, l'ouverture d'un fichier, le glisser-déposer, Settings → Open…. | |
| 158 | + | |
| 159 | +### B7. Taguer et publier | |
| 160 | + | |
| 161 | +Suivez la suite de [RELEASING.fr.md](../../../RELEASING.fr.md) (étapes 2 à 4) : les fichiers à attacher sont ceux de `dist/`. | |
| 162 | + | |
| 163 | +## Variantes | |
| 164 | + | |
| 165 | +- **Release macOS à part, sur une version déjà publiée** (par exemple `v1.0.0-macos`, issue #57) : faites la partie B depuis le commit de la version (`git checkout v1.0.0`), puis créez le tag à la main : `git tag -a v1.0.0-macos -m "Sidekicks 1.0.0, macOS signé et notarisé" && git push origin v1.0.0-macos`. Le workflow **Release** démarre et s'arrête à sa vérification (le tag n'est pas `v` + la version de `build/config.yml`) : c'est attendu. Créez la release sur Rickub depuis ce tag et attachez le `.dmg`, le `.zip` et `SHA256SUMS`. Vous pouvez aussi simplement remplacer les fichiers macOS de la release `v1.0.0`. | |
| 166 | +- **La notarisation est refusée** (`status: Invalid`) : `xcrun notarytool log <id> --keychain-profile "$SIDEKICKS_NOTARY_PROFILE"` donne la raison. Les plus courantes : signature sans `--options runtime` ou sans `--timestamp`, ou un fichier non signé dans l'app. | |
| 167 | +- **`codesign` refuse (« resource fork, Finder information, or similar detritus »)** : le dépôt est dans un dossier synchronisé, qui ajoute des métadonnées. `xattr -cr bin/sidekicks.app` puis recommencez ; si cela revient, copiez l'app dans `/tmp` et signez-la là. | |
| 168 | +- **L'app signée ne démarre pas ou une fonction ne marche plus** : le runtime renforcé bloque quelque chose. Lisez **Console.app** au lancement ; si un droit précis manque, ajoutez un fichier d'entitlements (`--entitlements build/darwin/entitlements.plist` dans B2) avec seulement ce droit, et notez-le dans l'issue #57. | |
| 169 | +- **Vérifier une app installée** : `spctl -a -vvv /Applications/sidekicks.app` et `xcrun stapler validate /Applications/sidekicks.app`. | |
| 170 | +- **Un autre Mac pour construire** : importez le `.p12` (double-clic), puis refaites A6 et A7. | |
| 171 | + | |
| 172 | +## Voir aussi | |
| 173 | + | |
| 174 | +- [Publier une release](publier-une-release.md) · [RELEASING.fr.md](../../../RELEASING.fr.md) | |
| 175 | +- [Installer Sidekicks](installer-sidekicks.md) | |
| 176 | +- Apple : [Notarizing macOS software before distribution](https://developer.apple.com/documentation/security/notarizing-macos-software-before-distribution) | |
| new file mode 100644 | |||
| @@ -0,0 +1,176 @@ | |||
| 1 | +# Signer et notariser Sidekicks pour macOS | ||
| 2 | + | ||
| 3 | +Ce guide montre comment signer Sidekicks avec un certificat **Developer ID** et le faire **notariser** par Apple, pour qu'il s'ouvre sur n'importe quel Mac sans passer par **Ouvrir quand même**. Il suppose une adhésion payante à l'Apple Developer Program dont vous êtes le **titulaire du compte** (Account Holder : seul ce rôle peut créer un certificat Developer ID), un Mac Apple Silicon avec les outils de développement du projet ([Développer l'application](developper-l-application.md)), et une release déjà construite comme le décrit [RELEASING.fr.md](../../../RELEASING.fr.md). | ||
| 4 | + | ||
| 5 | +- La **partie A** se fait **une seule fois** (compter 30 minutes). | ||
| 6 | +- La **partie B** se fait **à chaque release**, après `make release-build`, tant que la signature n'est pas automatisée (issue #58). Comptez 10 à 20 minutes, surtout de l'attente chez Apple. | ||
| 7 | + | ||
| 8 | +Gardez une fenêtre du Terminal ouverte à la racine du dépôt. | ||
| 9 | + | ||
| 10 | +## Ce que font signature et notarisation | ||
| 11 | + | ||
| 12 | +| Étape | Outil | Ce qu'elle apporte | | ||
| 13 | +| --- | --- | --- | | ||
| 14 | +| Signer | `codesign` avec votre certificat Developer ID | macOS sait qui a fait l'app et qu'elle n'a pas été modifiée | | ||
| 15 | +| Runtime renforcé | `codesign --options runtime` | exigé par Apple pour notariser | | ||
| 16 | +| Notariser | `xcrun notarytool` | Apple analyse l'app et délivre un « ticket » | | ||
| 17 | +| Agrafer | `xcrun stapler` | le ticket est collé à l'app et au `.dmg` : Gatekeeper l'accepte même hors ligne | | ||
| 18 | + | ||
| 19 | +L'app **et** le `.dmg` sont signés, notarisés et agrafés. Le `.zip` contient l'app agrafée. | ||
| 20 | + | ||
| 21 | +## Partie A — une seule fois | ||
| 22 | + | ||
| 23 | +### A1. Relever votre Team ID | ||
| 24 | + | ||
| 25 | +1. Ouvrez [developer.apple.com/account](https://developer.apple.com/account), section **Membership details**. | ||
| 26 | +2. Notez le **Team ID** (10 caractères, par exemple `AB12CD34EF`). | ||
| 27 | + | ||
| 28 | +### A2. Créer le certificat Developer ID Application | ||
| 29 | + | ||
| 30 | +Avec Xcode (le plus simple) : | ||
| 31 | + | ||
| 32 | +1. Ouvrez **Xcode → Settings… → Accounts**. S'il n'y est pas, cliquez sur **+**, choisissez **Apple ID** et connectez-vous avec l'adresse e-mail et le mot de passe de votre compte Apple Developer (l'Apple ID, pas le Team ID). | ||
| 33 | +2. Votre équipe apparaît sous le compte, avec son Team ID : sélectionnez-la, cliquez sur **Manage Certificates…**. | ||
| 34 | +3. Cliquez sur **+** en bas à gauche, puis **Developer ID Application**. | ||
| 35 | + | ||
| 36 | +Sans Xcode : | ||
| 37 | + | ||
| 38 | +1. Ouvrez **Trousseaux d'accès → Assistant de certification → Demander un certificat à une autorité de certification…**, indiquez votre adresse, cochez **Enregistré sur le disque**. Vous obtenez un fichier `.certSigningRequest`. | ||
| 39 | +2. Sur [developer.apple.com/account/resources/certificates](https://developer.apple.com/account/resources/certificates/add), choisissez **Developer ID Application**, profil **G2 Sub-CA**, envoyez le fichier de demande, puis téléchargez le certificat. | ||
| 40 | +3. Double-cliquez sur le fichier `.cer` : il rejoint le trousseau **session**. | ||
| 41 | + | ||
| 42 | +### A3. Vérifier que le certificat est utilisable | ||
| 43 | + | ||
| 44 | +```bash | ||
| 45 | +security find-identity -v -p codesigning | ||
| 46 | +``` | ||
| 47 | + | ||
| 48 | +Une ligne `"Developer ID Application: Prénom Nom (AB12CD34EF)"` doit apparaître. C'est votre **identité de signature** : copiez-la exactement, guillemets exclus. | ||
| 49 | + | ||
| 50 | +Si elle manque, ou s'affiche avec `CSSMERR_TP_NOT_TRUSTED`, installez le certificat intermédiaire **Developer ID - G2** depuis [apple.com/certificateauthority](https://www.apple.com/certificateauthority/), puis relancez la commande. | ||
| 51 | + | ||
| 52 | +### A4. Sauvegarder le certificat et sa clé | ||
| 53 | + | ||
| 54 | +La clé privée n'existe que sur ce Mac : sans sauvegarde, une panne oblige à révoquer le certificat et à en refaire un. | ||
| 55 | + | ||
| 56 | +1. Dans **Trousseaux d'accès**, trousseau **session**, catégorie **Mes certificats**, dépliez **Developer ID Application: …** (la clé apparaît dessous). | ||
| 57 | +2. Sélectionnez le certificat, **Fichier → Exporter les éléments…**, format **.p12**, choisissez un mot de passe. | ||
| 58 | +3. Rangez le `.p12` et son mot de passe dans votre gestionnaire de mots de passe. Ne le mettez jamais dans le dépôt. | ||
| 59 | + | ||
| 60 | +### A5. Créer un mot de passe d'application pour la notarisation | ||
| 61 | + | ||
| 62 | +1. Ouvrez [account.apple.com](https://account.apple.com), **Connexion et sécurité → Mots de passe pour les apps**. | ||
| 63 | +2. Créez-en un nommé `sidekicks-notary` et copiez-le (il ne sera plus affiché). | ||
| 64 | + | ||
| 65 | +### A6. Enregistrer le profil de notarisation dans le trousseau | ||
| 66 | + | ||
| 67 | +```bash | ||
| 68 | +xcrun notarytool store-credentials sidekicks-notary \ | ||
| 69 | + --apple-id "vous@example.com" \ | ||
| 70 | + --team-id "AB12CD34EF" | ||
| 71 | +``` | ||
| 72 | + | ||
| 73 | +Collez le mot de passe d'application quand il est demandé. Vérifiez : | ||
| 74 | + | ||
| 75 | +```bash | ||
| 76 | +xcrun notarytool history --keychain-profile sidekicks-notary | ||
| 77 | +``` | ||
| 78 | + | ||
| 79 | +Une liste (vide la première fois) s'affiche, sans erreur d'authentification. | ||
| 80 | + | ||
| 81 | +### A7. Définir les deux variables | ||
| 82 | + | ||
| 83 | +Ajoutez à votre `~/.zshrc`, puis ouvrez un nouveau Terminal : | ||
| 84 | + | ||
| 85 | +```bash | ||
| 86 | +export SIDEKICKS_SIGN_IDENTITY="Developer ID Application: Prénom Nom (AB12CD34EF)" | ||
| 87 | +export SIDEKICKS_NOTARY_PROFILE="sidekicks-notary" | ||
| 88 | +``` | ||
| 89 | + | ||
| 90 | +La partie B les utilise ; l'automatisation (issue #58) les utilisera aussi. | ||
| 91 | + | ||
| 92 | +### A8. Garder l'identifiant de l'app | ||
| 93 | + | ||
| 94 | +`CFBundleIdentifier` vaut `com.k33g.sidekicks` dans `build/darwin/Info.plist` (et `Info.dev.plist`). Ne le changez plus : macOS y rattache les autorisations accordées à l'app. | ||
| 95 | + | ||
| 96 | +## Partie B — à chaque release | ||
| 97 | + | ||
| 98 | +Ces commandes reprennent les paquets que `make release-build` vient de mettre dans `dist/` et l'app restée dans `bin/sidekicks.app`. | ||
| 99 | + | ||
| 100 | +### B1. Construire la release | ||
| 101 | + | ||
| 102 | +Comme d'habitude ([RELEASING.fr.md](../../../RELEASING.fr.md), étapes Avant et 1) : | ||
| 103 | + | ||
| 104 | +```bash | ||
| 105 | +make release-build | ||
| 106 | +``` | ||
| 107 | + | ||
| 108 | +### B2. Signer l'app | ||
| 109 | + | ||
| 110 | +```bash | ||
| 111 | +xattr -cr bin/sidekicks.app | ||
| 112 | +codesign --force --options runtime --timestamp \ | ||
| 113 | + --sign "$SIDEKICKS_SIGN_IDENTITY" bin/sidekicks.app | ||
| 114 | +codesign --verify --strict --verbose=2 bin/sidekicks.app | ||
| 115 | +codesign -dv --verbose=4 bin/sidekicks.app 2>&1 | grep -E "Authority=Developer ID Application|flags=.*runtime|Timestamp=" | ||
| 116 | +``` | ||
| 117 | + | ||
| 118 | +La dernière commande doit afficher l'autorité **Developer ID Application**, le drapeau **runtime** et une ligne **Timestamp**. | ||
| 119 | + | ||
| 120 | +### B3. Notariser l'app et agrafer le ticket | ||
| 121 | + | ||
| 122 | +```bash | ||
| 123 | +ditto -c -k --keepParent bin/sidekicks.app /tmp/sidekicks-app.zip | ||
| 124 | +xcrun notarytool submit /tmp/sidekicks-app.zip --keychain-profile "$SIDEKICKS_NOTARY_PROFILE" --wait | ||
| 125 | +xcrun stapler staple bin/sidekicks.app | ||
| 126 | +spctl -a -vvv -t exec bin/sidekicks.app | ||
| 127 | +``` | ||
| 128 | + | ||
| 129 | +`notarytool` attend la réponse d'Apple (quelques minutes) et doit finir par `status: Accepted`. `spctl` doit dire `accepted` et `source=Notarized Developer ID`. | ||
| 130 | + | ||
| 131 | +### B4. Refaire le `.dmg` à partir de l'app agrafée, le signer, le notariser | ||
| 132 | + | ||
| 133 | +```bash | ||
| 134 | +wails3 task darwin:create:dmg | ||
| 135 | +codesign --force --timestamp --sign "$SIDEKICKS_SIGN_IDENTITY" bin/sidekicks.dmg | ||
| 136 | +xcrun notarytool submit bin/sidekicks.dmg --keychain-profile "$SIDEKICKS_NOTARY_PROFILE" --wait | ||
| 137 | +xcrun stapler staple bin/sidekicks.dmg | ||
| 138 | +spctl -a -vvv -t open --context context:primary-signature bin/sidekicks.dmg | ||
| 139 | +``` | ||
| 140 | + | ||
| 141 | +`spctl` doit dire `accepted` et `source=Notarized Developer ID`. | ||
| 142 | + | ||
| 143 | +### B5. Remplacer les paquets macOS de `dist/` et recalculer les sommes | ||
| 144 | + | ||
| 145 | +```bash | ||
| 146 | +names=($(scripts/package.sh names macos arm64)) # le .dmg, puis le .zip | ||
| 147 | +mv bin/sidekicks.dmg "dist/${names[0]}" | ||
| 148 | +rm -f "dist/${names[1]}" && ditto -c -k --keepParent bin/sidekicks.app "dist/${names[1]}" | ||
| 149 | +(cd dist && rm -f SHA256SUMS && shasum -a 256 -- * > ../SHA256SUMS.tmp) && mv SHA256SUMS.tmp dist/SHA256SUMS | ||
| 150 | +cat dist/SHA256SUMS | ||
| 151 | +``` | ||
| 152 | + | ||
| 153 | +### B6. Essayer sur un autre Mac | ||
| 154 | + | ||
| 155 | +1. Copiez le `.dmg` sur un autre Mac (ou un autre compte utilisateur), par le web ou AirDrop : il doit porter l'attribut de quarantaine d'un vrai téléchargement. | ||
| 156 | +2. Ouvrez-le, glissez **sidekicks** dans **Applications**, lancez-le : il s'ouvre directement, sans **Ouvrir quand même**. | ||
| 157 | +3. Faites le tour de ce que le runtime renforcé pourrait gêner : un agent local, un agent en conteneur ou en sbx, l'onglet Terminal, l'ouverture d'un fichier, le glisser-déposer, Settings → Open…. | ||
| 158 | + | ||
| 159 | +### B7. Taguer et publier | ||
| 160 | + | ||
| 161 | +Suivez la suite de [RELEASING.fr.md](../../../RELEASING.fr.md) (étapes 2 à 4) : les fichiers à attacher sont ceux de `dist/`. | ||
| 162 | + | ||
| 163 | +## Variantes | ||
| 164 | + | ||
| 165 | +- **Release macOS à part, sur une version déjà publiée** (par exemple `v1.0.0-macos`, issue #57) : faites la partie B depuis le commit de la version (`git checkout v1.0.0`), puis créez le tag à la main : `git tag -a v1.0.0-macos -m "Sidekicks 1.0.0, macOS signé et notarisé" && git push origin v1.0.0-macos`. Le workflow **Release** démarre et s'arrête à sa vérification (le tag n'est pas `v` + la version de `build/config.yml`) : c'est attendu. Créez la release sur Rickub depuis ce tag et attachez le `.dmg`, le `.zip` et `SHA256SUMS`. Vous pouvez aussi simplement remplacer les fichiers macOS de la release `v1.0.0`. | ||
| 166 | +- **La notarisation est refusée** (`status: Invalid`) : `xcrun notarytool log <id> --keychain-profile "$SIDEKICKS_NOTARY_PROFILE"` donne la raison. Les plus courantes : signature sans `--options runtime` ou sans `--timestamp`, ou un fichier non signé dans l'app. | ||
| 167 | +- **`codesign` refuse (« resource fork, Finder information, or similar detritus »)** : le dépôt est dans un dossier synchronisé, qui ajoute des métadonnées. `xattr -cr bin/sidekicks.app` puis recommencez ; si cela revient, copiez l'app dans `/tmp` et signez-la là. | ||
| 168 | +- **L'app signée ne démarre pas ou une fonction ne marche plus** : le runtime renforcé bloque quelque chose. Lisez **Console.app** au lancement ; si un droit précis manque, ajoutez un fichier d'entitlements (`--entitlements build/darwin/entitlements.plist` dans B2) avec seulement ce droit, et notez-le dans l'issue #57. | ||
| 169 | +- **Vérifier une app installée** : `spctl -a -vvv /Applications/sidekicks.app` et `xcrun stapler validate /Applications/sidekicks.app`. | ||
| 170 | +- **Un autre Mac pour construire** : importez le `.p12` (double-clic), puis refaites A6 et A7. | ||
| 171 | + | ||
| 172 | +## Voir aussi | ||
| 173 | + | ||
| 174 | +- [Publier une release](publier-une-release.md) · [RELEASING.fr.md](../../../RELEASING.fr.md) | ||
| 175 | +- [Installer Sidekicks](installer-sidekicks.md) | ||
| 176 | +- Apple : [Notarizing macOS software before distribution](https://developer.apple.com/documentation/security/notarizing-macos-software-before-distribution) | ||
added
docs/release-notes/v1.0.0-macos.fr.md +28 -0 | new file mode 100644 | ||
| @@ -0,0 +1,28 @@ | ||
| 1 | +# Sidekicks 1.0.0 pour macOS — signé et notarisé | |
| 2 | + | |
| 3 | +[English](https://rickub.com/bots-garden/sidekicks/blob/v1.0.0-macos/docs/release-notes/v1.0.0-macos.md) | |
| 4 | + | |
| 5 | +Le même Sidekicks 1.0.0, reconstruit pour macOS et, pour la première fois, **signé avec un certificat Developer ID et notarisé par Apple**. Rien d'autre ne change : les fonctionnalités sont celles de la [1.0.0](https://rickub.com/bots-garden/sidekicks/blob/v1.0.0/docs/release-notes/v1.0.0.fr.md). | |
| 6 | + | |
| 7 | +## Ce que cela change pour vous | |
| 8 | + | |
| 9 | +- Le `.dmg` s'ouvre et Sidekicks démarre **sans passer par Réglages Système → Confidentialité et sécurité → Ouvrir quand même** : macOS sait qui a fait l'application et Apple l'a vérifiée. | |
| 10 | +- Le ticket de notarisation est agrafé à l'application et au `.dmg` : la vérification fonctionne aussi hors ligne. | |
| 11 | +- Si vous avez installé la 1.0.0 (ou la 0.1.0) avec **Ouvrir quand même**, remplacez-la par celle-ci : glissez le nouveau **sidekicks** dans **Applications** et confirmez le remplacement. Votre configuration et votre historique sont gardés. | |
| 12 | + | |
| 13 | +## Fichiers | |
| 14 | + | |
| 15 | +| Fichier | Système | | |
| 16 | +| --- | --- | | |
| 17 | +| `Sidekicks-1.0.0-macos-arm64.dmg` | macOS 13 ou plus récent, Apple Silicon — signé et notarisé | | |
| 18 | +| `Sidekicks-1.0.0-macos-arm64.zip` | la même application, dans un `.zip` | | |
| 19 | +| `SHA256SUMS` | sommes de contrôle : `shasum -a 256 -c SHA256SUMS --ignore-missing` | | |
| 20 | + | |
| 21 | +Les paquets Windows ne changent pas : prenez-les dans la [release 1.0.0](https://rickub.com/bots-garden/sidekicks/releases/tag/v1.0.0). | |
| 22 | + | |
| 23 | +## Vérifier vous-même | |
| 24 | + | |
| 25 | +```bash | |
| 26 | +spctl -a -vvv /Applications/sidekicks.app # accepted · source=Notarized Developer ID | |
| 27 | +xcrun stapler validate /Applications/sidekicks.app | |
| 28 | +``` | |
| new file mode 100644 | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | +# Sidekicks 1.0.0 pour macOS — signé et notarisé | ||
| 2 | + | ||
| 3 | +[English](https://rickub.com/bots-garden/sidekicks/blob/v1.0.0-macos/docs/release-notes/v1.0.0-macos.md) | ||
| 4 | + | ||
| 5 | +Le même Sidekicks 1.0.0, reconstruit pour macOS et, pour la première fois, **signé avec un certificat Developer ID et notarisé par Apple**. Rien d'autre ne change : les fonctionnalités sont celles de la [1.0.0](https://rickub.com/bots-garden/sidekicks/blob/v1.0.0/docs/release-notes/v1.0.0.fr.md). | ||
| 6 | + | ||
| 7 | +## Ce que cela change pour vous | ||
| 8 | + | ||
| 9 | +- Le `.dmg` s'ouvre et Sidekicks démarre **sans passer par Réglages Système → Confidentialité et sécurité → Ouvrir quand même** : macOS sait qui a fait l'application et Apple l'a vérifiée. | ||
| 10 | +- Le ticket de notarisation est agrafé à l'application et au `.dmg` : la vérification fonctionne aussi hors ligne. | ||
| 11 | +- Si vous avez installé la 1.0.0 (ou la 0.1.0) avec **Ouvrir quand même**, remplacez-la par celle-ci : glissez le nouveau **sidekicks** dans **Applications** et confirmez le remplacement. Votre configuration et votre historique sont gardés. | ||
| 12 | + | ||
| 13 | +## Fichiers | ||
| 14 | + | ||
| 15 | +| Fichier | Système | | ||
| 16 | +| --- | --- | | ||
| 17 | +| `Sidekicks-1.0.0-macos-arm64.dmg` | macOS 13 ou plus récent, Apple Silicon — signé et notarisé | | ||
| 18 | +| `Sidekicks-1.0.0-macos-arm64.zip` | la même application, dans un `.zip` | | ||
| 19 | +| `SHA256SUMS` | sommes de contrôle : `shasum -a 256 -c SHA256SUMS --ignore-missing` | | ||
| 20 | + | ||
| 21 | +Les paquets Windows ne changent pas : prenez-les dans la [release 1.0.0](https://rickub.com/bots-garden/sidekicks/releases/tag/v1.0.0). | ||
| 22 | + | ||
| 23 | +## Vérifier vous-même | ||
| 24 | + | ||
| 25 | +```bash | ||
| 26 | +spctl -a -vvv /Applications/sidekicks.app # accepted · source=Notarized Developer ID | ||
| 27 | +xcrun stapler validate /Applications/sidekicks.app | ||
| 28 | +``` | ||
added
docs/release-notes/v1.0.0-macos.md +28 -0 | new file mode 100644 | ||
| @@ -0,0 +1,28 @@ | ||
| 1 | +# Sidekicks 1.0.0 for macOS — signed and notarized | |
| 2 | + | |
| 3 | +[Français](https://rickub.com/bots-garden/sidekicks/blob/v1.0.0-macos/docs/release-notes/v1.0.0-macos.fr.md) | |
| 4 | + | |
| 5 | +The same Sidekicks 1.0.0, rebuilt for macOS and, for the first time, **signed with a Developer ID certificate and notarized by Apple**. Nothing else changes: the features are those of [1.0.0](https://rickub.com/bots-garden/sidekicks/blob/v1.0.0/docs/release-notes/v1.0.0.md). | |
| 6 | + | |
| 7 | +## What it changes for you | |
| 8 | + | |
| 9 | +- The `.dmg` opens and Sidekicks starts **without going through System Settings → Privacy & Security → Open Anyway**: macOS knows who made the application and Apple has checked it. | |
| 10 | +- The notarization ticket is stapled to the application and to the `.dmg`: the check also works offline. | |
| 11 | +- If you installed 1.0.0 (or 0.1.0) with **Open Anyway**, replace it with this one: drag the new **sidekicks** into **Applications** and confirm the replacement. Your configuration and your history are kept. | |
| 12 | + | |
| 13 | +## Files | |
| 14 | + | |
| 15 | +| File | System | | |
| 16 | +| --- | --- | | |
| 17 | +| `Sidekicks-1.0.0-macos-arm64.dmg` | macOS 13 or later, Apple Silicon — signed and notarized | | |
| 18 | +| `Sidekicks-1.0.0-macos-arm64.zip` | the same application, in a `.zip` | | |
| 19 | +| `SHA256SUMS` | checksums: `shasum -a 256 -c SHA256SUMS --ignore-missing` | | |
| 20 | + | |
| 21 | +The Windows packages are unchanged: take them from the [1.0.0 release](https://rickub.com/bots-garden/sidekicks/releases/tag/v1.0.0). | |
| 22 | + | |
| 23 | +## Check it yourself | |
| 24 | + | |
| 25 | +```bash | |
| 26 | +spctl -a -vvv /Applications/sidekicks.app # accepted · source=Notarized Developer ID | |
| 27 | +xcrun stapler validate /Applications/sidekicks.app | |
| 28 | +``` | |
| new file mode 100644 | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | +# Sidekicks 1.0.0 for macOS — signed and notarized | ||
| 2 | + | ||
| 3 | +[Français](https://rickub.com/bots-garden/sidekicks/blob/v1.0.0-macos/docs/release-notes/v1.0.0-macos.fr.md) | ||
| 4 | + | ||
| 5 | +The same Sidekicks 1.0.0, rebuilt for macOS and, for the first time, **signed with a Developer ID certificate and notarized by Apple**. Nothing else changes: the features are those of [1.0.0](https://rickub.com/bots-garden/sidekicks/blob/v1.0.0/docs/release-notes/v1.0.0.md). | ||
| 6 | + | ||
| 7 | +## What it changes for you | ||
| 8 | + | ||
| 9 | +- The `.dmg` opens and Sidekicks starts **without going through System Settings → Privacy & Security → Open Anyway**: macOS knows who made the application and Apple has checked it. | ||
| 10 | +- The notarization ticket is stapled to the application and to the `.dmg`: the check also works offline. | ||
| 11 | +- If you installed 1.0.0 (or 0.1.0) with **Open Anyway**, replace it with this one: drag the new **sidekicks** into **Applications** and confirm the replacement. Your configuration and your history are kept. | ||
| 12 | + | ||
| 13 | +## Files | ||
| 14 | + | ||
| 15 | +| File | System | | ||
| 16 | +| --- | --- | | ||
| 17 | +| `Sidekicks-1.0.0-macos-arm64.dmg` | macOS 13 or later, Apple Silicon — signed and notarized | | ||
| 18 | +| `Sidekicks-1.0.0-macos-arm64.zip` | the same application, in a `.zip` | | ||
| 19 | +| `SHA256SUMS` | checksums: `shasum -a 256 -c SHA256SUMS --ignore-missing` | | ||
| 20 | + | ||
| 21 | +The Windows packages are unchanged: take them from the [1.0.0 release](https://rickub.com/bots-garden/sidekicks/releases/tag/v1.0.0). | ||
| 22 | + | ||
| 23 | +## Check it yourself | ||
| 24 | + | ||
| 25 | +```bash | ||
| 26 | +spctl -a -vvv /Applications/sidekicks.app # accepted · source=Notarized Developer ID | ||
| 27 | +xcrun stapler validate /Applications/sidekicks.app | ||
| 28 | +``` | ||