Skip to content

Contribuer

Setup développement

sh
git clone https://github.com/runeya/runeya.git
cd runeya
yarn install
yarn build
yarn dev

L'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) :

  1. packages/shared/src/schemas/service.schema.ts — ajouter le champ Zod
  2. yarn workspace @runeya/packages-shared buildobligatoire avant toute autre étape
  3. apps/server/src/trpc/routers/service.ts — deux schémas inline : create et update
  4. apps/server/src/services/service-store.tscreate() et update() spreads
  5. apps/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 (sauf health.check)
  • Schémas Zod : .max() sur tous les strings et arrays
  • Jamais ...process.envbuildSafeEnv() à 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 --fix sur les fichiers .ts/.tsx/.js/.jsx stagé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__/ :

FichierPérimètre
image-storage.test.tsImageStorageService — save, retrieve, delete, TTL, path traversal
image-storage-extra.test.tsCas limites : doublons, écritures concurrentes
image-cleanup.test.tsImageCleanupService — TTL, start/stop, comptage erreurs
message-images.test.tsextractImagesFromMessage, resolveImagesToBase64
message-images-extra.test.tsCas limites de résolution batch
runner-images.test.tsFormat 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.ts

Schémas partagés :

bash
yarn workspace @runeya/packages-shared vitest run src/__tests__/image.schema.test.ts

PR checklist

  • [ ] yarn build passe sans erreurs
  • [ ] yarn test passe
  • [ ] yarn lint passe
  • [ ] yarn check-monorepo passe
  • [ ] Nouveaux champs ServiceConfig : toutes les 5 étapes faites
  • [ ] Pas de console.debug en production
  • [ ] Secrets jamais en clair dans les logs
  • [ ] Pas de shell: true non justifié

Publié sous licence MIT.