À propos du projet

Factory est un pipeline autonome de tickets qui automatise le parcours d'une issue GitHub jusqu'à la PR fusionnée. Les issues étiquetées `ready-for-agent` sont prises en charge par un agent de codage travaillant dans un git worktree isolé, contrôlées par vos propres vérifications déterministes (commandes de test/lint), revues par un second LLM, ouvertes en PR, et fusionnées vers `main` uniquement lorsque la barrière, le relecteur, la CI GitHub et la fraîcheur par rapport à `main` sont tous d'accord. Tout ce que le pipeline ne peut pas résoudre est renvoyé avec une étiquette `ready-for-human` et les preuves jointes. Il s'exécute localement sur votre machine via un timer systemd (par défaut toutes les 10 minutes) en utilisant les CLI d'agents que vous possédez déjà — `omp`, `droid`, `codex exec`, `claude -p`, et similaires. L'état réside dans GitHub (étiquettes, commentaires, PR) plus un répertoire `.factory/` ignoré par git ; le dispatcheur est sans état et peut être réexécuté en toute sécurité. Commandes et capacités clés : - **Triage** : Un modèle local (Ollama, vLLM, llama.cpp, LM Studio) étiquette les issues `needs-triage` comme `ready-for-agent`, `needs-info`, `ready-for-human`, ou propose `wontfix`. - **Dispatch** : Une passe sans état qui synchronise l'amont, exécute l'étape de fusion, réclame les tickets, invoque les workers, exécute les barrières, ouvre les PR, et gère les renvois de revue jusqu'à une limite de tours configurée. - **Manage** : Un agent gestionnaire recommande des orientations pour les PR nécessitant une revue, résout les paquets d'escalade, et peut RETRY, REWRITE, SPLIT, ROUTE, FIX, ou passer à HUMAN. Les enfants issus d'un split rentrent dans le triage ; les réécritures doivent préserver les baselines d'initiative acceptées. - **Gate** : Exécute vos vérifications déterministes dans le worktree et produit un rapport Markdown. - **Learn** : Lit les traces d'événements des tickets récemment terminés et les conclusions des relecteurs, demande au modèle local des leçons spécifiques au dépôt, et écrit un fichier `.factory-lessons.md` intégré dans chaque prompt de worker. - **Dashboard** : Une UI ops locale affichant les étapes des tickets, les phases en cours, les rapports de barrière, les journaux des workers, le battement de cœur du journal, la dérive amont, un Factory Manager Chat en lecture seule, et une vue Roadmap pour les initiatives partagées. - **Plan** : Commandes en lecture seule pour lister et inspecter les issues d'initiative, le routage de la propriété des décisions, proposer des baselines d'initiative immuables, et détecter la dérive entre la baseline acceptée d'un ticket et la source d'initiative vivante. Factory prend en charge les liaisons d'initiative immuables : un ticket d'implémentation peut déclarer `Initiative: #N` avec une baseline JSON délimitée (hachée SHA-256, version de schéma 1). Une fois admis, l'instantané complet du ticket devient le contrat d'exécution approuvé par l'humain ; les tentatives réutilisent cet instantané et ne peuvent pas adopter des révisions ultérieures. La détection de dérive compare la baseline acceptée à l'initiative vivante, en signalant les sections modifiées sans deviner l'attribution. L'installation se fait via `uv tool install` (ou pipx/pip) depuis le dépôt GitHub, avec un canal `@stable` pour les versions. La configuration implique `factory init` (crée `.factory.toml`, les modèles d'issues, les étiquettes), l'édition des vérifications de barrière, `factory doctor` (valide les outils, l'authentification, les remotes, le point de terminaison du modèle, le port du dashboard), et `factory install --dashboard` (écrit les unités utilisateur systemd). L'outil nécessite Python ≥ 3.11, `git`, et `gh` authentifié avec accès en push. Pour les forks suivant un amont, le dispatcheur fusionne les nouveaux commits amont dans `main` (sous barrière) avant chaque étape de fusion. Les commandes worker et manager reçoivent des chemins de fichiers de prompt et des répertoires de travail ; les relecteurs reçoivent des prompts en ligne. Le CLI manager doit être configuré en mode lecture seule/sans outils.