better-review 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +53 -17
  2. package/dist/cli.js +1394 -1762
  3. package/dist/web/assets/highlight.worker-BOqhB448.js +153 -0
  4. package/dist/web/assets/{html-Bv1KyTF7.js → html-B3xvRgDO.js} +1 -1
  5. package/dist/web/assets/html-BHZv6uqE.js +1 -0
  6. package/dist/web/assets/index-B9sCIpY8.js +111 -0
  7. package/dist/web/assets/{index-rNKORPVq.css → index-Dp_ug4Zx.css} +1 -1
  8. package/dist/web/assets/{json-B88Oqtu5.js → json-qhed-kSA.js} +1 -1
  9. package/dist/web/assets/{jsx-D3KKoC5L.js → jsx-Bz0zcwM4.js} +1 -1
  10. package/dist/web/assets/{markdown-CboqBxpY.js → markdown-BYOwaDjH.js} +1 -1
  11. package/dist/web/assets/scss-8bKmll0B.js +1 -0
  12. package/dist/web/assets/{tsx-BOvsFOI6.js → tsx-udAQXfEw.js} +1 -1
  13. package/dist/web/assets/{typescript-j_1H8WHN.js → typescript-bsJCZSQ-.js} +1 -1
  14. package/dist/web/index.html +2 -2
  15. package/package.json +1 -1
  16. package/dist/web/assets/astro-BGCLva2-.js +0 -1
  17. package/dist/web/assets/bat-qdxAdBWQ.js +0 -1
  18. package/dist/web/assets/c-Cz4nF6n_.js +0 -1
  19. package/dist/web/assets/c-SSSlmE39.js +0 -1
  20. package/dist/web/assets/clojure-DqKBuwfJ.js +0 -1
  21. package/dist/web/assets/cmake-Bj61d0ZC.js +0 -1
  22. package/dist/web/assets/cpp-DK5F0KO4.js +0 -1
  23. package/dist/web/assets/cpp-pF_afpy8.js +0 -1
  24. package/dist/web/assets/csharp-dmMxLVLW.js +0 -1
  25. package/dist/web/assets/dart-CHZY9Xhz.js +0 -1
  26. package/dist/web/assets/diff-woXpYk--.js +0 -1
  27. package/dist/web/assets/dockerfile-IyjqRm3v.js +0 -1
  28. package/dist/web/assets/dotenv-CuH5my32.js +0 -1
  29. package/dist/web/assets/elixir-DcSoMxCm.js +0 -1
  30. package/dist/web/assets/erlang-59ohNboI.js +0 -1
  31. package/dist/web/assets/fsharp-D2W_zG4w.js +0 -1
  32. package/dist/web/assets/gleam-CSRkHgEL.js +0 -1
  33. package/dist/web/assets/go-rLFTqkRN.js +0 -1
  34. package/dist/web/assets/graphql-BoW1g5X9.js +0 -1
  35. package/dist/web/assets/graphql-C2HCcBds.js +0 -1
  36. package/dist/web/assets/groovy-CacY0gHj.js +0 -1
  37. package/dist/web/assets/haskell-D8IpX4py.js +0 -1
  38. package/dist/web/assets/hcl-Dh228itO.js +0 -1
  39. package/dist/web/assets/highlight.worker-D2jBd466.js +0 -153
  40. package/dist/web/assets/html-DZNlqGBh.js +0 -1
  41. package/dist/web/assets/index-DuH6feCh.js +0 -110
  42. package/dist/web/assets/ini-0B7NLFlx.js +0 -1
  43. package/dist/web/assets/ini-DiZ1IqbV.js +0 -1
  44. package/dist/web/assets/java-BtIQNnN0.js +0 -1
  45. package/dist/web/assets/java-_ATy9zCa.js +0 -1
  46. package/dist/web/assets/json-C3WlssX3.js +0 -1
  47. package/dist/web/assets/json5-BR5RXkoi.js +0 -1
  48. package/dist/web/assets/jsx-C4yDKi0A.js +0 -1
  49. package/dist/web/assets/julia-CBcsyk3j.js +0 -1
  50. package/dist/web/assets/kotlin-DhhofPvG.js +0 -1
  51. package/dist/web/assets/lua-B0e3uOiv.js +0 -1
  52. package/dist/web/assets/lua-pjIdZuk8.js +0 -1
  53. package/dist/web/assets/makefile-Dixweg8N.js +0 -1
  54. package/dist/web/assets/markdown-CjQmuOi1.js +0 -1
  55. package/dist/web/assets/mdx-DQZ5AkYe.js +0 -1
  56. package/dist/web/assets/nginx-DbUAZ-J7.js +0 -1
  57. package/dist/web/assets/nix-Cl_7024t.js +0 -1
  58. package/dist/web/assets/objective-c-D1A_Heim.js +0 -1
  59. package/dist/web/assets/ocaml-O90oeIOV.js +0 -1
  60. package/dist/web/assets/perl-CCy4CjC0.js +0 -1
  61. package/dist/web/assets/php-3goRFXPs.js +0 -1
  62. package/dist/web/assets/postcss-D_Wz94rJ.js +0 -1
  63. package/dist/web/assets/powershell-QtSnmXcu.js +0 -1
  64. package/dist/web/assets/prisma-DMgNhnYS.js +0 -1
  65. package/dist/web/assets/properties-DiZ1IqbV.js +0 -1
  66. package/dist/web/assets/proto-DB4EqR-F.js +0 -1
  67. package/dist/web/assets/python-C5TF47hQ.js +0 -1
  68. package/dist/web/assets/python-CzFU0dpx.js +0 -1
  69. package/dist/web/assets/r-BXEss897.js +0 -1
  70. package/dist/web/assets/r-DWzjseEo.js +0 -1
  71. package/dist/web/assets/ruby-ChLscevq.js +0 -1
  72. package/dist/web/assets/rust-DpiIf5JO.js +0 -1
  73. package/dist/web/assets/scala-BiFt_7mu.js +0 -1
  74. package/dist/web/assets/shellscript-CVTB3cr6.js +0 -1
  75. package/dist/web/assets/shellscript-CqHdAlCp.js +0 -1
  76. package/dist/web/assets/sql-CNu3Or2W.js +0 -1
  77. package/dist/web/assets/sql-CfM2IJm3.js +0 -1
  78. package/dist/web/assets/svelte-Bte6OA2r.js +0 -1
  79. package/dist/web/assets/swift-CyEgAFGc.js +0 -1
  80. package/dist/web/assets/terraform-DswuEJGm.js +0 -1
  81. package/dist/web/assets/toml-CcmNWLt0.js +0 -1
  82. package/dist/web/assets/tsx-CGosfAUg.js +0 -1
  83. package/dist/web/assets/typescript-Bb1J8qyy.js +0 -1
  84. package/dist/web/assets/vue-CcmjViMa.js +0 -1
  85. package/dist/web/assets/xml-Bvlx11yh.js +0 -1
  86. package/dist/web/assets/xml-Byfru430.js +0 -1
  87. package/dist/web/assets/yaml-DDA_XMNu.js +0 -1
  88. package/dist/web/assets/yaml-DijMHRDA.js +0 -1
  89. package/dist/web/assets/zig-CMLA9XwU.js +0 -1
package/README.md CHANGED
@@ -35,7 +35,22 @@ navigateur). Le jeton est généré au premier lancement et conservé dans `BR_D
35
35
  redémarrer le serveur ne déconnecte pas. Le cookie est lié à l'hôte : `127.0.0.1` et `localhost` sont deux
36
36
  sessions distinctes.
37
37
 
38
- Puis « Repos suivis » : ajouter des repos (`owner/repo`) ou des orgs / comptes. L'inbox ne montre que cette liste.
38
+ Puis « Repos suivis » : ajouter des repos (`owner/repo`) ou des orgs / comptes. L'accueil ne montre que cette liste.
39
+
40
+ ## Accueil : tableau des PR
41
+
42
+ Toutes les PR ouvertes des repos suivis, en colonnes par avancement : Brouillon · En attente de review · En review
43
+ (commentaires, changements demandés) · Approuvée (CI ou threads ouverts) · Prête à merger (approuvée, CI ok, aucun
44
+ thread ouvert) · Merge queue · Mergée (dernières 24 h). Pas de glisser-déposer : la colonne découle de l'état GitHub.
45
+
46
+ Badges de relation (review demandée, à re-relire, retours à traiter, ma PR, je participe, stagnante, sans reviewer) et
47
+ filtres par groupe : Reviewer, Auteur, Lead ; plus « Non lues » et « Non vues à 100 % ». Le tableau se recharge au
48
+ retour sur la page ou dans l'onglet (au-delà de 30 s), toutes les 5 min, dès qu'un changement GitHub est détecté
49
+ (sondage toutes les 60 s) et sur « Actualiser ».
50
+
51
+ Données chargées au plus juste : champs du tableau pour toutes les PR ; CI et threads en plus pour les PR approuvées
52
+ (pour séparer « Approuvée » de « Prête à merger ») ; taille, fichiers vus, réponses attendues et dernière activité
53
+ seulement pour les PR qui me concernent. Recherche GitHub limitée à 1000 résultats par repo / org suivi.
39
54
 
40
55
  ## Configuration
41
56
 
@@ -59,6 +74,11 @@ Commenter : clic sur un numéro de ligne (« + » au survol), côté ancien code
59
74
  nouveau code pour une ligne ajoutée, `Maj+clic` pour une plage ; bouton « Commenter » dans l'en-tête d'un fichier
60
75
  pour le fichier entier. Chaque commentaire part seul ou dans la review en attente.
61
76
 
77
+ Réactions emoji (celles de GitHub) sous chaque commentaire, review et la description : clic sur une réaction pour
78
+ ajouter / retirer la mienne, « ☺ » pour en choisir une autre. Les conversations résolues sont repliées (« Afficher N
79
+ messages ») et s'ouvrent quand on y navigue. La CI de l'en-tête met les échecs en avant (détail au clic) et est sondée
80
+ toutes les 15 s tant que des checks tournent.
81
+
62
82
  ## Naviguer dans les fichiers
63
83
 
64
84
  Le panneau de gauche (360 px, masquable avec `f`) propose trois vues. **La vue choisie fixe l'ordre des fichiers** :
@@ -71,10 +91,14 @@ sans changer l'ordre).
71
91
  | Arbre | Dossiers repliables (sous-dossiers avant fichiers, A→Z ou Taille) avec changements, fichiers vus, threads |
72
92
  | Liens | Fichiers en ordre de lecture « base d'abord », nombre d'imports / d'utilisateurs, graphe plein écran |
73
93
 
74
- Les liens sont calculés côté serveur sur le contenu complet des fichiers au head de la PR : AST TypeScript pour
75
- TS/JS (y compris `.js` → `.ts`, `require`, `import()`), règles dédiées pour Python, CSS/SCSS/Less, Go, Java/Kotlin,
76
- C/C++, Rust, Ruby, Vue/Svelte. Les mentions (nom de fichier en CamelCase, ou nom avec extension, ou chemin) couvrent
77
- la doc et les autres langages. Les alias `tsconfig` `paths` autres que `@/`, `~/`, `#` ne sont pas résolus.
94
+ **Langages pris en charge** : TypeScript / JavaScript, HTML, CSS / SCSS / Sass / Less, Markdown, JSON et texte brut
95
+ (`.txt`). Seuls les fichiers de ces langages sont analysés et colorés ; les autres s'affichent en texte simple et
96
+ peuvent seulement être la cible d'un lien. Les liens sont calculés côté serveur sur le contenu complet des fichiers au
97
+ head de la PR : AST TypeScript pour TS/JS (y compris `.js` → `.ts`, `require`, `import()`) ; `<script src>` et
98
+ `<link href>` pour HTML (URL relatives, ou `/…` depuis le dossier de la page) ; `@import` / `@use` / `@forward` pour les
99
+ feuilles de style (partiels `_x.scss`, `index`, chemins de chargement) ; les mentions (nom de fichier en CamelCase, ou
100
+ nom avec extension, ou chemin) valent pour tous ces langages. Les alias `tsconfig` `paths` autres que `@/`, `~/`, `#`
101
+ ne sont pas résolus.
78
102
 
79
103
  **Ordre « base d'abord »** (vue Liens) : ordre topologique, chaque fichier après ceux qu'il importe ou mentionne, les
80
104
  plus utilisés en premier, les cycles départagés de la même façon et les fichiers sans lien à la fin. On relit la PR de
@@ -83,12 +107,11 @@ ses fondations vers ce qui les assemble.
83
107
  **Voisinage** (onglet du panneau de droite, 520 px, quelle que soit la vue de gauche) : graphe du fichier courant, ce
84
108
  qu'il utilise → fichier → ce qui l'utilise, avec tous ses voisins ; clic sur un voisin pour l'ouvrir.
85
109
 
86
- **Monorepos** : chaque dossier contenant un manifeste (`package.json`, `pyproject.toml`, `setup.py`, `go.mod`,
87
- `Cargo.toml`, `pom.xml`, `build.gradle`, `composer.json`) est un package ; à partir de deux, l'ordre devient
110
+ **Monorepos** : chaque dossier contenant un `package.json` est un package ; à partir de deux, l'ordre devient
88
111
  hiérarchique : packages du plus utilisé au plus dépendant (dépendances déclarées entre packages du workspace, y
89
112
  compris via un package non modifié, + imports entre fichiers), puis la base d'abord dans chaque package. Les imports
90
- par nom de package (`@acme/shared`, `@acme/shared/x`, crates Rust) sont résolus vers le point d'entrée du package
91
- (`exports` / `main` / `types` de `package.json`, sources `src/` correspondantes, `src/index.*`, `src/lib.rs`). La
113
+ par nom de package (`@acme/shared`, `@acme/shared/x`) sont résolus vers le point d'entrée du package
114
+ (`exports` / `main` / `types` de `package.json`, sources `src/` correspondantes, `src/index.*`). La
92
115
  vue Liens groupe les fichiers par package et le graphe plein écran les encadre ; il affiche aussi les autres packages du
93
116
  monorepo et les dépendances entre packages (option « Autres packages du monorepo ») : en couleur uniquement les
94
117
  packages qui contiennent des fichiers modifiés (et les liens entre eux), le reste en gris. Le graphe de voisinage
@@ -101,22 +124,35 @@ La description de la PR s'ouvre dans l'onglet « Description » du panneau de dr
101
124
  ## Architecture
102
125
 
103
126
  ```
104
- apps/cli paquet npm `better-review` : serveur + packages du workspace groupés par esbuild, front compilé dans dist/web
105
- apps/server Node + Hono + tRPC v11 : proxy GitHub (GraphQL, diffs REST), SQLite, polling → subscriptions SSE
106
- apps/web Vite + React + Mantine, TanStack Router / Query, diff virtualisé, coloration Shiki en Web Worker
107
- packages/shared schémas zod, parseur de diff unifié (empreinte de hunk partagée serveur / navigateur)
127
+ apps/cli paquet npm `better-review` : serveur + packages du workspace groupés par esbuild, front dans dist/web
128
+ apps/server Node + Hono + tRPC v11 : proxy GitHub (GraphQL, diffs REST), SQLite, polling → subscriptions SSE
129
+ apps/web Vite + React + Mantine, TanStack Router / Query, diff virtualisé, coloration Shiki en Web Worker
130
+ packages/shared schémas zod, parseur de diff unifié (empreinte de hunk partagée serveur / navigateur)
131
+ packages/language briques communes aux langages : registre, chemins, index des fichiers, contrats d'analyse / coloration
132
+ packages/lang-typescript TS / JS : imports (AST TypeScript), écosystème npm (package.json), grammaires Shiki
133
+ packages/lang-html HTML : `<script src>`, `<link href>`, grammaire Shiki
134
+ packages/lang-css CSS / SCSS / Sass / Less : `@import` / `@use` / `@forward` (résolution façon Sass), grammaires Shiki
135
+ packages/lang-markdown Markdown : mentions, grammaire Shiki
136
+ packages/lang-json JSON / JSONC : mentions, grammaires Shiki
137
+ packages/lang-text texte brut : mentions
108
138
  ```
109
139
 
140
+ Chaque package de langage expose une partie `./analysis` (serveur : `LanguageAnalyzer`, et `Ecosystem` pour les
141
+ manifestes) et une partie `./highlight` (navigateur : `LanguageHighlighter`, grammaires chargées à la demande). Ajouter
142
+ un langage : créer `packages/lang-<nom>` sur ce modèle, puis l'enregistrer dans `apps/server/src/languages.ts` et
143
+ `apps/web/src/highlight/languages.ts` (seuls points d'enregistrement).
144
+
110
145
  - Les diffs sont demandés entre deux SHA (immuables) et mis en cache définitivement.
111
146
  - La coloration syntaxique porte sur le fichier entier (blobs désignés par les lignes `index` du diff, mis en cache
112
147
  définitivement) : un commentaire ou une chaîne ouvert hors d'un hunk est coloré correctement. Fichier trop gros ou
113
148
  indisponible : seules les lignes du diff sont colorées.
114
149
  - Un commentaire, une réponse ou un nouveau thread s'affiche dès la réponse de GitHub ; la PR est rechargée ensuite en
115
150
  arrière-plan.
116
- - L'inbox fait une recherche « ids seulement » par section puis charge chaque PR une seule fois
117
- (≈ 1 point de quota GraphQL par PR).
118
- - Une PR ouverte est surveillée toutes les 30 s, l'inbox toutes les 2 min ; un changement côté GitHub
119
- rafraîchit l'écran sans rechargement.
151
+ - Le tableau d'accueil fait des recherches « ids seulement » en parallèle puis charge les PR par lots de 25, avec trois
152
+ niveaux de détail (voir plus haut) : ≈ 5 points de quota GraphQL et ~7 s pour ~440 PR ouvertes.
153
+ - Une PR ouverte est surveillée toutes les 30 s, le tableau toutes les 60 s (empreinte légère) ; un changement côté
154
+ GitHub rafraîchit l'écran sans rechargement.
155
+ - « Vu » / hunk vu : affichage optimiste, protégé contre un rechargement de la PR parti avant l'écriture.
120
156
 
121
157
  ## Développement
122
158