feat: migrate to OpenCode 2 (@opencode/cli 2.0.32) #75

Merged
jcabillot merged 1 commits from feat/opencode-v2 into main 2026-10-17 15:38:15 -04:00
Owner

Objectif

Migrer l'image vers OpenCode 2 dans le Dockerfile.

Changements

  • Dockerfile : opencode-ai@1.19.0 → @opencode/cli@2.0.32 (paquet npm publié pour OpenCode 2 ; opencode-ai s'arrête à 1.19.3). Même base node:26-trixie, mêmes n2-soul/better-sqlite3/kubectl. L'ENTRYPOINT reste ["opencode"] volontairement : les déploiements existants passent serve ... au runtime et l'invocation ne change pas.
  • renovate.json : le custom manager suit désormais @opencode/cli (sinon le pin n'est plus jamais bumpé).
  • opencode-attach : opencode attach n'existe plus en v2 → le wrapper pointe le client avec --server <url> (placé après la sous-commande quand il y en a une). L'auth reste portée par OPENCODE_SERVER_PASSWORD / OPENCODE_PASSWORD.
  • README / AGENTS.md : nom du paquet v2, entrypoint, défauts de serve, surface API v2 (/global/health disparu, tout est sous /api/* authentifié), et suppression de OPENCODE_SERVER_USERNAME (le username est toujours opencode en v2).

Vérifications réelles (binaire v2.0.32 + image construite)

Build local de l'image (podman, même Dockerfile que la CI) :

Test Résultat
docker build (install @opencode/cli@2.0.32 sur node:26-trixie) OK
opencode --version dans l'image opencode v2.0.32
opencode serve --hostname 0.0.0.0 server listening on http://0.0.0.0:4096
GET /api/info sans credential 401
GET /api/info avec opencode:testpass123 200 ({"version":"2.0.32",...})
Web UI GET / 200
opencode-attach session list --format json (bon mdp) []
opencode-attach (mauvais mdp) Server ... rejected the password
opencode-attach sans argument TUI v2 attachée au serveur distant
serve sans OPENCODE_SERVER_PASSWORD mot de passe généré et loggé (serveur jamais sans auth)
hadolint Dockerfile aucune erreur

Points d'attention hors périmètre

  • L'API REST v1 est remplacée par v2 : perso/opencode-dispatch (bot.py) appelle /session, /global/health, etc. Il devra être migré séparément — je peux m'en occuper dans une PR dédiée.
  • opencode-openchamber fait FROM jcabillot/opencode et installe via apt : la base reste Debian (node:26-trixie), donc rien à changer de ce côté.

Docs

## Objectif Migrer l'image vers OpenCode 2 dans le Dockerfile. ## Changements - **Dockerfile** : `opencode-ai@1.19.0` → `@opencode/cli@2.0.32` (paquet npm publié pour OpenCode 2 ; `opencode-ai` s'arrête à 1.19.3). Même base `node:26-trixie`, mêmes `n2-soul`/`better-sqlite3`/`kubectl`. L'ENTRYPOINT reste `["opencode"]` volontairement : les déploiements existants passent `serve ...` au runtime et l'invocation ne change pas. - **renovate.json** : le custom manager suit désormais `@opencode/cli` (sinon le pin n'est plus jamais bumpé). - **opencode-attach** : `opencode attach` n'existe plus en v2 → le wrapper pointe le client avec `--server <url>` (placé après la sous-commande quand il y en a une). L'auth reste portée par `OPENCODE_SERVER_PASSWORD` / `OPENCODE_PASSWORD`. - **README / AGENTS.md** : nom du paquet v2, entrypoint, défauts de `serve`, surface API v2 (`/global/health` disparu, tout est sous `/api/*` authentifié), et suppression de `OPENCODE_SERVER_USERNAME` (le username est toujours `opencode` en v2). ## Vérifications réelles (binaire v2.0.32 + image construite) Build local de l'image (podman, même Dockerfile que la CI) : | Test | Résultat | |------|----------| | `docker build` (install `@opencode/cli@2.0.32` sur node:26-trixie) | OK | | `opencode --version` dans l'image | `opencode v2.0.32` | | `opencode serve --hostname 0.0.0.0` | `server listening on http://0.0.0.0:4096` | | `GET /api/info` sans credential | `401` | | `GET /api/info` avec `opencode:testpass123` | `200` (`{"version":"2.0.32",...}`) | | Web UI `GET /` | `200` | | `opencode-attach session list --format json` (bon mdp) | `[]` | | `opencode-attach` (mauvais mdp) | `Server ... rejected the password` | | `opencode-attach` sans argument | TUI v2 attachée au serveur distant | | `serve` sans `OPENCODE_SERVER_PASSWORD` | mot de passe généré et loggé (serveur jamais sans auth) | | `hadolint Dockerfile` | aucune erreur | ## Points d'attention hors périmètre - L'API REST v1 est remplacée par v2 : `perso/opencode-dispatch` (`bot.py`) appelle `/session`, `/global/health`, etc. Il devra être migré séparément — je peux m'en occuper dans une PR dédiée. - `opencode-openchamber` fait `FROM jcabillot/opencode` et installe via `apt` : la base reste Debian (`node:26-trixie`), donc rien à changer de ce côté. ## Docs - https://opencode.ai/v2/docs/ - https://opencode.ai/v2/docs/migrate-v1/
jcabillot was assigned by opencodecabilloteu 2026-10-17 15:28:44 -04:00
opencodecabilloteu added 1 commit 2026-10-17 15:28:45 -04:00
feat: migrate to OpenCode 2
PR Checks / build-test (pull_request) Successful in 3m14s
PR Checks / hadolint (pull_request) Successful in 12s
c2c0a81547
OpenCode 2 publishes its CLI as @opencode/cli (opencode-ai stops at
1.19.x), so install that package and pin it to 2.0.32.

Also fix what the v2 migration invalidates:
- renovate.json: track @opencode/cli instead of opencode-ai, otherwise
  the pin is never bumped.
- opencode-attach: `opencode attach` no longer exists in v2. Point the
  client at the server with `--server <url>` instead (appended after a
  subcommand when one is given); auth still comes from
  OPENCODE_SERVER_PASSWORD / OPENCODE_PASSWORD.
- README/AGENTS: v2 package name, entrypoint, serve defaults, API
  surface (/global/health is gone, everything lives under authenticated
  /api/*), and removal of OPENCODE_SERVER_USERNAME (the username is
  always `opencode` in v2).

The entrypoint stays ["opencode"] on purpose: existing deployments pass
`serve ...` at runtime, and OpenCode 2 is invoked the same way.
opencodecabilloteu requested review from jcabillot 2026-10-17 15:28:45 -04:00
jcabillot merged commit 7ad5090715 into main 2026-10-17 15:38:15 -04:00
jcabillot deleted branch feat/opencode-v2 2026-10-17 15:38:21 -04:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: perso/opencode#75