|
| 1 | +# Dependabot — First-Batch Triage Guide |
| 2 | + |
| 3 | +> Cible : triage du premier batch Dependabot sur `Rwanbt/opencode` |
| 4 | +> (probablement 20–50 PRs — monorepo npm/Bun + 3 `Cargo.toml` Rust |
| 5 | +> + GitHub Actions). À exécuter dans la demi-journée qui suit |
| 6 | +> l'activation de `.github/dependabot.yml`. |
| 7 | +
|
| 8 | +--- |
| 9 | + |
| 10 | +## 0. Pré-requis |
| 11 | + |
| 12 | +- `gh auth status` : authentifié, scope `repo` + `workflow`. |
| 13 | +- Branche locale `dev` synchronisée. |
| 14 | +- CI verte sur `dev` (baseline avant merge batch Dependabot). |
| 15 | +- `bun install --frozen-lockfile` et `cargo check --workspace` passent |
| 16 | + sur `dev`. |
| 17 | + |
| 18 | +--- |
| 19 | + |
| 20 | +## 1. Ordre de traitement — priorité |
| 21 | + |
| 22 | +Traiter les PRs dans cet ordre strict : |
| 23 | + |
| 24 | +1. **Security advisories** — PRs labellisées `security` ou référençant |
| 25 | + un GHSA/CVE dans le titre. Mergeables en premier, sans exception. |
| 26 | +2. **Major version bumps** (semver-major) — à traiter un par un, jamais |
| 27 | + en lot. Requiert review manuelle (breaking-change hotspots §3). |
| 28 | +3. **GitHub Actions bumps** — faible risque (workflow-only), mergeables |
| 29 | + rapidement après vérification que les inputs n'ont pas changé. |
| 30 | +4. **Minor version bumps** — regroupables par écosystème. |
| 31 | +5. **Patch version bumps** — auto-merge si les checks sont verts (voir |
| 32 | + §2). |
| 33 | + |
| 34 | +--- |
| 35 | + |
| 36 | +## 2. Règles d'auto-merge recommandées |
| 37 | + |
| 38 | +À activer via `gh pr merge --auto --squash` ou via branch-protection |
| 39 | +"auto-merge on green". |
| 40 | + |
| 41 | +| Catégorie | Auto-merge ? | Justification | |
| 42 | +|-----------|--------------|----------------| |
| 43 | +| `@types/*` patch & minor | Oui | Types only, no runtime impact | |
| 44 | +| Linters (`eslint*`, `@typescript-eslint/*`) patch | Oui | Rule changes only | |
| 45 | +| Formatters (`prettier`, `dprint`) patch | Oui | Cosmetic | |
| 46 | +| `actions/*` official actions minor & patch | Oui | GitHub-maintained | |
| 47 | +| `slsa-framework/*` patch | Oui | Reusable workflow | |
| 48 | +| Tout bump non listé en §3 hotspots, patch, tests verts | Oui | Faible risque | |
| 49 | +| Majors (tout paquet) | **Non** | Review manuelle obligatoire | |
| 50 | +| Hotspots §3 (tout niveau) | **Non** | Review manuelle obligatoire | |
| 51 | + |
| 52 | +Exemple de règle de branch protection (GitHub UI → Settings → Rules) : |
| 53 | + |
| 54 | +- "Require status checks to pass before merging" ON : `test`, |
| 55 | + `typecheck`, `codeql`, `android`. |
| 56 | +- "Allow auto-merge" ON. |
| 57 | + |
| 58 | +--- |
| 59 | + |
| 60 | +## 3. Groupes à reviewer manuellement (hotspots) |
| 61 | + |
| 62 | +Toute PR qui touche l'un des paquets ci-dessous — **quel que soit le |
| 63 | +niveau semver** — doit être reviewée par un humain avant merge. |
| 64 | + |
| 65 | +### AI SDK |
| 66 | + |
| 67 | +- `ai` |
| 68 | +- `@ai-sdk/*` (tous les sous-paquets : `@ai-sdk/openai`, |
| 69 | + `@ai-sdk/anthropic`, `@ai-sdk/google`, etc.) |
| 70 | +- `@anthropic-ai/sdk` |
| 71 | +- `openai` |
| 72 | + |
| 73 | +**Pourquoi** : le pipeline `streamText` dans `packages/opencode/src/session/llm.ts` |
| 74 | +et `packages/opencode/src/provider/fallback.ts` dépend de la forme exacte |
| 75 | +des chunks `LanguageModelV3` (`text-delta`, `reasoning-delta`, |
| 76 | +`tool-input-*`, `finish`). Un bump mineur peut introduire un nouveau |
| 77 | +type de chunk et casser silencieusement le détecteur pre/mid stream |
| 78 | +de `withStreamingFallback`. |
| 79 | + |
| 80 | +**Checklist review** : |
| 81 | + |
| 82 | +- [ ] Lire le CHANGELOG du paquet. |
| 83 | +- [ ] Vérifier que les types `LanguageModelV3` / `LanguageModelV2` sont |
| 84 | + inchangés (ou adapter `fallback.ts` si nouveau chunk kind). |
| 85 | +- [ ] Exécuter `bun test test/provider/` localement. |
| 86 | +- [ ] Valider manuellement un streaming Anthropic + OpenAI. |
| 87 | + |
| 88 | +### Tauri |
| 89 | + |
| 90 | +- `@tauri-apps/api` |
| 91 | +- `@tauri-apps/cli` |
| 92 | +- `@tauri-apps/plugin-*` |
| 93 | +- crate Rust : `tauri`, `tauri-build`, `tauri-plugin-*` |
| 94 | + |
| 95 | +**Pourquoi** : un bump Tauri impacte `packages/desktop/src-tauri/` et |
| 96 | +`packages/mobile/src-tauri/` (Android). Les breaking-change historiques |
| 97 | +Tauri 1→2 ont cassé la config `tauri.conf.json`, l'IPC, les plugins. |
| 98 | + |
| 99 | +**Checklist review** : |
| 100 | + |
| 101 | +- [ ] Lire les migration guides Tauri. |
| 102 | +- [ ] `cargo check --release` sur desktop et mobile. |
| 103 | +- [ ] Vérifier `tauri.conf.json` plugins (deep-link notamment, voir |
| 104 | + memory `reference_tauri_deeplink_2_4_8_config.md`). |
| 105 | +- [ ] QA mobile physique si touche au cycle Android (voir |
| 106 | + `QA_ANDROID_DEVICES.md`). |
| 107 | + |
| 108 | +### Effect |
| 109 | + |
| 110 | +- `effect` |
| 111 | +- `@effect/*` |
| 112 | + |
| 113 | +**Pourquoi** : le runtime OpenCode repose sur Effect (`Layer`, `Service`, |
| 114 | +`Effect.gen`). Les bumps majors Effect ont historiquement modifié les |
| 115 | +signatures de `Effect.runPromise`, `Layer.effect`, et les `Context.Tag`. |
| 116 | + |
| 117 | +**Checklist review** : |
| 118 | + |
| 119 | +- [ ] `bun run typecheck` dans chaque package. |
| 120 | +- [ ] Grep les usages de `@effect/schema`, `Effect.tryPromise`, |
| 121 | + `Layer.effect` — vérifier compatibilité. |
| 122 | + |
| 123 | +### Drizzle |
| 124 | + |
| 125 | +- `drizzle-orm` |
| 126 | +- `drizzle-kit` |
| 127 | + |
| 128 | +**Pourquoi** : migrations SQLite + schéma `audit_log`, `session`, |
| 129 | +`message`. Un bump mineur peut casser le runtime ou nécessiter une |
| 130 | +migration. |
| 131 | + |
| 132 | +**Checklist review** : |
| 133 | + |
| 134 | +- [ ] Lire le CHANGELOG. |
| 135 | +- [ ] `bun run drizzle-kit check` (si commande disponible). |
| 136 | +- [ ] Vérifier que les migrations existantes sous |
| 137 | + `packages/opencode/migration/` se ré-appliquent sans erreur |
| 138 | + (DB from scratch). |
| 139 | + |
| 140 | +### Zod |
| 141 | + |
| 142 | +- `zod` |
| 143 | + |
| 144 | +**Pourquoi** : usage massif dans `packages/opencode/src/config/config.ts` |
| 145 | +et routes Hono. Un bump major (Zod 3 → 4) change l'API `.parse`, |
| 146 | +`.safeParse`, les error messages et les methods chainables. |
| 147 | + |
| 148 | +### Autres paquets sensibles |
| 149 | + |
| 150 | +- `hono` (serveur REST) — les bumps majors changent les middlewares. |
| 151 | +- `@hono/*` — idem. |
| 152 | +- `keyring` (crate Rust) — `packages/desktop/src-tauri/` keychain. |
| 153 | +- `better-sqlite3` / bindings natifs — ABI Bun. |
| 154 | +- `tokio` / `serde` / `serde_json` — crates Rust transverses. |
| 155 | + |
| 156 | +--- |
| 157 | + |
| 158 | +## 4. Breaking-change hotspots — surveillance |
| 159 | + |
| 160 | +Les bumps majors suivants nécessitent une PR dédiée, pas un merge |
| 161 | +Dependabot : |
| 162 | + |
| 163 | +- **Tauri 2 → 3** (quand sort) — refactor `tauri.conf.json` probable, |
| 164 | + re-générer `packages/mobile/src-tauri/gen/android/`. |
| 165 | +- **Effect 3 → 4** (si prévu) — audit tout usage `Layer`, `Context`, |
| 166 | + `Service`. |
| 167 | +- **Zod 3 → 4** — breakage API connu (`z.enum`, refinements). |
| 168 | +- **Drizzle ORM — bump schema version** — peut requérir une migration |
| 169 | + de schéma. |
| 170 | +- **`ai` SDK major** — chunks streaming typés strictement dans |
| 171 | + `fallback.ts`. |
| 172 | +- **`hono` 5 → 6** — middleware chain signature. |
| 173 | +- **Bun runtime bumps** (via `.tool-versions` ou CI image) — vérifier |
| 174 | + la compat `Bun.serve`, `Bun.file`, `Bun.spawn`. |
| 175 | + |
| 176 | +--- |
| 177 | + |
| 178 | +## 5. Procédure step-by-step |
| 179 | + |
| 180 | +### 5.1 Inventaire du batch |
| 181 | + |
| 182 | +```bash |
| 183 | +gh pr list --label dependencies --state open --limit 100 \ |
| 184 | + --json number,title,labels,author \ |
| 185 | + --jq '.[] | "\(.number) \(.title)"' |
| 186 | +``` |
| 187 | + |
| 188 | +Sauvegarder la sortie dans un gist ou un scratch file. |
| 189 | + |
| 190 | +### 5.2 Séparer par écosystème |
| 191 | + |
| 192 | +```bash |
| 193 | +gh pr list --label dependencies --label npm --state open |
| 194 | +gh pr list --label dependencies --label cargo --state open |
| 195 | +gh pr list --label dependencies --label github-actions --state open |
| 196 | +``` |
| 197 | + |
| 198 | +### 5.3 Traiter les security alerts en priorité |
| 199 | + |
| 200 | +```bash |
| 201 | +gh pr list --label dependencies --label security --state open |
| 202 | +# Pour chaque PR : |
| 203 | +gh pr checks <num> |
| 204 | +gh pr view <num> |
| 205 | +gh pr merge <num> --squash |
| 206 | +``` |
| 207 | + |
| 208 | +### 5.4 Auto-merge les patch + types + linters |
| 209 | + |
| 210 | +Exemple pour activer l'auto-merge sur les patch `@types/*` : |
| 211 | + |
| 212 | +```bash |
| 213 | +# 1. List |
| 214 | +gh pr list --label dependencies --search '@types/ in:title' --state open \ |
| 215 | + --json number --jq '.[].number' |
| 216 | + |
| 217 | +# 2. Auto-merge (nécessite branch protection "allow auto-merge" actif) |
| 218 | +for n in <liste>; do |
| 219 | + gh pr merge "$n" --auto --squash |
| 220 | +done |
| 221 | +``` |
| 222 | + |
| 223 | +### 5.5 Reviewer manuellement les hotspots |
| 224 | + |
| 225 | +Pour chaque PR dans §3 : |
| 226 | + |
| 227 | +```bash |
| 228 | +gh pr view <num> --comments |
| 229 | +gh pr diff <num> |
| 230 | +gh pr checkout <num> |
| 231 | +bun install |
| 232 | +bun run typecheck |
| 233 | +bun test <suite touchée> |
| 234 | +# si OK : |
| 235 | +gh pr merge <num> --squash |
| 236 | +# sinon : |
| 237 | +gh pr comment <num> --body "Needs rebase / incompatible with ..." |
| 238 | +gh pr close <num> # si majeur non souhaité |
| 239 | +``` |
| 240 | + |
| 241 | +### 5.6 Grouper les bumps mineurs même écosystème |
| 242 | + |
| 243 | +Si Dependabot n'a pas déjà groupé (config `groups:` dans |
| 244 | +`dependabot.yml`), utiliser des combined PRs : |
| 245 | + |
| 246 | +```bash |
| 247 | +# Créer une branche qui cherry-pick plusieurs bumps |
| 248 | +git checkout -b dependabot/combined-minor-2026-04 |
| 249 | +for sha in <shas>; do git cherry-pick "$sha"; done |
| 250 | +gh pr create --title "chore(deps): minor bump batch" --body "..." |
| 251 | +``` |
| 252 | + |
| 253 | +--- |
| 254 | + |
| 255 | +## 6. Commandes utiles |
| 256 | + |
| 257 | +```bash |
| 258 | +# Liste complète PRs dependencies |
| 259 | +gh pr list --label dependencies --state open --limit 200 |
| 260 | + |
| 261 | +# Filtrage par écosystème |
| 262 | +gh pr list --label dependencies --search 'in:title npm' |
| 263 | +gh pr list --label dependencies --search 'in:title cargo' |
| 264 | + |
| 265 | +# Checks status |
| 266 | +gh pr checks <num> |
| 267 | + |
| 268 | +# Auto-merge batch |
| 269 | +gh pr merge <num> --auto --squash |
| 270 | + |
| 271 | +# Fermer sans merger (refus d'un major) |
| 272 | +gh pr close <num> --comment "Breaking change — pinned to vX.Y until dedicated PR" |
| 273 | + |
| 274 | +# Re-pin une version dans dependabot.yml pour ignorer un bump |
| 275 | +# (éditer .github/dependabot.yml → ignore: [{dependency-name: "...", versions: [...]}]) |
| 276 | +``` |
| 277 | + |
| 278 | +--- |
| 279 | + |
| 280 | +## 7. Après le triage |
| 281 | + |
| 282 | +- Vérifier que `bun.lock` et `Cargo.lock` sont à jour sur `dev`. |
| 283 | +- Relancer `CodeQL` + `SBOM` + `test.yml` sur `dev` une fois le batch |
| 284 | + absorbé. |
| 285 | +- Mettre à jour `PROD_READINESS.md` : cocher "Dependabot first batch |
| 286 | + triaged". |
| 287 | +- Planifier la review hebdomadaire (mardi matin) des nouveaux bumps |
| 288 | + Dependabot récurrents. |
0 commit comments