Skip to content

feat: enrich devserver-status badge tooltip (state · URL · age, value=port, error honesty) - #4

Merged
theshwal merged 1 commit into
mainfrom
feat/1-tooltip-error-port
Sep 27, 2026
Merged

theshwal merged 1 commit into
mainfrom
feat/1-tooltip-error-port

Conversation

@theshwal

Copy link
Copy Markdown
Owner

Type de PR (obligatoire)

  • Correction de bug
  • Amélioration (enrichissement du tooltip sans modification de comportement observable existant)
  • Breaking change
  • Nouvelle fonctionnalité
  • Refactor

Issue liée

#1 — le tooltip du badge devserver-status affichait uniquement l'état et l'URL, sans âge ni avertissement explicite quand l'URL pouvait ne pas être joignable.

Objectif

Améliorer la lisibilité du badge session.row.badges du plugin en trois axes :

  1. Tooltip mono-ligne structuré (état, URL, âge relatif), localisé fr/en, séparateur ·.
  2. Affichage du port extrait de l'URL via le champ value du PluginUiBadgeDynamicState, sans changer appearance: 'icon' (badge reste compact).
  3. En cas d'erreur, mention explicite « URL peut ne pas être joignable » (fr) / « URL may not be reachable » (en) et exposition de la commande configurée pour diagnostic.

Le plugin reste strictement passif : aucune capability réseau ajoutée, aucune modification d'OpenFox core.

Scope

  • src/index.ts : extension de TrackedStatus (updatedAt, command), helpers extractPortFromUrl / stateLabel / relativeAge / buildTooltip, refactor de toBadgeState, mise à jour des trois handlers de hook pour poser updatedAt et préserver command à travers les transitions d'état.
  • test/index.test.ts : 6 nouveaux tests couvrant tooltip mono-ligne, rafraîchissement de l'âge relatif côté RPC, value (port présent / absent), localisation fr de l'âge en cas d'erreur et mention « URL peut ne pas être joignable ».
  • dist/index.js + dist/index.js.map : régénérés par npm run build (le mode d'installation GitHub d'OpenFox charge dist/, pas src/).
  • .gitignore : package-lock.json ajouté (l'upstream ne le suit pas et npm install le crée localement).

Hors scope : aucune modification d'OpenFox core, du panneau Dev Server natif, ni des capabilities déclarées (["ui", "hooks", "rpc"]).

Type de changement

  • Amélioration UX d'un plugin passif
  • Refactor ciblé d'une fonction (toBadgeState) et de la sérialisation interne (TrackedStatus)
  • Aucun changement de protocole / d'API publique du plugin

Vérification effectuée

  • npm run typecheck : exit 0
  • npm test : 12/12 pass (6 tests existants + 6 nouveaux), exit 0
  • Tests existants préservés à l'identique (changements compatibles avec les assertions déjà présentes sur tone et tooltip.en matchant l'URL et le message d'erreur)
  • Test de régression ajouté pour la localisation fr de l'âge dans le tooltip d'erreur (finding feat: add passive dev-server status plugin #1 du code reviewer)
  • Vérification manuelle : les modifications ne touchent ni l'UI native d'OpenFox ni le panneau Dev Server bas-droite ; le plugin continue à s'enregistrer dans le slot session.row.badges

Critères d'acceptation

  • CA-1 — Tooltip mono-ligne localisé (fr/en) avec état, URL et âge relatif, séparateur ·
  • CA-2 — Mention « URL peut ne pas être joignable » / « URL may not be reachable » sur state: 'error'
  • CA-3 — value du PluginUiBadgeDynamicState renseigne le port extrait de l'URL (string "8000", "5173", …) ou undefined, badge reste appearance: 'icon'
  • CA-4 — TrackedStatus.updatedAt mémorisé, âge relatif calculé côté RPC à chaque appel (frais malgré refreshMs: 2000)
  • CA-5 — TrackedStatus.command mémorisé depuis devserver.started, préservé à travers les transitions, exposé dans le tooltip d'erreur
  • CA-6 — dist/index.js régénéré et inclus dans le diff
  • CA-7 — Aucune modification hors openfox-devserver-status, capabilities inchangées, pas de push supplémentaire
  • CA-8 — npm run typecheck et npm test verts, tests existants préservés, nouveaux tests ajoutés

Hors scope

  • Détection / correction automatique d'une URL « fausse » (ex. plugin sur :8000 alors qu'un autre serveur écoute sur :5173). Le plugin est strictement passif, OpenFox n'expose pas de capability network/http aux plugins, et un seul DevServerInstance est géré par workdir dans DevServerManager (cf. src/server/dev-server/manager.ts d'OpenFox core). Corriger ce cas nécessite soit une capability plugin réseau (n'existe pas), soit le support multi-server par workdir (n'existe pas), soit un .openfox/dev.json cohérent avec le serveur effectivement piloté par OpenFox — ce qui est un choix projet, pas plugin.
  • Modification du panneau Dev Server natif d'OpenFox bas-droite.
  • Modification d'OpenFox core.
  • PR upstream complémentaire pour étendre l'API plugin (non demandé).

Risques et limitations connues

  • L'URL affichée reste celle émise par OpenFox core dans les hooks devserver.* (dérivée de .openfox/dev.json du workdir, avec substitution de ${PORT}). Si cette URL ne reflète pas le serveur réellement à l'écoute (ex. FastAPI configuré sur :8000 mais en échec, Vite externe sur :5173), le badge peut afficher une URL qui ne pointe vers aucun serveur : c'est pour cela que CA-2 ajoute désormais une mention explicite en cas d'erreur.
  • L'âge relatif est calculé côté RPC à chaque appel, donc dépend du fait que le RPC status est bien appelé toutes les 2 s (refreshMs: 2000) ; si l'UI déduplique plus longtemps, l'âge affiché sera l'âge réel au moment du dernier appel.
  • Le value n'est renseigné que si l'URL contient un port explicite ; http://localhost/ ne produit pas de value (testé).
  • package-lock.json est désormais ignoré par .gitignore mais reste généré localement par npm install ; aucun engagement CI n'en dépend.

- CA-1: single-line tooltip with state, URL, relative age (sep ` · `)
- CA-2: error tooltip flags URL as potentially unreachable (fr/en)
- CA-3: badge value exposes the URL port when available
- CA-4: TrackedStatus.updatedAt + RPC-side relative age refresh
- CA-5: TrackedStatus.command surfaced in error tooltip
- CA-6: regenerated dist/index.js
- CA-7: scoped to plugin repo, capabilities unchanged
- CA-8: typecheck + 12/12 tests pass
@theshwal
theshwal merged commit d295b1f into main Sep 27, 2026
2 checks passed
@theshwal
theshwal deleted the feat/1-tooltip-error-port branch September 27, 2026 20:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant