Guide de la barre de menus
Comment chaque type d'outil s'affiche dans le popover Runyard, et ce que fait chaque action.
Toute l'interface de Runyard vit dans la barre de menus. Cliquez sur l'icône pour ouvrir le popover ; appuyez sur Échap ou cliquez à l'extérieur pour le fermer.
L'icône Runyard
Cliquez-gauche sur l'icône pour basculer le popover. À côté de l'icône, selon vos préférences, vous pouvez voir :
- Un texte d'état court (par exemple
2 runningouStarting Backend, Frontend…). Activable dans Réglages → Général → Barre de menus. - Un triangle rouge ⚠︎ dès qu'une vérification d'état est en échec ou qu'un service est en état d'erreur.
- Une tasse pleine ☕ lorsque vous avez activé Garder éveillé manuellement (voir plus bas). Les activations déclenchées par un service ou une vérification n'affichent pas ce symbole. Il est réservé au bouton manuel, pour signaler « j'ai activé », pas « quelque chose que j'ai configuré tourne ». Masquez le symbole dans Réglages → Général → Barre de menus.
- Un panneau dynamique (au survol) listant chaque outil en cours, l'état actuel de Garder éveillé, et toute vérification en échec.
Le texte d'état est figé tant que le popover est ouvert. Il se rafraîchit dès que vous fermez le popover. (Modifier le titre redimensionnerait le bouton de la barre de menus et déconnecterait visuellement le popover ouvert de l'icône, donc le rafraîchissement est différé.)
Disposition du popover
Le popover est une colonne à largeur fixe avec quatre sections :
- En-tête : la ligne de marque, un résumé optionnel
N running · M errors, et un bouton tri-état Tout réduire / Tout déplier qui bascule toutes les cartes en une fois. Chaque carte possède aussi son propre chevron et conserve son état réduit entre les ouvertures. - Cartes : une par outil de premier niveau, dans l'ordre de
config.json. Les configs longues défilent verticalement à l'intérieur du popover. La hauteur maximale s'adapte à votre écran : au minimum 600 pt, et davantage sur les écrans hauts (le plafond esthauteur-écran − 200pour que le popover ne dépasse jamais de la zone visible). - Bouton Garder éveillé : une rangée juste au-dessus du pied de page qui active ou désactive
caffeinateà la demande (voir Garder éveillé). - Pied de page : quatre tuiles d'icônes : Réglages, Recharger, Mises à jour, et Quitter.
Les quatre types d'outils
Service
Un service est un processus géré : un backend, un serveur de dev, un stack Docker. Il s'affiche comme une carte avec :
- Une ligne d'en-tête : nom de l'outil + une pastille d'état (
Running/Stopped/Starting/Stopping/Error). - Une ligne meta sous l'en-tête montrant un point d'état par
startCommand(Backend, Frontend, …) plus le port détecté en tag bleu:3001une fois l'outil en cours d'exécution. - Une rangée de chips d'action pour les actions que vous avez définies, filtrées par le
showWhende chaque action. La première action URL prend l'accent bleu primaire. - Une barre de boutons en pied de carte avec des contrôles dépendants de l'état : Stop (en cours), Start (arrêté), Start + Clear Error (en erreur), plus View Logs dans tous les états.
Lorsque la carte est réduite, l'en-tête se compresse en point · nom · port · pastille pour qu'on voie l'essentiel d'un coup d'œil.
Shortcut
Un shortcut est une liste plate de liens ou d'actions sous une étiquette de section en majuscules. Pas de gestion de processus. Chaque action s'affiche comme une tuile pleine largeur dans une pile verticale, peu importe le type d'action (URL, commande, AppleScript, reveal ou vérification d'état). Les cartes shortcut de premier niveau ont leur propre chevron et participent au bouton Tout réduire / Tout déplier. Les shortcuts imbriqués dans un groupe s'affichent à plat sans chevron ; repliez plutôt le groupe parent.
{
"name": "Quick Links",
"type": "shortcut",
"actions": [
{ "label": "Open Grafana", "type": "url", "url": "https://grafana.example.com" },
{ "label": "Open Jira", "type": "url", "url": "https://jira.example.com" }
]
}
Group
Un group regroupe des outils liés sous une carte repliable. L'en-tête montre une pastille d'état agrégée qui s'adapte au contenu :
- Groupe avec services seulement →
running/total(par exemple1/2) - Groupe avec vérifications d'état seulement →
healthy/total - Mixte →
running/total · healthy/total - Tout service imbriqué en erreur ou vérification d'état en échec → pastille orange avec un suffixe
· ⚠ - Groupe vide → pas de pastille
Sous l'en-tête, chaque enfant s'affiche sur une seule rangée compacte pour garder les groupes denses :
● Nom du service :8080 [PASTILLE] ⏹ 📄
● Nom de la vérif. 124 ms [PASTILLE] ⏸ ↻ 📄
Disposition par enfant :
- Services : point d'état, nom, tag
:portoptionnel, pastille d'état, puis des boutons-icônes inline. Stop (stop.fill) quand l'outil tourne, Start (play.fill, accent bleu) quand il est arrêté ou en erreur, plus View Logs (doc.text). - Vérifications d'état : point d'état, nom, latence (masquée en pause), pastille d'état, puis Pause / Resume (
pause.fill/play.fill), Check now (arrow.clockwise, accent bleu), et View Logs (doc.text). - Shortcuts : une étiquette de section en majuscules et une rangée de chips d'actions (pas de forme compacte, puisque les shortcuts n'ont pas d'état).
Une seconde rangée de chips apparaît sous la rangée compacte seulement quand le service a des actions visibles (filtrées par showWhen) et/ou est en état .error. Les services en erreur ont un chip rouge Clear Error à la fin de la seconde rangée.
Cliquez-droit sur n'importe quelle rangée compacte pour obtenir un menu textuel complet avec toutes les actions plus des extras : Reveal Directory in Finder, Copy Start Command (services), Copy Endpoint URL (vérifications d'état).
Les actions au niveau du groupe vivent dans un pied de carte sous un titre de section en majuscules ACTIONS. Les boutons s'affichent dans une grille à 2 colonnes (une action seule occupe toute la largeur ; une troisième action impaire occupe sa propre rangée pleine largeur). La première action URL prend l'accent bleu primaire, et les actions healthCheck affichent leur propre état inline. Clear Errors (N) apparaît comme rangée pleine largeur rouge au bas lorsque ≥ 2 services imbriqués sont en erreur ou ont des résultats de health-check en échec.
Astuce : les vérifications d'état imbriquées n'affichent pas le sparkline 20 barres (qui ferait exploser la hauteur du groupe). Si vous voulez le sparkline ainsi que l'UI complète de la carte, promouvez la vérification d'état au niveau racine dans
config.json(sortez-la du tableautoolsdu groupe parent).
{
"name": "QA Stack",
"type": "group",
"actions": [
{ "label": "Open Dashboard", "type": "url", "url": "https://qa.example.com" }
],
"tools": [
{ "name": "API Server", "type": "service", "...": "..." },
{ "name": "Links", "type": "shortcut", "...": "..." },
{ "name": "Health", "type": "healthCheck", "http": { "url": "..." } }
]
}
Les groupes ne peuvent pas être imbriqués dans d'autres groupes.
Vérification d'état
Une vérification d'état interroge un endpoint HTTP ou TCP à intervalle fixe et s'affiche sur sa propre carte avec :
- Un en-tête montrant le nom de la vérification d'état et une pastille Healthy / Failing / Paused / Unknown.
- Une ligne meta :
247 ms · checked 12s ago · every 30s(le timestamp relatif s'incrémente toutes les secondes pendant que le popover est ouvert). - Un sparkline 20 barres des dernières latences : vert pour les échantillons réussis, rouge pleine hauteur pour les échecs (timeouts / connexions refusées). Les hauteurs se normalisent au 95ᵉ centile pour qu'une seule valeur aberrante n'aplatisse pas le reste.
- Une barre de boutons en pied : Pause / Resume, Check now, Logs.
Les vérifications d'état imbriquées dans des groupes s'affichent comme des rangées compactes (sans sparkline). Promouvez-la au niveau racine si vous voulez le sparkline + l'UI complète de la carte.
Pause et Resume sont des contrôles d'exécution uniquement : ils ne modifient pas votre config.json. Au prochain lancement, la vérification d'état respecte le réglage Auto-start on launch défini dans Réglages → Tools.
Quand une vérification d'état est en échec, un triangle rouge ⚠︎ apparaît à côté de l'icône Runyard de la barre de menus.
Statistiques de temps de réponse
Survolez n'importe quelle carte de vérification d'état pour voir les statistiques de temps de réponse sur une fenêtre glissante d'une heure des vérifications récentes. Sur une carte saine réduite, survolez le sparkline ; sur une carte en échec, en pause ou dépliée, survolez la pastille d'état. La fenêtre est fixe (non configurable) et se réinitialise quand Runyard se ferme.
Avec moins de 5 vérifications réussies, le popover affiche seulement la dernière latence avec un compteur « N vérifications supplémentaires requises… ». Les estimations de queue lente et de moyenne nécessitent au moins 5 échantillons pour être significatives.
À partir de 5 vérifications réussies, le popover affiche une ventilation à quatre métriques :
- Typique (p50) : la médiane. La moitié des vérifications récentes ont été plus rapides, l'autre moitié plus lentes. Affichée comme valeur principale avec l'étiquette
TYPIQUE. L'estimation la plus honnête d'un temps de réponse normal, non faussée par les valeurs aberrantes. - Queue lente (p95) : 95ᵉ centile. Seulement 5 % des vérifications ont été plus lentes que cette valeur. Un indicateur précurseur de ralentissements intermittents.
- Moyenne : moyenne arithmétique des vérifications réussies. Utile, mais facilement faussée par une seule vérification lente.
- Taux d'échec : nombre de vérifications en échec dans la fenêtre. Affiché seulement quand au moins une vérification a échoué.
Les rangées Queue lente, Moyenne et Taux d'échec affichent chacune une brève explication en italique en dessous.
Quand une vérification est en échec ou en pause, le popover bascule vers l'information la plus pertinente pour cet état (la dernière erreur, le temps écoulé depuis le dernier succès et le nombre d'échecs consécutifs en cas d'échec ; les dernières statistiques connues atténuées en pause).
Actions
Les actions sont des éléments de menu supplémentaires par outil. Chaque action a un label et exactement un type :
| Type | Champ | Effet |
|---|---|---|
| Open URL | url |
Ouvre l'URL dans votre navigateur par défaut. Supporte les placeholders {{port}}. |
| Run command | command + args |
Exécute une commande shell (dans le répertoire de l'outil par défaut). La sortie va dans un log d'action. |
| Reveal in Finder | reveal |
Ouvre un dossier dans Finder. Les chemins relatifs se résolvent depuis le directory de l'outil. |
| Inline AppleScript | applescript |
Exécute un snippet AppleScript. |
| AppleScript file | applescriptFile |
Exécute un fichier .applescript. |
| Vérification d'état | healthCheck |
Exécute une vérification HTTP ou TCP ponctuelle et affiche le résultat inline (latence en succès, « failed » en échec). Voir Référence config.json → Vérifications d'état. |
Placeholders de port dans les URL
Les URL d'action peuvent inclure des placeholders {{port}} et {{port:Label}} :
{{port}}: remplacé par le port détecté du dernier processus de l'outil (typiquement le processus utilisateur).{{port:Backend}}: remplacé par le port détecté du processus nomméBackend.
{ "label": "Open Frontend", "type": "url", "url": "http://localhost:{{port}}/" }
{ "label": "API Docs", "type": "url", "url": "http://localhost:{{port:Backend}}/swagger" }
Si l'outil n'est pas en cours d'exécution (aucun port détecté), le placeholder reste littéral et le lien ne s'ouvre pas.
Contrôler quand les actions apparaissent
Pour les outils service, les actions ont un champ showWhen :
"running"(par défaut) : visible seulement quand le service est en cours d'exécution."stopped": visible seulement à l'arrêt ou en erreur."always": visible dans tous les cas.
showWhen est ignoré sur les actions de shortcut et group ; celles-ci sont toujours visibles.
Réduction par carte
Chaque carte a un chevron en haut à droite qui réduit son corps. L'état réduit persiste entre les ouvertures du popover et les redémarrages de l'app (stocké dans ~/Library/Preferences/ca.bonevil.runyard.plist sous les clés collapsed.{toolName}). Le bouton Tout réduire / Tout déplier de l'en-tête écrase l'état stocké de chaque carte en un clic.
Détection de port
Runyard utilise lsof pour surveiller l'arbre de PID de chaque processus que vous lancez et capte le premier port TCP qu'il commence à écouter. Le port détecté :
- Apparaît à côté du nom de l'outil comme tag bleu
:3001sur la ligne meta. - Est auto-injecté dans les URL
startupCheckqui n'incluent pas un port explicite (par exemplehttp://localhost/api/healthdevienthttp://localhost:3001/api/health). - Remplace les placeholders
{{port}}dans les URL d'action.
Fallback : si l'auto-détection ne trouve pas de port (rare, mais certains outils fork de manière inhabituelle), définissez startupFallbackPort sur le processus.
Start, Stop et Logs
Start
Le bouton Start exécute :
installCommandsi le chemin marqueur (par défaut :node_modules) n'existe pas.- Chaque
startCommanddans l'ordre. Les commandes avecwaitFor: "OtherLabel"patientent jusqu'à ce que l'autre processus passe son health check. - Le polling du health check (si configuré).
L'outil transite starting → running une fois tous les processus en bonne santé.
Stop
Le bouton Stop soit :
- Exécute vos
stopCommandspersonnalisés dans l'ordre, puis force-kill les restes. - Soit, si aucun
stopCommandsn'est configuré, envoie SIGTERM → patiente → envoie SIGKILL.
View Logs
Chaque processus lancé écrit dans son propre fichier log sous ~/Library/Logs/Runyard/. View Logs ouvre chaque fichier log dans Console.app (ou retombe sur le dossier si aucun fichier log n'existe encore). Voir Dépannage → Logs pour le schéma complet des chemins.
Effacer les erreurs
Quand un service échoue à démarrer ou crashe, la carte devient rouge et l'icône de la barre de menus affiche un triangle d'avertissement rouge. Le message d'erreur s'affiche inline sous la ligne meta, et la raison complète est écrite dans le fichier log de l'outil.
Pour effacer l'indicateur d'erreur sans redémarrer :
- Service unique : cliquez sur Clear Error dans le pied de la carte (ou dans la rangée de chips imbriquée pour un enfant de groupe). L'état revient à Stopped et le triangle d'avertissement disparaît.
- Groupe avec plusieurs erreurs : quand deux services ou plus dans un groupe sont en erreur, Clear Errors (N) apparaît comme bouton rouge en pied de la carte du groupe et les efface tous en un clic.
L'effacement ne change que l'affichage ; vos fichiers logs sont conservés sur disque sous ~/Library/Logs/Runyard/.
Garder éveillé
Runyard intègre caffeinate pour empêcher macOS de se mettre en veille pendant qu'un travail important est en cours. Trois voies indépendantes, dont n'importe quelle combinaison peut être active en même temps :
-
Manuel : la rangée au-dessus du pied de page. Cliquez pour activer la durée par défaut (Réglages → Général → Garder éveillé → Durée par défaut ; 1 heure par défaut). Cliquez à nouveau pour désactiver.
Pendant une session minutée, la rangée se remplit d'un dégradé café de gauche à droite qui recule à mesure que le compte à rebours s'écoule. Le texte d'état à droite affiche
45 min,23 min, … Si vous choisissez Jusqu'à désactivation, la rangée reste pleine et l'état litIndéfiniavec une pulsation douce.Cliquez sur le chevron ▾ pour ouvrir le menu des durées : 15 / 30 / 60 / 120 minutes, ou jusqu'à-désactivation. Le même menu contient une case Empêcher aussi la veille de l'écran (équivalent à
caffeinate -d). La basculer en cours de session remplace lecaffeinateen cours d'exécution pour que-dprenne effet immédiatement. -
Lié à un service : tout service avec
keepSystemAwake: truedansconfig.jsonlance uncaffeinate -i -w <pid>par processus de démarrage actif. Le système reste éveillé tant qu'au moins un des processus du service est vivant (un arrêt propre, un SIGKILL ou un crash libère uniquement l'assertion de ce processus). La garantie d'éveil survit donc à la sortie d'un processus d'init bref pendant que les processus de longue durée continuent. La carte du service affiche un petit ☕ dans sa ligne meta tant qu'au moins une session est active. -
Lié à une vérification d'état : une vérification avec le même champ maintient un
caffeinate -iindéfini tant qu'elle sonde. Mettre la vérification en pause depuis le popover (ou la retirer de la config) libère l'assertion immédiatement.
Lorsqu'au moins une source automatique est active sans session manuelle, la rangée bascule sur un fond vert et lit Auto · Auto · <Nom> +N pour plusieurs). Lorsque le manuel et l'automatique sont actifs ensemble, le compte à rebours manuel garde la vedette et la pastille +N indique des sources automatiques supplémentaires ; survolez la rangée pour voir la liste complète.
Le panneau de survol de la barre de menus reprend le même résumé sous forme de ligne ☕ 45 min · Auto · Big Build +2 sous les compteurs de services en cours / en échec.
Limitation capot fermé : macOS ne garde pas votre Mac éveillé lorsque le capot est fermé, quel que soit l'outil anti-veille utilisé. Runyard affiche une alerte unique la première fois que vous activez Garder éveillé pour fixer la bonne attente. C'est une contrainte de sécurité thermique qui s'applique à tout outil basé sur caffeinate.
Actions globales (pied du popover)
Les quatre tuiles au bas du popover :
- Réglages : ouvre la fenêtre de réglages (Général, Outils, Avancé, À propos, Achats).
- Recharger : relit
config.jsonet reconstruit le popover. Les outils en cours sont arrêtés avant. - Mises à jour : vérifie les mises à jour de l'app.
- Quitter : arrête tous les outils et quitte. Tout sous-processus
caffeinatedétenu par Runyard est terminé dans le cadre de l'arrêt.