Ce fichier fournit des conseils à Claude Code lors du travail sur la codebase open-rcode.
open-rcode est une plateforme web containerisée qui permet aux développeurs d'exécuter des tâches de programmation assistées par IA dans des conteneurs isolés (Docker ou Kubernetes), créant automatiquement des Pull Requests GitHub. La plateforme est construite avec :
- Frontend : Nuxt 4 avec UI Pro
- Backend : API Nitro (Nuxt server)
- Base de données : MongoDB
- Orchestration : Docker et Kubernetes
- IA : Claude API, Claude Code OAuth, Gemini CLI
- User → Soumet une tâche via l'interface web
- TaskContainerManager → Crée un conteneur/pod isolé
- ClaudeExecutor → Exécute les commandes IA dans le conteneur
- PullRequestCreator → Commit les changements et crée une PR GitHub
- Cleanup → Nettoie automatiquement le conteneur après exécution
/
├── apps/
│ ├── docs/ # Documentation (projet séparé)
│ └── open-rcode/ # Application principale
│ ├── app/ # Frontend Nuxt
│ ├── server/ # Backend API
│ │ ├── api/ # Endpoints HTTP
│ │ ├── models/ # Modèles MongoDB
│ │ └── utils/ # Logique métier
│ └── shared/ # Types partagés
├── Image/ # Docker image du worker
└── docker-compose.yml # Configuration locale
# Navigation
cd apps/open-rcode # Aller dans l'application principale
# Développement
pnpm install # Installer les dépendances
pnpm dev # Démarrer le serveur de développement (http://localhost:3000)
pnpm build # Build de production
pnpm preview # Prévisualiser le build de production
# Qualité du code (TOUJOURS exécuter avant de créer une PR)
pnpm lint # Vérification ESLint
pnpm typecheck # Validation TypeScript
# Base de données locale
docker-compose up -d mongodb # Démarrer MongoDB localement
# Conteneurs
docker ps -f name=openrcode-task # Lister les conteneurs de tâches actifs
kubectl get pods -l openrcode.managed=true # Lister les pods Kubernetes- task-container.ts : Orchestrateur principal du workflow des tâches
- container-setup.ts : Configure les environnements de conteneurs avec les dépendances
- claude-executor.ts : Exécute les commandes Claude/Gemini avec streaming en temps réel
- pull-request-creator.ts : Gère les opérations Git et la création de PR GitHub
- repository-cloner.ts : Clone les repos avec authentification GitHub App
- container-manager-factory.ts : Factory pattern pour Docker/Kubernetes
- base-container-manager.ts : Interface abstraite pour les opérations
- docker-adapter.ts : Implémentation Docker via Dockerode
- kubernetes-adapter.ts : Implémentation Kubernetes via kubectl
- kubernetes/kubernetes-manager.ts : Opérations natives Kubernetes
// Task : Tâche d'exécution avec état
Task {
userId: string // ID GitHub de l'utilisateur
environmentId: string // Configuration de l'environnement
status: 'pending' | 'running' | 'completed' | 'failed'
dockerId?: string // ID du conteneur/pod
pr?: string // URL de la PR créée
planMode?: boolean // Mode plan activé
messages: Message[] // Historique (legacy)
}
// TaskMessage : Stockage principal des conversations
TaskMessage {
taskId: string // Référence à Task
role: 'user' | 'assistant'
content: string // Contenu du message
type?: string // Type spécial (pr_link, etc.)
}
// Environment : Configuration par repository
Environment {
repositoryFullName: string // Format owner/repo
runtime: 'node' | 'python' | 'php'
aiProvider: 'anthropic-api' | 'claude-oauth' | 'gemini-cli' | 'admin-gemini'
model: 'opus' | 'sonnet'
defaultBranch: string // Branche de base pour les PR
environmentVariables: [] // Variables d'environnement custom
configurationScript?: string // Script de setup pré-exécution
}
// User : Profil utilisateur avec clés API cryptées
User {
githubId: string
githubAppInstallationIds: string[] // IDs des installations GitHub App
anthropicKey?: string // Crypté avec ENCRYPTION_KEY
claudeOAuthToken?: string // Crypté
geminiApiKey?: string // Crypté
role: 'basic' | 'premium' | 'admin'
}La plateforme supporte plusieurs providers IA configurables par environnement :
- anthropic-api : Utilise la clé API Anthropic de l'utilisateur
- claude-oauth : Utilise le token OAuth Claude Code de l'utilisateur
- gemini-cli : Utilise la clé API Gemini de l'utilisateur
- admin-gemini : Utilise la clé Gemini admin du système (ADMIN_GOOGLE_API_KEY)
Le système utilise automatiquement Gemini Admin pour suggérer des titres de PR basés sur le git diff des modifications.
// IMPORTANT : Toujours sauvegarder dans les DEUX modèles
// Task.messages[] : Pour la compatibilité legacy
// TaskMessageModel : Stockage principal pour le threading- Active un workflow en deux phases pour Claude
- Phase 1 : Génération du plan avec ExitPlanMode
- Phase 2 : Exécution du plan généré
- Non supporté pour Gemini
- Les tool calls de Claude sont sauvegardés en temps réel pendant l'exécution
- Support du streaming pour Kubernetes via spawn process
- Timeout de 30 minutes pour les commandes longues
- Docker : Les conteneurs persistent après exécution (nettoyage manuel requis)
- Kubernetes : Auto-cleanup après l'exécution de la tâche
- Workspace unique par tâche :
/tmp/workspace-{timestamp}-{taskId}/
- OAuth pour l'authentification utilisateur
- GitHub Apps pour l'accès aux repositories
- Tokens d'installation générés dynamiquement par repo
# Base de données
DATABASE_URL=mongodb://localhost:27017/openrcode
# Mode conteneur
CONTAINER_MODE=docker # ou "kubernetes"
# GitHub (REQUIS)
GITHUB_APP_ID=123456
GITHUB_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----...
GITHUB_CLIENT_ID=Iv1.xxxxxxxxxxxx
GITHUB_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Sécurité (REQUIS)
ENCRYPTION_KEY=32_caracteres_exactement_requis!
# Kubernetes (si CONTAINER_MODE=kubernetes)
KUBERNETES_NAMESPACE=default # Optionnel
KUBECONFIG=/path/to/kubeconfig # Optionnel
KUBERNETES_CONTEXT=my-context # Optionnel
# Admin (optionnel)
ADMIN_GOOGLE_API_KEY=AIza... # Pour suggestions Gemini automatiques
BASE_ROLE=basic # Rôle par défaut des nouveaux users
# UI Pro (REQUIS pour le build)
NUXT_UI_PRO_LICENSE=xxxx-xxxx-xxxx-xxxx# Nettoyer les conteneurs de tâches
docker stop $(docker ps -q -f name=openrcode-task)
docker rm $(docker ps -aq -f name=openrcode-task)
docker system prune -f- Vérifier que l'image
ghcr.io/aidalinfo/open-rcoder-worker:latestest accessible - Vérifier les secrets d'image pull si registre privé
- Tester :
kubectl run test --image=ghcr.io/aidalinfo/open-rcoder-worker:latest
- Vérifier la validité du token OAuth/API key
- S'assurer que Claude Code est installé : visible dans entrypoint.sh
- Vérifier les variables d'environnement dans le conteneur
- Vérifier que les messages sont sauvés dans TaskMessageModel
- Ne pas se fier uniquement à Task.messages[] (legacy)
- Vérifier que la GitHub App est installée sur le repository
- Vérifier les permissions de l'installation
- S'assurer que l'utilisateur a au moins un githubAppInstallationId
// Utiliser defineEventHandler pour tous les endpoints
export default defineEventHandler(async (event) => {
// Authentification via session cookie
const sessionToken = getCookie(event, 'session')
// Validation et logique
// Retourner un objet JSON
})// Toujours utiliser createError de Nitro
throw createError({
statusCode: 404,
statusMessage: 'Resource not found'
})- Utiliser des index pour optimiser les requêtes fréquentes
- Toujours mettre à jour
updatedAtdans les pre-save hooks - Préférer les IDs string (githubId) aux ObjectId pour les références utilisateur
- Ne JAMAIS logger ou exposer les clés API
- Toujours crypter les données sensibles avec la fonction
encrypt() - Valider l'appartenance des ressources avant l'accès
- Utiliser des noms uniques :
openrcode-task-{taskId}-{timestamp} - Toujours taguer avec
openrcode.managed=truepour le tracking - Implémenter le cleanup automatique après exécution
- Avant toute modification : Lire le fichier existant avec Read
- Après les modifications : Exécuter
pnpm lintetpnpm typecheck - Pour les nouvelles features : Vérifier les patterns existants dans le code
- Pour les bugs : Chercher dans TaskMessageModel pour les erreurs
- Le dual storage des messages est CRITIQUE - toujours sauver dans les deux
- Les conteneurs Docker persistent, les pods Kubernetes sont auto-nettoyés
- L'authentification GitHub App est par installation, pas globale
- Le mode plan nécessite une gestion spéciale du workflow Claude
- Les workspaces sont uniques par tâche pour éviter les conflits
- Le streaming en temps réel nécessite des callbacks spéciaux
- Les timeouts sont de 30 minutes pour les commandes longues
- Gemini Admin est utilisé automatiquement pour les titres de PR
# Claude API/OAuth avec streaming JSON
claude --verbose --output-format stream-json --model sonnet -p "prompt"
# Claude en mode plan
claude --verbose --output-format stream-json --permission-mode plan --model sonnet -p "prompt"
# Gemini CLI (pas de streaming JSON)
gemini --model gemini-2.0-flash -p "prompt"- Les composants loggent avec des emojis pour faciliter le suivi
- 🐳 Docker / ☸️ Kubernetes / 🤖 Claude / 🚀 Execution
- Vérifier les logs des conteneurs pour les erreurs d'exécution
- MongoDB :
docker-compose logs mongodb - Conteneurs de tâches :
docker logs openrcode-task-* - Pods Kubernetes :
kubectl logs -l openrcode.managed=true - Application : Console du navigateur et logs serveur Nuxt