better-review 0.0.0-stage → 0.2.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.
- package/LICENSE +21 -0
- package/README.md +132 -2
- package/dist/cli.js +29266 -0
- package/dist/web/assets/astro-BGCLva2-.js +1 -0
- package/dist/web/assets/bat-qdxAdBWQ.js +1 -0
- package/dist/web/assets/c-Cz4nF6n_.js +1 -0
- package/dist/web/assets/c-SSSlmE39.js +1 -0
- package/dist/web/assets/clojure-DqKBuwfJ.js +1 -0
- package/dist/web/assets/cmake-Bj61d0ZC.js +1 -0
- package/dist/web/assets/cpp-DK5F0KO4.js +1 -0
- package/dist/web/assets/cpp-pF_afpy8.js +1 -0
- package/dist/web/assets/csharp-dmMxLVLW.js +1 -0
- package/dist/web/assets/css-BGIxQoYs.js +1 -0
- package/dist/web/assets/css-DgaLhXQH.js +1 -0
- package/dist/web/assets/dart-CHZY9Xhz.js +1 -0
- package/dist/web/assets/diff-woXpYk--.js +1 -0
- package/dist/web/assets/dockerfile-IyjqRm3v.js +1 -0
- package/dist/web/assets/dotenv-CuH5my32.js +1 -0
- package/dist/web/assets/elixir-DcSoMxCm.js +1 -0
- package/dist/web/assets/erlang-59ohNboI.js +1 -0
- package/dist/web/assets/fsharp-D2W_zG4w.js +1 -0
- package/dist/web/assets/gleam-CSRkHgEL.js +1 -0
- package/dist/web/assets/go-rLFTqkRN.js +1 -0
- package/dist/web/assets/graphql-BoW1g5X9.js +1 -0
- package/dist/web/assets/graphql-C2HCcBds.js +1 -0
- package/dist/web/assets/groovy-CacY0gHj.js +1 -0
- package/dist/web/assets/haskell-D8IpX4py.js +1 -0
- package/dist/web/assets/hcl-Dh228itO.js +1 -0
- package/dist/web/assets/highlight.worker-D2jBd466.js +153 -0
- package/dist/web/assets/html-Bv1KyTF7.js +1 -0
- package/dist/web/assets/html-DZNlqGBh.js +1 -0
- package/dist/web/assets/index-DXvPQh0-.js +109 -0
- package/dist/web/assets/index-vJUACaoV.css +1 -0
- package/dist/web/assets/ini-0B7NLFlx.js +1 -0
- package/dist/web/assets/ini-DiZ1IqbV.js +1 -0
- package/dist/web/assets/java-BtIQNnN0.js +1 -0
- package/dist/web/assets/java-_ATy9zCa.js +1 -0
- package/dist/web/assets/javascript-BzbQS41l.js +1 -0
- package/dist/web/assets/javascript-CpIGwZ_Y.js +1 -0
- package/dist/web/assets/json-B88Oqtu5.js +1 -0
- package/dist/web/assets/json-C3WlssX3.js +1 -0
- package/dist/web/assets/json5-BR5RXkoi.js +1 -0
- package/dist/web/assets/jsonc-CYpm1nAK.js +1 -0
- package/dist/web/assets/jsx-C4yDKi0A.js +1 -0
- package/dist/web/assets/jsx-D3KKoC5L.js +1 -0
- package/dist/web/assets/julia-CBcsyk3j.js +1 -0
- package/dist/web/assets/kotlin-DhhofPvG.js +1 -0
- package/dist/web/assets/less-DVTAwKKz.js +1 -0
- package/dist/web/assets/lua-B0e3uOiv.js +1 -0
- package/dist/web/assets/lua-pjIdZuk8.js +1 -0
- package/dist/web/assets/makefile-Dixweg8N.js +1 -0
- package/dist/web/assets/markdown-CboqBxpY.js +1 -0
- package/dist/web/assets/markdown-CjQmuOi1.js +1 -0
- package/dist/web/assets/mdx-DQZ5AkYe.js +1 -0
- package/dist/web/assets/nginx-DbUAZ-J7.js +1 -0
- package/dist/web/assets/nix-Cl_7024t.js +1 -0
- package/dist/web/assets/objective-c-D1A_Heim.js +1 -0
- package/dist/web/assets/ocaml-O90oeIOV.js +1 -0
- package/dist/web/assets/perl-CCy4CjC0.js +1 -0
- package/dist/web/assets/php-3goRFXPs.js +1 -0
- package/dist/web/assets/postcss-D_Wz94rJ.js +1 -0
- package/dist/web/assets/powershell-QtSnmXcu.js +1 -0
- package/dist/web/assets/prisma-DMgNhnYS.js +1 -0
- package/dist/web/assets/properties-DiZ1IqbV.js +1 -0
- package/dist/web/assets/proto-DB4EqR-F.js +1 -0
- package/dist/web/assets/python-C5TF47hQ.js +1 -0
- package/dist/web/assets/python-CzFU0dpx.js +1 -0
- package/dist/web/assets/r-BXEss897.js +1 -0
- package/dist/web/assets/r-DWzjseEo.js +1 -0
- package/dist/web/assets/ruby-ChLscevq.js +1 -0
- package/dist/web/assets/rust-DpiIf5JO.js +1 -0
- package/dist/web/assets/sass-DXrisJhu.js +1 -0
- package/dist/web/assets/scala-BiFt_7mu.js +1 -0
- package/dist/web/assets/scss-CJjWJ-Oh.js +1 -0
- package/dist/web/assets/shellscript-CVTB3cr6.js +1 -0
- package/dist/web/assets/shellscript-CqHdAlCp.js +1 -0
- package/dist/web/assets/sql-CNu3Or2W.js +1 -0
- package/dist/web/assets/sql-CfM2IJm3.js +1 -0
- package/dist/web/assets/svelte-Bte6OA2r.js +1 -0
- package/dist/web/assets/swift-CyEgAFGc.js +1 -0
- package/dist/web/assets/terraform-DswuEJGm.js +1 -0
- package/dist/web/assets/toml-CcmNWLt0.js +1 -0
- package/dist/web/assets/tsx-BOvsFOI6.js +1 -0
- package/dist/web/assets/tsx-CGosfAUg.js +1 -0
- package/dist/web/assets/typescript-Bb1J8qyy.js +1 -0
- package/dist/web/assets/typescript-j_1H8WHN.js +1 -0
- package/dist/web/assets/vue-CcmjViMa.js +1 -0
- package/dist/web/assets/xml-Bvlx11yh.js +1 -0
- package/dist/web/assets/xml-Byfru430.js +1 -0
- package/dist/web/assets/yaml-DDA_XMNu.js +1 -0
- package/dist/web/assets/yaml-DijMHRDA.js +1 -0
- package/dist/web/assets/zig-CMLA9XwU.js +1 -0
- package/dist/web/index.html +13 -0
- 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,133 @@
|
|
|
1
|
-
#
|
|
1
|
+
# better-review
|
|
2
2
|
|
|
3
|
-
|
|
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 puis fichier suivant (Focus : fichier non
|
|
54
|
+
vu suivant), comme le bouton « Vu » d'un fichier · `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 (360 px, masquable avec `f`) propose trois vues. **La vue choisie fixe l'ordre des fichiers** :
|
|
65
|
+
le diff, `j`/`k`, le mode Focus et « Vu → fichier suivant » suivent l'ordre affiché (les filtres masquent des lignes
|
|
66
|
+
sans changer l'ordre).
|
|
67
|
+
|
|
68
|
+
| Vue | Ce qu'elle montre (et l'ordre qu'elle impose) |
|
|
69
|
+
| ----- | -------------------------------------------------------------------------------------------------------------- |
|
|
70
|
+
| Liste | Fichiers par chemin, groupés par dossier (A→Z), ou du plus gros au plus petit (Taille) ; barre +/− par fichier |
|
|
71
|
+
| Arbre | Dossiers repliables (sous-dossiers avant fichiers, A→Z ou Taille) avec changements, fichiers vus, threads |
|
|
72
|
+
| Liens | Fichiers en ordre de lecture « base d'abord », nombre d'imports / d'utilisateurs, graphe plein écran |
|
|
73
|
+
|
|
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.
|
|
78
|
+
|
|
79
|
+
**Ordre « base d'abord »** (vue Liens) : ordre topologique, chaque fichier après ceux qu'il importe ou mentionne, les
|
|
80
|
+
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
|
|
81
|
+
ses fondations vers ce qui les assemble.
|
|
82
|
+
|
|
83
|
+
**Voisinage** (onglet du panneau de droite, 520 px, quelle que soit la vue de gauche) : graphe du fichier courant, ce
|
|
84
|
+
qu'il utilise → fichier → ce qui l'utilise, avec tous ses voisins ; clic sur un voisin pour l'ouvrir.
|
|
85
|
+
|
|
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
|
|
88
|
+
hiérarchique : packages du plus utilisé au plus dépendant (dépendances déclarées entre packages du workspace, y
|
|
89
|
+
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
|
|
92
|
+
vue Liens groupe les fichiers par package et le graphe plein écran les encadre ; il affiche aussi les autres packages du
|
|
93
|
+
monorepo et les dépendances entre packages (option « Autres packages du monorepo ») : en couleur uniquement les
|
|
94
|
+
packages qui contiennent des fichiers modifiés (et les liens entre eux), le reste en gris. Le graphe de voisinage
|
|
95
|
+
mélange fichiers et packages : à gauche les packages que le fichier importe par leur nom, à droite les packages qui
|
|
96
|
+
dépendent de son package (quand aucun de leurs fichiers n'y figure déjà), mêmes couleurs ; un voisin d'un autre package
|
|
97
|
+
porte le nom de son package, et un clic sur un package modifié ouvre son premier fichier dans l'ordre courant.
|
|
98
|
+
|
|
99
|
+
La description de la PR s'ouvre dans l'onglet « Description » du panneau de droite.
|
|
100
|
+
|
|
101
|
+
## Architecture
|
|
102
|
+
|
|
103
|
+
```
|
|
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)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
- Les diffs sont demandés entre deux SHA (immuables) et mis en cache définitivement.
|
|
111
|
+
- L'inbox fait une recherche « ids seulement » par section puis charge chaque PR une seule fois
|
|
112
|
+
(≈ 1 point de quota GraphQL par PR).
|
|
113
|
+
- Une PR ouverte est surveillée toutes les 30 s, l'inbox toutes les 2 min ; un changement côté GitHub
|
|
114
|
+
rafraîchit l'écran sans rechargement.
|
|
115
|
+
|
|
116
|
+
## Développement
|
|
117
|
+
|
|
118
|
+
```sh
|
|
119
|
+
pnpm lint && pnpm typecheck && pnpm test
|
|
120
|
+
pnpm format
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Publier sur npm
|
|
124
|
+
|
|
125
|
+
```sh
|
|
126
|
+
cd apps/cli
|
|
127
|
+
npm version <patch|minor|major> --no-git-tag-version # version du paquet publié
|
|
128
|
+
pnpm pack # inspecter l'archive (facultatif)
|
|
129
|
+
pnpm publish # prepack : build complet + README / LICENSE
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
`pnpm publish` exige un arbre git propre sur `main` : committer le changement de version avant. Seul `typescript`
|
|
133
|
+
reste une dépendance d'exécution (analyse des liens) ; le reste est inclus dans `dist/cli.js`.
|