Dossier d'exemple, non retouché
Un dépôt existant
Ce dossier a été écrit par Kodrudder. Nous l'affichons tel quel, avec ses hypothèses et les écarts que la relecture a trouvés.
Relevé de cette analyse : 93 s, coût estimé 1,04 $, 403 fichiers recensés.
À lire d'abord
1 hypothèse marquée
Kodrudder (README.md, package.json v0.8.0) est un studio « Ready-to-Dev » : à partir d'une idée ou d'un dépôt GitHub existant, une équipe de 66 agents IA produit 10 dossiers de cadrage, relus et approuvés par l'utilisateur. Le dossier est exporté en bundle ZIP (src/bundle.mjs) pour Claude Code ou Codex ; Cursor n'est pas accepté (src/domain.mjs).
| Forces | Faiblesses |
|---|---|
| Zéro dépendance npm, Node ≥ 24 | Kit equipe-agentique-0.5.0-complete.zip absent : export et tests de bundle impossibles sur clone propre (S-01) |
Anti-SSRF, coffre GitHub chiffré, mots de passe scrypt (web-reader.mjs, github-connect.mjs, accounts.mjs) | Fichiers monolithiques : missions.mjs 44 Ko, nacrel-studio.js 99 Ko (S-02) |
Approbations invalidées à toute modification (framing.mjs) | Aucune CI, Docker ni lint ; pas de déploiement public (S-08) |
~35 tests, dont l'isolation SaaS (saas.test.mjs) | Compatibilité réelle du bundle non prouvée, nativeRuntimeTest: not_executed (S-09) |
Trois premières actions
- Résoudre le ZIP manquant (S-01) : versionner le fichier ou scripter sa génération, puis lancer
npm testpour obtenir un état de référence. - Ajouter une CI exécutant
npm testsous Node 24 (S-08). - Découper
missions.mjsetnacrel-studio.js(S-02), en s'appuyant sur les tests existants. Ne pas renommer lesNACREL_*(S-10).
Limites de cette analyse
- Elle repose sur un condensé tronqué :
server.mjs,missions.mjs,nacrel-studio.jsetbundle.mjsne sont vus que partiellement. - Rien n'a été exécuté : aucun test lancé, aucun démarrage.
- Authentification des routes, CSRF et contrat de
/api/v1/*ne sont pas jugeables H.
Ce que fait ce dépôt
2 hypothèses marquées
Le produit
- Kodrudder (
README.md,usine-agentique/cockpit/package.json: nomkodrudder, v0.8.0) est un « studio Ready-to-Dev » : l'utilisateur part d'une idée ou d'un projet existant (dépôt GitHub) et obtient un dossier de cadrage structuré, produit avec une équipe d'agents IA. - Le cadrage couvre 10 dossiers documentaires (
src/framing.mjs: besoins, analyse, périmètre, marché, UX, fonctionnel, trajectoire, technique, exploitation, gouvernance) et un maillage de 24 sujets / 66 agents (equipe-agentique/library/maillage/map.json). - Une fois approuvé, le dossier est exporté en bundle ZIP (
src/bundle.mjs) pour Claude Code ou Codex ; le développement continue ensuite en local, le studio importe l'état publié (src/domain.mjs→importSnapshot).
Modules
| Dossier / fichier | Rôle | Taille | Dépendances |
|---|---|---|---|
equipe-agentique/library/ | Bibliothèque de l'équipe IA : 66 profils (agents.json), catalogue, maillage/, policy.md, ~80 skills (skills/ea-*/SKILL.md + references/) | ~330 fichiers, surtout JSON/MD (agents.json 409 Ko, catalogue.json 500 Ko) | Données, lues par server.mjs et tests/fixtures.mjs |
usine-agentique/cockpit/server.mjs | Serveur HTTP unique : API /api/*, statique, auth, GitHub, export | 25 Ko | Tous les src/*.mjs |
src/framing.mjs, domain.mjs, quality.mjs, reprise.mjs | Règles métier : cadrage, approbations, phases, contrôles qualité, objectifs de reprise | 4–10 Ko chacun | Partagés navigateur/serveur |
src/workspace.mjs, sqlite-store.mjs, atomic-replace.mjs | Persistance des projets (JSON ou SQLite, transactions, versions) | ~10 Ko / 3 Ko / <1 Ko | node:sqlite |
src/missions.mjs, mission-scheduling.mjs, workbench.mjs, conversation-policy.mjs | Orchestration des missions IA (CEO, délégation, revue, parallélisme) et actions du studio | 44 Ko / 2 Ko / 11 Ko / <1 Ko | llm.mjs, knowledge.mjs, routing.mjs |
src/llm.mjs, provider-runtime.mjs, provider-stream.mjs, context-pack.mjs, managed-ai.mjs, routing.mjs, connections.mjs | Fournisseurs IA (OpenAI/Anthropic), streaming, retries, coûts, quotas, routage de modèles, profils | 3–10 Ko chacun | fetch natif |
src/web-research.mjs, web-reader.mjs, web-evidence.mjs, project-learning.mjs, knowledge.mjs | Recherche web contrôlée (anti-SSRF), preuves, mémoire documentaire | 3–9 Ko chacun | node:https, node:dns |
src/github*.mjs, private-github-config.mjs | GitHub App OAuth (PKCE, coffre chiffré AES-GCM), lecture contexte, publication de bundle | 1–7 Ko chacun | API GitHub |
src/accounts.mjs, onboarding.mjs | Comptes/sessions (scrypt) et création de projet | 5 Ko / 3 Ko | sqlite-store |
src/bundle.mjs, delivery-report.mjs, project-package.mjs, published-state.mjs | Génération du ZIP (écrit à la main, CRC32), rapport de livraison, projection du projet | 2–10 Ko | equipe-agentique-0.5.0-complete.zip (voir ci-dessous) |
public/ | Frontend vanilla ES modules, sans build : nacrel-app.js (53 Ko), nacrel-studio.js (99 Ko), pages index/studio/auth/welcome.html, CSS | ~35 fichiers | Importe aussi ../src/framing.mjs et ../src/reprise.mjs (code partagé) |
tests/ | ~35 tests node:test (workbench.test.mjs 50 Ko, saas.test.mjs…) | ~35 fichiers | tests/fixtures.mjs |
scripts/backup-storage.mjs | Sauvegarde SQLite cohérente (serveur arrêté) | 2 Ko | node:sqlite |
start-saas.mjs, ouvrir-nacrel.mjs, Ouvrir-Kodrudder.cmd | Lanceurs : mode comptes (port 4335), ouverture locale (4317) | <2 Ko | server.mjs |
Stack et outillage réels
| Domaine | Réalité (fait) |
|---|---|
| Langage / runtime | JavaScript ESM ("type":"module"), Node.js ≥ 24 (package.json) |
| Dépendances | Aucune dépendance npm (README : « Aucune installation de dépendances ») |
| Backend | node:http brut, sans framework (server.mjs) |
| Frontend | HTML + JS/CSS vanilla servis tels quels depuis public/, sans bundler |
| Stockage | SQLite via node:sqlite par défaut (NACREL_STORAGE=sqlite) ; JSON possible ; données dans .private/ ou .private-saas/ (ou NACREL_DATA_DIR) |
| IA | OpenAI / Anthropic par clés en variables EA_LLM_* ; mode géré NACREL_AI_* (managed-ai.mjs) |
| Auth / GitHub | Comptes locaux en mode SaaS (NACREL_MODE=saas) ; GitHub App via NACREL_GITHUB_* |
| Tests | npm test = node --test --test-isolation=none tests/*.test.mjs |
| Déploiement | Aucun fichier CI/Docker visible dans le condensé ; README : le mode comptes local « n'est pas un déploiement public » |
Points d'attention :
- Le README exige
../../equipe-agentique-0.5.0-complete.zip(référencé partests/domain.test.mjsetbundle.mjs), absent de l'arborescence fournie : à vérifier (H : généré ou omis du dépôt ; les tests de bundle en dépendent). - Le nom public est Kodrudder, mais variables
NACREL_*, cookies et formats historiques sont conservés volontairement (cockpit/README.md) : ne pas renommer.
Points d'entrée et commandes
| Action | Commande (depuis usine-agentique/cockpit) |
|---|---|
| Lancer en local | npm start → http://127.0.0.1:4317/app (port via PORT) |
| Windows | Ouvrir-Kodrudder.cmd / node ouvrir-nacrel.mjs (démarre le serveur s'il est absent, vérifie /api/catalogue) |
| Mode comptes | node start-saas.mjs --open-signup [--port=4335] (inscriptions fermées sans l'option) |
| Tests | npm test |
| Sauvegarde | node scripts/backup-storage.mjs SOURCE DEST --server-stopped |
| Config GitHub privée | .private/github-app.json (lu par private-github-config.mjs) |
Flux principal de bout en bout
- Création : l'UI (
public/nacrel-app.js,nacrel-model.js→creationInput) envoiePOST /api/workspace/create;server.mjsappellesrc/onboarding.mjs→createProject, qui initialise le cadrage (framing.mjs→initializeFraming) à partir demaillage/map.jsonet stocke le projet (workspace.mjs→sqlite-store.mjs). - Contexte (reprise) : pour un dépôt existant,
github-context.mjs(scanContext/applyContext) lit un échantillon borné viagithub.mjs; l'objectif de reprise (reprise.mjs) restreint le parcours. - Mission IA : l'action
start(/api/workspace/action→workbench.mjs→missions.mjs) construit le contexte (knowledge.mjs,context-pack.mjs), choisit le modèle (routing.mjs,connections.mjs), appelle le fournisseur (llm.mjs,provider-runtime.mjs,provider-stream.mjs), et peut déclencher une recherche web (web-research.mjs→web-reader.mjs→web-evidence.mjs). - Revue et propositions : les résultats sont validés (
llm.mjs→validateResult) ; un reviewer distinct vérifie ; les propositions (besoins, tâches, documents) attendent l'acceptation de l'utilisateur (workbench.mjs,knowledge.mjs→newItem). - Rédaction et approbation : dossiers et maillage sont édités/approuvés (
framing.mjs→saveDocument,approveMesh,approveFraming) ; la qualité est contrôlée (quality.mjs,objectiveQuality). - Export :
GET /api/bundle→bundle.mjs→makeBundle(exigeassertReady) assemble BRIEF, dossiers,07-memoire/*,nacrel/project-package.json(project-package.mjs), rapport (delivery-report.mjs) et le kit EA ; optionnellement publié sur une branche GitHub dédiée (github-publish.mjs). - Transmission et suivi :
/api/workspace/handoff(domain.mjs→handoff, bundle exporté et à jour requis) passe le projet en phaselocal(consultation seule) ;/api/workspace/snapshotimporteETAT-PUBLIE.jsondepuis GitHub (github.mjs→snapshot,importSnapshot).
Limite : seul un condensé tronqué de
server.mjs,missions.mjsetnacrel-studio.jsa été vu ; les détails de routage interne sont H.
Spécification reconstituée
8 hypothèses marquées
Reconstitution à partir d'un condensé tronqué (
server.mjs,missions.mjs,nacrel-studio.jsetframing.mjsvus partiellement). Tout ce qui n'est pas vu est marqué H.
Utilisateurs et besoins couverts
| ID | Utilisateur | Besoin couvert | Preuve |
|---|---|---|---|
| BE-01 | Créateur / vibecoder | Transformer une idée (nom, brief 10–12 000 car., préférences) en projet cadré | src/onboarding.mjs → createProject, public/nacrel-model.js → creationInput |
| BE-02 | Développeur avec projet existant | Reprendre un dépôt GitHub : audit, documentation, refactor ou reconstruction | src/reprise.mjs (repriseObjectives), src/github-context.mjs |
| BE-03 | Responsable de projet | Produire 10 dossiers de cadrage avec une équipe IA et les approuver | src/framing.mjs (dossiers, approveFraming), src/missions.mjs |
| BE-04 | Responsable de projet | Choisir et valider l'équipe (24 sujets, 66 agents, reviewer distinct) | src/framing.mjs (validateMesh, approveMesh), public/nacrel-team.js |
| BE-05 | Responsable de projet | Fiabiliser les décisions : sources, recherche web, revue indépendante | src/web-research.mjs, src/web-evidence.mjs, src/quality.mjs |
| BE-06 | Développeur | Exporter un bundle ZIP prêt pour Claude Code ou Codex | src/bundle.mjs → makeBundle |
| BE-07 | Développeur | Suivre l'avancement local après transmission (import de ETAT-PUBLIE.json) | src/domain.mjs → importSnapshot, src/github.mjs → snapshot |
| BE-08 | Utilisateur multi-comptes (mode SaaS) | Compte, quota IA, connexion GitHub | src/accounts.mjs, src/managed-ai.mjs, src/github-connect.mjs |
Règles métier réellement codées
| ID | Règle | Fichier | Valeur / détail | Statut |
|---|---|---|---|---|
| RM-01 | Nom de projet requis | src/domain.mjs, src/onboarding.mjs | ≤ 100 car. | Fait |
| RM-02 | Brief / idée | src/onboarding.mjs | 10 à 12 000 car. | Fait |
| RM-03 | Documents joints à la création | src/onboarding.mjs | ≤ 8 ; MD/TXT/JSON/CSV/YAML UTF-8 ; ≤ 900 000 car. au total | Fait |
| RM-04 | Idempotence de création | src/onboarding.mjs | requestId 16–100 car. ; empreinte identique sinon erreur | Fait |
| RM-05 | Limite de projets | src/onboarding.mjs | 100 projets non supprimés | Fait |
| RM-06 | Dépôt GitHub | src/onboarding.mjs | URL https://github.com/org/repo | Fait |
| RM-07 | Objectif de reprise | src/reprise.mjs | audit, structure (parcours court) ; refactor, rebuild (parcours complet avec bundle) | Fait |
| RM-08 | Outils cibles | src/domain.mjs | claude ou codex uniquement | Fait |
| RM-09 | Phases | src/domain.mjs | framing (éditable) puis local (consultation seule) | Fait |
| RM-10 | Modification d'un brief ou document invalide les approbations et incrémente la révision | src/framing.mjs → invalidate | exportedAt remis à null | Fait |
| RM-11 | Maillage : 24 sujets, reviewer ≠ producteur ≠ contributeurs, agents 1 à 66 | src/framing.mjs → validateMesh | Fait | |
| RM-12 | Transmission : bundle exporté ET à la révision courante | src/domain.mjs → handoff | Fait | |
| RM-13 | Snapshot : même projet, schema_version 1, commit 40 hex, date non future, plus récente que l'état précédent | src/domain.mjs → importSnapshot | ≤ 500 tâches ; statuts todo/doing/review/done/blocked | Fait |
| RM-14 | Qualité de sortie : besoins avec critères, tâches liées à un besoin, sans cycle, sourcées, sans blocage ouvert, reviewer indépendant | src/quality.mjs | Export bloqué sinon | Fait |
| RM-15 | Plan de missions | src/llm.mjs, src/mission-scheduling.mjs | ≤ 8 missions, ≤ 3 recherches web, ≤ 3 contextRequests, dépendances sans cycle | Fait |
| RM-16 | Parallélisme interdit si dépendance directe/transitive ou acteur commun | src/mission-scheduling.mjs | Fait | |
| RM-17 | Budget d'appels IA par projet | src/workbench.mjs | maxCalls ≤ 1000 ; sortie manuelle 1 000–1 000 000 tokens | Fait |
| RM-18 | Quota IA mensuel du compte | src/managed-ai.mjs | 1–10 000 appels, défaut 100 | Fait |
| RM-19 | Recherche web : HTTPS public seulement, pas de secret/IP privée, ≤ 3 redirections | src/web-reader.mjs, src/web-research.mjs | Fait | |
| RM-20 | Réutilisation de preuves web selon fraîcheur | src/project-learning.mjs | 0 (prix, droit…), 7 j (méthodes), 1 j (autres) | Fait |
| RM-21 | Limites documentaires | src/knowledge.mjs | ≤ 100 documents, 1 M car. par projet ; dédoublonnage par hash | Fait |
| RM-22 | Comptes : mot de passe 12–256 car., scrypt N=131072, session 24 h, 12 tentatives / 15 min, ≤ 100 utilisateurs | src/accounts.mjs | Fait | |
| RM-23 | Publication GitHub : branche dédiée nacrel/bundle-…, ≤ 25 Mo, droit contents:write requis | src/github-publish.mjs | Fait | |
| RM-24 | Lecture GitHub : échantillon de 16 fichiers max, chemins sensibles exclus, fichiers ≤ 180 Ko, 500 fichiers listés | src/github.mjs, src/github-context.mjs | Fait | |
| RM-25 | Les approbations sont des déclarations de l'utilisateur, pas des signatures authentifiées | commentaire de src/framing.mjs | Fait |
Modèle de données observé
| Entité | Champs clés | Stockage |
|---|---|---|
Workspace (records[id]) | project, engine, version, versions[], updatedAt, deletedAt | SQLite workspace.json.sqlite (table state, JSON unique + revision) ou JSON, sous .private/ (src/workspace.mjs, src/sqlite-store.mjs) |
| Project | id, name, brief, category, runtime, phase, responseMode, integrationMode, repriseObjective, repo, exportedAt, exportedRevision, snapshot, onboarding | dans record.project |
| Framing | revision, mesh[24], links, layout, docs{id→content, accepted, blocking, openPoints, evidence, review}, history, approval, meshApproval | dans project.framing |
| Engine | items[] (kind: need/rule/decision/hypothesis/risk/task/contradiction), documents[] + chunks, jobs[], proposals[], webSources[], limits, calls, integration | dans record.engine (src/workspace.mjs → engine) |
| Contrat de maillage | id C01–C24, owner, reviewer, contributors, disposition, rationale | framing.mesh ; modèle de référence dans equipe-agentique/library/maillage/map.json |
| Connexions | profiles (openai/anthropic, secretRef EA_LLM_*), routing, sources, keys | connections.json(.sqlite) (src/connections.mjs) |
| Comptes | users (email, passwordHash, salt), sessions (digest, expires) | accounts.json(.sqlite) (src/accounts.mjs) |
| Jetons GitHub | chiffrés AES-256-GCM par propriétaire | github-connections.json (src/github-connect.mjs) |
| Quota IA | period, used | allowance (src/managed-ai.mjs) |
| Isolation SaaS | un dossier par tenant tenants/<id>/ | server.mjs → context() |
API et routes observées
Les méthodes HTTP et les sous-chemins ne sont pas visibles (condensé tronqué) : colonne Méthode en H.
| Route | Rôle | Fichier |
|---|---|---|
/api/session, /api/auth/* | Session, inscription, connexion, déconnexion (/api/auth/signup, /api/auth/logout vus dans les tests) | server.mjs, src/accounts.mjs |
/api/account | Compte courant | server.mjs |
/api/workspace | Liste des projets | server.mjs |
/api/workspace/state | État complet d'un projet | server.mjs → workbench.state |
/api/workspace/create | Création de projet | server.mjs → onboarding.createProject |
/api/workspace/save | Sauvegarde du projet (versions, conflits) | server.mjs → workspace.mjs |
/api/workspace/action | Actions : start, stop, restore, search, document, limits, integration… | server.mjs → workbench.act |
/api/workspace/handoff | Passage en phase local | server.mjs → domain.handoff |
/api/workspace/snapshot | Import de l'état publié | server.mjs → importSnapshot |
/api/workspace/github, /github-access | Association / accès du dépôt, scan de contexte | server.mjs, src/github-context.mjs |
/api/workspace/delete, /deleted, /backup, /restore-backup, /outcome | Suppression logique, corbeille, sauvegarde/restauration, livrable de reprise | server.mjs (H sur le détail) |
/api/bundle | Génération du ZIP (exige assertReady) | server.mjs → bundle.makeBundle |
/api/catalogue, /api/fiche/ | Catalogue d'agents et fiche métier | server.mjs |
/api/github/status, /repositories, /start, /create-repository, /publish, /disconnect | Connexion GitHub App et publication | server.mjs, src/github-connect.mjs, src/github-publish.mjs |
/github/callback (hors /api) | Retour OAuth (PKCE) | server.mjs ; public/github-complete.html |
/api/admin/connections, /api/admin/profiles, /profiles/secret, /profiles/remove | Profils de modèles IA (admin) | server.mjs, src/connections.mjs |
/api/v1/, /api/v1/projects, /api/v1/requests | API publique versionnée avec clés | server.mjs ; connections.mjs expose keys, projects, requests (H : contrat non visible) |
/app, / , /auth.html, /welcome.html | Pages | server.mjs, public/* |
Annoncé mais non visible (ou non vérifiable)
| Élément | Source | État |
|---|---|---|
equipe-agentique-0.5.0-complete.zip | README, src/bundle.mjs, tests/domain.test.mjs | Absent de l'arborescence ; requis par l'export et certains tests (H : généré ou exclu du dépôt) |
equipe-agentique/install.mjs, runtime/ea.mjs | LIRE-MOI.md généré dans bundle.mjs, skills | Non présents ; supposés dans le ZIP H |
verifier-bundle.mjs, DEMARRER-ICI.md, manifeste SHA-256 | tests/delivery-report.test.mjs | Générés dans le bundle ; code du générateur tronqué |
| Support de Cursor | README (outil IA) | Seuls claude et codex sont acceptés (src/domain.mjs, nacrel-model.js) |
| Démarrage réel de Claude Code / Codex avec le bundle | src/delivery-report.mjs | nativeRuntimeTest: not_executed : non prouvé |
| Déploiement public / HTTPS | cockpit/README.md | Non fourni ; mode comptes local seulement |
| Aucune CI, Dockerfile ni migration | arborescence | Non visibles |
Méthodes HTTP, validations et erreurs de server.mjs ; boucle d'orchestration de missions.mjs | fichiers tronqués | H |
Contrat de l'API /api/v1/* et gestion des clés | server.mjs, connections.mjs tronqués | H |
État de santé
2 hypothèses marquées
Revue sur condensé tronqué :
server.mjs,missions.mjs,nacrel-studio.js,nacrel-app.js,workbench.mjsetbundle.mjsne sont vus que partiellement. Aucune exécution de test n'a été faite : un test « défini » n'est pas un test « réussi ».
Constats
| ID | Gravité | Fichier | Constat observable | Conséquence | Correction |
|---|---|---|---|---|---|
| S-01 | Haute | cockpit/README.md, src/bundle.mjs, tests/domain.test.mjs | Le kit equipe-agentique-0.5.0-complete.zip est exigé, mais absent de l'arborescence | Export du bundle et test « bundle contient bibliothèque réelle » impossibles sur un clone propre (H : fichier ignoré par .gitignore, 159 o, non lu) | Versionner le ZIP ou documenter/scripter sa génération ; lire .gitignore |
| S-02 | Haute | src/missions.mjs (44 Ko), public/nacrel-studio.js (99 Ko), public/nacrel-app.js (53 Ko) | Trois fichiers monolithiques | Modification risquée, relecture difficile par l'IA (contexte tronqué) | Découper par responsabilité, en s'appuyant sur les tests existants |
| S-03 | Moyenne | public/nacrel-model.js, public/nacrel-app.js | Le navigateur importe ../src/framing.mjs et ../src/reprise.mjs | Le code partagé est exposé au client et doit rester sans dépendance Node ; framing.mjs ne doit jamais importer node:* | Isoler le code partagé dans un dossier dédié |
| S-04 | Moyenne | src/accounts.mjs, src/workspace.mjs | Écriture JSON via rename, sans atomicReplace dans accounts.mjs et connections.mjs (mode json) | Sous Windows, EPERM possible, alors que workspace.mjs traite déjà le cas | Réutiliser src/atomic-replace.mjs partout |
| S-05 | Moyenne | src/accounts.mjs | Limitation des tentatives en mémoire (this.attempts), clé d'adresse ; plafond 100 utilisateurs ; scrypt N=131072 | Limite perdue au redémarrage, clé IP fiable seulement derrière un proxy correctement configuré H ; coût CPU de scrypt limité à 2 connexions simultanées | Persister ou externaliser le throttling avant tout déploiement public |
| S-06 | Moyenne | src/sqlite-store.mjs | Tout l'état d'un workspace est un unique blob JSON avec CAS sur revision | Concurrence : conflits explicites mais montée en charge limitée ; croissance du blob (versions incluses) | Acceptable en préversion ; surveiller la taille |
| S-07 | Moyenne | scripts/backup-storage.mjs | Sauvegarde exigeant l'arrêt du serveur (--server-stopped) | Pas de sauvegarde à chaud automatisée ; /api/workspace/backup existe (détail non vu) | Planifier la sauvegarde ; vérifier la restauration |
| S-08 | Moyenne | arborescence | Aucun CI, Dockerfile, lint, ni script de déploiement | Tests non exécutés automatiquement ; README : « pas un déploiement public » | Ajouter une CI npm test (Node 24) |
| S-09 | Moyenne | src/delivery-report.mjs | nativeRuntimeTest: not_executed | Compatibilité réelle du bundle avec Claude Code/Codex non prouvée | Test manuel documenté d'installation |
| S-10 | Basse | README.md, cockpit/README.md | Nommage hybride Kodrudder / NACREL_* / nacrel-*.js | Confusion ; renommage interdit pour compatibilité | Noter dans AGENTS.md : ne pas renommer |
| S-11 | Basse | src/provider-runtime.mjs | Tarifs codés en dur, datés du 04/10/2026, trois modèles seulement | Coûts faux ou null pour les autres modèles | Table de prix externe et datée |
| S-12 | Basse | equipe-agentique/library/agents.json, catalogue.json | JSON de 409 Ko et 500 Ko | Lourds à relire, à ne pas charger entiers dans un prompt | Lire par extraits |
À conserver tel quel
| Élément | Raison (fichier) |
|---|---|
| Zéro dépendance npm, Node ≥ 24 | package.json : surface d'attaque et maintenance minimales |
| Anti-SSRF de la lecture web | src/web-reader.mjs : IP résolue et épinglée, adresses mixtes refusées, HTTPS public, redirections validées ; tests web-research.test.mjs |
| Coffre GitHub | src/github-connect.mjs : AES-256-GCM, PKCE, state à usage unique |
| Hachage des mots de passe, sessions | src/accounts.mjs : scrypt, comparaison à temps constant, jetons stockés hachés |
| Transactions SQLite | src/sqlite-store.mjs : CAS, synchronous=FULL, sauvegarde VACUUM INTO vérifiée |
| En-têtes de sécurité | server.mjs : CSP stricte, nosniff, no-store |
| Invalidation des approbations | src/framing.mjs (invalidate), src/domain.mjs |
| Garde-fous de livraison | src/delivery-report.mjs : chemins validés, doublons refusés |
| Suite de tests | ~35 fichiers tests/*.test.mjs, dont isolation SaaS (saas.test.mjs) |
Non jugeable avec le condensé
| Sujet | Raison |
|---|---|
Authentification et autorisation des routes /api/* (dont /api/v1/*, /api/admin/*) | server.mjs tronqué |
Protection CSRF, cookies (Secure, SameSite) | sessionCookie non vu |
| Bornes de taille et temps de requête, concurrence des missions | missions.mjs tronqué |
Échappement HTML dans nacrel-studio.js (le modèle escapeHtml est vu, pas son usage) | fichier de 99 Ko tronqué |
Génération complète du ZIP (bundle.mjs) | fin du fichier tronquée |
| Couverture et réussite réelles des tests | aucune exécution |
Contenu de .gitignore (.private/, ZIP) | non affiché |
| Cohérence des 66 profils et des 80 skills | volume ; seules quelques sources ont été échantillonnées |
| Performance, journalisation, supervision | aucun code d'observabilité visible |
AGENTS.md prêt à déposer
# AGENTS.md — Kodrudder (Studio Ready-to-Dev)
## But
Studio local qui transforme une idée ou un dépôt GitHub existant en dossier de cadrage (10 dossiers, maillage de 24 sujets / 66 agents), exporté en bundle ZIP pour Claude Code ou Codex (`usine-agentique/cockpit/README.md`, `src/bundle.mjs`).
## Commandes (depuis `usine-agentique/cockpit/`)
| Action | Commande |
|---|---|
| Installer | Rien : aucune dépendance npm. Node.js >= 24 requis (`package.json`) |
| Lancer | `npm start` puis http://127.0.0.1:4317/app (port via `PORT`) |
| Lancer (Windows) | `Ouvrir-Kodrudder.cmd` ou `node ouvrir-nacrel.mjs` |
| Mode comptes | `node start-saas.mjs --open-signup [--port=4335]` (sans l'option, inscriptions fermées) |
| Tester | `npm test` (= `node --test --test-isolation=none tests/*.test.mjs`) |
| Sauvegarder | `node scripts/backup-storage.mjs SOURCE DEST --server-stopped` (serveur arrêté) |
## Carte des dossiers
| Chemin | Contenu |
|---|---|
| `usine-agentique/cockpit/server.mjs` | Serveur `node:http` unique : API `/api/*`, statique, auth |
| `usine-agentique/cockpit/src/` | Logique métier (cadrage, missions, IA, GitHub, stockage, bundle) |
| `usine-agentique/cockpit/public/` | Frontend ES modules vanilla, sans build |
| `usine-agentique/cockpit/tests/` | Tests `node:test` ; `fixtures.mjs` lit `maillage/map.json` |
| `usine-agentique/cockpit/scripts/` | Sauvegarde du stockage |
| `equipe-agentique/library/` | 66 profils (`agents.json`), `catalogue.json`, `maillage/`, `policy.md`, `skills/ea-*/` |
## Conventions observées
- JavaScript ESM, extensions `.mjs` côté serveur, style compact, messages d'erreur en français.
- Stockage SQLite par défaut (`NACREL_STORAGE=sqlite`), données dans `.private/` ou `.private-saas/` (ou `NACREL_DATA_DIR`).
- Écritures via transactions et contrôle de révision (`src/workspace.mjs`, `src/sqlite-store.mjs`).
- Un test par module dans `tests/*.test.mjs`, données de test sous `.qa/`.
## Règles à ne pas enfreindre
- **Ne pas renommer** `NACREL_*`, cookies, clés du navigateur, formats d'export, dossiers de données : compatibilité (`cockpit/README.md`).
- **Aucune dépendance npm** : tout repose sur Node natif (`package.json`).
- `public/*` importe `src/framing.mjs` et `src/reprise.mjs` : ces deux fichiers ne doivent jamais importer `node:*` (`public/nacrel-model.js`, `public/nacrel-app.js`).
- Ne jamais publier ni committer `.private/`, `.private-saas/`, clés IA ou GitHub (`cockpit/README.md`) ; secrets via environnement ou interface.
- Toute modification de brief/document passe par `invalidate` (`src/framing.mjs`) : elle invalide les approbations et l'export.
- Projet en phase `local` : consultation seule (`src/domain.mjs`).
- Reviewer distinct du producteur dans le maillage (`validateMesh`, `src/framing.mjs`).
- Recherche web : HTTPS public uniquement ; ne pas affaiblir l'anti-SSRF de `src/web-reader.mjs`.
- Export du bundle uniquement après `assertReady` (`src/bundle.mjs`) ; ne pas prétendre que le démarrage de Claude Code/Codex est testé (`src/delivery-report.mjs` : `not_executed`).
- Ne rien écrire hors `.qa/` pendant les tests.
## Pièges connus
- `equipe-agentique-0.5.0-complete.zip` (racine du dépôt) est requis par `src/bundle.mjs`, `tests/domain.test.mjs`, `cockpit/README.md` mais absent de l'arborescence : les tests de bundle échouent probablement sans lui (H : exclu par `.gitignore`, non lu).
- Garder l'organisation du dépôt : le serveur lit `../../equipe-agentique/library/` (`server.mjs`).
- `src/missions.mjs` (44 Ko), `public/nacrel-studio.js` (99 Ko), `public/nacrel-app.js` (53 Ko) sont monolithiques : modifier par petites zones, tests ciblés.
- `agents.json` (409 Ko) et `catalogue.json` (500 Ko) : ne jamais les charger entiers ; lire par extraits.
- `src/accounts.mjs` et `src/connections.mjs` (mode json) écrivent avec `rename` direct ; `src/atomic-replace.mjs` gère les verrous Windows (`EPERM`).
- Sauvegarde à chaud non prévue par le script : arrêter le serveur.
- Mode comptes local : pas un déploiement public (`cockpit/README.md`).