Compatibilité

ulk est un driver d’IA : les mêmes agents et skills se pilotent depuis plusieurs harnais. Le format Claude est le format pivot — on n’écrit pas un format par outil, on traduit depuis Claude vers les autres, comme opencode le fait lui-même en lisant .claude/skills/. Arbitrage #639, mesure à l’appui : la spec 2026-08-23-spec-opencode-portabilite (ulk#641).

Matrice de compatibilité

Cible État Distribution Ce qui marche
Claude Code natif (recommandé) ulk install~/.claude/ tout : agents, skills, commandes, hooks
opencode supporté ulk install~/.claude/, lu nativement par opencode agents, skills, règles — commandes et hooks non portés
Cursor adaptateur génération ciblée (generate-commands.cjs --target=cursor) commandes ; le reste non mesuré

Ce qu’opencode lit nativement

opencode implémente une couche de compatibilité Claude Code documentée :

  • CLAUDE.md (projet et global) en repli de AGENTS.md ;
  • .claude/skills/<nom>/SKILL.md et ~/.claude/skills/<nom>/SKILL.md ;
  • les règles et skills s’appliquent telles quelles.

Conséquence mesurée (spec #641) : les agents et les skills d’ulk fonctionnent sous opencode sans modification. Trois clés du frontmatter sont ignorées par opencode, pas rejetées : allowed-tools, disable-model-invocation, context — dégradation silencieuse, pas panne.

Ce qui ne se porte pas

Surface Pourquoi
Commandes (/ulk:cat:nom) opencode attend des commandes plates /nom — l’adaptateur existe en gabarit
Hooks pas de hooks chez opencode : des plugins JS/TS — un second runtime à maintenir
MCP traduction de .mcp.json vers le bloc mcp d’opencode

Les hooks — ce qu’un utilisateur opencode perd

Les hooks d’ulk sont Claude-only, et c’est un choix d’arbitrage : un hook ulk est un JSON + un script shell, un plugin opencode est un module JS/TS avec son propre runtime. Les porter reviendrait à maintenir un second runtime, avec sa propre dérive et son propre gate.

À lire avant d’installer, pas après :

Événement Claude Code Équivalent opencode Verdict
PreToolUse tool.execute.before non porté
PostToolUse tool.execute.after non porté
Stop session.idle non porté
SessionStart session.created non porté
SessionEnd non porté

Garde-fous perdus sous opencode : sentinel, rtk, review-gate, handoff, memory-loop, auto-dream, et les hooks de session (update-check, context-mode, concierge-session-check…). Sous Claude Code, tout est en place.

Modèles

La matrice ci-dessus couvre l’axe harnais. L’axe modèle — faire tourner ulk sur GPT, Gemini ou un modèle local — est une question distincte : le frontmatter impose un tier de modèle, chaque harnais le résout à sa manière. Suivi séparément (issue #644).