Marquee English

Les projets

Marquee n'observe rien sur ton Mac : c'est gproj qui pousse l'état de tes fenêtres de travail, par POST /etat. La dépendance ne va que dans ce sens ; l'écran continue de vivre quand ton Mac dort.

Ce que la page montre

Une carte par fenêtre de travail ouverte, teintée à sa couleur, celle du premier plan mise en avant. Chacune porte :

  • le nom du projet, et sa branche ;
  • ses onglets (agent, tests, git…), chacun marqué occupé ou non, et depuis quand ;
  • trois jauges : le contexte de la session, le quota cinq heures, le quota sept jours ;
  • en pied de carte : l'âge de la session vue, le modèle et l'effort, la durée, le coût, et le verdict des derniers tests.

Une jauge sans valeur dit « non communiqué » plutôt qu'un zéro qui laisserait croire à un fait établi. Un badge, à côté du bouton Projets, compte les onglets agent au travail : il retombe à rien dès que l'état n'est plus frais (voir le chapitre Dépannage).

L'intégration gproj

gproj est l'outil de sessions de l'auteur de Marquee, et il n'est pas distribué : le vrai contrat, c'est POST /etat, que n'importe quel outil peut appeler.

gproj repousse l'état complet de tes fenêtres à intervalles rapprochés : chaque appel remplace ce que l'écran connaît, il ne le complète pas. Une fenêtre absente d'un envoi disparaît de la page au suivant. Sans nouvel appel depuis une minute, l'écran cesse de présenter cet état comme actuel.

gproj est facultatif : n'importe quel autre outil peut pousser le même format, sur le même port que la page (8099) — voir le chapitre Les réglages.

Le format de POST /etat

Un corps JSON, envoyé tel quel : un champ que Marquee ne connaît pas est ignoré, pas refusé.

ChampRôle
machineLe nom de ton Mac, affiché nulle part pour l'instant : réservé.
fenetresLa liste des fenêtres ouvertes : vide ou absente, la page dit « aucune fenêtre de travail ouverte ».
fenetres[].projetLe nom du projet, tel qu'affiché.
fenetres[].teinteUne couleur CSS, pour la pastille et le filet de la carte.
fenetres[].cheminFacultatif : le dossier du projet, non affiché pour l'instant.
fenetres[].brancheFacultatif : la branche git en cours.
fenetres[].devantVrai si c'est la fenêtre au premier plan : sa carte se distingue des autres.
fenetres[].ongletsUn rôle (role), occupé ou non (occupe), depuis quand (depuis, facultatif) et ce qui tourne (commande, facultatif) par onglet.
fenetres[].contextePourcentage de contexte utilisé ; -1 pour « non communiqué ».
fenetres[].cinq_heuresPourcentage du quota cinq heures ; -1 pour « non communiqué ».
fenetres[].sept_joursPourcentage du quota sept jours ; -1 pour « non communiqué ».
fenetres[].coutLe coût de la session, en dollars.
fenetres[].dureeFacultatif : la durée de la session, en texte déjà mis en forme.
fenetres[].modele, effortFacultatifs : le modèle et l'effort de raisonnement en cours.
fenetres[].session_vueFacultatif : l'âge de ces chiffres, en texte (« 12 min ») ; absent, ils passent pour frais.
fenetres[].tests_rougesFacultatif : true ou false ; absent, aucun verdict ne s'affiche.
fenetres[].tests_quandFacultatif : quand ce verdict a été établi, en texte.
messagerieFacultatif : le badge de messagerie du Dock, s'il faut le montrer.
messagerie.appLe nom de l'application.
messagerie.non_lusLe nombre de messages non lus ; -1 si inconnu.
messagerie.ouverteFaux si l'app est fermée : la page dit alors « app fermé » plutôt qu'un compte périmé.

Un exemple complet et fictif :

{
  "machine": "MacBook Pro",
  "fenetres": [
    {
      "projet": "mon-site",
      "teinte": "#7aa2f7",
      "branche": "feat/recherche",
      "devant": true,
      "onglets": [
        { "role": "agent", "occupe": true, "depuis": "4 min" },
        { "role": "tests", "occupe": false },
        { "role": "git", "occupe": false, "commande": "git status" }
      ],
      "contexte": 42,
      "cinq_heures": 18,
      "sept_jours": 6,
      "cout": 1.37,
      "duree": "23 min",
      "modele": "Sonnet",
      "effort": "moyen",
      "session_vue": "12 min",
      "tests_rouges": false,
      "tests_quand": "il y a 8 min"
    }
  ],
  "messagerie": { "app": "Mail", "non_lus": 2, "ouverte": true }
}

Ce que la route impose

Rien qui touche à l'origine de l'appel : POST /etat répond à n'importe quel appareil qui atteint le port de la page, sans jeton ni en-tête particulier — à la différence de /musique, /touche et /visualiseur, réservés à l'écran lui-même.

Deux limites, seulement : le corps ne dépasse pas 1 Mio, et il doit être du JSON valide. Un corps illisible répond 400 sans toucher à l'état déjà connu : un envoi raté laisse l'écran sur ses derniers chiffres, plutôt que sur un état à moitié écrasé.