Skip to content

Commit d83f776

Browse files
committed
Merge branch 'dev': README capability matrix enriched + Why-This-Fork propagated to 21 locales
2 parents 35ee1a5 + c6e30e6 commit d83f776

239 files changed

Lines changed: 29772 additions & 138097 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.eslintrc.restrict.cjs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* Minimal security-oriented ESLint config.
3+
*
4+
* Scope: forbid `innerHTML =` / JSX `innerHTML={...}` assignments outside the
5+
* handful of vetted call sites that use Shiki-rendered HTML or icon-lookup
6+
* SVG strings (all trust-bounded inputs).
7+
*
8+
* Status: the monorepo does not currently run ESLint in CI. This file exists
9+
* so a future `bun run lint` / editor integration picks up the rule, and as
10+
* living documentation of which `innerHTML` usages are auditor-approved.
11+
*
12+
* Vetted call sites (grep-friendly — do not remove without re-auditing):
13+
* - packages/ui/src/components/markdown.tsx:95 // svg.innerHTML = <fixed icon path>
14+
* - packages/ui/src/components/markdown.tsx:320 // container.innerHTML = "" (clear)
15+
* - packages/ui/src/components/markdown.tsx:329 // temp.innerHTML = <Shiki-sanitized HTML>
16+
* - packages/ui/src/pierre/file-find.ts:137 // el.innerHTML = "" (clear)
17+
* - packages/ui/src/components/file.tsx:480 // viewer container reset
18+
* - packages/app/src/components/file-tree.tsx:99 // drag image from DOM outerHTML
19+
* - packages/app/src/components/prompt-input.tsx:487 // editorRef.innerHTML = "" (clear)
20+
* - packages/web/src/components/share/content-bash.tsx:51-52 // Shiki-rendered HTML (SolidJS innerHTML={…})
21+
*
22+
* New usages must be justified in a PR-level review and allow-listed with an
23+
* inline `// eslint-disable-next-line no-restricted-syntax -- <reason>` comment.
24+
*/
25+
module.exports = {
26+
rules: {
27+
"no-restricted-syntax": [
28+
"error",
29+
{
30+
selector:
31+
"AssignmentExpression[left.type='MemberExpression'][left.property.name='innerHTML']",
32+
message:
33+
"Assigning to innerHTML can introduce XSS. Use textContent or sanitize via DOMPurify. If the input is provably safe (Shiki, icon lookup), add an `// eslint-disable-next-line no-restricted-syntax -- <reason>` comment with justification.",
34+
},
35+
{
36+
selector:
37+
"JSXAttribute[name.name='innerHTML']",
38+
message:
39+
"SolidJS innerHTML={…} bypasses escaping. Use textContent or sanitize via DOMPurify, or add an `// eslint-disable-next-line no-restricted-syntax -- <reason>` justification.",
40+
},
41+
],
42+
},
43+
}

.github/DEPENDABOT_TRIAGE.md

Lines changed: 288 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
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

Comments
 (0)