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/.gitea/ISSUE_TEMPLATE/bug_report.md b/.gitea/.gitea/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..da4e36d --- /dev/null +++ b/.gitea/.gitea/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,97 @@ +--- +name: Bug Report +about: Signaler un bug pour nous aider à améliorer 4NK Node +title: '[BUG] ' +labels: ['bug', 'needs-triage'] +assignees: '' +--- + +## 🐛 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 4NK Node** : [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/.gitea/ISSUE_TEMPLATE/feature_request.md b/.gitea/.gitea/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..6041f4a --- /dev/null +++ b/.gitea/.gitea/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,156 @@ +--- +name: Feature Request +about: Proposer une nouvelle fonctionnalité pour 4NK Node +title: '[FEATURE] ' +labels: ['enhancement', 'needs-triage'] +assignees: '' +--- + +## 🚀 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 4NK Node !** 🌟 diff --git a/.gitea/.gitea/PULL_REQUEST_TEMPLATE.md b/.gitea/.gitea/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..621d01a --- /dev/null +++ b/.gitea/.gitea/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,180 @@ +# Pull Request - 4NK Node + +## 📋 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 + +### 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/.gitea/workflows/LOCAL_OVERRIDES.yml b/.gitea/.gitea/workflows/LOCAL_OVERRIDES.yml new file mode 100644 index 0000000..12c8c45 --- /dev/null +++ b/.gitea/.gitea/workflows/LOCAL_OVERRIDES.yml @@ -0,0 +1,14 @@ +# LOCAL_OVERRIDES.yml — dérogations locales contrôlées +overrides: + - path: ".gitea/workflows/ci.yml" + reason: "spécificité d’environnement" + owner: "@maintainer_handle" + expires: "2025-12-31" + - path: "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/.gitea/workflows/ci.yml b/.gitea/.gitea/workflows/ci.yml new file mode 100644 index 0000000..5dd8de7 --- /dev/null +++ b/.gitea/.gitea/workflows/ci.yml @@ -0,0 +1,345 @@ +name: CI - 4NK Node + +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: | + # Vérifier la cohérence de la documentation + if ! grep -q "4NK Node" README.md; then + echo "README.md should mention '4NK Node'" + exit 1 + fi + + # Job de release guard (cohérence release) + release-guard: + name: Release Guard + runs-on: ubuntu-latest + needs: [code-quality, unit-tests, documentation-tests] + 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 + + - 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/.gitea/workflows/template-sync.yml b/.gitea/.gitea/workflows/template-sync.yml new file mode 100644 index 0000000..e6710df --- /dev/null +++ b/.gitea/.gitea/workflows/template-sync.yml @@ -0,0 +1,39 @@ +# .gitea/workflows/template-sync.yml — synchronisation et contrôles d’intégrité +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: linux + 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/.gitea_template/ISSUE_TEMPLATE/bug_report.md b/.gitea_template/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..0b144dc --- /dev/null +++ b/.gitea_template/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,99 @@ +--- +name: Bug Report +about: Signaler un bug pour nous aider à améliorer 4NK Node +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 4NK Node** : [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_template/ISSUE_TEMPLATE/feature_request.md b/.gitea_template/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..4b8c506 --- /dev/null +++ b/.gitea_template/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,158 @@ +--- +name: Feature Request +about: Proposer une nouvelle fonctionnalité pour 4NK Node +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 4NK Node !** 🌟 diff --git a/.gitea_template/PULL_REQUEST_TEMPLATE.md b/.gitea_template/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..a406182 --- /dev/null +++ b/.gitea_template/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,183 @@ +# Pull Request - 4NK Node + +> 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_template/workflows/LOCAL_OVERRIDES.yml b/.gitea_template/workflows/LOCAL_OVERRIDES.yml new file mode 100644 index 0000000..789bc91 --- /dev/null +++ b/.gitea_template/workflows/LOCAL_OVERRIDES.yml @@ -0,0 +1,14 @@ +# 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_template/workflows/ci.yml b/.gitea_template/workflows/ci.yml new file mode 100644 index 0000000..058515a --- /dev/null +++ b/.gitea_template/workflows/ci.yml @@ -0,0 +1,346 @@ +# Template CI - 4NK Node (ce fichier est un modèle, adaptez selon votre projet) +name: CI - 4NK Node + +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: | + # Vérifier la cohérence de la documentation + if ! grep -q "4NK Node" README.md; then + echo "README.md should mention '4NK Node'" + exit 1 + fi + + # Job de release guard (cohérence release) + release-guard: + name: Release Guard + runs-on: ubuntu-latest + needs: [code-quality, unit-tests, documentation-tests] + 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 + + - 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_template/workflows/template-sync.yml b/.gitea_template/workflows/template-sync.yml new file mode 100644 index 0000000..132c4af --- /dev/null +++ b/.gitea_template/workflows/template-sync.yml @@ -0,0 +1,39 @@ +# .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 index 445011f..4beee5a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ node_modules pkg dist -data \ No newline at end of file +data +!.cursor/ + +!AGENTS.md diff --git a/scripts/checks/version_alignment.sh b/scripts/checks/version_alignment.sh new file mode 100644 index 0000000..d682cf6 --- /dev/null +++ b/scripts/checks/version_alignment.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd)" +cd "$ROOT_DIR" + +version_file="VERSION" +[[ -f TEMPLATE_VERSION ]] && version_file="TEMPLATE_VERSION" + +[[ -f "$version_file" ]] || { echo "Version file missing ($version_file)"; exit 1; } +v=$(tr -d '\r' < "$version_file" | head -n1) +[[ -n "$v" ]] || { echo "Empty version"; exit 1; } + +echo "Version file: $version_file=$v" + +if ! grep -Eq "^## \\[$(echo "$v" | sed 's/^v//')\\]" CHANGELOG.md; then + echo "CHANGELOG entry for $v not found"; exit 1; +fi + +echo "Version alignment OK" diff --git a/scripts/release/guard.sh b/scripts/release/guard.sh new file mode 100644 index 0000000..46fde57 --- /dev/null +++ b/scripts/release/guard.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Release guard script +# Checks: tests, docs updated, compile, version ↔ changelog ↔ tag consistency, release type + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd)" +cd "$ROOT_DIR" + +mode="${RELEASE_TYPE:-ci-verify}" # values: latest | wip | ci-verify + +echo "[release-guard] mode=$mode" + +# 1) Basic presence checks +[[ -f CHANGELOG.md ]] || { echo "CHANGELOG.md manquant"; exit 1; } +version_file="VERSION" +[[ -f TEMPLATE_VERSION ]] && version_file="TEMPLATE_VERSION" +[[ -f "$version_file" ]] || { echo "$version_file manquant"; exit 1; } + +# 2) Extract version +project_version=$(tr -d '\r' < "$version_file" | head -n1 | sed 's/^v//') +[[ -n "$project_version" ]] || { echo "Version vide dans $version_file"; exit 1; } +echo "[release-guard] version=$project_version" + +# 3) Changelog checks +if ! grep -Eq "^## \\[$project_version\\]" CHANGELOG.md; then + if [[ "$mode" == "wip" ]]; then + grep -Eq "^## \\[Unreleased\\]" CHANGELOG.md || { echo "Section [Unreleased] absente du CHANGELOG"; exit 1; } + else + echo "Entrée CHANGELOG pour version $project_version manquante"; exit 1; + fi +fi + +# 4) Tests (optional best-effort) +if [[ -x tests/run_all_tests.sh ]]; then + echo "[release-guard] exécution tests/run_all_tests.sh" + ./tests/run_all_tests.sh || { echo "Tests en échec"; exit 1; } +else + echo "[release-guard] tests absents (ok)" +fi + +# 5) Build/compile (optional based on project) +if [[ -d sdk_relay ]] && command -v cargo >/dev/null 2>&1; then + echo "[release-guard] cargo build (sdk_relay)" + (cd sdk_relay && cargo build --quiet) || { echo "Compilation échouée"; exit 1; } +else + echo "[release-guard] build spécifique non applicable (ok)" +fi + +# 6) Release type handling +case "$mode" in + latest) + ;; + wip) + # En wip, autoriser versions suffixées; pas d’exigence d’entrée datée + ;; + ci-verify) + # En CI, on valide juste la présence de CHANGELOG et version + ;; + *) + echo "RELEASE_TYPE invalide: $mode (latest|wip|ci-verify)"; exit 1; + ;; +esac + +echo "[release-guard] OK" diff --git a/scripts/scripts/auto-ssh-push.sh b/scripts/scripts/auto-ssh-push.sh new file mode 100644 index 0000000..653b59c --- /dev/null +++ b/scripts/scripts/auto-ssh-push.sh @@ -0,0 +1,151 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Script d'automatisation des push SSH (template Linux) +# Utilise automatiquement la clé SSH pour pousser sur le remote courant via SSH. + +GITEA_HOST="${GITEA_HOST:-git.4nkweb.com}" + +echo "🔑 Configuration SSH pour push (template)..." + +# Configuration SSH automatique +echo "⚙️ Configuration Git pour utiliser SSH..." +git config --global url."git@${GITEA_HOST}:".insteadOf "https://${GITEA_HOST}/" + +# Vérifier la configuration SSH +echo "🔍 Vérification de la configuration SSH..." +if ! ssh -T git@"${GITEA_HOST}" 2>&1 | grep -qi "authenticated\|welcome"; then + echo "❌ Échec de l'authentification SSH" + echo "💡 Vérifiez que votre clé SSH est configurée :" + echo " 1. ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_4nk" + echo " 2. Ajouter la clé publique à votre compte Gitea" + echo " 3. ssh-add ~/.ssh/id_ed25519_4nk" + exit 1 +fi + +echo "✅ Authentification SSH réussie" + +# Fonction pour push automatique +auto_push() { + local branch=${1:-$(git branch --show-current)} + local commit_message=${2:-"Auto-commit $(date '+%Y-%m-%d %H:%M:%S')"} + + echo "🚀 Push automatique sur la branche: $branch" + + # Ajouter tous les changements + git add . + + # Ne pas commiter si rien à commiter + if [[ -z "$(git diff --cached --name-only)" ]]; then + echo "ℹ️ Aucun changement indexé. Skip commit/push." + return 0 + fi + + # Commiter avec le message fourni + git commit -m "$commit_message" || true + + # Push avec SSH automatique + echo "📤 Push vers origin/$branch..." + git push origin "$branch" + + echo "✅ Push réussi !" +} + +# Fonction pour push avec message personnalisé +push_with_message() { + local message="$1" + local branch=${2:-$(git branch --show-current)} + + echo "💬 Push avec message: $message" + auto_push "$branch" "$message" +} + +# Fonction pour push rapide (sans message) +quick_push() { + local branch=${1:-$(git branch --show-current)} + auto_push "$branch" +} + +# Fonction pour push sur une branche spécifique +push_branch() { + local branch="$1" + local message=${2:-"Update $branch $(date '+%Y-%m-%d %H:%M:%S')"} + + echo "🌿 Push sur la branche: $branch" + auto_push "$branch" "$message" +} + +# Fonction pour push et merge vers main +push_and_merge() { + local source_branch=${1:-$(git branch --show-current)} + local target_branch=${2:-main} + + echo "🔄 Push et merge $source_branch -> $target_branch" + + # Push de la branche source + auto_push "$source_branch" + + # Indication pour PR manuelle + echo "🔗 Ouvrez une Pull Request sur votre forge pour $source_branch -> $target_branch" +} + +# Fonction pour status et push conditionnel +status_and_push() { + echo "📊 Statut du repository:" + git status --short || true + + if [[ -n $(git status --porcelain) ]]; then + echo "📝 Changements détectés, push automatique..." + auto_push + else + echo "✅ Aucun changement à pousser" + fi +} + +# Menu interactif si aucun argument fourni +if [[ $# -eq 0 ]]; then + echo "🤖 Script de push SSH automatique (template)" + echo "" + echo "Options disponibles:" + echo " auto-ssh-push.sh quick - Push rapide" + echo " auto-ssh-push.sh message \"Mon message\" - Push avec message" + echo " auto-ssh-push.sh branch nom-branche - Push sur branche spécifique" + echo " auto-ssh-push.sh merge [source] [target] - Push et préparation merge" + echo " auto-ssh-push.sh status - Status et push conditionnel" + echo "" + exit 0 +fi + +# Traitement des arguments +case "$1" in + "quick") + quick_push + ;; + "message") + if [[ -z "${2:-}" ]]; then + echo "❌ Message requis pour l'option 'message'" + exit 1 + fi + push_with_message "$2" "${3:-}" + ;; + "branch") + if [[ -z "${2:-}" ]]; then + echo "❌ Nom de branche requis pour l'option 'branch'" + exit 1 + fi + push_branch "$2" "${3:-}" + ;; + "merge") + push_and_merge "${2:-}" "${3:-}" + ;; + "status") + status_and_push + ;; + *) + echo "❌ Option inconnue: $1" + echo "💡 Utilisez './scripts/auto-ssh-push.sh' pour voir les options" + exit 1 + ;; +esac + +echo "🎯 Push SSH automatique terminé !" diff --git a/scripts/scripts/init-ssh-env.sh b/scripts/scripts/init-ssh-env.sh new file mode 100644 index 0000000..1ca7fa2 --- /dev/null +++ b/scripts/scripts/init-ssh-env.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Script d'initialisation de l'environnement SSH (template Linux) +# Configure automatiquement SSH pour les push via Gitea + +GITEA_HOST="${GITEA_HOST:-git.4nkweb.com}" + +echo "🚀 Initialisation de l'environnement SSH (template)..." + +# Couleurs +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +print_status() { echo -e "${BLUE}[INFO]${NC} $1"; } +print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } +print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } +print_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +print_status "Configuration SSH..." + +# 1. Configuration Git pour SSH +print_status "Configuration Git pour utiliser SSH (${GITEA_HOST})..." +git config --global url."git@${GITEA_HOST}:".insteadOf "https://${GITEA_HOST}/" + +# 2. Vérification des clés SSH +print_status "Vérification des clés SSH existantes..." +if [[ -f ~/.ssh/id_rsa || -f ~/.ssh/id_ed25519 ]]; then + print_success "Clé SSH trouvée" +else + print_warning "Aucune clé SSH trouvée" +fi + +# 3. Test de la connexion SSH +print_status "Test de la connexion SSH vers ${GITEA_HOST}..." +if ssh -T git@"${GITEA_HOST}" 2>&1 | grep -qi "authenticated\|welcome"; then + print_success "Authentification SSH réussie" +else + print_error "Échec de l'authentification SSH" +fi + +# 4. Alias Git +print_status "Configuration des alias Git..." +git config --global alias.ssh-push '!f() { git add . && git commit -m "${1:-Auto-commit $(date)}" && git push origin $(git branch --show-current); }; f' +git config --global alias.quick-push '!f() { git add . && git commit -m "Update $(date)" && git push origin $(git branch --show-current); }; f' +print_success "Alias Git configurés" + +# 5. Rendu exécutable des scripts si chemin standard +print_status "Configuration des permissions des scripts (si présents)..." +chmod +x scripts/auto-ssh-push.sh 2>/dev/null || true +chmod +x scripts/setup-ssh-ci.sh 2>/dev/null || true +print_success "Scripts rendus exécutables (si présents)" + +# 6. Résumé +echo "" +print_success "=== Configuration SSH terminée ===" diff --git a/scripts/scripts/setup-ssh-ci.sh b/scripts/scripts/setup-ssh-ci.sh new file mode 100644 index 0000000..a9c3e5d --- /dev/null +++ b/scripts/scripts/setup-ssh-ci.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Script de configuration SSH pour CI/CD (template Linux) +# Utilise automatiquement la clé SSH pour les opérations Git + +GITEA_HOST="${GITEA_HOST:-git.4nkweb.com}" + +echo "🔑 Configuration automatique de la clé SSH pour CI/CD..." + +if [ -n "${CI:-}" ]; then + echo "✅ Environnement CI détecté" + + if [ -n "${SSH_PRIVATE_KEY:-}" ]; then + echo "🔐 Configuration de la clé SSH privée..." + mkdir -p ~/.ssh && chmod 700 ~/.ssh + printf "%s" "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + + if [ -n "${SSH_PUBLIC_KEY:-}" ]; then + printf "%s" "$SSH_PUBLIC_KEY" > ~/.ssh/id_rsa.pub + chmod 644 ~/.ssh/id_rsa.pub + fi + + cat > ~/.ssh/config << EOF +Host ${GITEA_HOST} + HostName ${GITEA_HOST} + User git + IdentityFile ~/.ssh/id_rsa + StrictHostKeyChecking no + UserKnownHostsFile=/dev/null +EOF + chmod 600 ~/.ssh/config + + echo "🧪 Test SSH vers ${GITEA_HOST}..." + ssh -T git@"${GITEA_HOST}" 2>&1 || true + + git config --global url."git@${GITEA_HOST}:".insteadOf "https://${GITEA_HOST}/" + echo "✅ Configuration SSH terminée" + else + echo "⚠️ SSH_PRIVATE_KEY non défini, bascule HTTPS" + fi +else + echo "ℹ️ Environnement local détecté" + if [ -f ~/.ssh/id_rsa ] || [ -f ~/.ssh/id_ed25519 ]; then + echo "🔑 Clé SSH locale trouvée" + git config --global url."git@${GITEA_HOST}:".insteadOf "https://${GITEA_HOST}/" + echo "✅ Configuration SSH locale terminée" + else + echo "⚠️ Aucune clé SSH trouvée; configuration manuelle requise" + fi +fi + +echo "🎯 Configuration SSH CI/CD terminée"