bots-garden/sidekickspublic Fork
⑂ 0a98071
Commits
⬇ Clone ▾
git clone https://git.rickub.com/bots-garden/sidekicks.git
git clone ssh://git@rickub.com/bots-garden/sidekicks.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP

📦️ Create a release: macos

k33g committed 2026-10-31T12:34:20+01:00 Browse files
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:
3030 - title: "v1.0.0 · Release"
3131 state: closed
3232 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: closed31 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/` :
3737
3838 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`.
3939
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+
4042 ## 2. Tagger
4143
4244 ```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. Tagger42 ## 2. Tagger
41 43
42 ```bash44 ```bash
modified RELEASING.md +2 -0
@@ -37,6 +37,8 @@ It builds, into `dist/`:
3737
3838 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`.
3939
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+
4042 ## 2. Tag
4143
4244 ```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. Tag42 ## 2. Tag
41 43
42 ```bash44 ```bash
modified build/config.yml +1 -1
@@ -11,7 +11,7 @@ info:
1111 description: "Converse with AI agents in channels" # The application description
1212 copyright: "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0" # Copyright text
1313 comments: "Sidekicks" # Comments
14- version: "1.0.0" # The application version
14+ version: "1.0.0-macos" # The application version
1515 # cfBundleIconName: "appicon" # The macOS icon name in Assets.car icon bundles (optional)
1616 # # Should match the name of your .icon file without the extension
1717 # # 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 description11 description: "Converse with AI agents in channels" # The application description
12 copyright: "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0" # Copyright text12 copyright: "© 2026 Philippe Charrière — Sidekicks Source-Available License 1.0" # Copyright text
13 comments: "Sidekicks" # Comments13 comments: "Sidekicks" # Comments
14- version: "1.0.0" # The application version14+ 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 extension16 # # 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 @@
1717 <key>CFBundlePackageType</key>
1818 <string>APPL</string>
1919 <key>CFBundleShortVersionString</key>
20- <string>1.0.0</string>
20+ <string>1.0.0-macos</string>
2121 <key>CFBundleVersion</key>
22- <string>1.0.0</string>
22+ <string>1.0.0-macos</string>
2323 <key>LSMinimumSystemVersion</key>
2424 <string>13.0.0</string>
2525 <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 @@
1717 <key>CFBundlePackageType</key>
1818 <string>APPL</string>
1919 <key>CFBundleShortVersionString</key>
20- <string>1.0.0</string>
20+ <string>1.0.0-macos</string>
2121 <key>CFBundleVersion</key>
22- <string>1.0.0</string>
22+ <string>1.0.0-macos</string>
2323 <key>LSMinimumSystemVersion</key>
2424 <string>13.0.0</string>
2525 <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 @@
66 name: "sidekicks"
77 arch: ${GOARCH}
88 platform: "linux"
9-version: "1.0.0"
9+version: "1.0.0-macos"
1010 section: "default"
1111 priority: "extra"
1212 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 @@
11 {
22 "fixed": {
3- "file_version": "1.0.0"
3+ "file_version": "1.0.0-macos"
44 },
55 "info": {
66 "0409": {
7- "ProductVersion": "1.0.0",
7+ "ProductVersion": "1.0.0-macos",
88 "CompanyName": "Philippe Charrière",
99 "FileDescription": "Converse with AI agents in channels",
1010 "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 @@
1414 !define INFO_PRODUCTNAME "Sidekicks"
1515 !endif
1616 !ifndef INFO_PRODUCTVERSION
17- !define INFO_PRODUCTVERSION "1.0.0"
17+ !define INFO_PRODUCTVERSION "1.0.0-macos"
1818 !endif
1919 !ifndef INFO_COPYRIGHT
2020 !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 !endif15 !endif
16 !ifndef INFO_PRODUCTVERSION16 !ifndef INFO_PRODUCTVERSION
17- !define INFO_PRODUCTVERSION "1.0.0"17+ !define INFO_PRODUCTVERSION "1.0.0-macos"
18 !endif18 !endif
19 !ifndef INFO_COPYRIGHT19 !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 @@
11 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
22 <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="*"/>
44 <dependency>
55 <dependentAssembly>
66 <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
77 | You want to… | Section | Pages |
88 | --- | --- | --- |
99 | **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) |
1111 | **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) |
1212 | **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) |
1313
@@ -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
2020
2121 ## See also
2222
23+- [How to sign and notarize Sidekicks for macOS](sign-and-notarize-on-macos.md)
2324 - [How to install Sidekicks](install-sidekicks.md)
2425 - [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 also21 ## 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 workflow25 - [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
77 | Vous voulez… | Section | Pages |
88 | --- | --- | --- |
99 | **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) |
1111 | **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) |
1212 | **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) |
1313
@@ -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
2020
2121 ## Voir aussi
2222
23+- [Signer et notariser Sidekicks pour macOS](signer-et-notariser-sous-macos.md)
2324 - [Installer Sidekicks](installer-sidekicks.md)
2425 - [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 aussi21 ## 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 Release25 - [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+```