🇬🇧 English version
Contribuer Ă Orkeon
Avant tout, merci d'envisager de contribuer Ă Orkeon ! Ce sont des personnes comme vous qui font d'Orkeon un outil aussi formidable.
Code de conduite
Ce projet et toutes les personnes qui y participent sont régis par notre Code de conduite. En participant, vous vous engagez à le respecter.
Comment puis-je contribuer ?
Signaler des bugs
Avant de créer un rapport de bug, vérifiez les issues existantes : vous pourriez découvrir qu'il n'est pas nécessaire d'en créer un. Lorsque vous créez un rapport de bug, merci d'inclure autant de détails que possible :
- Utilisez un titre clair et descriptif
- Décrivez les étapes exactes qui reproduisent le problème
- Fournissez des exemples concrets pour illustrer les étapes
- Décrivez le comportement observé après avoir suivi les étapes
- Expliquez le comportement que vous attendiez Ă la place, et pourquoi
- Incluez des extraits de code et des stack traces le cas échéant
Proposer des améliorations
Les suggestions d'amélioration sont suivies via les issues GitHub. Lorsque vous créez une suggestion d'amélioration, merci d'inclure :
- Utilisez un titre clair et descriptif
- Fournissez une description pas à pas de l'amélioration proposée
- Fournissez des exemples concrets pour illustrer les étapes
- Décrivez le comportement actuel et expliquez le comportement que vous attendiez à la place
- Expliquez en quoi cette amélioration serait utile
Pull requests
- Forkez le dépôt et créez votre branche à partir de
main - Si vous avez ajouté du code qui devrait être testé, ajoutez des tests
- Si vous avez modifié des APIs, mettez à jour la documentation
- Assurez-vous que la suite de tests passe
- Vérifiez que votre code suit le style de code existant
- Soumettez cette pull request !
- Sur votre première pull request, acceptez l'accord de licence de contribution : une vérification poste la phrase à répondre, et reste rouge tant que ce n'est pas fait. Une fois par compte GitHub ; vous gardez votre droit d'auteur, le projet obtient une licence qu'il peut transmettre à une entité successeur. (Le texte est un gabarit en attente de relecture juridique — il le dit dès sa première ligne — et la vérification documente le processus voulu en attendant.)
Mise en place de l'environnement de développement
# Clone your fork
git clone https://github.com/your-username/orkeon.git
cd orkeon
# Add upstream remote
git remote add upstream https://github.com/Orkeon/orkeon.git
# Install dependencies
dotnet restore Orkeon.sln
# Build
dotnet build Orkeon.sln
# Run tests (the set CI runs)
dotnet test Orkeon.sln --filter "Category!=Integration&Category!=Slow"
Pourquoi ce filtre, et pas un
dotnet test Orkeon.slnnu :Category=Integrationcouvre les tests Testcontainers, qui exigent Docker et téléchargent des gigaoctets d'images de bases de données, etCategory=Slowporte la suite ONNX deOrkeon.Tools.Embeddings.Local, dont le runtime natif fait tomber le processus au teardown (code 139) après que tous les tests sont passés.ci.ymlexécute exactement la commande filtrée ci-dessus, puis lance cette suite ONNX dans une étape dédiée qui tolère cette seule forme de crash.
Note — ce dépôt déclare des sous-modules privés des mainteneurs : clonez sans
--recursive(comme ci-dessus). Le build, les tests et tout le flux de contribution s'en passent ; un échec degit submodule updatesur ces chemins est attendu et sans conséquence.
Le premier build touche le réseau une fois : la couche scripting provisionne une petite toolchain esbuild (
npm cisoustools/scripting-esbuild/, strictement depuis le lockfile commité). Pour l'éviter (CI, machines sans npm) :dotnet build Orkeon.sln -p:SkipScriptingNpmInstall=true— le build réussit quand même et esbuild est résolu depuis lePATHau runtime.
Les tests tournent sur Microsoft.Testing.Platform, activé par
global.json— le SDK .NET 10 refuse purement et simplement d'exécuter ces projets via VSTest. Les commandes courantes ne changent pas, mais deux choses mordent dès qu'on restreint une exécution : un--filterqui ne correspond à aucun test dans un module y est une erreur (code 8), pas un succès vide — une exécution sur toute la solution ne doit donc jamais exclure un projet par son nom ; et les options propres à VSTest (--collect,--logger,--blame) sont rejetées comme arguments inconnus.
Structure du projet
La solution compte 43 projets src répartis en 13 zones et 33 projets de tests.
Trente et un projets src ont un projet de tests miroir ; tests/e2e et tests/shared
forment les deux autres. Douze projets src n'ont volontairement pas de miroir : les cinq
satellites Orkeon.Constants.* et Orkeon.Rag.Onnx.Model ne portent que des constantes et
des ressources embarquées, Orkeon.Analysis.Abstractions est exercé via
Orkeon.Analysis.Tests, Orkeon.Generators est couvert par la compilation des projets qui
le consomment, et les quatre projets src/packaging/ sont de pur empaquetage :
src/
├── core/ # Orkeon.Domain, Orkeon.Application, Orkeon.Infrastructure (cœur Clean Architecture)
├── tools/ # 9 packs d'outils : Abstractions, Analysis (RaggableTree), Code, Data,
│ # Embeddings.Local, EventHub, FileSystem, Rag, Web
├── rag/ # Sous-système RAG : Rag.Abstractions, Rag, Rag.Onnx, Rag.Onnx.Model
├── analysis/ # Moteur RaggableTree : Analysis.Abstractions, Analysis
├── scripting/ # Orkeon.Scripting (DSL .ork.ts) + Orkeon.Scripting.Cli (le tool `orkeon`)
├── cli/ # Cli.Abstractions, Cli, Cli.Commands.Scripting, Cli.TerminalGui
├── constants/ # Satellites sans dependance de constantes PARTAGEES (ADR-009) :
│ # Constants.Llm, Constants.FileSystem, Constants.Configuration, Constants.Protocol, Constants.Cli
├── hosting/ # Orkeon.Hosting (RunnerHost) + Orkeon.Host (le daemon `orkeon-host`)
├── plugins/ # Orkeon.Plugins (chargement de plugins au runtime)
├── generators/ # Orkeon.Generators (générateurs de source)
├── analyzers/ # Orkeon.Compliance.Vfs (analyseur Roslyn VFS-only)
├── packaging/ # Projets d'empaquetage NuGet (PUB-25) : Orkeon (le framework en un nupkg), Orkeon.Tools,
│ # + les wrappers Rag.Onnx / Tools.Embeddings.Local dépendant de l'ombrelle Orkeon
└── apps/ # Orkeon.ConsoleApp (orkeon-repl) + Orkeon.Studio.{Config,Core,Run,Wpf}
examples/ # 105 exemples embarqués (9 catégories + vitrines) — solution dédiée
docs/ # Documentation, EN + miroir docs/fr (gate de parité CI)
L'arborescence annotée complète vit dans docs/fr/getting-started/overview.md.
Standards de codage
Guide de style C#
- Utilisez le PascalCase pour les membres publics
- Utilisez le camelCase pour les champs privés
- Préfixez les interfaces par « I »
- Utilisez des noms de variables significatifs
- Gardez des méthodes courtes et focalisées
- Utilisez async/await pour les opérations asynchrones
Exemple :
public interface IAgentService
{
Task<Agent> CreateAgentAsync(string role, string goal);
}
public class AgentService : IAgentService
{
private readonly ILogger<AgentService> _logger;
public async Task<Agent> CreateAgentAsync(string role, string goal)
{
// Implementation
}
}
Les commentaires sont en anglais, et jamais accentués
Un invariant, tenu par scripts/check-comment-accents.py en CI : tout commentaire est en
anglais et ne porte aucune lettre accentuée. L'interface de Studio étant en français, le
piège est le commentaire qui cite un libellé : traduisez le libellé, n'enlevez pas ses
accents — un commentaire citant "Modele d'IA" nomme quelque chose que le produit
n'affiche jamais. Nommez plutôt le rôle (the model-settings tab). Une phrase française
désaccentuée reste du français, en pire.
Seules les lignes de commentaire sont concernées. Les chaînes visibles par l'utilisateur gardent leurs accents, tout comme la typographie employée partout dans le dépôt — tirets cadratins, points de suspension, flèches, guillemets : ce ne sont pas des lettres accentuées.
Documentation
- Ajoutez une documentation XML Ă toutes les APIs publiques
- Incluez des exemples dans la documentation lorsque c'est utile
- Mettez à jour README.md si vous ajoutez de nouvelles fonctionnalités
Documentation bilingue (obligatoire)
La documentation est maintenue en anglais et en français en parallèle. Toute PR qui ajoute,
renomme ou supprime un fichier sous docs/**.md (hors docs/fr/) doit appliquer le mĂŞme
changement à son miroir français sous docs/fr/, et toute modification d'un fichier
communautaire racine (README.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md,
SUPPORT.md, ainsi que la page d'accueil du site index.md)
doit mettre Ă jour son miroir *.fr.md. Le script scripts/check-docs-parity.sh le
vérifie : il échoue dès qu'un miroir manque — exécutez-le localement avant d'ouvrir la PR.
C'est un gate CI : ci.yml exécute le script à chaque push et pull request, un miroir
manquant fait donc échouer le build. Le script vérifie l'existence des fichiers, pas l'équivalence du
contenu — la synchronisation reste à votre charge ; si vous ne pouvez pas traduire
immédiatement, ajoutez un miroir minimal et signalez-le pour traduction.
Les instantanés d'audit datés (p. ex. les rapports GO/NO-GO de publication) sont des
archives de gouvernance, pas de la documentation vivante : ils vivent dans le dépôt de
gouvernance privé des mainteneurs, hors de docs/, si bien que le contrat de parité
s'applique Ă tout l'arbre documentaire sans exception.
Tests
- Écrivez des tests unitaires pour les nouvelles fonctionnalités
- Maintenez ou améliorez la couverture de code
- Utilisez des noms de tests descriptifs
- Suivez le pattern AAA (Arrange, Act, Assert)
[Fact]
public async Task Agent_Should_Execute_Task_Successfully()
{
// Arrange
var agent = Agent.Create("Researcher", "Find information");
var task = CrewTask.Create("Research AI", "Report");
// Act
var result = await agent.ExecuteTaskAsync(task);
// Assert
Assert.True(result.Success);
Assert.NotNull(result.Output);
}
Domaines de contribution
Le périmètre est gelé
Orkeon embarque déjà 16 fournisseurs LLM (quatorze vendeurs et deux agrégateurs), 79 outils intégrés, 6 stores de mémoire, deux pipelines RAG, RaggableTree, un DSL de scripting, des plugins, MCP, A2A et un Studio — maintenus par une seule personne. Tant que de vrais utilisateurs n'en demandent pas davantage, la surface fonctionnelle ne grandit pas :
- pas de 17ᵉ fournisseur LLM — la base compatible OpenAI couvre tout endpoint
qui parle ce dialecte ; pointez
Orkeon:Llm:BaseUrldessus. Les deux agrégateurs (OpenRouter, Mammouth AI) sont l'unique exception motivée, actée par le propriétaire le 2026-09-18 : un agrégateur déclare ses propres capacités, écrit des champs que le socle ne lit pas (reasoning,usage.cost) et doit être reconnu par l'outillage — rien de ce qu'uneBaseUrlapporte. La règle vaut pour tout le reste ; - pas de nouvel outil intégré — écrivez le vôtre dans un script
.ork.tsou un plugin, tous deux de premier rang et sans modification ici ; - pas de nouveau store de mémoire, adaptateur de langage ou mode d'orchestration.
Une pull request qui ajoute l'un d'eux sera fermée avec un lien vers cette section, quelle que soit sa qualité. Ce qui est bienvenu, c'est tout ce qui abaisse le coût d'essayer Orkeon ou de lui faire confiance : bugs, tests, documentation, interopérabilité avec ce que les gens utilisent déjà (Microsoft Agent Framework, OpenTelemetry, .NET Aspire), et performance.
Priorité haute
- [ ] Bugs trouvés en exécutant les exemples sur un modèle local
- [ ] Tests d'interop MCP contre les serveurs de référence (MCP Inspector)
- [ ] Optimisations de performance
- [ ] Améliorations de la documentation (voir le contrat de parité EN/FR ci-dessus)
Bonnes premières issues
- [ ] Ajouter davantage d'exemples (suivre le gabarit de README d'exemple)
- [ ] Améliorer les messages d'erreur
- [ ] Ajouter de la documentation XML
- [ ] Corriger les fautes de frappe dans la documentation
Versionnement et stabilité API
Orkeon suit le Semantic Versioning 2.0. L'API publique n'est pas une affaire d'opinion — elle est consignée dans le dépôt et vérifiée au build :
- Chaque projet packable porte
PublicAPI.Shipped.txt(la surface gelée, publiée) etPublicAPI.Unshipped.txt(les ajouts depuis la dernière release), contrôlés parMicrosoft.CodeAnalysis.PublicApiAnalyzers. Un changement d'API publique non déclaré fait échouer le build (RS0016/RS0017promus en erreurs). - Ajouter une API publique : la déclarer dans
PublicAPI.Unshipped.txt(le code fix de l'analyseur le fait pour vous —dotnet format analyzers --diagnostics RS0016sur le projet). À la release, les entréesUnshippedpassent dansShipped. - Un breaking change est toute édition ou suppression d'une ligne de
PublicAPI.Shipped.txt. Il exige une version majeure (une mineure n'est acceptable qu'avant la 1.0), une entrée*REMOVED*dans le fichier d'API, et une entrée CHANGELOG qui le dit sans détour. - Fenêtre de dépréciation : rien de public n'est retiré sans avoir livré
[Obsolete]pendant au moins une version mineure, avec le remplaçant nommé dans le message. - Les surfaces
[Experimental]sont hors de cet engagement. A2A, l'orchestration Autonomous, le RAG correctif et l'intégration MCP portent des diagnostics[Experimental("ORKEXP00x")]: les référencer est une erreur de compilation à supprimer explicitement — c'est votre opt-in à une surface qui peut changer dans n'importe quelle version. Voir docs/fr/reference/experimental-apis.md. - Engagement de stabilité pour la fenêtre 1.x : une fois la 1.0 publiée, aucun
breaking change sur une API livrée non expérimentale avant la 2.0. D'ici là — la
ligne
1.0.0-rc.*sur laquellemainse trouve aujourd'hui — des breaking changes peuvent encore arriver d'une release candidate à l'autre, mais sont toujours annoncés dans le CHANGELOG et les notes de migration.
Processus de release
- Bump de
VersionPrefix/VersionSuffixdanssrc/Directory.Build.props— la source unique de vérité. Le workflow de publication refuse un tagv*qui ne lui correspond pas. - Couper la section
[Unreleased]deCHANGELOG.mden section versionnée datée. - Basculer les entrées
PublicAPI.Unshipped.txtdansPublicAPI.Shipped.txt. - Basculer de même les règles d'analyseur : toute entrée en attente dans
src/analyzers/Orkeon.Compliance.Vfs/AnalyzerReleases.Unshipped.md(les règles de conformité VFSORKVFS00x) passe dansAnalyzerReleases.Shipped.mdsous un titre## Release <version>, ne laissant que son en-tête au fichierUnshipped. L'analyseur de suivi des releases lit ce titre comme un simple numéroMajeur.Mineur.Correctifet refuse un suffixe de pré-release (RS2007) : le titre de la ligne 1.0.0 est donc## Release 1.0.0— il est déjà là , et les tagsrc.*n'y ajoutent rien. - Vérifier que la CI est verte. Au-delà du build
-warnaserroret des suites de tests, les gates qui doivent passer sontscripts/check-docs-parity.sh,scripts/check-doc-claims.py,scripts/check-comment-accents.py,scripts/check-release-readiness.py(il refuse une release dont les fichiersPublicAPI.Unshipped.txtne sont pas réduits à leur en-tête),scripts/check-package-closure.py, les linters d'exemples (scripts/generate-examples-index.sh --check,scripts/lint-example-configs.py,scripts/lint-example-readmes.py), la gate des bits exécutables (file-modes.yml), le scan de secrets (secret-scan.yml) et le build docfx strict. - Taguer
v<version>et pousser le tag. Cela déclenche :publish.yml(packe tout ; pousse les neuf paquets de la gamme v1 sur NuGet.org —Orkeon,Orkeon.Tools,Orkeon.Rag.Onnx,Orkeon.Rag.Onnx.Model,Orkeon.Tools.Embeddings.Local,Orkeon.Scripting.Cli,Orkeon.Compliance.Vfs,Orkeon.Interop.AgentFramework,Orkeon.Hosting.Aspire, l'ombrelle en premier puisque les autres en dépendent — et chaque projet packable sur GitHub Packages ; voir la matrice de publication),release.yml(les paquets CLI par plateforme et les archives multi-apps pour chaque RID, le MSI Windows per-user et le MSI de serviceorkeon-host, les tarballs macOS, le paquet Debian et leurs fichiers de sommes — chacun smoke-testé sur un vrai runner avant publication de la Release — plus l'image conteneurorkeon-runnerspoussée sur GHCR) etdocs.yml(déploie le site de documentation sur GitHub Pages, à l'adresse https://orkeon.github.io/orkeon/).
Des questions ?
N'hésitez pas à ouvrir une issue, ou à lancer un fil dans les GitHub Discussions.
Licence
En contribuant, vous acceptez que vos contributions soient publiées sous licence MIT.