Skip to content

Repository files navigation

Rex

Rex

Crée la même arborescence de dossiers en deux clics, depuis le menu contextuel du Finder.

Licence macOS Swift


Le problème

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.

Le menu contextuel du Finder avec la liste des macros

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.

Une macro est un vrai dossier

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éé.

Fonctionnalités

  • 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.
L'éditeur d'arborescence en vue mind-map

Installation

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.

Depuis une release

  1. Télécharge Rex.zip depuis la page Releases, décompresse, glisse Rex.app dans /Applications.
  2. Lance-le. macOS refuse et affiche ceci :
Le dialogue de refus de macOS

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.

  1. Ouvre Réglages SystèmeConfidentialité et sécurité, puis descends jusqu'à la section Security, sous « Allow applications from ». Le message de blocage y attend avec un bouton Open Anyway :
Le bouton Open Anyway dans les réglages de sécurité
  1. 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.app

Tu dois y lire Signature=adhoc et TeamIdentifier=not set, et aucune ligne Authority=.

Depuis les sources

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 Release

Copie 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 generate

Activer l'extension Finder

C'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èmeGénéralÉléments de connexion et extensionsExtensions du Finder.

Permissions

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.

Ce que Rex peut techniquement faire

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/.

Dépannage

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 baba

L'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.

Architecture

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.

Tests

xcodebuild test -scheme Rex -destination 'platform=macOS' -only-testing:RexUITests

Deux prérequis. Rex a besoin de l'autorisation Accessibilité dans Réglages SystèmeConfidentialité 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.

Avant de publier une release

./scripts/check-release.sh

Contrô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-patterns

Le script accepte un chemin en argument pour contrôler un build précis :

./scripts/check-release.sh build/Release/Rex.app

Contribuer

Les 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.

Licence

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.

About

Create reusable folder tree templates from Finder's right-click menu on macOS

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages