better-review 0.0.0-stage → 0.1.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 (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -2
  3. package/dist/cli.js +29266 -0
  4. package/dist/web/assets/astro-BGCLva2-.js +1 -0
  5. package/dist/web/assets/bat-qdxAdBWQ.js +1 -0
  6. package/dist/web/assets/c-Cz4nF6n_.js +1 -0
  7. package/dist/web/assets/c-SSSlmE39.js +1 -0
  8. package/dist/web/assets/clojure-DqKBuwfJ.js +1 -0
  9. package/dist/web/assets/cmake-Bj61d0ZC.js +1 -0
  10. package/dist/web/assets/cpp-DK5F0KO4.js +1 -0
  11. package/dist/web/assets/cpp-pF_afpy8.js +1 -0
  12. package/dist/web/assets/csharp-dmMxLVLW.js +1 -0
  13. package/dist/web/assets/css-BGIxQoYs.js +1 -0
  14. package/dist/web/assets/css-DgaLhXQH.js +1 -0
  15. package/dist/web/assets/dart-CHZY9Xhz.js +1 -0
  16. package/dist/web/assets/diff-woXpYk--.js +1 -0
  17. package/dist/web/assets/dockerfile-IyjqRm3v.js +1 -0
  18. package/dist/web/assets/dotenv-CuH5my32.js +1 -0
  19. package/dist/web/assets/elixir-DcSoMxCm.js +1 -0
  20. package/dist/web/assets/erlang-59ohNboI.js +1 -0
  21. package/dist/web/assets/fsharp-D2W_zG4w.js +1 -0
  22. package/dist/web/assets/gleam-CSRkHgEL.js +1 -0
  23. package/dist/web/assets/go-rLFTqkRN.js +1 -0
  24. package/dist/web/assets/graphql-BoW1g5X9.js +1 -0
  25. package/dist/web/assets/graphql-C2HCcBds.js +1 -0
  26. package/dist/web/assets/groovy-CacY0gHj.js +1 -0
  27. package/dist/web/assets/haskell-D8IpX4py.js +1 -0
  28. package/dist/web/assets/hcl-Dh228itO.js +1 -0
  29. package/dist/web/assets/highlight.worker-D2jBd466.js +153 -0
  30. package/dist/web/assets/html-Bv1KyTF7.js +1 -0
  31. package/dist/web/assets/html-DZNlqGBh.js +1 -0
  32. package/dist/web/assets/index-CJw1unPf.css +1 -0
  33. package/dist/web/assets/index-bwna7cfM.js +109 -0
  34. package/dist/web/assets/ini-0B7NLFlx.js +1 -0
  35. package/dist/web/assets/ini-DiZ1IqbV.js +1 -0
  36. package/dist/web/assets/java-BtIQNnN0.js +1 -0
  37. package/dist/web/assets/java-_ATy9zCa.js +1 -0
  38. package/dist/web/assets/javascript-BzbQS41l.js +1 -0
  39. package/dist/web/assets/javascript-CpIGwZ_Y.js +1 -0
  40. package/dist/web/assets/json-B88Oqtu5.js +1 -0
  41. package/dist/web/assets/json-C3WlssX3.js +1 -0
  42. package/dist/web/assets/json5-BR5RXkoi.js +1 -0
  43. package/dist/web/assets/jsonc-CYpm1nAK.js +1 -0
  44. package/dist/web/assets/jsx-C4yDKi0A.js +1 -0
  45. package/dist/web/assets/jsx-D3KKoC5L.js +1 -0
  46. package/dist/web/assets/julia-CBcsyk3j.js +1 -0
  47. package/dist/web/assets/kotlin-DhhofPvG.js +1 -0
  48. package/dist/web/assets/less-DVTAwKKz.js +1 -0
  49. package/dist/web/assets/lua-B0e3uOiv.js +1 -0
  50. package/dist/web/assets/lua-pjIdZuk8.js +1 -0
  51. package/dist/web/assets/makefile-Dixweg8N.js +1 -0
  52. package/dist/web/assets/markdown-CboqBxpY.js +1 -0
  53. package/dist/web/assets/markdown-CjQmuOi1.js +1 -0
  54. package/dist/web/assets/mdx-DQZ5AkYe.js +1 -0
  55. package/dist/web/assets/nginx-DbUAZ-J7.js +1 -0
  56. package/dist/web/assets/nix-Cl_7024t.js +1 -0
  57. package/dist/web/assets/objective-c-D1A_Heim.js +1 -0
  58. package/dist/web/assets/ocaml-O90oeIOV.js +1 -0
  59. package/dist/web/assets/perl-CCy4CjC0.js +1 -0
  60. package/dist/web/assets/php-3goRFXPs.js +1 -0
  61. package/dist/web/assets/postcss-D_Wz94rJ.js +1 -0
  62. package/dist/web/assets/powershell-QtSnmXcu.js +1 -0
  63. package/dist/web/assets/prisma-DMgNhnYS.js +1 -0
  64. package/dist/web/assets/properties-DiZ1IqbV.js +1 -0
  65. package/dist/web/assets/proto-DB4EqR-F.js +1 -0
  66. package/dist/web/assets/python-C5TF47hQ.js +1 -0
  67. package/dist/web/assets/python-CzFU0dpx.js +1 -0
  68. package/dist/web/assets/r-BXEss897.js +1 -0
  69. package/dist/web/assets/r-DWzjseEo.js +1 -0
  70. package/dist/web/assets/ruby-ChLscevq.js +1 -0
  71. package/dist/web/assets/rust-DpiIf5JO.js +1 -0
  72. package/dist/web/assets/sass-DXrisJhu.js +1 -0
  73. package/dist/web/assets/scala-BiFt_7mu.js +1 -0
  74. package/dist/web/assets/scss-CJjWJ-Oh.js +1 -0
  75. package/dist/web/assets/shellscript-CVTB3cr6.js +1 -0
  76. package/dist/web/assets/shellscript-CqHdAlCp.js +1 -0
  77. package/dist/web/assets/sql-CNu3Or2W.js +1 -0
  78. package/dist/web/assets/sql-CfM2IJm3.js +1 -0
  79. package/dist/web/assets/svelte-Bte6OA2r.js +1 -0
  80. package/dist/web/assets/swift-CyEgAFGc.js +1 -0
  81. package/dist/web/assets/terraform-DswuEJGm.js +1 -0
  82. package/dist/web/assets/toml-CcmNWLt0.js +1 -0
  83. package/dist/web/assets/tsx-BOvsFOI6.js +1 -0
  84. package/dist/web/assets/tsx-CGosfAUg.js +1 -0
  85. package/dist/web/assets/typescript-Bb1J8qyy.js +1 -0
  86. package/dist/web/assets/typescript-j_1H8WHN.js +1 -0
  87. package/dist/web/assets/vue-CcmjViMa.js +1 -0
  88. package/dist/web/assets/xml-Bvlx11yh.js +1 -0
  89. package/dist/web/assets/xml-Byfru430.js +1 -0
  90. package/dist/web/assets/yaml-DDA_XMNu.js +1 -0
  91. package/dist/web/assets/yaml-DijMHRDA.js +1 -0
  92. package/dist/web/assets/zig-CMLA9XwU.js +1 -0
  93. package/dist/web/index.html +13 -0
  94. package/package.json +42 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Victor Levasseur
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,130 @@
1
- # Temporary Holding Version
1
+ # better-review
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Interface web locale pour relire les pull requests GitHub : tout est déplié, le « vu » est suivi finement
4
+ (fichier synchronisé avec GitHub, hunk / commit / thread en local) et la relecture se fait au clavier.
5
+
6
+ Besoin détaillé : [`docs/besoin.md`](https://github.com/victorlevasseur/better-review/blob/main/docs/besoin.md) ·
7
+ maquettes : [`mockups/index.html`](https://github.com/victorlevasseur/better-review/blob/main/mockups/index.html).
8
+
9
+ ## Prérequis
10
+
11
+ - Node ≥ 24
12
+ - Un token GitHub avec le scope `repo` : `GITHUB_TOKEN`, sinon celui de la CLI (`gh auth login`).
13
+ Le token reste côté serveur, il n'est jamais envoyé au navigateur.
14
+
15
+ ## Lancer
16
+
17
+ ```sh
18
+ npx better-review # http://127.0.0.1:4180
19
+ # ou installé globalement :
20
+ npm install -g better-review && better-review
21
+ ```
22
+
23
+ Depuis les sources (pnpm ≥ 10) :
24
+
25
+ ```sh
26
+ pnpm install
27
+ pnpm build && pnpm start # http://127.0.0.1:4180
28
+ # ou en développement (Vite + rechargement du serveur) :
29
+ pnpm dev # http://127.0.0.1:5173
30
+ ```
31
+
32
+ Le serveur affiche au démarrage une URL `…/auth?token=…` : l'ouvrir une fois pose le cookie de session
33
+ (valable 400 jours). Sans lui, l'API refuse les appels (protection contre les autres sites ouverts dans le
34
+ navigateur). Le jeton est généré au premier lancement et conservé dans `BR_DATA_DIR/session-token` (0600) :
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
+ sessions distinctes.
37
+
38
+ Puis « Repos suivis » : ajouter des repos (`owner/repo`) ou des orgs / comptes. L'inbox ne montre que cette liste.
39
+
40
+ ## Configuration
41
+
42
+ | Variable | Défaut | Rôle |
43
+ | ------------------ | ------------------------------ | --------------------------------------------------------------------------------------- |
44
+ | `PORT` | `4180` | Port du serveur (API + front compilé) |
45
+ | `WEB_PORT` | `5173` | Port Vite en développement |
46
+ | `GITHUB_TOKEN` | `gh auth token` | Token GitHub |
47
+ | `BR_CONFIG_DIR` | `~/.config/better-review` | `config.json` (repos / orgs suivis, `staleDays`) — éditable à la main, rechargé à chaud |
48
+ | `BR_DATA_DIR` | `~/.local/share/better-review` | `state.db` (SQLite : visites, hunks vus, threads lus, cache des diffs) |
49
+ | `BR_SESSION_TOKEN` | `BR_DATA_DIR/session-token` | Jeton de session imposé (scripts, tests) |
50
+
51
+ ## Raccourcis (vue PR)
52
+
53
+ `j`/`k` fichier · `n`/`p` hunk · `]`/`[` thread non résolu · `v` fichier vu (Focus : puis fichier non vu
54
+ suivant) · `h` hunk vu · `r` répondre · `x` résoudre · `m` continu/focus · `u` côte à côte/unifié ·
55
+ `t` conversations · `d` description · `f` panneau fichiers · `Maj+S` review · `i` inbox · `Ctrl+K` aller à une PR ·
56
+ `?` aide.
57
+
58
+ Commenter : clic sur un numéro de ligne (« + » au survol), côté ancien code pour une ligne supprimée ou côté
59
+ nouveau code pour une ligne ajoutée, `Maj+clic` pour une plage ; bouton « Commenter » dans l'en-tête d'un fichier
60
+ pour le fichier entier. Chaque commentaire part seul ou dans la review en attente.
61
+
62
+ ## Naviguer dans les fichiers
63
+
64
+ Le panneau de gauche (520 px, masquable avec `f`) propose quatre vues :
65
+
66
+ | Vue | Ce qu'elle montre |
67
+ | ----- | ---------------------------------------------------------------------------------------------------------------------------- |
68
+ | Liste | Fichiers par dossier ou triés par taille, barre +/− par fichier |
69
+ | Arbre | Dossiers repliables avec le total des changements, les fichiers vus et les threads ouverts |
70
+ | Carte | Treemap : surface ∝ lignes modifiées, couleur ajouts → suppressions, fichiers vus estompés ; clic sur un dossier pour zoomer |
71
+ | Liens | Voisinage du fichier courant (ce qu'il utilise → fichier → ce qui l'utilise), liste en ordre de lecture, graphe plein écran |
72
+
73
+ Les liens sont calculés côté serveur sur le contenu complet des fichiers au head de la PR : AST TypeScript pour
74
+ TS/JS (y compris `.js` → `.ts`, `require`, `import()`), règles dédiées pour Python, CSS/SCSS/Less, Go, Java/Kotlin,
75
+ C/C++, Rust, Ruby, Vue/Svelte. Les mentions (nom de fichier en CamelCase, ou nom avec extension, ou chemin) couvrent
76
+ la doc et les autres langages. Les alias `tsconfig` `paths` autres que `@/`, `~/`, `#` ne sont pas résolus.
77
+
78
+ **Ordre « Base d'abord »** (barre de la PR, à côté de Continu / Focus) : le diff, `j`/`k` et le mode Focus suivent un
79
+ ordre topologique, chaque fichier après ceux qu'il importe ou mentionne, les plus utilisés en premier, les cycles
80
+ départagés de la même façon et les fichiers sans lien à la fin. On relit la PR de ses fondations vers ce qui les
81
+ assemble.
82
+
83
+ **Monorepos** : chaque dossier contenant un manifeste (`package.json`, `pyproject.toml`, `setup.py`, `go.mod`,
84
+ `Cargo.toml`, `pom.xml`, `build.gradle`, `composer.json`) est un package ; à partir de deux, l'ordre devient
85
+ hiérarchique : packages du plus utilisé au plus dépendant (dépendances déclarées entre packages du workspace, y
86
+ compris via un package non modifié, + imports entre fichiers), puis la base d'abord dans chaque package. Les imports
87
+ par nom de package (`@acme/shared`, `@acme/shared/x`, crates Rust) sont résolus vers le point d'entrée du package
88
+ (`exports` / `main` / `types` de `package.json`, sources `src/` correspondantes, `src/index.*`, `src/lib.rs`). La
89
+ vue Liens groupe les fichiers par package et le graphe plein écran les encadre ; il affiche aussi les autres packages du
90
+ monorepo et les dépendances entre packages (option « Autres packages du monorepo ») : en couleur uniquement les
91
+ packages qui contiennent des fichiers modifiés (et les liens entre eux), le reste en gris. Le graphe de voisinage
92
+ mélange fichiers et packages : à gauche les packages que le fichier importe par leur nom, à droite les packages qui
93
+ dépendent de son package (quand aucun de leurs fichiers n'y figure déjà), mêmes couleurs ; un voisin d'un autre package
94
+ porte le nom de son package, et un clic sur un package modifié ouvre son premier fichier dans l'ordre de lecture.
95
+
96
+ La description de la PR s'ouvre dans l'onglet « Description » du panneau de droite.
97
+
98
+ ## Architecture
99
+
100
+ ```
101
+ apps/cli paquet npm `better-review` : serveur + packages du workspace groupés par esbuild, front compilé dans dist/web
102
+ apps/server Node + Hono + tRPC v11 : proxy GitHub (GraphQL, diffs REST), SQLite, polling → subscriptions SSE
103
+ apps/web Vite + React + Mantine, TanStack Router / Query, diff virtualisé, coloration Shiki en Web Worker
104
+ packages/shared schémas zod, parseur de diff unifié (empreinte de hunk partagée serveur / navigateur)
105
+ ```
106
+
107
+ - Les diffs sont demandés entre deux SHA (immuables) et mis en cache définitivement.
108
+ - L'inbox fait une recherche « ids seulement » par section puis charge chaque PR une seule fois
109
+ (≈ 1 point de quota GraphQL par PR).
110
+ - Une PR ouverte est surveillée toutes les 30 s, l'inbox toutes les 2 min ; un changement côté GitHub
111
+ rafraîchit l'écran sans rechargement.
112
+
113
+ ## Développement
114
+
115
+ ```sh
116
+ pnpm lint && pnpm typecheck && pnpm test
117
+ pnpm format
118
+ ```
119
+
120
+ ### Publier sur npm
121
+
122
+ ```sh
123
+ cd apps/cli
124
+ npm version <patch|minor|major> --no-git-tag-version # version du paquet publié
125
+ pnpm pack # inspecter l'archive (facultatif)
126
+ pnpm publish # prepack : build complet + README / LICENSE
127
+ ```
128
+
129
+ `pnpm publish` exige un arbre git propre sur `main` : committer le changement de version avant. Seul `typescript`
130
+ reste une dépendance d'exécution (analyse des liens) ; le reste est inclus dans `dist/cli.js`.