From aedd3b9f10a5d0ba5a6ad1af222eb35a0b2b957c Mon Sep 17 00:00:00 2001 From: Sadrinho27 Date: Mon, 29 Sep 2025 16:57:49 +0200 Subject: [PATCH] first commit --- .cursor/rules/00-foundations.mdc | 32 + .cursor/rules/10-project-structure.mdc | 72 + .cursor/rules/20-documentation.mdc | 33 + .cursor/rules/30-testing.mdc | 57 + .cursor/rules/40-dependencies-and-build.mdc | 55 + .cursor/rules/41-ssh-automation.mdc | 65 + .cursor/rules/42-template-sync.mdc | 53 + .cursor/rules/4nkrules.mdc | 156 + .cursor/rules/50-data-csv-models.mdc | 54 + .cursor/rules/60-office-docs.mdc | 41 + .cursor/rules/70-frontend-architecture.mdc | 56 + .cursor/rules/80-versioning-and-release.mdc | 53 + .cursor/rules/85-release-guard.mdc | 37 + .cursor/rules/90-gitea-and-oss.mdc | 59 + .../rules/95-triage-and-problem-solving.mdc | 53 + .cursor/rules/ruleset-index.md | 16 + .cursorignore | 26 + .gitea/ISSUE_TEMPLATE/bug_report.md | 100 + .gitea/ISSUE_TEMPLATE/feature_request.md | 159 + .gitea/PULL_REQUEST_TEMPLATE.md | 184 + .gitea/workflows/LOCAL_OVERRIDES.yml | 15 + .gitea/workflows/ci.yml | 371 ++ .gitea/workflows/template-sync.yml | 40 + .gitignore | 30 + AGENTS.md | 275 + CHANGELOG.md | 8 + DEPLOYMENT.md | 194 + Dockerfile | 14 + README.md | 372 ++ VERSION | 1 + app/actions/contact.ts | 81 + app/actions/formation.ts | 91 + app/contact/page.tsx | 509 ++ app/dashboard/chat/loading.tsx | 79 + app/dashboard/chat/page.tsx | 607 ++ .../documents/[id]/roles/loading.tsx | 3 + app/dashboard/documents/[id]/roles/page.tsx | 726 +++ app/dashboard/documents/loading.tsx | 83 + app/dashboard/documents/page.tsx | 2760 +++++++++ app/dashboard/folders/[id]/roles/loading.tsx | 3 + app/dashboard/folders/[id]/roles/page.tsx | 540 ++ app/dashboard/folders/loading.tsx | 75 + app/dashboard/folders/page.tsx | 2297 +++++++ app/dashboard/layout.tsx | 327 + app/dashboard/loading.tsx | 3 + app/dashboard/page.tsx | 450 ++ app/dashboard/search/loading.tsx | 76 + app/dashboard/search/page.tsx | 782 +++ app/dashboard/settings/loading.tsx | 69 + app/dashboard/settings/page.tsx | 1136 ++++ app/dashboard/users/loading.tsx | 76 + app/dashboard/users/page.tsx | 1134 ++++ app/formation/devis/page.tsx | 585 ++ app/formation/page.tsx | 335 + app/globals.css | 123 + app/layout.tsx | 23 + app/login/page.tsx | 199 + app/page.tsx | 570 ++ components.json | 21 + components/4nk/AuthModal.tsx | 101 + components/4nk/DebugInfo.tsx | 70 + components/4nk/Iframe.tsx | 32 + components/modal/Modal.css | 163 + components/modal/Modal.tsx | 38 + components/theme-provider.tsx | 11 + components/ui/badge.tsx | 46 + components/ui/button.tsx | 59 + components/ui/card.tsx | 92 + components/ui/checkbox.tsx | 31 + components/ui/input.tsx | 21 + components/ui/label.tsx | 24 + components/ui/radio-group.tsx | 42 + components/ui/select.tsx | 171 + components/ui/skeleton.tsx | 8 + components/ui/switch.tsx | 29 + components/ui/textarea.tsx | 20 + docs/API.md | 765 +++ docs/ARCHITECTURE.md | 51 + docs/AUTO_SSH_PUSH.md | 238 + docs/COMMUNITY_GUIDE.md | 403 ++ docs/CONFIGURATION.md | 214 + docs/GITEA_SETUP.md | 288 + docs/INDEX.md | 306 + docs/INSTALLATION.md | 535 ++ docs/OPEN_SOURCE_CHECKLIST.md | 234 + docs/QUICK_REFERENCE.md | 494 ++ docs/RELEASE_PLAN.md | 361 ++ docs/ROADMAP.md | 343 ++ docs/SECURITY_AUDIT.md | 203 + docs/TESTING.md | 500 ++ docs/USAGE.md | 671 ++ index.html | 15 + lib/4nk/EventBus.ts | 33 + lib/4nk/IframeReference.ts | 13 + lib/4nk/Loader.tsx | 23 + lib/4nk/MessageBus.ts | 749 +++ lib/4nk/UserStore.ts | 43 + lib/4nk/models/Data.ts | 15 + lib/4nk/models/FolderData.ts | 137 + lib/4nk/models/ProfileData.ts | 122 + lib/4nk/models/Roles.ts | 11 + lib/email.ts | 316 + lib/utils.ts | 6 + next.config.mjs | 14 + package-lock.json | 5389 +++++++++++++++++ package.json | 77 + pnpm-lock.yaml | 3655 +++++++++++ postcss.config.mjs | 8 + public/placeholder-logo.png | Bin 0 -> 568 bytes public/placeholder-logo.svg | 1 + public/placeholder-user.jpg | Bin 0 -> 1635 bytes public/placeholder.jpg | Bin 0 -> 1064 bytes public/placeholder.svg | 1 + scripts/checks/version_alignment.sh | 21 + scripts/release/guard.sh | 66 + scripts/scripts/auto-ssh-push.sh | 152 + scripts/scripts/init-ssh-env.sh | 60 + scripts/scripts/setup-ssh-ci.sh | 55 + scripts/security/audit.sh | 35 + src/App.tsx | 118 + src/index.css | 35 + src/main.tsx | 11 + styles/globals.css | 123 + tsconfig.json | 27 + vite.config.ts | 23 + 125 files changed, 34362 insertions(+) create mode 100644 .cursor/rules/00-foundations.mdc create mode 100644 .cursor/rules/10-project-structure.mdc create mode 100644 .cursor/rules/20-documentation.mdc create mode 100644 .cursor/rules/30-testing.mdc create mode 100644 .cursor/rules/40-dependencies-and-build.mdc create mode 100644 .cursor/rules/41-ssh-automation.mdc create mode 100644 .cursor/rules/42-template-sync.mdc create mode 100644 .cursor/rules/4nkrules.mdc create mode 100644 .cursor/rules/50-data-csv-models.mdc create mode 100644 .cursor/rules/60-office-docs.mdc create mode 100644 .cursor/rules/70-frontend-architecture.mdc create mode 100644 .cursor/rules/80-versioning-and-release.mdc create mode 100644 .cursor/rules/85-release-guard.mdc create mode 100644 .cursor/rules/90-gitea-and-oss.mdc create mode 100644 .cursor/rules/95-triage-and-problem-solving.mdc create mode 100644 .cursor/rules/ruleset-index.md create mode 100644 .cursorignore create mode 100644 .gitea/ISSUE_TEMPLATE/bug_report.md create mode 100644 .gitea/ISSUE_TEMPLATE/feature_request.md create mode 100644 .gitea/PULL_REQUEST_TEMPLATE.md create mode 100644 .gitea/workflows/LOCAL_OVERRIDES.yml create mode 100644 .gitea/workflows/ci.yml create mode 100644 .gitea/workflows/template-sync.yml create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 CHANGELOG.md create mode 100644 DEPLOYMENT.md create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 VERSION create mode 100644 app/actions/contact.ts create mode 100644 app/actions/formation.ts create mode 100644 app/contact/page.tsx create mode 100644 app/dashboard/chat/loading.tsx create mode 100644 app/dashboard/chat/page.tsx create mode 100644 app/dashboard/documents/[id]/roles/loading.tsx create mode 100644 app/dashboard/documents/[id]/roles/page.tsx create mode 100644 app/dashboard/documents/loading.tsx create mode 100644 app/dashboard/documents/page.tsx create mode 100644 app/dashboard/folders/[id]/roles/loading.tsx create mode 100644 app/dashboard/folders/[id]/roles/page.tsx create mode 100644 app/dashboard/folders/loading.tsx create mode 100644 app/dashboard/folders/page.tsx create mode 100644 app/dashboard/layout.tsx create mode 100644 app/dashboard/loading.tsx create mode 100644 app/dashboard/page.tsx create mode 100644 app/dashboard/search/loading.tsx create mode 100644 app/dashboard/search/page.tsx create mode 100644 app/dashboard/settings/loading.tsx create mode 100644 app/dashboard/settings/page.tsx create mode 100644 app/dashboard/users/loading.tsx create mode 100644 app/dashboard/users/page.tsx create mode 100644 app/formation/devis/page.tsx create mode 100644 app/formation/page.tsx create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/login/page.tsx create mode 100644 app/page.tsx create mode 100644 components.json create mode 100644 components/4nk/AuthModal.tsx create mode 100644 components/4nk/DebugInfo.tsx create mode 100644 components/4nk/Iframe.tsx create mode 100644 components/modal/Modal.css create mode 100644 components/modal/Modal.tsx create mode 100644 components/theme-provider.tsx create mode 100644 components/ui/badge.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/checkbox.tsx create mode 100644 components/ui/input.tsx create mode 100644 components/ui/label.tsx create mode 100644 components/ui/radio-group.tsx create mode 100644 components/ui/select.tsx create mode 100644 components/ui/skeleton.tsx create mode 100644 components/ui/switch.tsx create mode 100644 components/ui/textarea.tsx create mode 100644 docs/API.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/AUTO_SSH_PUSH.md create mode 100644 docs/COMMUNITY_GUIDE.md create mode 100644 docs/CONFIGURATION.md create mode 100644 docs/GITEA_SETUP.md create mode 100644 docs/INDEX.md create mode 100644 docs/INSTALLATION.md create mode 100644 docs/OPEN_SOURCE_CHECKLIST.md create mode 100644 docs/QUICK_REFERENCE.md create mode 100644 docs/RELEASE_PLAN.md create mode 100644 docs/ROADMAP.md create mode 100644 docs/SECURITY_AUDIT.md create mode 100644 docs/TESTING.md create mode 100644 docs/USAGE.md create mode 100644 index.html create mode 100644 lib/4nk/EventBus.ts create mode 100644 lib/4nk/IframeReference.ts create mode 100644 lib/4nk/Loader.tsx create mode 100644 lib/4nk/MessageBus.ts create mode 100644 lib/4nk/UserStore.ts create mode 100644 lib/4nk/models/Data.ts create mode 100644 lib/4nk/models/FolderData.ts create mode 100644 lib/4nk/models/ProfileData.ts create mode 100644 lib/4nk/models/Roles.ts create mode 100644 lib/email.ts create mode 100644 lib/utils.ts create mode 100644 next.config.mjs create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.mjs create mode 100644 public/placeholder-logo.png create mode 100644 public/placeholder-logo.svg create mode 100644 public/placeholder-user.jpg create mode 100644 public/placeholder.jpg create mode 100644 public/placeholder.svg create mode 100644 scripts/checks/version_alignment.sh create mode 100644 scripts/release/guard.sh create mode 100644 scripts/scripts/auto-ssh-push.sh create mode 100644 scripts/scripts/init-ssh-env.sh create mode 100644 scripts/scripts/setup-ssh-ci.sh create mode 100644 scripts/security/audit.sh create mode 100644 src/App.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 styles/globals.css create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.cursor/rules/00-foundations.mdc b/.cursor/rules/00-foundations.mdc new file mode 100644 index 0000000..f8c9c6d --- /dev/null +++ b/.cursor/rules/00-foundations.mdc @@ -0,0 +1,32 @@ +--- +alwaysApply: true +--- + +# Fondations de rédaction et de comportement + +[portée] +S’applique à tout le dépôt 4NK/4NK_node pour toute génération, refactorisation, édition inline ou discussion dans Cursor. + +[objectifs] + +- Garantir l’usage exclusif du français. +- Proscrire l’injection d’exemples de code applicatif dans la base de code. +- Assurer une cohérence stricte de terminologie et de ton. +- Exiger une introduction et/ou une conclusion dans toute proposition de texte. + +[directives] + +- Toujours répondre et documenter en français. +- Ne pas inclure d’exemples exécutables ou de quickstarts dans la base ; préférer des descriptions prescriptives. +- Tout contenu produit doit mentionner explicitement les artefacts à mettre à jour lorsqu’il impacte docs/ et tests/. +- Préserver la typographie française (capitaliser uniquement le premier mot d’un titre et les noms propres). + +[validations] + +- Relecture linguistique et technique systématique. +- Refuser toute sortie avec exemples de code applicatif. +- Vérifier que l’issue traitée se conclut par un rappel des fichiers à mettre à jour. + +[artefacts concernés] + +- README.md, docs/**, tests/**, CHANGELOG.md, .gitea/**. diff --git a/.cursor/rules/10-project-structure.mdc b/.cursor/rules/10-project-structure.mdc new file mode 100644 index 0000000..4c1ef95 --- /dev/null +++ b/.cursor/rules/10-project-structure.mdc @@ -0,0 +1,72 @@ +--- +alwaysApply: true +--- + +# Structure projet 4NK_node + +[portée] +Maintenance de l’arborescence canonique, création/mise à jour/suppression de fichiers et répertoires. + +[objectifs] + +- Garantir l’alignement strict avec l’arborescence 4NK_node. +- Prévenir toute dérive structurelle. + +[directives] + +- S’assurer que l’arborescence suivante existe et reste conforme : + + 4NK/4NK_node + ├── archive + ├── CHANGELOG.md + ├── CODE_OF_CONDUCT.md + ├── CONTRIBUTING.md + ├── docker-compose.yml + ├── docs + │ ├── API.md + │ ├── ARCHITECTURE.md + │ ├── COMMUNITY_GUIDE.md + │ ├── CONFIGURATION.md + │ ├── GITEA_SETUP.md + │ ├── INDEX.md + │ ├── INSTALLATION.md + │ ├── MIGRATION.md + │ ├── OPEN_SOURCE_CHECKLIST.md + │ ├── QUICK_REFERENCE.md + │ ├── RELEASE_PLAN.md + │ ├── ROADMAP.md + │ ├── SECURITY_AUDIT.md + │ ├── TESTING.md + │ └── USAGE.md + ├── LICENSE + ├── README.md + ├── tests + │ ├── cleanup.sh + │ ├── connectivity + │ ├── external + │ ├── integration + │ ├── logs + │ ├── performance + │ ├── README.md + │ ├── reports + │ └── unit + └── .gitea + ├── ISSUE_TEMPLATE + │ ├── bug_report.md + │ └── feature_request.md + ├── PULL_REQUEST_TEMPLATE.md + └── workflows + └── ci.yml + +- Tout document obsolète est déplacé vers archive/ avec métadonnées (date, raison). +- Interdire la suppression brute de fichiers sans archivage et note dans CHANGELOG.md. + +[validations] + +- Diff structurel comparé à cette référence. +- Erreur bloquante si un fichier « requis » manque. + +[artefacts concernés] + +- archive/**, docs/**, tests/**, .gitea/**, CHANGELOG.md. + diff --git a/.cursor/rules/20-documentation.mdc b/.cursor/rules/20-documentation.mdc new file mode 100644 index 0000000..fa65b5c --- /dev/null +++ b/.cursor/rules/20-documentation.mdc @@ -0,0 +1,33 @@ +--- +alwaysApply: true +--- + +# Documentation continue + +[portée] +Mises à jour de docs/** corrélées à tout changement de code, configuration, dépendance, données ou CI. + +[objectifs] +- Remplacer toute section générique « RESUME » par des mises à jour ciblées dans les fichiers appropriés. +- Tenir INDEX.md comme table des matières de référence. + +[directives] +- À chaque changement, mettre à jour : + - API.md (spécifications, contrats, schémas, invariants). + - ARCHITECTURE.md (décisions, diagrammes, couplages, performances). + - CONFIGURATION.md (paramètres, formats, valeurs par défaut). + - INSTALLATION.md (pré-requis, étapes, vérifications). + - MIGRATION.md (chemins de migration, scripts, compatibilités). + - USAGE.md (parcours fonctionnels, contraintes). + - TESTING.md (pyramide, critères d’acceptation). + - SECURITY_AUDIT.md (menaces, contrôles, dettes résiduelles). + - RELEASE_PLAN.md, ROADMAP.md (planification), OPEN_SOURCE_CHECKLIST.md, COMMUNITY_GUIDE.md, GITEA_SETUP.md. +- Maintenir QUICK_REFERENCE.md pour les référentiels synthétiques utilisés par l’équipe. +- Ajouter un REX technique en cas d’hypothèses multiples avant résolution dans archive/. + +[validations] +- Cohérence croisée entre README.md et INDEX.md. +- Refus si une modification de code n’a pas de trace dans docs/** correspondants. + +[artefacts concernés] +- docs/**, README.md, archive/**. diff --git a/.cursor/rules/30-testing.mdc b/.cursor/rules/30-testing.mdc new file mode 100644 index 0000000..7178c27 --- /dev/null +++ b/.cursor/rules/30-testing.mdc @@ -0,0 +1,57 @@ +--- +alwaysApply: true +--- + +# Tests et qualité + +[portée] +Stratégie de tests, exécution locale, stabilité, non-régression. + +[objectifs] + +- Exiger des tests verts avant tout commit. +- Couvrir les axes unit, integration, connectivity, performance, external. + +[directives] + +- Ajouter/mettre à jour des tests dans tests/unit, tests/integration, tests/connectivity, tests/performance, tests/external selon l’impact. +- Consigner les journaux dans tests/logs et les rapports dans tests/reports. +- Maintenir tests/README.md (stratégie, outillage, seuils). +- Fournir un nettoyage reproductible via tests/cleanup.sh. +- Bloquer l’édition si des tests échouent tant que la correction n’est pas appliquée. + +[validations] + +- Refus d’un commit si tests en échec. +- Exiger justification et plan de test dans docs/TESTING.md pour toute refonte majeure. + +[artefacts concernés] + +- tests/**, docs/TESTING.md, CHANGELOG.md. + +# Tests et qualité + +[portée] +Stratégie de tests, exécution locale, stabilité, non-régression. + +[objectifs] + +- Exiger des tests verts avant tout commit. +- Couvrir les axes unit, integration, connectivity, performance, external. + +[directives] + +- Ajouter/mettre à jour des tests dans tests/unit, tests/integration, tests/connectivity, tests/performance, tests/external selon l’impact. +- Consigner les journaux dans tests/logs et les rapports dans tests/reports. +- Maintenir tests/README.md (stratégie, outillage, seuils). +- Fournir un nettoyage reproductible via tests/cleanup.sh. +- Bloquer l’édition si des tests échouent tant que la correction n’est pas appliquée. + +[validations] + +- Refus d’un commit si tests en échec. +- Exiger justification et plan de test dans docs/TESTING.md pour toute refonte majeure. + +[artefacts concernés] + +- tests/**, docs/TESTING.md, CHANGELOG.md. diff --git a/.cursor/rules/40-dependencies-and-build.mdc b/.cursor/rules/40-dependencies-and-build.mdc new file mode 100644 index 0000000..c1ece2d --- /dev/null +++ b/.cursor/rules/40-dependencies-and-build.mdc @@ -0,0 +1,55 @@ +--- +alwaysApply: true +--- + +# Dépendances, compilation et build + +[portée] +Gestion des dépendances, compilation fréquente, politique de versions. + +[objectifs] + +- Ajouter automatiquement les dépendances manquantes si justifié. +- Rechercher systématiquement les dernières versions stables. + +[directives] + +- Lorsqu’une fonctionnalité nécessite une dépendance, l’ajouter et la documenter (nom, version, portée, impact) dans docs/ARCHITECTURE.md et docs/CONFIGURATION.md si nécessaire. +- Compiler très régulièrement et « quand nécessaire » (avant refactor, avant push, après mise à jour de dépendances). +- Corriger toute erreur de compilation/exécution avant de poursuivre. +- Documenter tout changement de dépendances (raison, risques, rollback). + +[validations] + +- Interdire la progression si la compilation échoue. +- Vérifier la présence d’une note de changement dans CHANGELOG.md en cas de dépendance ajoutée/retirée. + +[artefacts concernés] + +- docs/ARCHITECTURE.md, docs/CONFIGURATION.md, CHANGELOG.md. + +# Dépendances, compilation et build + +[portée] +Gestion des dépendances, compilation fréquente, politique de versions. + +[objectifs] + +- Ajouter automatiquement les dépendances manquantes si justifié. +- Rechercher systématiquement les dernières versions stables. + +[directives] + +- Lorsqu’une fonctionnalité nécessite une dépendance, l’ajouter et la documenter (nom, version, portée, impact) dans docs/ARCHITECTURE.md et docs/CONFIGURATION.md si nécessaire. +- Compiler très régulièrement et « quand nécessaire » (avant refactor, avant push, après mise à jour de dépendances). +- Corriger toute erreur de compilation/exécution avant de poursuivre. +- Documenter tout changement de dépendances (raison, risques, rollback). + +[validations] + +- Interdire la progression si la compilation échoue. +- Vérifier la présence d’une note de changement dans CHANGELOG.md en cas de dépendance ajoutée/retirée. + +[artefacts concernés] + +- docs/ARCHITECTURE.md, docs/CONFIGURATION.md, CHANGELOG.md. diff --git a/.cursor/rules/41-ssh-automation.mdc b/.cursor/rules/41-ssh-automation.mdc new file mode 100644 index 0000000..1a988d6 --- /dev/null +++ b/.cursor/rules/41-ssh-automation.mdc @@ -0,0 +1,65 @@ +--- +alwaysApply: true +--- + +# Automatisation SSH et scripts + +[portée] +Création, usage et vérification du dossier scripts/ et de ses trois scripts standards liés aux opérations SSH et CI. + +[objectifs] + +- Garantir la présence de scripts/ avec auto-ssh-push.sh, init-ssh-env.sh, setup-ssh-ci.sh. +- Encadrer l’usage de ces scripts (locaux et CI), la sécurité, l’idempotence et la traçabilité. +- Documenter toute mise à jour dans docs/SSH_UPDATE.md et CHANGELOG.md. + +[directives] + +- Créer et maintenir `scripts/auto-ssh-push.sh`, `scripts/init-ssh-env.sh`, `scripts/setup-ssh-ci.sh`. +- Exiger permissions d’exécution adaptées sur scripts/ (exécution locale et CI). +- Interdire le stockage de clés privées ou secrets en clair dans le dépôt. +- Utiliser des variables d’environnement et secrets CI pour toute donnée sensible. +- Rendre chaque script idempotent et verbosable ; produire un code de sortie non-zéro en cas d’échec. +- Tracer les opérations : consigner un résumé dans docs/SSH_UPDATE.md (objectif, variables requises, effets, points d’échec). +- Ajouter un contrôle automatique dans la CI pour vérifier l’existence et l’exécutabilité de ces scripts. + +[validations] + +- Échec bloquant si un des trois scripts manque ou n’est pas exécutable. +- Échec bloquant si docs/SSH_UPDATE.md n’est pas mis à jour lors d’une modification de scripts. +- Échec bloquant si un secret attendu n’est pas fourni en CI. + +[artefacts concernés] + +- scripts/**, docs/SSH_UPDATE.md, .gitea/workflows/ci.yml, CHANGELOG.md, docs/CONFIGURATION.md. + +# Automatisation SSH et scripts + +[portée] +Création, usage et vérification du dossier scripts/ et de ses trois scripts standards liés aux opérations SSH et CI. + +[objectifs] + +- Garantir la présence de scripts/ avec auto-ssh-push.sh, init-ssh-env.sh, setup-ssh-ci.sh. +- Encadrer l’usage de ces scripts (locaux et CI), la sécurité, l’idempotence et la traçabilité. +- Documenter toute mise à jour dans docs/SSH_UPDATE.md et CHANGELOG.md. + +[directives] + +- Créer et maintenir `scripts/auto-ssh-push.sh`, `scripts/init-ssh-env.sh`, `scripts/setup-ssh-ci.sh`. +- Exiger permissions d’exécution adaptées sur scripts/ (exécution locale et CI). +- Interdire le stockage de clés privées ou secrets en clair dans le dépôt. +- Utiliser des variables d’environnement et secrets CI pour toute donnée sensible. +- Rendre chaque script idempotent et verbosable ; produire un code de sortie non-zéro en cas d’échec. +- Tracer les opérations : consigner un résumé dans docs/SSH_UPDATE.md (objectif, variables requises, effets, points d’échec). +- Ajouter un contrôle automatique dans la CI pour vérifier l’existence et l’exécutabilité de ces scripts. + +[validations] + +- Échec bloquant si un des trois scripts manque ou n’est pas exécutable. +- Échec bloquant si docs/SSH_UPDATE.md n’est pas mis à jour lors d’une modification de scripts. +- Échec bloquant si un secret attendu n’est pas fourni en CI. + +[artefacts concernés] + +- scripts/**, docs/SSH_UPDATE.md, .gitea/workflows/ci.yml, CHANGELOG.md, docs/CONFIGURATION.md. diff --git a/.cursor/rules/42-template-sync.mdc b/.cursor/rules/42-template-sync.mdc new file mode 100644 index 0000000..c7cf051 --- /dev/null +++ b/.cursor/rules/42-template-sync.mdc @@ -0,0 +1,53 @@ +--- +alwaysApply: true +--- + +# Synchronisation de template (4NK) + +[portée] +Tous les projets issus de 4NK_project_template. Contrôle de l’alignement sur .cursor/, .gitea/, AGENTS.md, scripts/, docs/SSH_UPDATE.md. + +[objectifs] + +- Garantir l’absence de dérive sur les éléments normatifs. +- Exiger la mise à jour documentaire et du changelog à chaque synchronisation. +- Bloquer la progression en cas d’intégrité non conforme. + +[directives] +- Lire la configuration de .4nk-sync.yml (source_repo, ref, paths, policy). +- Refuser toute modification locale dans le périmètre des paths sans PR de synchronisation. +- Après synchronisation : exiger mises à jour de CHANGELOG.md et docs/INDEX.md. +- Scripts : vérifier présence, permissions d’exécution et absence de secrets en clair. +- SSH : exiger mise à jour de docs/SSH_UPDATE.md si scripts/** modifié. + +[validations] +- Erreur bloquante si manifest_checksum manquant ou invalide. +- Erreur bloquante si un path requis n’existe pas après sync. +- Erreur bloquante si tests/CI signalent des scripts non exécutables ou des fichiers sensibles. + +[artefacts concernés] +- .4nk-sync.yml, TEMPLATE_VERSION, .cursor/**, .gitea/**, AGENTS.md, scripts/**, docs/SSH_UPDATE.md, CHANGELOG.md. +# Synchronisation de template (4NK) + +[portée] +Tous les projets issus de 4NK_project_template. Contrôle de l’alignement sur .cursor/, .gitea/, AGENTS.md, scripts/, docs/SSH_UPDATE.md. + +[objectifs] +- Garantir l’absence de dérive sur les éléments normatifs. +- Exiger la mise à jour documentaire et du changelog à chaque synchronisation. +- Bloquer la progression en cas d’intégrité non conforme. + +[directives] +- Lire la configuration de .4nk-sync.yml (source_repo, ref, paths, policy). +- Refuser toute modification locale dans le périmètre des paths sans PR de synchronisation. +- Après synchronisation : exiger mises à jour de CHANGELOG.md et docs/INDEX.md. +- Scripts : vérifier présence, permissions d’exécution et absence de secrets en clair. +- SSH : exiger mise à jour de docs/SSH_UPDATE.md si scripts/** modifié. + +[validations] +- Erreur bloquante si manifest_checksum manquant ou invalide. +- Erreur bloquante si un path requis n’existe pas après sync. +- Erreur bloquante si tests/CI signalent des scripts non exécutables ou des fichiers sensibles. + +[artefacts concernés] +- .4nk-sync.yml, TEMPLATE_VERSION, .cursor/**, .gitea/**, AGENTS.md, scripts/**, docs/SSH_UPDATE.md, CHANGELOG.md. diff --git a/.cursor/rules/4nkrules.mdc b/.cursor/rules/4nkrules.mdc new file mode 100644 index 0000000..75c8e3c --- /dev/null +++ b/.cursor/rules/4nkrules.mdc @@ -0,0 +1,156 @@ +--- +alwaysApply: true +# cursor.mcd — règles d’or 4NK +language: fr +policies: + respond_in_french: true + no_examples_in_codebase: true + ask_before_push_or_tag: true + +directories: + ensure: + - archive/ + - docs/ + - tests/ + - .gitea/ + docs: + required_files: + - API.md + - ARCHITECTURE.md + - COMMUNITY_GUIDE.md + - CONFIGURATION.md + - GITEA_SETUP.md + - INDEX.md + - INSTALLATION.md + - MIGRATION.md + - OPEN_SOURCE_CHECKLIST.md + - QUICK_REFERENCE.md + - RELEASE_PLAN.md + - ROADMAP.md + - SECURITY_AUDIT.md + - TESTING.md + - USAGE.md + tests: + required_files: + - cleanup.sh + - README.md + required_dirs: + - connectivity + - external + - integration + - logs + - performance + - reports + - unit + gitea: + required_files: + - PULL_REQUEST_TEMPLATE.md + required_dirs: + - ISSUE_TEMPLATE + - workflows + ISSUE_TEMPLATE: + required_files: + - bug_report.md + - feature_request.md + workflows: + required_files: + - ci.yml + +files: + required_root_files: + - CHANGELOG.md + - CODE_OF_CONDUCT.md + - CONTRIBUTING.md + - docker-compose.yml + - LICENSE + - README.md + +documentation: + update_on: + - feature_added + - feature_modified + - feature_removed + - feature_discovered + replace_sections_named: ["RESUME"] + rex_required_on_multiple_hypotheses: true + archive_obsolete_docs: true + +compilation: + compile_often: true + compile_when_needed: true + fail_on_errors: true + +problem_solving: + auto_run_steps: + - minimal_repro + - inspect_logs + - bisect_changes + - form_hypotheses + - targeted_tests + - implement_fix + - non_regression + +office_docs: + docx_reader: docx2txt + fallback: + - pandoc_convert + - request_alternate_source + +dependencies: + auto_add_missing: true + always_check_latest_stable: true + document_changes_in_docs: true + +csv_models: + treat_as_source_of_truth: true + multirow_headers_supported: true + confirm_in_docs: true + require_column_definitions: true + +file_processing: + study_each_file: true + ask_questions_if_needed: true + adapt_code_if_needed: true + propose_solution_if_unreadable: true + +types_and_properties: + auto_correct_incoherences: true + document_transformations: true + +functional_consistency: + always_ask_clarifying_questions: true + +frontend_architecture: + react_code_splitting: true + state_management: ["redux", "context_api"] + data_service_abstraction: true + +execution_discipline: + finish_started_work: true + +open_source_and_gitea: + prepare_every_project: true + gitea_remote: "git.4nkweb.com" + required_files: + - LICENSE + - CONTRIBUTING.md + - CHANGELOG.md + - CODE_OF_CONDUCT.md + align_with_4NK_node_on_creation: true + keep_alignment_updated: true + +tests_and_docs: + update_docs_and_tests_with_code: true + require_green_tests_before_commit: true + +versioning: + manage_with_changelog: true + confirm_before_push: true + confirm_before_tag: true + propose_semver_bump: true + +pre_commit: + run_all_tests: true + block_on_errors: true + +--- \ No newline at end of file diff --git a/.cursor/rules/50-data-csv-models.mdc b/.cursor/rules/50-data-csv-models.mdc new file mode 100644 index 0000000..c686e3d --- /dev/null +++ b/.cursor/rules/50-data-csv-models.mdc @@ -0,0 +1,54 @@ +--- +alwaysApply: false +--- +# Modélisation des données à partir de CSV + +[portée] +Utilisation des CSV comme base des modèles de données, y compris en-têtes multi-lignes. + +[objectifs] + +- Confirmer la structure inférée pour chaque CSV. +- Demander une définition formelle de toutes les colonnes. + +[directives] + +- Gérer explicitement les en-têtes multi-lignes (titre principal + sous-colonnes). +- Confirmer par écrit dans docs/API.md ou docs/ARCHITECTURE.md : nombre de lignes d’en-tête, mapping colonnes→types, unités, domaines de valeurs, nullabilité, contraintes. +- Poser des questions si ambiguïtés ; proposer une normalisation temporaire documentée. +- Corriger automatiquement les incohérences de types si une règle de mapping est établie ailleurs et documenter la transformation. + +[validations] + +- Aucune ingestion sans spécification de colonnes validée. +- Traçabilité des corrections de types (avant/après) dans docs/ARCHITECTURE.md. + +[artefacts concernés] + +- docs/API.md, docs/ARCHITECTURE.md, docs/USAGE.md. + +# Modélisation des données à partir de CSV + +[portée] +Utilisation des CSV comme base des modèles de données, y compris en-têtes multi-lignes. + +[objectifs] + +- Confirmer la structure inférée pour chaque CSV. +- Demander une définition formelle de toutes les colonnes. + +[directives] + +- Gérer explicitement les en-têtes multi-lignes (titre principal + sous-colonnes). +- Confirmer par écrit dans docs/API.md ou docs/ARCHITECTURE.md : nombre de lignes d’en-tête, mapping colonnes→types, unités, domaines de valeurs, nullabilité, contraintes. +- Poser des questions si ambiguïtés ; proposer une normalisation temporaire documentée. +- Corriger automatiquement les incohérences de types si une règle de mapping est établie ailleurs et documenter la transformation. + +[validations] + +- Aucune ingestion sans spécification de colonnes validée. +- Traçabilité des corrections de types (avant/après) dans docs/ARCHITECTURE.md. + +[artefacts concernés] + +- docs/API.md, docs/ARCHITECTURE.md, docs/USAGE.md. diff --git a/.cursor/rules/60-office-docs.mdc b/.cursor/rules/60-office-docs.mdc new file mode 100644 index 0000000..7f57891 --- /dev/null +++ b/.cursor/rules/60-office-docs.mdc @@ -0,0 +1,41 @@ +--- +alwaysApply: false +--- +# Lecture des documents bureautiques + +[portée] +Lecture des fichiers .docx et alternatives. + +[objectifs] +- Utiliser docx2txt par défaut. +- Proposer des solutions de repli si lecture impossible. + +[directives] +- Lire les .docx avec docx2txt. +- En cas d’échec, proposer : conversion via pandoc, demande d’une source alternative, ou extraction textuelle. +- Documenter dans docs/INDEX.md la provenance et le statut des documents importés. + +[validations] +- Vérification que les contenus extraits sont intégrés aux fichiers docs/ concernés. + +[artefacts concernés] +- docs/**, archive/**. +# Lecture des documents bureautiques + +[portée] +Lecture des fichiers .docx et alternatives. + +[objectifs] +- Utiliser docx2txt par défaut. +- Proposer des solutions de repli si lecture impossible. + +[directives] +- Lire les .docx avec docx2txt. +- En cas d’échec, proposer : conversion via pandoc, demande d’une source alternative, ou extraction textuelle. +- Documenter dans docs/INDEX.md la provenance et le statut des documents importés. + +[validations] +- Vérification que les contenus extraits sont intégrés aux fichiers docs/ concernés. + +[artefacts concernés] +- docs/**, archive/**. diff --git a/.cursor/rules/70-frontend-architecture.mdc b/.cursor/rules/70-frontend-architecture.mdc new file mode 100644 index 0000000..65d9c40 --- /dev/null +++ b/.cursor/rules/70-frontend-architecture.mdc @@ -0,0 +1,56 @@ +--- +alwaysApply: false +--- + +# Architecture frontend + +[portée] +Qualité du bundle, découpage, état global et couche de services. + +[objectifs] + +- Réduire la taille du bundle initial via code splitting. +- Éviter le prop drilling via Redux ou Context API. +- Abstraire les services de données pour testabilité et maintenance. + +[directives] + +- Mettre en place React.lazy et Suspense pour le chargement différé des vues/segments. +- Centraliser l’état global via Redux ou Context API. +- Isoler les appels « data » derrière une couche d’abstraction à interface stable. +- Interdire l’ajout d’exemples front dans la base de code. + +[validations] + +- Vérifier que les points d’entrée sont minimes et que les segments non critiques sont chargés à la demande. +- S’assurer que docs/ARCHITECTURE.md décrit les décisions et les points d’extension. + +[artefacts concernés] + +- docs/ARCHITECTURE.md, docs/TESTING.md. +# Architecture frontend + +[portée] +Qualité du bundle, découpage, état global et couche de services. + +[objectifs] + +- Réduire la taille du bundle initial via code splitting. +- Éviter le prop drilling via Redux ou Context API. +- Abstraire les services de données pour testabilité et maintenance. + +[directives] + +- Mettre en place React.lazy et Suspense pour le chargement différé des vues/segments. +- Centraliser l’état global via Redux ou Context API. +- Isoler les appels « data » derrière une couche d’abstraction à interface stable. +- Interdire l’ajout d’exemples front dans la base de code. + +[validations] + +- Vérifier que les points d’entrée sont minimes et que les segments non critiques sont chargés à la demande. +- S’assurer que docs/ARCHITECTURE.md décrit les décisions et les points d’extension. + +[artefacts concernés] + +- docs/ARCHITECTURE.md, docs/TESTING.md. diff --git a/.cursor/rules/80-versioning-and-release.mdc b/.cursor/rules/80-versioning-and-release.mdc new file mode 100644 index 0000000..24d213a --- /dev/null +++ b/.cursor/rules/80-versioning-and-release.mdc @@ -0,0 +1,53 @@ +--- +alwaysApply: false +--- + +# Versionnage et publication + +[portée] +Gestion sémantique des versions, CHANGELOG, confirmation push/tag. + +[objectifs] + +- Tenir CHANGELOG.md comme source unique de vérité. +- Demander confirmation avant push et tag. + +[directives] + +- À chaque changement significatif, mettre à jour CHANGELOG.md (ajouts, changements, corrections, ruptures). +- Proposer un bump semver (major/minor/patch) motivé par l’impact. +- Avant tout push ou tag, demander confirmation explicite. + +[validations] + +- Refus si modification sans entrée correspondante dans CHANGELOG.md. +- Cohérence entre CHANGELOG.md, docs/RELEASE_PLAN.md et docs/ROADMAP.md. + +[artefacts concernés] + +- CHANGELOG.md, docs/RELEASE_PLAN.md, docs/ROADMAP.md. + +# Versionnage et publication + +[portée] +Gestion sémantique des versions, CHANGELOG, confirmation push/tag. + +[objectifs] + +- Tenir CHANGELOG.md comme source unique de vérité. +- Demander confirmation avant push et tag. + +[directives] + +- À chaque changement significatif, mettre à jour CHANGELOG.md (ajouts, changements, corrections, ruptures). +- Proposer un bump semver (major/minor/patch) motivé par l’impact. +- Avant tout push ou tag, demander confirmation explicite. + +[validations] + +- Refus si modification sans entrée correspondante dans CHANGELOG.md. +- Cohérence entre CHANGELOG.md, docs/RELEASE_PLAN.md et docs/ROADMAP.md. + +[artefacts concernés] + +- CHANGELOG.md, docs/RELEASE_PLAN.md, docs/ROADMAP.md. diff --git a/.cursor/rules/85-release-guard.mdc b/.cursor/rules/85-release-guard.mdc new file mode 100644 index 0000000..827ef9a --- /dev/null +++ b/.cursor/rules/85-release-guard.mdc @@ -0,0 +1,37 @@ +--- +alwaysApply: true +--- + +# Garde de release: tests, documentation, compilation, version, changelog, tag + +[portée] +Contrôler systématiquement avant push/tag: tests verts, docs mises à jour, build OK, alignement numéro de version ↔ changelog ↔ tag git, mise à jour de déploiement, confirmation utilisateur (latest vs wip). + +[objectifs] + +- Empêcher toute publication sans vérifications minimales. +- Exiger la cohérence sémantique (VERSION/TEMPLATE_VERSION ↔ CHANGELOG ↔ tag git). +- Demander explicitement « latest » ou « wip » et appliquer la bonne stratégie. + +[directives] + +- Avant push/tag, exécuter: tests, compilation, lints (si configurés). +- Mettre à jour la documentation et le changelog en conséquence. +- Aligner le fichier de version (VERSION ou TEMPLATE_VERSION), l’entrée CHANGELOG et le tag. +- Demander confirmation utilisateur: `latest` (release stable) ou `wip` (travail en cours). + - latest: entrée datée dans CHANGELOG, version stable, tag `vX.Y.Z`. + - wip: suffixe `-wip` recommandé dans version/tag (ex: `vX.Y.Z-wip.N`). +- Mettre à jour le déploiement après publication (si pipeline défini), sinon documenter l’étape. + +[validations] + +- Refuser push/tag si: + - tests/compilation échouent, + - CHANGELOG non mis à jour, + - VERSION/TEMPLATE_VERSION absent ou incohérent, + - release type non fourni (ni latest, ni wip). + +[artefacts concernés] + +- CHANGELOG.md, VERSION ou TEMPLATE_VERSION, docs/**, .gitea/workflows/**, scripts/**. + diff --git a/.cursor/rules/90-gitea-and-oss.mdc b/.cursor/rules/90-gitea-and-oss.mdc new file mode 100644 index 0000000..f9da399 --- /dev/null +++ b/.cursor/rules/90-gitea-and-oss.mdc @@ -0,0 +1,59 @@ +--- +alwaysApply: true +--- + +# Open source et Gitea + +[portée] +Conformité open source, templates Gitea, CI. + +[objectifs] + +- Préparer chaque projet pour un dépôt Gitea (git.4nkweb.com). +- Maintenir les fichiers de gouvernance et la CI. + +[directives] + +- Vérifier la présence et l’actualité de : LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md, OPEN_SOURCE_CHECKLIST.md. +- Maintenir .gitea/ : + - ISSUE_TEMPLATE/bug_report.md, feature_request.md + - PULL_REQUEST_TEMPLATE.md + - workflows/ci.yml +- Documenter dans docs/GITEA_SETUP.md la configuration distante et les permissions. + +[validations] + +- Refus si un des fichiers « gouvernance/CI » manque. +- Cohérence entre docs/OPEN_SOURCE_CHECKLIST.md et l’état du repo. + +[artefacts concernés] + +- .gitea/**, docs/GITEA_SETUP.md, docs/OPEN_SOURCE_CHECKLIST.md. + +# Open source et Gitea + +[portée] +Conformité open source, templates Gitea, CI. + +[objectifs] + +- Préparer chaque projet pour un dépôt Gitea (git.4nkweb.com). +- Maintenir les fichiers de gouvernance et la CI. + +[directives] + +- Vérifier la présence et l’actualité de : LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md, OPEN_SOURCE_CHECKLIST.md. +- Maintenir .gitea/ : + - ISSUE_TEMPLATE/bug_report.md, feature_request.md + - PULL_REQUEST_TEMPLATE.md + - workflows/ci.yml +- Documenter dans docs/GITEA_SETUP.md la configuration distante et les permissions. + +[validations] + +- Refus si un des fichiers « gouvernance/CI » manque. +- Cohérence entre docs/OPEN_SOURCE_CHECKLIST.md et l’état du repo. + +[artefacts concernés] + +- .gitea/**, docs/GITEA_SETUP.md, docs/OPEN_SOURCE_CHECKLIST.md. diff --git a/.cursor/rules/95-triage-and-problem-solving.mdc b/.cursor/rules/95-triage-and-problem-solving.mdc new file mode 100644 index 0000000..4df091a --- /dev/null +++ b/.cursor/rules/95-triage-and-problem-solving.mdc @@ -0,0 +1,53 @@ +--- +alwaysApply: true +--- + +# Tri, diagnostic et résolution de problèmes + +[portée] +Boucle de triage : reproduction, diagnostic, correctif, non-régression. + +[objectifs] + +- Exécuter automatiquement les étapes de résolution. +- Bloquer l’avancement tant que les erreurs ne sont pas corrigées. + +[directives] + +- Étapes obligatoires : reproduction minimale, inspection des logs, bissection des changements, formulation d’hypothèses, tests ciblés, correctif, test de non-régression. +- Lorsque plusieurs hypothèses ont été testées, produire un REX dans archive/ avec liens vers les commits. +- Poser des questions de cohérence fonctionnelle si des ambiguïtés subsistent (contrats d’API, invariants, SLA). + +[validations] + +- Interdiction de clore une tâche si un test échoue ou si une alerte critique subsiste. +- Traçabilité du REX si investigations multiples. + +[artefacts concernés] + +- tests/**, archive/**, docs/TESTING.md, docs/ARCHITECTURE.md. + +# Tri, diagnostic et résolution de problèmes + +[portée] +Boucle de triage : reproduction, diagnostic, correctif, non-régression. + +[objectifs] + +- Exécuter automatiquement les étapes de résolution. +- Bloquer l’avancement tant que les erreurs ne sont pas corrigées. + +[directives] + +- Étapes obligatoires : reproduction minimale, inspection des logs, bissection des changements, formulation d’hypothèses, tests ciblés, correctif, test de non-régression. +- Lorsque plusieurs hypothèses ont été testées, produire un REX dans archive/ avec liens vers les commits. +- Poser des questions de cohérence fonctionnelle si des ambiguïtés subsistent (contrats d’API, invariants, SLA). + +[validations] + +- Interdiction de clore une tâche si un test échoue ou si une alerte critique subsiste. +- Traçabilité du REX si investigations multiples. + +[artefacts concernés] + +- tests/**, archive/**, docs/TESTING.md, docs/ARCHITECTURE.md. diff --git a/.cursor/rules/ruleset-index.md b/.cursor/rules/ruleset-index.md new file mode 100644 index 0000000..e70ef69 --- /dev/null +++ b/.cursor/rules/ruleset-index.md @@ -0,0 +1,16 @@ +# Index des règles .cursor/rules + +- 00-foundations.mdc : règles linguistiques et éditoriales (français, pas d’exemples en base, introduction/conclusion). +- 10-project-structure.mdc : arborescence canonique 4NK_node et garde-fous. +- 20-documentation.mdc : documentation continue, remplacement de « RESUME », INDEX.md. +- 30-testing.mdc : tests (unit, integration, connectivity, performance, external), logs/reports. +- 40-dependencies-and-build.mdc : dépendances, compilation, corrections bloquantes. +- 50-data-csv-models.mdc : CSV avec en-têtes multi-lignes, définition des colonnes. +- 60-office-docs.mdc : lecture .docx via docx2txt + repli. +- 70-frontend-architecture.mdc : React.lazy/Suspense, état global, couche de services. +- 80-versioning-and-release.mdc : CHANGELOG, semver, confirmation push/tag. +- 85-release-guard.mdc : garde de release (tests/doc/build/version/changelog/tag; latest vs wip). +- 90-gitea-and-oss.mdc : fichiers open source, .gitea, CI, Gitea remote. +- 95-triage-and-problem-solving.mdc : boucle de diagnostic, REX, non-régression. + +Ces règles sont conçues pour être ajoutées au contexte de Cursor depuis l’interface (@Cursor Rules) et s’appuient sur le mécanisme de règles projet stockées dans `.cursor/rules/`. :contentReference[oaicite:3]{index=3} diff --git a/.cursorignore b/.cursorignore new file mode 100644 index 0000000..0a387e1 --- /dev/null +++ b/.cursorignore @@ -0,0 +1,26 @@ +# Ignorer les contenus volumineux pour le contexte IA +node_modules/ +dist/ +build/ +coverage/ +.cache/ +.tmp/ +.parcel-cache/ + +# Rapports et logs de tests +tests/logs/ +tests/reports/ + +# Fichiers lourds +**/*.map +**/*.min.* +**/*.wasm +**/*.{png,jpg,jpeg,svg,ico,pdf} + +# Ne pas ignorer .cursor ni AGENTS.md +!/.cursor +!/AGENTS.md + +!.cursor/ + +!AGENTS.md diff --git a/.gitea/ISSUE_TEMPLATE/bug_report.md b/.gitea/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..549ade6 --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,100 @@ +--- +name: Bug Report +about: Signaler un bug pour nous aider à améliorer docv +title: '[BUG] ' +labels: ['bug', 'needs-triage'] +assignees: '' +--- + +> Ce fichier est un modèle (template). Adaptez les champs à votre projet dérivé. + +## 🐛 Description du Bug + +Description claire et concise du problème. + +## 🔄 Étapes pour Reproduire + +1. Aller à '...' +2. Cliquer sur '...' +3. Faire défiler jusqu'à '...' +4. Voir l'erreur + +## ✅ Comportement Attendu + +Description de ce qui devrait se passer. + +## ❌ Comportement Actuel + +Description de ce qui se passe actuellement. + +## 📸 Capture d'Écran + +Si applicable, ajoutez une capture d'écran pour expliquer votre problème. + +## 💻 Informations Système + +- **OS** : [ex: Ubuntu 20.04, macOS 12.0, Windows 11] +- **Docker** : [ex: 20.10.0] +- **Docker Compose** : [ex: 2.0.0] +- **Version docv** : [ex: v1.0.0] +- **Architecture** : [ex: x86_64, ARM64] + +## 📋 Configuration + +### Services Actifs +```bash +docker ps +``` + +### Variables d'Environnement +```bash +# Bitcoin Core +BITCOIN_NETWORK=signet +BITCOIN_RPC_PORT=18443 + +# Blindbit +BLINDBIT_PORT=8000 + +# SDK Relay +SDK_RELAY_PORTS=8090-8095 +``` + +## 📝 Logs + +### Logs Pertinents +``` +Logs pertinents ici +``` + +### Logs d'Erreur +``` +Logs d'erreur ici +``` + +### Logs de Debug +``` +Logs de debug ici (si RUST_LOG=debug) +``` + +## 🔧 Tentatives de Résolution + +- [ ] Redémarrage des services +- [ ] Nettoyage des volumes Docker +- [ ] Vérification de la connectivité réseau +- [ ] Mise à jour des dépendances +- [ ] Vérification de la configuration + +## 📚 Contexte Supplémentaire + +Toute autre information pertinente sur le problème. + +## 🔗 Liens Utiles + +- [Documentation](docs/) +- [Guide de Dépannage](docs/TROUBLESHOOTING.md) +- [Issues Similaires](https://git.4nkweb.com/4nk/4NK_node/issues?q=is%3Aissue+is%3Aopen+label%3Abug) + +--- + +**Merci de votre contribution !** 🙏 + diff --git a/.gitea/ISSUE_TEMPLATE/feature_request.md b/.gitea/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..8d383f6 --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,159 @@ +--- +name: Feature Request +about: Proposer une nouvelle fonctionnalité pour docv +title: '[FEATURE] ' +labels: ['enhancement', 'needs-triage'] +assignees: '' +--- + +> Ce fichier est un modèle (template). Adaptez les champs à votre projet dérivé. + +## 🚀 Résumé + +Description claire et concise de la fonctionnalité souhaitée. + +## 💡 Motivation + +Pourquoi cette fonctionnalité est-elle nécessaire ? Quels problèmes résout-elle ? + +### Problèmes Actuels +- Problème 1 +- Problème 2 +- Problème 3 + +### Avantages de la Solution +- Avantage 1 +- Avantage 2 +- Avantage 3 + +## 🎯 Proposition + +Description détaillée de la fonctionnalité proposée. + +### Fonctionnalités Principales +- [ ] Fonctionnalité 1 +- [ ] Fonctionnalité 2 +- [ ] Fonctionnalité 3 + +### Interface Utilisateur +Description de l'interface utilisateur si applicable. + +### API Changes +Description des changements d'API si applicable. + +## 🔄 Alternatives Considérées + +Autres solutions envisagées et pourquoi elles n'ont pas été choisies. + +### Alternative 1 +- **Description** : ... +- **Pourquoi rejetée** : ... + +### Alternative 2 +- **Description** : ... +- **Pourquoi rejetée** : ... + +## 📊 Impact + +### Impact sur les Utilisateurs +- Impact positif 1 +- Impact positif 2 +- Impact négatif potentiel (si applicable) + +### Impact sur l'Architecture +- Changements nécessaires +- Compatibilité avec l'existant +- Performance + +### Impact sur la Maintenance +- Complexité ajoutée +- Tests nécessaires +- Documentation requise + +## 💻 Exemples d'Utilisation + +### Cas d'Usage 1 +```bash +# Exemple de commande ou configuration +``` + +### Cas d'Usage 2 +```python +# Exemple de code Python +``` + +### Cas d'Usage 3 +```javascript +// Exemple de code JavaScript +``` + +## 🧪 Tests + +### Tests Nécessaires +- [ ] Tests unitaires +- [ ] Tests d'intégration +- [ ] Tests de performance +- [ ] Tests de sécurité +- [ ] Tests de compatibilité + +### Scénarios de Test +- Scénario 1 +- Scénario 2 +- Scénario 3 + +## 📚 Documentation + +### Documentation Requise +- [ ] Guide d'utilisation +- [ ] Documentation API +- [ ] Exemples de code +- [ ] Guide de migration +- [ ] FAQ + +## 🔧 Implémentation + +### Étapes Proposées +1. **Phase 1** : [Description] +2. **Phase 2** : [Description] +3. **Phase 3** : [Description] + +### Estimation de Temps +- **Développement** : X jours/semaines +- **Tests** : X jours/semaines +- **Documentation** : X jours/semaines +- **Total** : X jours/semaines + +### Ressources Nécessaires +- Développeur(s) +- Testeur(s) +- Documentateur(s) +- Infrastructure + +## 🎯 Critères de Succès + +Comment mesurer le succès de cette fonctionnalité ? + +- [ ] Critère 1 +- [ ] Critère 2 +- [ ] Critère 3 + +## 🔗 Liens Utiles + +- [Documentation existante](docs/) +- [Issues similaires](https://git.4nkweb.com/4nk/4NK_node/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement) +- [Roadmap](https://git.4nkweb.com/4nk/4NK_node/projects) +- [Discussions](https://git.4nkweb.com/4nk/4NK_node/issues) + +## 📋 Checklist + +- [ ] J'ai vérifié que cette fonctionnalité n'existe pas déjà +- [ ] J'ai lu la documentation existante +- [ ] J'ai vérifié les issues similaires +- [ ] J'ai fourni des exemples d'utilisation +- [ ] J'ai considéré l'impact sur l'existant +- [ ] J'ai proposé des tests + +--- + +**Merci de votre contribution à l'amélioration de docv !** 🌟 + diff --git a/.gitea/PULL_REQUEST_TEMPLATE.md b/.gitea/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..af7fb18 --- /dev/null +++ b/.gitea/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,184 @@ +# Pull Request - docv + +> Ce fichier est un modèle PR. Adaptez les sections à votre projet dérivé. + +## 📋 Description + +Description claire et concise des changements apportés. + +### Type de Changement +- [ ] 🐛 Bug fix +- [ ] ✨ Nouvelle fonctionnalité +- [ ] 📚 Documentation +- [ ] 🧪 Tests +- [ ] 🔧 Refactoring +- [ ] 🚀 Performance +- [ ] 🔒 Sécurité +- [ ] 🎨 Style/UI +- [ ] 🏗️ Architecture +- [ ] 📦 Build/CI + +### Composants Affectés +- [ ] Bitcoin Core +- [ ] Blindbit +- [ ] SDK Relay +- [ ] Tor +- [ ] Docker/Infrastructure +- [ ] Tests +- [ ] Documentation +- [ ] Scripts + +## 🔗 Issue(s) Liée(s) + +Fixes #(issue) +Relates to #(issue) + +## 🧪 Tests + +### Tests Exécutés +- [ ] Tests unitaires +- [ ] Tests d'intégration +- [ ] Tests de connectivité +- [ ] Tests externes +- [ ] Tests de performance +- [ ] Release Guard local (`RELEASE_TYPE=ci-verify scripts/release/guard.sh`) + +### Commandes de Test +```bash +# Tests complets +./tests/run_all_tests.sh + +# Tests spécifiques +./tests/run_unit_tests.sh +./tests/run_integration_tests.sh +``` + +### Résultats des Tests +``` +Résultats des tests ici +``` + +## 📸 Captures d'Écran + +Si applicable, ajoutez des captures d'écran pour les changements visuels. + +## 🔧 Changements Techniques + +### Fichiers Modifiés +- `fichier1.rs` - Description des changements +- `fichier2.py` - Description des changements +- `docker-compose.yml` - Description des changements + +### Nouveaux Fichiers +- `nouveau_fichier.rs` - Description +- `nouveau_script.sh` - Description + +### Fichiers Supprimés +- `ancien_fichier.rs` - Raison de la suppression + +### Changements de Configuration +```yaml +# Exemple de changement de configuration +service: + new_option: value +``` + +## 📚 Documentation + +### Documentation Mise à Jour +- [ ] README.md +- [ ] docs/INSTALLATION.md +- [ ] docs/USAGE.md +- [ ] docs/API.md +- [ ] docs/ARCHITECTURE.md + +### Nouvelle Documentation +- [ ] Nouveau guide créé +- [ ] Exemples ajoutés +- [ ] API documentée + +## 🔍 Code Review Checklist + +### Code Quality +- [ ] Le code suit les standards du projet +- [ ] Les noms de variables/fonctions sont clairs +- [ ] Les commentaires sont appropriés +- [ ] Pas de code mort ou commenté +- [ ] Gestion d'erreurs appropriée + +### Performance +- [ ] Pas de régression de performance +- [ ] Optimisations appliquées si nécessaire +- [ ] Tests de performance ajoutés + +### Sécurité +- [ ] Pas de vulnérabilités introduites +- [ ] Validation des entrées utilisateur +- [ ] Gestion sécurisée des secrets + +### Tests +- [ ] Couverture de tests suffisante +- [ ] Tests pour les cas d'erreur +- [ ] Tests d'intégration si nécessaire + +### Documentation +- [ ] Code auto-documenté +- [ ] Documentation mise à jour +- [ ] Exemples fournis + +## 🚀 Déploiement + +### Impact sur le Déploiement +- [ ] Aucun impact +- [ ] Migration de données requise +- [ ] Changement de configuration +- [ ] Redémarrage des services + +### Étapes de Déploiement +```bash +# Étapes pour déployer les changements +``` + +## 📊 Métriques + +### Impact sur les Performances +- Temps de réponse : +/- X% +- Utilisation mémoire : +/- X% +- Utilisation CPU : +/- X% + +### Impact sur la Stabilité +- Taux d'erreur : +/- X% +- Disponibilité : +/- X% + +## 🔄 Compatibilité + +### Compatibilité Ascendante +- [ ] Compatible avec les versions précédentes +- [ ] Migration automatique +- [ ] Migration manuelle requise + +### Compatibilité Descendante +- [ ] Compatible avec les futures versions +- [ ] API stable +- [ ] Configuration stable + +## 🎯 Critères de Succès + +- [ ] Critère 1 +- [ ] Critère 2 +- [ ] Critère 3 + +## 📝 Notes Supplémentaires + +Informations supplémentaires importantes pour les reviewers. + +## 🔗 Liens Utiles + +- [Documentation](docs/) +- [Tests](tests/) +- [Issues liées](https://git.4nkweb.com/4nk/4NK_node/issues) + +--- + +**Merci pour votre contribution !** 🙏 + diff --git a/.gitea/workflows/LOCAL_OVERRIDES.yml b/.gitea/workflows/LOCAL_OVERRIDES.yml new file mode 100644 index 0000000..ddec4fe --- /dev/null +++ b/.gitea/workflows/LOCAL_OVERRIDES.yml @@ -0,0 +1,15 @@ +# LOCAL_OVERRIDES.yml — dérogations locales contrôlées (fichier modèle) +overrides: + - path: ".gitea/workflows/ci.yml" + reason: "spécificité d’environnement" + owner: "@maintainer_handle" + expires: "2025-12-31" + - path: "scripts/scripts/auto-ssh-push.sh" + reason: "flux particulier temporaire" + owner: "@maintainer_handle" + expires: "2025-10-01" +policy: + allow_only_listed_paths: true + require_expiry: true + audit_in_ci: true + diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..c3b73e2 --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,371 @@ +# Template CI - docv (ce fichier est un modèle, adaptez selon votre projet) +name: CI - docv + +on: + push: + branches: [ main, develop ] + pull_request: + branches: [ main, develop ] + +env: + RUST_VERSION: '1.70' + DOCKER_COMPOSE_VERSION: '2.20.0' + +jobs: + # Job de vérification du code + code-quality: + name: Code Quality + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ env.RUST_VERSION }} + override: true + + - name: Cache Rust dependencies + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Run clippy + run: | + cd sdk_relay + cargo clippy --all-targets --all-features -- -D warnings + + - name: Run rustfmt + run: | + cd sdk_relay + cargo fmt --all -- --check + + - name: Check documentation + run: | + cd sdk_relay + cargo doc --no-deps + + - name: Check for TODO/FIXME + run: | + if grep -r "TODO\|FIXME" . --exclude-dir=.git --exclude-dir=target; then + echo "Found TODO/FIXME comments. Please address them." + exit 1 + fi + + # Job de tests unitaires + unit-tests: + name: Unit Tests + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ env.RUST_VERSION }} + override: true + + - name: Cache Rust dependencies + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Run unit tests + run: | + cd sdk_relay + cargo test --lib --bins + + - name: Run integration tests + run: | + cd sdk_relay + cargo test --tests + + # Job de tests d'intégration + integration-tests: + name: Integration Tests + runs-on: ubuntu-latest + + services: + docker: + image: docker:24.0.5 + options: >- + --health-cmd "docker info" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 2375:2375 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build Docker images + run: | + docker build -t 4nk-node-bitcoin ./bitcoin + docker build -t 4nk-node-blindbit ./blindbit + docker build -t 4nk-node-sdk-relay -f ./sdk_relay/Dockerfile .. + + - name: Run integration tests + run: | + # Tests de connectivité de base + ./tests/run_connectivity_tests.sh || true + + # Tests d'intégration + ./tests/run_integration_tests.sh || true + + - name: Upload test results + uses: actions/upload-artifact@v3 + if: always() + with: + name: test-results + path: | + tests/logs/ + tests/reports/ + retention-days: 7 + + # Job de tests de sécurité + security-tests: + name: Security Tests + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ env.RUST_VERSION }} + override: true + + - name: Run cargo audit + run: | + cd sdk_relay + cargo audit --deny warnings + + - name: Check for secrets + run: | + # Vérifier les secrets potentiels + if grep -r "password\|secret\|key\|token" . --exclude-dir=.git --exclude-dir=target --exclude=*.md; then + echo "Potential secrets found. Please review." + exit 1 + fi + + - name: Check file permissions + run: | + # Vérifier les permissions sensibles + find . -type f -perm /0111 -name "*.conf" -o -name "*.key" -o -name "*.pem" | while read file; do + if [[ $(stat -c %a "$file") != "600" ]]; then + echo "Warning: $file has insecure permissions" + fi + done + + # Job de build et test Docker + docker-build: + name: Docker Build & Test + runs-on: ubuntu-latest + + services: + docker: + image: docker:24.0.5 + options: >- + --health-cmd "docker info" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 2375:2375 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and test Bitcoin Core + run: | + docker build -t 4nk-node-bitcoin:test ./bitcoin + docker run --rm 4nk-node-bitcoin:test bitcoin-cli --version + + - name: Build and test Blindbit + run: | + docker build -t 4nk-node-blindbit:test ./blindbit + docker run --rm 4nk-node-blindbit:test --version || true + + - name: Build and test SDK Relay + run: | + docker build -t 4nk-node-sdk-relay:test -f ./sdk_relay/Dockerfile .. + docker run --rm 4nk-node-sdk-relay:test --version || true + + - name: Test Docker Compose + run: | + docker-compose config + docker-compose build --no-cache + + # Job de tests de documentation + documentation-tests: + name: Documentation Tests + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Check markdown links + run: | + # Vérification basique des liens markdown + find . -name "*.md" -exec grep -l "\[.*\](" {} \; | while read file; do + echo "Checking links in $file" + done + + - name: Check documentation structure + run: | + # Vérifier la présence des fichiers de documentation essentiels + required_files=( + "README.md" + "LICENSE" + "CONTRIBUTING.md" + "CHANGELOG.md" + "CODE_OF_CONDUCT.md" + "SECURITY.md" + "docs/INDEX.md" + "docs/INSTALLATION.md" + "docs/USAGE.md" + ) + + for file in "${required_files[@]}"; do + if [[ ! -f "$file" ]]; then + echo "Missing required documentation file: $file" + exit 1 + fi + done + + - name: Validate documentation + run: | + echo "Validation documentation générique (adaptée au projet)" + + security-audit: + name: Security Audit + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Ensure scripts executable + run: | + chmod +x scripts/security/audit.sh || true + - name: Run template security audit + run: | + if [ -f scripts/security/audit.sh ]; then + ./scripts/security/audit.sh + else + echo "No security audit script (ok)" + fi + + # Job de release guard (cohérence release) + release-guard: + name: Release Guard + runs-on: ubuntu-latest + needs: [code-quality, unit-tests, documentation-tests, security-audit] + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Ensure guard scripts are executable + run: | + chmod +x scripts/release/guard.sh || true + chmod +x scripts/checks/version_alignment.sh || true + + - name: Version alignment check + run: | + if [ -f scripts/checks/version_alignment.sh ]; then + ./scripts/checks/version_alignment.sh + else + echo "No version alignment script (ok)" + fi + + docker-build: + name: Docker Build + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Build Docker image + run: | + docker build -t docv:latest . + + - name: Release guard (CI verify) + env: + RELEASE_TYPE: ci-verify + run: | + if [ -f scripts/release/guard.sh ]; then + ./scripts/release/guard.sh + else + echo "No guard script (ok)" + fi + + # Job de tests de performance + performance-tests: + name: Performance Tests + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ env.RUST_VERSION }} + override: true + + - name: Run performance tests + run: | + cd sdk_relay + cargo test --release --test performance_tests || true + + - name: Check memory usage + run: | + # Tests de base de consommation mémoire + echo "Performance tests completed" + + # Job de notification + notify: + name: Notify + runs-on: ubuntu-latest + needs: [code-quality, unit-tests, integration-tests, security-tests, docker-build, documentation-tests] + if: always() + + steps: + - name: Notify success + if: needs.code-quality.result == 'success' && needs.unit-tests.result == 'success' && needs.integration-tests.result == 'success' && needs.security-tests.result == 'success' && needs.docker-build.result == 'success' && needs.documentation-tests.result == 'success' + run: | + echo "✅ All tests passed successfully!" + + - name: Notify failure + if: needs.code-quality.result == 'failure' || needs.unit-tests.result == 'failure' || needs.integration-tests.result == 'failure' || needs.security-tests.result == 'failure' || needs.docker-build.result == 'failure' || needs.documentation-tests.result == 'failure' + run: | + echo "❌ Some tests failed!" + exit 1 diff --git a/.gitea/workflows/template-sync.yml b/.gitea/workflows/template-sync.yml new file mode 100644 index 0000000..bd5500d --- /dev/null +++ b/.gitea/workflows/template-sync.yml @@ -0,0 +1,40 @@ +# .gitea/workflows/template-sync.yml — synchronisation et contrôles d’intégrité (fichier modèle) +name: 4NK Template Sync +on: + schedule: # planification régulière + - cron: "0 4 * * 1" # exécution hebdomadaire (UTC) + workflow_dispatch: {} # déclenchement manuel + +jobs: + check-and-sync: + runs-on: ubuntu-latest + steps: + - name: Lire TEMPLATE_VERSION et .4nk-sync.yml + # Doit charger ref courant, source_repo et périmètre paths + + - name: Récupérer la version publiée du template/4NK_rules + # Doit comparer TEMPLATE_VERSION avec ref amont + + - name: Créer branche de synchronisation si divergence + # Doit créer chore/template-sync- et préparer un commit + + - name: Synchroniser les chemins autoritatifs + # Doit mettre à jour .cursor/**, .gitea/**, AGENTS.md, scripts/**, docs/SSH_UPDATE.md + + - name: Contrôles post-sync (bloquants) + # 1) Vérifier présence et exécutable des scripts/*.sh + # 2) Vérifier mise à jour CHANGELOG.md et docs/INDEX.md + # 3) Vérifier docs/SSH_UPDATE.md si scripts/** a changé + # 4) Vérifier absence de secrets en clair dans scripts/** + # 5) Vérifier manifest_checksum si publié + + - name: Tests, lint, sécurité statique + # Doit exiger un état vert + + - name: Ouvrir PR de synchronisation + # Titre: "[template-sync] chore: aligner .cursor/.gitea/AGENTS.md/scripts" + # Doit inclure résumé des fichiers modifiés et la version appliquée + + - name: Mettre à jour TEMPLATE_VERSION (dans PR) + # Doit remplacer la valeur par la ref appliquée + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d94bffa --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# next.js +/.next/ +/out/ + +# production +/build + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts +!.cursor/ + +!AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..8c9738b --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,275 @@ +# AGENTS.md + +## Table des matières +- [Introduction](#introduction) +- [Principes communs](#principes-communs) +- [Agents fondamentaux](#agents-fondamentaux) +- [Agents spécialisés documentation](#agents-spécialisés-documentation) +- [Agents spécialisés tests](#agents-spécialisés-tests) +- [Agents techniques](#agents-techniques) +- [Agents frontend](#agents-frontend) +- [Agents open source et CI](#agents-open-source-et-ci) +- [Agents de synchronisation et dérogations](#agents-de-synchronisation-et-d%C3%A9rogations) +- [Matrice de coordination](#matrice-de-coordination) +- [Conclusion](#conclusion) + +--- + +## Introduction +Ce document définit les agents, leurs rôles et leurs responsabilités dans le projet `4NK/4NK_node` et, par extension, tout dépôt dérivé de `4NK_project_template`. +Il impose une coordination stricte entre code, documentation, tests, dépendances, CI/CD, synchronisation de template et gouvernance open source. +Les règles opérationnelles détaillées sont précisées dans `.cursor/rules/` (notamment `41-ssh-automation.mdc` et `42-template-sync.mdc`). + +--- + +## Principes communs +- Langue exclusive : français. +- Pas d’exemples de code applicatif injectés dans la base. +- Toute contribution doit contenir une introduction et/ou une conclusion. +- Interdiction de secrets en clair dans le dépôt. +- Confirmation nécessaire avant `push` et `tag`. +- Toute modification impactant des éléments normatifs doit mettre à jour la documentation et le changelog. + - Le flux de publication applique un garde de release (tests/doc/build/alignement version/changelog/tag, latest vs wip). + +--- + +## Agents fondamentaux + +### Agent Fondation (Responsable) +**Missions** +- Garantir la conformité éditoriale : français, pas d’exemples applicatifs, introduction/conclusion. +- Vérifier la cohérence terminologique. + +**Artefacts** +- Tous fichiers. + +--- + +### Agent Structure (Responsable) +**Missions** +- Maintenir l’arborescence canonique (incluant `.cursor/`, `.gitea/`, `scripts/`, `docs/SSH_UPDATE.md`). +- Archiver le contenu obsolète dans `archive/` avec métadonnées. +- Interdire toute suppression non tracée. + +**Artefacts** +- `archive/`, `docs/**`, `tests/**`, `.cursor/**`, `.gitea/**`, `scripts/**`, `CHANGELOG.md`. + +--- + +## Agents spécialisés documentation + +### Agent Documentation (Responsable) +**Missions** +- Mettre à jour `docs/**` selon l’impact des changements. +- Tenir `docs/INDEX.md` comme table des matières centrale. +- Produire des REX techniques dans `archive/` en cas d’investigations multiples. + +**Artefacts** +- `docs/**`, `README.md`, `archive/**`. + +--- + +### Agent Données CSV (Responsable) +**Missions** +- Traiter les CSV comme source des modèles de données (en-têtes multi-lignes inclus). +- Exiger une définition complète de toutes les colonnes. +- Corriger et documenter les incohérences de types. + +**Artefacts** +- `docs/API.md`, `docs/ARCHITECTURE.md`, `docs/USAGE.md`. + +--- + +### Agent Documents bureautiques (Consulté) +**Missions** +- Lire `.docx` via `docx2txt`; proposer des alternatives en cas d’échec. +- Documenter les imports dans `docs/INDEX.md`. + +**Artefacts** +- `docs/**`, `archive/**`. + +--- + +## Agents spécialisés tests + +### Agent Tests (Responsable) +**Missions** +- Couvrir `unit`, `integration`, `connectivity`, `performance`, `external`. +- Gérer `tests/logs` et `tests/reports`. +- Exiger des tests verts avant commit. + +**Artefacts** +- `tests/**`, `docs/TESTING.md`. + +--- + +### Agent Performance (Consulté) +**Missions** +- Réaliser des benchmarks reproductibles. +- Valider l’impact performance avant fusion. + +**Artefacts** +- `tests/performance/`, `tests/reports/`, `docs/TESTING.md`. + +--- + +## Agents techniques + +### Agent Dépendances (Responsable) +**Missions** +- Ajouter les dépendances manquantes lorsque justifié. +- Vérifier les dernières versions stables. +- Documenter les impacts dans `ARCHITECTURE.md`, `CONFIGURATION.md`, `CHANGELOG.md`. + +**Artefacts** +- `docs/ARCHITECTURE.md`, `docs/CONFIGURATION.md`, `CHANGELOG.md`. + +--- + +### Agent Compilation (Responsable) +**Missions** +- Compiler très régulièrement et aux étapes critiques. +- Bloquer toute progression en cas d’erreurs de build/runtime. + +**Artefacts** +- Artefacts de build, scripts d’outillage. + +--- + +### Agent Résolution (Responsable) +**Missions** +- Conduire la boucle de diagnostic complète : reproduction minimale, logs, bissection, hypothèses, tests ciblés, correctif, non-régression. +- Produire un REX quand plusieurs hypothèses ont été testées. + +**Artefacts** +- `tests/**`, `archive/**` + +--- + +### Agent SSH & scripts (Responsable) +**Missions** +- Garantir la présence et l’usage correct de `scripts/auto-ssh-push.sh`, `scripts/init-ssh-env.sh`, `scripts/setup-ssh-ci.sh`. +- Assurer permissions d’exécution, idempotence, journalisation non sensible, gestion d’erreurs robuste. +- Interdire secrets en clair, gérer via secrets CI et variables d’environnement. +- Exiger la mise à jour de `docs/SSH_UPDATE.md` à toute évolution des scripts ou des flux SSH. + +**Artefacts** +- `scripts/**`, `.gitea/workflows/ci.yml`, `docs/SSH_UPDATE.md`, `docs/CONFIGURATION.md`, `CHANGELOG.md`. + +--- + +## Agents frontend + +### Agent Frontend (Responsable) +**Missions** +- Mettre en place `React.lazy`/`Suspense` (code splitting). +- Centraliser l’état (Redux ou Context API). +- Abstraire les services de données. + +**Artefacts** +- `docs/ARCHITECTURE.md`, `docs/TESTING.md`. + +--- + +## Agents open source et CI + +### Agent Open Source (Responsable) +**Missions** +- Maintenir : `LICENSE`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `docs/OPEN_SOURCE_CHECKLIST.md`. +- Vérifier l’alignement continu avec `4NK_node`. + +**Artefacts** +- Fichiers de gouvernance cités ci-dessus. + +--- + +### Agent Gitea (Responsable) +**Missions** +- Garantir `.gitea/ISSUE_TEMPLATE/*`, `PULL_REQUEST_TEMPLATE.md`, `.gitea/workflows/ci.yml`. +- Documenter la configuration distante dans `docs/GITEA_SETUP.md`. +- Déclencher les étapes CI pertinentes (tests, lint, sécurité, vérifs `scripts/`). + +**Artefacts** +- `.gitea/**`, `docs/GITEA_SETUP.md`. + +--- + +### Agent Versionnage (Responsable) +**Missions** +- Tenir `CHANGELOG.md` comme source unique de vérité. +- Proposer un bump sémantique justifié. +- Demander confirmation avant push et tag. + - Orchestrer le `release-guard` (CI + scripts) et consigner latest vs wip. + +**Artefacts** +- `CHANGELOG.md`, `docs/RELEASE_PLAN.md`, `docs/ROADMAP.md`. + +--- + +### Agent Sécurité (Responsable) +**Missions** +- Mettre en place et exécuter `scripts/security/audit.sh` (npm audit, cargo audit si applicable, scan de secrets). +- Interdire les secrets en clair; assurer la rotation des secrets CI. +- Vérifier permissions et non‑exposition d’endpoints privés. +- Bloquer la release si l’audit échoue (intégré au `release-guard`). + +**Artefacts** +- `scripts/security/audit.sh`, `.gitea/workflows/ci.yml` (job `security-audit`), `docs/SECURITY_AUDIT.md`, `SECURITY.md`. + +--- + +## Agents de synchronisation et dérogations + +### Agent Synchronisation de template (Accountable) +**Références** +- `.4nk-sync.yml` (manifeste), `TEMPLATE_VERSION` (pointeur), `.gitea/workflows/template-sync.yml` (CI dédiée). +- Règles Cursor : `.cursor/rules/42-template-sync.mdc` et `.cursor/rules/10-project-structure.mdc`. + +**Missions** +- Assurer l’alignement automatique sur le template pour : `.cursor/**`, `.gitea/**`, `AGENTS.md`, `scripts/**`, `docs/SSH_UPDATE.md`. +- Déclencher/valider la PR `[template-sync]` créée par la CI. +- Exiger la mise à jour de `CHANGELOG.md` et `docs/INDEX.md` après synchronisation. +- Vérifier l’intégrité (`manifest_checksum`, checksums de fichiers si publiés), les permissions, l’absence de secrets. +- Mettre à jour `TEMPLATE_VERSION` dans la PR. + +**Artefacts** +- `.4nk-sync.yml`, `TEMPLATE_VERSION`, `.cursor/**`, `.gitea/**`, `AGENTS.md`, `scripts/**`, `docs/SSH_UPDATE.md`, `CHANGELOG.md`. + +--- + +### Agent Dérogations locales (Responsable) +**Références** +- `LOCAL_OVERRIDES.yml` (facultatif, mais recommandé). + +**Missions** +- Enregistrer toute divergence locale dans le périmètre synchronisé (path, raison, propriétaire, échéance). +- Faire respecter : seules les dérogations listées et non expirées sont tolérées par la CI. +- Auditer périodiquement et résorber les dérogations. + +**Artefacts** +- `LOCAL_OVERRIDES.yml`, `CHANGELOG.md` (mentionner les dérogations significatives). + +--- + +## Matrice de coordination + +| Type de changement | Agents impliqués | Artefacts principaux | Validation obligatoire | +|----------------------------------|----------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------|------------------------| +| Ajout de fonctionnalité | Documentation, Tests, Dépendances, Frontend | `docs/API.md`, `docs/USAGE.md`, `docs/ARCHITECTURE.md`, `tests/unit`, `tests/integration`, `CHANGELOG.md` (*Added*) | Oui | +| Correction de bug | Résolution, Tests, Documentation | `tests/unit`, `docs/TESTING.md`, `archive/` (REX si nécessaire), `CHANGELOG.md` (*Fixed*) | Oui | +| Refactorisation / amélioration | Structure, Documentation, Compilation | `docs/ARCHITECTURE.md`, `archive/`, `CHANGELOG.md` (*Changed*) | Oui | +| Dépendance ajoutée/mise à jour | Dépendances, Compilation, Documentation | `docs/ARCHITECTURE.md`, `docs/CONFIGURATION.md`, `CHANGELOG.md` (*Dependencies*) | Oui | +| Données CSV modifiées | Données CSV, Documentation, Tests | `docs/API.md`, `docs/ARCHITECTURE.md`, `docs/USAGE.md`, `tests/unit`, `CHANGELOG.md` (*Data model update*) | Oui | +| Migration / breaking change | Documentation, Tests, Résolution, Versionnage | `docs/MIGRATION.md`, `docs/INSTALLATION.md`, `docs/RELEASE_PLAN.md`, `docs/ROADMAP.md`, `tests/integration`, `CHANGELOG.md` (*Breaking*) | Oui | +| Sécurité / audit | Documentation, Tests, Open Source, Sécurité proactive | `docs/SECURITY_AUDIT.md`, `tests/external`, `tests/connectivity`, `CHANGELOG.md` (*Security*) | Oui | +| Préparation open source / CI | Open Source, Gitea, Versionnage, Documentation communautaire, Contributeurs externes | `.gitea/**`, `docs/GITEA_SETUP.md`, `docs/OPEN_SOURCE_CHECKLIST.md`, `CHANGELOG.md` (*CI/CD* / *Governance*) | Oui | +| Optimisation performance | Performance, Tests, Documentation | `tests/performance`, `tests/reports`, `docs/ARCHITECTURE.md`, `CHANGELOG.md` (*Performance*) | Oui | +| Évolution frontend | Frontend, Documentation, Tests | `docs/ARCHITECTURE.md`, `docs/USAGE.md`, `tests/integration`, `CHANGELOG.md` (*Frontend*) | Oui | +| Évolution CI/CD ou scripts SSH | SSH & scripts, Gitea, Versionnage, Documentation | `scripts/**`, `.gitea/workflows/ci.yml`, `docs/SSH_UPDATE.md`, `docs/CONFIGURATION.md`, `CHANGELOG.md` (*CI/CD*) | Oui | +| **Synchronisation de template** | **Synchronisation de template**, Gitea, Versionnage, Structure, Documentation, SSH & scripts | `.4nk-sync.yml`, `TEMPLATE_VERSION`, `.cursor/**`, `.gitea/**`, `AGENTS.md`, `scripts/**`, `docs/SSH_UPDATE.md`, `CHANGELOG.md` | **Oui** | +| Dérogation locale contrôlée | Dérogations locales, Gitea, Synchronisation de template, Versionnage | `LOCAL_OVERRIDES.yml`, `CHANGELOG.md` (mention), CI tolérante uniquement sur chemins listés et non expirés | Oui | + +--- + +## Conclusion +Ce `AGENTS.md` mis à jour introduit l’**Agent Synchronisation de template** et l’**Agent Dérogations locales**, renforce l’**Agent SSH & scripts**, et rattache l’ensemble aux règles Cursor et à la CI Gitea. La matrice de coordination formalise les validations obligatoires pour chaque type de changement, garantissant cohérence structurelle, qualité documentaire, sécurité, traçabilité et stabilité à long terme sur tous les projets issus de `4NK_project_template`. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..cc85a54 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog - docv + +## [Unreleased] + + +## [0.1.0] - 2025-08-27 +### Changed +- Release latest (sécurité/CI/docs). diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..e0da3d7 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,194 @@ +# 🚀 Guide de déploiement DocV avec envoi d'emails + +## 📋 Prérequis + +### 1. Variables d'environnement +Configurez ces variables sur votre plateforme de déploiement : + +\`\`\`env +SMTP_HOST=votre-serveur-smtp +SMTP_PORT=587 +SMTP_SECURE=false +SMTP_USER=votre-email@domaine.com +SMTP_PASSWORD=votre-mot-de-passe-application +SMTP_FROM=votre-email@domaine.com +\`\`\` + +⚠️ **Important** : Utilisez toujours des mots de passe d'application, jamais vos mots de passe principaux. + +## 🌐 Déploiement sur Vercel + +### 1. Installation Vercel CLI +\`\`\`bash +npm i -g vercel +\`\`\` + +### 2. Configuration des variables +\`\`\`bash +vercel env add SMTP_HOST +vercel env add SMTP_PORT +vercel env add SMTP_SECURE +vercel env add SMTP_USER +vercel env add SMTP_PASSWORD +vercel env add SMTP_FROM +\`\`\` + +### 3. Déploiement +\`\`\`bash +vercel --prod +\`\`\` + +## 🔧 Déploiement sur Netlify + +### 1. Variables d'environnement +Dans le dashboard Netlify : +- Site settings > Environment variables +- Ajoutez toutes les variables SMTP + +### 2. Build settings +\`\`\`toml +# netlify.toml +[build] + command = "npm run build" + publish = ".next" + +[build.environment] + NODE_VERSION = "18" +\`\`\` + +## 🐳 Déploiement Docker + +### 1. Dockerfile +\`\`\`dockerfile +FROM node:18-alpine + +WORKDIR /app +COPY package*.json ./ +RUN npm ci --only=production + +COPY . . +RUN npm run build + +EXPOSE 3000 +CMD ["npm", "start"] +\`\`\` + +### 2. Variables d'environnement +\`\`\`bash +docker run -d \ + -p 3000:3000 \ + -e SMTP_HOST=votre-smtp-host \ + -e SMTP_PORT=587 \ + -e SMTP_USER=votre-email@domaine.com \ + -e SMTP_PASSWORD=votre-mot-de-passe \ + -e SMTP_FROM=votre-email@domaine.com \ + docv-app +\`\`\` + +## ✅ Test de l'envoi d'emails + +### 1. Vérification des variables +\`\`\`bash +# Sur votre serveur +echo $SMTP_HOST +echo $SMTP_USER +\`\`\` + +### 2. Test des formulaires +- Accédez à \`/contact\` +- Remplissez et envoyez le formulaire +- Vérifiez les logs serveur +- Vérifiez la réception dans votre boîte email + +## 🔍 Debugging + +### 1. Logs serveur +\`\`\`bash +# Vercel +vercel logs + +# Netlify +netlify logs + +# Docker +docker logs container-name +\`\`\` + +### 2. Test SMTP manuel +\`\`\`javascript +// test-smtp.js +const nodemailer = require('nodemailer'); + +const transporter = nodemailer.createTransport({ + host: process.env.SMTP_HOST, + port: process.env.SMTP_PORT, + secure: process.env.SMTP_SECURE === 'true', + auth: { + user: process.env.SMTP_USER, + pass: process.env.SMTP_PASSWORD, + }, +}); + +transporter.sendMail({ + from: process.env.SMTP_FROM, + to: 'test@example.com', + subject: 'Test SMTP', + text: 'Test de configuration SMTP' +}).then(() => { + console.log('✅ SMTP fonctionne'); +}).catch(err => { + console.error('❌ Erreur SMTP:', err); +}); +\`\`\` + +## 🔐 Sécurité + +### 1. Variables d'environnement +- ✅ Jamais dans le code source +- ✅ Configurées sur la plateforme de déploiement +- ✅ Différentes par environnement (dev/prod) + +### 2. Mots de passe d'application +- ✅ Utilisez des mots de passe d'application +- ✅ Pas les mots de passe principaux des comptes +- ✅ Révocables si compromis + +## 📧 Configuration par fournisseur + +### Protonmail +\`\`\`env +SMTP_HOST=smtp.protonmail.ch +SMTP_PORT=587 +SMTP_SECURE=false +\`\`\` + +### Gmail +\`\`\`env +SMTP_HOST=smtp.gmail.com +SMTP_PORT=587 +SMTP_SECURE=false +\`\`\` + +### Serveur SMTP dédié +\`\`\`env +SMTP_HOST=mail.votre-domaine.com +SMTP_PORT=587 +SMTP_SECURE=false +\`\`\` + +## 🎯 Résultat attendu + +Une fois déployé avec les bonnes variables : +- ✅ Formulaires fonctionnels +- ✅ Emails HTML formatés +- ✅ Réception dans votre boîte email +- ✅ Logs de confirmation +- ✅ Gestion d'erreurs robuste + +## 📞 Support + +En cas de problème : +1. Vérifiez les variables d'environnement +2. Consultez les logs serveur +3. Testez la configuration SMTP manuellement +4. Vérifiez les paramètres de votre fournisseur email diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8bf23a3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +# Multi-stage build for Debian-based Node runtime +FROM node:20-bookworm-slim AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci || npm install +COPY . . +RUN npm run build || npm run build:prod || true + +FROM node:20-bookworm-slim +WORKDIR /app +ENV NODE_ENV=production +COPY --from=builder /app . +EXPOSE 3000 +CMD ["npm","run","start","--if-present"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..c5cc353 --- /dev/null +++ b/README.md @@ -0,0 +1,372 @@ +# 🛡️ DocV - GED Souveraine et Sécurisée + +> **Une approche révolutionnaire de la gestion documentaire avec sécurité, souveraineté et conformité garanties.** + +[![Version](https://img.shields.io/badge/version-0.1.0-blue.svg)](VERSION) +[![Next.js](https://img.shields.io/badge/Next.js-15.2.4-black.svg)](https://nextjs.org/) +[![TypeScript](https://img.shields.io/badge/TypeScript-5.0-blue.svg)](https://www.typescriptlang.org/) +[![Tailwind CSS](https://img.shields.io/badge/Tailwind%20CSS-4.1.9-38B2AC.svg)](https://tailwindcss.com/) +[![License](https://img.shields.io/badge/license-Private-red.svg)](#license) + +## 📋 Table des Matières + +- [🎯 Vue d'ensemble](#-vue-densemble) +- [✨ Fonctionnalités](#-fonctionnalités) +- [🚀 Installation Rapide](#-installation-rapide) +- [⚙️ Configuration](#️-configuration) +- [🔧 Commandes de Développement](#-commandes-de-développement) +- [📚 Documentation](#-documentation) +- [🏗️ Architecture](#️-architecture) +- [🔒 Sécurité](#-sécurité) +- [🤝 Contribution](#-contribution) +- [📞 Support](#-support) + +## 🎯 Vue d'ensemble + +**DocV** est une plateforme de gestion documentaire (GED) révolutionnaire qui combine : + +- **🔐 Authentification cryptographique** sans mots de passe +- **🤖 IA embarquée** pour l'OCR et la classification +- **🌐 Architecture souveraine** sans dépendance cloud +- **⚡ Interface conversationnelle** pour le suivi des dossiers +- **🔗 Ancrage blockchain** pour la traçabilité + +### 🎯 Cas d'Usage Principaux + +- **Entreprises** : Gestion documentaire sécurisée +- **Notaires** : Échanges documentaires via lecoffre.io +- **Secteur public** : Conformité et souveraineté des données +- **Éditeurs** : Intégration marque blanche + +## ✨ Fonctionnalités + +### 🔑 Authentification Ultra-Simplifiée +- ✅ Aucun mot de passe requis +- ✅ Aucun OTP ou code SMS +- ✅ Aucune application mobile +- ✅ Identité auto-générée et auto-portée + +### 🤖 Intelligence Artificielle Locale +- ✅ OCR automatique des documents +- ✅ Classification intelligente +- ✅ Extraction de données +- ✅ Interface conversationnelle +- ✅ Traitements 100% locaux + +### 🛡️ Sécurité de Bout en Bout +- ✅ Chiffrement natif +- ✅ Aucune interface admin exposée +- ✅ Aucun serveur d'identité +- ✅ Aucune dépendance cloud +- ✅ Conformité RGPD, ISO 27001, SecNumCloud + +### 🌐 Architecture Souveraine +- ✅ Déploiement local +- ✅ Migration automatisée +- ✅ Compatible bases existantes +- ✅ APIs souveraines +- ✅ Accompagnement personnalisé + +## 🚀 Installation Rapide + +### 📋 Prérequis + +- **Node.js** : Version 18.0+ (recommandé 20.x) +- **npm** ou **pnpm** : Gestionnaire de paquets +- **Git** : Pour le clonage du repository + +### 1️⃣ Cloner le Repository + +```bash +# Cloner le projet +git clone +cd docv + +# Installer les dépendances +npm install +# ou +pnpm install +``` + +### 2️⃣ Configuration d'Environnement + +```bash +# Créer le fichier d'environnement +cp .env.example .env.local + +# Éditer les variables d'environnement +nano .env.local +``` + +**Variables essentielles :** +```env +# Configuration de base +NEXT_PUBLIC_APP_NAME=DocV +NEXT_PUBLIC_APP_VERSION=0.1.0 + +# Base de données (si applicable) +DATABASE_URL=your_database_url + +# Authentification +NEXTAUTH_SECRET=your_secret_key +NEXTAUTH_URL=http://localhost:3000 + +# Services externes (optionnels) +EMAIL_SERVICE_API_KEY=your_email_api_key +``` + +### 3️⃣ Démarrage en Mode Développement + +```bash +# Démarrer le serveur de développement +npm run dev +# ou +pnpm dev + +# L'application sera disponible sur http://localhost:3000 +``` + +## ⚙️ Configuration + +### 🎨 Configuration de l'Interface + +Le projet utilise **Tailwind CSS** avec des composants **Radix UI** pour une interface moderne et accessible. + +```bash +# Fichier de configuration Tailwind +tailwind.config.js + +# Composants UI personnalisés +components/ui/ +``` + +### 🔧 Configuration TypeScript + +```bash +# Configuration TypeScript +tsconfig.json + +# Types personnalisés +types/ +``` + +### 📱 Configuration Responsive + +L'interface s'adapte automatiquement aux différentes tailles d'écran : +- 📱 Mobile (< 768px) +- 📟 Tablet (768px - 1024px) +- 💻 Desktop (> 1024px) + +## 🔧 Commandes de Développement + +### 🚀 Commandes Principales + +```bash +# Développement +npm run dev # Serveur de développement (port 3000) +npm run build # Build de production +npm run start # Serveur de production +npm run lint # Vérification du code + +# Tests (si configurés) +npm run test # Tests unitaires +npm run test:watch # Tests en mode watch +npm run test:coverage # Tests avec couverture + +# Maintenance +npm run clean # Nettoyer les fichiers temporaires +npm run type-check # Vérification TypeScript +``` + +### 🛠️ Commandes de Maintenance + +```bash +# Mise à jour des dépendances +npm update # Mise à jour des paquets +npm audit # Audit de sécurité +npm audit fix # Correction automatique + +# Gestion des dépendances +npm install # Installer un paquet +npm uninstall # Désinstaller un paquet +npm list # Lister les paquets installés +``` + +### 📦 Commandes de Build + +```bash +# Build de production +npm run build + +# Analyse du bundle +npm run analyze # (si configuré) + +# Build statique +npm run export # (si configuré) +``` + +### 🔍 Commandes de Debug + +```bash +# Logs détaillés +DEBUG=* npm run dev + +# Profiling +npm run dev -- --profile + +# Inspection du bundle +npm run build -- --debug +``` + +## 📚 Documentation + +### 📖 Guides Disponibles + +- **[Installation](docs/INSTALLATION.md)** - Guide d'installation complet +- **[Configuration](docs/CONFIGURATION.md)** - Configuration avancée +- **[Architecture](docs/ARCHITECTURE.md)** - Architecture technique +- **[API](docs/API.md)** - Documentation des APIs +- **[Sécurité](docs/SECURITY_AUDIT.md)** - Audit de sécurité +- **[Utilisation](docs/USAGE.md)** - Guide d'utilisation + +### 🔗 Ressources Externes + +- [Next.js Documentation](https://nextjs.org/docs) +- [Tailwind CSS](https://tailwindcss.com/docs) +- [Radix UI](https://www.radix-ui.com/docs) +- [TypeScript Handbook](https://www.typescriptlang.org/docs/) + +## 🏗️ Architecture + +### 📁 Structure du Projet + +``` +docv/ +├── app/ # Pages et routes Next.js 13+ +│ ├── dashboard/ # Interface utilisateur +│ ├── login/ # Authentification +│ ├── formation/ # Module formation +│ └── contact/ # Contact +├── components/ # Composants réutilisables +│ ├── ui/ # Composants UI de base +│ └── 4nk/ # Composants spécifiques 4NK +├── lib/ # Utilitaires et logique métier +│ ├── 4nk/ # Modules 4NK +│ └── utils.ts # Fonctions utilitaires +├── public/ # Assets statiques +├── styles/ # Styles globaux +└── docs/ # Documentation +``` + +### 🔧 Technologies Utilisées + +| Technologie | Version | Description | +|-------------|---------|-------------| +| **Next.js** | 15.2.4 | Framework React full-stack | +| **React** | 19.1.1 | Bibliothèque UI | +| **TypeScript** | 5.0+ | Typage statique | +| **Tailwind CSS** | 4.1.9 | Framework CSS | +| **Radix UI** | Latest | Composants accessibles | +| **Lucide React** | 0.454.0 | Icônes | +| **Zod** | 3.25.67 | Validation de schémas | + +### 🌐 Architecture de Sécurité + +```mermaid +graph TB + A[Client] --> B[Next.js App] + B --> C[Authentification Cryptographique] + C --> D[Base de Données Locale] + D --> E[Chiffrement Bout en Bout] + E --> F[Ancrage Blockchain] + + G[IA Locale] --> H[Traitement OCR] + H --> I[Classification] + I --> J[Extraction de Données] +``` + +## 🔒 Sécurité + +### 🛡️ Mesures de Sécurité Implémentées + +- ✅ **Authentification sans mot de passe** - Clés cryptographiques locales +- ✅ **Chiffrement bout en bout** - Données protégées en transit et au repos +- ✅ **Aucune interface admin** - Pas d'accès privilégié exposé +- ✅ **Conformité réglementaire** - RGPD, ISO 27001, SecNumCloud +- ✅ **Audit de sécurité** - Voir [SECURITY_AUDIT.md](docs/SECURITY_AUDIT.md) + +### 🔐 Bonnes Pratiques + +1. **Variables d'environnement** - Jamais de secrets en dur +2. **Validation des données** - Schémas Zod pour toutes les entrées +3. **HTTPS obligatoire** - En production uniquement +4. **Audit régulier** - `npm audit` avant chaque déploiement + +## 🤝 Contribution + +### 🚀 Comment Contribuer + +1. **Fork** le repository +2. **Créer** une branche feature (`git checkout -b feature/amazing-feature`) +3. **Commit** vos changements (`git commit -m 'Add amazing feature'`) +4. **Push** vers la branche (`git push origin feature/amazing-feature`) +5. **Ouvrir** une Pull Request + +### 📝 Standards de Code + +- **TypeScript** strict activé +- **ESLint** pour la qualité du code +- **Prettier** pour le formatage +- **Conventional Commits** pour les messages + +### 🧪 Tests + +```bash +# Avant de contribuer, assurez-vous que : +npm run lint # ✅ Pas d'erreurs ESLint +npm run type-check # ✅ Pas d'erreurs TypeScript +npm run build # ✅ Build réussi +``` + +## 📞 Support + +### 🆘 Obtenir de l'Aide + +- **📧 Email** : contact@docv.fr +- **📚 Documentation** : [docs/](docs/) +- **🐛 Issues** : [GitHub Issues](https://github.com/your-org/docv/issues) +- **💬 Discussions** : [GitHub Discussions](https://github.com/your-org/docv/discussions) + +### 🏢 Entreprise + +**4NK** - Pionnier du Web 5.0 +- 🏢 Solutions de souveraineté +- 🔒 Sécurité de bout en bout +- 🌐 Architecture distribuée + +### 📋 Checklist de Support + +Avant de demander de l'aide, vérifiez : + +- [ ] Version de Node.js compatible (18.0+) +- [ ] Dépendances installées (`npm install`) +- [ ] Variables d'environnement configurées +- [ ] Logs d'erreur consultés +- [ ] Documentation parcourue + +--- + +## 📄 Licence + +Ce projet est propriétaire et confidentiel. Tous droits réservés à **4NK**. + +--- + +
+ +**🛡️ DocV - Sécurisez votre entreprise avec la GED simple et souveraine** + +[![4NK](https://img.shields.io/badge/By-4NK-blue.svg)](https://4nkweb.com) +[![Contact](https://img.shields.io/badge/Contact-contact@docv.fr-green.svg)](mailto:contact@docv.fr) + +
diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..b82608c --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +v0.1.0 diff --git a/app/actions/contact.ts b/app/actions/contact.ts new file mode 100644 index 0000000..854ca55 --- /dev/null +++ b/app/actions/contact.ts @@ -0,0 +1,81 @@ +'use server' + +import { sendContactEmail, type ContactFormData } from '@/lib/email' +import { z } from 'zod' + +const contactSchema = z.object({ + nom: z.string().min(1, 'Le nom est requis'), + prenom: z.string().min(1, 'Le prénom est requis'), + email: z.string().email('Email invalide'), + telephone: z.string().optional(), + entreprise: z.string().optional(), + fonction: z.string().optional(), + typeProjet: z.string().optional(), + budget: z.string().optional(), + delai: z.string().optional(), + description: z.string().min(10, 'La description doit contenir au moins 10 caractères'), + objectifs: z.string().optional(), + contraintes: z.string().optional(), + services: z.array(z.string()), + demo: z.boolean(), + accompagnement: z.boolean(), +}) + +export async function submitContactForm(formData: FormData) { + try { + console.log('Traitement formulaire contact') + + // Extraction des données + const rawData = { + nom: (formData.get('nom') as string || '').trim(), + prenom: (formData.get('prenom') as string || '').trim(), + email: (formData.get('email') as string || '').trim(), + telephone: (formData.get('telephone') as string || '').trim() || undefined, + entreprise: (formData.get('entreprise') as string || '').trim() || undefined, + fonction: (formData.get('fonction') as string || '').trim() || undefined, + typeProjet: (formData.get('typeProjet') as string) || undefined, + budget: (formData.get('budget') as string) || undefined, + delai: (formData.get('delai') as string) || undefined, + description: (formData.get('description') as string || '').trim(), + objectifs: (formData.get('objectifs') as string || '').trim() || undefined, + contraintes: (formData.get('contraintes') as string || '').trim() || undefined, + services: formData.getAll('services') as string[], + demo: formData.get('demo') === 'true', + accompagnement: formData.get('accompagnement') === 'true', + } + + // Validation + const validatedData = contactSchema.parse(rawData) + + // Envoi email + const result = await sendContactEmail(validatedData as ContactFormData) + + if (result.success) { + return { + success: true, + message: 'Votre message a été envoyé avec succès. Nous vous recontacterons sous 24h.' + } + } else { + return { + success: false, + message: result.error || 'Une erreur est survenue lors de l\'envoi.' + } + } + + } catch (error: any) { + console.error('Erreur formulaire contact:', error.message) + + if (error instanceof z.ZodError) { + const errorMessages = error.errors.map(e => e.message).join(', ') + return { + success: false, + message: `Données invalides: ${errorMessages}` + } + } + + return { + success: false, + message: 'Une erreur inattendue est survenue.' + } + } +} diff --git a/app/actions/formation.ts b/app/actions/formation.ts new file mode 100644 index 0000000..1c64570 --- /dev/null +++ b/app/actions/formation.ts @@ -0,0 +1,91 @@ +'use server' + +import { sendFormationEmail, type FormationFormData } from '@/lib/email' +import { z } from 'zod' + +const formationSchema = z.object({ + entreprise: z.string().min(1, 'Le nom de l\'entreprise est requis'), + secteur: z.string().optional(), + taille: z.string().optional(), + siret: z.string().optional(), + nom: z.string().min(1, 'Le nom est requis'), + prenom: z.string().min(1, 'Le prénom est requis'), + fonction: z.string().optional(), + email: z.string().email('Email invalide'), + telephone: z.string().optional(), + formations: z.array(z.string()), + modalite: z.string().optional(), + participants: z.string().optional(), + dates: z.string().optional(), + lieu: z.string().optional(), + objectifs: z.string().optional(), + niveau: z.string().optional(), + contraintes: z.string().optional(), + certification: z.boolean(), + support: z.boolean(), + accompagnement: z.boolean(), +}) + +export async function submitFormationForm(formData: FormData) { + try { + console.log('Traitement formulaire formation') + + // Extraction des données + const rawData = { + entreprise: (formData.get('entreprise') as string)?.trim() || '', + secteur: (formData.get('secteur') as string)?.trim() || undefined, + taille: (formData.get('taille') as string) || undefined, + siret: (formData.get('siret') as string)?.trim() || undefined, + nom: (formData.get('nom') as string)?.trim() || '', + prenom: (formData.get('prenom') as string)?.trim() || '', + fonction: (formData.get('fonction') as string)?.trim() || undefined, + email: (formData.get('email') as string)?.trim() || '', + telephone: (formData.get('telephone') as string)?.trim() || undefined, + formations: formData.getAll('formations') as string[], + modalite: (formData.get('modalite') as string) || undefined, + participants: (formData.get('participants') as string) || undefined, + dates: (formData.get('dates') as string)?.trim() || undefined, + lieu: (formData.get('lieu') as string)?.trim() || undefined, + objectifs: (formData.get('objectifs') as string)?.trim() || undefined, + niveau: (formData.get('niveau') as string) || undefined, + contraintes: (formData.get('contraintes') as string)?.trim() || undefined, + certification: formData.get('certification') === 'true', + support: formData.get('support') === 'true', + accompagnement: formData.get('accompagnement') === 'true', + } + + // Validation + const validatedData = formationSchema.parse(rawData) + + // Envoi email + const result = await sendFormationEmail(validatedData as FormationFormData) + + if (result.success) { + return { + success: true, + message: 'Votre demande de devis a été envoyée avec succès. Nous vous recontacterons sous 24h.' + } + } else { + return { + success: false, + message: result.error || 'Une erreur est survenue lors de l\'envoi.' + } + } + + } catch (error: any) { + console.error('Erreur formulaire formation:', error.message) + + if (error instanceof z.ZodError) { + const errorMessages = error.errors.map(e => e.message).join(', ') + return { + success: false, + message: `Données invalides: ${errorMessages}` + } + } + + return { + success: false, + message: 'Une erreur inattendue est survenue.' + } + } +} diff --git a/app/contact/page.tsx b/app/contact/page.tsx new file mode 100644 index 0000000..0a95efc --- /dev/null +++ b/app/contact/page.tsx @@ -0,0 +1,509 @@ +'use client' + +import { useState } from 'react' +import Link from "next/link" +import { Button } from "@/components/ui/button" +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { Badge } from "@/components/ui/badge" +import { Textarea } from "@/components/ui/textarea" +import { Checkbox } from "@/components/ui/checkbox" +import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group" +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" +import { Shield, ArrowLeft, Mail, User, MessageSquare, CheckCircle, Lightbulb, Loader2 } from 'lucide-react' +import { submitContactForm } from '@/app/actions/contact' + +export default function ContactPage() { + const [formData, setFormData] = useState({ + nom: '', + prenom: '', + email: '', + telephone: '', + entreprise: '', + fonction: '', + typeProjet: '', + budget: '', + delai: '', + description: '', + objectifs: '', + contraintes: '', + services: [] as string[], + demo: false, + accompagnement: false + }) + + const [isSubmitting, setIsSubmitting] = useState(false) + const [submitResult, setSubmitResult] = useState<{ success: boolean; message: string } | null>(null) + + const handleServiceChange = (service: string, checked: boolean) => { + if (checked) { + setFormData(prev => ({ + ...prev, + services: [...prev.services, service] + })) + } else { + setFormData(prev => ({ + ...prev, + services: prev.services.filter(s => s !== service) + })) + } + } + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + + // Validation côté client + if (formData.description.trim().length < 10) { + setSubmitResult({ + success: false, + message: 'La description doit contenir au moins 10 caractères.' + }) + return + } + + setIsSubmitting(true) + setSubmitResult(null) + + try { + const formDataToSend = new FormData() + + // Ajout de tous les champs au FormData + Object.entries(formData).forEach(([key, value]) => { + if (key === 'services') { + value.forEach((service: string) => formDataToSend.append('services', service)) + } else if (typeof value === 'boolean') { + formDataToSend.append(key, value.toString()) + } else { + formDataToSend.append(key, value) + } + }) + + const result = await submitContactForm(formDataToSend) + setSubmitResult(result) + + if (result.success) { + // Reset du formulaire en cas de succès + setFormData({ + nom: '', + prenom: '', + email: '', + telephone: '', + entreprise: '', + fonction: '', + typeProjet: '', + budget: '', + delai: '', + description: '', + objectifs: '', + contraintes: '', + services: [], + demo: false, + accompagnement: false + }) + } + } catch (error) { + setSubmitResult({ + success: false, + message: 'Une erreur inattendue est survenue. Veuillez réessayer.' + }) + } finally { + setIsSubmitting(false) + } + } + + if (submitResult?.success) { + return ( +
+ + + + Message envoyé ! + + {submitResult.message} + + + +
+

Prochaines étapes :

+
    +
  • • Un expert DocV vous contactera sous 24h
  • +
  • • Analyse de votre projet et de vos besoins
  • +
  • • Proposition de solution personnalisée
  • +
  • • Planification d'une démonstration si demandée
  • +
+
+
+

+ Contact direct : contact@docv.fr +

+
+ + + + + + +
+
+
+
+
+ ) + } + + return ( +
+ {/* Header */} +
+
+ + + DocV + By 4NK + + + + Retour à l'accueil + +
+
+ +
+
+ {/* Hero */} +
+

+ Contactez-nous pour votre projet +

+

+ Discutons de votre projet de souveraineté numérique. Nos experts vous accompagnent + dans la mise en œuvre de solutions DocV adaptées à vos besoins. +

+
+ + {/* Message d'erreur */} + {submitResult && !submitResult.success && ( +
+

{submitResult.message}

+
+ )} + +
+ {/* Informations Contact */} + + + + + Vos informations + + + Renseignez vos coordonnées pour que nous puissions vous recontacter + + + +
+
+ + setFormData(prev => ({ ...prev, nom: e.target.value }))} + placeholder="Votre nom" + required + /> +
+
+ + setFormData(prev => ({ ...prev, prenom: e.target.value }))} + placeholder="Votre prénom" + required + /> +
+
+
+
+ + setFormData(prev => ({ ...prev, email: e.target.value }))} + placeholder="votre.email@entreprise.com" + required + /> +
+
+ + setFormData(prev => ({ ...prev, telephone: e.target.value }))} + placeholder="01 23 45 67 89" + /> +
+
+
+
+ + setFormData(prev => ({ ...prev, entreprise: e.target.value }))} + placeholder="Nom de votre entreprise" + /> +
+
+ + setFormData(prev => ({ ...prev, fonction: e.target.value }))} + placeholder="Votre fonction" + /> +
+
+
+
+ + {/* Type de projet */} + + + + + Votre projet + + + Décrivez-nous votre projet et vos besoins + + + +
+ + setFormData(prev => ({ ...prev, typeProjet: value }))} + > +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+ + +
+
+ + +
+
+
+
+ + {/* Services souhaités */} + + + Services souhaités + + Sélectionnez les services qui vous intéressent + + + +
+ handleServiceChange('ged-souveraine', checked as boolean)} + /> + +
+
+ handleServiceChange('integration-marque-blanche', checked as boolean)} + /> + +
+
+ handleServiceChange('solutions-open-source', checked as boolean)} + /> + +
+
+ handleServiceChange('formation', checked as boolean)} + /> + +
+
+ handleServiceChange('audit', checked as boolean)} + /> + +
+
+
+ + {/* Description détaillée */} + + + + + Description du projet + + + +
+ +