Les nouveautés de RDTSearch CLI, version par version.
✨ Animations enrichies
- Easing global :
ease(f) = 1 − (1−f)³ appliqué à toutes les frames d'animate_view — compteurs, barres et sparklines ralentissent en arrivant au lieu d'une progression linéaire.
- Rideau générique
animate_reveal(state, lines) : les vues sans builder f (résultats de recherche, /domain, /status, /suggest, /settings, /doctor, /help) apparaissent de haut en bas ; les lignes qui viennent d'arriver sont d'abord grises (DIM sur le texte sans ANSI) puis se colorent à la frame suivante. frame_fits(n) garde le rideau hors du mode append.
- Flash du pill de vue : pendant les frames d'animation, le pill du header est inversé (fond clair, texte de la couleur de vue) puis reprend son style — signale visuellement le changement de vue.
- Secousse sur erreur : notice
err en mode in-place → le cadre entier tremble d'une colonne (2 allers-retours, ~160 ms) pendant le flash gras, via state["shake"] et une largeur réduite d'une colonne (lignes de même longueur → aucun résidu).
- Vainqueur
/compare en dernier : la ligne ★ Vainqueur n'apparaît qu'à f = 1, puis flashe en vidéo inverse ~120 ms.
- Sparkline live
/watch : la vue accumule les relevés de pages (60 max, rebasés sur le min) et trace l'évolution en direct sous « Dernier passage ».
✨ /settings : 4 nouveaux réglages + menus améliorés
theme (défaut/océan/contraste élevé) : trois palettes complètes VIEW_BG/VIEW_FG (pills + marqueurs de titre + prompt), appliquées à chaud par apply_theme(), persistées. « Contraste élevé » = couleurs vives sur fonds saturés (accessibilité).
stats_days (1–365, défaut 7) : période par défaut de /stats ET du CLI stats sans -d.
sidebar (on/off) : masque le panneau Statistiques même en terminal large ; le header affiche alors latence + pages indexées (fmt_short : « 4,74 M pages »), aussi en terminal étroit ≥ 60 colonnes.
bell (off par défaut) : \a quand /watch (TUI et CLI) détecte un changement.
- Menus : la valeur actuelle est marquée ✓ et présélectionnée (
initial= de menu_select) ; après validation on revient au menu des réglages (enchaînement, Échap pour sortir) ; numéros 1.–13. alignés sur 2 chiffres.
- Filtre au clavier dans tous les menus : taper des lettres filtre la liste en direct (palette, complétion, réglages…), Retour arrière efface le filtre, chiffres = saut direct tant qu'aucun filtre. Le texte tapé s'affiche en cyan après l'en-tête du menu.
✨ Commandes
/help <commande> (alias acceptés : /help bl) : fiche d'aide ciblée — description, alias, exemples (HELP_EX). /help seul inchangé.
c <n°> : copie l'URL d'un résultat dans le presse-papiers sans ouvrir le navigateur (clip Windows en UTF-16, pbcopy macOS, xclip/xsel/wl-copy Linux — message clair si aucun n'existe). Footer résultats + aide mis à jour (raccourcis interceptés : n, p, q, i, c, chiffres).
/backlinks history <dom> en TUI : sparkline d'évolution + delta premier→dernier snapshot + tableau (12 derniers) avec barres — l'endpoint n'était exposé qu'en CLI.
/domain : « Part de l'index » — % des pages du domaine dans l'index total (données SESSION["engine"], zéro appel en plus), virgule décimale en français, « < 0,01 % » plancher.
/stats : tendance — Δ% de la fenêtre affichée vs la précédente (↑ +12 % vs période précédente, vert/rouge, seuil 0,5 %).
- Complétion des domaines : Tab après
/domain , /backlinks , /status , /watch , /compare → menu « Domaines récents » (last_domain + historique + snapshots du cache, 12 max, filtré par le préfixe tapé, domaines déjà saisis exclus — utile pour le 2ᵉ domaine de /compare).
- Palette avec alias : colonne
/d, /bl, /vs… entre la commande et sa description.
- Footer
/domain propose aussi /watch <dom> ; footer résultats propose c <n°>.
🔧 Interne
ALIAS_MAP/REV_ALIAS remplacent la liste ALIAS_HEADS manuelle (dérivée) ; run_tui normalise head via ALIAS_MAP → dispatch sur les noms canoniques uniquement.
handle_tab applique les réglages directement (apply_setting) : le kind ("set", …) a disparu de run_tui.
- Nouveaux helpers :
ease(), frame_fits(), animate_reveal(), apply_theme() (+ THEME_BG/THEME_FG), fmt_short(), known_domains(), copy_to_clipboard()/copy_result(), bl_history_lines(), help_cmd_lines()/HELP_EX, tui_help_cmd() ; header_line(w, view, flash) ; draw_frame lit state["shake"]/state["pill_flash"] ; import subprocess.
- ~32 chaînes
TR_EN ajoutées, 4 clés reformulées (raccourcis interceptés, aides settings/stats, réglage inconnu).
- Vérifié : compile +
ast.parse(feature_version=(3, 8)), extraction AST des clés T() → 0 manquante (COMMAND_DESC et HELP_EX inclus), parcours TUI pipé FR et EN (574/577 lignes de cadre alignées à 120 colonnes), smoke des 17 builders à f ∈ {0, 0.25, 0.5, 0.75, 1} (1 419 lignes), CLI live (search, domain, stats, suggest, health, status, doctor, compare, backlinks ×5, settings set/get/--json/reset + erreurs de validation sur APPDATA temporaire), stats sans -d suit bien stats_days.
✨ Vloki, l'araignée compagnon (17/07/2026)
- Mascotte d'accueil dessinée par Théo : une araignée pixel-art de 10 lignes (clin d'œil au spider = le crawler RDTvlokipBot) pendue à son fil
░ dans la zone vide à droite de l'écran d'accueil, nommée Vloki (nom auto-centré sous le dessin).
- Salut animé (dessiné par Théo aussi) : Vloki lève une patte et fait coucou — 11 frames (montée F1→F6 puis descente en miroir, 0,09 s/frame ≈ 1 s). Joué au lancement une fois le moteur chargé, puis toutes les 10 s d'inactivité sur l'accueil (ligne de saisie vide). La détection clavier n'avale aucune touche :
msvcrt.kbhit() sous Windows, select sous Unix (key_waiting()) — la première frappe interrompt le salut et arrive normalement dans la ligne de saisie.
- Bulle de dialogue : salut selon l'heure (« Bonjour ! » 5 h–18 h, « Bonsoir ! » sinon) + astuce aléatoire parmi 10 (
TIPS), différente à chaque lancement et à chaque /clear (jamais deux fois la même d'affilée). Astuces traduites (12 clés TR_EN).
- Intégrée proprement : colorée selon le thème actif (
VIEW_FG["accueil"]), fusion ANSI-aware alignée à droite dans les lignes de l'accueil (vpad/vlen), largeur constante pendant l'animation (frames paddées à SPIDER_W → zéro tremblement). Si la grande version n'a pas la place (terminal < ~170 colonnes), repli automatique sur une mini-araignée de 5 lignes ; en glyphes ASCII, mini version # ; trop étroit → masquée. Aucune ligne ne déborde du cadre, l'animation est coupée hors TTY/couleurs/in-place comme les autres.
- Interne :
SPIDER_FRAMES/SPIDER_W/SPIDER_MINI/SPIDER_ASCII, TIPS, pick_tip(), companion_block(), companion_wave(), key_waiting(), SESSION["tip"], hook d'inactivité dans line_input, imports random + textwrap.
🐛 Corrections (17/07/2026, avant publication)
- Le thème est enfin visible. Avant, changer de thème ne touchait que le pill de vue et le marqueur
▌ des titres — et dans la vue réglages (là où on change le thème), ces couleurs étaient des gris quasi identiques entre les trois thèmes : impression que « rien ne change ». Le thème pilote maintenant aussi le fond de la barre du header (THEME_BAR : 236 / 17 bleu nuit / 232 noir), la couleur de la bordure du cadre (THEME_FRAME : gris / 31 bleu océan / 255 blanc) et le dégradé du logo (THEME_GRADIENT : cyans→bleus pour océan, jaune→rouge pour contraste), appliqués à chaud par apply_theme() (dict THEME + GRADIENT[:] mutés en place). Les couleurs « réglages » des palettes océan (pill 24, marqueur 45) et contraste (pill 55 violet) sont désormais distinctes du défaut : l'effet est immédiat dès la validation du menu.
- Tab après
/commande arguments ne montre plus les résultats de recherche. La branche « / avec espace » de handle_tab retombait dans les menus contextuels quand la commande n'attendait pas un domaine : après une recherche, /help + Tab (ou n'importe quelle /commande args + Tab) ouvrait le menu des pages trouvées. Corrigé : la branche se termine par return None. Bonus : /help + Tab propose les commandes à documenter (menu « Aide d'une commande » avec descriptions, complétion directe si préfixe unique — /help dom + Tab → /help domain).
- Tab accepte la suggestion fantôme grise. Taper
rdt après avoir cherché rdtvlokip affichait bien le ghost vlokip, mais Tab ouvrait les menus contextuels au lieu de compléter (→ seule marchait). Désormais Tab accepte le ghost affiché (curseur en fin de ligne), comme →. Exception voulue : /commande sans espace garde la complétion de commande classique (qui ajoute l'espace pour l'argument). Aide mise à jour : « → ou Tab (fin de ligne) ».
- Application immédiate dans le menu réglages chaîné. En validant un réglage via Tab (thème, sidebar…), le cadre derrière le menu est redessiné aussitôt (
draw_frame après chaque apply_setting, en mode in-place avec couleurs) : le thème se voit à la validation et la liste des réglages derrière le menu est à jour. Avant, l'effet n'apparaissait qu'en sortant du menu avec Échap.
- Le menu résultats sur Tab suit
digit_mode. La branche résultats de handle_tab exige maintenant digit_mode == "open" (cohérent avec les chiffres et le footer) : après /help ou /domain, Tab sur ligne vide rouvre la palette de commandes au lieu des résultats d'une recherche passée.
- 2 clés
TR_EN ajoutées (« Aide d'une commande », « choisis la commande à documenter »), 1 renommée (« → ou Tab (fin de ligne) »).
- Vérifié : compile + AST 3.8, 0 clé
T() manquante, 18 tests unitaires Windows (thèmes ×3, handle_tab ×5, line_input ghost/complétion via read_key simulé), TUI pipé 120 colonnes avec changements de thème → cadre 100 % aligné, CLI live (version, health, settings theme set/get/reset) sur APPDATA temporaire.
✨ Animations de la TUI (nouveau réglage animations, activé par défaut)
- Framework
animate_view(state, build, steps, delay) : redessine le cadre 3–5 fois avec un facteur f croissant (~200 ms au total), puis pose la frame finale. Coupé automatiquement hors TTY, sans couleurs, en mode append, ou via le réglage. Les builders acceptent un f=1.0 optionnel — le rendu final est strictement identique à avant.
- Compteurs qui montent : totaux de l'accueil,
/stats, /backlinks (pages, domaines, liens…) comptent de 0 à leur valeur.
- Barres qui se remplissent : barres journalières de
/stats, ratios dofollow/internes et top domaines de /backlinks, ancres, jauge de latence /health, barres de score de i <n°>.
- Sparklines tracées de gauche à droite (crawl horaire, latence de session).
- Logo d'accueil en vague : le dégradé défile sur le logo au démarrage et sur
/clear.
- Pulsation
/watch : la puce « surveillance active » respire (●/○) pendant l'attente ; la sidebar (durée de session) se rafraîchit au passage.
- Flash des notices : les notices ok/warn/err apparaissent en gras ~120 ms puis reprennent leur style.
- Spinner enrichi : temps écoulé affiché dès 0,5 s (
Recherche… 1,2 s) et étapes n/total sur les commandes multi-requêtes (/backlinks 1/2–2/2, /compare 1/4–4/4).
✨ settings en CLI (persistant, contrairement à --lang/--timeout)
rdtsearch settings : affiche les réglages numérotés + le diagnostic terminal ; --json inclut le chemin du fichier et les valeurs actives.
rdtsearch settings <clé> <valeur> : modifie et enregistre dans config.json (lang, glyphs, colors, hide_adult (alias adult), history, timeout, animations ; booléens en on/off). parse_setting() partagé CLI/TUI, erreurs explicites (valeurs possibles, bornes). La config est rechargée depuis le fichier avant écriture pour ne pas persister les overrides de session --lang/--timeout.
rdtsearch settings <clé> : affiche la valeur seule. settings reset : supprime config.json + historique. settings clear-cache : purge les snapshots backlinks.
✨ Vue /settings refondue
- Réglages numérotés : taper
1–9 ouvre directement le menu du réglage (nouveau digit_mode="settings") ; hors terminal, message clair renvoyant vers /settings clé valeur.
/settings clé valeur en direct (mêmes clés que la CLI), plus /settings reset, /settings clear-cache, et /lang fr|en|auto en raccourci.
- Aperçu live : dans les menus Couleurs et Glyphes, la valeur survolée s'applique immédiatement (menu compris), restaurée si Échap — via le nouveau callback
on_move de menu_select.
- Puce jaune ● sur les réglages modifiés (≠ défaut, comparés à
DEFAULTS) + légende ; le « (défaut) » du timeout est remplacé par ce système.
- 2 nouvelles actions dans le menu Tab : Réinitialiser (défauts + suppression
config.json/historique) et Vider le cache (n snapshots affichés).
- Nouveau réglage Animations (Activées/Désactivées).
✨ Divers TUI
i dans le menu Tab des résultats ouvre la fiche détail du résultat surligné (Entrée = navigateur, comme avant) — paramètre alt de menu_select.
- Barres de duel dans
/compare : sous Pages indexées et Liens entrants, une barre bicolore cyan/magenta montre le rapport de force.
- Sparkline de latence dans
/health : historique des latences de la session (SESSION["lat_hist"], 40 max) + min/max.
- Quota backlinks dans la sidebar : ligne
Analyses n/3 (rouge si épuisé) dès que /backlinks a chargé le graphe.
- 429 plus lisible : l'heure de fin du blocage est ajoutée au message (
… réessaye dans 42 s (à 14:32:05)), calculée depuis Retry-After (ignorée si non numérique).
- Aide mise à jour (
/settings lang fr, numéro de réglage, i dans le menu résultats) ; footer réglages 1-9 ou Tab ; ~35 chaînes TR_EN ajoutées.
🔧 Interne
DEFAULTS (dict source des défauts) + CONFIG = dict(DEFAULTS) ; reset_config(), clear_cache(), retry_at(), note_latency(), settings_cats(), setting_shown(), choose_setting_value(), apply_setting() (remplace le bloc set inline de run_tui), open_setting(), parse_setting(), cmd_settings(), duel_bar(), anim_ready(), animate_view().
- Vérifié : compile +
ast.parse(feature_version=(3, 8)), parcours TUI pipé complet, 367 lignes de cadre alignées à 120 colonnes (strip ANSI), smoke-test des builders à f intermédiaire, CLI live (search, domain, stats, suggest, health, status, backlinks ×6, compare, settings set/get/reset/clear-cache/--json — mutations testées sur un APPDATA temporaire).
📦 Correctif de métadonnées
- URL de documentation corrigée :
https://search.rdtvlokip.fr/api → https://search.rdtvlokip.fr/api-docs (README.md + [project.urls]). Aucun changement de code ; la base API des appels (BASE_URL + endpoints /api/…) est inchangée.
- Publié sur PyPI.
📦 Correctif de publication
- Republiée en 0.13.1. La 0.13.0 avait été mise en ligne sans le nom de distribution
RDTSearch, puis supprimée de PyPI. PyPI interdit de réutiliser le nom de fichier d'une version supprimée → la 0.13.0 est définitivement brûlée, d'où le passage en 0.13.1. Aucun changement de code ; seules les métadonnées sont corrigées : name = "RDTSearch", Homepage https://rdtsearch.rdtvlokip.fr/, liens PyPI + GitHub.
🚀 Première publication PyPI
- Publié sur PyPI :
pip install rdtsearch. Nom de distribution RDTSearch (normalisé en rdtsearch par PyPI — les deux formes s'installent). Commande et module inchangés (rdtsearch).
- Liens ajoutés (
README.md + [project.urls]) : PyPI, dépôt GitHub.
✨ 4 nouveautés SEO & fiabilité
/compare a.fr b.fr (alias /vs) + CLI compare : duel SEO de deux domaines côte à côte — pages indexées, liens entrants, dernier passage, ancre nº1, vainqueur (score n–n) avec ★ sur les valeurs gagnantes. Vue TUI « duel » (pill magenta 125/213). Données : bot/domain + anchors — ⚠️ anchors.total = vrai total du graphe (vérifié live : 22 542 pour github.com), alors que les snapshots history reflètent l'analyse tronquée à 10 (backlink_count: 10) → ne jamais s'en servir comme totaux.
- Cache local des analyses backlinks (
%APPDATA%\rdtsearch\cache\bl_<domaine>.json) : /backlinks <dom> et backlinks detail réutilisent le snapshot du jour (zéro appel, quota 3/jour préservé) ; note « Snapshot local du … — --fresh pour réinterroger » ; --fresh force l'API (TUI et CLI) ; si l'API échoue (429/panne), secours sur le dernier snapshot même ancien avec l'erreur serveur affichée.
watch <domaine> : surveillance continue de l'indexation, en CLI et en TUI. CLI watch <dom> [-i sec] (défaut 300 s, borné 60–3600) : ligne à chaque changement, statut in-place, flush=True, Ctrl+C = bilan. TUI /watch <dom> [sec] (défaut 30 s) : cadre live redessiné à chaque intervalle avec un journal des changements horodaté (+N pages vert / passage du bot) ; attente non bloquante wait_or_key() (msvcrt sur Windows, select sur Unix) → n'importe quelle touche arrête ; en mode pipé/non-TTY, repli sur un instantané. Boucle vérifiée par test unitaire (TTY + touche simulés).
doctor [--json] (CLI et TUI /doctor) : auto-diagnostic — version/Python/OS, terminal (TTY, encodage, glyphes, couleurs), configuration (fichier, langue, timeout, historique, snapshots), serveur (santé ✓/✗, latence, décalage horloge, tier + quota backlinks daily_used/daily_limit). CLI : code de sortie 0/1 selon la santé serveur ; doctor_report() partagé, doctor_lines() pour la vue « diagnostic ».
- Commandes triées automatiquement :
COMMANDS = sorted(COMMAND_DESC) (avant : liste manuelle en double). Une commande ajoutée à COMMAND_DESC apparaît seule, à sa place alphabétique, dans la palette et la complétion.
/compare, /watch, /doctor dans la palette, l'aide, le footer contextuel et les vues colorées (duel 125, surveillance 23, diagnostic 53) ; alias /vs ; ~45 chaînes TR_EN ajoutées.
✨ Réglages complets (/settings)
- 6 réglages persistés dans
config.json (avant : langue seule) : lang, glyphs (auto/utf/ascii), colors (auto/on/off), hide_adult (bool), history (bool), timeout (1–120 s, défaut 15). Validation stricte au chargement (bornes, bool refusé pour timeout).
--timeout S en option CLI globale (session seulement, borné 1–120), même logique que --lang. Dans le menu Tab : choix 5 / 15 / 30 / 60 s.
- Menu Tab à 2 niveaux en vue réglages : choisir le réglage → choisir la valeur (même mécanique
menu_select que la langue).
- Glyphes forçables :
apply_glyphs() rebâtit S{} et UTF à chaud (utf_auto() + glyph_set(utf)). L'utilisateur en vieux CMD peut forcer l'UTF, ou l'inverse.
- Couleurs persistées et ré-activables à chaud :
C_ANSI conserve les codes d'origine, apply_colors() restaure ou vide C. --no-color CLI et la désactivation hors TTY restent prioritaires (NO_COLOR["cli"]).
- Filtre contenu adulte :
adult_filter() retire les résultats is_adult (TUI + CLI), note grise « {n} résultat(s) adulte(s) masqué(s) ». La numérotation TUI reste alignée sur state["results"] filtré. --json non filtré (brut).
- Historique persistant opt-in (défaut : désactivé, privacy-first) :
%APPDATA%\rdtsearch\history.txt, 200 entrées max, sauvegarde à chaque saisie. Désactivation = fichier supprimé.
- Diagnostic dans la vue réglages : taille du terminal + mode de rendu (in-place/append), encodage stdout, glyphes actifs (UTF/ASCII), couleurs actives, langue OS détectée.
- ~35 nouvelles chaînes traduites (
TR_EN).
🐛 Corrigé (signalés par Théo en route)
- Palette de commandes « incomplète » :
menu_select était figé à 8 lignes visibles (le défilement existait mais rien ne l'indiquait → on croyait la liste tronquée). Hauteur désormais dynamique (LINES − 6, min 4) : les 14 commandes s'affichent d'un coup sur un terminal normal ; compteur n/total dans l'en-tête quand ça défile quand même.
- Débordement du cadre en mode ASCII :
vcrop réservait 1 colonne pour l'ellipse, or ... ASCII = 3 caractères → lignes trop longues de 2 (invisible tant que l'UTF était toujours actif). Réserve désormais len(S["ell"]). Vérifié : 185 lignes de cadre à largeur identique sur un parcours complet.
- BOM en mode pipé : sous PowerShell 5.1,
"/settings" | rdtsearch --tui arrivait en /settings (BOM UTF-8 mojibaké cp1252) → traité comme une recherche. Le fallback pipé retire le BOM (formes U+FEFF et cp1252).
🐛 Corrigé (signalé par Théo)
? à la place des glyphes (❯, ▇▃▁, ╭…) dans le CMD classique. Cause : Python ≥ 3.6 annonce toujours utf-8 sur une vraie console Windows (PEP 528), donc UTF=True, mais la police du vieux conhost ne sait pas dessiner ces caractères. Règle ajoutée : sous Windows, les glyphes UTF ne s'activent que dans un terminal moderne (détecté via WT_SESSION, WT_PROFILE_ID, TERM_PROGRAM, ConEmuANSI, ANSICON ou TERM) ; CMD/PowerShell dans conhost → fallback ASCII complet de S{} (>, #, +--+, logo ASCII). Windows Terminal, VS Code, ConEmu/Cmder gardent l'interface UTF intacte.
📦 Packaging
pyproject.toml ajouté : pip install -e . installe la commande rdtsearch (point d'entrée rdtsearch:main). Zéro impact sur la distribution un-fichier ; servira pour PyPI.
- Prêt pour PyPI :
README.md (anglais, page PyPI), licence AGPL-3.0-or-later (LICENSE + métadonnées PEP 639), wheel + sdist construits (python -m build), twine check PASSED, install testée en venv vierge. Nom rdtsearch vérifié libre sur PyPI.
🌍 Internationalisation — /settings + français/anglais
- Nouvelle commande
/settings (alias /lang) : vue réglages avec la langue courante et le chemin du fichier de config ; Tab → menu Auto / Français / English (même mécanique que le menu périodes — les menus ne peuvent s'ouvrir que pendant la saisie)
- Détection automatique de la langue de l'OS par défaut :
GetUserDefaultUILanguage (ctypes, registre Windows) → français si LANGID 0x0C, sinon anglais ; sur Unix LC_ALL/LC_MESSAGES/LANG
- Persistance :
%APPDATA%\rdtsearch\config.json (Windows) / ~/.config/rdtsearch/config.json (Unix), valeurs auto / fr / en
--lang auto|fr|en en CLI (session seulement, non persisté) ; pré-scan de sys.argv pour que --help sorte déjà dans la bonne langue
- Toute l'interface passe par
T() (~260 chaînes) : TUI (vues, menus, footer, aide, accueil, notices, spinners), erreurs API, sorties CLI, aides argparse. Dictionnaire TR_EN clé = chaîne française. Le changement de langue est instantané (header/sidebar/footer au prochain rendu)
- ⚠️ Ancienne consigne « 100 % français » remplacée : français par défaut (ou langue OS), anglais optionnel — décision de Théo pour la distribution GitHub/PyPI
🐛 Corrigé (UX — signalé par Théo)
- Fantôme incohérent avec le menu Tab : taper
/h affichait le fantôme elp (la ligne ressemblait à /help complet), puis Tab ouvrait un menu « /help ou /health ? » — la ligne et le menu se contredisaient. Règle corrigée : le fantôme de commande ne s'affiche que si la complétion est unique ; plusieurs candidats → pas de fantôme (ni repli historique), Tab montre le menu. Le repli historique reste actif pour le texte libre et les commandes avec argument (/domain r → dtvlokip.fr).
🐛 Corrigé
- Crash
ValueError sur la touche ² (AZERTY, juste au-dessus de Tab) dans les menus flèches et en saisie directe. Cause : '²'.isdigit() renvoie True en Python (exposants Unicode) mais int('²') lève une exception. Les 3 sites (menu_select, chiffres directs, i <n°>) passent par un nouveau is_digits() strict ASCII ; ² tapé seul devient une simple recherche.
✨ Saisie nouvelle génération (TUI)
- Palette de commandes : Tab sur ligne vide (hors menus contextuels) → menu flèches de toutes les commandes avec leur description. Commande à argument (
/domain…) = pré-remplie ; sinon exécutée directement
- Complétion fantôme (style fish) : la suite probable s'affiche en gris après le curseur (commandes, puis historique) ; → en fin de ligne accepte
- Coloration en direct : la
/commande tapée passe en vert (valide ou préfixe valide, alias inclus) ou rouge (inconnue)
🔬 Fiche détaillée d'un résultat : i 3
- Score final, classe BERT, intention de requête, nombre de mots, trackers complets, description entière
- Répartition du score : barres pour les points additifs (bm25, title, domain_match, url_match…), multiplicateurs
×1.05 en vert (boost) / rouge (malus), regroupés 4 par ligne
- Les chiffres continuent d'ouvrir le navigateur depuis la fiche
📊 Stats enrichies (zéro appel API en plus — données déjà reçues)
- Crawl horaire : sparkline des dernières 24 h + total + pic avec son heure (
hourly_values/hourly_labels, jamais exploités avant)
- Nouveaux domaines/jour : colonne
+N dom. à droite des barres quotidiennes (domains_daily)
🔎 Découvertes API (vérifiées en live)
score_breakdown = dict de 23 floats : points additifs (bm25 ~1700, title, domain_match, url_match, desc) + multiplicateurs autour de ×1 (https, depth, freshness, pagerank, bert_boost, short_query_boost…)
- L'API fournit aussi
display_url (URL sans schéma) et id par résultat
🎨 Interface (TUI)
- Titres de vues unifiés : marqueur
▌ coloré selon la vue (même teinte que le pill du header), appliqué à toutes les vues et aux sections de l'aide (palette VIEW_FG)
- Prompt contextuel : le
❯ prend la couleur de la vue courante
- Footer coloré : commandes en cyan, descriptions en gris — beaucoup plus scannable ; désormais croppé à la largeur du terminal (plus de retour à la ligne)
- Accueil enrichi : total pages/domaines affiché sous le logo dès le chargement + bloc « Essaie : » avec 4 exemples prêts à taper
- Stats : dates au format JJ/MM/AAAA, barres lissées au ⅛ de bloc (
▏▎▍▌▋▊▉█), ligne résumé (total · moyenne/jour · pic), jour de pic surligné en vert
- Backlinks (vue globale) : jauges de répartition dofollow/nofollow et internes/externes (vert/gris + pourcentage), top domaines avec mini-barres proportionnelles
- Santé : jauge visuelle de latence colorée (vert < 300 ms, jaune < 1 s, rouge au-delà)
- Domaine : nouvelle ligne Statut avec
● indexé / ○ non indexé
- URLs raccourcies à l'affichage :
https:// retiré, slash final nettoyé (résultats + backlinks) — l'URL complète reste utilisée à l'ouverture
- Notices : icône en gras ; pill du header en gras
✨ Ajouté
- « Tu voulais dire /stats ? » : sur commande inconnue, suggestion de la commande la plus proche (
difflib, stdlib)
🐛 Corrigé
- 429 : le message serveur est maintenant prioritaire. Découvert en test :
/api/backlinks/detail a un quota journalier anonyme (3 analyses/jour) et son 429 contient un message précis (« Limite atteinte (3/jour). Connectez-vous pour 10 analyses/jour. »). Avant, on affichait le générique « réessaye dans une minute » (faux pour un quota journalier). Ordre : message serveur (+ Retry-After si présent) → Retry-After seul → générique.
🔧 Interne
- Nouveaux helpers :
title(), hbar8(), ratio_bar(), fmt_date(), display_url(), hint() ; glyphes edge (▌) et ring (○) avec fallback ASCII
- Variables locales
title renommées t (masquaient la nouvelle fonction module)
✨ Ajouté
- Tab dans la vue stats → menu à flèches pour changer la période : 1, 3, 7, 30, 180, 365 jours ou tout l'historique (« tout » = sans borne de date)
- Changement de période instantané : re-rendu depuis le cache déjà chargé, zéro appel API supplémentaire (la limite de
/api/graph/data est à 10/min)
- Titre du tableau adapté : « (30 derniers jours) » / « (tout l'historique — N jours) »
- Footer de la vue stats : « Tab changer la période » ; aide mise à jour
- Harnais pty : 3 nouveaux checks (menu périodes, 30 jours, tout) → 13/13 PASS
🐛 Corrigé
- SyntaxError sur Python < 3.12 : des échappements
\uXXXX s'étaient glissés dans des expressions d'f-string (ex : {'dom. r\u00e9f.':>9}). Le backslash y est interdit avant Python 3.12 (PEP 701). Les 45 échappements du fichier ont été convertis en vrais caractères UTF-8 ; syntaxe validée avec le parseur en mode Python 3.8.
✨ Ajouté — Tier 3 : backlinks (SEO)
- CLI
backlinks avec 6 actions :
stats — graphe global (126 M liens, 20,9 M pages liées, 748 K domaines), répartition dofollow/nofollow/internes/externes, date de construction, tier affiché
top [-n N] — domaines les plus liés (backlinks + domaines référents)
detail <dom> — liste des liens entrants : domaine source, URL, ancre ↳ « … », badges [nofollow] [sponsored] [ugc]
anchors <dom> — ancres avec barres de répartition █░ + pourcentages
history <dom> — tableau des snapshots (liens, dofollow, nofollow, dom. réf.)
export <dom> [--format csv|json] [-o fichier] — écrit le fichier ; tier anonyme → message serveur exact (« réservé aux comptes premium »), pas un crash
- TUI
/backlinks (alias /bl) :
- sans argument → vue globale : stats du graphe + top 8 domaines
- avec domaine → liens entrants + Ancres principales avec barres
- chiffres / Tab = ouvrir la page source dans le navigateur (mode contextuel réutilisé)
api_get_text() pour les réponses non-JSON (export CSV)
- Découverte API : système de tiers (
anonymous : 10 résultats max/req, export bloqué, quota journalier)
🎨 Interface
- Pill de vue colorée dans le header (fond différent par vue : recherche, aide, domaine, stats, backlinks…)
- Footers contextuels intelligents : après
/domain rdtvlokip.fr, le footer propose /backlinks rdtvlokip.fr et /status rdtvlokip.fr déjà remplis ; idem entre vues stats/santé/backlinks/soumission
- Sidebar : séparateurs fins entre sections + nouvelle ligne
Liens (total du graphe, chargé au démarrage)
- Menus flèches : pointeur
❯ sur la ligne sélectionnée
- Écran d'accueil : raccourcis en style keycaps
[Entrée] [Tab] [/help] [q]
- Aide : section SEO · backlinks
✨ Ajouté
- Badges vie privée sur chaque résultat (CLI + TUI) :
● vert (tracker_level 0), jaune (1), rouge (2)
- Texte = liste des trackers détectés (ex :
Google Analytics, Google Tag Manager, croppée à 44 car.) ou libellé par défaut (aucun tracker / tracking minimal / trackers)
tracker_level null → aucun badge affiché
- Badge
[18+] rouge gras quand is_adult est vrai
- Légende des badges dans
/help
🔧 Modifié
- Échap vide la ligne de saisie (et sort du rappel d'historique)
✨ Ajouté
- Saisie clavier brute :
msvcrt (Windows) / termios + décodeur UTF-8 manuel (Unix) — plus de input()
- Complétion Tab des
/commandes : correspondance unique → complétée en ligne ; plusieurs → menu à flèches
- Menus flèches
↑↓ + Entrée (Échap annule, chiffre = saut direct) :
- complétion multiple de commandes
- suggestions → Entrée lance la recherche
- résultats → Entrée ouvre dans le navigateur
- Historique de saisie
↑↓ (session, avec brouillon préservé)
- Édition de ligne complète : curseur
←→, Début/Fin, Suppr, Backspace, défilement horizontal des saisies longues
- Harnais de test pty (
pty_test.py) simulant Tab/flèches/Entrée — 10 vérifications
📝 Notes
- Hors terminal (pipes, scripts) : repli automatique sur
input()
✨ Ajouté
- Tier 2 API :
suggest, health, status (CLI) + /suggest, /health, /status (TUI)
- Suggestions cliquables : taper le numéro lance la recherche
- Zéro résultat → suggestions automatiques « Essaie plutôt : » (via autocomplete, appel silencieux)
- Mode chiffres contextuel : ouvrir un résultat ou lancer une suggestion, selon la vue
- Footer contextuel sous le cadre (change selon la vue)
- Header en barre pleine (fond sombre, titre magenta, vue courante, statut
●)
- Coins arrondis
╭ ╮ ╰ ╯
- Latence colorée : vert < 300 ms, jaune < 1 s, rouge au-delà
- Sidebar :
Auj. / Hier avec flèche de tendance ↑↓
health : statut, latence, heure serveur, décalage d'horloge
🔧 Modifié
api_get lit le corps JSON des erreurs → message serveur exact remonté
/status sur domaine jamais soumis : le 404 est une info jaune, pas une erreur
- Schéma succès de
status inconnu → affichage clé/valeur générique
🐛 Corrigé
- Scroll impossible vers le haut : l'écran alternatif (
?1049h, mode vim/htop) désactive le scrollback par design (VS Code inclus) → supprimé
🔧 Modifié
- Rendu adaptatif : cadre ≤ hauteur du terminal → redraw in-place (effet app) ; sinon mode append → scrollback natif fonctionnel
- En mode append, les notices s'impriment sans redessiner le cadre (pas de spam d'historique)
- Les résultats restent dans le terminal après
/quit
✨ Ajouté
- Interface plein écran type console : barre de titre, cadre principal, sidebar Statistiques
- Sidebar : statut moteur, latence réellement mesurée, Pages/Domaines/URLs globaux, sparkline crawl 14 j, barre jour vs pic, session (requêtes, durée)
- Aide réécrite : logique « tout est une recherche par défaut », exemples concrets, bloc dédié au cas
/q
vcrop/vpad/vlen ANSI-aware : largeur du cadre au caractère près
- Strip des caractères larges (emoji/CJK) dans les cadres — ils cassaient les bordures
- Notices colorées (✓ ! ✗) affichées dans le cadre
- Commande
/refresh
✨ Ajouté
- Interface interactive (TUI) : logo RDT en blocs Unicode avec dégradé animé (fallback ASCII), statut live au démarrage, spinner threadé pendant les requêtes
- Ouverture des résultats dans le navigateur (taper le numéro), pagination
n/p, /q <texte> forcé, /domain, /stats, /clear, /help, /quit
- Curseur masqué pendant chargement, restauré à la sortie ; titre de fenêtre du terminal
- Erreurs 429 affichées sans quitter l'interface
🐛 Corrigé
totals de /api/graph/data est cumulé sur la fenêtre days (pas global !) → fetch systématique sur 365 j + slice du tableau. Les vrais totaux globaux apparaissent enfin (4,65 M pages / 296 K domaines)
- Double échappement HTML des snippets (
é visibles) → double html.unescape
✨ Ajouté
- CLI initial :
search (+ -p), domain, stats (+ -d), option --json partout
- Zéro dépendance : urllib + argparse, Python 3.7+
- Gestion 429 avec header
Retry-After (code de sortie 2), erreurs réseau/timeout propres
- Couleurs ANSI activées sur Windows (
os.system('')), auto-désactivées hors TTY
BrokenPipeError géré (pipes vers head, findstr…)
- Normalisation d'entrée : URL complète → domaine
- Balises
<mark> de l'API → surlignage jaune gras ; encodage console protégé (errors="replace")
- Barres ASCII pour l'historique de crawl dans
stats