Tu recommences le même dossier à chaque projet. Un monteur refait
01 Projet / 02 Rushs / 03 Assets / 04 Exports à chaque client. Un
photographe range par shooting. Un dev repart d'un squelette.
Alors tu le refais à la main, ou tu dupliques un vieux dossier et tu vides son contenu en oubliant un fichier au fond.
Rex remplace ça par un clic droit.
Tu choisis ta macro, tu nommes le dossier, l'arborescence entière apparaît.
Important
Rex ne fonctionne pas dans iCloud Drive, Google Drive ou Dropbox. Ces dossiers sont servis par leur propre fournisseur, en dehors du système de fichiers local, et aucune extension Finder n'y a accès. Utilise un dossier local.
C'est le choix central du projet. Une macro n'est pas un fichier de configuration qui décrit une arborescence. C'est l'arborescence elle-même, posée sur ton disque.
~/Library/Rex/macros/
├── Exemple/
│ ├── 1. Projet/
│ │ ├── After Effects/
│ │ └── Davinci Resolve/
│ ├── 2. Musiques/
│ │ ├── FLAC/
│ │ └── WAV/
│ └── 3. Graphismes/
│ ├── JPG/
│ ├── PNG/
│ └── SVG/
└── montage-podcast/
├── 01 Audio brut/
└── 02 Livrables/
Ce que ça change : tu crées une macro avec le Finder. Nouveau dossier, tu construis dedans ce que tu veux, c'est fini. Elle apparaît dans l'app et dans le menu contextuel aussitôt. Pas d'import, pas de JSON, pas d'éditeur obligatoire. Ce que tu vois dans le Finder est exactement ce qui sera créé.
- Applique une macro dans n'importe quel dossier local, par clic droit.
- Crée une macro de trois façons : avec le Finder, avec l'éditeur, ou depuis un dossier déjà rangé.
- Éditeur en mind-map ou en liste, avec glisser-déposer pour réordonner et imbriquer, et double-clic pour renommer.
- Les macros contiennent des dossiers et des fichiers. Les fichiers sont créés vides, avec l'extension que tu choisis.
- L'intitulé du menu dans le Finder est modifiable.
- Thème clair et sombre suivis automatiquement.
- Aucun réseau, aucune télémétrie, aucun compte.
Rex n'est pas signé par un compte Apple Developer payant, donc macOS le bloque au premier lancement. C'est normal, et ça se règle une seule fois.
- Télécharge
Rex.zipdepuis la page Releases, décompresse, glisseRex.appdans/Applications. - Lance-le. macOS refuse et affiche ceci :
Warning
Le bouton bleu est Move to Trash, et c'est celui que la touche Entrée déclenche. Appuyer sur Entrée supprime Rex. Clique Done.
- Ouvre Réglages Système → Confidentialité et sécurité, puis descends jusqu'à la section Security, sous « Allow applications from ». Le message de blocage y attend avec un bouton Open Anyway :
- Clique Open Anyway. macOS demande ton mot de passe ou Touch ID. Rex s'ouvre ensuite normalement, et la question ne revient plus.
Pourquoi ce parcours : Rex n'est pas notarisé par Apple, ce qui coûte un compte développeur payant. La notarisation inscrirait aussi mon identité dans chaque binaire publié, ce que je préfère éviter. L'app est signée en ad-hoc, sans aucune identité, et tu peux le vérifier toi-même :
codesign -dvvv /Applications/Rex.appTu dois y lire Signature=adhoc et TeamIdentifier=not set, et aucune ligne
Authority=.
Aucun compte Apple nécessaire : le projet est signé en ad-hoc.
git clone https://github.com/CellPod/finder-folder-templates-rex.git
cd finder-folder-templates-rex
xcodebuild build -scheme Rex -destination 'platform=macOS' -configuration ReleaseCopie ensuite le Rex.app produit dans /Applications. Le chemin s'affiche à
la fin de la compilation.
Xcode doit être installé, mais tu n'as pas besoin de l'ouvrir. Compile plutôt
que lance depuis Xcode : l'extension Finder doit tourner depuis
/Applications/Rex.app, sinon le Finder peut charger l'ancienne build.
Si tu modifies project.yml, régénère le projet avec
XcodeGen :
brew install xcodegen && xcodegen generateC'est l'étape que tout le monde oublie. Apple n'active jamais une extension Finder tout seul, et sans elle le menu contextuel n'apparaît pas.
Dans Rex, clique l'engrenage puis Activer l'extension Finder. Le bon panneau s'ouvre. Coche Rex.
Chemin manuel : Réglages Système → Général → Éléments de connexion et extensions → Extensions du Finder.
| Permission | Quand | Pourquoi |
|---|---|---|
| Accès aux dossiers que tu désignes | Au premier usage | Créer l'arborescence là où tu as fait le clic droit |
| Extension Finder | Une fois, manuellement | Afficher le menu contextuel |
macOS peut demander l'accès à ton Bureau, tes Documents ou tes Téléchargements la première fois que tu appliques une macro dans un de ces dossiers. C'est la protection standard du système, pas une demande de Rex.
Autant le dire franchement, c'est vérifiable dans le code.
L'extension Finder est sandboxée, mais elle déclare une exception de lecture et
d'écriture sur /, dans
FolderMacrosFinderExt.entitlements.
Elle a donc accès à tout ce que ton compte peut lire ou écrire.
C'est nécessaire : tu peux faire un clic droit n'importe où, et Rex doit pouvoir créer des dossiers là. Un sandbox restreint à quelques emplacements casserait la seule chose que l'app sait faire.
En pratique elle ne fait que trois choses avec cet accès, toutes visibles dans
FinderSyncExt.swift :
lire la liste des macros, lire la structure d'un dossier que tu désignes, et
écrire le fichier de demande que l'app va lire. C'est l'app, hors sandbox, qui
crée réellement l'arborescence, après que tu as validé la popup.
Rex n'accède pas au réseau. Aucune API réseau n'apparaît dans le code, tu peux
le vérifier. Tes macros restent dans ~/Library/Rex/macros/.
Le menu n'apparaît pas. L'extension n'est pas cochée. Voir Activer l'extension Finder. Ou tu es dans un dossier cloud, où ça ne peut pas marcher.
Le menu liste des macros supprimées. Le Finder garde son menu en cache. Utilise Rafraîchir le menu Finder dans les Réglages, qui relance le Finder.
Plusieurs extensions actives après avoir compilé. Xcode réenregistre celle de sa propre build. Vérifie qu'une seule est active :
pluginkit -m -v -p com.apple.FinderSync | grep babaL'app se lance sans fenêtre. Elle attend que tu répondes à une popup de nommage, peut-être cachée derrière une autre fenêtre.
Deux processus qui partagent un dossier. L'app est hors sandbox, l'extension est sandboxée, et c'est de là que viennent les deux pièges les plus coûteux du projet.
| Fichier | Rôle |
|---|---|
Shared/MacroTree.swift |
Lecture et écriture des macros sur le disque |
Shared/MacrosLocation.swift |
Résolution du dossier partagé entre les deux processus |
Shared/PendingApplyRequest.swift |
Passation extension vers app |
FolderMacros/ |
L'app SwiftUI |
FolderMacrosFinderExt/ |
L'extension Finder Sync |
RexUITests/ |
Tests d'interface |
Trois détails qui ont coûté du temps et qui méritent d'être documentés.
saveMacro écrit dans un dossier temporaire voisin puis permute, pour qu'un
échec en cours de route laisse la macro existante intacte au lieu de la laisser
à moitié effacée. Il reconstruit au lieu de fusionner, sinon les dossiers que tu
viens de supprimer dans l'éditeur survivraient.
MacrosLocation contourne deux redirections du sandbox. Application Support
est redirigé vers un conteneur privé par processus, d'où le choix de
~/Library/Rex/. Et homeDirectoryForCurrentUser renvoie le conteneur du
sandbox plutôt que le vrai dossier personnel, d'où la résolution via la base
passwd avec getpwuid. Sans ça, l'app et l'extension lisaient deux dossiers
différents.
Une NSAlert dans une extension Finder Sync ne s'affiche jamais. L'extension
écrit donc une demande dans un fichier, et l'app surveille ce dossier plutôt que
de compter sur son activation : applicationDidBecomeActive ne se déclenche que
sur une transition, donc une demande faite alors que l'app était déjà au premier
plan restait ignorée.
xcodebuild test -scheme Rex -destination 'platform=macOS' -only-testing:RexUITestsDeux prérequis. Rex a besoin de l'autorisation Accessibilité dans Réglages
Système → Confidentialité et sécurité → Accessibilité, sinon l'arbre
d'accessibilité revient vide. Et ferme l'instance de /Applications/Rex.app
avant de lancer les tests : les deux builds partagent le même identifiant de
bundle et se disputent le lancement.
Les tests cliquent aux coordonnées réelles plutôt que d'utiliser les actions
d'accessibilité. Un Menu SwiftUI dans un ScrollView échouait silencieusement
à ouvrir son NSMenu sur macOS, et un clic d'accessibilité ne reproduisait pas
le bug.
./scripts/check-release.shContrôle qu'aucune identité ne part avec le binaire. Deux de ses vérifications ont attrapé de vraies fuites avant publication : un certificat Apple Development inscrit l'adresse e-mail du développeur en clair dans la signature, et un PNG exporté depuis Canva porte le nom du titulaire du compte dans son bloc XMP. Ni l'un ni l'autre ne se voit sans aller chercher.
Il lit les identifiants personnels à contrôler dans un fichier
.identity-patterns, volontairement hors du dépôt : les écrire dans le script
reviendrait à publier l'identité qu'il sert à garder dehors. Un motif par
ligne :
printf 'nom\nfournisseur-mail.com\nTEAMID123\n' > .identity-patternsLe script accepte un chemin en argument pour contrôler un build précis :
./scripts/check-release.sh build/Release/Rex.appLes issues et les pull requests sont bienvenues.
Une chose à savoir avant de proposer du code : je demande que les contributions me soient cédées sous licence, pour garder la possibilité de relicencier Rex plus tard. GPL-3.0 est incompatible avec le Mac App Store, et je ne veux pas me fermer cette porte. Dis-le dans ta pull request si ça te convient.
GPL-3.0. Rex est libre, et le restera : quiconque le distribue, modifié ou non, doit fournir le code source sous la même licence.
En tant que seul détenteur du copyright, je me réserve le droit d'accorder des licences commerciales. Contacte-moi si tu veux intégrer Rex à un produit fermé.
Les icônes de l'éditeur viennent d'Iconoir, sous licence MIT.




