Contribuer
Setup développement
sh
git clone https://github.com/runeya/runeya.git
cd runeya
yarn install
yarn build
yarn devL'interface est disponible sur http://localhost:5173, le serveur sur http://localhost:9545.
Commandes essentielles
sh
# Build complet (turbo, en dépendances)
yarn build
# Tests
yarn test
yarn workspace @runeya/apps-agent vitest run
# Lint
yarn lint
# Valider les conventions monorepo
yarn check-monorepo
# Index du codebase (pour naviguer)
node scripts/index-codebase.mjs | grep -i "keyword"Ajouter un champ à ServiceConfig
Ordre obligatoire (ne pas sauter d'étape) :
packages/shared/src/schemas/service.schema.ts— ajouter le champ Zodyarn workspace @runeya/packages-shared build— obligatoire avant toute autre étapeapps/server/src/trpc/routers/service.ts— deux schémas inline :createetupdateapps/server/src/services/service-store.ts—create()etupdate()spreadsapps/web/src/components/service/ServiceConfigGeneral.vue— form ref, watch, save, template
Conventions de code
Imports ESM
typescript
// ✅ Toujours l'extension .js (même pour des fichiers .ts)
import { foo } from './foo.js'
// ❌ Sans extension
import { foo } from './foo'tRPC subscriptions
typescript
// ✅ Async generator (tRPC v11)
myProcedure: protectedProcedure.subscription(async function* ({ ctx }) {
for await (const event of ctx.emitter) {
yield event
}
})Sécurité
- Toutes les routes →
protectedProcedure(saufhealth.check) - Schémas Zod :
.max()sur tous les strings et arrays - Jamais
...process.env→buildSafeEnv()à la place decryptValue()throw sur erreur, ne retourne jamais le ciphertext
Vue 3 — Réactivité
typescript
// ✅ Remplacer les arrays ref (ne jamais muter en place)
items.value = [...items.value, newItem]
// ❌ Mutation en place
items.value.push(newItem)Git hooks
Husky + lint-staged s'exécutent au git commit :
eslint --fixsur les fichiers.ts/.tsx/.js/.jsxstagés
Tests
- Vitest pour tous les packages
- Pattern singletons :
vi.resetModules()+vi.doMock()+ import dynamique - Ne jamais marquer un test flaky comme "à ignorer" sans autorisation
Tests image support
Les tests du feature image support sont dans apps/server/src/__tests__/ :
| Fichier | Périmètre |
|---|---|
image-storage.test.ts | ImageStorageService — save, retrieve, delete, TTL, path traversal |
image-storage-extra.test.ts | Cas limites : doublons, écritures concurrentes |
image-cleanup.test.ts | ImageCleanupService — TTL, start/stop, comptage erreurs |
message-images.test.ts | extractImagesFromMessage, resolveImagesToBase64 |
message-images-extra.test.ts | Cas limites de résolution batch |
runner-images.test.ts | Format stdin Claude Code (Anthropic) et Codex (OpenAI) |
bash
yarn workspace @runeya/apps-server vitest run \
src/__tests__/image-storage.test.ts \
src/__tests__/image-cleanup.test.ts \
src/__tests__/message-images.test.ts \
src/__tests__/runner-images.test.tsSchémas partagés :
bash
yarn workspace @runeya/packages-shared vitest run src/__tests__/image.schema.test.tsPR checklist
- [ ]
yarn buildpasse sans erreurs - [ ]
yarn testpasse - [ ]
yarn lintpasse - [ ]
yarn check-monorepopasse - [ ] Nouveaux champs ServiceConfig : toutes les 5 étapes faites
- [ ] Pas de
console.debugen production - [ ] Secrets jamais en clair dans les logs
- [ ] Pas de
shell: truenon justifié