Aller au contenu
KodrudderConnexionCommencer gratuitement

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).

ForcesFaiblesses
Zéro dépendance npm, Node ≥ 24Kit 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

  1. Résoudre le ZIP manquant (S-01) : versionner le fichier ou scripter sa génération, puis lancer npm test pour obtenir un état de référence.
  2. Ajouter une CI exécutant npm test sous Node 24 (S-08).
  3. Découper missions.mjs et nacrel-studio.js (S-02), en s'appuyant sur les tests existants. Ne pas renommer les NACREL_* (S-10).

Limites de cette analyse

  • Elle repose sur un condensé tronqué : server.mjs, missions.mjs, nacrel-studio.js et bundle.mjs ne 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 : nom kodrudder, 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 / fichierRôleTailleDé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.mjsServeur HTTP unique : API /api/*, statique, auth, GitHub, export25 KoTous les src/*.mjs
src/framing.mjs, domain.mjs, quality.mjs, reprise.mjsRègles métier : cadrage, approbations, phases, contrôles qualité, objectifs de reprise4–10 Ko chacunPartagés navigateur/serveur
src/workspace.mjs, sqlite-store.mjs, atomic-replace.mjsPersistance des projets (JSON ou SQLite, transactions, versions)~10 Ko / 3 Ko / <1 Konode:sqlite
src/missions.mjs, mission-scheduling.mjs, workbench.mjs, conversation-policy.mjsOrchestration des missions IA (CEO, délégation, revue, parallélisme) et actions du studio44 Ko / 2 Ko / 11 Ko / <1 Kollm.mjs, knowledge.mjs, routing.mjs
src/llm.mjs, provider-runtime.mjs, provider-stream.mjs, context-pack.mjs, managed-ai.mjs, routing.mjs, connections.mjsFournisseurs IA (OpenAI/Anthropic), streaming, retries, coûts, quotas, routage de modèles, profils3–10 Ko chacunfetch natif
src/web-research.mjs, web-reader.mjs, web-evidence.mjs, project-learning.mjs, knowledge.mjsRecherche web contrôlée (anti-SSRF), preuves, mémoire documentaire3–9 Ko chacunnode:https, node:dns
src/github*.mjs, private-github-config.mjsGitHub App OAuth (PKCE, coffre chiffré AES-GCM), lecture contexte, publication de bundle1–7 Ko chacunAPI GitHub
src/accounts.mjs, onboarding.mjsComptes/sessions (scrypt) et création de projet5 Ko / 3 Kosqlite-store
src/bundle.mjs, delivery-report.mjs, project-package.mjs, published-state.mjsGénération du ZIP (écrit à la main, CRC32), rapport de livraison, projection du projet2–10 Koequipe-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 fichiersImporte aussi ../src/framing.mjs et ../src/reprise.mjs (code partagé)
tests/~35 tests node:test (workbench.test.mjs 50 Ko, saas.test.mjs…)~35 fichierstests/fixtures.mjs
scripts/backup-storage.mjsSauvegarde SQLite cohérente (serveur arrêté)2 Konode:sqlite
start-saas.mjs, ouvrir-nacrel.mjs, Ouvrir-Kodrudder.cmdLanceurs : mode comptes (port 4335), ouverture locale (4317)<2 Koserver.mjs

Stack et outillage réels

DomaineRéalité (fait)
Langage / runtimeJavaScript ESM ("type":"module"), Node.js ≥ 24 (package.json)
DépendancesAucune dépendance npm (README : « Aucune installation de dépendances »)
Backendnode:http brut, sans framework (server.mjs)
FrontendHTML + JS/CSS vanilla servis tels quels depuis public/, sans bundler
StockageSQLite via node:sqlite par défaut (NACREL_STORAGE=sqlite) ; JSON possible ; données dans .private/ ou .private-saas/ (ou NACREL_DATA_DIR)
IAOpenAI / Anthropic par clés en variables EA_LLM_* ; mode géré NACREL_AI_* (managed-ai.mjs)
Auth / GitHubComptes locaux en mode SaaS (NACREL_MODE=saas) ; GitHub App via NACREL_GITHUB_*
Testsnpm test = node --test --test-isolation=none tests/*.test.mjs
DéploiementAucun 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é par tests/domain.test.mjs et bundle.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

ActionCommande (depuis usine-agentique/cockpit)
Lancer en localnpm start → http://127.0.0.1:4317/app (port via PORT)
WindowsOuvrir-Kodrudder.cmd / node ouvrir-nacrel.mjs (démarre le serveur s'il est absent, vérifie /api/catalogue)
Mode comptesnode start-saas.mjs --open-signup [--port=4335] (inscriptions fermées sans l'option)
Testsnpm test
Sauvegardenode 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

  1. Création : l'UI (public/nacrel-app.js, nacrel-model.js → creationInput) envoie POST /api/workspace/create ; server.mjs appelle src/onboarding.mjs → createProject, qui initialise le cadrage (framing.mjs → initializeFraming) à partir de maillage/map.json et stocke le projet (workspace.mjs → sqlite-store.mjs).
  2. Contexte (reprise) : pour un dépôt existant, github-context.mjs (scanContext/applyContext) lit un échantillon borné via github.mjs ; l'objectif de reprise (reprise.mjs) restreint le parcours.
  3. 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).
  4. 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).
  5. 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).
  6. Export : GET /api/bundle → bundle.mjs → makeBundle (exige assertReady) 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).
  7. Transmission et suivi : /api/workspace/handoff (domain.mjs → handoff, bundle exporté et à jour requis) passe le projet en phase local (consultation seule) ; /api/workspace/snapshot importe ETAT-PUBLIE.json depuis GitHub (github.mjs → snapshot, importSnapshot).

Limite : seul un condensé tronqué de server.mjs, missions.mjs et nacrel-studio.js a é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.js et framing.mjs vus partiellement). Tout ce qui n'est pas vu est marqué H.

Utilisateurs et besoins couverts

IDUtilisateurBesoin couvertPreuve
BE-01Créateur / vibecoderTransformer 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-02Développeur avec projet existantReprendre un dépôt GitHub : audit, documentation, refactor ou reconstructionsrc/reprise.mjs (repriseObjectives), src/github-context.mjs
BE-03Responsable de projetProduire 10 dossiers de cadrage avec une équipe IA et les approuversrc/framing.mjs (dossiers, approveFraming), src/missions.mjs
BE-04Responsable de projetChoisir et valider l'équipe (24 sujets, 66 agents, reviewer distinct)src/framing.mjs (validateMesh, approveMesh), public/nacrel-team.js
BE-05Responsable de projetFiabiliser les décisions : sources, recherche web, revue indépendantesrc/web-research.mjs, src/web-evidence.mjs, src/quality.mjs
BE-06DéveloppeurExporter un bundle ZIP prêt pour Claude Code ou Codexsrc/bundle.mjs → makeBundle
BE-07DéveloppeurSuivre l'avancement local après transmission (import de ETAT-PUBLIE.json)src/domain.mjs → importSnapshot, src/github.mjs → snapshot
BE-08Utilisateur multi-comptes (mode SaaS)Compte, quota IA, connexion GitHubsrc/accounts.mjs, src/managed-ai.mjs, src/github-connect.mjs

Règles métier réellement codées

IDRègleFichierValeur / détailStatut
RM-01Nom de projet requissrc/domain.mjs, src/onboarding.mjs≤ 100 car.Fait
RM-02Brief / idéesrc/onboarding.mjs10 à 12 000 car.Fait
RM-03Documents joints à la créationsrc/onboarding.mjs≤ 8 ; MD/TXT/JSON/CSV/YAML UTF-8 ; ≤ 900 000 car. au totalFait
RM-04Idempotence de créationsrc/onboarding.mjsrequestId 16–100 car. ; empreinte identique sinon erreurFait
RM-05Limite de projetssrc/onboarding.mjs100 projets non supprimésFait
RM-06Dépôt GitHubsrc/onboarding.mjsURL https://github.com/org/repoFait
RM-07Objectif de reprisesrc/reprise.mjsaudit, structure (parcours court) ; refactor, rebuild (parcours complet avec bundle)Fait
RM-08Outils ciblessrc/domain.mjsclaude ou codex uniquementFait
RM-09Phasessrc/domain.mjsframing (éditable) puis local (consultation seule)Fait
RM-10Modification d'un brief ou document invalide les approbations et incrémente la révisionsrc/framing.mjs → invalidateexportedAt remis à nullFait
RM-11Maillage : 24 sujets, reviewer ≠ producteur ≠ contributeurs, agents 1 à 66src/framing.mjs → validateMeshFait
RM-12Transmission : bundle exporté ET à la révision courantesrc/domain.mjs → handoffFait
RM-13Snapshot : même projet, schema_version 1, commit 40 hex, date non future, plus récente que l'état précédentsrc/domain.mjs → importSnapshot≤ 500 tâches ; statuts todo/doing/review/done/blockedFait
RM-14Qualité de sortie : besoins avec critères, tâches liées à un besoin, sans cycle, sourcées, sans blocage ouvert, reviewer indépendantsrc/quality.mjsExport bloqué sinonFait
RM-15Plan de missionssrc/llm.mjs, src/mission-scheduling.mjs≤ 8 missions, ≤ 3 recherches web, ≤ 3 contextRequests, dépendances sans cycleFait
RM-16Parallélisme interdit si dépendance directe/transitive ou acteur communsrc/mission-scheduling.mjsFait
RM-17Budget d'appels IA par projetsrc/workbench.mjsmaxCalls ≤ 1000 ; sortie manuelle 1 000–1 000 000 tokensFait
RM-18Quota IA mensuel du comptesrc/managed-ai.mjs1–10 000 appels, défaut 100Fait
RM-19Recherche web : HTTPS public seulement, pas de secret/IP privée, ≤ 3 redirectionssrc/web-reader.mjs, src/web-research.mjsFait
RM-20Réutilisation de preuves web selon fraîcheursrc/project-learning.mjs0 (prix, droit…), 7 j (méthodes), 1 j (autres)Fait
RM-21Limites documentairessrc/knowledge.mjs≤ 100 documents, 1 M car. par projet ; dédoublonnage par hashFait
RM-22Comptes : mot de passe 12–256 car., scrypt N=131072, session 24 h, 12 tentatives / 15 min, ≤ 100 utilisateurssrc/accounts.mjsFait
RM-23Publication GitHub : branche dédiée nacrel/bundle-…, ≤ 25 Mo, droit contents:write requissrc/github-publish.mjsFait
RM-24Lecture GitHub : échantillon de 16 fichiers max, chemins sensibles exclus, fichiers ≤ 180 Ko, 500 fichiers listéssrc/github.mjs, src/github-context.mjsFait
RM-25Les approbations sont des déclarations de l'utilisateur, pas des signatures authentifiéescommentaire de src/framing.mjsFait

Modèle de données observé

EntitéChamps clésStockage
Workspace (records[id])project, engine, version, versions[], updatedAt, deletedAtSQLite workspace.json.sqlite (table state, JSON unique + revision) ou JSON, sous .private/ (src/workspace.mjs, src/sqlite-store.mjs)
Projectid, name, brief, category, runtime, phase, responseMode, integrationMode, repriseObjective, repo, exportedAt, exportedRevision, snapshot, onboardingdans record.project
Framingrevision, mesh[24], links, layout, docs{id→content, accepted, blocking, openPoints, evidence, review}, history, approval, meshApprovaldans project.framing
Engineitems[] (kind: need/rule/decision/hypothesis/risk/task/contradiction), documents[] + chunks, jobs[], proposals[], webSources[], limits, calls, integrationdans record.engine (src/workspace.mjs → engine)
Contrat de maillageid C01–C24, owner, reviewer, contributors, disposition, rationaleframing.mesh ; modèle de référence dans equipe-agentique/library/maillage/map.json
Connexionsprofiles (openai/anthropic, secretRef EA_LLM_*), routing, sources, keysconnections.json(.sqlite) (src/connections.mjs)
Comptesusers (email, passwordHash, salt), sessions (digest, expires)accounts.json(.sqlite) (src/accounts.mjs)
Jetons GitHubchiffrés AES-256-GCM par propriétairegithub-connections.json (src/github-connect.mjs)
Quota IAperiod, usedallowance (src/managed-ai.mjs)
Isolation SaaSun 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.

RouteRôleFichier
/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/accountCompte courantserver.mjs
/api/workspaceListe des projetsserver.mjs
/api/workspace/stateÉtat complet d'un projetserver.mjs → workbench.state
/api/workspace/createCréation de projetserver.mjs → onboarding.createProject
/api/workspace/saveSauvegarde du projet (versions, conflits)server.mjs → workspace.mjs
/api/workspace/actionActions : start, stop, restore, search, document, limits, integration…server.mjs → workbench.act
/api/workspace/handoffPassage en phase localserver.mjs → domain.handoff
/api/workspace/snapshotImport de l'état publiéserver.mjs → importSnapshot
/api/workspace/github, /github-accessAssociation / accès du dépôt, scan de contexteserver.mjs, src/github-context.mjs
/api/workspace/delete, /deleted, /backup, /restore-backup, /outcomeSuppression logique, corbeille, sauvegarde/restauration, livrable de repriseserver.mjs (H sur le détail)
/api/bundleGénération du ZIP (exige assertReady)server.mjs → bundle.makeBundle
/api/catalogue, /api/fiche/Catalogue d'agents et fiche métierserver.mjs
/api/github/status, /repositories, /start, /create-repository, /publish, /disconnectConnexion GitHub App et publicationserver.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/removeProfils de modèles IA (admin)server.mjs, src/connections.mjs
/api/v1/, /api/v1/projects, /api/v1/requestsAPI publique versionnée avec clésserver.mjs ; connections.mjs expose keys, projects, requests (H : contrat non visible)
/app, / , /auth.html, /welcome.htmlPagesserver.mjs, public/*

Annoncé mais non visible (ou non vérifiable)

ÉlémentSourceÉtat
equipe-agentique-0.5.0-complete.zipREADME, src/bundle.mjs, tests/domain.test.mjsAbsent 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.mjsLIRE-MOI.md généré dans bundle.mjs, skillsNon présents ; supposés dans le ZIP H
verifier-bundle.mjs, DEMARRER-ICI.md, manifeste SHA-256tests/delivery-report.test.mjsGénérés dans le bundle ; code du générateur tronqué
Support de CursorREADME (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 bundlesrc/delivery-report.mjsnativeRuntimeTest: not_executed : non prouvé
Déploiement public / HTTPScockpit/README.mdNon fourni ; mode comptes local seulement
Aucune CI, Dockerfile ni migrationarborescenceNon visibles
Méthodes HTTP, validations et erreurs de server.mjs ; boucle d'orchestration de missions.mjsfichiers tronquésH
Contrat de l'API /api/v1/* et gestion des clésserver.mjs, connections.mjs tronquésH

État de santé

2 hypothèses marquées

Revue sur condensé tronqué : server.mjs, missions.mjs, nacrel-studio.js, nacrel-app.js, workbench.mjs et bundle.mjs ne 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

IDGravitéFichierConstat observableConséquenceCorrection
S-01Hautecockpit/README.md, src/bundle.mjs, tests/domain.test.mjsLe kit equipe-agentique-0.5.0-complete.zip est exigé, mais absent de l'arborescenceExport 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-02Hautesrc/missions.mjs (44 Ko), public/nacrel-studio.js (99 Ko), public/nacrel-app.js (53 Ko)Trois fichiers monolithiquesModification risquée, relecture difficile par l'IA (contexte tronqué)Découper par responsabilité, en s'appuyant sur les tests existants
S-03Moyennepublic/nacrel-model.js, public/nacrel-app.jsLe navigateur importe ../src/framing.mjs et ../src/reprise.mjsLe 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-04Moyennesrc/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 casRéutiliser src/atomic-replace.mjs partout
S-05Moyennesrc/accounts.mjsLimitation des tentatives en mémoire (this.attempts), clé d'adresse ; plafond 100 utilisateurs ; scrypt N=131072Limite perdue au redémarrage, clé IP fiable seulement derrière un proxy correctement configuré H ; coût CPU de scrypt limité à 2 connexions simultanéesPersister ou externaliser le throttling avant tout déploiement public
S-06Moyennesrc/sqlite-store.mjsTout l'état d'un workspace est un unique blob JSON avec CAS sur revisionConcurrence : conflits explicites mais montée en charge limitée ; croissance du blob (versions incluses)Acceptable en préversion ; surveiller la taille
S-07Moyennescripts/backup-storage.mjsSauvegarde 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-08MoyennearborescenceAucun CI, Dockerfile, lint, ni script de déploiementTests non exécutés automatiquement ; README : « pas un déploiement public »Ajouter une CI npm test (Node 24)
S-09Moyennesrc/delivery-report.mjsnativeRuntimeTest: not_executedCompatibilité réelle du bundle avec Claude Code/Codex non prouvéeTest manuel documenté d'installation
S-10BasseREADME.md, cockpit/README.mdNommage hybride Kodrudder / NACREL_* / nacrel-*.jsConfusion ; renommage interdit pour compatibilitéNoter dans AGENTS.md : ne pas renommer
S-11Bassesrc/provider-runtime.mjsTarifs codés en dur, datés du 04/10/2026, trois modèles seulementCoûts faux ou null pour les autres modèlesTable de prix externe et datée
S-12Basseequipe-agentique/library/agents.json, catalogue.jsonJSON de 409 Ko et 500 KoLourds à relire, à ne pas charger entiers dans un promptLire par extraits

À conserver tel quel

ÉlémentRaison (fichier)
Zéro dépendance npm, Node ≥ 24package.json : surface d'attaque et maintenance minimales
Anti-SSRF de la lecture websrc/web-reader.mjs : IP résolue et épinglée, adresses mixtes refusées, HTTPS public, redirections validées ; tests web-research.test.mjs
Coffre GitHubsrc/github-connect.mjs : AES-256-GCM, PKCE, state à usage unique
Hachage des mots de passe, sessionssrc/accounts.mjs : scrypt, comparaison à temps constant, jetons stockés hachés
Transactions SQLitesrc/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 approbationssrc/framing.mjs (invalidate), src/domain.mjs
Garde-fous de livraisonsrc/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é

SujetRaison
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 missionsmissions.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 testsaucune exécution
Contenu de .gitignore (.private/, ZIP)non affiché
Cohérence des 66 profils et des 80 skillsvolume ; seules quelques sources ont été échantillonnées
Performance, journalisation, supervisionaucun 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`).